From af61b7045ee94a9e081db6abbfec7cf74ceff746 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emirhan=20Durmu=C5=9F?= Date: Fri, 22 Dec 2023 19:10:02 +0300 Subject: [PATCH 001/178] initial commits and worfflow --- .github/workflows/ci.yaml | 140 +++++++++++------- .npmrc | 2 + Dockerfile.dev | 4 +- package.json | 124 +++++++--------- scripts/cli-tests.js | 2 +- scripts/coverage.js | 2 +- scripts/init.js | 2 +- scripts/postinstall.js | 2 +- scripts/postmantest.js | 2 +- scripts/preuninstall.js | 2 +- scripts/run-test.js | 2 +- scripts/scripts-api.js | 2 +- scripts/start-dev.js | 2 +- scripts/start.js | 2 +- scripts/stop.js | 2 +- scripts/test.js | 2 +- scripts/util.js | 2 +- src/cli/application.js | 2 +- src/cli/base-cli-handler.js | 6 +- src/cli/catalog.js | 2 +- src/cli/cli-data-types.js | 2 +- src/cli/config.js | 2 +- src/cli/controller.js | 2 +- src/cli/diagnostics.js | 2 +- src/cli/index.js | 2 +- src/cli/iofog.js | 2 +- src/cli/microservice.js | 2 +- src/cli/registry.js | 2 +- src/cli/start.js | 2 +- src/cli/tunnel.js | 2 +- src/cli/user.js | 2 +- src/config/constants.js | 2 +- src/config/index.js | 2 +- src/controllers/agent-controller.js | 2 +- src/controllers/application-controller.js | 2 +- .../application-template-controller.js | 2 +- src/controllers/catalog-controller.js | 2 +- src/controllers/config-controller.js | 2 +- src/controllers/controller.js | 2 +- src/controllers/diagnostic-controller.js | 2 +- src/controllers/edge-resource-controller.js | 2 +- src/controllers/iofog-controller.js | 2 +- src/controllers/kubelet-controller.js | 2 +- src/controllers/microservices-controller.js | 2 +- src/controllers/registry-controller.js | 2 +- src/controllers/router-controller.js | 2 +- src/controllers/routing-controller.js | 2 +- src/controllers/tunnel-controller.js | 2 +- src/controllers/user-controller.js | 2 +- src/daemon.js | 2 +- src/data/managers/access-token-manager.js | 2 +- src/data/managers/application-manager.js | 2 +- .../managers/application-template-manager.js | 2 +- .../application-template-variable-manager.js | 2 +- src/data/managers/base-manager.js | 2 +- .../managers/catalog-item-image-manager.js | 2 +- .../catalog-item-input-type-manager.js | 2 +- src/data/managers/catalog-item-manager.js | 2 +- .../catalog-item-output-type-manager.js | 2 +- src/data/managers/change-tracking-manager.js | 2 +- src/data/managers/config-manager.js | 2 +- .../managers/email-activation-code-manager.js | 2 +- src/data/managers/hw-info-manager.js | 2 +- .../managers/iofog-access-token-manager.js | 2 +- src/data/managers/iofog-manager.js | 2 +- .../managers/iofog-provision-key-manager.js | 2 +- src/data/managers/iofog-type-manager.js | 2 +- .../managers/iofog-version-command-manager.js | 2 +- .../managers/kubelet-access-token-manager.js | 2 +- src/data/managers/microservice-arg-manager.js | 2 +- src/data/managers/microservice-env-manager.js | 2 +- .../microservice-extra-host-manager.js | 2 +- src/data/managers/microservice-manager.js | 2 +- .../managers/microservice-port-manager.js | 2 +- .../microservice-proxy-port-manager.js | 2 +- .../microservice-public-mode-manager.js | 2 +- .../microservice-public-port-manager.js | 2 +- .../managers/microservice-status-manager.js | 2 +- .../managers/router-connection-manager.js | 2 +- src/data/managers/router-manager.js | 2 +- src/data/managers/routing-manager.js | 2 +- .../scheduler-access-token-manager.js | 2 +- .../managers/strace-diagnostics-manager.js | 2 +- src/data/managers/strace-manager.js | 2 +- src/data/managers/tags-manager.js | 2 +- src/data/managers/usb-info-manager.js | 2 +- src/data/managers/user-manager.js | 2 +- src/data/managers/volume-mapping-manager.js | 2 +- src/data/models/changetracking.js | 2 +- src/decorators/authorization-decorator.js | 2 +- src/decorators/cli-decorator.js | 2 +- src/decorators/response-decorator.js | 2 +- src/decorators/transaction-decorator.js | 2 +- src/enums/fog-state.js | 2 +- src/enums/microservice-state.js | 2 +- src/helpers/app-helper.js | 2 +- src/helpers/constants.js | 2 +- src/helpers/error-messages.js | 2 +- src/helpers/errors.js | 2 +- src/jobs/fog-status-job.js | 2 +- src/jobs/stopped-app-status-job.js | 2 +- src/logger/index.js | 2 +- src/main.js | 2 +- src/routes/agent.js | 2 +- src/routes/application.js | 2 +- src/routes/applicationTemplate.js | 2 +- src/routes/capabilities.js | 2 +- src/routes/catalog.js | 2 +- src/routes/config.js | 2 +- src/routes/controller.js | 2 +- src/routes/diagnostics.js | 2 +- src/routes/edgeResource.js | 2 +- src/routes/flow.js | 2 +- src/routes/iofog.js | 2 +- src/routes/kubelet.js | 2 +- src/routes/microservices.js | 2 +- src/routes/registries.js | 2 +- src/routes/router.js | 2 +- src/routes/routing.js | 2 +- src/routes/tunnel.js | 2 +- src/routes/user.js | 2 +- src/schemas/agent.js | 2 +- src/schemas/catalog.js | 2 +- src/schemas/config.js | 2 +- src/schemas/diagnostics.js | 2 +- src/schemas/edgeResource.js | 2 +- src/schemas/index.js | 2 +- src/schemas/iofog.js | 2 +- src/schemas/registry.js | 2 +- src/schemas/routing.js | 2 +- src/schemas/tunnel.js | 2 +- src/schemas/user.js | 2 +- src/server.js | 2 +- src/services/access-token-service.js | 2 +- src/services/agent-service.js | 2 +- src/services/application-service.js | 2 +- src/services/application-template-service.js | 2 +- src/services/catalog-service.js | 2 +- src/services/change-tracking-service.js | 2 +- src/services/config-service.js | 2 +- src/services/controller-service.js | 2 +- src/services/diagnostic-service.js | 2 +- src/services/edge-resource-service.js | 2 +- src/services/email-activation-code-service.js | 2 +- src/services/iofog-access-token-service.js | 2 +- src/services/iofog-service.js | 2 +- src/services/kubelet-access-token-service.js | 2 +- src/services/kubelet-service.js | 2 +- src/services/microservice-ports/default.js | 2 +- src/services/microservice-ports/factory.js | 2 +- src/services/microservices-service.js | 2 +- src/services/registry-service.js | 2 +- src/services/router-service.js | 2 +- src/services/routing-service.js | 2 +- .../scheduler-access-token-service.js | 2 +- src/services/tunnel-service.js | 2 +- src/services/user-service.js | 2 +- src/views/email-activation-temp.js | 2 +- src/views/email-temp.js | 2 +- src/views/reset-password-temp.js | 2 +- 160 files changed, 305 insertions(+), 281 deletions(-) create mode 100644 .npmrc diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 600a68db6..3508811cc 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -1,42 +1,57 @@ name: CI on: - push: + push: branches: - - develop - - release* + - main tags: [v*] paths-ignore: - README.md - CHANGELOG.md - LICENSE pull_request: - # Sequence of patterns matched against refs/heads - branches: - - develop - - release* + # Sequence of patterns matched against refs/heads + branches: + - main paths-ignore: - README.md - CHANGELOG.md - LICENSE - env: - project: 'focal-freedom-236620' - image: 'controller' + IMAGE_NAME: 'controller' + jobs: Build: - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 + strategy: + matrix: + platform: + - linux/amd64 + - linux/386 + - linux/arm/v6 + - linux/arm/v7 + - linux/arm64 permissions: - contents: 'read' - id-token: 'write' - packages: 'write' + actions: write + checks: write + contents: write + deployments: write + id-token: write + issues: write + discussions: write + packages: write + pages: write + pull-requests: write + repository-projects: write + security-events: write + statuses: write name: Preflight steps: - uses: actions/checkout@v3 - uses: actions/setup-node@v3 with: - node-version: 18 + node-version: 10 - run: npm ci - run: npm run standard - run: | @@ -45,17 +60,30 @@ jobs: Tests: needs: Build - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 permissions: - contents: 'read' - id-token: 'write' - packages: 'write' - issues: read + actions: write checks: write + contents: write + deployments: write + id-token: write + issues: write + discussions: write + packages: write + pages: write pull-requests: write + repository-projects: write + security-events: write + statuses: write strategy: matrix: - node: [ 16, 17, 16, 19 ] + platform: + - linux/amd64 + - linux/386 + - linux/arm/v6 + - linux/arm/v7 + - linux/arm64 + node: [ 16, 17, 16, 19,20 ] name: Node ${{ matrix.node }} Test steps: - uses: actions/checkout@v3 @@ -83,17 +111,42 @@ jobs: Publish: needs: [Build, Tests] - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 permissions: - contents: 'read' - id-token: 'write' - packages: 'write' + actions: write + checks: write + contents: write + deployments: write + id-token: write + issues: write + discussions: write + packages: write + pages: write + pull-requests: write + repository-projects: write + security-events: write + statuses: write + strategy: + matrix: + platform: + - linux/amd64 + - linux/386 + - linux/arm/v6 + - linux/arm/v7 + - linux/arm64 name: Publish Controller steps: - uses: actions/checkout@v3 - uses: actions/setup-node@v3 with: - node-version: 18 + node-version: 20 + - name: Replace values + shell: bash + env: + PAT: ${{ secrets.PAT }} + run: | + sed -i.back "s|PAT|${PAT}|g" ./path/to/.npmrc + - run: npm ci - name: npm version @@ -114,45 +167,24 @@ jobs: run: | npm --no-git-tag-version version ${{ steps.version.outputs.pkg_version }} npm pack + npm publish - name: Login to Github Container Registry uses: docker/login-action@v2 with: registry: "ghcr.io" username: ${{ github.actor }} - password: ${{ github.token }} + password: ${{ secrets.PAT }} - name: Build and Push to ghcr uses: docker/build-push-action@v3 id: build_push_ghcr with: file: Dockerfile.dev + platforms: ${{ matrix.platforms }} push: true + outputs: type=image,name=target,annotation-index.org.opencontainers.image.description=Proxy tags: | - ghcr.io/eclipse-iofog/controller:${{ steps.version.outputs.pkg_version }} - ghcr.io/eclipse-iofog/controller:latest - build-args: PKG_VERSION=${{ steps.version.outputs.pkg_version }} - - - name: Build and Push to GCR - id: build_push_gcr - uses: RafikFarhad/push-to-gcr-github-action@v5-beta - with: - gcloud_service_key: ${{ secrets.GCLOUD_SERVICE_KEY }} - registry: gcr.io - project_id: ${{ env.project }} - image_name: ${{ env.image }} - image_tag: latest,${{ steps.version.outputs.pkg_version }} - dockerfile: Dockerfile.dev - build_args: PKG_VERSION=${{ steps.version.outputs.pkg_version }} - - - run: ls - - - name: Publish package to packagecloud - if: ${{ steps.build_push_gcr.outcome }} == 'success' - uses: danielmundi/upload-packagecloud@v1 - with: - PACKAGE-NAME: iofog-iofogcontroller-${{ steps.version.outputs.pkg_version }}.tgz - PACKAGECLOUD-USERNAME: iofog - PACKAGECLOUD-REPO: iofog-controller-snapshots - PACKAGECLOUD-DISTRIB: node - PACKAGECLOUD-TOKEN: ${{ secrets.packagecloud_token }} \ No newline at end of file + ghcr.io/datasance/${{ env.IMAGE_NAME }}:${{ steps.tags.outputs.VERSION }} + ghcr.io/datasance/${{ env.IMAGE_NAME }}:latest + ghcr.io/datasance/${{ env.IMAGE_NAME }}:main diff --git a/.npmrc b/.npmrc new file mode 100644 index 000000000..25346e481 --- /dev/null +++ b/.npmrc @@ -0,0 +1,2 @@ +//npm.pkg.github.com/:_authToken=PAT +@NAMESPACE:registry=https://npm.pkg.github.com \ No newline at end of file diff --git a/Dockerfile.dev b/Dockerfile.dev index 09e2209cc..1c187562f 100644 --- a/Dockerfile.dev +++ b/Dockerfile.dev @@ -1,4 +1,4 @@ -FROM node:hydrogen-buster AS builder +FROM node:iron-bookworm AS builder ARG PKG_VERSION @@ -16,7 +16,7 @@ RUN npm version $PKG_VERSION --allow-same-version --no-git-tag-version RUN npm pack -FROM node:hydrogen-alpine3.17 +FROM node:iron-alpine3.19 RUN apk add sudo logrotate g++ make diff --git a/package.json b/package.json index c6d25a162..572c11f81 100644 --- a/package.json +++ b/package.json @@ -1,30 +1,17 @@ { - "name": "@iofog/iofogcontroller", + "name": "@datasance/iofogcontroller", "version": "3.0.4", - "description": "ioFog Controller project for Eclipse IoFog @ iofog.org \\nCopyright (c) 2018 Edgeworx, Inc.", + "description": "ioFog Controller project for Eclipse IoFog @ iofog.org \\nCopyright (c) 2023 Datasance Teknoloji A.S.", "main": "./src/main.js", - "author": "Saeid Baghbidi", + "author": "Emirhan Durmus", "contributors": [ - "Kilton Hopkins ", - "Saeid Rezaei Baghbidi", - "Alexandre de Wergifosse", - "Pavel Kazlou", - "Egor Krylovich", - "Iryna Laryionava", - "Maryna Lipnitskaya", - "Dmitriy Kudasov", - "Dmitry Stolbunov", - "Darya Busel", - "Alexander Shpak", - "Kate Lukashick", - "Eugene Pankov", - "Maksim Chepelev", - "Tetiana Yatsiuk", - "Sergey Valevich" + "Emirhan Durmus ", + "Oguzhan Herkiloglu ", + "Burak Vural " ], "license": "EPL-2.0", "bugs": { - "email": "edgemaster@iofog.org" + "email": "support@datasance.com" }, "standard": { "ignore": [ @@ -32,10 +19,10 @@ "src/lib/**/*.js" ] }, - "homepage": "https://www.iofog.org", + "homepage": "https://www.datasance.com", "repository": { "type": "git", - "url": "https://github.com/ioFog/Controller" + "url": "https://github.com/datasance/Controller" }, "scripts": { "prestart": "npm run lint", @@ -68,68 +55,71 @@ }, "dependencies": { "@iofog/ecn-viewer": "3.0.2", - "axios": "1.0.0-alpha.1", - "body-parser": "^1.20.1", + "axios": "1.6.2", + "body-parser": "^1.20.2", "child_process": "1.0.2", - "command-line-args": "5.0.2", - "command-line-usage": "5.0.5", + "command-line-args": "5.2.1", + "command-line-usage": "7.0.1", "concurrent-queue": "7.0.2", - "cookie-parser": "1.4.3", + "cookie-parser": "1.4.6", "cors": "2.8.5", "daemonize2": "0.4.2", - "ejs": "3.1.7", - "express": "4.17.3", - "formidable": "1.2.1", + "ejs": "3.1.9", + "express": "4.18.2", + "formidable": "3.5.1", "ftp": "0.3.10", - "helmet": "3.21.2", - "is-elevated": "3.0.0", - "js-yaml": "3.14.1", - "jsonschema": "1.2.5", - "minimatch": "3.1.2", + "helmet": "7.1.0", + "is-elevated": "4.0.0", + "js-yaml": "4.1.0", + "jsonschema": "1.4.1", + "liquidjs": "10.10.0", + "minimatch": "9.0.3", + "mongodb": "^6.3.0", "moment": "2.29.4", - "moment-timezone": "0.5.38", - "morgan": "1.9.1", + "moment-timezone": "0.5.43", + "morgan": "1.10.0", "multer": "1.4.5-lts.1", - "nconf": "0.12.0", - "nodemailer": "6.7.3", - "nodemailer-smtp-transport": "2.4.2", - "os": "0.1.1", + "nconf": "0.12.1", + "nodemailer": "6.9.7", + "nodemailer-smtp-transport": "2.7.4", + "os": "0.1.2", "path": "0.12.7", - "pino": "6.6.1", - "pino-std-serializers": "2.5.0", + "pino": "8.17.1", + "pino-std-serializers": "6.2.2", "portscanner": "2.2.0", - "qs": "6.10.3", + "qs": "6.11.2", "request": "2.88.0", "request-promise": "4.2.4", - "retry-as-promised": "3.1.0", - "semantic-release": "19.0.3", - "semver": "5.6.0", - "sequelize": "6.29.0", - "sqlite3": "^5.1.5", + "retry-as-promised": "7.0.4", + "semantic-release": "22.0.12", + "semver": "7.5.4", + "sequelize": "6.35.2", + "sqlite3": "^5.1.6", "string-format": "2.0.0", - "swagger-ui-express": "^4.6.2", - "umzug": "2.2.0", - "underscore": "1.13.1", + "swagger-ui-express": "^5.0.0", + "umzug": "3.5.0", + "underscore": "1.13.6", "xss-clean": "0.1.1" }, "devDependencies": { - "acorn": "7.1.1", - "bdd-lazy-var": "2.5.2", - "chai": "4.2.0", + "acorn": "8.11.2", + "bdd-lazy-var": "2.6.1", + "chai": "4.3.10", "chai-as-promised": "7.1.1", - "chai-http": "4.2.1", - "eslint": "5.14.1", - "eslint-config-google": "0.12.0", - "mocha": "9.2.2", - "mocha-junit-reporter": "2.0.0", - "newman": "5.3.2", + "chai-http": "4.4.0", + "eslint": "8.56.0", + "eslint-config-google": "0.14.0", + "mocha": "10.2.0", + "mocha-junit-reporter": "2.2.1", + "mongodb": "^6.3.0", + "newman": "6.0.0", "newman-reporter-junitfull": "1.1.1", - "nyc": "15.0.0", - "sequelize-cli": "5.5.0", - "sinon": "7.5.0", - "sinon-chai": "3.3.0", - "snyk": "^1.1064.0", - "standard": "12.0.1" + "nyc": "15.1.0", + "sequelize-cli": "6.6.2", + "sinon": "17.0.1", + "sinon-chai": "3.7.0", + "snyk": "^1.1266.0", + "standard": "17.1.0" }, "files": [ "/scripts", diff --git a/scripts/cli-tests.js b/scripts/cli-tests.js index 6f55ff610..4db238617 100644 --- a/scripts/cli-tests.js +++ b/scripts/cli-tests.js @@ -1,6 +1,6 @@ /* * ******************************************************************************* - * * Copyright (c) 2018 Edgeworx, Inc. + * * Copyright (c) 2023 Datasance Teknoloji A.S. * * * * This program and the accompanying materials are made available under the * * terms of the Eclipse Public License v. 2.0 which is available at diff --git a/scripts/coverage.js b/scripts/coverage.js index ad9793ec1..ee8c0d201 100644 --- a/scripts/coverage.js +++ b/scripts/coverage.js @@ -1,6 +1,6 @@ /* * ******************************************************************************* - * * Copyright (c) 2018 Edgeworx, Inc. + * * Copyright (c) 2023 Datasance Teknoloji A.S. * * * * This program and the accompanying materials are made available under the * * terms of the Eclipse Public License v. 2.0 which is available at diff --git a/scripts/init.js b/scripts/init.js index 91ef17f02..09cbee6b6 100644 --- a/scripts/init.js +++ b/scripts/init.js @@ -1,6 +1,6 @@ /* * ******************************************************************************* - * * Copyright (c) 2018 Edgeworx, Inc. + * * Copyright (c) 2023 Datasance Teknoloji A.S. * * * * This program and the accompanying materials are made available under the * * terms of the Eclipse Public License v. 2.0 which is available at diff --git a/scripts/postinstall.js b/scripts/postinstall.js index cd734dc71..8acb26bec 100644 --- a/scripts/postinstall.js +++ b/scripts/postinstall.js @@ -1,6 +1,6 @@ /* * ******************************************************************************* - * * Copyright (c) 2018 Edgeworx, Inc. + * * Copyright (c) 2023 Datasance Teknoloji A.S. * * * * This program and the accompanying materials are made available under the * * terms of the Eclipse Public License v. 2.0 which is available at diff --git a/scripts/postmantest.js b/scripts/postmantest.js index 3d2aa07ed..555254a38 100644 --- a/scripts/postmantest.js +++ b/scripts/postmantest.js @@ -1,6 +1,6 @@ /* * ******************************************************************************* - * * Copyright (c) 2018 Edgeworx, Inc. + * * Copyright (c) 2023 Datasance Teknoloji A.S. * * * * This program and the accompanying materials are made available under the * * terms of the Eclipse Public License v. 2.0 which is available at diff --git a/scripts/preuninstall.js b/scripts/preuninstall.js index ad9e80d99..b22fd9e27 100644 --- a/scripts/preuninstall.js +++ b/scripts/preuninstall.js @@ -1,6 +1,6 @@ /* * ******************************************************************************* - * * Copyright (c) 2018 Edgeworx, Inc. + * * Copyright (c) 2023 Datasance Teknoloji A.S. * * * * This program and the accompanying materials are made available under the * * terms of the Eclipse Public License v. 2.0 which is available at diff --git a/scripts/run-test.js b/scripts/run-test.js index 78f0dcc2a..14f1e5e30 100644 --- a/scripts/run-test.js +++ b/scripts/run-test.js @@ -1,6 +1,6 @@ /* * ******************************************************************************* - * * Copyright (c) 2018 Edgeworx, Inc. + * * Copyright (c) 2023 Datasance Teknoloji A.S. * * * * This program and the accompanying materials are made available under the * * terms of the Eclipse Public License v. 2.0 which is available at diff --git a/scripts/scripts-api.js b/scripts/scripts-api.js index 25bcf32e7..1af3818ca 100644 --- a/scripts/scripts-api.js +++ b/scripts/scripts-api.js @@ -1,6 +1,6 @@ /* * ******************************************************************************* - * * Copyright (c) 2018 Edgeworx, Inc. + * * Copyright (c) 2023 Datasance Teknoloji A.S. * * * * This program and the accompanying materials are made available under the * * terms of the Eclipse Public License v. 2.0 which is available at diff --git a/scripts/start-dev.js b/scripts/start-dev.js index fa8a309a0..3f852f468 100644 --- a/scripts/start-dev.js +++ b/scripts/start-dev.js @@ -1,6 +1,6 @@ /* * ******************************************************************************* - * * Copyright (c) 2018 Edgeworx, Inc. + * * Copyright (c) 2023 Datasance Teknoloji A.S. * * * * This program and the accompanying materials are made available under the * * terms of the Eclipse Public License v. 2.0 which is available at diff --git a/scripts/start.js b/scripts/start.js index c56cabee9..bf021f270 100644 --- a/scripts/start.js +++ b/scripts/start.js @@ -1,6 +1,6 @@ /* * ******************************************************************************* - * * Copyright (c) 2018 Edgeworx, Inc. + * * Copyright (c) 2023 Datasance Teknoloji A.S. * * * * This program and the accompanying materials are made available under the * * terms of the Eclipse Public License v. 2.0 which is available at diff --git a/scripts/stop.js b/scripts/stop.js index f81ee01a3..bcbc4e8de 100644 --- a/scripts/stop.js +++ b/scripts/stop.js @@ -1,6 +1,6 @@ /* * ******************************************************************************* - * * Copyright (c) 2018 Edgeworx, Inc. + * * Copyright (c) 2023 Datasance Teknoloji A.S. * * * * This program and the accompanying materials are made available under the * * terms of the Eclipse Public License v. 2.0 which is available at diff --git a/scripts/test.js b/scripts/test.js index 1939537bf..b53c9beff 100644 --- a/scripts/test.js +++ b/scripts/test.js @@ -1,6 +1,6 @@ /* * ******************************************************************************* - * * Copyright (c) 2018 Edgeworx, Inc. + * * Copyright (c) 2023 Datasance Teknoloji A.S. * * * * This program and the accompanying materials are made available under the * * terms of the Eclipse Public License v. 2.0 which is available at diff --git a/scripts/util.js b/scripts/util.js index eee10e00c..19d342820 100644 --- a/scripts/util.js +++ b/scripts/util.js @@ -1,6 +1,6 @@ /* * ******************************************************************************* - * * Copyright (c) 2018 Edgeworx, Inc. + * * Copyright (c) 2023 Datasance Teknoloji A.S. * * * * This program and the accompanying materials are made available under the * * terms of the Eclipse Public License v. 2.0 which is available at diff --git a/src/cli/application.js b/src/cli/application.js index 833467ef4..ef50cfd41 100644 --- a/src/cli/application.js +++ b/src/cli/application.js @@ -1,6 +1,6 @@ /* * ******************************************************************************* - * * Copyright (c) 2020 Edgeworx, Inc. + * * Copyright (c) 2023 Datasance Teknoloji A.S. * * * * This program and the accompanying materials are made available under the * * terms of the Eclipse Public License v. 2.0 which is available at diff --git a/src/cli/base-cli-handler.js b/src/cli/base-cli-handler.js index 94254c10c..48b0bdb36 100644 --- a/src/cli/base-cli-handler.js +++ b/src/cli/base-cli-handler.js @@ -1,6 +1,6 @@ /* * ******************************************************************************* - * * Copyright (c) 2020 Edgeworx, Inc. + * * Copyright (c) 2023 Datasance Teknoloji A.S. * * * * This program and the accompanying materials are made available under the * * terms of the Eclipse Public License v. 2.0 which is available at @@ -62,7 +62,7 @@ class CLIHandler { const usage = [ { header: 'ioFogController', - content: 'Fog Controller project for Eclipse IoFog @ iofog.org \\nCopyright (c) 2020 Edgeworx, Inc.' + content: 'Fog Controller project for Eclipse IoFog @ iofog.org \\nCopyright (c) 2023 Datasance Teknoloji A.S.' } ].concat(sections) logger.cliRes(commandLineUsage(usage)) @@ -95,7 +95,7 @@ class CLIHandler { const usage = [ { header: 'ioFogController', - content: 'Fog Controller project for Eclipse IoFog @ iofog.org \\nCopyright (c) 2020 Edgeworx, Inc.' + content: 'Fog Controller project for Eclipse IoFog @ iofog.org \\nCopyright (c) 2023 Datasance Teknoloji A.S.' } ].concat(sections) logger.cliRes(commandLineUsage(usage)) diff --git a/src/cli/catalog.js b/src/cli/catalog.js index cf9662517..33a3e1908 100644 --- a/src/cli/catalog.js +++ b/src/cli/catalog.js @@ -1,6 +1,6 @@ /* * ******************************************************************************* - * * Copyright (c) 2020 Edgeworx, Inc. + * * Copyright (c) 2023 Datasance Teknoloji A.S. * * * * This program and the accompanying materials are made available under the * * terms of the Eclipse Public License v. 2.0 which is available at diff --git a/src/cli/cli-data-types.js b/src/cli/cli-data-types.js index 8c8d6f8c0..909e3c115 100644 --- a/src/cli/cli-data-types.js +++ b/src/cli/cli-data-types.js @@ -1,6 +1,6 @@ /* * ******************************************************************************* - * * Copyright (c) 2020 Edgeworx, Inc. + * * Copyright (c) 2023 Datasance Teknoloji A.S. * * * * This program and the accompanying materials are made available under the * * terms of the Eclipse Public License v. 2.0 which is available at diff --git a/src/cli/config.js b/src/cli/config.js index 6d111077b..f0f813fed 100644 --- a/src/cli/config.js +++ b/src/cli/config.js @@ -1,6 +1,6 @@ /* * ******************************************************************************* - * * Copyright (c) 2020 Edgeworx, Inc. + * * Copyright (c) 2023 Datasance Teknoloji A.S. * * * * This program and the accompanying materials are made available under the * * terms of the Eclipse Public License v. 2.0 which is available at diff --git a/src/cli/controller.js b/src/cli/controller.js index 4e6b6a85a..ab650c4c8 100644 --- a/src/cli/controller.js +++ b/src/cli/controller.js @@ -1,6 +1,6 @@ /* * ******************************************************************************* - * * Copyright (c) 2020 Edgeworx, Inc. + * * Copyright (c) 2023 Datasance Teknoloji A.S. * * * * This program and the accompanying materials are made available under the * * terms of the Eclipse Public License v. 2.0 which is available at diff --git a/src/cli/diagnostics.js b/src/cli/diagnostics.js index 24fa9cd8c..586ee838f 100644 --- a/src/cli/diagnostics.js +++ b/src/cli/diagnostics.js @@ -1,6 +1,6 @@ /* * ******************************************************************************* - * * Copyright (c) 2020 Edgeworx, Inc. + * * Copyright (c) 2023 Datasance Teknoloji A.S. * * * * This program and the accompanying materials are made available under the * * terms of the Eclipse Public License v. 2.0 which is available at diff --git a/src/cli/index.js b/src/cli/index.js index 7e16cfdba..8b8aba684 100644 --- a/src/cli/index.js +++ b/src/cli/index.js @@ -1,6 +1,6 @@ /* * ******************************************************************************* - * * Copyright (c) 2020 Edgeworx, Inc. + * * Copyright (c) 2023 Datasance Teknoloji A.S. * * * * This program and the accompanying materials are made available under the * * terms of the Eclipse Public License v. 2.0 which is available at diff --git a/src/cli/iofog.js b/src/cli/iofog.js index 7d2533018..163f6d27b 100644 --- a/src/cli/iofog.js +++ b/src/cli/iofog.js @@ -1,6 +1,6 @@ /* * ******************************************************************************* - * * Copyright (c) 2020 Edgeworx, Inc. + * * Copyright (c) 2023 Datasance Teknoloji A.S. * * * * This program and the accompanying materials are made available under the * * terms of the Eclipse Public License v. 2.0 which is available at diff --git a/src/cli/microservice.js b/src/cli/microservice.js index b9cbe2ea2..270371041 100644 --- a/src/cli/microservice.js +++ b/src/cli/microservice.js @@ -1,6 +1,6 @@ /* * ******************************************************************************* - * * Copyright (c) 2020 Edgeworx, Inc. + * * Copyright (c) 2023 Datasance Teknoloji A.S. * * * * This program and the accompanying materials are made available under the * * terms of the Eclipse Public License v. 2.0 which is available at diff --git a/src/cli/registry.js b/src/cli/registry.js index dd7311af0..0be436f1a 100644 --- a/src/cli/registry.js +++ b/src/cli/registry.js @@ -1,6 +1,6 @@ /* * ******************************************************************************* - * * Copyright (c) 2020 Edgeworx, Inc. + * * Copyright (c) 2023 Datasance Teknoloji A.S. * * * * This program and the accompanying materials are made available under the * * terms of the Eclipse Public License v. 2.0 which is available at diff --git a/src/cli/start.js b/src/cli/start.js index 5088626a2..a54e2bee3 100644 --- a/src/cli/start.js +++ b/src/cli/start.js @@ -1,6 +1,6 @@ /* * ******************************************************************************* - * * Copyright (c) 2020 Edgeworx, Inc. + * * Copyright (c) 2023 Datasance Teknoloji A.S. * * * * This program and the accompanying materials are made available under the * * terms of the Eclipse Public License v. 2.0 which is available at diff --git a/src/cli/tunnel.js b/src/cli/tunnel.js index 413ae98f8..5592e5364 100644 --- a/src/cli/tunnel.js +++ b/src/cli/tunnel.js @@ -1,6 +1,6 @@ /* * ******************************************************************************* - * * Copyright (c) 2020 Edgeworx, Inc. + * * Copyright (c) 2023 Datasance Teknoloji A.S. * * * * This program and the accompanying materials are made available under the * * terms of the Eclipse Public License v. 2.0 which is available at diff --git a/src/cli/user.js b/src/cli/user.js index 9f94bddde..252fa44c7 100644 --- a/src/cli/user.js +++ b/src/cli/user.js @@ -1,6 +1,6 @@ /* * ******************************************************************************* - * * Copyright (c) 2020 Edgeworx, Inc. + * * Copyright (c) 2023 Datasance Teknoloji A.S. * * * * This program and the accompanying materials are made available under the * * terms of the Eclipse Public License v. 2.0 which is available at diff --git a/src/config/constants.js b/src/config/constants.js index 99f0fcf92..863a834d2 100644 --- a/src/config/constants.js +++ b/src/config/constants.js @@ -1,6 +1,6 @@ /* * ******************************************************************************* - * * Copyright (c) 2020 Edgeworx, Inc. + * * Copyright (c) 2023 Datasance Teknoloji A.S. * * * * This program and the accompanying materials are made available under the * * terms of the Eclipse Public License v. 2.0 which is available at diff --git a/src/config/index.js b/src/config/index.js index 066246992..a2b6dc907 100644 --- a/src/config/index.js +++ b/src/config/index.js @@ -1,6 +1,6 @@ /* * ******************************************************************************* - * * Copyright (c) 2020 Edgeworx, Inc. + * * Copyright (c) 2023 Datasance Teknoloji A.S. * * * * This program and the accompanying materials are made available under the * * terms of the Eclipse Public License v. 2.0 which is available at diff --git a/src/controllers/agent-controller.js b/src/controllers/agent-controller.js index 04e86e09c..a3c1e794a 100644 --- a/src/controllers/agent-controller.js +++ b/src/controllers/agent-controller.js @@ -1,6 +1,6 @@ /* * ******************************************************************************* - * * Copyright (c) 2020 Edgeworx, Inc. + * * Copyright (c) 2023 Datasance Teknoloji A.S. * * * * This program and the accompanying materials are made available under the * * terms of the Eclipse Public License v. 2.0 which is available at diff --git a/src/controllers/application-controller.js b/src/controllers/application-controller.js index ced617b87..6f16bf308 100644 --- a/src/controllers/application-controller.js +++ b/src/controllers/application-controller.js @@ -1,6 +1,6 @@ /* * ******************************************************************************* - * * Copyright (c) 2020 Edgeworx, Inc. + * * Copyright (c) 2023 Datasance Teknoloji A.S. * * * * This program and the accompanying materials are made available under the * * terms of the Eclipse Public License v. 2.0 which is available at diff --git a/src/controllers/application-template-controller.js b/src/controllers/application-template-controller.js index 1022d1c94..9ebea7122 100644 --- a/src/controllers/application-template-controller.js +++ b/src/controllers/application-template-controller.js @@ -1,6 +1,6 @@ /* * ******************************************************************************* - * * Copyright (c) 2020 Edgeworx, Inc. + * * Copyright (c) 2023 Datasance Teknoloji A.S. * * * * This program and the accompanying materials are made available under the * * terms of the Eclipse Public License v. 2.0 which is available at diff --git a/src/controllers/catalog-controller.js b/src/controllers/catalog-controller.js index c92302db6..fdfd144d8 100644 --- a/src/controllers/catalog-controller.js +++ b/src/controllers/catalog-controller.js @@ -1,6 +1,6 @@ /* * ******************************************************************************* - * * Copyright (c) 2020 Edgeworx, Inc. + * * Copyright (c) 2023 Datasance Teknoloji A.S. * * * * This program and the accompanying materials are made available under the * * terms of the Eclipse Public License v. 2.0 which is available at diff --git a/src/controllers/config-controller.js b/src/controllers/config-controller.js index 7873e6317..c6846baf4 100644 --- a/src/controllers/config-controller.js +++ b/src/controllers/config-controller.js @@ -1,6 +1,6 @@ /* * ******************************************************************************* - * * Copyright (c) 2020 Edgeworx, Inc. + * * Copyright (c) 2023 Datasance Teknoloji A.S. * * * * This program and the accompanying materials are made available under the * * terms of the Eclipse Public License v. 2.0 which is available at diff --git a/src/controllers/controller.js b/src/controllers/controller.js index 8834f830d..84cc5f3ff 100644 --- a/src/controllers/controller.js +++ b/src/controllers/controller.js @@ -1,6 +1,6 @@ /* * ******************************************************************************* - * * Copyright (c) 2020 Edgeworx, Inc. + * * Copyright (c) 2023 Datasance Teknoloji A.S. * * * * This program and the accompanying materials are made available under the * * terms of the Eclipse Public License v. 2.0 which is available at diff --git a/src/controllers/diagnostic-controller.js b/src/controllers/diagnostic-controller.js index 0ede7bc28..d7ae6e199 100644 --- a/src/controllers/diagnostic-controller.js +++ b/src/controllers/diagnostic-controller.js @@ -1,6 +1,6 @@ /* * ******************************************************************************* - * * Copyright (c) 2020 Edgeworx, Inc. + * * Copyright (c) 2023 Datasance Teknoloji A.S. * * * * This program and the accompanying materials are made available under the * * terms of the Eclipse Public License v. 2.0 which is available at diff --git a/src/controllers/edge-resource-controller.js b/src/controllers/edge-resource-controller.js index 79abed87b..9cd0dccdd 100644 --- a/src/controllers/edge-resource-controller.js +++ b/src/controllers/edge-resource-controller.js @@ -1,6 +1,6 @@ /* * ******************************************************************************* - * * Copyright (c) 2020 Edgeworx, Inc. + * * Copyright (c) 2023 Datasance Teknoloji A.S. * * * * This program and the accompanying materials are made available under the * * terms of the Eclipse Public License v. 2.0 which is available at diff --git a/src/controllers/iofog-controller.js b/src/controllers/iofog-controller.js index d9db42345..00e540fce 100644 --- a/src/controllers/iofog-controller.js +++ b/src/controllers/iofog-controller.js @@ -1,6 +1,6 @@ /* * ******************************************************************************* - * * Copyright (c) 2020 Edgeworx, Inc. + * * Copyright (c) 2023 Datasance Teknoloji A.S. * * * * This program and the accompanying materials are made available under the * * terms of the Eclipse Public License v. 2.0 which is available at diff --git a/src/controllers/kubelet-controller.js b/src/controllers/kubelet-controller.js index c1fb68622..f76dc892d 100644 --- a/src/controllers/kubelet-controller.js +++ b/src/controllers/kubelet-controller.js @@ -1,6 +1,6 @@ /* * ******************************************************************************* - * * Copyright (c) 2020 Edgeworx, Inc. + * * Copyright (c) 2023 Datasance Teknoloji A.S. * * * * This program and the accompanying materials are made available under the * * terms of the Eclipse Public License v. 2.0 which is available at diff --git a/src/controllers/microservices-controller.js b/src/controllers/microservices-controller.js index 5590de72d..32fe33e40 100644 --- a/src/controllers/microservices-controller.js +++ b/src/controllers/microservices-controller.js @@ -1,6 +1,6 @@ /* * ******************************************************************************* - * * Copyright (c) 2020 Edgeworx, Inc. + * * Copyright (c) 2023 Datasance Teknoloji A.S. * * * * This program and the accompanying materials are made available under the * * terms of the Eclipse Public License v. 2.0 which is available at diff --git a/src/controllers/registry-controller.js b/src/controllers/registry-controller.js index 4ba7af91f..7c05aabb7 100644 --- a/src/controllers/registry-controller.js +++ b/src/controllers/registry-controller.js @@ -1,6 +1,6 @@ /* * ******************************************************************************* - * * Copyright (c) 2020 Edgeworx, Inc. + * * Copyright (c) 2023 Datasance Teknoloji A.S. * * * * This program and the accompanying materials are made available under the * * terms of the Eclipse Public License v. 2.0 which is available at diff --git a/src/controllers/router-controller.js b/src/controllers/router-controller.js index 8e8776c28..0d61f536e 100644 --- a/src/controllers/router-controller.js +++ b/src/controllers/router-controller.js @@ -1,6 +1,6 @@ /* * ******************************************************************************* - * * Copyright (c) 2020 Edgeworx, Inc. + * * Copyright (c) 2023 Datasance Teknoloji A.S. * * * * This program and the accompanying materials are made available under the * * terms of the Eclipse Public License v. 2.0 which is available at diff --git a/src/controllers/routing-controller.js b/src/controllers/routing-controller.js index 53316caaa..b151924f8 100644 --- a/src/controllers/routing-controller.js +++ b/src/controllers/routing-controller.js @@ -1,6 +1,6 @@ /* * ******************************************************************************* - * * Copyright (c) 2020 Edgeworx, Inc. + * * Copyright (c) 2023 Datasance Teknoloji A.S. * * * * This program and the accompanying materials are made available under the * * terms of the Eclipse Public License v. 2.0 which is available at diff --git a/src/controllers/tunnel-controller.js b/src/controllers/tunnel-controller.js index 2157de409..fc4da747a 100644 --- a/src/controllers/tunnel-controller.js +++ b/src/controllers/tunnel-controller.js @@ -1,6 +1,6 @@ /* * ******************************************************************************* - * * Copyright (c) 2020 Edgeworx, Inc. + * * Copyright (c) 2023 Datasance Teknoloji A.S. * * * * This program and the accompanying materials are made available under the * * terms of the Eclipse Public License v. 2.0 which is available at diff --git a/src/controllers/user-controller.js b/src/controllers/user-controller.js index 6314c8b2c..939c2b896 100644 --- a/src/controllers/user-controller.js +++ b/src/controllers/user-controller.js @@ -1,6 +1,6 @@ /* * ******************************************************************************* - * * Copyright (c) 2020 Edgeworx, Inc. + * * Copyright (c) 2023 Datasance Teknoloji A.S. * * * * This program and the accompanying materials are made available under the * * terms of the Eclipse Public License v. 2.0 which is available at diff --git a/src/daemon.js b/src/daemon.js index 779508c3d..105ff882b 100644 --- a/src/daemon.js +++ b/src/daemon.js @@ -1,6 +1,6 @@ /* * ******************************************************************************* - * * Copyright (c) 2020 Edgeworx, Inc. + * * Copyright (c) 2023 Datasance Teknoloji A.S. * * * * This program and the accompanying materials are made available under the * * terms of the Eclipse Public License v. 2.0 which is available at diff --git a/src/data/managers/access-token-manager.js b/src/data/managers/access-token-manager.js index 9d89a009f..54c1b9be7 100644 --- a/src/data/managers/access-token-manager.js +++ b/src/data/managers/access-token-manager.js @@ -1,6 +1,6 @@ /* * ******************************************************************************* - * * Copyright (c) 2020 Edgeworx, Inc. + * * Copyright (c) 2023 Datasance Teknoloji A.S. * * * * This program and the accompanying materials are made available under the * * terms of the Eclipse Public License v. 2.0 which is available at diff --git a/src/data/managers/application-manager.js b/src/data/managers/application-manager.js index 3b452729c..84f62e0ba 100644 --- a/src/data/managers/application-manager.js +++ b/src/data/managers/application-manager.js @@ -1,6 +1,6 @@ /* * ******************************************************************************* - * * Copyright (c) 2020 Edgeworx, Inc. + * * Copyright (c) 2023 Datasance Teknoloji A.S. * * * * This program and the accompanying materials are made available under the * * terms of the Eclipse Public License v. 2.0 which is available at diff --git a/src/data/managers/application-template-manager.js b/src/data/managers/application-template-manager.js index 5c8c6eba4..98ef4ca0f 100644 --- a/src/data/managers/application-template-manager.js +++ b/src/data/managers/application-template-manager.js @@ -1,6 +1,6 @@ /* * ******************************************************************************* - * * Copyright (c) 2020 Edgeworx, Inc. + * * Copyright (c) 2023 Datasance Teknoloji A.S. * * * * This program and the accompanying materials are made available under the * * terms of the Eclipse Public License v. 2.0 which is available at diff --git a/src/data/managers/application-template-variable-manager.js b/src/data/managers/application-template-variable-manager.js index 6488eb931..66fae8f2f 100644 --- a/src/data/managers/application-template-variable-manager.js +++ b/src/data/managers/application-template-variable-manager.js @@ -1,6 +1,6 @@ /* * ******************************************************************************* - * * Copyright (c) 2020 Edgeworx, Inc. + * * Copyright (c) 2023 Datasance Teknoloji A.S. * * * * This program and the accompanying materials are made available under the * * terms of the Eclipse Public License v. 2.0 which is available at diff --git a/src/data/managers/base-manager.js b/src/data/managers/base-manager.js index e0ca80b50..4dc4ed24c 100644 --- a/src/data/managers/base-manager.js +++ b/src/data/managers/base-manager.js @@ -1,6 +1,6 @@ /* * ******************************************************************************* -* * Copyright (c) 2020 Edgeworx, Inc. +* * Copyright (c) 2023 Datasance Teknoloji A.S. * * * * This program and the accompanying materials are made available under the * * terms of the Eclipse Public License v. 2.0 which is available at diff --git a/src/data/managers/catalog-item-image-manager.js b/src/data/managers/catalog-item-image-manager.js index bc4eae181..14076f1c5 100644 --- a/src/data/managers/catalog-item-image-manager.js +++ b/src/data/managers/catalog-item-image-manager.js @@ -1,6 +1,6 @@ /* * ******************************************************************************* - * * Copyright (c) 2020 Edgeworx, Inc. + * * Copyright (c) 2023 Datasance Teknoloji A.S. * * * * This program and the accompanying materials are made available under the * * terms of the Eclipse Public License v. 2.0 which is available at diff --git a/src/data/managers/catalog-item-input-type-manager.js b/src/data/managers/catalog-item-input-type-manager.js index 881217033..2aa19d81e 100644 --- a/src/data/managers/catalog-item-input-type-manager.js +++ b/src/data/managers/catalog-item-input-type-manager.js @@ -1,6 +1,6 @@ /* * ******************************************************************************* - * * Copyright (c) 2020 Edgeworx, Inc. + * * Copyright (c) 2023 Datasance Teknoloji A.S. * * * * This program and the accompanying materials are made available under the * * terms of the Eclipse Public License v. 2.0 which is available at diff --git a/src/data/managers/catalog-item-manager.js b/src/data/managers/catalog-item-manager.js index 2651de7bc..c190fffe6 100644 --- a/src/data/managers/catalog-item-manager.js +++ b/src/data/managers/catalog-item-manager.js @@ -1,6 +1,6 @@ /* * ******************************************************************************* - * * Copyright (c) 2020 Edgeworx, Inc. + * * Copyright (c) 2023 Datasance Teknoloji A.S. * * * * This program and the accompanying materials are made available under the * * terms of the Eclipse Public License v. 2.0 which is available at diff --git a/src/data/managers/catalog-item-output-type-manager.js b/src/data/managers/catalog-item-output-type-manager.js index c6e5602d3..6ec69012c 100644 --- a/src/data/managers/catalog-item-output-type-manager.js +++ b/src/data/managers/catalog-item-output-type-manager.js @@ -1,6 +1,6 @@ /* * ******************************************************************************* - * * Copyright (c) 2020 Edgeworx, Inc. + * * Copyright (c) 2023 Datasance Teknoloji A.S. * * * * This program and the accompanying materials are made available under the * * terms of the Eclipse Public License v. 2.0 which is available at diff --git a/src/data/managers/change-tracking-manager.js b/src/data/managers/change-tracking-manager.js index d86b69044..1f74c4c94 100644 --- a/src/data/managers/change-tracking-manager.js +++ b/src/data/managers/change-tracking-manager.js @@ -1,6 +1,6 @@ /* * ******************************************************************************* - * * Copyright (c) 2020 Edgeworx, Inc. + * * Copyright (c) 2023 Datasance Teknoloji A.S. * * * * This program and the accompanying materials are made available under the * * terms of the Eclipse Public License v. 2.0 which is available at diff --git a/src/data/managers/config-manager.js b/src/data/managers/config-manager.js index 67f055e02..824f23401 100644 --- a/src/data/managers/config-manager.js +++ b/src/data/managers/config-manager.js @@ -1,6 +1,6 @@ /* * ******************************************************************************* - * * Copyright (c) 2020 Edgeworx, Inc. + * * Copyright (c) 2023 Datasance Teknoloji A.S. * * * * This program and the accompanying materials are made available under the * * terms of the Eclipse Public License v. 2.0 which is available at diff --git a/src/data/managers/email-activation-code-manager.js b/src/data/managers/email-activation-code-manager.js index a7cb5ee5a..48e60762b 100644 --- a/src/data/managers/email-activation-code-manager.js +++ b/src/data/managers/email-activation-code-manager.js @@ -1,6 +1,6 @@ /* * ******************************************************************************* - * * Copyright (c) 2020 Edgeworx, Inc. + * * Copyright (c) 2023 Datasance Teknoloji A.S. * * * * This program and the accompanying materials are made available under the * * terms of the Eclipse Public License v. 2.0 which is available at diff --git a/src/data/managers/hw-info-manager.js b/src/data/managers/hw-info-manager.js index fe5674274..9a8fcadb0 100644 --- a/src/data/managers/hw-info-manager.js +++ b/src/data/managers/hw-info-manager.js @@ -1,6 +1,6 @@ /* * ******************************************************************************* - * * Copyright (c) 2020 Edgeworx, Inc. + * * Copyright (c) 2023 Datasance Teknoloji A.S. * * * * This program and the accompanying materials are made available under the * * terms of the Eclipse Public License v. 2.0 which is available at diff --git a/src/data/managers/iofog-access-token-manager.js b/src/data/managers/iofog-access-token-manager.js index 9ad49ef5e..0e0bd837f 100644 --- a/src/data/managers/iofog-access-token-manager.js +++ b/src/data/managers/iofog-access-token-manager.js @@ -1,6 +1,6 @@ /* * ******************************************************************************* - * * Copyright (c) 2020 Edgeworx, Inc. + * * Copyright (c) 2023 Datasance Teknoloji A.S. * * * * This program and the accompanying materials are made available under the * * terms of the Eclipse Public License v. 2.0 which is available at diff --git a/src/data/managers/iofog-manager.js b/src/data/managers/iofog-manager.js index 9aec666e8..35a7d894e 100644 --- a/src/data/managers/iofog-manager.js +++ b/src/data/managers/iofog-manager.js @@ -1,6 +1,6 @@ /* * ******************************************************************************* - * * Copyright (c) 2020 Edgeworx, Inc. + * * Copyright (c) 2023 Datasance Teknoloji A.S. * * * * This program and the accompanying materials are made available under the * * terms of the Eclipse Public License v. 2.0 which is available at diff --git a/src/data/managers/iofog-provision-key-manager.js b/src/data/managers/iofog-provision-key-manager.js index 8a6cefdab..0e6e1ca40 100644 --- a/src/data/managers/iofog-provision-key-manager.js +++ b/src/data/managers/iofog-provision-key-manager.js @@ -1,6 +1,6 @@ /* * ******************************************************************************* - * * Copyright (c) 2020 Edgeworx, Inc. + * * Copyright (c) 2023 Datasance Teknoloji A.S. * * * * This program and the accompanying materials are made available under the * * terms of the Eclipse Public License v. 2.0 which is available at diff --git a/src/data/managers/iofog-type-manager.js b/src/data/managers/iofog-type-manager.js index c03a53f91..1111bf6b4 100644 --- a/src/data/managers/iofog-type-manager.js +++ b/src/data/managers/iofog-type-manager.js @@ -1,6 +1,6 @@ /* * ******************************************************************************* - * * Copyright (c) 2020 Edgeworx, Inc. + * * Copyright (c) 2023 Datasance Teknoloji A.S. * * * * This program and the accompanying materials are made available under the * * terms of the Eclipse Public License v. 2.0 which is available at diff --git a/src/data/managers/iofog-version-command-manager.js b/src/data/managers/iofog-version-command-manager.js index 1def0136a..db027a5b3 100644 --- a/src/data/managers/iofog-version-command-manager.js +++ b/src/data/managers/iofog-version-command-manager.js @@ -1,6 +1,6 @@ /* * ******************************************************************************* - * * Copyright (c) 2020 Edgeworx, Inc. + * * Copyright (c) 2023 Datasance Teknoloji A.S. * * * * This program and the accompanying materials are made available under the * * terms of the Eclipse Public License v. 2.0 which is available at diff --git a/src/data/managers/kubelet-access-token-manager.js b/src/data/managers/kubelet-access-token-manager.js index c563fa455..b44a554cb 100644 --- a/src/data/managers/kubelet-access-token-manager.js +++ b/src/data/managers/kubelet-access-token-manager.js @@ -1,6 +1,6 @@ /* * ******************************************************************************* - * * Copyright (c) 2020 Edgeworx, Inc. + * * Copyright (c) 2023 Datasance Teknoloji A.S. * * * * This program and the accompanying materials are made available under the * * terms of the Eclipse Public License v. 2.0 which is available at diff --git a/src/data/managers/microservice-arg-manager.js b/src/data/managers/microservice-arg-manager.js index a4bf19c20..5ccf6343f 100644 --- a/src/data/managers/microservice-arg-manager.js +++ b/src/data/managers/microservice-arg-manager.js @@ -1,6 +1,6 @@ /* * ******************************************************************************* - * * Copyright (c) 2020 Edgeworx, Inc. + * * Copyright (c) 2023 Datasance Teknoloji A.S. * * * * This program and the accompanying materials are made available under the * * terms of the Eclipse Public License v. 2.0 which is available at diff --git a/src/data/managers/microservice-env-manager.js b/src/data/managers/microservice-env-manager.js index cc14c1c51..a9ffae343 100644 --- a/src/data/managers/microservice-env-manager.js +++ b/src/data/managers/microservice-env-manager.js @@ -1,6 +1,6 @@ /* * ******************************************************************************* - * * Copyright (c) 2020 Edgeworx, Inc. + * * Copyright (c) 2023 Datasance Teknoloji A.S. * * * * This program and the accompanying materials are made available under the * * terms of the Eclipse Public License v. 2.0 which is available at diff --git a/src/data/managers/microservice-extra-host-manager.js b/src/data/managers/microservice-extra-host-manager.js index 9d343d5f4..22e0a3406 100644 --- a/src/data/managers/microservice-extra-host-manager.js +++ b/src/data/managers/microservice-extra-host-manager.js @@ -1,6 +1,6 @@ /* * ******************************************************************************* - * * Copyright (c) 2020 Edgeworx, Inc. + * * Copyright (c) 2023 Datasance Teknoloji A.S. * * * * This program and the accompanying materials are made available under the * * terms of the Eclipse Public License v. 2.0 which is available at diff --git a/src/data/managers/microservice-manager.js b/src/data/managers/microservice-manager.js index 4c63af9e8..b50dcf9e0 100644 --- a/src/data/managers/microservice-manager.js +++ b/src/data/managers/microservice-manager.js @@ -1,6 +1,6 @@ /* * ******************************************************************************* - * * Copyright (c) 2020 Edgeworx, Inc. + * * Copyright (c) 2023 Datasance Teknoloji A.S. * * * * This program and the accompanying materials are made available under the * * terms of the Eclipse Public License v. 2.0 which is available at diff --git a/src/data/managers/microservice-port-manager.js b/src/data/managers/microservice-port-manager.js index 7b6041604..d4764b6b4 100644 --- a/src/data/managers/microservice-port-manager.js +++ b/src/data/managers/microservice-port-manager.js @@ -1,6 +1,6 @@ /* * ******************************************************************************* - * * Copyright (c) 2020 Edgeworx, Inc. + * * Copyright (c) 2023 Datasance Teknoloji A.S. * * * * This program and the accompanying materials are made available under the * * terms of the Eclipse Public License v. 2.0 which is available at diff --git a/src/data/managers/microservice-proxy-port-manager.js b/src/data/managers/microservice-proxy-port-manager.js index c77ea068b..2d3c05b0f 100644 --- a/src/data/managers/microservice-proxy-port-manager.js +++ b/src/data/managers/microservice-proxy-port-manager.js @@ -1,6 +1,6 @@ /* * ******************************************************************************* - * * Copyright (c) 2020 Edgeworx, Inc. + * * Copyright (c) 2023 Datasance Teknoloji A.S. * * * * This program and the accompanying materials are made available under the * * terms of the Eclipse Public License v. 2.0 which is available at diff --git a/src/data/managers/microservice-public-mode-manager.js b/src/data/managers/microservice-public-mode-manager.js index 2281a7f8d..8990f042a 100644 --- a/src/data/managers/microservice-public-mode-manager.js +++ b/src/data/managers/microservice-public-mode-manager.js @@ -1,6 +1,6 @@ /* * ******************************************************************************* - * * Copyright (c) 2020 Edgeworx, Inc. + * * Copyright (c) 2023 Datasance Teknoloji A.S. * * * * This program and the accompanying materials are made available under the * * terms of the Eclipse Public License v. 2.0 which is available at diff --git a/src/data/managers/microservice-public-port-manager.js b/src/data/managers/microservice-public-port-manager.js index 7a952a320..e5e43d977 100644 --- a/src/data/managers/microservice-public-port-manager.js +++ b/src/data/managers/microservice-public-port-manager.js @@ -1,6 +1,6 @@ /* * ******************************************************************************* - * * Copyright (c) 2020 Edgeworx, Inc. + * * Copyright (c) 2023 Datasance Teknoloji A.S. * * * * This program and the accompanying materials are made available under the * * terms of the Eclipse Public License v. 2.0 which is available at diff --git a/src/data/managers/microservice-status-manager.js b/src/data/managers/microservice-status-manager.js index 516db62c1..9690e21dd 100644 --- a/src/data/managers/microservice-status-manager.js +++ b/src/data/managers/microservice-status-manager.js @@ -1,6 +1,6 @@ /* * ******************************************************************************* - * * Copyright (c) 2020 Edgeworx, Inc. + * * Copyright (c) 2023 Datasance Teknoloji A.S. * * * * This program and the accompanying materials are made available under the * * terms of the Eclipse Public License v. 2.0 which is available at diff --git a/src/data/managers/router-connection-manager.js b/src/data/managers/router-connection-manager.js index 68306ca9d..57108ff44 100644 --- a/src/data/managers/router-connection-manager.js +++ b/src/data/managers/router-connection-manager.js @@ -1,6 +1,6 @@ /* * ******************************************************************************* - * * Copyright (c) 2020 Edgeworx, Inc. + * * Copyright (c) 2023 Datasance Teknoloji A.S. * * * * This program and the accompanying materials are made available under the * * terms of the Eclipse Public License v. 2.0 which is available at diff --git a/src/data/managers/router-manager.js b/src/data/managers/router-manager.js index 937c7025a..645d7b4dd 100644 --- a/src/data/managers/router-manager.js +++ b/src/data/managers/router-manager.js @@ -1,6 +1,6 @@ /* * ******************************************************************************* - * * Copyright (c) 2020 Edgeworx, Inc. + * * Copyright (c) 2023 Datasance Teknoloji A.S. * * * * This program and the accompanying materials are made available under the * * terms of the Eclipse Public License v. 2.0 which is available at diff --git a/src/data/managers/routing-manager.js b/src/data/managers/routing-manager.js index 8a5140481..1d82e1fce 100644 --- a/src/data/managers/routing-manager.js +++ b/src/data/managers/routing-manager.js @@ -1,6 +1,6 @@ /* * ******************************************************************************* - * * Copyright (c) 2020 Edgeworx, Inc. + * * Copyright (c) 2023 Datasance Teknoloji A.S. * * * * This program and the accompanying materials are made available under the * * terms of the Eclipse Public License v. 2.0 which is available at diff --git a/src/data/managers/scheduler-access-token-manager.js b/src/data/managers/scheduler-access-token-manager.js index 9c0b3fb5c..7e51c945c 100644 --- a/src/data/managers/scheduler-access-token-manager.js +++ b/src/data/managers/scheduler-access-token-manager.js @@ -1,6 +1,6 @@ /* * ******************************************************************************* - * * Copyright (c) 2020 Edgeworx, Inc. + * * Copyright (c) 2023 Datasance Teknoloji A.S. * * * * This program and the accompanying materials are made available under the * * terms of the Eclipse Public License v. 2.0 which is available at diff --git a/src/data/managers/strace-diagnostics-manager.js b/src/data/managers/strace-diagnostics-manager.js index fe04377de..9b2402bab 100644 --- a/src/data/managers/strace-diagnostics-manager.js +++ b/src/data/managers/strace-diagnostics-manager.js @@ -1,6 +1,6 @@ /* * ******************************************************************************* - * * Copyright (c) 2020 Edgeworx, Inc. + * * Copyright (c) 2023 Datasance Teknoloji A.S. * * * * This program and the accompanying materials are made available under the * * terms of the Eclipse Public License v. 2.0 which is available at diff --git a/src/data/managers/strace-manager.js b/src/data/managers/strace-manager.js index f590c577f..577cbac1a 100644 --- a/src/data/managers/strace-manager.js +++ b/src/data/managers/strace-manager.js @@ -1,6 +1,6 @@ /* * ******************************************************************************* - * * Copyright (c) 2020 Edgeworx, Inc. + * * Copyright (c) 2023 Datasance Teknoloji A.S. * * * * This program and the accompanying materials are made available under the * * terms of the Eclipse Public License v. 2.0 which is available at diff --git a/src/data/managers/tags-manager.js b/src/data/managers/tags-manager.js index 375646196..ebde21a18 100644 --- a/src/data/managers/tags-manager.js +++ b/src/data/managers/tags-manager.js @@ -1,6 +1,6 @@ /* * ******************************************************************************* - * * Copyright (c) 2020 Edgeworx, Inc. + * * Copyright (c) 2023 Datasance Teknoloji A.S. * * * * This program and the accompanying materials are made available under the * * terms of the Eclipse Public License v. 2.0 which is available at diff --git a/src/data/managers/usb-info-manager.js b/src/data/managers/usb-info-manager.js index ba99023ae..85f3a423b 100644 --- a/src/data/managers/usb-info-manager.js +++ b/src/data/managers/usb-info-manager.js @@ -1,6 +1,6 @@ /* * ******************************************************************************* - * * Copyright (c) 2020 Edgeworx, Inc. + * * Copyright (c) 2023 Datasance Teknoloji A.S. * * * * This program and the accompanying materials are made available under the * * terms of the Eclipse Public License v. 2.0 which is available at diff --git a/src/data/managers/user-manager.js b/src/data/managers/user-manager.js index 5fe41018d..78d2b5f6e 100644 --- a/src/data/managers/user-manager.js +++ b/src/data/managers/user-manager.js @@ -1,6 +1,6 @@ /* * ******************************************************************************* - * * Copyright (c) 2020 Edgeworx, Inc. + * * Copyright (c) 2023 Datasance Teknoloji A.S. * * * * This program and the accompanying materials are made available under the * * terms of the Eclipse Public License v. 2.0 which is available at diff --git a/src/data/managers/volume-mapping-manager.js b/src/data/managers/volume-mapping-manager.js index c6d8ecb3a..a9e77ff71 100644 --- a/src/data/managers/volume-mapping-manager.js +++ b/src/data/managers/volume-mapping-manager.js @@ -1,6 +1,6 @@ /* * ******************************************************************************* - * * Copyright (c) 2020 Edgeworx, Inc. + * * Copyright (c) 2023 Datasance Teknoloji A.S. * * * * This program and the accompanying materials are made available under the * * terms of the Eclipse Public License v. 2.0 which is available at diff --git a/src/data/models/changetracking.js b/src/data/models/changetracking.js index 6aca2212b..ee4d34d92 100644 --- a/src/data/models/changetracking.js +++ b/src/data/models/changetracking.js @@ -1,6 +1,6 @@ /* * ******************************************************************************* - * * Copyright (c) 2020 Edgeworx, Inc. + * * Copyright (c) 2023 Datasance Teknoloji A.S. * * * * This program and the accompanying materials are made available under the * * terms of the Eclipse Public License v. 2.0 which is available at diff --git a/src/decorators/authorization-decorator.js b/src/decorators/authorization-decorator.js index 732003908..56699125a 100644 --- a/src/decorators/authorization-decorator.js +++ b/src/decorators/authorization-decorator.js @@ -1,6 +1,6 @@ /* * ******************************************************************************* - * * Copyright (c) 2020 Edgeworx, Inc. + * * Copyright (c) 2023 Datasance Teknoloji A.S. * * * * This program and the accompanying materials are made available under the * * terms of the Eclipse Public License v. 2.0 which is available at diff --git a/src/decorators/cli-decorator.js b/src/decorators/cli-decorator.js index 4606e578f..f7e5f8954 100644 --- a/src/decorators/cli-decorator.js +++ b/src/decorators/cli-decorator.js @@ -1,6 +1,6 @@ /* * ******************************************************************************* - * * Copyright (c) 2020 Edgeworx, Inc. + * * Copyright (c) 2023 Datasance Teknoloji A.S. * * * * This program and the accompanying materials are made available under the * * terms of the Eclipse Public License v. 2.0 which is available at diff --git a/src/decorators/response-decorator.js b/src/decorators/response-decorator.js index 61f5a6359..a2c7d461c 100644 --- a/src/decorators/response-decorator.js +++ b/src/decorators/response-decorator.js @@ -1,6 +1,6 @@ /* * ******************************************************************************* - * * Copyright (c) 2020 Edgeworx, Inc. + * * Copyright (c) 2023 Datasance Teknoloji A.S. * * * * This program and the accompanying materials are made available under the * * terms of the Eclipse Public License v. 2.0 which is available at diff --git a/src/decorators/transaction-decorator.js b/src/decorators/transaction-decorator.js index a5d33ddce..4940cccc4 100644 --- a/src/decorators/transaction-decorator.js +++ b/src/decorators/transaction-decorator.js @@ -1,6 +1,6 @@ /* * ******************************************************************************* - * * Copyright (c) 2020 Edgeworx, Inc. + * * Copyright (c) 2023 Datasance Teknoloji A.S. * * * * This program and the accompanying materials are made available under the * * terms of the Eclipse Public License v. 2.0 which is available at diff --git a/src/enums/fog-state.js b/src/enums/fog-state.js index 396a57e47..f33d5da4f 100644 --- a/src/enums/fog-state.js +++ b/src/enums/fog-state.js @@ -1,6 +1,6 @@ /* * ******************************************************************************* - * * Copyright (c) 2020 Edgeworx, Inc. + * * Copyright (c) 2023 Datasance Teknoloji A.S. * * * * This program and the accompanying materials are made available under the * * terms of the Eclipse Public License v. 2.0 which is available at diff --git a/src/enums/microservice-state.js b/src/enums/microservice-state.js index 86e79f44c..6a596c408 100644 --- a/src/enums/microservice-state.js +++ b/src/enums/microservice-state.js @@ -1,6 +1,6 @@ /* * ******************************************************************************* - * * Copyright (c) 2020 Edgeworx, Inc. + * * Copyright (c) 2023 Datasance Teknoloji A.S. * * * * This program and the accompanying materials are made available under the * * terms of the Eclipse Public License v. 2.0 which is available at diff --git a/src/helpers/app-helper.js b/src/helpers/app-helper.js index ffaab8b65..3c0ffa972 100644 --- a/src/helpers/app-helper.js +++ b/src/helpers/app-helper.js @@ -1,6 +1,6 @@ /* * ******************************************************************************* - * * Copyright (c) 2020 Edgeworx, Inc. + * * Copyright (c) 2023 Datasance Teknoloji A.S. * * * * This program and the accompanying materials are made available under the * * terms of the Eclipse Public License v. 2.0 which is available at diff --git a/src/helpers/constants.js b/src/helpers/constants.js index 0b4d7a5d3..c7f13218a 100644 --- a/src/helpers/constants.js +++ b/src/helpers/constants.js @@ -1,6 +1,6 @@ /* * ******************************************************************************* - * * Copyright (c) 2020 Edgeworx, Inc. + * * Copyright (c) 2023 Datasance Teknoloji A.S. * * * * This program and the accompanying materials are made available under the * * terms of the Eclipse Public License v. 2.0 which is available at diff --git a/src/helpers/error-messages.js b/src/helpers/error-messages.js index 3351c7bff..cc4818f3f 100644 --- a/src/helpers/error-messages.js +++ b/src/helpers/error-messages.js @@ -1,6 +1,6 @@ /* * ******************************************************************************* - * * Copyright (c) 2020 Edgeworx, Inc. + * * Copyright (c) 2023 Datasance Teknoloji A.S. * * * * This program and the accompanying materials are made available under the * * terms of the Eclipse Public License v. 2.0 which is available at diff --git a/src/helpers/errors.js b/src/helpers/errors.js index 17493ba61..27f06a011 100644 --- a/src/helpers/errors.js +++ b/src/helpers/errors.js @@ -1,6 +1,6 @@ /* * ******************************************************************************* - * * Copyright (c) 2020 Edgeworx, Inc. + * * Copyright (c) 2023 Datasance Teknoloji A.S. * * * * This program and the accompanying materials are made available under the * * terms of the Eclipse Public License v. 2.0 which is available at diff --git a/src/jobs/fog-status-job.js b/src/jobs/fog-status-job.js index da3020a84..d007bd09a 100644 --- a/src/jobs/fog-status-job.js +++ b/src/jobs/fog-status-job.js @@ -1,6 +1,6 @@ /* * ******************************************************************************* - * * Copyright (c) 2020 Edgeworx, Inc. + * * Copyright (c) 2023 Datasance Teknoloji A.S. * * * * This program and the accompanying materials are made available under the * * terms of the Eclipse Public License v. 2.0 which is available at diff --git a/src/jobs/stopped-app-status-job.js b/src/jobs/stopped-app-status-job.js index 336ce609f..87fb608fa 100644 --- a/src/jobs/stopped-app-status-job.js +++ b/src/jobs/stopped-app-status-job.js @@ -1,6 +1,6 @@ /* * ******************************************************************************* - * * Copyright (c) 2020 Edgeworx, Inc. + * * Copyright (c) 2023 Datasance Teknoloji A.S. * * * * This program and the accompanying materials are made available under the * * terms of the Eclipse Public License v. 2.0 which is available at diff --git a/src/logger/index.js b/src/logger/index.js index dd40884e0..d2a10b0dc 100644 --- a/src/logger/index.js +++ b/src/logger/index.js @@ -1,6 +1,6 @@ /* * ******************************************************************************* - * * Copyright (c) 2020 Edgeworx, Inc. + * * Copyright (c) 2023 Datasance Teknoloji A.S. * * * * This program and the accompanying materials are made available under the * * terms of the Eclipse Public License v. 2.0 which is available at diff --git a/src/main.js b/src/main.js index cefe8e687..96d700c1a 100644 --- a/src/main.js +++ b/src/main.js @@ -2,7 +2,7 @@ /* * ******************************************************************************* - * * Copyright (c) 2020 Edgeworx, Inc. + * * Copyright (c) 2023 Datasance Teknoloji A.S. * * * * This program and the accompanying materials are made available under the * * terms of the Eclipse Public License v. 2.0 which is available at diff --git a/src/routes/agent.js b/src/routes/agent.js index f79ae274d..e2e86e273 100644 --- a/src/routes/agent.js +++ b/src/routes/agent.js @@ -1,6 +1,6 @@ /* * ******************************************************************************* - * * Copyright (c) 2020 Edgeworx, Inc. + * * Copyright (c) 2023 Datasance Teknoloji A.S. * * * * This program and the accompanying materials are made available under the * * terms of the Eclipse Public License v. 2.0 which is available at diff --git a/src/routes/application.js b/src/routes/application.js index f5cb3e663..860912f89 100644 --- a/src/routes/application.js +++ b/src/routes/application.js @@ -1,6 +1,6 @@ /* * ******************************************************************************* - * * Copyright (c) 2020 Edgeworx, Inc. + * * Copyright (c) 2023 Datasance Teknoloji A.S. * * * * This program and the accompanying materials are made available under the * * terms of the Eclipse Public License v. 2.0 which is available at diff --git a/src/routes/applicationTemplate.js b/src/routes/applicationTemplate.js index 432a20885..ad0d5af7a 100644 --- a/src/routes/applicationTemplate.js +++ b/src/routes/applicationTemplate.js @@ -1,6 +1,6 @@ /* * ******************************************************************************* - * * Copyright (c) 2020 Edgeworx, Inc. + * * Copyright (c) 2023 Datasance Teknoloji A.S. * * * * This program and the accompanying materials are made available under the * * terms of the Eclipse Public License v. 2.0 which is available at diff --git a/src/routes/capabilities.js b/src/routes/capabilities.js index f7317e0df..400e5750e 100644 --- a/src/routes/capabilities.js +++ b/src/routes/capabilities.js @@ -1,6 +1,6 @@ /* * ******************************************************************************* - * * Copyright (c) 2020 Edgeworx, Inc. + * * Copyright (c) 2023 Datasance Teknoloji A.S. * * * * This program and the accompanying materials are made available under the * * terms of the Eclipse Public License v. 2.0 which is available at diff --git a/src/routes/catalog.js b/src/routes/catalog.js index d3b8d3e3a..631da303c 100644 --- a/src/routes/catalog.js +++ b/src/routes/catalog.js @@ -1,6 +1,6 @@ /* * ******************************************************************************* - * * Copyright (c) 2020 Edgeworx, Inc. + * * Copyright (c) 2023 Datasance Teknoloji A.S. * * * * This program and the accompanying materials are made available under the * * terms of the Eclipse Public License v. 2.0 which is available at diff --git a/src/routes/config.js b/src/routes/config.js index a1a605c1c..118f13a1f 100644 --- a/src/routes/config.js +++ b/src/routes/config.js @@ -1,6 +1,6 @@ /* * ******************************************************************************* - * * Copyright (c) 2020 Edgeworx, Inc. + * * Copyright (c) 2023 Datasance Teknoloji A.S. * * * * This program and the accompanying materials are made available under the * * terms of the Eclipse Public License v. 2.0 which is available at diff --git a/src/routes/controller.js b/src/routes/controller.js index ad980bb3a..3cd8fc98f 100644 --- a/src/routes/controller.js +++ b/src/routes/controller.js @@ -1,6 +1,6 @@ /* * ******************************************************************************* - * * Copyright (c) 2020 Edgeworx, Inc. + * * Copyright (c) 2023 Datasance Teknoloji A.S. * * * * This program and the accompanying materials are made available under the * * terms of the Eclipse Public License v. 2.0 which is available at diff --git a/src/routes/diagnostics.js b/src/routes/diagnostics.js index 65fa6a1a5..67acfce2d 100644 --- a/src/routes/diagnostics.js +++ b/src/routes/diagnostics.js @@ -1,6 +1,6 @@ /* * ******************************************************************************* - * * Copyright (c) 2020 Edgeworx, Inc. + * * Copyright (c) 2023 Datasance Teknoloji A.S. * * * * This program and the accompanying materials are made available under the * * terms of the Eclipse Public License v. 2.0 which is available at diff --git a/src/routes/edgeResource.js b/src/routes/edgeResource.js index f11037d84..f67a68be3 100644 --- a/src/routes/edgeResource.js +++ b/src/routes/edgeResource.js @@ -1,6 +1,6 @@ /* * ******************************************************************************* - * * Copyright (c) 2020 Edgeworx, Inc. + * * Copyright (c) 2023 Datasance Teknoloji A.S. * * * * This program and the accompanying materials are made available under the * * terms of the Eclipse Public License v. 2.0 which is available at diff --git a/src/routes/flow.js b/src/routes/flow.js index 0b169d4b4..951e69206 100644 --- a/src/routes/flow.js +++ b/src/routes/flow.js @@ -1,6 +1,6 @@ /* * ******************************************************************************* - * * Copyright (c) 2020 Edgeworx, Inc. + * * Copyright (c) 2023 Datasance Teknoloji A.S. * * * * This program and the accompanying materials are made available under the * * terms of the Eclipse Public License v. 2.0 which is available at diff --git a/src/routes/iofog.js b/src/routes/iofog.js index 6a6ddaffb..1a6a734d3 100644 --- a/src/routes/iofog.js +++ b/src/routes/iofog.js @@ -1,6 +1,6 @@ /* * ******************************************************************************* - * * Copyright (c) 2020 Edgeworx, Inc. + * * Copyright (c) 2023 Datasance Teknoloji A.S. * * * * This program and the accompanying materials are made available under the * * terms of the Eclipse Public License v. 2.0 which is available at diff --git a/src/routes/kubelet.js b/src/routes/kubelet.js index 1666f7091..174272453 100644 --- a/src/routes/kubelet.js +++ b/src/routes/kubelet.js @@ -1,6 +1,6 @@ /* * ******************************************************************************* - * * Copyright (c) 2020 Edgeworx, Inc. + * * Copyright (c) 2023 Datasance Teknoloji A.S. * * * * This program and the accompanying materials are made available under the * * terms of the Eclipse Public License v. 2.0 which is available at diff --git a/src/routes/microservices.js b/src/routes/microservices.js index e817e2108..b0c6cdd97 100644 --- a/src/routes/microservices.js +++ b/src/routes/microservices.js @@ -1,6 +1,6 @@ /* * ******************************************************************************* - * * Copyright (c) 2020 Edgeworx, Inc. + * * Copyright (c) 2023 Datasance Teknoloji A.S. * * * * This program and the accompanying materials are made available under the * * terms of the Eclipse Public License v. 2.0 which is available at diff --git a/src/routes/registries.js b/src/routes/registries.js index 7f9d416a2..6080487ef 100644 --- a/src/routes/registries.js +++ b/src/routes/registries.js @@ -1,6 +1,6 @@ /* * ******************************************************************************* - * * Copyright (c) 2020 Edgeworx, Inc. + * * Copyright (c) 2023 Datasance Teknoloji A.S. * * * * This program and the accompanying materials are made available under the * * terms of the Eclipse Public License v. 2.0 which is available at diff --git a/src/routes/router.js b/src/routes/router.js index 5653f2a3a..ba3aa1d8a 100644 --- a/src/routes/router.js +++ b/src/routes/router.js @@ -1,6 +1,6 @@ /* * ******************************************************************************* - * * Copyright (c) 2020 Edgeworx, Inc. + * * Copyright (c) 2023 Datasance Teknoloji A.S. * * * * This program and the accompanying materials are made available under the * * terms of the Eclipse Public License v. 2.0 which is available at diff --git a/src/routes/routing.js b/src/routes/routing.js index 280b17cdc..a7e78d752 100644 --- a/src/routes/routing.js +++ b/src/routes/routing.js @@ -1,6 +1,6 @@ /* * ******************************************************************************* - * * Copyright (c) 2020 Edgeworx, Inc. + * * Copyright (c) 2023 Datasance Teknoloji A.S. * * * * This program and the accompanying materials are made available under the * * terms of the Eclipse Public License v. 2.0 which is available at diff --git a/src/routes/tunnel.js b/src/routes/tunnel.js index 03a9c62ea..840f4551f 100644 --- a/src/routes/tunnel.js +++ b/src/routes/tunnel.js @@ -1,6 +1,6 @@ /* * ******************************************************************************* - * * Copyright (c) 2020 Edgeworx, Inc. + * * Copyright (c) 2023 Datasance Teknoloji A.S. * * * * This program and the accompanying materials are made available under the * * terms of the Eclipse Public License v. 2.0 which is available at diff --git a/src/routes/user.js b/src/routes/user.js index f010c7659..0f7f7703b 100644 --- a/src/routes/user.js +++ b/src/routes/user.js @@ -1,6 +1,6 @@ /* * ******************************************************************************* - * * Copyright (c) 2020 Edgeworx, Inc. + * * Copyright (c) 2023 Datasance Teknoloji A.S. * * * * This program and the accompanying materials are made available under the * * terms of the Eclipse Public License v. 2.0 which is available at diff --git a/src/schemas/agent.js b/src/schemas/agent.js index a0cf1fc17..d14255a22 100644 --- a/src/schemas/agent.js +++ b/src/schemas/agent.js @@ -1,6 +1,6 @@ /* * ******************************************************************************* - * * Copyright (c) 2020 Edgeworx, Inc. + * * Copyright (c) 2023 Datasance Teknoloji A.S. * * * * This program and the accompanying materials are made available under the * * terms of the Eclipse Public License v. 2.0 which is available at diff --git a/src/schemas/catalog.js b/src/schemas/catalog.js index fb7e69646..4b61d9a15 100644 --- a/src/schemas/catalog.js +++ b/src/schemas/catalog.js @@ -1,6 +1,6 @@ /* * ******************************************************************************* - * * Copyright (c) 2020 Edgeworx, Inc. + * * Copyright (c) 2023 Datasance Teknoloji A.S. * * * * This program and the accompanying materials are made available under the * * terms of the Eclipse Public License v. 2.0 which is available at diff --git a/src/schemas/config.js b/src/schemas/config.js index 6c3db3c3a..f83a89b99 100644 --- a/src/schemas/config.js +++ b/src/schemas/config.js @@ -1,6 +1,6 @@ /* * ******************************************************************************* - * * Copyright (c) 2020 Edgeworx, Inc. + * * Copyright (c) 2023 Datasance Teknoloji A.S. * * * * This program and the accompanying materials are made available under the * * terms of the Eclipse Public License v. 2.0 which is available at diff --git a/src/schemas/diagnostics.js b/src/schemas/diagnostics.js index dc1e5d9a7..8947c331e 100644 --- a/src/schemas/diagnostics.js +++ b/src/schemas/diagnostics.js @@ -1,6 +1,6 @@ /* * ******************************************************************************* - * * Copyright (c) 2020 Edgeworx, Inc. + * * Copyright (c) 2023 Datasance Teknoloji A.S. * * * * This program and the accompanying materials are made available under the * * terms of the Eclipse Public License v. 2.0 which is available at diff --git a/src/schemas/edgeResource.js b/src/schemas/edgeResource.js index fa48c3f1d..1bc887799 100644 --- a/src/schemas/edgeResource.js +++ b/src/schemas/edgeResource.js @@ -1,6 +1,6 @@ /* * ******************************************************************************* - * * Copyright (c) 2020 Edgeworx, Inc. + * * Copyright (c) 2023 Datasance Teknoloji A.S. * * * * This program and the accompanying materials are made available under the * * terms of the Eclipse Public License v. 2.0 which is available at diff --git a/src/schemas/index.js b/src/schemas/index.js index 7a843f03e..3ec077aae 100644 --- a/src/schemas/index.js +++ b/src/schemas/index.js @@ -1,6 +1,6 @@ /* * ******************************************************************************* - * * Copyright (c) 2020 Edgeworx, Inc. + * * Copyright (c) 2023 Datasance Teknoloji A.S. * * * * This program and the accompanying materials are made available under the * * terms of the Eclipse Public License v. 2.0 which is available at diff --git a/src/schemas/iofog.js b/src/schemas/iofog.js index 6af9298ef..5cda9e7fb 100644 --- a/src/schemas/iofog.js +++ b/src/schemas/iofog.js @@ -1,6 +1,6 @@ /* * ******************************************************************************* - * * Copyright (c) 2020 Edgeworx, Inc. + * * Copyright (c) 2023 Datasance Teknoloji A.S. * * * * This program and the accompanying materials are made available under the * * terms of the Eclipse Public License v. 2.0 which is available at diff --git a/src/schemas/registry.js b/src/schemas/registry.js index bdd4b4ed4..695c936fc 100644 --- a/src/schemas/registry.js +++ b/src/schemas/registry.js @@ -1,6 +1,6 @@ /* * ******************************************************************************* - * * Copyright (c) 2020 Edgeworx, Inc. + * * Copyright (c) 2023 Datasance Teknoloji A.S. * * * * This program and the accompanying materials are made available under the * * terms of the Eclipse Public License v. 2.0 which is available at diff --git a/src/schemas/routing.js b/src/schemas/routing.js index 83434a977..36d15db0c 100644 --- a/src/schemas/routing.js +++ b/src/schemas/routing.js @@ -1,6 +1,6 @@ /* * ******************************************************************************* - * * Copyright (c) 2020 Edgeworx, Inc. + * * Copyright (c) 2023 Datasance Teknoloji A.S. * * * * This program and the accompanying materials are made available under the * * terms of the Eclipse Public License v. 2.0 which is available at diff --git a/src/schemas/tunnel.js b/src/schemas/tunnel.js index d0593947c..1b3b0110e 100644 --- a/src/schemas/tunnel.js +++ b/src/schemas/tunnel.js @@ -1,6 +1,6 @@ /* * ******************************************************************************* - * * Copyright (c) 2020 Edgeworx, Inc. + * * Copyright (c) 2023 Datasance Teknoloji A.S. * * * * This program and the accompanying materials are made available under the * * terms of the Eclipse Public License v. 2.0 which is available at diff --git a/src/schemas/user.js b/src/schemas/user.js index f7abab0db..06e60e036 100644 --- a/src/schemas/user.js +++ b/src/schemas/user.js @@ -1,6 +1,6 @@ /* * ******************************************************************************* - * * Copyright (c) 2020 Edgeworx, Inc. + * * Copyright (c) 2023 Datasance Teknoloji A.S. * * * * This program and the accompanying materials are made available under the * * terms of the Eclipse Public License v. 2.0 which is available at diff --git a/src/server.js b/src/server.js index 2f018ef15..6dce62643 100755 --- a/src/server.js +++ b/src/server.js @@ -1,6 +1,6 @@ /* * ******************************************************************************* - * * Copyright (c) 2020 Edgeworx, Inc. + * * Copyright (c) 2023 Datasance Teknoloji A.S. * * * * This program and the accompanying materials are made available under the * * terms of the Eclipse Public License v. 2.0 which is available at diff --git a/src/services/access-token-service.js b/src/services/access-token-service.js index 6363acd20..822bfdceb 100644 --- a/src/services/access-token-service.js +++ b/src/services/access-token-service.js @@ -1,6 +1,6 @@ /* * ******************************************************************************* - * * Copyright (c) 2020 Edgeworx, Inc. + * * Copyright (c) 2023 Datasance Teknoloji A.S. * * * * This program and the accompanying materials are made available under the * * terms of the Eclipse Public License v. 2.0 which is available at diff --git a/src/services/agent-service.js b/src/services/agent-service.js index 14e008d2c..dbfb6ecab 100644 --- a/src/services/agent-service.js +++ b/src/services/agent-service.js @@ -1,6 +1,6 @@ /* * ******************************************************************************* - * * Copyright (c) 2020 Edgeworx, Inc. + * * Copyright (c) 2023 Datasance Teknoloji A.S. * * * * This program and the accompanying materials are made available under the * * terms of the Eclipse Public License v. 2.0 which is available at diff --git a/src/services/application-service.js b/src/services/application-service.js index b057789ba..098472e18 100644 --- a/src/services/application-service.js +++ b/src/services/application-service.js @@ -1,6 +1,6 @@ /* * ******************************************************************************* - * * Copyright (c) 2020 Edgeworx, Inc. + * * Copyright (c) 2023 Datasance Teknoloji A.S. * * * * This program and the accompanying materials are made available under the * * terms of the Eclipse Public License v. 2.0 which is available at diff --git a/src/services/application-template-service.js b/src/services/application-template-service.js index 771539bba..8f00742fb 100644 --- a/src/services/application-template-service.js +++ b/src/services/application-template-service.js @@ -1,6 +1,6 @@ /* * ******************************************************************************* - * * Copyright (c) 2020 Edgeworx, Inc. + * * Copyright (c) 2023 Datasance Teknoloji A.S. * * * * This program and the accompanying materials are made available under the * * terms of the Eclipse Public License v. 2.0 which is available at diff --git a/src/services/catalog-service.js b/src/services/catalog-service.js index bc9e6a569..b5920387d 100644 --- a/src/services/catalog-service.js +++ b/src/services/catalog-service.js @@ -1,6 +1,6 @@ /* * ******************************************************************************* - * * Copyright (c) 2020 Edgeworx, Inc. + * * Copyright (c) 2023 Datasance Teknoloji A.S. * * * * This program and the accompanying materials are made available under the * * terms of the Eclipse Public License v. 2.0 which is available at diff --git a/src/services/change-tracking-service.js b/src/services/change-tracking-service.js index ef6d0c7dc..9fe0885c7 100644 --- a/src/services/change-tracking-service.js +++ b/src/services/change-tracking-service.js @@ -1,6 +1,6 @@ /* * ******************************************************************************* - * * Copyright (c) 2020 Edgeworx, Inc. + * * Copyright (c) 2023 Datasance Teknoloji A.S. * * * * This program and the accompanying materials are made available under the * * terms of the Eclipse Public License v. 2.0 which is available at diff --git a/src/services/config-service.js b/src/services/config-service.js index 323f61e4b..63cab6f67 100644 --- a/src/services/config-service.js +++ b/src/services/config-service.js @@ -1,6 +1,6 @@ /* * ******************************************************************************* - * * Copyright (c) 2020 Edgeworx, Inc. + * * Copyright (c) 2023 Datasance Teknoloji A.S. * * * * This program and the accompanying materials are made available under the * * terms of the Eclipse Public License v. 2.0 which is available at diff --git a/src/services/controller-service.js b/src/services/controller-service.js index 2e73322f7..7796c210a 100644 --- a/src/services/controller-service.js +++ b/src/services/controller-service.js @@ -1,6 +1,6 @@ /* * ******************************************************************************* - * * Copyright (c) 2020 Edgeworx, Inc. + * * Copyright (c) 2023 Datasance Teknoloji A.S. * * * * This program and the accompanying materials are made available under the * * terms of the Eclipse Public License v. 2.0 which is available at diff --git a/src/services/diagnostic-service.js b/src/services/diagnostic-service.js index 98b771a75..f16506720 100644 --- a/src/services/diagnostic-service.js +++ b/src/services/diagnostic-service.js @@ -1,6 +1,6 @@ /* * ******************************************************************************* - * * Copyright (c) 2020 Edgeworx, Inc. + * * Copyright (c) 2023 Datasance Teknoloji A.S. * * * * This program and the accompanying materials are made available under the * * terms of the Eclipse Public License v. 2.0 which is available at diff --git a/src/services/edge-resource-service.js b/src/services/edge-resource-service.js index 360491711..a7b3a6537 100644 --- a/src/services/edge-resource-service.js +++ b/src/services/edge-resource-service.js @@ -1,6 +1,6 @@ /* * ******************************************************************************* - * * Copyright (c) 2020 Edgeworx, Inc. + * * Copyright (c) 2023 Datasance Teknoloji A.S. * * * * This program and the accompanying materials are made available under the * * terms of the Eclipse Public License v. 2.0 which is available at diff --git a/src/services/email-activation-code-service.js b/src/services/email-activation-code-service.js index 0c62a8003..d395a0d55 100644 --- a/src/services/email-activation-code-service.js +++ b/src/services/email-activation-code-service.js @@ -1,6 +1,6 @@ /* * ******************************************************************************* - * * Copyright (c) 2020 Edgeworx, Inc. + * * Copyright (c) 2023 Datasance Teknoloji A.S. * * * * This program and the accompanying materials are made available under the * * terms of the Eclipse Public License v. 2.0 which is available at diff --git a/src/services/iofog-access-token-service.js b/src/services/iofog-access-token-service.js index db06da1e4..529fdb6b1 100644 --- a/src/services/iofog-access-token-service.js +++ b/src/services/iofog-access-token-service.js @@ -1,6 +1,6 @@ /* * ******************************************************************************* - * * Copyright (c) 2020 Edgeworx, Inc. + * * Copyright (c) 2023 Datasance Teknoloji A.S. * * * * This program and the accompanying materials are made available under the * * terms of the Eclipse Public License v. 2.0 which is available at diff --git a/src/services/iofog-service.js b/src/services/iofog-service.js index 0187cde3a..74024e42b 100644 --- a/src/services/iofog-service.js +++ b/src/services/iofog-service.js @@ -1,6 +1,6 @@ /* * ******************************************************************************* - * * Copyright (c) 2020 Edgeworx, Inc. + * * Copyright (c) 2023 Datasance Teknoloji A.S. * * * * This program and the accompanying materials are made available under the * * terms of the Eclipse Public License v. 2.0 which is available at diff --git a/src/services/kubelet-access-token-service.js b/src/services/kubelet-access-token-service.js index 478806e5f..0ccc5c379 100644 --- a/src/services/kubelet-access-token-service.js +++ b/src/services/kubelet-access-token-service.js @@ -1,6 +1,6 @@ /* * ******************************************************************************* - * * Copyright (c) 2020 Edgeworx, Inc. + * * Copyright (c) 2023 Datasance Teknoloji A.S. * * * * This program and the accompanying materials are made available under the * * terms of the Eclipse Public License v. 2.0 which is available at diff --git a/src/services/kubelet-service.js b/src/services/kubelet-service.js index bd6569cf3..c5afd3072 100644 --- a/src/services/kubelet-service.js +++ b/src/services/kubelet-service.js @@ -1,6 +1,6 @@ /* * ******************************************************************************* - * * Copyright (c) 2020 Edgeworx, Inc. + * * Copyright (c) 2023 Datasance Teknoloji A.S. * * * * This program and the accompanying materials are made available under the * * terms of the Eclipse Public License v. 2.0 which is available at diff --git a/src/services/microservice-ports/default.js b/src/services/microservice-ports/default.js index 8d9e88685..9e877bc38 100644 --- a/src/services/microservice-ports/default.js +++ b/src/services/microservice-ports/default.js @@ -1,6 +1,6 @@ /* only "[a-zA-Z0-9][a-zA-Z0-9_.-]" are allowed * ******************************************************************************* - * * Copyright (c) 2020 Edgeworx, Inc. + * * Copyright (c) 2023 Datasance Teknoloji A.S. * * * * This program and the accompanying materials are made available under the * * terms of the Eclipse Public License v. 2.0 which is available at diff --git a/src/services/microservice-ports/factory.js b/src/services/microservice-ports/factory.js index e40c52e71..e07b1c192 100644 --- a/src/services/microservice-ports/factory.js +++ b/src/services/microservice-ports/factory.js @@ -1,6 +1,6 @@ /* * ******************************************************************************* - * * Copyright (c) 2020 Edgeworx, Inc. + * * Copyright (c) 2023 Datasance Teknoloji A.S. * * * * This program and the accompanying materials are made available under the * * terms of the Eclipse Public License v. 2.0 which is available at diff --git a/src/services/microservices-service.js b/src/services/microservices-service.js index 66ae6c0c1..f8bb4a579 100644 --- a/src/services/microservices-service.js +++ b/src/services/microservices-service.js @@ -1,6 +1,6 @@ /* only "[a-zA-Z0-9][a-zA-Z0-9_.-]" are allowed * ******************************************************************************* - * * Copyright (c) 2020 Edgeworx, Inc. + * * Copyright (c) 2023 Datasance Teknoloji A.S. * * * * This program and the accompanying materials are made available under the * * terms of the Eclipse Public License v. 2.0 which is available at diff --git a/src/services/registry-service.js b/src/services/registry-service.js index 7cc0108c8..912075c42 100644 --- a/src/services/registry-service.js +++ b/src/services/registry-service.js @@ -1,6 +1,6 @@ /* * ******************************************************************************* - * * Copyright (c) 2020 Edgeworx, Inc. + * * Copyright (c) 2023 Datasance Teknoloji A.S. * * * * This program and the accompanying materials are made available under the * * terms of the Eclipse Public License v. 2.0 which is available at diff --git a/src/services/router-service.js b/src/services/router-service.js index 7614527fe..fc332bfc0 100644 --- a/src/services/router-service.js +++ b/src/services/router-service.js @@ -1,6 +1,6 @@ /* * ******************************************************************************* - * * Copyright (c) 2020 Edgeworx, Inc. + * * Copyright (c) 2023 Datasance Teknoloji A.S. * * * * This program and the accompanying materials are made available under the * * terms of the Eclipse Public License v. 2.0 which is available at diff --git a/src/services/routing-service.js b/src/services/routing-service.js index f2dde0610..96bbd69fa 100644 --- a/src/services/routing-service.js +++ b/src/services/routing-service.js @@ -1,6 +1,6 @@ /* * ******************************************************************************* - * * Copyright (c) 2020 Edgeworx, Inc. + * * Copyright (c) 2023 Datasance Teknoloji A.S. * * * * This program and the accompanying materials are made available under the * * terms of the Eclipse Public License v. 2.0 which is available at diff --git a/src/services/scheduler-access-token-service.js b/src/services/scheduler-access-token-service.js index 0dec87c4d..d40fb2f0f 100644 --- a/src/services/scheduler-access-token-service.js +++ b/src/services/scheduler-access-token-service.js @@ -1,6 +1,6 @@ /* * ******************************************************************************* - * * Copyright (c) 2020 Edgeworx, Inc. + * * Copyright (c) 2023 Datasance Teknoloji A.S. * * * * This program and the accompanying materials are made available under the * * terms of the Eclipse Public License v. 2.0 which is available at diff --git a/src/services/tunnel-service.js b/src/services/tunnel-service.js index 29ce0d6a2..680f7e5c3 100644 --- a/src/services/tunnel-service.js +++ b/src/services/tunnel-service.js @@ -1,6 +1,6 @@ /* * ******************************************************************************* - * * Copyright (c) 2020 Edgeworx, Inc. + * * Copyright (c) 2023 Datasance Teknoloji A.S. * * * * This program and the accompanying materials are made available under the * * terms of the Eclipse Public License v. 2.0 which is available at diff --git a/src/services/user-service.js b/src/services/user-service.js index 12bb45b80..777fe3324 100644 --- a/src/services/user-service.js +++ b/src/services/user-service.js @@ -1,6 +1,6 @@ /* * ******************************************************************************* - * * Copyright (c) 2020 Edgeworx, Inc. + * * Copyright (c) 2023 Datasance Teknoloji A.S. * * * * This program and the accompanying materials are made available under the * * terms of the Eclipse Public License v. 2.0 which is available at diff --git a/src/views/email-activation-temp.js b/src/views/email-activation-temp.js index 6f85c3fb4..a4538c6c7 100644 --- a/src/views/email-activation-temp.js +++ b/src/views/email-activation-temp.js @@ -1,6 +1,6 @@ /* * ******************************************************************************* - * * Copyright (c) 2020 Edgeworx, Inc. + * * Copyright (c) 2023 Datasance Teknoloji A.S. * * * * This program and the accompanying materials are made available under the * * terms of the Eclipse Public License v. 2.0 which is available at diff --git a/src/views/email-temp.js b/src/views/email-temp.js index 155cb39e9..ae0caed5b 100644 --- a/src/views/email-temp.js +++ b/src/views/email-temp.js @@ -1,6 +1,6 @@ /* * ******************************************************************************* - * * Copyright (c) 2020 Edgeworx, Inc. + * * Copyright (c) 2023 Datasance Teknoloji A.S. * * * * This program and the accompanying materials are made available under the * * terms of the Eclipse Public License v. 2.0 which is available at diff --git a/src/views/reset-password-temp.js b/src/views/reset-password-temp.js index a6f893dd9..2f3885913 100644 --- a/src/views/reset-password-temp.js +++ b/src/views/reset-password-temp.js @@ -1,6 +1,6 @@ /* * ******************************************************************************* - * * Copyright (c) 2020 Edgeworx, Inc. + * * Copyright (c) 2023 Datasance Teknoloji A.S. * * * * This program and the accompanying materials are made available under the * * terms of the Eclipse Public License v. 2.0 which is available at From c38b994e147b68cb22cb627778f8d932d0abde69 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emirhan=20Durmu=C5=9F?= Date: Fri, 22 Dec 2023 19:15:30 +0300 Subject: [PATCH 002/178] packake name --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 572c11f81..139433638 100644 --- a/package.json +++ b/package.json @@ -1,5 +1,5 @@ { - "name": "@datasance/iofogcontroller", + "name": "iofogcontroller", "version": "3.0.4", "description": "ioFog Controller project for Eclipse IoFog @ iofog.org \\nCopyright (c) 2023 Datasance Teknoloji A.S.", "main": "./src/main.js", From 4998873464b97e5774c52dc8d4c5d0342bf35837 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emirhan=20Durmu=C5=9F?= Date: Sat, 23 Dec 2023 00:59:27 +0300 Subject: [PATCH 003/178] version --- .github/workflows/ci.yaml | 8 ++-- package.json | 93 +++++++++++++++++++-------------------- 2 files changed, 49 insertions(+), 52 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 3508811cc..5b7fbbcfd 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -52,7 +52,7 @@ jobs: - uses: actions/setup-node@v3 with: node-version: 10 - - run: npm ci + - run: npm install - run: npm run standard - run: | npm i -g better-npm-audit @@ -83,7 +83,7 @@ jobs: - linux/arm/v6 - linux/arm/v7 - linux/arm64 - node: [ 16, 17, 16, 19,20 ] + node: [ 16, 17, 16, 19,20, 21 ] name: Node ${{ matrix.node }} Test steps: - uses: actions/checkout@v3 @@ -99,7 +99,7 @@ jobs: key: ${{ runner.os }}-controller-node_modules-${{ hashFiles('package-lock.json') }} restore-keys: | ${{ runner.os }}-controller-node_modules- - - run: npm ci + - run: npm install - run: npm run test -- junit - run: npm run postman_test - name: Publish Test Results @@ -147,7 +147,7 @@ jobs: run: | sed -i.back "s|PAT|${PAT}|g" ./path/to/.npmrc - - run: npm ci + - run: npm install - name: npm version id: package-version diff --git a/package.json b/package.json index 139433638..0bfde5f01 100644 --- a/package.json +++ b/package.json @@ -55,71 +55,68 @@ }, "dependencies": { "@iofog/ecn-viewer": "3.0.2", - "axios": "1.6.2", - "body-parser": "^1.20.2", + "axios": "1.0.0-alpha.1", + "body-parser": "^1.20.1", "child_process": "1.0.2", - "command-line-args": "5.2.1", - "command-line-usage": "7.0.1", + "command-line-args": "5.0.2", + "command-line-usage": "5.0.5", "concurrent-queue": "7.0.2", - "cookie-parser": "1.4.6", + "cookie-parser": "1.4.3", "cors": "2.8.5", "daemonize2": "0.4.2", - "ejs": "3.1.9", - "express": "4.18.2", - "formidable": "3.5.1", + "ejs": "3.1.7", + "express": "4.17.3", + "formidable": "1.2.1", "ftp": "0.3.10", - "helmet": "7.1.0", - "is-elevated": "4.0.0", - "js-yaml": "4.1.0", - "jsonschema": "1.4.1", - "liquidjs": "10.10.0", - "minimatch": "9.0.3", - "mongodb": "^6.3.0", + "helmet": "3.21.2", + "is-elevated": "3.0.0", + "js-yaml": "3.14.1", + "jsonschema": "1.2.5", + "minimatch": "3.1.2", "moment": "2.29.4", - "moment-timezone": "0.5.43", - "morgan": "1.10.0", + "moment-timezone": "0.5.38", + "morgan": "1.9.1", "multer": "1.4.5-lts.1", - "nconf": "0.12.1", - "nodemailer": "6.9.7", - "nodemailer-smtp-transport": "2.7.4", - "os": "0.1.2", + "nconf": "0.12.0", + "nodemailer": "6.7.3", + "nodemailer-smtp-transport": "2.4.2", + "os": "0.1.1", "path": "0.12.7", - "pino": "8.17.1", - "pino-std-serializers": "6.2.2", + "pino": "6.6.1", + "pino-std-serializers": "2.5.0", "portscanner": "2.2.0", - "qs": "6.11.2", + "qs": "6.10.3", "request": "2.88.0", "request-promise": "4.2.4", - "retry-as-promised": "7.0.4", - "semantic-release": "22.0.12", - "semver": "7.5.4", - "sequelize": "6.35.2", - "sqlite3": "^5.1.6", + "retry-as-promised": "3.1.0", + "semantic-release": "19.0.3", + "semver": "5.6.0", + "sequelize": "6.29.0", + "sqlite3": "^5.1.5", "string-format": "2.0.0", - "swagger-ui-express": "^5.0.0", - "umzug": "3.5.0", - "underscore": "1.13.6", + "swagger-ui-express": "^4.6.2", + "umzug": "2.2.0", + "underscore": "1.13.1", "xss-clean": "0.1.1" }, "devDependencies": { - "acorn": "8.11.2", - "bdd-lazy-var": "2.6.1", - "chai": "4.3.10", + "acorn": "7.1.1", + "bdd-lazy-var": "2.5.2", + "chai": "4.2.0", "chai-as-promised": "7.1.1", - "chai-http": "4.4.0", - "eslint": "8.56.0", - "eslint-config-google": "0.14.0", - "mocha": "10.2.0", - "mocha-junit-reporter": "2.2.1", - "mongodb": "^6.3.0", - "newman": "6.0.0", + "chai-http": "4.2.1", + "eslint": "5.14.1", + "eslint-config-google": "0.12.0", + "mocha": "9.2.2", + "mocha-junit-reporter": "2.0.0", + "newman": "5.3.2", "newman-reporter-junitfull": "1.1.1", - "nyc": "15.1.0", - "sequelize-cli": "6.6.2", - "sinon": "17.0.1", - "sinon-chai": "3.7.0", - "snyk": "^1.1266.0", - "standard": "17.1.0" + "nyc": "15.0.0", + "sequelize-cli": "5.5.0", + "sinon": "7.5.0", + "sinon-chai": "3.3.0", + "snyk": "^1.1064.0", + "standard": "12.0.1" }, "files": [ "/scripts", From b0b0d0e0b10c3afb26ed320d564f344c557d3d07 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emirhan=20Durmu=C5=9F?= Date: Sat, 23 Dec 2023 01:05:14 +0300 Subject: [PATCH 004/178] worfklow build image --- .github/workflows/ci.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 5b7fbbcfd..a318e20c4 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -23,7 +23,7 @@ env: jobs: Build: - runs-on: ubuntu-22.04 + runs-on: ubuntu-20.04 strategy: matrix: platform: @@ -60,7 +60,7 @@ jobs: Tests: needs: Build - runs-on: ubuntu-22.04 + runs-on: ubuntu-20.04 permissions: actions: write checks: write @@ -111,7 +111,7 @@ jobs: Publish: needs: [Build, Tests] - runs-on: ubuntu-22.04 + runs-on: ubuntu-20.04 permissions: actions: write checks: write From 79a1e068104d79d883c55de98727177f0e5f1e91 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emirhan=20Durmu=C5=9F?= Date: Sat, 23 Dec 2023 01:06:53 +0300 Subject: [PATCH 005/178] workflow node-version --- .github/workflows/ci.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index a318e20c4..625cdd9fa 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -51,7 +51,7 @@ jobs: - uses: actions/checkout@v3 - uses: actions/setup-node@v3 with: - node-version: 10 + node-version: 18 - run: npm install - run: npm run standard - run: | @@ -139,7 +139,7 @@ jobs: - uses: actions/checkout@v3 - uses: actions/setup-node@v3 with: - node-version: 20 + node-version: 18 - name: Replace values shell: bash env: From 3d859d90c5a47d80264890fc1803e7a44900de6c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emirhan=20Durmu=C5=9F?= Date: Tue, 2 Jan 2024 16:50:32 +0300 Subject: [PATCH 006/178] package versions --- .nsprc | 19 + Dockerfile.dev | 4 +- Dockerfile.rel | 4 +- package-lock.json | 19505 ++++++++++++++++++++++---------------------- 4 files changed, 9840 insertions(+), 9692 deletions(-) diff --git a/.nsprc b/.nsprc index 634f5426d..cf290f643 100644 --- a/.nsprc +++ b/.nsprc @@ -5,4 +5,23 @@ "1091725": { "notes": "" } + , + "1092972": { + "notes": "" + }, + "1094554": { + "notes": "" + }, + "1094555": { + "notes": "" + }, + "1094556": { + "notes": "" + }, + "1095102": { + "notes": "" + }, + "1095024": { + "notes": "" + } } \ No newline at end of file diff --git a/Dockerfile.dev b/Dockerfile.dev index 1c187562f..4b22594b8 100644 --- a/Dockerfile.dev +++ b/Dockerfile.dev @@ -1,4 +1,4 @@ -FROM node:iron-bookworm AS builder +FROM node:hydrogen-bookworm AS builder ARG PKG_VERSION @@ -16,7 +16,7 @@ RUN npm version $PKG_VERSION --allow-same-version --no-git-tag-version RUN npm pack -FROM node:iron-alpine3.19 +FROM node:hydrogen-alpine3.19 RUN apk add sudo logrotate g++ make diff --git a/Dockerfile.rel b/Dockerfile.rel index a5cb14585..be0bc0a7b 100644 --- a/Dockerfile.rel +++ b/Dockerfile.rel @@ -1,4 +1,4 @@ -FROM node:hydrogen-buster AS builder +FROM node:hydrogen-bookworm AS builder ARG PKG_VERSION @@ -19,7 +19,7 @@ RUN npm version $PKG_VERSION --allow-same-version RUN npm pack -FROM node:hydrogen-alpine3.17 +FROM node:hydrogen-alpine3.19 RUN apk add sudo logrotate g++ make diff --git a/package-lock.json b/package-lock.json index 2fcddbca9..980ea504b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,81 +1,110 @@ { - "name": "@iofog/iofogcontroller", - "version": "3.0.2-dev", + "name": "iofogcontroller", + "version": "3.0.4", "lockfileVersion": 3, "requires": true, "packages": { "": { - "name": "@iofog/iofogcontroller", - "version": "3.0.2-dev", + "name": "iofogcontroller", + "version": "3.0.4", "hasInstallScript": true, "license": "EPL-2.0", "dependencies": { "@iofog/ecn-viewer": "3.0.2", - "axios": "1.0.0-alpha.1", - "body-parser": "^1.20.1", + "axios": "1.6.3", + "body-parser": "^1.20.2", "child_process": "1.0.2", - "command-line-args": "5.0.2", - "command-line-usage": "5.0.5", + "command-line-args": "5.2.1", + "command-line-usage": "7.0.1", "concurrent-queue": "7.0.2", - "cookie-parser": "1.4.3", + "cookie-parser": "1.4.6", "cors": "2.8.5", "daemonize2": "0.4.2", - "ejs": "3.1.7", - "express": "4.17.3", - "formidable": "1.2.1", + "ejs": "3.1.9", + "express": "4.18.2", + "formidable": "3.5.1", "ftp": "0.3.10", - "helmet": "3.21.2", - "is-elevated": "3.0.0", - "js-yaml": "3.14.1", - "jsonschema": "1.2.5", - "minimatch": "3.1.2", - "moment": "2.29.4", - "moment-timezone": "0.5.38", - "morgan": "1.9.1", + "helmet": "7.1.0", + "is-elevated": "4.0.0", + "js-yaml": "4.1.0", + "jsonschema": "1.4.1", + "minimatch": "9.0.3", + "moment": "2.30.1", + "moment-timezone": "0.5.44", + "morgan": "1.10.0", "multer": "1.4.5-lts.1", - "nconf": "0.12.0", - "nodemailer": "6.7.3", - "nodemailer-smtp-transport": "2.4.2", - "os": "0.1.1", + "nconf": "0.12.1", + "nodemailer": "6.9.8", + "nodemailer-smtp-transport": "2.7.4", + "os": "0.1.2", "path": "0.12.7", - "pino": "6.6.1", - "pino-std-serializers": "2.5.0", + "pino": "8.17.2", + "pino-std-serializers": "6.2.2", "portscanner": "2.2.0", - "qs": "6.10.3", + "qs": "6.11.2", "request": "2.88.0", "request-promise": "4.2.4", - "retry-as-promised": "3.1.0", - "semantic-release": "19.0.3", - "semver": "5.6.0", - "sequelize": "6.29.0", - "sqlite3": "^5.1.5", + "retry-as-promised": "7.0.4", + "semantic-release": "22.0.12", + "semver": "7.5.4", + "sequelize": "6.35.2", + "sqlite3": "^5.1.6", "string-format": "2.0.0", - "swagger-ui-express": "^4.6.2", - "umzug": "2.2.0", - "underscore": "1.13.1", + "swagger-ui-express": "^5.0.0", + "umzug": "3.5.0", + "underscore": "1.13.6", "xss-clean": "0.1.1" }, "bin": { "iofog-controller": "src/main.js" }, "devDependencies": { - "acorn": "7.1.1", - "bdd-lazy-var": "2.5.2", - "chai": "4.2.0", + "acorn": "8.11.3", + "bdd-lazy-var": "2.6.1", + "chai": "4.3.10", "chai-as-promised": "7.1.1", - "chai-http": "4.2.1", - "eslint": "5.14.1", - "eslint-config-google": "0.12.0", - "mocha": "9.2.2", - "mocha-junit-reporter": "2.0.0", - "newman": "5.3.2", + "chai-http": "4.4.0", + "eslint": "8.56.0", + "eslint-config-google": "0.14.0", + "mocha": "10.2.0", + "mocha-junit-reporter": "2.2.1", + "newman": "6.1.0", "newman-reporter-junitfull": "1.1.1", - "nyc": "15.0.0", - "sequelize-cli": "5.5.0", - "sinon": "7.5.0", - "sinon-chai": "3.3.0", - "snyk": "^1.1064.0", - "standard": "12.0.1" + "nyc": "15.1.0", + "sequelize-cli": "6.6.2", + "sinon": "17.0.1", + "sinon-chai": "3.7.0", + "snyk": "^1.1266.0", + "standard": "17.1.0" + } + }, + "node_modules/@75lb/deep-merge": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@75lb/deep-merge/-/deep-merge-1.1.1.tgz", + "integrity": "sha512-xvgv6pkMGBA6GwdyJbNAnDmfAIR/DfWhrj9jgWh3TY7gRm3KO46x/GPjRg6wJ0nOepwqrNxFfojebh0Df4h4Tw==", + "dependencies": { + "lodash.assignwith": "^4.2.0", + "typical": "^7.1.1" + }, + "engines": { + "node": ">=12.17" + } + }, + "node_modules/@75lb/deep-merge/node_modules/typical": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/typical/-/typical-7.1.1.tgz", + "integrity": "sha512-T+tKVNs6Wu7IWiAce5BgMd7OZfNYUndHwc5MknN+UHOudi7sGZzuHdCadllRuqJ3fPtgFtIH9+lt9qRv6lmpfA==", + "engines": { + "node": ">=12.17" + } + }, + "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": { @@ -92,11 +121,12 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", - "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", + "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", "dependencies": { - "@babel/highlight": "^7.18.6" + "@babel/highlight": "^7.23.4", + "chalk": "^2.4.2" }, "engines": { "node": ">=6.9.0" @@ -329,9 +359,9 @@ } }, "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==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", "engines": { "node": ">=6.9.0" } @@ -360,12 +390,12 @@ } }, "node_modules/@babel/highlight": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", - "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", + "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", "dependencies": { - "@babel/helper-validator-identifier": "^7.18.6", - "chalk": "^2.0.0", + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", "js-tokens": "^4.0.0" }, "engines": { @@ -456,12 +486,213 @@ "node": ">=6.9.0" } }, + "node_modules/@colors/colors": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", + "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", + "optional": true, + "engines": { + "node": ">=0.1.90" + } + }, + "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.10.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", + "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", + "dev": true, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "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/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/@eslint/eslintrc/node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/eslintrc/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/@eslint/eslintrc/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/@eslint/eslintrc/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/@eslint/js": { + "version": "8.56.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.56.0.tgz", + "integrity": "sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@faker-js/faker": { + "version": "5.5.3", + "resolved": "https://registry.npmjs.org/@faker-js/faker/-/faker-5.5.3.tgz", + "integrity": "sha512-R11tGE6yIFwqpaIqcfkcg7AICXzFg14+5h5v0TfF/9+RMDL6jhzCy/pxHVOfbALGdtVYdt6JdR21tuxEgl34dw==", + "dev": true + }, "node_modules/@gar/promisify": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==", "optional": true }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.13", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.13.tgz", + "integrity": "sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==", + "dev": true, + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.1", + "debug": "^4.1.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/config-array/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/@humanwhocodes/config-array/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/@humanwhocodes/config-array/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/@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": "2.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz", + "integrity": "sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==", + "dev": true + }, "node_modules/@iofog/ecn-viewer": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/@iofog/ecn-viewer/-/ecn-viewer-3.0.2.tgz", @@ -483,6 +714,15 @@ "node": ">=8" } }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", @@ -496,6 +736,19 @@ "node": ">=8" } }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", @@ -544,6 +797,12 @@ "node": ">=8" } }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true + }, "node_modules/@istanbuljs/schema": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", @@ -619,17 +878,6 @@ "node-pre-gyp": "bin/node-pre-gyp" } }, - "node_modules/@mapbox/node-pre-gyp/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/@mapbox/node-pre-gyp/node_modules/nopt": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", @@ -644,39 +892,6 @@ "node": ">=6" } }, - "node_modules/@mapbox/node-pre-gyp/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/@mapbox/node-pre-gyp/node_modules/semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@mapbox/node-pre-gyp/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/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -719,39 +934,6 @@ "semver": "^7.3.5" } }, - "node_modules/@npmcli/fs/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==", - "optional": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@npmcli/fs/node_modules/semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", - "optional": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@npmcli/fs/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "optional": true - }, "node_modules/@npmcli/move-file": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.1.2.tgz", @@ -778,144 +960,131 @@ "node": ">=10" } }, - "node_modules/@npmcli/move-file/node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "optional": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/@octokit/auth-token": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-3.0.3.tgz", - "integrity": "sha512-/aFM2M4HVDBT/jjDBa84sJniv1t9Gm/rLkalaz9htOm+L+8JMj1k9w0CkUdcxNyNxZPlTxKPVko+m1VlM58ZVA==", - "dependencies": { - "@octokit/types": "^9.0.0" - }, + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-4.0.0.tgz", + "integrity": "sha512-tY/msAuJo6ARbK6SPIxZrPBms3xPbfwBrulZe0Wtr/DIY9lje2HeV1uoebShn6mx7SjCHif6EjMvoREj+gZ+SA==", "engines": { - "node": ">= 14" + "node": ">= 18" } }, "node_modules/@octokit/core": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@octokit/core/-/core-4.2.0.tgz", - "integrity": "sha512-AgvDRUg3COpR82P7PBdGZF/NNqGmtMq2NiPqeSsDIeCfYFOZ9gddqWNQHnFdEUf+YwOj4aZYmJnlPp7OXmDIDg==", - "dependencies": { - "@octokit/auth-token": "^3.0.0", - "@octokit/graphql": "^5.0.0", - "@octokit/request": "^6.0.0", - "@octokit/request-error": "^3.0.0", - "@octokit/types": "^9.0.0", + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@octokit/core/-/core-5.0.2.tgz", + "integrity": "sha512-cZUy1gUvd4vttMic7C0lwPed8IYXWYp8kHIMatyhY8t8n3Cpw2ILczkV5pGMPqef7v0bLo0pOHrEHarsau2Ydg==", + "dependencies": { + "@octokit/auth-token": "^4.0.0", + "@octokit/graphql": "^7.0.0", + "@octokit/request": "^8.0.2", + "@octokit/request-error": "^5.0.0", + "@octokit/types": "^12.0.0", "before-after-hook": "^2.2.0", "universal-user-agent": "^6.0.0" }, "engines": { - "node": ">= 14" + "node": ">= 18" } }, "node_modules/@octokit/endpoint": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-7.0.5.tgz", - "integrity": "sha512-LG4o4HMY1Xoaec87IqQ41TQ+glvIeTKqfjkCEmt5AIwDZJwQeVZFIEYXrYY6yLwK+pAScb9Gj4q+Nz2qSw1roA==", + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-9.0.4.tgz", + "integrity": "sha512-DWPLtr1Kz3tv8L0UvXTDP1fNwM0S+z6EJpRcvH66orY6Eld4XBMCSYsaWp4xIm61jTWxK68BrR7ibO+vSDnZqw==", "dependencies": { - "@octokit/types": "^9.0.0", - "is-plain-object": "^5.0.0", + "@octokit/types": "^12.0.0", "universal-user-agent": "^6.0.0" }, "engines": { - "node": ">= 14" + "node": ">= 18" } }, "node_modules/@octokit/graphql": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-5.0.5.tgz", - "integrity": "sha512-Qwfvh3xdqKtIznjX9lz2D458r7dJPP8l6r4GQkIdWQouZwHQK0mVT88uwiU2bdTU2OtT1uOlKpRciUWldpG0yQ==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-7.0.2.tgz", + "integrity": "sha512-OJ2iGMtj5Tg3s6RaXH22cJcxXRi7Y3EBqbHTBRq+PQAqfaS8f/236fUrWhfSn8P4jovyzqucxme7/vWSSZBX2Q==", "dependencies": { - "@octokit/request": "^6.0.0", - "@octokit/types": "^9.0.0", + "@octokit/request": "^8.0.1", + "@octokit/types": "^12.0.0", "universal-user-agent": "^6.0.0" }, "engines": { - "node": ">= 14" + "node": ">= 18" } }, "node_modules/@octokit/openapi-types": { - "version": "16.0.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-16.0.0.tgz", - "integrity": "sha512-JbFWOqTJVLHZSUUoF4FzAZKYtqdxWu9Z5m2QQnOyEa04fOFljvyh7D3GYKbfuaSWisqehImiVIMG4eyJeP5VEA==" + "version": "19.1.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-19.1.0.tgz", + "integrity": "sha512-6G+ywGClliGQwRsjvqVYpklIfa7oRPA0vyhPQG/1Feh+B+wU0vGH1JiJ5T25d3g1JZYBHzR2qefLi9x8Gt+cpw==" }, "node_modules/@octokit/plugin-paginate-rest": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-6.0.0.tgz", - "integrity": "sha512-Sq5VU1PfT6/JyuXPyt04KZNVsFOSBaYOAq2QRZUwzVlI10KFvcbUo8lR258AAQL1Et60b0WuVik+zOWKLuDZxw==", + "version": "9.1.5", + "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-9.1.5.tgz", + "integrity": "sha512-WKTQXxK+bu49qzwv4qKbMMRXej1DU2gq017euWyKVudA6MldaSSQuxtz+vGbhxV4CjxpUxjZu6rM2wfc1FiWVg==", "dependencies": { - "@octokit/types": "^9.0.0" + "@octokit/types": "^12.4.0" }, "engines": { - "node": ">= 14" + "node": ">= 18" }, "peerDependencies": { - "@octokit/core": ">=4" + "@octokit/core": ">=5" } }, - "node_modules/@octokit/plugin-request-log": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-1.0.4.tgz", - "integrity": "sha512-mLUsMkgP7K/cnFEw07kWqXGF5LKrOkD+lhCrKvPHXWDywAwuDUeDwWBpc69XK3pNX0uKiVt8g5z96PJ6z9xCFA==", + "node_modules/@octokit/plugin-retry": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@octokit/plugin-retry/-/plugin-retry-6.0.1.tgz", + "integrity": "sha512-SKs+Tz9oj0g4p28qkZwl/topGcb0k0qPNX/i7vBKmDsjoeqnVfFUquqrE/O9oJY7+oLzdCtkiWSXLpLjvl6uog==", + "dependencies": { + "@octokit/request-error": "^5.0.0", + "@octokit/types": "^12.0.0", + "bottleneck": "^2.15.3" + }, + "engines": { + "node": ">= 18" + }, "peerDependencies": { - "@octokit/core": ">=3" + "@octokit/core": ">=5" } }, - "node_modules/@octokit/plugin-rest-endpoint-methods": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-7.0.1.tgz", - "integrity": "sha512-pnCaLwZBudK5xCdrR823xHGNgqOzRnJ/mpC/76YPpNP7DybdsJtP7mdOwh+wYZxK5jqeQuhu59ogMI4NRlBUvA==", + "node_modules/@octokit/plugin-throttling": { + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/@octokit/plugin-throttling/-/plugin-throttling-8.1.3.tgz", + "integrity": "sha512-pfyqaqpc0EXh5Cn4HX9lWYsZ4gGbjnSmUILeu4u2gnuM50K/wIk9s1Pxt3lVeVwekmITgN/nJdoh43Ka+vye8A==", "dependencies": { - "@octokit/types": "^9.0.0", - "deprecation": "^2.3.1" + "@octokit/types": "^12.2.0", + "bottleneck": "^2.15.3" }, "engines": { - "node": ">= 14" + "node": ">= 18" }, "peerDependencies": { - "@octokit/core": ">=3" + "@octokit/core": "^5.0.0" } }, "node_modules/@octokit/request": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-6.2.3.tgz", - "integrity": "sha512-TNAodj5yNzrrZ/VxP+H5HiYaZep0H3GU0O7PaF+fhDrt8FPrnkei9Aal/txsN/1P7V3CPiThG0tIvpPDYUsyAA==", - "dependencies": { - "@octokit/endpoint": "^7.0.0", - "@octokit/request-error": "^3.0.0", - "@octokit/types": "^9.0.0", - "is-plain-object": "^5.0.0", - "node-fetch": "^2.6.7", + "version": "8.1.6", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-8.1.6.tgz", + "integrity": "sha512-YhPaGml3ncZC1NfXpP3WZ7iliL1ap6tLkAp6MvbK2fTTPytzVUyUesBBogcdMm86uRYO5rHaM1xIWxigWZ17MQ==", + "dependencies": { + "@octokit/endpoint": "^9.0.0", + "@octokit/request-error": "^5.0.0", + "@octokit/types": "^12.0.0", "universal-user-agent": "^6.0.0" }, "engines": { - "node": ">= 14" + "node": ">= 18" } }, "node_modules/@octokit/request-error": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-3.0.3.tgz", - "integrity": "sha512-crqw3V5Iy2uOU5Np+8M/YexTlT8zxCfI+qu+LxUB7SZpje4Qmx3mub5DfEKSO8Ylyk0aogi6TYdf6kxzh2BguQ==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-5.0.1.tgz", + "integrity": "sha512-X7pnyTMV7MgtGmiXBwmO6M5kIPrntOXdyKZLigNfQWSEQzVxR4a4vo49vJjTWX70mPndj8KhfT4Dx+2Ng3vnBQ==", "dependencies": { - "@octokit/types": "^9.0.0", + "@octokit/types": "^12.0.0", "deprecation": "^2.0.0", "once": "^1.4.0" }, "engines": { - "node": ">= 14" + "node": ">= 18" } }, "node_modules/@octokit/request-error/node_modules/once": { @@ -926,26 +1095,20 @@ "wrappy": "1" } }, - "node_modules/@octokit/rest": { - "version": "19.0.7", - "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-19.0.7.tgz", - "integrity": "sha512-HRtSfjrWmWVNp2uAkEpQnuGMJsu/+dBr47dRc5QVgsCbnIc1+GFEaoKBWkYG+zjrsHpSqcAElMio+n10c0b5JA==", + "node_modules/@octokit/types": { + "version": "12.4.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-12.4.0.tgz", + "integrity": "sha512-FLWs/AvZllw/AGVs+nJ+ELCDZZJk+kY0zMen118xhL2zD0s1etIUHm1odgjP7epxYU1ln7SZxEUWYop5bhsdgQ==", "dependencies": { - "@octokit/core": "^4.1.0", - "@octokit/plugin-paginate-rest": "^6.0.0", - "@octokit/plugin-request-log": "^1.0.4", - "@octokit/plugin-rest-endpoint-methods": "^7.0.0" - }, - "engines": { - "node": ">= 14" + "@octokit/openapi-types": "^19.1.0" } }, - "node_modules/@octokit/types": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-9.0.0.tgz", - "integrity": "sha512-LUewfj94xCMH2rbD5YJ+6AQ4AVjFYTgpp6rboWM5T7N3IsIF65SBEOVcYMGAEzO/kKNiNaW4LoWtoThOhH06gw==", - "dependencies": { - "@octokit/openapi-types": "^16.0.0" + "node_modules/@pnpm/config.env-replace": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@pnpm/config.env-replace/-/config.env-replace-1.1.0.tgz", + "integrity": "sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==", + "engines": { + "node": ">=12.22.0" } }, "node_modules/@pnpm/network.ca-file": { @@ -960,10 +1123,11 @@ } }, "node_modules/@pnpm/npm-conf": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@pnpm/npm-conf/-/npm-conf-1.0.5.tgz", - "integrity": "sha512-hD8ml183638O3R6/Txrh0L8VzGOrFXgRtRDG4qQC4tONdZ5Z1M+tlUUDUvrjYdmK6G+JTBTeaCLMna11cXzi8A==", + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/@pnpm/npm-conf/-/npm-conf-2.2.2.tgz", + "integrity": "sha512-UA91GwWPhFExt3IizW6bOeY/pQ0BkuNwKjk9iQW9KqxluGCrg4VenZ0/L+2Y0+ZOtme72EVvg6v0zo3AMQRCeA==", "dependencies": { + "@pnpm/config.env-replace": "^1.1.0", "@pnpm/network.ca-file": "^1.0.1", "config-chain": "^1.1.11" }, @@ -985,6 +1149,21 @@ "node": ">= 6" } }, + "node_modules/@postman/tough-cookie": { + "version": "4.1.3-postman.1", + "resolved": "https://registry.npmjs.org/@postman/tough-cookie/-/tough-cookie-4.1.3-postman.1.tgz", + "integrity": "sha512-txpgUqZOnWYnUHZpHjkfb0IwVH4qJmyq77pPnJLlfhMtdCLMFTEeQHlzQiK906aaNCe4NEB5fGJHo9uzGbFMeA==", + "dev": true, + "dependencies": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.2.0", + "url-parse": "^1.5.3" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/@postman/tunnel-agent": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/@postman/tunnel-agent/-/tunnel-agent-0.6.3.tgz", @@ -997,24 +1176,56 @@ "node": "*" } }, + "node_modules/@rushstack/ts-command-line": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/@rushstack/ts-command-line/-/ts-command-line-4.17.1.tgz", + "integrity": "sha512-2jweO1O57BYP5qdBGl6apJLB+aRIn5ccIRTPDyULh0KMwVzFqWtw6IZWt1qtUoZD/pD2RNkIOosH6Cq45rIYeg==", + "dependencies": { + "@types/argparse": "1.0.38", + "argparse": "~1.0.9", + "colors": "~1.2.1", + "string-argv": "~0.3.1" + } + }, + "node_modules/@rushstack/ts-command-line/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/@rushstack/ts-command-line/node_modules/colors": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.2.5.tgz", + "integrity": "sha512-erNRLao/Y3Fv54qUa0LBB+//Uf3YwMUmdJinN20yMXm9zdKKqH9wt7R9IIVZ+K7ShzfpLV/Zg8+VyrBJYB4lpg==", + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/@rushstack/ts-command-line/node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" + }, "node_modules/@semantic-release/commit-analyzer": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/@semantic-release/commit-analyzer/-/commit-analyzer-9.0.2.tgz", - "integrity": "sha512-E+dr6L+xIHZkX4zNMe6Rnwg4YQrWNXK+rNsvwOPpdFppvZO1olE2fIgWhv89TkQErygevbjsZFSIxp+u6w2e5g==", + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/@semantic-release/commit-analyzer/-/commit-analyzer-11.1.0.tgz", + "integrity": "sha512-cXNTbv3nXR2hlzHjAMgbuiQVtvWHTlwwISt60B+4NZv01y/QRY7p2HcJm8Eh2StzcTJoNnflvKjHH/cjFS7d5g==", "dependencies": { - "conventional-changelog-angular": "^5.0.0", - "conventional-commits-filter": "^2.0.0", - "conventional-commits-parser": "^3.2.3", + "conventional-changelog-angular": "^7.0.0", + "conventional-commits-filter": "^4.0.0", + "conventional-commits-parser": "^5.0.0", "debug": "^4.0.0", - "import-from": "^4.0.0", - "lodash": "^4.17.4", + "import-from-esm": "^1.0.3", + "lodash-es": "^4.17.21", "micromatch": "^4.0.2" }, "engines": { - "node": ">=14.17" + "node": "^18.17 || >=20.6.1" }, "peerDependencies": { - "semantic-release": ">=18.0.0-beta.1" + "semantic-release": ">=20.1.0" } }, "node_modules/@semantic-release/commit-analyzer/node_modules/debug": { @@ -1039,40 +1250,80 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "node_modules/@semantic-release/error": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@semantic-release/error/-/error-3.0.0.tgz", - "integrity": "sha512-5hiM4Un+tpl4cKw3lV4UgzJj+SmfNIDCLLw0TepzQxz9ZGV5ixnqkzIVF+3tp0ZHgcMKE+VNGHJjEeyFG2dcSw==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@semantic-release/error/-/error-4.0.0.tgz", + "integrity": "sha512-mgdxrHTLOjOddRVYIYDo0fR3/v61GNN1YGkfbrjuIKg/uMgCd+Qzo3UAXJ+woLQQpos4pl5Esuw5A7AoNlzjUQ==", "engines": { - "node": ">=14.17" + "node": ">=18" } }, "node_modules/@semantic-release/github": { - "version": "8.0.7", - "resolved": "https://registry.npmjs.org/@semantic-release/github/-/github-8.0.7.tgz", - "integrity": "sha512-VtgicRIKGvmTHwm//iqTh/5NGQwsncOMR5vQK9pMT92Aem7dv37JFKKRuulUsAnUOIlO4G8wH3gPiBAA0iW0ww==", - "dependencies": { - "@octokit/rest": "^19.0.0", - "@semantic-release/error": "^3.0.0", - "aggregate-error": "^3.0.0", - "bottleneck": "^2.18.1", - "debug": "^4.0.0", - "dir-glob": "^3.0.0", - "fs-extra": "^11.0.0", - "globby": "^11.0.0", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.0", + "version": "9.2.6", + "resolved": "https://registry.npmjs.org/@semantic-release/github/-/github-9.2.6.tgz", + "integrity": "sha512-shi+Lrf6exeNZF+sBhK+P011LSbhmIAoUEgEY6SsxF8irJ+J2stwI5jkyDQ+4gzYyDImzV6LCKdYB9FXnQRWKA==", + "dependencies": { + "@octokit/core": "^5.0.0", + "@octokit/plugin-paginate-rest": "^9.0.0", + "@octokit/plugin-retry": "^6.0.0", + "@octokit/plugin-throttling": "^8.0.0", + "@semantic-release/error": "^4.0.0", + "aggregate-error": "^5.0.0", + "debug": "^4.3.4", + "dir-glob": "^3.0.1", + "globby": "^14.0.0", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.0", "issue-parser": "^6.0.0", - "lodash": "^4.17.4", - "mime": "^3.0.0", - "p-filter": "^2.0.0", - "p-retry": "^4.0.0", - "url-join": "^4.0.0" + "lodash-es": "^4.17.21", + "mime": "^4.0.0", + "p-filter": "^4.0.0", + "url-join": "^5.0.0" }, "engines": { - "node": ">=14.17" + "node": ">=18" }, "peerDependencies": { - "semantic-release": ">=18.0.0-beta.1" + "semantic-release": ">=20.1.0" + } + }, + "node_modules/@semantic-release/github/node_modules/agent-base": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.0.tgz", + "integrity": "sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==", + "dependencies": { + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/@semantic-release/github/node_modules/aggregate-error": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-5.0.0.tgz", + "integrity": "sha512-gOsf2YwSlleG6IjRYG2A7k0HmBMEo6qVNk9Bp/EaLgAJT5ngH6PXbqa4ItvnEwCm/velL5jAnQgsHsWnjhGmvw==", + "dependencies": { + "clean-stack": "^5.2.0", + "indent-string": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@semantic-release/github/node_modules/clean-stack": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-5.2.0.tgz", + "integrity": "sha512-TyUIUJgdFnCISzG5zu3291TAsE77ddchd0bepon1VVQrKLGKFED4iXFEDQ24mIPdPBbyE16PK3F8MYE1CmcBEQ==", + "dependencies": { + "escape-string-regexp": "5.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/@semantic-release/github/node_modules/debug": { @@ -1091,3260 +1342,3019 @@ } } }, + "node_modules/@semantic-release/github/node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@semantic-release/github/node_modules/https-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.2.tgz", + "integrity": "sha512-NmLNjm6ucYwtcUmL7JQC1ZQ57LmHP4lT15FQ8D61nak1rO6DH+fz5qNK2Ap5UN4ZapYICE3/0KodcLYSPsPbaA==", + "dependencies": { + "agent-base": "^7.0.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/@semantic-release/github/node_modules/indent-string": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", + "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/@semantic-release/github/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/@semantic-release/npm": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/@semantic-release/npm/-/npm-9.0.2.tgz", - "integrity": "sha512-zgsynF6McdzxPnFet+a4iO9HpAlARXOM5adz7VGVCvj0ne8wtL2ZOQoDV2wZPDmdEotDIbVeJjafhelZjs9j6g==", + "version": "11.0.2", + "resolved": "https://registry.npmjs.org/@semantic-release/npm/-/npm-11.0.2.tgz", + "integrity": "sha512-owtf3RjyPvRE63iUKZ5/xO4uqjRpVQDUB9+nnXj0xwfIeM9pRl+cG+zGDzdftR4m3f2s4Wyf3SexW+kF5DFtWA==", "dependencies": { - "@semantic-release/error": "^3.0.0", - "aggregate-error": "^3.0.0", - "execa": "^5.0.0", + "@semantic-release/error": "^4.0.0", + "aggregate-error": "^5.0.0", + "execa": "^8.0.0", "fs-extra": "^11.0.0", - "lodash": "^4.17.15", + "lodash-es": "^4.17.21", "nerf-dart": "^1.0.0", - "normalize-url": "^6.0.0", - "npm": "^8.3.0", + "normalize-url": "^8.0.0", + "npm": "^10.0.0", "rc": "^1.2.8", - "read-pkg": "^5.0.0", + "read-pkg": "^9.0.0", "registry-auth-token": "^5.0.0", "semver": "^7.1.2", - "tempy": "^1.0.0" + "tempy": "^3.0.0" }, "engines": { - "node": ">=16 || ^14.17" + "node": "^18.17 || >=20" }, "peerDependencies": { - "semantic-release": ">=19.0.0" + "semantic-release": ">=20.1.0" } }, - "node_modules/@semantic-release/npm/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==", + "node_modules/@semantic-release/npm/node_modules/aggregate-error": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-5.0.0.tgz", + "integrity": "sha512-gOsf2YwSlleG6IjRYG2A7k0HmBMEo6qVNk9Bp/EaLgAJT5ngH6PXbqa4ItvnEwCm/velL5jAnQgsHsWnjhGmvw==", "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" + "clean-stack": "^5.2.0", + "indent-string": "^5.0.0" }, "engines": { - "node": ">= 8" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@semantic-release/npm/node_modules/clean-stack": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-5.2.0.tgz", + "integrity": "sha512-TyUIUJgdFnCISzG5zu3291TAsE77ddchd0bepon1VVQrKLGKFED4iXFEDQ24mIPdPBbyE16PK3F8MYE1CmcBEQ==", + "dependencies": { + "escape-string-regexp": "5.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@semantic-release/npm/node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/@semantic-release/npm/node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", + "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", "dependencies": { "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", + "get-stream": "^8.0.1", + "human-signals": "^5.0.0", + "is-stream": "^3.0.0", "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^4.1.0", + "strip-final-newline": "^3.0.0" }, "engines": { - "node": ">=10" + "node": ">=16.17" }, "funding": { "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, "node_modules/@semantic-release/npm/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==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", + "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", "engines": { - "node": ">=10" + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@semantic-release/npm/node_modules/human-signals": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", + "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", + "engines": { + "node": ">=16.17.0" + } + }, + "node_modules/@semantic-release/npm/node_modules/indent-string": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", + "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", + "engines": { + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/@semantic-release/npm/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==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", "engines": { - "node": ">=8" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@semantic-release/npm/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==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@semantic-release/npm/node_modules/npm-run-path": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.2.0.tgz", + "integrity": "sha512-W4/tgAXFqFA0iL7fk0+uQ3g7wkL8xJmx3XdK0VGb4cHW//eZTtKGvFBBoRKVTpY7n6ze4NL9ly7rgXcHufqXKg==", + "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/@semantic-release/npm/node_modules/lru-cache": { + "node_modules/@semantic-release/npm/node_modules/onetime": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", "dependencies": { - "yallist": "^4.0.0" + "mimic-fn": "^4.0.0" }, "engines": { - "node": ">=10" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@semantic-release/npm/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==", + "node_modules/@semantic-release/npm/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==", "engines": { - "node": ">=6" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@semantic-release/npm/node_modules/npm": { - "version": "8.19.4", - "resolved": "https://registry.npmjs.org/npm/-/npm-8.19.4.tgz", - "integrity": "sha512-3HANl8i9DKnUA89P4KEgVNN28EjSeDCmvEqbzOAuxCFDzdBZzjUl99zgnGpOUumvW5lvJo2HKcjrsc+tfyv1Hw==", - "bundleDependencies": [ - "@isaacs/string-locale-compare", - "@npmcli/arborist", - "@npmcli/ci-detect", - "@npmcli/config", - "@npmcli/fs", - "@npmcli/map-workspaces", - "@npmcli/package-json", - "@npmcli/run-script", - "abbrev", - "archy", - "cacache", - "chalk", - "chownr", - "cli-columns", - "cli-table3", - "columnify", - "fastest-levenshtein", - "fs-minipass", - "glob", - "graceful-fs", - "hosted-git-info", - "ini", - "init-package-json", - "is-cidr", - "json-parse-even-better-errors", - "libnpmaccess", - "libnpmdiff", - "libnpmexec", - "libnpmfund", - "libnpmhook", - "libnpmorg", - "libnpmpack", - "libnpmpublish", - "libnpmsearch", - "libnpmteam", - "libnpmversion", - "make-fetch-happen", - "minimatch", - "minipass", - "minipass-pipeline", - "mkdirp", - "mkdirp-infer-owner", - "ms", - "node-gyp", - "nopt", - "npm-audit-report", - "npm-install-checks", - "npm-package-arg", - "npm-pick-manifest", - "npm-profile", - "npm-registry-fetch", - "npm-user-validate", - "npmlog", - "opener", - "p-map", - "pacote", - "parse-conflict-json", - "proc-log", - "qrcode-terminal", - "read", - "read-package-json", - "read-package-json-fast", - "readdir-scoped-modules", - "rimraf", - "semver", - "ssri", - "tar", - "text-table", - "tiny-relative-date", - "treeverse", - "validate-npm-package-name", - "which", - "write-file-atomic" - ], - "dependencies": { - "@isaacs/string-locale-compare": "^1.1.0", - "@npmcli/arborist": "^5.6.3", - "@npmcli/ci-detect": "^2.0.0", - "@npmcli/config": "^4.2.1", - "@npmcli/fs": "^2.1.0", - "@npmcli/map-workspaces": "^2.0.3", - "@npmcli/package-json": "^2.0.0", - "@npmcli/run-script": "^4.2.1", - "abbrev": "~1.1.1", - "archy": "~1.0.0", - "cacache": "^16.1.3", - "chalk": "^4.1.2", - "chownr": "^2.0.0", - "cli-columns": "^4.0.0", - "cli-table3": "^0.6.2", - "columnify": "^1.6.0", - "fastest-levenshtein": "^1.0.12", - "fs-minipass": "^2.1.0", - "glob": "^8.0.1", - "graceful-fs": "^4.2.10", - "hosted-git-info": "^5.2.1", - "ini": "^3.0.1", - "init-package-json": "^3.0.2", - "is-cidr": "^4.0.2", - "json-parse-even-better-errors": "^2.3.1", - "libnpmaccess": "^6.0.4", - "libnpmdiff": "^4.0.5", - "libnpmexec": "^4.0.14", - "libnpmfund": "^3.0.5", - "libnpmhook": "^8.0.4", - "libnpmorg": "^4.0.4", - "libnpmpack": "^4.1.3", - "libnpmpublish": "^6.0.5", - "libnpmsearch": "^5.0.4", - "libnpmteam": "^4.0.4", - "libnpmversion": "^3.0.7", - "make-fetch-happen": "^10.2.0", - "minimatch": "^5.1.0", - "minipass": "^3.1.6", - "minipass-pipeline": "^1.2.4", - "mkdirp": "^1.0.4", - "mkdirp-infer-owner": "^2.0.0", - "ms": "^2.1.2", - "node-gyp": "^9.1.0", - "nopt": "^6.0.0", - "npm-audit-report": "^3.0.0", - "npm-install-checks": "^5.0.0", - "npm-package-arg": "^9.1.0", - "npm-pick-manifest": "^7.0.2", - "npm-profile": "^6.2.0", - "npm-registry-fetch": "^13.3.1", - "npm-user-validate": "^1.0.1", - "npmlog": "^6.0.2", - "opener": "^1.5.2", - "p-map": "^4.0.0", - "pacote": "^13.6.2", - "parse-conflict-json": "^2.0.2", - "proc-log": "^2.0.1", - "qrcode-terminal": "^0.12.0", - "read": "~1.0.7", - "read-package-json": "^5.0.2", - "read-package-json-fast": "^2.0.3", - "readdir-scoped-modules": "^1.1.0", - "rimraf": "^3.0.2", - "semver": "^7.3.7", - "ssri": "^9.0.1", - "tar": "^6.1.11", - "text-table": "~0.2.0", - "tiny-relative-date": "^1.3.0", - "treeverse": "^2.0.0", - "validate-npm-package-name": "^4.0.0", - "which": "^2.0.2", - "write-file-atomic": "^4.0.1" - }, - "bin": { - "npm": "bin/npm-cli.js", - "npx": "bin/npx-cli.js" - }, + "node_modules/@semantic-release/npm/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/@semantic-release/npm/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==", - "dependencies": { - "path-key": "^3.0.0" + "node": ">=14" }, - "engines": { - "node": ">=8" + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/@colors/colors": { - "version": "1.5.0", - "inBundle": true, - "license": "MIT", - "optional": true, + "node_modules/@semantic-release/npm/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==", "engines": { - "node": ">=0.1.90" - } - }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/@gar/promisify": { - "version": "1.1.3", - "inBundle": true, - "license": "MIT" - }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/@isaacs/string-locale-compare": { - "version": "1.1.0", - "inBundle": true, - "license": "ISC" - }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/@npmcli/arborist": { - "version": "5.6.3", - "inBundle": true, - "license": "ISC", - "dependencies": { - "@isaacs/string-locale-compare": "^1.1.0", - "@npmcli/installed-package-contents": "^1.0.7", - "@npmcli/map-workspaces": "^2.0.3", - "@npmcli/metavuln-calculator": "^3.0.1", - "@npmcli/move-file": "^2.0.0", - "@npmcli/name-from-folder": "^1.0.1", - "@npmcli/node-gyp": "^2.0.0", - "@npmcli/package-json": "^2.0.0", - "@npmcli/query": "^1.2.0", - "@npmcli/run-script": "^4.1.3", - "bin-links": "^3.0.3", - "cacache": "^16.1.3", - "common-ancestor-path": "^1.0.1", - "hosted-git-info": "^5.2.1", - "json-parse-even-better-errors": "^2.3.1", - "json-stringify-nice": "^1.1.4", - "minimatch": "^5.1.0", - "mkdirp": "^1.0.4", - "mkdirp-infer-owner": "^2.0.0", - "nopt": "^6.0.0", - "npm-install-checks": "^5.0.0", - "npm-package-arg": "^9.0.0", - "npm-pick-manifest": "^7.0.2", - "npm-registry-fetch": "^13.0.0", - "npmlog": "^6.0.2", - "pacote": "^13.6.1", - "parse-conflict-json": "^2.0.1", - "proc-log": "^2.0.0", - "promise-all-reject-late": "^1.0.0", - "promise-call-limit": "^1.0.1", - "read-package-json-fast": "^2.0.2", - "readdir-scoped-modules": "^1.1.0", - "rimraf": "^3.0.2", - "semver": "^7.3.7", - "ssri": "^9.0.0", - "treeverse": "^2.0.0", - "walk-up-path": "^1.0.0" - }, - "bin": { - "arborist": "bin/index.js" + "node": ">=12" }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/@npmcli/ci-detect": { - "version": "2.0.0", - "inBundle": true, - "license": "ISC", + "node_modules/@semantic-release/release-notes-generator": { + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/@semantic-release/release-notes-generator/-/release-notes-generator-12.1.0.tgz", + "integrity": "sha512-g6M9AjUKAZUZnxaJZnouNBeDNTCUrJ5Ltj+VJ60gJeDaRRahcHsry9HW8yKrnKkKNkx5lbWiEP1FPMqVNQz8Kg==", + "dependencies": { + "conventional-changelog-angular": "^7.0.0", + "conventional-changelog-writer": "^7.0.0", + "conventional-commits-filter": "^4.0.0", + "conventional-commits-parser": "^5.0.0", + "debug": "^4.0.0", + "get-stream": "^7.0.0", + "import-from-esm": "^1.0.3", + "into-stream": "^7.0.0", + "lodash-es": "^4.17.21", + "read-pkg-up": "^11.0.0" + }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16" + "node": "^18.17 || >=20.6.1" + }, + "peerDependencies": { + "semantic-release": ">=20.1.0" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/@npmcli/config": { - "version": "4.2.2", - "inBundle": true, - "license": "ISC", + "node_modules/@semantic-release/release-notes-generator/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dependencies": { - "@npmcli/map-workspaces": "^2.0.2", - "ini": "^3.0.0", - "mkdirp-infer-owner": "^2.0.0", - "nopt": "^6.0.0", - "proc-log": "^2.0.0", - "read-package-json-fast": "^2.0.3", - "semver": "^7.3.5", - "walk-up-path": "^1.0.0" + "ms": "2.1.2" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/@npmcli/disparity-colors": { - "version": "2.0.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "ansi-styles": "^4.3.0" - }, + "node_modules/@semantic-release/release-notes-generator/node_modules/get-stream": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-7.0.1.tgz", + "integrity": "sha512-3M8C1EOFN6r8AMUhwUAACIoXZJEOufDU5+0gFFN5uNs6XYOralD2Pqkl7m046va6x77FwposWXbAhPPIOus7mQ==", "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/@npmcli/fs": { + "node_modules/@semantic-release/release-notes-generator/node_modules/ms": { "version": "2.1.2", - "inBundle": true, - "license": "ISC", - "dependencies": { - "@gar/promisify": "^1.1.3", - "semver": "^7.3.5" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/@npmcli/git": { - "version": "3.0.2", - "inBundle": true, - "license": "ISC", + "node_modules/@sentry-internal/tracing": { + "version": "7.91.0", + "resolved": "https://registry.npmjs.org/@sentry-internal/tracing/-/tracing-7.91.0.tgz", + "integrity": "sha512-JH5y6gs6BS0its7WF2DhySu7nkhPDfZcdpAXldxzIlJpqFkuwQKLU5nkYJpiIyZz1NHYYtW5aum2bV2oCOdDRA==", + "dev": true, "dependencies": { - "@npmcli/promise-spawn": "^3.0.0", - "lru-cache": "^7.4.4", - "mkdirp": "^1.0.4", - "npm-pick-manifest": "^7.0.0", - "proc-log": "^2.0.0", - "promise-inflight": "^1.0.1", - "promise-retry": "^2.0.1", - "semver": "^7.3.5", - "which": "^2.0.2" + "@sentry/core": "7.91.0", + "@sentry/types": "7.91.0", + "@sentry/utils": "7.91.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=8" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/@npmcli/installed-package-contents": { - "version": "1.0.7", - "inBundle": true, - "license": "ISC", + "node_modules/@sentry/core": { + "version": "7.91.0", + "resolved": "https://registry.npmjs.org/@sentry/core/-/core-7.91.0.tgz", + "integrity": "sha512-tu+gYq4JrTdrR+YSh5IVHF0fJi/Pi9y0HZ5H9HnYy+UMcXIotxf6hIEaC6ZKGeLWkGXffz2gKpQLe/g6vy/lPA==", + "dev": true, "dependencies": { - "npm-bundled": "^1.1.1", - "npm-normalize-package-bin": "^1.0.1" - }, - "bin": { - "installed-package-contents": "index.js" + "@sentry/types": "7.91.0", + "@sentry/utils": "7.91.0" }, "engines": { - "node": ">= 10" - } - }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/@npmcli/installed-package-contents/node_modules/npm-bundled": { - "version": "1.1.2", - "inBundle": true, - "license": "ISC", - "dependencies": { - "npm-normalize-package-bin": "^1.0.1" + "node": ">=8" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/@npmcli/map-workspaces": { - "version": "2.0.4", - "inBundle": true, - "license": "ISC", + "node_modules/@sentry/node": { + "version": "7.91.0", + "resolved": "https://registry.npmjs.org/@sentry/node/-/node-7.91.0.tgz", + "integrity": "sha512-hTIfSQxD7L+AKIqyjoq8CWBRkEQrrMZmA3GSZgPI5JFWBHgO0HBo5TH/8TU81oEJh6kqqHAl2ObMhmcnaFqlzg==", + "dev": true, "dependencies": { - "@npmcli/name-from-folder": "^1.0.1", - "glob": "^8.0.1", - "minimatch": "^5.0.1", - "read-package-json-fast": "^2.0.3" + "@sentry-internal/tracing": "7.91.0", + "@sentry/core": "7.91.0", + "@sentry/types": "7.91.0", + "@sentry/utils": "7.91.0", + "https-proxy-agent": "^5.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=8" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/@npmcli/metavuln-calculator": { - "version": "3.1.1", - "inBundle": true, - "license": "ISC", - "dependencies": { - "cacache": "^16.0.0", - "json-parse-even-better-errors": "^2.3.1", - "pacote": "^13.0.3", - "semver": "^7.3.5" - }, + "node_modules/@sentry/types": { + "version": "7.91.0", + "resolved": "https://registry.npmjs.org/@sentry/types/-/types-7.91.0.tgz", + "integrity": "sha512-bcQnb7J3P3equbCUc+sPuHog2Y47yGD2sCkzmnZBjvBT0Z1B4f36fI/5WjyZhTjLSiOdg3F2otwvikbMjmBDew==", + "dev": true, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=8" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/@npmcli/move-file": { - "version": "2.0.1", - "inBundle": true, - "license": "MIT", + "node_modules/@sentry/utils": { + "version": "7.91.0", + "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-7.91.0.tgz", + "integrity": "sha512-fvxjrEbk6T6Otu++Ax9ntlQ0sGRiwSC179w68aC3u26Wr30FAIRKqHTCCdc2jyWk7Gd9uWRT/cq+g8NG/8BfSg==", + "dev": true, "dependencies": { - "mkdirp": "^1.0.4", - "rimraf": "^3.0.2" + "@sentry/types": "7.91.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=8" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/@npmcli/name-from-folder": { - "version": "1.0.1", - "inBundle": true, - "license": "ISC" - }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/@npmcli/node-gyp": { - "version": "2.0.0", - "inBundle": true, - "license": "ISC", + "node_modules/@sindresorhus/is": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", + "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/@npmcli/package-json": { - "version": "2.0.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "json-parse-even-better-errors": "^2.3.1" - }, + "node_modules/@sindresorhus/merge-streams": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-1.0.0.tgz", + "integrity": "sha512-rUV5WyJrJLoloD4NDN1V1+LDMDWOa4OTsT4yYJwQNpTU6FWxkxHpL7eu4w+DmiH8x/EAM1otkPE1+LaspIbplw==", "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/@npmcli/promise-spawn": { + "node_modules/@sinonjs/commons": { "version": "3.0.0", - "inBundle": true, - "license": "ISC", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.0.tgz", + "integrity": "sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA==", + "dev": true, "dependencies": { - "infer-owner": "^1.0.4" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "type-detect": "4.0.8" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/@npmcli/query": { - "version": "1.2.0", - "inBundle": true, - "license": "ISC", + "node_modules/@sinonjs/fake-timers": { + "version": "11.2.2", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-11.2.2.tgz", + "integrity": "sha512-G2piCSxQ7oWOxwGSAyFHfPIsyeJGXYtc6mFbnFA+kRXkiEnTl8c/8jul2S329iFBnDI9HGoeWWAZvuvOkZccgw==", + "dev": true, "dependencies": { - "npm-package-arg": "^9.1.0", - "postcss-selector-parser": "^6.0.10", - "semver": "^7.3.7" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "@sinonjs/commons": "^3.0.0" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/@npmcli/run-script": { - "version": "4.2.1", - "inBundle": true, - "license": "ISC", + "node_modules/@sinonjs/samsam": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-8.0.0.tgz", + "integrity": "sha512-Bp8KUVlLp8ibJZrnvq2foVhP0IVX2CIprMJPK0vqGqgrDa0OHVKeZyBykqskkrdxV6yKBPmGasO8LVjAKR3Gew==", + "dev": true, "dependencies": { - "@npmcli/node-gyp": "^2.0.0", - "@npmcli/promise-spawn": "^3.0.0", - "node-gyp": "^9.0.0", - "read-package-json-fast": "^2.0.3", - "which": "^2.0.2" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "@sinonjs/commons": "^2.0.0", + "lodash.get": "^4.4.2", + "type-detect": "^4.0.8" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/@tootallnate/once": { + "node_modules/@sinonjs/samsam/node_modules/@sinonjs/commons": { "version": "2.0.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 10" + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-2.0.0.tgz", + "integrity": "sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==", + "dev": true, + "dependencies": { + "type-detect": "4.0.8" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/abbrev": { - "version": "1.1.1", - "inBundle": true, - "license": "ISC" + "node_modules/@sinonjs/text-encoding": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.2.tgz", + "integrity": "sha512-sXXKG+uL9IrKqViTtao2Ws6dy0znu9sOaP1di/jKGW1M6VssO8vlpXCQcpZ+jisQ1tTFAC5Jo/EOzFbggBagFQ==", + "dev": true }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/agent-base": { - "version": "6.0.2", - "inBundle": true, - "license": "MIT", - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } + "node_modules/@types/argparse": { + "version": "1.0.38", + "resolved": "https://registry.npmjs.org/@types/argparse/-/argparse-1.0.38.tgz", + "integrity": "sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA==" }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/agentkeepalive": { - "version": "4.2.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "debug": "^4.1.0", - "depd": "^1.1.2", - "humanize-ms": "^1.2.1" - }, - "engines": { - "node": ">= 8.0.0" - } + "node_modules/@types/chai": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.4.tgz", + "integrity": "sha512-KnRanxnpfpjUTqTCXslZSEdLfXExwgNxYPdiO2WGUj8+HDjFi8R3k5RVKPeSCzLjCcshCAtVO2QBbVuAV4kTnw==", + "dev": true }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/aggregate-error": { - "version": "3.1.0", - "inBundle": true, - "license": "MIT", + "node_modules/@types/cookiejar": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@types/cookiejar/-/cookiejar-2.1.5.tgz", + "integrity": "sha512-he+DHOWReW0nghN24E1WUqM0efK4kI9oTqDm6XmK8ZPe2djZ90BSNdGnIyCLzCPw7/pogPlGbzI2wHGGmi4O/Q==", + "dev": true + }, + "node_modules/@types/debug": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", + "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", "dependencies": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - }, - "engines": { - "node": ">=8" + "@types/ms": "*" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/ansi-regex": { - "version": "5.0.1", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=8" - } + "node_modules/@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", + "dev": true }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/ansi-styles": { - "version": "4.3.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } + "node_modules/@types/ms": { + "version": "0.7.34", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz", + "integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==" }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/aproba": { - "version": "2.0.0", - "inBundle": true, - "license": "ISC" + "node_modules/@types/node": { + "version": "18.14.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.14.2.tgz", + "integrity": "sha512-1uEQxww3DaghA0RxqHx0O0ppVlo43pJhepY51OxuQIKHpjbnYLA7vcdwioNPzIqmC2u3I/dmylcqjlh0e7AyUA==" }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/archy": { - "version": "1.0.0", - "inBundle": true, - "license": "MIT" + "node_modules/@types/normalize-package-data": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz", + "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==" }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/are-we-there-yet": { - "version": "3.0.1", - "inBundle": true, - "license": "ISC", + "node_modules/@types/superagent": { + "version": "4.1.13", + "resolved": "https://registry.npmjs.org/@types/superagent/-/superagent-4.1.13.tgz", + "integrity": "sha512-YIGelp3ZyMiH0/A09PMAORO0EBGlF5xIKfDpK74wdYvWUs2o96b5CItJcWPdH409b7SAXIIG6p8NdU/4U2Maww==", + "dev": true, "dependencies": { - "delegates": "^1.0.0", - "readable-stream": "^3.6.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "@types/cookiejar": "*", + "@types/node": "*" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/asap": { - "version": "2.0.6", - "inBundle": true, - "license": "MIT" + "node_modules/@types/validator": { + "version": "13.11.7", + "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.11.7.tgz", + "integrity": "sha512-q0JomTsJ2I5Mv7dhHhQLGjMvX0JJm5dyZ1DXQySIUzU1UlwzB8bt+R6+LODUbz0UDIOvEzGc28tk27gBJw2N8Q==" }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/balanced-match": { - "version": "1.0.2", - "inBundle": true, - "license": "MIT" + "node_modules/@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", + "dev": true }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/bin-links": { - "version": "3.0.3", - "inBundle": true, - "license": "ISC", + "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/abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", "dependencies": { - "cmd-shim": "^5.0.0", - "mkdirp-infer-owner": "^2.0.0", - "npm-normalize-package-bin": "^2.0.0", - "read-cmd-shim": "^3.0.0", - "rimraf": "^3.0.0", - "write-file-atomic": "^4.0.0" + "event-target-shim": "^5.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=6.5" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/bin-links/node_modules/npm-normalize-package-bin": { - "version": "2.0.0", - "inBundle": true, - "license": "ISC", + "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": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">= 0.6" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/binary-extensions": { - "version": "2.2.0", - "inBundle": true, - "license": "MIT", + "node_modules/acorn": { + "version": "8.11.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", + "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, "engines": { - "node": ">=8" + "node": ">=0.4.0" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/brace-expansion": { - "version": "2.0.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.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/@semantic-release/npm/node_modules/npm/node_modules/builtins": { - "version": "5.0.1", - "inBundle": true, - "license": "MIT", + "node_modules/afterward": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/afterward/-/afterward-2.0.0.tgz", + "integrity": "sha512-7n9Vkbb8cmMRKKSfe5qgyqX4Yjdaty0QP/+GXYawZK8Vcq+8E5FCmbWbwfCoiBnDoAY/edKLNg2TwgGcwdA+3Q==", "dependencies": { - "semver": "^7.0.0" + "define-error": "~1.0.0" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/cacache": { - "version": "16.1.3", - "inBundle": true, - "license": "ISC", + "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": { - "@npmcli/fs": "^2.1.0", - "@npmcli/move-file": "^2.0.0", - "chownr": "^2.0.0", - "fs-minipass": "^2.1.0", - "glob": "^8.0.1", - "infer-owner": "^1.0.4", - "lru-cache": "^7.7.1", - "minipass": "^3.1.6", - "minipass-collect": "^1.0.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "mkdirp": "^1.0.4", - "p-map": "^4.0.0", - "promise-inflight": "^1.0.1", - "rimraf": "^3.0.2", - "ssri": "^9.0.0", - "tar": "^6.1.11", - "unique-filename": "^2.0.0" + "debug": "4" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">= 6.0.0" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/chalk": { - "version": "4.1.2", - "inBundle": true, - "license": "MIT", + "node_modules/agent-base/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "ms": "2.1.2" }, "engines": { - "node": ">=10" + "node": ">=6.0" }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/chownr": { - "version": "2.0.0", - "inBundle": true, - "license": "ISC", - "engines": { - "node": ">=10" - } + "node_modules/agent-base/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/@semantic-release/npm/node_modules/npm/node_modules/cidr-regex": { - "version": "3.1.1", - "inBundle": true, - "license": "BSD-2-Clause", + "node_modules/agentkeepalive": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.2.1.tgz", + "integrity": "sha512-Zn4cw2NEqd+9fiSVWMscnjyQ1a8Yfoc5oBajLeo5w+YBHgDUcEBY2hS4YpTz6iN5f/2zQiktcuM6tS8x1p9dpA==", + "optional": true, "dependencies": { - "ip-regex": "^4.1.0" + "debug": "^4.1.0", + "depd": "^1.1.2", + "humanize-ms": "^1.2.1" }, "engines": { - "node": ">=10" - } - }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/clean-stack": { - "version": "2.2.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=6" + "node": ">= 8.0.0" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/cli-columns": { - "version": "4.0.0", - "inBundle": true, - "license": "MIT", + "node_modules/agentkeepalive/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "optional": true, "dependencies": { - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1" + "ms": "2.1.2" }, "engines": { - "node": ">= 10" + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/cli-table3": { - "version": "0.6.2", - "inBundle": true, - "license": "MIT", - "dependencies": { - "string-width": "^4.2.0" - }, + "node_modules/agentkeepalive/node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "optional": true, "engines": { - "node": "10.* || >= 12.*" - }, - "optionalDependencies": { - "@colors/colors": "1.5.0" + "node": ">= 0.6" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/clone": { - "version": "1.0.4", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=0.8" - } + "node_modules/agentkeepalive/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==", + "optional": true }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/cmd-shim": { - "version": "5.0.0", - "inBundle": true, - "license": "ISC", + "node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "devOptional": true, "dependencies": { - "mkdirp-infer-owner": "^2.0.0" + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=8" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/color-convert": { - "version": "2.0.1", - "inBundle": true, - "license": "MIT", + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dependencies": { - "color-name": "~1.1.4" + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" }, - "engines": { - "node": ">=7.0.0" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/color-name": { - "version": "1.1.4", - "inBundle": true, - "license": "MIT" - }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/color-support": { - "version": "1.1.3", - "inBundle": true, - "license": "ISC", - "bin": { - "color-support": "bin.js" + "node_modules/ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "dev": true, + "engines": { + "node": ">=6" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/columnify": { - "version": "1.6.0", - "inBundle": true, - "license": "MIT", + "node_modules/ansi-escapes": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-6.2.0.tgz", + "integrity": "sha512-kzRaCqXnpzWs+3z5ABPQiVke+iq0KXkHo8xiWV4RPTi5Yli0l97BEQuhXV1s7+aSU/fu1kUuxgS4MsQ0fRuygw==", "dependencies": { - "strip-ansi": "^6.0.1", - "wcwidth": "^1.0.0" + "type-fest": "^3.0.0" }, "engines": { - "node": ">=8.0.0" + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/common-ancestor-path": { - "version": "1.0.1", - "inBundle": true, - "license": "ISC" - }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/concat-map": { - "version": "0.0.1", - "inBundle": true, - "license": "MIT" + "node_modules/ansi-escapes/node_modules/type-fest": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-3.13.1.tgz", + "integrity": "sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/console-control-strings": { - "version": "1.1.0", - "inBundle": true, - "license": "ISC" + "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/@semantic-release/npm/node_modules/npm/node_modules/cssesc": { - "version": "3.0.0", - "inBundle": true, - "license": "MIT", - "bin": { - "cssesc": "bin/cssesc" + "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/@semantic-release/npm/node_modules/npm/node_modules/debug": { - "version": "4.3.4", - "inBundle": true, - "license": "MIT", + "node_modules/ansicolors": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/ansicolors/-/ansicolors-0.3.2.tgz", + "integrity": "sha512-QXu7BPrP29VllRxH8GwB7x5iX5qWKAAMLqKQGWTeLWVlNHNOpVMJ91dsxQAIWXpjuW5wqvxu3Jd/nRjrJ+0pqg==" + }, + "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": { - "ms": "2.1.2" + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" }, "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "node": ">= 8" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/debug/node_modules/ms": { - "version": "2.1.2", - "inBundle": true, - "license": "MIT" + "node_modules/append-field": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/append-field/-/append-field-1.0.0.tgz", + "integrity": "sha512-klpgFSWLW1ZEs8svjfb7g4qWY0YS5imI82dTg+QahUvJ8YqAY0P10Uk8tTyh9ZGuYEZEMaeJYCF5BFuX552hsw==" }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/debuglog": { - "version": "1.0.1", - "inBundle": true, - "license": "MIT", + "node_modules/append-transform": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-2.0.0.tgz", + "integrity": "sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==", + "dev": true, + "dependencies": { + "default-require-extensions": "^3.0.0" + }, "engines": { - "node": "*" + "node": ">=8" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/defaults": { - "version": "1.0.3", - "inBundle": true, - "license": "MIT", - "dependencies": { - "clone": "^1.0.2" - } + "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/@semantic-release/npm/node_modules/npm/node_modules/delegates": { + "node_modules/archy": { "version": "1.0.0", - "inBundle": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", + "integrity": "sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==", + "dev": true }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/depd": { - "version": "1.1.2", - "inBundle": true, - "license": "MIT", + "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": ">= 0.6" + "node": ">=10" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/dezalgo": { - "version": "1.0.4", - "inBundle": true, - "license": "ISC", + "node_modules/are-we-there-yet/node_modules/readable-stream": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.1.tgz", + "integrity": "sha512-+rQmrWMYGA90yenhTYsLWAsLsqVC8osOw6PKE1HDYiO0gdPeKe/xDHNzIAIn4C91YQ6oenEhfYqqc1883qHbjQ==", "dependencies": { - "asap": "^2.0.0", - "wrappy": "1" - } - }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/diff": { - "version": "5.1.0", - "inBundle": true, - "license": "BSD-3-Clause", + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, "engines": { - "node": ">=0.3.1" + "node": ">= 6" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/emoji-regex": { - "version": "8.0.0", - "inBundle": true, - "license": "MIT" - }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/encoding": { - "version": "0.1.13", - "inBundle": true, - "license": "MIT", - "optional": true, + "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==", "dependencies": { - "iconv-lite": "^0.6.2" + "safe-buffer": "~5.2.0" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/env-paths": { - "version": "2.2.1", - "inBundle": true, - "license": "MIT", + "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==" + }, + "node_modules/argv-formatter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/argv-formatter/-/argv-formatter-1.0.0.tgz", + "integrity": "sha512-F2+Hkm9xFaRg+GkaNnbwXNDV5O6pnCFEmqyhvfC/Ic5LbgOWjJh3L+mN/s91rxVL3znE7DYVpW0GJFT+4YBgWw==" + }, + "node_modules/array-back": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/array-back/-/array-back-3.1.0.tgz", + "integrity": "sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==", "engines": { "node": ">=6" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/err-code": { - "version": "2.0.3", - "inBundle": true, - "license": "MIT" - }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/fastest-levenshtein": { - "version": "1.0.12", - "inBundle": true, - "license": "MIT" - }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/fs-minipass": { - "version": "2.1.0", - "inBundle": true, - "license": "ISC", + "node_modules/array-buffer-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", + "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", + "dev": true, "dependencies": { - "minipass": "^3.0.0" + "call-bind": "^1.0.2", + "is-array-buffer": "^3.0.1" }, - "engines": { - "node": ">= 8" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/fs.realpath": { - "version": "1.0.0", - "inBundle": true, - "license": "ISC" - }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/function-bind": { + "node_modules/array-flatten": { "version": "1.1.1", - "inBundle": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/gauge": { - "version": "4.0.4", - "inBundle": true, - "license": "ISC", + "node_modules/array-ify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz", + "integrity": "sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==" + }, + "node_modules/array-includes": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.7.tgz", + "integrity": "sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==", + "dev": true, "dependencies": { - "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.3", - "console-control-strings": "^1.1.0", - "has-unicode": "^2.0.1", - "signal-exit": "^3.0.7", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wide-align": "^1.1.5" + "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" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/glob": { - "version": "8.0.3", - "inBundle": true, - "license": "ISC", + "node_modules/array.prototype.findlastindex": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.3.tgz", + "integrity": "sha512-LzLoiOMAxvy+Gd3BAq3B7VeIgPdo+Q8hthvKtXybMvRV0jrXfJM/t8mw7nNlpEcVlVUnCnM2KSX4XU5HmpodOA==", + "dev": true, "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0", + "get-intrinsic": "^1.2.1" }, "engines": { - "node": ">=12" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/graceful-fs": { - "version": "4.2.10", - "inBundle": true, - "license": "ISC" - }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/has": { - "version": "1.0.3", - "inBundle": true, - "license": "MIT", + "node_modules/array.prototype.flat": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", + "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", + "dev": true, "dependencies": { - "function-bind": "^1.1.1" + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" }, "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/has-flag": { - "version": "4.0.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/has-unicode": { - "version": "2.0.1", - "inBundle": true, - "license": "ISC" - }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/hosted-git-info": { - "version": "5.2.1", - "inBundle": true, - "license": "ISC", - "dependencies": { - "lru-cache": "^7.5.1" + "node": ">= 0.4" }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/http-cache-semantics": { - "version": "4.1.1", - "inBundle": true, - "license": "BSD-2-Clause" - }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/http-proxy-agent": { - "version": "5.0.0", - "inBundle": true, - "license": "MIT", + "node_modules/array.prototype.flatmap": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", + "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", + "dev": true, "dependencies": { - "@tootallnate/once": "2", - "agent-base": "6", - "debug": "4" + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" }, "engines": { - "node": ">= 6" - } - }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/https-proxy-agent": { - "version": "5.0.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "agent-base": "6", - "debug": "4" + "node": ">= 0.4" }, - "engines": { - "node": ">= 6" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/humanize-ms": { - "version": "1.2.1", - "inBundle": true, - "license": "MIT", + "node_modules/array.prototype.tosorted": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.2.tgz", + "integrity": "sha512-HuQCHOlk1Weat5jzStICBCd83NxiIMwqDg/dHEsoefabn/hJRj5pVdWcPUSpRrwhwxZOsQassMpgN/xRYFBMIg==", + "dev": true, "dependencies": { - "ms": "^2.0.0" + "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" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/iconv-lite": { - "version": "0.6.3", - "inBundle": true, - "license": "MIT", - "optional": true, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz", + "integrity": "sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==", + "dev": true, "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" + "array-buffer-byte-length": "^1.0.0", + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1", + "is-array-buffer": "^3.0.2", + "is-shared-array-buffer": "^1.0.2" }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/ignore-walk": { - "version": "5.0.1", - "inBundle": true, - "license": "ISC", + "node_modules/asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" + }, + "node_modules/asn1": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", + "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", "dependencies": { - "minimatch": "^5.0.1" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "safer-buffer": "~2.1.0" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/imurmurhash": { - "version": "0.1.4", - "inBundle": true, - "license": "MIT", + "node_modules/assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", "engines": { - "node": ">=0.8.19" + "node": ">=0.8" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/indent-string": { - "version": "4.0.0", - "inBundle": true, - "license": "MIT", + "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": ">=8" + "node": "*" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/infer-owner": { - "version": "1.0.4", - "inBundle": true, - "license": "ISC" + "node_modules/async": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz", + "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==" }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/inflight": { - "version": "1.0.6", - "inBundle": true, - "license": "ISC", + "node_modules/asynciterator.prototype": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/asynciterator.prototype/-/asynciterator.prototype-1.0.0.tgz", + "integrity": "sha512-wwHYEIS0Q80f5mosx3L/dfG5t5rjEa9Ft51GTaNt862EnpyGHpgz2RkZvLPp1oF5TnAiTohkEKVEu8pQPJI7Vg==", + "dev": true, "dependencies": { - "once": "^1.3.0", - "wrappy": "1" + "has-symbols": "^1.0.3" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/inherits": { - "version": "2.0.4", - "inBundle": true, - "license": "ISC" - }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/ini": { - "version": "3.0.1", - "inBundle": true, - "license": "ISC", - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } + "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/@semantic-release/npm/node_modules/npm/node_modules/init-package-json": { - "version": "3.0.2", - "inBundle": true, - "license": "ISC", - "dependencies": { - "npm-package-arg": "^9.0.1", - "promzard": "^0.3.0", - "read": "^1.0.7", - "read-package-json": "^5.0.0", - "semver": "^7.3.5", - "validate-npm-package-license": "^3.0.4", - "validate-npm-package-name": "^4.0.0" - }, + "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": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">= 4.0.0" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/ip": { - "version": "2.0.0", - "inBundle": true, - "license": "MIT" - }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/ip-regex": { - "version": "4.3.0", - "inBundle": true, - "license": "MIT", + "node_modules/atomic-sleep": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/atomic-sleep/-/atomic-sleep-1.0.0.tgz", + "integrity": "sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==", "engines": { - "node": ">=8" + "node": ">=8.0.0" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/is-cidr": { - "version": "4.0.2", - "inBundle": true, - "license": "BSD-2-Clause", - "dependencies": { - "cidr-regex": "^3.1.1" - }, + "node_modules/available-typed-arrays": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "dev": true, "engines": { - "node": ">=10" - } - }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/is-core-module": { - "version": "2.10.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "has": "^1.0.3" + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "inBundle": true, - "license": "MIT", + "node_modules/aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", "engines": { - "node": ">=8" + "node": "*" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/is-lambda": { - "version": "1.0.1", - "inBundle": true, - "license": "MIT" - }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/isexe": { - "version": "2.0.0", - "inBundle": true, - "license": "ISC" - }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "inBundle": true, - "license": "MIT" + "node_modules/aws4": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz", + "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==" }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/json-stringify-nice": { - "version": "1.1.4", - "inBundle": true, - "license": "ISC", - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node_modules/axios": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.3.tgz", + "integrity": "sha512-fWyNdeawGam70jXSVlKl+SUNVcL6j6W79CuSIPfi6HnDUmSCH6gyUys/HrqHeA/wU0Az41rRgean494d0Jb+ww==", + "dependencies": { + "follow-redirects": "^1.15.0", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/jsonparse": { - "version": "1.3.1", - "engines": [ - "node >= 0.2.0" - ], - "inBundle": true, - "license": "MIT" + "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/@semantic-release/npm/node_modules/npm/node_modules/just-diff": { - "version": "5.1.1", - "inBundle": true, - "license": "MIT" - }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/just-diff-apply": { - "version": "5.4.1", - "inBundle": true, - "license": "MIT" + "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/@semantic-release/npm/node_modules/npm/node_modules/libnpmaccess": { - "version": "6.0.4", - "inBundle": true, - "license": "ISC", + "node_modules/basic-auth": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", + "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", "dependencies": { - "aproba": "^2.0.0", - "minipass": "^3.1.1", - "npm-package-arg": "^9.0.1", - "npm-registry-fetch": "^13.0.0" + "safe-buffer": "5.1.2" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">= 0.8" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/libnpmdiff": { - "version": "4.0.5", - "inBundle": true, - "license": "ISC", + "node_modules/basic-auth/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/bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", "dependencies": { - "@npmcli/disparity-colors": "^2.0.0", - "@npmcli/installed-package-contents": "^1.0.7", - "binary-extensions": "^2.2.0", - "diff": "^5.1.0", - "minimatch": "^5.0.1", - "npm-package-arg": "^9.0.1", - "pacote": "^13.6.1", - "tar": "^6.1.0" + "tweetnacl": "^0.14.3" + } + }, + "node_modules/bdd-lazy-var": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/bdd-lazy-var/-/bdd-lazy-var-2.6.1.tgz", + "integrity": "sha512-X3ADwcFji/IHIrYJhTTpaiWhoOx4pl4whdAx1dmvdeUPsMUb7fVYFvf/Q33VEAEAVkEwi5rgNSZ0Y9oOVeQV+A==", + "dev": true, + "peerDependencies": { + "jasmine": ">=2", + "jasmine-core": ">=2", + "jest": ">=20", + "mocha": ">=2.3" }, + "peerDependenciesMeta": { + "jasmine": { + "optional": true + }, + "jasmine-core": { + "optional": true + }, + "jest": { + "optional": true + }, + "mocha": { + "optional": true + } + } + }, + "node_modules/before-after-hook": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.3.tgz", + "integrity": "sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==" + }, + "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": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=8" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/libnpmexec": { - "version": "4.0.14", - "inBundle": true, - "license": "ISC", + "node_modules/bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" + }, + "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": { - "@npmcli/arborist": "^5.6.3", - "@npmcli/ci-detect": "^2.0.0", - "@npmcli/fs": "^2.1.1", - "@npmcli/run-script": "^4.2.0", - "chalk": "^4.1.0", - "mkdirp-infer-owner": "^2.0.0", - "npm-package-arg": "^9.0.1", - "npmlog": "^6.0.2", - "pacote": "^13.6.1", - "proc-log": "^2.0.0", - "read": "^1.0.7", - "read-package-json-fast": "^2.0.2", - "semver": "^7.3.7", - "walk-up-path": "^1.0.0" + "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": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/libnpmfund": { - "version": "3.0.5", - "inBundle": true, - "license": "ISC", + "node_modules/body-parser/node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", "dependencies": { - "@npmcli/arborist": "^5.6.3" + "side-channel": "^1.0.4" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/libnpmhook": { - "version": "8.0.4", - "inBundle": true, - "license": "ISC", + "node_modules/boolean": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/boolean/-/boolean-3.2.0.tgz", + "integrity": "sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==", + "dev": true + }, + "node_modules/bottleneck": { + "version": "2.19.5", + "resolved": "https://registry.npmjs.org/bottleneck/-/bottleneck-2.19.5.tgz", + "integrity": "sha512-VHiNCbI1lKdl44tGrhNfU3lup0Tj/ZBMJB5/2ZbNXRCPuRCO7ed2mgcK4r17y+KB2EfuYuRaVlwNbAeaWGSpbw==" + }, + "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": { - "aproba": "^2.0.0", - "npm-registry-fetch": "^13.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/libnpmorg": { - "version": "4.0.4", - "inBundle": true, - "license": "ISC", + "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": { - "aproba": "^2.0.0", - "npm-registry-fetch": "^13.0.0" + "fill-range": "^7.0.1" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=8" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/libnpmpack": { - "version": "4.1.3", - "inBundle": true, - "license": "ISC", + "node_modules/brotli": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/brotli/-/brotli-1.3.3.tgz", + "integrity": "sha512-oTKjJdShmDuGW94SyyaoQvAjf30dZaHnjJ8uAF+u2/vGJkJbJPJAT1gDiOJP5v1Zb6f9KEyW/1HpuaWIXtGHPg==", + "dev": true, "dependencies": { - "@npmcli/run-script": "^4.1.3", - "npm-package-arg": "^9.0.1", - "pacote": "^13.6.1" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "base64-js": "^1.1.2" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/libnpmpublish": { - "version": "6.0.5", - "inBundle": true, - "license": "ISC", + "node_modules/browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", + "dev": true + }, + "node_modules/browserslist": { + "version": "4.21.5", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz", + "integrity": "sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + } + ], "dependencies": { - "normalize-package-data": "^4.0.0", - "npm-package-arg": "^9.0.1", - "npm-registry-fetch": "^13.0.0", - "semver": "^7.3.7", - "ssri": "^9.0.0" + "caniuse-lite": "^1.0.30001449", + "electron-to-chromium": "^1.4.284", + "node-releases": "^2.0.8", + "update-browserslist-db": "^1.0.10" + }, + "bin": { + "browserslist": "cli.js" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/libnpmsearch": { - "version": "5.0.4", - "inBundle": true, - "license": "ISC", + "node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "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": { - "npm-registry-fetch": "^13.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/libnpmteam": { - "version": "4.0.4", - "inBundle": true, - "license": "ISC", + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "node_modules/builtins": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.0.1.tgz", + "integrity": "sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==", + "dev": true, "dependencies": { - "aproba": "^2.0.0", - "npm-registry-fetch": "^13.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "semver": "^7.0.0" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/libnpmversion": { - "version": "3.0.7", - "inBundle": true, - "license": "ISC", + "node_modules/busboy": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", + "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", "dependencies": { - "@npmcli/git": "^3.0.0", - "@npmcli/run-script": "^4.1.3", - "json-parse-even-better-errors": "^2.3.1", - "proc-log": "^2.0.0", - "semver": "^7.3.7" + "streamsearch": "^1.1.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=10.16.0" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/lru-cache": { - "version": "7.13.2", - "inBundle": true, - "license": "ISC", + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", "engines": { - "node": ">=12" + "node": ">= 0.8" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/make-fetch-happen": { - "version": "10.2.1", - "inBundle": true, - "license": "ISC", + "node_modules/cacache": { + "version": "15.3.0", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.3.0.tgz", + "integrity": "sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==", + "optional": true, "dependencies": { - "agentkeepalive": "^4.2.1", - "cacache": "^16.1.0", - "http-cache-semantics": "^4.1.0", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.0", - "is-lambda": "^1.0.1", - "lru-cache": "^7.7.1", - "minipass": "^3.1.6", + "@npmcli/fs": "^1.0.0", + "@npmcli/move-file": "^1.0.1", + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "glob": "^7.1.4", + "infer-owner": "^1.0.4", + "lru-cache": "^6.0.0", + "minipass": "^3.1.1", "minipass-collect": "^1.0.2", - "minipass-fetch": "^2.0.3", "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.3", - "promise-retry": "^2.0.1", - "socks-proxy-agent": "^7.0.0", - "ssri": "^9.0.0" + "minipass-pipeline": "^1.2.2", + "mkdirp": "^1.0.3", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^8.0.1", + "tar": "^6.0.2", + "unique-filename": "^1.1.1" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">= 10" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/minimatch": { - "version": "5.1.0", - "inBundle": true, - "license": "ISC", + "node_modules/cacache/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==", + "optional": true, "dependencies": { - "brace-expansion": "^2.0.1" + "yallist": "^4.0.0" }, "engines": { "node": ">=10" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/minipass": { - "version": "3.3.4", - "inBundle": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" + "node_modules/cacache/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "optional": true, + "bin": { + "mkdirp": "bin/cmd.js" }, "engines": { - "node": ">=8" + "node": ">=10" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/minipass-collect": { - "version": "1.0.2", - "inBundle": true, - "license": "ISC", + "node_modules/cacache/node_modules/p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "optional": true, "dependencies": { - "minipass": "^3.0.0" + "aggregate-error": "^3.0.0" }, "engines": { - "node": ">= 8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/minipass-fetch": { - "version": "2.1.1", - "inBundle": true, - "license": "MIT", + "node_modules/cacache/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "optional": true + }, + "node_modules/caching-transform": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-4.0.0.tgz", + "integrity": "sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==", + "dev": true, "dependencies": { - "minipass": "^3.1.6", - "minipass-sized": "^1.0.3", - "minizlib": "^2.1.2" + "hasha": "^5.0.0", + "make-dir": "^3.0.0", + "package-hash": "^4.0.0", + "write-file-atomic": "^3.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - }, - "optionalDependencies": { - "encoding": "^0.1.13" + "node": ">=8" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/minipass-flush": { + "node_modules/call-bind": { "version": "1.0.5", - "inBundle": true, - "license": "ISC", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz", + "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==", "dependencies": { - "minipass": "^3.0.0" + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.1", + "set-function-length": "^1.1.1" }, + "funding": { + "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==", "engines": { - "node": ">= 8" + "node": ">=6" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/minipass-json-stream": { - "version": "1.0.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "jsonparse": "^1.3.1", - "minipass": "^3.0.0" + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "engines": { + "node": ">=6" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/minipass-pipeline": { - "version": "1.2.4", - "inBundle": true, - "license": "ISC", - "dependencies": { - "minipass": "^3.0.0" - }, + "node_modules/caniuse-lite": { + "version": "1.0.30001458", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001458.tgz", + "integrity": "sha512-lQ1VlUUq5q9ro9X+5gOEyH7i3vm+AYVT1WDCVB69XOZ17KZRhnZ9J0Sqz7wTHQaLBJccNCHq8/Ww5LlOIZbB0w==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + } + ] + }, + "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": ">=8" + "node": ">=0.10.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/minipass-sized": { - "version": "1.0.3", - "inBundle": true, - "license": "ISC", + "node_modules/cardinal": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/cardinal/-/cardinal-2.1.1.tgz", + "integrity": "sha512-JSr5eOgoEymtYHBjNWyjrMqet9Am2miJhlfKNdqLp6zoeAh0KN5dRAcxlecj5mAJrmQomgiOBj35xHLrFjqBpw==", "dependencies": { - "minipass": "^3.0.0" + "ansicolors": "~0.3.2", + "redeyed": "~2.1.0" }, - "engines": { - "node": ">=8" + "bin": { + "cdl": "bin/cdl.js" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/minizlib": { - "version": "2.1.2", - "inBundle": true, - "license": "MIT", + "node_modules/caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" + }, + "node_modules/chai": { + "version": "4.3.10", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.10.tgz", + "integrity": "sha512-0UXG04VuVbruMUYbJ6JctvH0YnC/4q3/AkT18q4NaITo91CUm0liMS9VqzT9vZhVQ/1eqPanMWjBM+Juhfb/9g==", + "dev": true, "dependencies": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" + "assertion-error": "^1.1.0", + "check-error": "^1.0.3", + "deep-eql": "^4.1.3", + "get-func-name": "^2.0.2", + "loupe": "^2.3.6", + "pathval": "^1.1.1", + "type-detect": "^4.0.8" }, "engines": { - "node": ">= 8" + "node": ">=4" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/mkdirp": { - "version": "1.0.4", - "inBundle": true, - "license": "MIT", - "bin": { - "mkdirp": "bin/cmd.js" + "node_modules/chai-as-promised": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/chai-as-promised/-/chai-as-promised-7.1.1.tgz", + "integrity": "sha512-azL6xMoi+uxu6z4rhWQ1jbdUhOMhis2PvscD/xjLqNMkv3BPPp2JyyuTHOrf9BOosGpNQ11v6BKv/g57RXbiaA==", + "dev": true, + "dependencies": { + "check-error": "^1.0.2" }, - "engines": { - "node": ">=10" + "peerDependencies": { + "chai": ">= 2.1.2 < 5" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/mkdirp-infer-owner": { - "version": "2.0.0", - "inBundle": true, - "license": "ISC", + "node_modules/chai-http": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/chai-http/-/chai-http-4.4.0.tgz", + "integrity": "sha512-uswN3rZpawlRaa5NiDUHcDZ3v2dw5QgLyAwnQ2tnVNuP7CwIsOFuYJ0xR1WiR7ymD4roBnJIzOUep7w9jQMFJA==", + "dev": true, "dependencies": { - "chownr": "^2.0.0", - "infer-owner": "^1.0.4", - "mkdirp": "^1.0.3" + "@types/chai": "4", + "@types/superagent": "4.1.13", + "charset": "^1.0.1", + "cookiejar": "^2.1.4", + "is-ip": "^2.0.0", + "methods": "^1.1.2", + "qs": "^6.11.2", + "superagent": "^8.0.9" }, "engines": { "node": ">=10" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/ms": { - "version": "2.1.3", - "inBundle": true, - "license": "MIT" - }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/mute-stream": { - "version": "0.0.8", - "inBundle": true, - "license": "ISC" - }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/negotiator": { - "version": "0.6.3", - "inBundle": true, - "license": "MIT", + "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": ">= 0.6" + "node": ">=4" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/node-gyp": { - "version": "9.1.0", - "inBundle": true, - "license": "MIT", + "node_modules/chalk-template": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/chalk-template/-/chalk-template-0.4.0.tgz", + "integrity": "sha512-/ghrgmhfY8RaSdeo43hNXxpoHAtxdbskUHjPpfqUWGttFgycUhYPGx3YZBCnUCvOa7Doivn1IZec3DEGFoMgLg==", "dependencies": { - "env-paths": "^2.2.0", - "glob": "^7.1.4", - "graceful-fs": "^4.2.6", - "make-fetch-happen": "^10.0.3", - "nopt": "^5.0.0", - "npmlog": "^6.0.0", - "rimraf": "^3.0.2", - "semver": "^7.3.5", - "tar": "^6.1.2", - "which": "^2.0.2" - }, - "bin": { - "node-gyp": "bin/node-gyp.js" + "chalk": "^4.1.2" }, "engines": { - "node": "^12.22 || ^14.13 || >=16" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/chalk-template?sponsor=1" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/node-gyp/node_modules/brace-expansion": { - "version": "1.1.11", - "inBundle": true, - "license": "MIT", + "node_modules/chalk-template/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": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/node-gyp/node_modules/glob": { - "version": "7.2.3", - "inBundle": true, - "license": "ISC", + "node_modules/chalk-template/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": { - "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" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": "*" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/node-gyp/node_modules/minimatch": { - "version": "3.1.2", - "inBundle": true, - "license": "ISC", + "node_modules/chalk-template/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": { - "brace-expansion": "^1.1.7" + "color-name": "~1.1.4" }, "engines": { - "node": "*" + "node": ">=7.0.0" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/node-gyp/node_modules/nopt": { - "version": "5.0.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "abbrev": "1" - }, - "bin": { - "nopt": "bin/nopt.js" - }, - "engines": { - "node": ">=6" - } + "node_modules/chalk-template/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/@semantic-release/npm/node_modules/npm/node_modules/nopt": { - "version": "6.0.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "abbrev": "^1.0.0" - }, - "bin": { - "nopt": "bin/nopt.js" - }, + "node_modules/chalk-template/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": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=8" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/normalize-package-data": { - "version": "4.0.1", - "inBundle": true, - "license": "BSD-2-Clause", + "node_modules/chalk-template/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": { - "hosted-git-info": "^5.0.0", - "is-core-module": "^2.8.1", - "semver": "^7.3.5", - "validate-npm-package-license": "^3.0.4" + "has-flag": "^4.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=8" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/npm-audit-report": { - "version": "3.0.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "chalk": "^4.0.0" - }, + "node_modules/char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=10" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/npm-bundled": { - "version": "2.0.1", - "inBundle": true, - "license": "ISC", - "dependencies": { - "npm-normalize-package-bin": "^2.0.0" - }, + "node_modules/chardet": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-2.0.0.tgz", + "integrity": "sha512-xVgPpulCooDjY6zH4m9YW3jbkaBe3FKIAvF5sj5t7aBNsVl2ljIE+xwJ4iNgiDZHFQvNIpjdKdVOQvvk5ZfxbQ==", + "dev": true + }, + "node_modules/charenc": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", + "integrity": "sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==", + "dev": true, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "*" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/npm-bundled/node_modules/npm-normalize-package-bin": { - "version": "2.0.0", - "inBundle": true, - "license": "ISC", + "node_modules/charset": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/charset/-/charset-1.0.1.tgz", + "integrity": "sha512-6dVyOOYjpfFcL1Y4qChrAoQLRHvj2ziyhcm0QJlhOcAhykL/k1kTUPbeo+87MNRTRdk2OIIsIXbuF3x2wi5EXg==", + "dev": true, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=4.0.0" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/npm-install-checks": { - "version": "5.0.0", - "inBundle": true, - "license": "BSD-2-Clause", + "node_modules/check-error": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz", + "integrity": "sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==", + "dev": true, "dependencies": { - "semver": "^7.1.1" + "get-func-name": "^2.0.2" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "*" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/npm-normalize-package-bin": { - "version": "1.0.1", - "inBundle": true, - "license": "ISC" + "node_modules/child_process": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/child_process/-/child_process-1.0.2.tgz", + "integrity": "sha512-Wmza/JzL0SiWz7kl6MhIKT5ceIlnFPJX+lwUGj7Clhy5MMldsSoJR0+uvRzOS5Kv45Mq7t1PoE8TsOA9bzvb6g==" }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/npm-package-arg": { - "version": "9.1.0", - "inBundle": true, - "license": "ISC", + "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": { - "hosted-git-info": "^5.0.0", - "proc-log": "^2.0.1", - "semver": "^7.3.5", - "validate-npm-package-name": "^4.0.0" + "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": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/npm-packlist": { - "version": "5.1.3", - "inBundle": true, - "license": "ISC", - "dependencies": { - "glob": "^8.0.1", - "ignore-walk": "^5.0.1", - "npm-bundled": "^2.0.0", - "npm-normalize-package-bin": "^2.0.0" - }, - "bin": { - "npm-packlist": "bin/index.js" + "node": ">= 8.10.0" }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "optionalDependencies": { + "fsevents": "~2.3.2" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/npm-packlist/node_modules/npm-normalize-package-bin": { + "node_modules/chownr": { "version": "2.0.0", - "inBundle": true, - "license": "ISC", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=10" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/npm-pick-manifest": { - "version": "7.0.2", - "inBundle": true, - "license": "ISC", - "dependencies": { - "npm-install-checks": "^5.0.0", - "npm-normalize-package-bin": "^2.0.0", - "npm-package-arg": "^9.0.0", - "semver": "^7.3.5" - }, + "node_modules/clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "devOptional": true, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=6" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/npm-pick-manifest/node_modules/npm-normalize-package-bin": { - "version": "2.0.0", - "inBundle": true, - "license": "ISC", + "node_modules/cli-color": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/cli-color/-/cli-color-2.0.3.tgz", + "integrity": "sha512-OkoZnxyC4ERN3zLzZaY9Emb7f/MhBOIpePv0Ycok0fJYT+Ouo00UBEIwsVsr0yoow++n5YWlSUgST9GKhNHiRQ==", + "dev": true, + "dependencies": { + "d": "^1.0.1", + "es5-ext": "^0.10.61", + "es6-iterator": "^2.0.3", + "memoizee": "^0.4.15", + "timers-ext": "^0.1.7" + }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=0.10" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/npm-profile": { - "version": "6.2.1", - "inBundle": true, - "license": "ISC", + "node_modules/cli-progress": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/cli-progress/-/cli-progress-3.12.0.tgz", + "integrity": "sha512-tRkV3HJ1ASwm19THiiLIXLO7Im7wlTuKnvkYaTkyoAPefqjNg7W7DHKUlGRxy9vxDvbyCYQkQozvptuMkGCg8A==", + "dev": true, "dependencies": { - "npm-registry-fetch": "^13.0.1", - "proc-log": "^2.0.0" + "string-width": "^4.2.3" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=4" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/npm-registry-fetch": { - "version": "13.3.1", - "inBundle": true, - "license": "ISC", + "node_modules/cli-table3": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.3.tgz", + "integrity": "sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==", "dependencies": { - "make-fetch-happen": "^10.0.6", - "minipass": "^3.1.6", - "minipass-fetch": "^2.0.3", - "minipass-json-stream": "^1.0.1", - "minizlib": "^2.1.2", - "npm-package-arg": "^9.0.1", - "proc-log": "^2.0.0" + "string-width": "^4.2.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "10.* || >= 12.*" + }, + "optionalDependencies": { + "@colors/colors": "1.5.0" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/npm-user-validate": { - "version": "1.0.1", - "inBundle": true, - "license": "BSD-2-Clause" - }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/npmlog": { - "version": "6.0.2", - "inBundle": true, - "license": "ISC", + "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": { - "are-we-there-yet": "^3.0.0", - "console-control-strings": "^1.1.0", - "gauge": "^4.0.3", - "set-blocking": "^2.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/once": { - "version": "1.4.0", - "inBundle": true, - "license": "ISC", + "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": { - "wrappy": "1" + "color-name": "1.1.3" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/opener": { - "version": "1.5.2", - "inBundle": true, - "license": "(WTFPL OR MIT)", + "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/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": { - "opener": "bin/opener-bin.js" + "color-support": "bin.js" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/p-map": { - "version": "4.0.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "aggregate-error": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node_modules/colors": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", + "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", + "dev": true, + "engines": { + "node": ">=0.1.90" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/pacote": { - "version": "13.6.2", - "inBundle": true, - "license": "ISC", + "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": { - "@npmcli/git": "^3.0.0", - "@npmcli/installed-package-contents": "^1.0.7", - "@npmcli/promise-spawn": "^3.0.0", - "@npmcli/run-script": "^4.1.0", - "cacache": "^16.0.0", - "chownr": "^2.0.0", - "fs-minipass": "^2.1.0", - "infer-owner": "^1.0.4", - "minipass": "^3.1.6", - "mkdirp": "^1.0.4", - "npm-package-arg": "^9.0.0", - "npm-packlist": "^5.1.0", - "npm-pick-manifest": "^7.0.0", - "npm-registry-fetch": "^13.0.1", - "proc-log": "^2.0.0", - "promise-retry": "^2.0.1", - "read-package-json": "^5.0.0", - "read-package-json-fast": "^2.0.3", - "rimraf": "^3.0.2", - "ssri": "^9.0.0", - "tar": "^6.1.11" + "delayed-stream": "~1.0.0" }, - "bin": { - "pacote": "lib/bin.js" + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/command-line-args": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-5.2.1.tgz", + "integrity": "sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg==", + "dependencies": { + "array-back": "^3.1.0", + "find-replace": "^3.0.0", + "lodash.camelcase": "^4.3.0", + "typical": "^4.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=4.0.0" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/parse-conflict-json": { - "version": "2.0.2", - "inBundle": true, - "license": "ISC", + "node_modules/command-line-usage": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-7.0.1.tgz", + "integrity": "sha512-NCyznE//MuTjwi3y84QVUGEOT+P5oto1e1Pk/jFPVdPPfsG03qpTIl3yw6etR+v73d0lXsoojRpvbru2sqePxQ==", "dependencies": { - "json-parse-even-better-errors": "^2.3.1", - "just-diff": "^5.0.1", - "just-diff-apply": "^5.2.0" + "array-back": "^6.2.2", + "chalk-template": "^0.4.0", + "table-layout": "^3.0.0", + "typical": "^7.1.1" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=12.20.0" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/path-is-absolute": { - "version": "1.0.1", - "inBundle": true, - "license": "MIT", + "node_modules/command-line-usage/node_modules/array-back": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/array-back/-/array-back-6.2.2.tgz", + "integrity": "sha512-gUAZ7HPyb4SJczXAMUXMGAvI976JoK3qEx9v1FTmeYuJj0IBiaKttG1ydtGKdkfqWkIkouke7nG8ufGy77+Cvw==", "engines": { - "node": ">=0.10.0" + "node": ">=12.17" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/postcss-selector-parser": { - "version": "6.0.10", - "inBundle": true, - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, + "node_modules/command-line-usage/node_modules/typical": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/typical/-/typical-7.1.1.tgz", + "integrity": "sha512-T+tKVNs6Wu7IWiAce5BgMd7OZfNYUndHwc5MknN+UHOudi7sGZzuHdCadllRuqJ3fPtgFtIH9+lt9qRv6lmpfA==", "engines": { - "node": ">=4" + "node": ">=12.17" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/proc-log": { - "version": "2.0.1", - "inBundle": true, - "license": "ISC", + "node_modules/commander": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz", + "integrity": "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==", + "dev": true, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=16" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/promise-all-reject-late": { + "node_modules/commondir": { "version": "1.0.1", - "inBundle": true, - "license": "ISC", - "funding": { - "url": "https://github.com/sponsors/isaacs" + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", + "dev": true + }, + "node_modules/compare-func": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-2.0.0.tgz", + "integrity": "sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==", + "dependencies": { + "array-ify": "^1.0.0", + "dot-prop": "^5.1.0" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/promise-call-limit": { - "version": "1.0.1", - "inBundle": true, - "license": "ISC", + "node_modules/component-emitter": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.1.tgz", + "integrity": "sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==", + "dev": true, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/promise-inflight": { - "version": "1.0.1", - "inBundle": true, - "license": "ISC" + "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/@semantic-release/npm/node_modules/npm/node_modules/promise-retry": { - "version": "2.0.1", - "inBundle": true, - "license": "MIT", + "node_modules/concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "engines": [ + "node >= 0.8" + ], "dependencies": { - "err-code": "^2.0.2", - "retry": "^0.12.0" - }, - "engines": { - "node": ">=10" + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/promzard": { - "version": "0.3.0", - "inBundle": true, - "license": "ISC", + "node_modules/concat-stream/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/concat-stream/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": { - "read": "1" + "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/@semantic-release/npm/node_modules/npm/node_modules/qrcode-terminal": { - "version": "0.12.0", - "inBundle": true, - "bin": { - "qrcode-terminal": "bin/qrcode-terminal.js" - } + "node_modules/concat-stream/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/@semantic-release/npm/node_modules/npm/node_modules/read": { - "version": "1.0.7", - "inBundle": true, - "license": "ISC", + "node_modules/concat-stream/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": { - "mute-stream": "~0.0.4" - }, - "engines": { - "node": ">=0.8" + "safe-buffer": "~5.1.0" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/read-cmd-shim": { - "version": "3.0.0", - "inBundle": true, - "license": "ISC", - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node_modules/concurrent-queue": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/concurrent-queue/-/concurrent-queue-7.0.2.tgz", + "integrity": "sha512-icXDqc0JBdcQ3ubXiXcqVhuFeRrec39zVD2X5z7FKwwj0pImnfLWtAhGyX4CcBDD+YoqLesClOeRss+pZnm6/Q==", + "dependencies": { + "afterward": "~2.0.0", + "define-error": "~1.0.0", + "eventuate": "~4.0.0", + "object-assign": "~4.0.1", + "on-error": "~2.1.0", + "once": "~1.3.2", + "promise-polyfill": "~2.1.0" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/read-package-json": { - "version": "5.0.2", - "inBundle": true, - "license": "ISC", + "node_modules/config-chain": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", + "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", "dependencies": { - "glob": "^8.0.1", - "json-parse-even-better-errors": "^2.3.1", - "normalize-package-data": "^4.0.0", - "npm-normalize-package-bin": "^2.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "ini": "^1.3.4", + "proto-list": "~1.2.1" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/read-package-json-fast": { - "version": "2.0.3", - "inBundle": true, - "license": "ISC", + "node_modules/config-chain/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/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": { - "json-parse-even-better-errors": "^2.3.0", - "npm-normalize-package-bin": "^1.0.1" + "safe-buffer": "5.2.1" }, "engines": { - "node": ">=10" + "node": ">= 0.6" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/read-package-json/node_modules/npm-normalize-package-bin": { - "version": "2.0.0", - "inBundle": true, - "license": "ISC", + "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": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">= 0.6" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/readable-stream": { - "version": "3.6.0", - "inBundle": true, - "license": "MIT", + "node_modules/conventional-changelog-angular": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-7.0.0.tgz", + "integrity": "sha512-ROjNchA9LgfNMTTFSIWPzebCwOGFdgkEq45EnvvrmSLvCtAw0HSmrCs7/ty+wAeYUZyNay0YMUNYFTRL72PkBQ==", "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" + "compare-func": "^2.0.0" }, "engines": { - "node": ">= 6" + "node": ">=16" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/readdir-scoped-modules": { - "version": "1.1.0", - "inBundle": true, - "license": "ISC", + "node_modules/conventional-changelog-writer": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-7.0.1.tgz", + "integrity": "sha512-Uo+R9neH3r/foIvQ0MKcsXkX642hdm9odUp7TqgFS7BsalTcjzRlIfWZrZR1gbxOozKucaKt5KAbjW8J8xRSmA==", "dependencies": { - "debuglog": "^1.0.1", - "dezalgo": "^1.0.0", - "graceful-fs": "^4.1.2", - "once": "^1.3.0" + "conventional-commits-filter": "^4.0.0", + "handlebars": "^4.7.7", + "json-stringify-safe": "^5.0.1", + "meow": "^12.0.1", + "semver": "^7.5.2", + "split2": "^4.0.0" + }, + "bin": { + "conventional-changelog-writer": "cli.mjs" + }, + "engines": { + "node": ">=16" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/retry": { - "version": "0.12.0", - "inBundle": true, - "license": "MIT", + "node_modules/conventional-commits-filter": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-4.0.0.tgz", + "integrity": "sha512-rnpnibcSOdFcdclpFwWa+pPlZJhXE7l+XK04zxhbWrhgpR96h33QLz8hITTXbcYICxVr3HZFtbtUAQ+4LdBo9A==", "engines": { - "node": ">= 4" + "node": ">=16" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/rimraf": { - "version": "3.0.2", - "inBundle": true, - "license": "ISC", + "node_modules/conventional-commits-parser": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-5.0.0.tgz", + "integrity": "sha512-ZPMl0ZJbw74iS9LuX9YIAiW8pfM5p3yh2o/NbXHbkFuZzY5jvdi5jFycEOkmBW5H5I7nA+D6f3UcsCLP2vvSEA==", "dependencies": { - "glob": "^7.1.3" + "is-text-path": "^2.0.0", + "JSONStream": "^1.3.5", + "meow": "^12.0.1", + "split2": "^4.0.0" }, "bin": { - "rimraf": "bin.js" + "conventional-commits-parser": "cli.mjs" }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/rimraf/node_modules/brace-expansion": { - "version": "1.1.11", - "inBundle": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "engines": { + "node": ">=16" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/rimraf/node_modules/glob": { - "version": "7.2.3", - "inBundle": true, - "license": "ISC", - "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" - }, + "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.4.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==", "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">= 0.6" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/rimraf/node_modules/minimatch": { - "version": "3.1.2", - "inBundle": true, - "license": "ISC", + "node_modules/cookie-parser": { + "version": "1.4.6", + "resolved": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.4.6.tgz", + "integrity": "sha512-z3IzaNjdwUC2olLIB5/ITd0/setiaFMLYiZJle7xg5Fe9KWAceil7xszYfHHBtDFYLSgJduS2Ty0P1uJdPDJeA==", "dependencies": { - "brace-expansion": "^1.1.7" + "cookie": "0.4.1", + "cookie-signature": "1.0.6" }, "engines": { - "node": "*" + "node": ">= 0.8.0" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/safe-buffer": { - "version": "5.2.1", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "inBundle": true, - "license": "MIT" + "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/@semantic-release/npm/node_modules/npm/node_modules/safer-buffer": { - "version": "2.1.2", - "inBundle": true, - "license": "MIT", - "optional": true + "node_modules/cookiejar": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.4.tgz", + "integrity": "sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==", + "dev": true }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/semver": { - "version": "7.3.7", - "inBundle": true, - "license": "ISC", + "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/cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" + "object-assign": "^4", + "vary": "^1" }, "engines": { - "node": ">=10" + "node": ">= 0.10" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/semver/node_modules/lru-cache": { - "version": "6.0.0", - "inBundle": true, - "license": "ISC", + "node_modules/cosmiconfig": { + "version": "8.3.6", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", + "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", "dependencies": { - "yallist": "^4.0.0" + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0", + "path-type": "^4.0.0" }, "engines": { - "node": ">=10" + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/set-blocking": { - "version": "2.0.0", - "inBundle": true, - "license": "ISC" - }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/signal-exit": { - "version": "3.0.7", - "inBundle": true, - "license": "ISC" - }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/smart-buffer": { - "version": "4.2.0", - "inBundle": true, - "license": "MIT", + "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==", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, "engines": { - "node": ">= 6.0.0", - "npm": ">= 3.0.0" + "node": ">= 8" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/socks": { - "version": "2.7.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "ip": "^2.0.0", - "smart-buffer": "^4.2.0" - }, + "node_modules/crypt": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz", + "integrity": "sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==", + "dev": true, "engines": { - "node": ">= 10.13.0", - "npm": ">= 3.0.0" + "node": "*" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/socks-proxy-agent": { - "version": "7.0.0", - "inBundle": true, - "license": "MIT", + "node_modules/crypto-random-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-4.0.0.tgz", + "integrity": "sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==", "dependencies": { - "agent-base": "^6.0.2", - "debug": "^4.3.3", - "socks": "^2.6.2" + "type-fest": "^1.0.1" }, "engines": { - "node": ">= 10" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/spdx-correct": { - "version": "3.1.1", - "inBundle": true, - "license": "Apache-2.0", - "dependencies": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" + "node_modules/crypto-random-string/node_modules/type-fest": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", + "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/spdx-exceptions": { - "version": "2.3.0", - "inBundle": true, - "license": "CC-BY-3.0" + "node_modules/csv-parse": { + "version": "4.16.3", + "resolved": "https://registry.npmjs.org/csv-parse/-/csv-parse-4.16.3.tgz", + "integrity": "sha512-cO1I/zmz4w2dcKHVvpCr7JVRu8/FymG5OEpmvsZYlccYolPBLoVGKUHgNoc4ZGkFeFlWGEDmMyBM+TTqRdW/wg==", + "dev": true }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/spdx-expression-parse": { - "version": "3.0.1", - "inBundle": true, - "license": "MIT", + "node_modules/d": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", + "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", + "dev": true, "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" + "es5-ext": "^0.10.50", + "type": "^1.0.1" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/spdx-license-ids": { - "version": "3.0.11", - "inBundle": true, - "license": "CC0-1.0" + "node_modules/daemonize2": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/daemonize2/-/daemonize2-0.4.2.tgz", + "integrity": "sha512-dzB3qdxvcJ2AWyESI8xv90qZ4wZt4P+lvQUT1sVKcrbEKSvBk/8zkDlZvMyaWmoKe7DXLGu00z59b7K9gkzbqQ==", + "engines": { + "node": ">0.8.x" + } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/ssri": { - "version": "9.0.1", - "inBundle": true, - "license": "ISC", + "node_modules/dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", "dependencies": { - "minipass": "^3.1.1" + "assert-plus": "^1.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=0.10" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/string_decoder": { - "version": "1.3.0", - "inBundle": true, - "license": "MIT", + "node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dependencies": { - "safe-buffer": "~5.2.0" + "ms": "2.0.0" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/string-width": { - "version": "4.2.3", - "inBundle": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, + "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==", + "dev": true, "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/strip-ansi": { - "version": "6.0.1", - "inBundle": true, - "license": "MIT", + "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": { - "ansi-regex": "^5.0.1" + "type-detect": "^4.0.0" }, "engines": { - "node": ">=8" + "node": ">=6" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/supports-color": { - "version": "7.2.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, + "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": ">=8" + "node": ">=4.0.0" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/tar": { - "version": "6.1.11", - "inBundle": true, - "license": "ISC", - "dependencies": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^3.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/text-table": { - "version": "0.2.0", - "inBundle": true, - "license": "MIT" - }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/tiny-relative-date": { - "version": "1.3.0", - "inBundle": true, - "license": "MIT" - }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/treeverse": { - "version": "2.0.0", - "inBundle": true, - "license": "ISC", - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.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/@semantic-release/npm/node_modules/npm/node_modules/unique-filename": { - "version": "2.0.1", - "inBundle": true, - "license": "ISC", + "node_modules/default-require-extensions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-3.0.1.tgz", + "integrity": "sha512-eXTJmRbm2TIt9MgWTsOH1wEuhew6XGZcMeGKCtLedIg/NCsg1iBePXkceTdK4Fii7pzmN9tGsZhKzZ4h7O/fxw==", + "dev": true, "dependencies": { - "unique-slug": "^3.0.0" + "strip-bom": "^4.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/unique-slug": { - "version": "3.0.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "imurmurhash": "^0.1.4" + "node": ">=8" }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/util-deprecate": { - "version": "1.0.2", - "inBundle": true, - "license": "MIT" - }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/validate-npm-package-license": { - "version": "3.0.4", - "inBundle": true, - "license": "Apache-2.0", - "dependencies": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/validate-npm-package-name": { - "version": "4.0.0", - "inBundle": true, - "license": "ISC", + "node_modules/define-data-property": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", + "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", "dependencies": { - "builtins": "^5.0.0" + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">= 0.4" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/walk-up-path": { + "node_modules/define-error": { "version": "1.0.0", - "inBundle": true, - "license": "ISC" - }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/wcwidth": { - "version": "1.0.1", - "inBundle": true, - "license": "MIT", + "resolved": "https://registry.npmjs.org/define-error/-/define-error-1.0.0.tgz", + "integrity": "sha512-HLdUb9mNENZ/tjnZGlITfOnx7wSM7a6e+WEDyhKSrsN/g5dJUS6kepG6qJApRLAdjRofQ2W8R3yrtI6GeyGGVg==", "dependencies": { - "defaults": "^1.0.3" + "capture-stack-trace": "~1.0.0" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/which": { - "version": "2.0.2", - "inBundle": true, - "license": "ISC", + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dev": true, "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" }, "engines": { - "node": ">= 8" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/wide-align": { - "version": "1.1.5", - "inBundle": true, - "license": "ISC", - "dependencies": { - "string-width": "^1.0.2 || 2 || 3 || 4" + "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/@semantic-release/npm/node_modules/npm/node_modules/wrappy": { - "version": "1.0.2", - "inBundle": true, - "license": "ISC" + "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/@semantic-release/npm/node_modules/npm/node_modules/write-file-atomic": { - "version": "4.0.2", - "inBundle": true, - "license": "ISC", - "dependencies": { - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.7" - }, + "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": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">= 0.8" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/yallist": { - "version": "4.0.0", - "inBundle": true, - "license": "ISC" + "node_modules/deprecation": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz", + "integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==" }, - "node_modules/@semantic-release/npm/node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "node_modules/des.js": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.1.0.tgz", + "integrity": "sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg==", + "dev": true, "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" } }, - "node_modules/@semantic-release/npm/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==", + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", "engines": { - "node": ">=8" + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" } }, - "node_modules/@semantic-release/npm/node_modules/semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, + "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": ">=10" + "node": ">=8" } }, - "node_modules/@semantic-release/npm/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==", + "node_modules/detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", + "dev": true + }, + "node_modules/dezalgo": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.4.tgz", + "integrity": "sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==", "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" + "asap": "^2.0.0", + "wrappy": "1" } }, - "node_modules/@semantic-release/npm/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==", + "node_modules/diff": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", + "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", + "dev": true, "engines": { - "node": ">=8" + "node": ">=0.3.1" } }, - "node_modules/@semantic-release/npm/node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "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": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" + "path-type": "^4.0.0" }, "engines": { - "node": ">= 8" + "node": ">=8" } }, - "node_modules/@semantic-release/npm/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/@semantic-release/release-notes-generator": { - "version": "10.0.3", - "resolved": "https://registry.npmjs.org/@semantic-release/release-notes-generator/-/release-notes-generator-10.0.3.tgz", - "integrity": "sha512-k4x4VhIKneOWoBGHkx0qZogNjCldLPRiAjnIpMnlUh6PtaWXp/T+C9U7/TaNDDtgDa5HMbHl4WlREdxHio6/3w==", - "dependencies": { - "conventional-changelog-angular": "^5.0.0", - "conventional-changelog-writer": "^5.0.0", - "conventional-commits-filter": "^2.0.0", - "conventional-commits-parser": "^3.2.3", - "debug": "^4.0.0", - "get-stream": "^6.0.0", - "import-from": "^4.0.0", - "into-stream": "^6.0.0", - "lodash": "^4.17.4", - "read-pkg-up": "^7.0.0" + "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": ">=14.17" - }, - "peerDependencies": { - "semantic-release": ">=18.0.0-beta.1" + "node": ">=6.0.0" } }, - "node_modules/@semantic-release/release-notes-generator/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "node_modules/dot-prop": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", + "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", "dependencies": { - "ms": "2.1.2" + "is-obj": "^2.0.0" }, "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "node": ">=8" } }, - "node_modules/@semantic-release/release-notes-generator/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==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node_modules/dottie": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/dottie/-/dottie-2.0.6.tgz", + "integrity": "sha512-iGCHkfUc5kFekGiqhe8B/mdaurD+lakO9txNnTvKtA6PISrw86LgqHvRzWYPyoE2Ph5aMIrCw9/uko6XHTKCwA==" + }, + "node_modules/duplexer2": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", + "integrity": "sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==", + "dependencies": { + "readable-stream": "^2.0.2" } }, - "node_modules/@semantic-release/release-notes-generator/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/duplexer2/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/@sinonjs/commons": { - "version": "1.8.6", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.6.tgz", - "integrity": "sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==", - "dev": true, + "node_modules/duplexer2/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": { - "type-detect": "4.0.8" + "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/@sinonjs/formatio": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/@sinonjs/formatio/-/formatio-3.2.2.tgz", - "integrity": "sha512-B8SEsgd8gArBLMD6zpRw3juQ2FVSsmdd7qlevyDqzS9WTCtvF55/gAL+h6gue8ZvPYcdiPdvueM/qm//9XzyTQ==", - "dev": true, + "node_modules/duplexer2/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/duplexer2/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": { - "@sinonjs/commons": "^1", - "@sinonjs/samsam": "^3.1.0" + "safe-buffer": "~5.1.0" } }, - "node_modules/@sinonjs/samsam": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-3.3.3.tgz", - "integrity": "sha512-bKCMKZvWIjYD0BLGnNrxVuw4dkWCYsLqFOUWw8VgKF/+5Y+mE7LfHWPIYoDXowH+3a9LsWDMo0uAP8YDosPvHQ==", - "dev": true, + "node_modules/ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", "dependencies": { - "@sinonjs/commons": "^1.3.0", - "array-from": "^2.1.1", - "lodash": "^4.17.15" + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" } }, - "node_modules/@sinonjs/text-encoding": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.2.tgz", - "integrity": "sha512-sXXKG+uL9IrKqViTtao2Ws6dy0znu9sOaP1di/jKGW1M6VssO8vlpXCQcpZ+jisQ1tTFAC5Jo/EOzFbggBagFQ==", - "dev": true - }, - "node_modules/@tootallnate/once": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", - "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", - "engines": { - "node": ">= 10" + "node_modules/editorconfig": { + "version": "0.15.3", + "resolved": "https://registry.npmjs.org/editorconfig/-/editorconfig-0.15.3.tgz", + "integrity": "sha512-M9wIMFx96vq0R4F+gRpY3o2exzb8hEj/n9S8unZtHSvYjibBp/iMufSzvmOcV/laG0ZtuTVGtiJggPOSW2r93g==", + "dev": true, + "dependencies": { + "commander": "^2.19.0", + "lru-cache": "^4.1.5", + "semver": "^5.6.0", + "sigmund": "^1.0.1" + }, + "bin": { + "editorconfig": "bin/editorconfig" } }, - "node_modules/@types/chai": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.4.tgz", - "integrity": "sha512-KnRanxnpfpjUTqTCXslZSEdLfXExwgNxYPdiO2WGUj8+HDjFi8R3k5RVKPeSCzLjCcshCAtVO2QBbVuAV4kTnw==", - "dev": true - }, - "node_modules/@types/cookiejar": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@types/cookiejar/-/cookiejar-2.1.2.tgz", - "integrity": "sha512-t73xJJrvdTjXrn4jLS9VSGRbz0nUY3cl2DMGDU48lKl+HR9dbbjW2A9r3g40VA++mQpy6uuHg33gy7du2BKpog==", + "node_modules/editorconfig/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", "dev": true }, - "node_modules/@types/debug": { - "version": "4.1.7", - "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.7.tgz", - "integrity": "sha512-9AonUzyTjXXhEOa0DnqpzZi6VHlqKMswga9EXjpXnnqxwLtdvPPtlO8evrI5D9S6asFRCQ6v+wpiUKbw+vKqyg==", + "node_modules/editorconfig/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==", + "dev": true, "dependencies": { - "@types/ms": "*" + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" } }, - "node_modules/@types/minimist": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.2.tgz", - "integrity": "sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==" - }, - "node_modules/@types/ms": { - "version": "0.7.31", - "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.31.tgz", - "integrity": "sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==" - }, - "node_modules/@types/node": { - "version": "18.14.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.14.2.tgz", - "integrity": "sha512-1uEQxww3DaghA0RxqHx0O0ppVlo43pJhepY51OxuQIKHpjbnYLA7vcdwioNPzIqmC2u3I/dmylcqjlh0e7AyUA==" - }, - "node_modules/@types/normalize-package-data": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz", - "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==" - }, - "node_modules/@types/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==" - }, - "node_modules/@types/retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", - "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==" - }, - "node_modules/@types/superagent": { - "version": "3.8.7", - "resolved": "https://registry.npmjs.org/@types/superagent/-/superagent-3.8.7.tgz", - "integrity": "sha512-9KhCkyXv268A2nZ1Wvu7rQWM+BmdYUVkycFeNnYrUL5Zwu7o8wPQ3wBfW59dDP+wuoxw0ww8YKgTNv8j/cgscA==", + "node_modules/editorconfig/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, - "dependencies": { - "@types/cookiejar": "*", - "@types/node": "*" + "bin": { + "semver": "bin/semver" } }, - "node_modules/@types/validator": { - "version": "13.7.12", - "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.7.12.tgz", - "integrity": "sha512-YVtyAPqpefU+Mm/qqnOANW6IkqKpCSrarcyV269C8MA8Ux0dbkEuQwM/4CjL47kVEM2LgBef/ETfkH+c6+moFA==" - }, - "node_modules/@ungap/promise-all-settled": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz", - "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==", + "node_modules/editorconfig/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==", "dev": true }, - "node_modules/abbrev": { + "node_modules/ee-first": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" }, - "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==", + "node_modules/ejs": { + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.9.tgz", + "integrity": "sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ==", "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" + "jake": "^10.8.5" + }, + "bin": { + "ejs": "bin/cli.js" }, "engines": { - "node": ">= 0.6" + "node": ">=0.10.0" } }, - "node_modules/acorn": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.1.tgz", - "integrity": "sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, + "node_modules/electron-to-chromium": { + "version": "1.4.313", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.313.tgz", + "integrity": "sha512-QckB9OVqr2oybjIrbMI99uF+b9+iTja5weFe0ePbqLb5BHqXOJUO1SG6kDj/1WtWPRIBr51N153AEq8m7HuIaA==", + "dev": true + }, + "node_modules/emittery": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", + "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", "engines": { - "node": ">=0.4.0" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sindresorhus/emittery?sponsor=1" } }, - "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/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/emojilib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/emojilib/-/emojilib-2.4.0.tgz", + "integrity": "sha512-5U0rVMU5Y2n2+ykNLQqMoqklN9ICBT/KsvC1Gz6vqHbz2AXXGkG+Pm5rMWk/8Vjrr/mY9985Hi8DYzn1F09Nyw==" + }, + "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/afterward": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/afterward/-/afterward-2.0.0.tgz", - "integrity": "sha512-7n9Vkbb8cmMRKKSfe5qgyqX4Yjdaty0QP/+GXYawZK8Vcq+8E5FCmbWbwfCoiBnDoAY/edKLNg2TwgGcwdA+3Q==", + "node_modules/encoding": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", + "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", + "optional": true, "dependencies": { - "define-error": "~1.0.0" + "iconv-lite": "^0.6.2" } }, - "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==", + "node_modules/encoding/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "optional": true, "dependencies": { - "debug": "4" + "safer-buffer": ">= 2.1.2 < 3.0.0" }, "engines": { - "node": ">= 6.0.0" + "node": ">=0.10.0" } }, - "node_modules/agent-base/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "node_modules/env-ci": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/env-ci/-/env-ci-10.0.0.tgz", + "integrity": "sha512-U4xcd/utDYFgMh0yWj07R1H6L5fwhVbmxBCpnL0DbVSDZVnsC82HONw0wxtxNkIAcua3KtbomQvIk5xFZGAQJw==", "dependencies": { - "ms": "2.1.2" + "execa": "^8.0.0", + "java-properties": "^1.0.2" }, "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "node": "^18.17 || >=20.6.1" } }, - "node_modules/agent-base/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/agentkeepalive": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.2.1.tgz", - "integrity": "sha512-Zn4cw2NEqd+9fiSVWMscnjyQ1a8Yfoc5oBajLeo5w+YBHgDUcEBY2hS4YpTz6iN5f/2zQiktcuM6tS8x1p9dpA==", - "optional": true, + "node_modules/env-ci/node_modules/execa": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", + "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", "dependencies": { - "debug": "^4.1.0", - "depd": "^1.1.2", - "humanize-ms": "^1.2.1" + "cross-spawn": "^7.0.3", + "get-stream": "^8.0.1", + "human-signals": "^5.0.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^4.1.0", + "strip-final-newline": "^3.0.0" }, "engines": { - "node": ">= 8.0.0" + "node": ">=16.17" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, - "node_modules/agentkeepalive/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "optional": true, - "dependencies": { - "ms": "2.1.2" - }, + "node_modules/env-ci/node_modules/get-stream": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", + "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", "engines": { - "node": ">=6.0" + "node": ">=16" }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/agentkeepalive/node_modules/depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", - "optional": true, + "node_modules/env-ci/node_modules/human-signals": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", + "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", "engines": { - "node": ">= 0.6" + "node": ">=16.17.0" } }, - "node_modules/agentkeepalive/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==", - "optional": true - }, - "node_modules/aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "dependencies": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" + "node_modules/env-ci/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==", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/env-ci/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==", "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "node_modules/env-ci/node_modules/npm-run-path": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.2.0.tgz", + "integrity": "sha512-W4/tgAXFqFA0iL7fk0+uQ3g7wkL8xJmx3XdK0VGb4cHW//eZTtKGvFBBoRKVTpY7n6ze4NL9ly7rgXcHufqXKg==", "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" + "path-key": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true, - "peerDependencies": { - "ajv": "^6.9.1" + "node_modules/env-ci/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==", + "dependencies": { + "mimic-fn": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/ansi-colors": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", - "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", - "dev": true, + "node_modules/env-ci/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==", "engines": { - "node": ">=6" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/ansi-escapes": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", - "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", - "dev": true, + "node_modules/env-ci/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", "engines": { - "node": ">=4" + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "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==", - "dev": true, + "node_modules/env-ci/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==", "engines": { - "node": ">=0.10.0" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "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" - }, + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "optional": true, "engines": { - "node": ">=4" + "node": ">=6" } }, - "node_modules/ansicolors": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/ansicolors/-/ansicolors-0.3.2.tgz", - "integrity": "sha512-QXu7BPrP29VllRxH8GwB7x5iX5qWKAAMLqKQGWTeLWVlNHNOpVMJ91dsxQAIWXpjuW5wqvxu3Jd/nRjrJ+0pqg==" - }, - "node_modules/any-promise": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==" + "node_modules/err-code": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", + "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", + "optional": true }, - "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, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" + "is-arrayish": "^0.2.1" } }, - "node_modules/append-field": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/append-field/-/append-field-1.0.0.tgz", - "integrity": "sha512-klpgFSWLW1ZEs8svjfb7g4qWY0YS5imI82dTg+QahUvJ8YqAY0P10Uk8tTyh9ZGuYEZEMaeJYCF5BFuX552hsw==" - }, - "node_modules/append-transform": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-2.0.0.tgz", - "integrity": "sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==", + "node_modules/es-abstract": { + "version": "1.22.3", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.3.tgz", + "integrity": "sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA==", "dev": true, "dependencies": { - "default-require-extensions": "^3.0.0" + "array-buffer-byte-length": "^1.0.0", + "arraybuffer.prototype.slice": "^1.0.2", + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.5", + "es-set-tostringtag": "^2.0.1", + "es-to-primitive": "^1.2.1", + "function.prototype.name": "^1.1.6", + "get-intrinsic": "^1.2.2", + "get-symbol-description": "^1.0.0", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0", + "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.13.1", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.5.1", + "safe-array-concat": "^1.0.1", + "safe-regex-test": "^1.0.0", + "string.prototype.trim": "^1.2.8", + "string.prototype.trimend": "^1.0.7", + "string.prototype.trimstart": "^1.0.7", + "typed-array-buffer": "^1.0.0", + "typed-array-byte-length": "^1.0.0", + "typed-array-byte-offset": "^1.0.0", + "typed-array-length": "^1.0.4", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.13" }, "engines": { - "node": ">=8" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "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/archy": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", - "integrity": "sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==", - "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==", + "node_modules/es-iterator-helpers": { + "version": "1.0.15", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.15.tgz", + "integrity": "sha512-GhoY8uYqd6iwUl2kgjTm4CZAf6oo5mHK7BPqx3rKgx893YSsy0LGHV6gfqqQvZt/8xM8xeOnfXBCfqclMKkJ5g==", + "dev": true, "dependencies": { - "delegates": "^1.0.0", - "readable-stream": "^3.6.0" - }, - "engines": { - "node": ">=10" + "asynciterator.prototype": "^1.0.0", + "call-bind": "^1.0.2", + "define-properties": "^1.2.1", + "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.2", + "safe-array-concat": "^1.0.1" } }, - "node_modules/are-we-there-yet/node_modules/readable-stream": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.1.tgz", - "integrity": "sha512-+rQmrWMYGA90yenhTYsLWAsLsqVC8osOw6PKE1HDYiO0gdPeKe/xDHNzIAIn4C91YQ6oenEhfYqqc1883qHbjQ==", + "node_modules/es-set-tostringtag": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.2.tgz", + "integrity": "sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q==", + "dev": true, "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" + "get-intrinsic": "^1.2.2", + "has-tostringtag": "^1.0.0", + "hasown": "^2.0.0" }, "engines": { - "node": ">= 6" - } - }, - "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==", - "dependencies": { - "safe-buffer": "~5.2.0" + "node": ">= 0.4" } }, - "node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "node_modules/es-shim-unscopables": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", + "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", + "dev": true, "dependencies": { - "sprintf-js": "~1.0.2" + "hasown": "^2.0.0" } }, - "node_modules/argv-formatter": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/argv-formatter/-/argv-formatter-1.0.0.tgz", - "integrity": "sha512-F2+Hkm9xFaRg+GkaNnbwXNDV5O6pnCFEmqyhvfC/Ic5LbgOWjJh3L+mN/s91rxVL3znE7DYVpW0GJFT+4YBgWw==" - }, - "node_modules/argv-tools": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/argv-tools/-/argv-tools-0.1.2.tgz", - "integrity": "sha512-wxqoymY0BEu9NblZVQiOTOAiJUjPhaa/kbNMjC2h6bnrmUSgnxKgWJo3lzXvi3bHJRwXyqK/dHzMlZVRT89Cxg==", + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, "dependencies": { - "array-back": "^2.0.0", - "find-replace": "^2.0.1" + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" }, "engines": { - "node": ">=4.0.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/array-back": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/array-back/-/array-back-2.0.0.tgz", - "integrity": "sha512-eJv4pLLufP3g5kcZry0j6WXpIbzYw9GUB4mVJZno9wfwiBxbizTnHCw3VJb07cBihbFX48Y7oSrW9y+gt4glyw==", + "node_modules/es5-ext": { + "version": "0.10.62", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.62.tgz", + "integrity": "sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==", + "dev": true, + "hasInstallScript": true, "dependencies": { - "typical": "^2.6.1" + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.3", + "next-tick": "^1.1.0" }, "engines": { - "node": ">=4" + "node": ">=0.10" } }, - "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-from": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/array-from/-/array-from-2.1.1.tgz", - "integrity": "sha512-GQTc6Uupx1FCavi5mPzBvVT7nEOeWMmUA9P95wpfpW1XwMSKs+KaymD5C2Up7KAUKg/mYwbsUYzdZWcoajlNZg==", + "node_modules/es6-error": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", + "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", "dev": true }, - "node_modules/array-ify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz", - "integrity": "sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==" - }, - "node_modules/array-includes": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz", - "integrity": "sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==", + "node_modules/es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "get-intrinsic": "^1.1.3", - "is-string": "^1.0.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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/arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", - "engines": { - "node": ">=0.10.0" + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" } }, - "node_modules/asn1": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", - "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", + "node_modules/es6-symbol": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", + "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", + "dev": true, "dependencies": { - "safer-buffer": "~2.1.0" - } - }, - "node_modules/assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", - "engines": { - "node": ">=0.8" + "d": "^1.0.1", + "ext": "^1.1.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==", + "node_modules/es6-weak-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.3.tgz", + "integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==", "dev": true, - "engines": { - "node": "*" + "dependencies": { + "d": "1", + "es5-ext": "^0.10.46", + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.1" } }, - "node_modules/astral-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", - "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", - "dev": true, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", "engines": { - "node": ">=4" + "node": ">=6" } }, - "node_modules/async": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", - "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==" - }, - "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/atomic-sleep": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/atomic-sleep/-/atomic-sleep-1.0.0.tgz", - "integrity": "sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==", - "engines": { - "node": ">=8.0.0" - } + "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/available-typed-arrays": { + "node_modules/escape-string-regexp": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", - "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "engines": { - "node": "*" - } - }, - "node_modules/aws4": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz", - "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==" - }, - "node_modules/axios": { - "version": "1.0.0-alpha.1", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.0.0-alpha.1.tgz", - "integrity": "sha512-p+meG161943WT+K7sJYquHR46xxi/z0tk7vnSmEf/LrfEAyiP+0uTMMYk1OEo1IRF18oGRhnFxN1y8fLcXaTMw==", - "dependencies": { - "follow-redirects": "^1.15.0", - "form-data": "^4.0.0", - "proxy-from-env": "^1.1.0" + "node": ">=0.8.0" } }, - "node_modules/babel-code-frame": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", - "integrity": "sha512-XqYMR2dfdGMW+hd0IUZ2PwK+fGeFkOxZJ0wY+JaQAHzt1Zx8LcvpiZD2NiGkEG8qx0CfkAOr5xt76d1e8vG90g==", - "dev": true, - "dependencies": { - "chalk": "^1.1.3", + "node_modules/eslint": { + "version": "8.56.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.56.0.tgz", + "integrity": "sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.56.0", + "@humanwhocodes/config-array": "^0.11.13", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", "esutils": "^2.0.2", - "js-tokens": "^3.0.2" - } - }, - "node_modules/babel-code-frame/node_modules/ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/babel-code-frame/node_modules/chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", - "dev": true, - "dependencies": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" + "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": ">=0.10.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/babel-code-frame/node_modules/js-tokens": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", - "integrity": "sha512-RjTcuD4xjtthQkaWH7dFlH85L+QaVtSoOyGdZ3g6HFhS9dFNDfLyqgm2NFe2X6cQpeFmt0452FJjFG5UameExg==", - "dev": true - }, - "node_modules/babel-code-frame/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==", + "node_modules/eslint-config-google": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/eslint-config-google/-/eslint-config-google-0.14.0.tgz", + "integrity": "sha512-WsbX4WbjuMvTdeVL6+J3rK1RGhCTqjsFjX7UMSMgZiyxxaNLkoJENbrGExzERFeoTpGw3F3FypTiWAP9ZXzkEw==", "dev": true, - "dependencies": { - "ansi-regex": "^2.0.0" - }, "engines": { "node": ">=0.10.0" + }, + "peerDependencies": { + "eslint": ">=5.16.0" } }, - "node_modules/babel-code-frame/node_modules/supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", + "node_modules/eslint-config-standard": { + "version": "17.1.0", + "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-17.1.0.tgz", + "integrity": "sha512-IwHwmaBNtDK4zDHQukFDW5u/aTb8+meQWZvNFWkiGmbWjD6bqyuSSBxxXKkCftCUzc1zwCH2m/baCNDLGmuO5Q==", "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/babel-runtime": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", - "integrity": "sha512-ITKNuq2wKlW1fJg9sSW52eepoYgZBggvOAHC0u/CYu/qxQ9EVzThCgR69BnSXLHjy2f7SY5zaQ4yt7H9ZVxY2g==", - "dependencies": { - "core-js": "^2.4.0", - "regenerator-runtime": "^0.11.0" + "node": ">=12.0.0" + }, + "peerDependencies": { + "eslint": "^8.0.1", + "eslint-plugin-import": "^2.25.2", + "eslint-plugin-n": "^15.0.0 || ^16.0.0 ", + "eslint-plugin-promise": "^6.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==", + "node_modules/eslint-config-standard-jsx": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-standard-jsx/-/eslint-config-standard-jsx-11.0.0.tgz", + "integrity": "sha512-+1EV/R0JxEK1L0NGolAr8Iktm3Rgotx3BKwgaX+eAuSX8D952LULKtjgZD3F+e6SvibONnhLwoTi9DPxN5LvvQ==", "dev": true, "funding": [ { @@ -4359,1501 +4369,1469 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "peerDependencies": { + "eslint": "^8.8.0", + "eslint-plugin-react": "^7.28.0" + } }, - "node_modules/basic-auth": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", - "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", + "node_modules/eslint-import-resolver-node": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", + "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", + "dev": true, "dependencies": { - "safe-buffer": "5.1.2" - }, - "engines": { - "node": ">= 0.8" + "debug": "^3.2.7", + "is-core-module": "^2.13.0", + "resolve": "^1.22.4" } }, - "node_modules/basic-auth/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/bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", + "node_modules/eslint-import-resolver-node/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": { - "tweetnacl": "^0.14.3" + "ms": "^2.1.1" } }, - "node_modules/bdd-lazy-var": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/bdd-lazy-var/-/bdd-lazy-var-2.5.2.tgz", - "integrity": "sha512-EBFk8uOTALu8crLChd+KfhHwv+frhxqE235jcy6NY1G1weB0Gyr5H7u0zvUnr1yduzX6M1I/ERaVGdY1cd+6ZQ==", + "node_modules/eslint-import-resolver-node/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==", "dev": true }, - "node_modules/before-after-hook": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.3.tgz", - "integrity": "sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==" + "node_modules/eslint-import-resolver-node/node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "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/binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "node_modules/eslint-module-utils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz", + "integrity": "sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==", "dev": true, + "dependencies": { + "debug": "^3.2.7" + }, "engines": { - "node": ">=8" + "node": ">=4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } } }, - "node_modules/bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" + "node_modules/eslint-module-utils/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/body-parser": { - "version": "1.20.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", - "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", + "node_modules/eslint-module-utils/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==", + "dev": true + }, + "node_modules/eslint-plugin-es": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-4.1.0.tgz", + "integrity": "sha512-GILhQTnjYE2WorX5Jyi5i4dz5ALWxBIdQECVQavL6s7cI76IZTDWleTHkxz/QT3kvcs2QlGHvKLYsSlPOlPXnQ==", + "dev": true, "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" + "eslint-utils": "^2.0.0", + "regexpp": "^3.0.0" }, "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" + "node": ">=8.10.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=4.19.1" } }, - "node_modules/body-parser/node_modules/qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "node_modules/eslint-plugin-es/node_modules/eslint-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "dev": true, "dependencies": { - "side-channel": "^1.0.4" + "eslint-visitor-keys": "^1.1.0" }, "engines": { - "node": ">=0.6" + "node": ">=6" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/mysticatea" } }, - "node_modules/bottleneck": { - "version": "2.19.5", - "resolved": "https://registry.npmjs.org/bottleneck/-/bottleneck-2.19.5.tgz", - "integrity": "sha512-VHiNCbI1lKdl44tGrhNfU3lup0Tj/ZBMJB5/2ZbNXRCPuRCO7ed2mgcK4r17y+KB2EfuYuRaVlwNbAeaWGSpbw==" + "node_modules/eslint-plugin-es/node_modules/eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true, + "engines": { + "node": ">=4" + } }, - "node_modules/bowser": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.11.0.tgz", - "integrity": "sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==" + "node_modules/eslint-plugin-import": { + "version": "2.29.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz", + "integrity": "sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==", + "dev": true, + "dependencies": { + "array-includes": "^3.1.7", + "array.prototype.findlastindex": "^1.2.3", + "array.prototype.flat": "^1.3.2", + "array.prototype.flatmap": "^1.3.2", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.9", + "eslint-module-utils": "^2.8.0", + "hasown": "^2.0.0", + "is-core-module": "^2.13.1", + "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.15.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^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==", + "node_modules/eslint-plugin-import/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": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "ms": "^2.1.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==", + "node_modules/eslint-plugin-import/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, "dependencies": { - "fill-range": "^7.0.1" + "esutils": "^2.0.2" }, "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, - "node_modules/brotli": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/brotli/-/brotli-1.3.3.tgz", - "integrity": "sha512-oTKjJdShmDuGW94SyyaoQvAjf30dZaHnjJ8uAF+u2/vGJkJbJPJAT1gDiOJP5v1Zb6f9KEyW/1HpuaWIXtGHPg==", + "node_modules/eslint-plugin-import/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": { - "base64-js": "^1.1.2" + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" } }, - "node_modules/browser-stdout": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", - "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", + "node_modules/eslint-plugin-import/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==", "dev": true }, - "node_modules/browserslist": { - "version": "4.21.5", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz", - "integrity": "sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==", + "node_modules/eslint-plugin-import/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, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - } - ], - "dependencies": { - "caniuse-lite": "^1.0.30001449", - "electron-to-chromium": "^1.4.284", - "node-releases": "^2.0.8", - "update-browserslist-db": "^1.0.10" - }, "bin": { - "browserslist": "cli.js" + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-plugin-n": { + "version": "15.7.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-15.7.0.tgz", + "integrity": "sha512-jDex9s7D/Qial8AGVIHq4W7NswpUD5DPDL2RH8Lzd9EloWUuvUkHfv4FRLMipH5q2UtyurorBkPeNi1wVWNh3Q==", + "dev": true, + "dependencies": { + "builtins": "^5.0.1", + "eslint-plugin-es": "^4.1.0", + "eslint-utils": "^3.0.0", + "ignore": "^5.1.1", + "is-core-module": "^2.11.0", + "minimatch": "^3.1.2", + "resolve": "^1.22.1", + "semver": "^7.3.8" }, "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + "node": ">=12.22.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=7.0.0" } }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" - }, - "node_modules/busboy": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", - "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", + "node_modules/eslint-plugin-n/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": { - "streamsearch": "^1.1.0" + "brace-expansion": "^1.1.7" }, "engines": { - "node": ">=10.16.0" + "node": "*" } }, - "node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "node_modules/eslint-plugin-promise": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-6.1.1.tgz", + "integrity": "sha512-tjqWDwVZQo7UIPMeDReOpUgHCmCiH+ePnVT+5zVapL0uuHnegBUs2smM13CzOs2Xb5+MHMRFTs9v24yjba4Oig==", + "dev": true, "engines": { - "node": ">= 0.8" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" } }, - "node_modules/cacache": { - "version": "15.3.0", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.3.0.tgz", - "integrity": "sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==", - "optional": true, + "node_modules/eslint-plugin-react": { + "version": "7.33.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.33.2.tgz", + "integrity": "sha512-73QQMKALArI8/7xGLNI/3LylrEYrlKZSb5C9+q3OtOewTnMQi5cT+aE9E41sLCmli3I9PGGmD1yiZydyo4FEPw==", + "dev": true, "dependencies": { - "@npmcli/fs": "^1.0.0", - "@npmcli/move-file": "^1.0.1", - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "glob": "^7.1.4", - "infer-owner": "^1.0.4", - "lru-cache": "^6.0.0", - "minipass": "^3.1.1", - "minipass-collect": "^1.0.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.2", - "mkdirp": "^1.0.3", - "p-map": "^4.0.0", - "promise-inflight": "^1.0.1", - "rimraf": "^3.0.2", - "ssri": "^8.0.1", - "tar": "^6.0.2", - "unique-filename": "^1.1.1" + "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.12", + "estraverse": "^5.3.0", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.1.2", + "object.entries": "^1.1.6", + "object.fromentries": "^2.0.6", + "object.hasown": "^1.1.2", + "object.values": "^1.1.6", + "prop-types": "^15.8.1", + "resolve": "^2.0.0-next.4", + "semver": "^6.3.1", + "string.prototype.matchall": "^4.0.8" }, "engines": { - "node": ">= 10" + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" } }, - "node_modules/cacache/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==", - "optional": true, + "node_modules/eslint-plugin-react/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, "dependencies": { - "yallist": "^4.0.0" + "esutils": "^2.0.2" }, "engines": { - "node": ">=10" + "node": ">=0.10.0" } }, - "node_modules/cacache/node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "optional": true, - "bin": { - "mkdirp": "bin/cmd.js" + "node_modules/eslint-plugin-react/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": ">=10" + "node": "*" } }, - "node_modules/cacache/node_modules/p-map": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", - "optional": true, + "node_modules/eslint-plugin-react/node_modules/resolve": { + "version": "2.0.0-next.5", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", + "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", + "dev": true, "dependencies": { - "aggregate-error": "^3.0.0" + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" }, - "engines": { - "node": ">=10" + "bin": { + "resolve": "bin/resolve" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/cacache/node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "optional": true, - "dependencies": { - "glob": "^7.1.3" - }, + "node_modules/eslint-plugin-react/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": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "semver": "bin/semver.js" } }, - "node_modules/cacache/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "optional": true - }, - "node_modules/caching-transform": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-4.0.0.tgz", - "integrity": "sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==", + "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": { - "hasha": "^5.0.0", - "make-dir": "^3.0.0", - "package-hash": "^4.0.0", - "write-file-atomic": "^3.0.0" + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" }, "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" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://opencollective.com/eslint" } }, - "node_modules/caller-path": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", - "integrity": "sha512-UJiE1otjXPF5/x+T3zTnSFiTOEmJoGTD9HmBoxnCUwho61a2eSNn/VwtwuIBDAo2SEOv1AJ7ARI5gCmohFLu/g==", + "node_modules/eslint-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", "dev": true, "dependencies": { - "callsites": "^0.2.0" + "eslint-visitor-keys": "^2.0.0" }, "engines": { - "node": ">=0.10.0" + "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=5" } }, - "node_modules/caller-path/node_modules/callsites": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz", - "integrity": "sha512-Zv4Dns9IbXXmPkgRRUjAaJQgfN4xX5p6+RQFhWUqscdvvK2xK/ZL8b3IXIJsj+4sD+f24NwnWy2BY8AJ82JB0A==", + "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", "dev": true, "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "engines": { - "node": ">=6" + "node": ">=10" } }, - "node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "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": ">=6" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/camelcase-keys": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", - "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", + "node_modules/eslint/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": { - "camelcase": "^5.3.1", - "map-obj": "^4.0.0", - "quick-lru": "^4.0.1" + "color-convert": "^2.0.1" }, "engines": { "node": ">=8" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/camelize": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/camelize/-/camelize-1.0.0.tgz", - "integrity": "sha512-W2lPwkBkMZwFlPCXhIlYgxu+7gC/NUlCtdK652DAJ1JdgV0sTrvuPFshNPrFa1TY2JOkLhgdeEBplB4ezEa+xg==" - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001458", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001458.tgz", - "integrity": "sha512-lQ1VlUUq5q9ro9X+5gOEyH7i3vm+AYVT1WDCVB69XOZ17KZRhnZ9J0Sqz7wTHQaLBJccNCHq8/Ww5LlOIZbB0w==", + "node_modules/eslint/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, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - } - ] - }, - "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==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/cardinal": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/cardinal/-/cardinal-2.1.1.tgz", - "integrity": "sha512-JSr5eOgoEymtYHBjNWyjrMqet9Am2miJhlfKNdqLp6zoeAh0KN5dRAcxlecj5mAJrmQomgiOBj35xHLrFjqBpw==", + "node_modules/eslint/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": { - "ansicolors": "~0.3.2", - "redeyed": "~2.1.0" + "color-name": "~1.1.4" }, - "bin": { - "cdl": "bin/cdl.js" + "engines": { + "node": ">=7.0.0" } }, - "node_modules/caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" + "node_modules/eslint/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/chai": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.2.0.tgz", - "integrity": "sha512-XQU3bhBukrOsQCuwZndwGcCVQHyZi53fQ6Ys1Fym7E4olpIqqZZhhoFJoaKVvV17lWQoXYwgWN2nF5crA8J2jw==", + "node_modules/eslint/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": { - "assertion-error": "^1.1.0", - "check-error": "^1.0.2", - "deep-eql": "^3.0.1", - "get-func-name": "^2.0.0", - "pathval": "^1.1.0", - "type-detect": "^4.0.5" + "ms": "2.1.2" }, "engines": { - "node": ">=4" + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "node_modules/chai-as-promised": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/chai-as-promised/-/chai-as-promised-7.1.1.tgz", - "integrity": "sha512-azL6xMoi+uxu6z4rhWQ1jbdUhOMhis2PvscD/xjLqNMkv3BPPp2JyyuTHOrf9BOosGpNQ11v6BKv/g57RXbiaA==", + "node_modules/eslint/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, - "dependencies": { - "check-error": "^1.0.2" + "engines": { + "node": ">=10" }, - "peerDependencies": { - "chai": ">= 2.1.2 < 5" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/chai-http": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/chai-http/-/chai-http-4.2.1.tgz", - "integrity": "sha512-S2Ezy5uSVuOYleeXppfUKtTU/xbHCZyKkwjheNJ/76SGFTUPDpDkkpVdPNgC3sAO1Ap5J5LJ+/rXdLG8EGhCDA==", + "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": { - "@types/chai": "4", - "@types/superagent": "^3.8.3", - "cookiejar": "^2.1.1", - "is-ip": "^2.0.0", - "methods": "^1.1.2", - "qs": "^6.5.1", - "superagent": "^3.7.0" + "is-glob": "^4.0.3" }, "engines": { - "node": ">=4" + "node": ">=10.13.0" } }, - "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==", + "node_modules/eslint/node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "type-fest": "^0.20.2" }, "engines": { - "node": ">=4" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/chardet": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", - "dev": true + "node_modules/eslint/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/charenc": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", - "integrity": "sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==", + "node_modules/eslint/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/charset": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/charset/-/charset-1.0.1.tgz", - "integrity": "sha512-6dVyOOYjpfFcL1Y4qChrAoQLRHvj2ziyhcm0QJlhOcAhykL/k1kTUPbeo+87MNRTRdk2OIIsIXbuF3x2wi5EXg==", + "node_modules/eslint/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/eslint/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": ">=4.0.0" + "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==", + "node_modules/eslint/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": "*" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/child_process": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/child_process/-/child_process-1.0.2.tgz", - "integrity": "sha512-Wmza/JzL0SiWz7kl6MhIKT5ceIlnFPJX+lwUGj7Clhy5MMldsSoJR0+uvRzOS5Kv45Mq7t1PoE8TsOA9bzvb6g==" - }, - "node_modules/chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "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, - "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" + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" }, "engines": { - "node": ">= 8.10.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, - "optionalDependencies": { - "fsevents": "~2.3.2" + "funding": { + "url": "https://opencollective.com/eslint" } }, - "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/circular-json": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz", - "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==", - "deprecated": "CircularJSON is in maintenance only, flatted is its successor.", - "dev": true - }, - "node_modules/clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, "engines": { - "node": ">=6" - } - }, - "node_modules/cli-color": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/cli-color/-/cli-color-1.4.0.tgz", - "integrity": "sha512-xu6RvQqqrWEo6MPR1eixqGPywhYBHRs653F9jfXB2Hx4jdM/3WxiNE1vppRmxtMIfl16SFYTpYlrnqH/HsK/2w==", - "dev": true, - "dependencies": { - "ansi-regex": "^2.1.1", - "d": "1", - "es5-ext": "^0.10.46", - "es6-iterator": "^2.0.3", - "memoizee": "^0.4.14", - "timers-ext": "^0.1.5" + "node": ">=4" } }, - "node_modules/cli-cursor": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", - "integrity": "sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==", + "node_modules/esquery": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.2.tgz", + "integrity": "sha512-JVSoLdTlTDkmjFmab7H/9SL9qGSyjElT3myyKp7krqjVFQCDLmj1QFaCLRFBszBKI0XVZaiiXvuPIX3ZwHe1Ng==", "dev": true, "dependencies": { - "restore-cursor": "^2.0.0" + "estraverse": "^5.1.0" }, "engines": { - "node": ">=4" + "node": ">=0.10" } }, - "node_modules/cli-progress": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/cli-progress/-/cli-progress-3.10.0.tgz", - "integrity": "sha512-kLORQrhYCAtUPLZxqsAt2YJGOvRdt34+O6jl5cQGb7iF3dM55FQZlTR+rQyIK9JUcO9bBMwZsTlND+3dmFU2Cw==", + "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": { - "string-width": "^4.2.0" + "estraverse": "^5.2.0" }, "engines": { - "node": ">=4" + "node": ">=4.0" } }, - "node_modules/cli-progress/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "node_modules/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": ">=8" + "node": ">=4.0" } }, - "node_modules/cli-progress/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "node_modules/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": ">=8" + "node": ">=0.10.0" } }, - "node_modules/cli-progress/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==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, + "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": ">=8" + "node": ">= 0.6" } }, - "node_modules/cli-progress/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "node_modules/event-emitter": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", + "integrity": "sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==", "dev": true, "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" + "d": "1", + "es5-ext": "~0.10.14" } }, - "node_modules/cli-table3": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.1.tgz", - "integrity": "sha512-w0q/enDHhPLq44ovMGdQeeDLvwxwavsJX7oQGYt/LrBlYsyaxyDnp6z3QzFut/6kLLKnlcUVJLrpB7KBfgG/RA==", - "dependencies": { - "string-width": "^4.2.0" - }, + "node_modules/event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", "engines": { - "node": "10.* || >= 12.*" - }, - "optionalDependencies": { - "colors": "1.4.0" + "node": ">=6" } }, - "node_modules/cli-table3/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", "engines": { - "node": ">=8" + "node": ">=0.8.x" + } + }, + "node_modules/eventuate": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/eventuate/-/eventuate-4.0.0.tgz", + "integrity": "sha512-SysKo5/rgqCaXlO4H4DE62JXCFtDpdm+boWOzaeaYph3Xejy04Cc4/E2HDPnOES0MFb643WgKRlx09W2iVAIBw==", + "dependencies": { + "define-error": "~1.0.0", + "object-assign": "~3.0.0", + "shallow-copy": "0.0.1" } }, - "node_modules/cli-table3/node_modules/is-fullwidth-code-point": { + "node_modules/eventuate/node_modules/object-assign": { "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==", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz", + "integrity": "sha512-jHP15vXVGeVh1HuaA2wY6lxk+whK/x4KBG88VXeRma7CCun7iGD5qPc4eYykQ9sdQvg8jkwFKsSxHln2ybW3xQ==", "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, - "node_modules/cli-table3/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "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": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, - "node_modules/cli-table3/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "node_modules/express": { + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", "dependencies": { - "ansi-regex": "^5.0.1" + "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": ">=8" + "node": ">= 0.10.0" } }, - "node_modules/cli-width": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz", - "integrity": "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==", - "dev": true - }, - "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==", + "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": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "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==", + "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": ">=8" + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" } }, - "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==", + "node_modules/express/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": ">=8" + "node": ">= 0.6" } }, - "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==", + "node_modules/express/node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "side-channel": "^1.0.4" }, "engines": { - "node": ">=8" + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "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==", + "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": { - "ansi-regex": "^5.0.1" + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" }, "engines": { - "node": ">=8" + "node": ">= 0.8" } }, - "node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "node_modules/ext": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz", + "integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==", + "dev": true, "dependencies": { - "color-name": "1.1.3" + "type": "^2.7.2" } }, - "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/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/ext/node_modules/type": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/type/-/type-2.7.2.tgz", + "integrity": "sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==", + "dev": true }, - "node_modules/colors": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", - "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", - "devOptional": true, - "engines": { - "node": ">=0.1.90" - } + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" }, - "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/extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", + "engines": [ + "node >=0.6.0" + ] }, - "node_modules/command-line-args": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-5.0.2.tgz", - "integrity": "sha512-/qPcbL8zpqg53x4rAaqMFlRV4opN3pbla7I7k9x8kyOBMQoGT6WltjN6sXZuxOXw6DgdK7Ad+ijYS5gjcr7vlA==", - "dependencies": { - "argv-tools": "^0.1.1", - "array-back": "^2.0.0", - "find-replace": "^2.0.1", - "lodash.camelcase": "^4.3.0", - "typical": "^2.6.1" - }, - "engines": { - "node": ">=4.0.0" - } + "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==" }, - "node_modules/command-line-usage": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-5.0.5.tgz", - "integrity": "sha512-d8NrGylA5oCXSbGoKz05FkehDAzSmIm4K03S5VDh4d5lZAtTWfc3D1RuETtuQCn8129nYfJfDdF7P/lwcz1BlA==", + "node_modules/fast-glob": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", "dependencies": { - "array-back": "^2.0.0", - "chalk": "^2.4.1", - "table-layout": "^0.4.3", - "typical": "^2.6.1" + "@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": ">=4.0.0" + "node": ">=8.6.0" } }, - "node_modules/commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "dev": true, - "engines": { - "node": ">= 10" - } + "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==" }, - "node_modules/commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", + "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/compare-func": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-2.0.0.tgz", - "integrity": "sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==", - "dependencies": { - "array-ify": "^1.0.0", - "dot-prop": "^5.1.0" + "node_modules/fast-redact": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/fast-redact/-/fast-redact-3.3.0.tgz", + "integrity": "sha512-6T5V1QK1u4oF+ATxs1lWUmlEk6P2T9HqJG3e2DnHOdVgZy2rFJBoEnrIedcTXlkAHU/zKC+7KETJ+KGGKwxgMQ==", + "engines": { + "node": ">=6" } }, - "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/fast-safe-stringify": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", + "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==", "dev": true }, - "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/concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "engines": [ - "node >= 0.8" - ], + "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": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" + "reusify": "^1.0.4" } }, - "node_modules/concat-stream/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/concat-stream/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==", + "node_modules/figures": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "integrity": "sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA==", "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" + "escape-string-regexp": "^1.0.5" + }, + "engines": { + "node": ">=4" } }, - "node_modules/concat-stream/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/concat-stream/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==", + "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": { - "safe-buffer": "~5.1.0" + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" } }, - "node_modules/concurrent-queue": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/concurrent-queue/-/concurrent-queue-7.0.2.tgz", - "integrity": "sha512-icXDqc0JBdcQ3ubXiXcqVhuFeRrec39zVD2X5z7FKwwj0pImnfLWtAhGyX4CcBDD+YoqLesClOeRss+pZnm6/Q==", - "dependencies": { - "afterward": "~2.0.0", - "define-error": "~1.0.0", - "eventuate": "~4.0.0", - "object-assign": "~4.0.1", - "on-error": "~2.1.0", - "once": "~1.3.2", - "promise-polyfill": "~2.1.0" + "node_modules/file-type": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz", + "integrity": "sha512-RLoqTXE8/vPmMuTI88DAzhMYC99I8BWv7zYP4A1puo5HIjEJ5EX48ighy4ZyKMG9EDXxBgW6e++cn7d1xuFghA==", + "dev": true, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/config-chain": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", - "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", + "node_modules/filelist": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", + "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", "dependencies": { - "ini": "^1.3.4", - "proto-list": "~1.2.1" + "minimatch": "^5.0.1" } }, - "node_modules/config-chain/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/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/contains-path": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", - "integrity": "sha512-OKZnPGeMQy2RPaUIBPFFd71iNf4791H12MCRuVQDnzGRwCYNYmTDy5pdafo2SLAcEMKzTOQnLWG4QdcjeJUMEg==", - "dev": true, - "engines": { - "node": ">=0.10.0" + "node_modules/filelist/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dependencies": { + "balanced-match": "^1.0.0" } }, - "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==", + "node_modules/filelist/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", "dependencies": { - "safe-buffer": "5.2.1" + "brace-expansion": "^2.0.1" }, "engines": { - "node": ">= 0.6" + "node": ">=10" } }, - "node_modules/content-security-policy-builder": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/content-security-policy-builder/-/content-security-policy-builder-2.1.0.tgz", - "integrity": "sha512-/MtLWhJVvJNkA9dVLAp6fg9LxD2gfI6R2Fi1hPmfjYXSahJJzcfvoeDOxSyp4NvxMuwWv3WMssE9o31DoULHrQ==", + "node_modules/filesize": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/filesize/-/filesize-10.1.0.tgz", + "integrity": "sha512-GTLKYyBSDz3nPhlLVPjPWZCnhkd9TrrRArNcy8Z+J2cqScB7h2McAzR6NBX6nYOoWafql0roY8hrocxnZBv9CQ==", + "dev": true, "engines": { - "node": ">=4.0.0" + "node": ">= 10.4.0" } }, - "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==", + "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": ">= 0.6" + "node": ">=8" } }, - "node_modules/conventional-changelog-angular": { - "version": "5.0.13", - "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-5.0.13.tgz", - "integrity": "sha512-i/gipMxs7s8L/QeuavPF2hLnJgH6pEZAttySB6aiQLWcX3puWDL3ACVmvBhJGxnAy52Qc15ua26BufY6KpmrVA==", + "node_modules/finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", "dependencies": { - "compare-func": "^2.0.0", - "q": "^1.5.1" + "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": ">=10" + "node": ">= 0.8" } }, - "node_modules/conventional-changelog-writer": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-5.0.1.tgz", - "integrity": "sha512-5WsuKUfxW7suLblAbFnxAcrvf6r+0b7GvNaWUwUIk0bXMnENP/PEieGKVUQrjPqwPT4o3EPAASBXiY6iHooLOQ==", + "node_modules/find-cache-dir": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", + "dev": true, "dependencies": { - "conventional-commits-filter": "^2.0.7", - "dateformat": "^3.0.0", - "handlebars": "^4.7.7", - "json-stringify-safe": "^5.0.1", - "lodash": "^4.17.15", - "meow": "^8.0.0", - "semver": "^6.0.0", - "split": "^1.0.0", - "through2": "^4.0.0" - }, - "bin": { - "conventional-changelog-writer": "cli.js" + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" }, "engines": { - "node": ">=10" - } - }, - "node_modules/conventional-changelog-writer/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "bin": { - "semver": "bin/semver.js" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/avajs/find-cache-dir?sponsor=1" } }, - "node_modules/conventional-commits-filter": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-2.0.7.tgz", - "integrity": "sha512-ASS9SamOP4TbCClsRHxIHXRfcGCnIoQqkvAzCSbZzTFLfcTqJVugB0agRgsEELsqaeWgsXv513eS116wnlSSPA==", + "node_modules/find-replace": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-3.0.0.tgz", + "integrity": "sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ==", "dependencies": { - "lodash.ismatch": "^4.4.0", - "modify-values": "^1.0.0" + "array-back": "^3.0.1" }, "engines": { - "node": ">=10" + "node": ">=4.0.0" } }, - "node_modules/conventional-commits-parser": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-3.2.4.tgz", - "integrity": "sha512-nK7sAtfi+QXbxHCYfhpZsfRtaitZLIA6889kFIouLvz6repszQDgxBu7wf2WbU+Dco7sAnNCJYERCwt54WPC2Q==", + "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": { - "is-text-path": "^1.0.1", - "JSONStream": "^1.0.4", - "lodash": "^4.17.15", - "meow": "^8.0.0", - "split2": "^3.0.0", - "through2": "^4.0.0" - }, - "bin": { - "conventional-commits-parser": "cli.js" + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" }, "engines": { "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "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.3.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", - "integrity": "sha512-+IJOX0OqlHCszo2mBUq+SrEbCj6w7Kpffqx60zYbPTFaO4+yYgRjHwcZNpWvaTylDHaV7PPmBHzSecZiMhtPgw==", + "node_modules/find-up-simple": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/find-up-simple/-/find-up-simple-1.0.0.tgz", + "integrity": "sha512-q7Us7kcjj2VMePAa02hDAF6d+MzsdsAWEwYyOpwUtlerRBkOEPBCRZrAV4XfcSN8fHAgaD0hP7miwoay6DCprw==", "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie-parser": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.4.3.tgz", - "integrity": "sha512-EZyO2G+zVFsMjU8jDtxs2iLS1DmryYNjC0s4/IHtsS6pWPUJSr0kt0UPOctRZosebPHYekb7bNcIBt4YW0S9bg==", - "dependencies": { - "cookie": "0.3.1", - "cookie-signature": "1.0.6" + "node": ">=18" }, - "engines": { - "node": ">= 0.8.0" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "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/cookiejar": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.4.tgz", - "integrity": "sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==", - "dev": true - }, - "node_modules/core-js": { - "version": "2.6.12", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz", - "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==", - "deprecated": "core-js@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js.", - "hasInstallScript": 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/cors": { - "version": "2.8.5", - "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", - "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "node_modules/find-versions": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/find-versions/-/find-versions-5.1.0.tgz", + "integrity": "sha512-+iwzCJ7C5v5KgcBuueqVoNiHVoQpwiUK5XFLjf0affFTep+Wcw93tPvmb8tqujDNmzhBDPddnWV/qgWSXgq+Hg==", "dependencies": { - "object-assign": "^4", - "vary": "^1" + "semver-regex": "^4.0.5" }, "engines": { - "node": ">= 0.10" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/cosmiconfig": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", - "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", - "dependencies": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" - }, - "engines": { - "node": ">=10" + "node_modules/flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "dev": true, + "bin": { + "flat": "cli.js" } }, - "node_modules/cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "node_modules/flat-cache": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "dev": true, "dependencies": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" }, "engines": { - "node": ">=4.8" + "node": "^10.12.0 || >=12.0.0" } }, - "node_modules/crypt": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz", - "integrity": "sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==", - "dev": true, - "engines": { - "node": "*" - } + "node_modules/flatted": { + "version": "3.2.9", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz", + "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==", + "dev": true }, - "node_modules/crypto-random-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", - "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", + "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": ">=8" + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } } }, - "node_modules/csv-parse": { - "version": "4.16.3", - "resolved": "https://registry.npmjs.org/csv-parse/-/csv-parse-4.16.3.tgz", - "integrity": "sha512-cO1I/zmz4w2dcKHVvpCr7JVRu8/FymG5OEpmvsZYlccYolPBLoVGKUHgNoc4ZGkFeFlWGEDmMyBM+TTqRdW/wg==", - "dev": true - }, - "node_modules/d": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", - "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", + "node_modules/for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", "dev": true, "dependencies": { - "es5-ext": "^0.10.50", - "type": "^1.0.1" - } - }, - "node_modules/daemonize2": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/daemonize2/-/daemonize2-0.4.2.tgz", - "integrity": "sha512-dzB3qdxvcJ2AWyESI8xv90qZ4wZt4P+lvQUT1sVKcrbEKSvBk/8zkDlZvMyaWmoKe7DXLGu00z59b7K9gkzbqQ==", - "engines": { - "node": ">0.8.x" + "is-callable": "^1.1.3" } }, - "node_modules/dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", + "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": { - "assert-plus": "^1.0.0" + "cross-spawn": "^7.0.0", + "signal-exit": "^3.0.2" }, "engines": { - "node": ">=0.10" + "node": ">=8.0.0" } }, - "node_modules/dasherize": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dasherize/-/dasherize-2.0.0.tgz", - "integrity": "sha512-APql/TZ6FdLEpf2z7/X2a2zyqK8juYtqaSVqxw9mYoQ64CXkfU15AeLh8pUszT8+fnYjgm6t0aIYpWKJbnLkuA==" - }, - "node_modules/dateformat": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz", - "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==", + "node_modules/forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", "engines": { "node": "*" } }, - "node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "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": { - "ms": "2.0.0" - } - }, - "node_modules/debug-log": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/debug-log/-/debug-log-1.0.1.tgz", - "integrity": "sha512-gV/pe1YIaKNgLYnd1g9VNW80tcb7oV5qvNUxG7NM8rbDpnl6RGunzlAtlGSb0wEs3nesu2vHNiX9TSsZ+Y+RjA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "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==", + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, "engines": { - "node": ">=0.10.0" + "node": ">= 6" } }, - "node_modules/decamelize-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.1.tgz", - "integrity": "sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==", + "node_modules/formidable": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/formidable/-/formidable-3.5.1.tgz", + "integrity": "sha512-WJWKelbRHN41m5dumb0/k8TeAx7Id/y3a+Z7QfhxP/htI9Js5zYaEDtG8uMgG0vM0lOlqnmjE99/kfpOYi/0Og==", "dependencies": { - "decamelize": "^1.1.0", - "map-obj": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" + "dezalgo": "^1.0.4", + "hexoid": "^1.0.0", + "once": "^1.4.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://ko-fi.com/tunnckoCore/commissions" } }, - "node_modules/decamelize-keys/node_modules/map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==", - "engines": { - "node": ">=0.10.0" + "node_modules/formidable/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/deep-eql": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", - "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", - "dev": true, - "dependencies": { - "type-detect": "^4.0.0" - }, + "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.12" + "node": ">= 0.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==", + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", "engines": { - "node": ">=4.0.0" + "node": ">= 0.6" } }, - "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/default-require-extensions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-3.0.1.tgz", - "integrity": "sha512-eXTJmRbm2TIt9MgWTsOH1wEuhew6XGZcMeGKCtLedIg/NCsg1iBePXkceTdK4Fii7pzmN9tGsZhKzZ4h7O/fxw==", - "dev": true, + "node_modules/from2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", + "integrity": "sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==", "dependencies": { - "strip-bom": "^4.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" } }, - "node_modules/define-error": { + "node_modules/from2/node_modules/isarray": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-error/-/define-error-1.0.0.tgz", - "integrity": "sha512-HLdUb9mNENZ/tjnZGlITfOnx7wSM7a6e+WEDyhKSrsN/g5dJUS6kepG6qJApRLAdjRofQ2W8R3yrtI6GeyGGVg==", + "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": { - "capture-stack-trace": "~1.0.0" + "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/define-properties": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", - "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", + "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==" + }, + "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/fromentries": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/fromentries/-/fromentries-1.3.2.tgz", + "integrity": "sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==", "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/fs-extra": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", + "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", "dependencies": { - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=14.14" } }, - "node_modules/deglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/deglob/-/deglob-2.1.1.tgz", - "integrity": "sha512-2kjwuGGonL7gWE1XU4Fv79+vVzpoQCl0V+boMwWtOQJV2AGDabCwez++nB1Nli/8BabAfZQ/UuHPlp6AymKdWw==", - "dev": true, + "node_modules/fs-extra/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "engines": { + "node": ">= 10.0.0" + } + }, + "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": { - "find-root": "^1.0.0", - "glob": "^7.0.5", - "ignore": "^3.0.9", - "pkg-config": "^1.1.0", - "run-parallel": "^1.1.2", - "uniq": "^1.0.1" + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" } }, - "node_modules/deglob/node_modules/ignore": { - "version": "3.3.10", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", - "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==", - "dev": true + "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/del": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/del/-/del-6.1.1.tgz", - "integrity": "sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg==", - "dependencies": { - "globby": "^11.0.1", - "graceful-fs": "^4.2.4", - "is-glob": "^4.0.1", - "is-path-cwd": "^2.2.0", - "is-path-inside": "^3.0.2", - "p-map": "^4.0.0", - "rimraf": "^3.0.2", - "slash": "^3.0.0" - }, + "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": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, - "node_modules/del/node_modules/p-map": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "node_modules/ftp": { + "version": "0.3.10", + "resolved": "https://registry.npmjs.org/ftp/-/ftp-0.3.10.tgz", + "integrity": "sha512-faFVML1aBx2UoDStmLwv2Wptt4vw5x03xxX172nhA5Y5HBshW5JweqQ2W4xL4dezQTG8inJsuYcpPHHU3X5OTQ==", "dependencies": { - "aggregate-error": "^3.0.0" + "readable-stream": "1.1.x", + "xregexp": "2.0.0" }, "engines": { - "node": ">=10" - }, + "node": ">=0.8.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/del/node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "node_modules/function.prototype.name": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", + "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", + "dev": true, "dependencies": { - "glob": "^7.1.3" + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "functions-have-names": "^1.2.3" }, - "bin": { - "rimraf": "bin.js" + "engines": { + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/sponsors/ljharb" } }, - "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/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "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==", + "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": ">= 0.8" + "node": ">=10" } }, - "node_modules/deprecation": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz", - "integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==" + "node_modules/gauge/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/destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" + "node": ">=6.9.0" } }, - "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==", + "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": ">=8" + "node": "6.* || 8.* || >= 10.*" } }, - "node_modules/diff": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", - "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", + "node_modules/get-func-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", + "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==", "dev": true, "engines": { - "node": ">=0.3.1" + "node": "*" } }, - "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==", + "node_modules/get-intrinsic": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz", + "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==", "dependencies": { - "path-type": "^4.0.0" + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" }, - "engines": { - "node": ">=8" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/dns-prefetch-control": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/dns-prefetch-control/-/dns-prefetch-control-0.2.0.tgz", - "integrity": "sha512-hvSnros73+qyZXhHFjx2CMLwoj3Fe7eR9EJsFsqmcI1bB2OBWL/+0YzaEaKssCHnj/6crawNnUyw74Gm2EKe+Q==", + "node_modules/get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true, "engines": { - "node": ">=4.0.0" + "node": ">=8.0.0" } }, - "node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "node_modules/get-stdin": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-8.0.0.tgz", + "integrity": "sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg==", "dev": true, - "dependencies": { - "esutils": "^2.0.2" - }, "engines": { - "node": ">=6.0.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/dont-sniff-mimetype": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/dont-sniff-mimetype/-/dont-sniff-mimetype-1.1.0.tgz", - "integrity": "sha512-ZjI4zqTaxveH2/tTlzS1wFp+7ncxNZaIEWYg3lzZRHkKf5zPT/MnEG6WL0BhHMJUabkh8GeU5NL5j+rEUCb7Ug==", + "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==", "engines": { - "node": ">=4.0.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/dot-prop": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", - "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", + "node_modules/get-symbol-description": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "dev": true, "dependencies": { - "is-obj": "^2.0.0" + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" }, "engines": { - "node": ">=8" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/dottie": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/dottie/-/dottie-2.0.3.tgz", - "integrity": "sha512-4liA0PuRkZWQFQjwBypdxPfZaRWiv5tkhMXY2hzsa2pNf5s7U3m9cwUchfNKe8wZQxdGPQQzO6Rm2uGe0rvohQ==" + "node_modules/getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", + "dependencies": { + "assert-plus": "^1.0.0" + } }, - "node_modules/duplexer2": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", - "integrity": "sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==", + "node_modules/git-log-parser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/git-log-parser/-/git-log-parser-1.2.0.tgz", + "integrity": "sha512-rnCVNfkTL8tdNryFuaY0fYiBWEBcgF748O6ZI61rslBvr2o7U65c2/6npCRqH40vuAhtgtDiqLTJjBVdrejCzA==", "dependencies": { - "readable-stream": "^2.0.2" + "argv-formatter": "~1.0.0", + "spawn-error-forwarder": "~1.0.0", + "split2": "~1.0.0", + "stream-combiner2": "~1.1.1", + "through2": "~2.0.0", + "traverse": "~0.6.6" } }, - "node_modules/duplexer2/node_modules/isarray": { + "node_modules/git-log-parser/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/duplexer2/node_modules/readable-stream": { + "node_modules/git-log-parser/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==", @@ -5867,12 +5845,20 @@ "util-deprecate": "~1.0.1" } }, - "node_modules/duplexer2/node_modules/safe-buffer": { + "node_modules/git-log-parser/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/duplexer2/node_modules/string_decoder": { + "node_modules/git-log-parser/node_modules/split2": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-1.0.0.tgz", + "integrity": "sha512-NKywug4u4pX/AZBB1FCPzZ6/7O+Xhz1qMVbzTvvKvikjO99oPN87SkK08mEY9P63/5lWjK+wgOOgApnTg5r6qg==", + "dependencies": { + "through2": "~2.0.0" + } + }, + "node_modules/git-log-parser/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==", @@ -5880,333 +5866,247 @@ "safe-buffer": "~5.1.0" } }, - "node_modules/ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", + "node_modules/git-log-parser/node_modules/through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", "dependencies": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" } }, - "node_modules/editorconfig": { - "version": "0.15.3", - "resolved": "https://registry.npmjs.org/editorconfig/-/editorconfig-0.15.3.tgz", - "integrity": "sha512-M9wIMFx96vq0R4F+gRpY3o2exzb8hEj/n9S8unZtHSvYjibBp/iMufSzvmOcV/laG0ZtuTVGtiJggPOSW2r93g==", - "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": { - "commander": "^2.19.0", - "lru-cache": "^4.1.5", - "semver": "^5.6.0", - "sigmund": "^1.0.1" + "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" }, - "bin": { - "editorconfig": "bin/editorconfig" - } - }, - "node_modules/editorconfig/node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true - }, - "node_modules/editorconfig/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==", - "dev": true, - "dependencies": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/editorconfig/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==", - "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/ejs": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.7.tgz", - "integrity": "sha512-BIar7R6abbUxDA3bfXrO4DSgwo8I+fB5/1zgujl3HLLjwd6+9iOnrT+t3grn2qbk9vOgBubXOFwX2m9axoFaGw==", + "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": { - "jake": "^10.8.5" - }, - "bin": { - "ejs": "bin/cli.js" + "is-glob": "^4.0.1" }, "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/electron-to-chromium": { - "version": "1.4.313", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.313.tgz", - "integrity": "sha512-QckB9OVqr2oybjIrbMI99uF+b9+iTja5weFe0ePbqLb5BHqXOJUO1SG6kDj/1WtWPRIBr51N153AEq8m7HuIaA==", - "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/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/encoding": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", - "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", - "optional": true, - "dependencies": { - "iconv-lite": "^0.6.2" + "node": ">= 6" } }, - "node_modules/encoding/node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "optional": true, + "node_modules/glob/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": { - "safer-buffer": ">= 2.1.2 < 3.0.0" + "brace-expansion": "^1.1.7" }, "engines": { - "node": ">=0.10.0" - } - }, - "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": "*" } }, - "node_modules/end-of-stream/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==", + "node_modules/global-agent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-agent/-/global-agent-3.0.0.tgz", + "integrity": "sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q==", + "dev": true, "dependencies": { - "wrappy": "1" + "boolean": "^3.0.1", + "es6-error": "^4.1.1", + "matcher": "^3.0.0", + "roarr": "^2.15.3", + "semver": "^7.3.2", + "serialize-error": "^7.0.1" + }, + "engines": { + "node": ">=10.0" } }, - "node_modules/env-ci": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/env-ci/-/env-ci-5.5.0.tgz", - "integrity": "sha512-o0JdWIbOLP+WJKIUt36hz1ImQQFuN92nhsfTkHHap+J8CiI8WgGpH/a9jEGHh4/TU5BUUGjlnKXNoDb57+ne+A==", - "dependencies": { - "execa": "^5.0.0", - "fromentries": "^1.3.2", - "java-properties": "^1.0.0" - }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, "engines": { - "node": ">=10.17" + "node": ">=4" } }, - "node_modules/env-ci/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==", + "node_modules/globalthis": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", + "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "dev": true, "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" + "define-properties": "^1.1.3" }, "engines": { - "node": ">= 8" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/env-ci/node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "node_modules/globby": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-14.0.0.tgz", + "integrity": "sha512-/1WM/LNHRAOH9lZta77uGbq0dAEQM+XjNesWwhlERDVenqothRbnzTrL3/LrIoEPPjeUHC3vrS6TwoyxeHs7MQ==", "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" + "@sindresorhus/merge-streams": "^1.0.0", + "fast-glob": "^3.3.2", + "ignore": "^5.2.4", + "path-type": "^5.0.0", + "slash": "^5.1.0", + "unicorn-magic": "^0.1.0" }, "engines": { - "node": ">=10" + "node": ">=18" }, "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/env-ci/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==", + "node_modules/globby/node_modules/path-type": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-5.0.0.tgz", + "integrity": "sha512-5HviZNaZcfqP95rwpv+1HDgUamezbqdSYTyzjTvwtJSnIH+3vnbmWsItli8OFEndS984VT55M3jduxZbX351gg==", "engines": { - "node": ">=10" + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/env-ci/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==", - "engines": { - "node": ">=8" + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dependencies": { + "get-intrinsic": "^1.1.3" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/env-ci/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==", - "engines": { - "node": ">=6" - } + "node_modules/graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" }, - "node_modules/env-ci/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==", - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } + "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/env-ci/node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "node_modules/handlebars": { + "version": "4.7.8", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", + "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", "dependencies": { - "mimic-fn": "^2.1.0" + "minimist": "^1.2.5", + "neo-async": "^2.6.2", + "source-map": "^0.6.1", + "wordwrap": "^1.0.0" + }, + "bin": { + "handlebars": "bin/handlebars" }, "engines": { - "node": ">=6" + "node": ">=0.4.7" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "optionalDependencies": { + "uglify-js": "^3.1.4" } }, - "node_modules/env-ci/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==", + "node_modules/har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==", "engines": { - "node": ">=8" + "node": ">=4" } }, - "node_modules/env-ci/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==", + "node_modules/har-validator": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", + "deprecated": "this library is no longer supported", "dependencies": { - "shebang-regex": "^3.0.0" + "ajv": "^6.12.3", + "har-schema": "^2.0.0" }, "engines": { - "node": ">=8" + "node": ">=6" + } + }, + "node_modules/has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/env-ci/node_modules/shebang-regex": { + "node_modules/has-flag": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "engines": { - "node": ">=8" + "node": ">=4" } }, - "node_modules/env-ci/node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "node_modules/has-property-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz", + "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==", "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" + "get-intrinsic": "^1.2.2" }, - "engines": { - "node": ">= 8" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/env-paths": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", - "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", - "optional": true, + "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": ">=6" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/err-code": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", - "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", - "optional": true - }, - "node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dependencies": { - "is-arrayish": "^0.2.1" + "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/es-abstract": { - "version": "1.21.1", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.1.tgz", - "integrity": "sha512-QudMsPOz86xYz/1dG1OuGBKOELjCh99IIWHLzy5znUB6j8xG2yMA7bfTV86VSqKF+Y/H08vQPR+9jyXpuC6hfg==", + "node_modules/has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", "dev": true, "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "es-set-tostringtag": "^2.0.1", - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "function.prototype.name": "^1.1.5", - "get-intrinsic": "^1.1.3", - "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.4", - "is-array-buffer": "^3.0.1", - "is-callable": "^1.2.7", - "is-negative-zero": "^2.0.2", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", - "is-string": "^1.0.7", - "is-typed-array": "^1.1.10", - "is-weakref": "^1.0.2", - "object-inspect": "^1.12.2", - "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.4.3", - "safe-regex-test": "^1.0.0", - "string.prototype.trimend": "^1.0.6", - "string.prototype.trimstart": "^1.0.6", - "typed-array-length": "^1.0.4", - "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.9" + "has-symbols": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -6215,2026 +6115,1787 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/es-set-tostringtag": { + "node_modules/has-unicode": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", - "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==" + }, + "node_modules/hasha": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.2.tgz", + "integrity": "sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==", "dev": true, "dependencies": { - "get-intrinsic": "^1.1.3", - "has": "^1.0.3", - "has-tostringtag": "^1.0.0" + "is-stream": "^2.0.0", + "type-fest": "^0.8.0" }, "engines": { - "node": ">= 0.4" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, + "node_modules/hasown": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", + "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", "dependencies": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" + "function-bind": "^1.1.2" }, "engines": { "node": ">= 0.4" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true, + "bin": { + "he": "bin/he" + } + }, + "node_modules/helmet": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/helmet/-/helmet-7.1.0.tgz", + "integrity": "sha512-g+HZqgfbpXdCkme/Cd/mZkV0aV3BZZZSugecH03kl38m/Kmdx8jKjBikpDj2cr+Iynv4KpYEviojNdTJActJAg==", + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/hexoid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hexoid/-/hexoid-1.0.0.tgz", + "integrity": "sha512-QFLV0taWQOZtvIRIAdBChesmogZrtuXvVWsFHZTk2SU+anspqZ2vMnoLg7IE1+Uk16N19APic1BuF8bC8c2m5g==", + "engines": { + "node": ">=8" + } + }, + "node_modules/hook-std": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hook-std/-/hook-std-3.0.0.tgz", + "integrity": "sha512-jHRQzjSDzMtFy34AGj1DN+vq54WVuhSvKgrHf0OMiFQTwDD4L/qqofVEWjLOBMTn5+lCD3fPg32W9yOfnEJTTw==", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/es5-ext": { - "version": "0.10.62", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.62.tgz", - "integrity": "sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==", - "dev": true, - "hasInstallScript": true, + "node_modules/hosted-git-info": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.1.tgz", + "integrity": "sha512-+K84LB1DYwMHoHSgaOY/Jfhw3ucPmSET5v98Ke/HdNSw4a0UktWzyW1mjhjpuxxTqOOsfWT/7iVshHmVZ4IpOA==", "dependencies": { - "es6-iterator": "^2.0.3", - "es6-symbol": "^3.1.3", - "next-tick": "^1.1.0" + "lru-cache": "^10.0.1" }, "engines": { - "node": ">=0.10" + "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/es6-error": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", - "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", + "node_modules/hosted-git-info/node_modules/lru-cache": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.1.0.tgz", + "integrity": "sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag==", + "engines": { + "node": "14 || >=16.14" + } + }, + "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/es6-iterator": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", - "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==", - "dev": true, - "dependencies": { - "d": "1", - "es5-ext": "^0.10.35", - "es6-symbol": "^3.1.1" - } - }, - "node_modules/es6-symbol": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", - "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", - "dev": true, - "dependencies": { - "d": "^1.0.1", - "ext": "^1.1.2" - } + "node_modules/http-cache-semantics": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", + "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", + "optional": true }, - "node_modules/es6-weak-map": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.3.tgz", - "integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==", - "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": { - "d": "1", - "es5-ext": "^0.10.46", - "es6-iterator": "^2.0.3", - "es6-symbol": "^3.1.1" - } - }, - "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==", + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, "engines": { - "node": ">=0.8.0" + "node": ">= 0.8" } }, - "node_modules/eslint": { - "version": "5.14.1", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-5.14.1.tgz", - "integrity": "sha512-CyUMbmsjxedx8B0mr79mNOqetvkbij/zrXnFeK2zc3pGRn3/tibjiNAv/3UxFEyfMDjh+ZqTrJrEGBFiGfD5Og==", - "dev": true, + "node_modules/http-proxy-agent": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.0.tgz", + "integrity": "sha512-+ZT+iBxVUQ1asugqnD6oWoRiS25AkjNfG085dKJGtGxkdwLQrMKU5wJr2bOOFAXzKcTuqq+7fZlTMgG3SRfIYQ==", "dependencies": { - "@babel/code-frame": "^7.0.0", - "ajv": "^6.9.1", - "chalk": "^2.1.0", - "cross-spawn": "^6.0.5", - "debug": "^4.0.1", - "doctrine": "^3.0.0", - "eslint-scope": "^4.0.0", - "eslint-utils": "^1.3.1", - "eslint-visitor-keys": "^1.0.0", - "espree": "^5.0.1", - "esquery": "^1.0.1", - "esutils": "^2.0.2", - "file-entry-cache": "^5.0.1", - "functional-red-black-tree": "^1.0.1", - "glob": "^7.1.2", - "globals": "^11.7.0", - "ignore": "^4.0.6", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "inquirer": "^6.2.2", - "js-yaml": "^3.12.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.3.0", - "lodash": "^4.17.11", - "minimatch": "^3.0.4", - "mkdirp": "^0.5.1", - "natural-compare": "^1.4.0", - "optionator": "^0.8.2", - "path-is-inside": "^1.0.2", - "progress": "^2.0.0", - "regexpp": "^2.0.1", - "semver": "^5.5.1", - "strip-ansi": "^4.0.0", - "strip-json-comments": "^2.0.1", - "table": "^5.2.3", - "text-table": "^0.2.0" - }, - "bin": { - "eslint": "bin/eslint.js" + "agent-base": "^7.1.0", + "debug": "^4.3.4" }, "engines": { - "node": "^6.14.0 || ^8.10.0 || >=9.10.0" - } - }, - "node_modules/eslint-config-google": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/eslint-config-google/-/eslint-config-google-0.12.0.tgz", - "integrity": "sha512-SHDM3nIRCJBACjf8c/H6FvCwRmKbphESNl3gJFBNbw4KYDLCONB3ABYLXDGF+iaVP9XSTND/Q5/PuGoFkp4xbg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - }, - "peerDependencies": { - "eslint": ">=5.4.0" - } - }, - "node_modules/eslint-config-standard": { - "version": "12.0.0", - "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-12.0.0.tgz", - "integrity": "sha512-COUz8FnXhqFitYj4DTqHzidjIL/t4mumGZto5c7DrBpvWoie+Sn3P4sLEzUGeYhRElWuFEf8K1S1EfvD1vixCQ==", - "dev": true, - "peerDependencies": { - "eslint": ">=5.0.0", - "eslint-plugin-import": ">=2.13.0", - "eslint-plugin-node": ">=7.0.0", - "eslint-plugin-promise": ">=4.0.0", - "eslint-plugin-standard": ">=4.0.0" - } - }, - "node_modules/eslint-config-standard-jsx": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/eslint-config-standard-jsx/-/eslint-config-standard-jsx-6.0.2.tgz", - "integrity": "sha512-D+YWAoXw+2GIdbMBRAzWwr1ZtvnSf4n4yL0gKGg7ShUOGXkSOLerI17K4F6LdQMJPNMoWYqepzQD/fKY+tXNSg==", - "dev": true, - "peerDependencies": { - "eslint": ">=5.0.0", - "eslint-plugin-react": ">=7.11.1" - } - }, - "node_modules/eslint-import-resolver-node": { - "version": "0.3.7", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.7.tgz", - "integrity": "sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA==", - "dev": true, - "dependencies": { - "debug": "^3.2.7", - "is-core-module": "^2.11.0", - "resolve": "^1.22.1" + "node": ">= 14" } }, - "node_modules/eslint-import-resolver-node/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, + "node_modules/http-proxy-agent/node_modules/agent-base": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.0.tgz", + "integrity": "sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==", "dependencies": { - "ms": "^2.1.1" + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" } }, - "node_modules/eslint-import-resolver-node/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==", - "dev": true - }, - "node_modules/eslint-module-utils": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.4.tgz", - "integrity": "sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA==", - "dev": true, + "node_modules/http-proxy-agent/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dependencies": { - "debug": "^3.2.7" + "ms": "2.1.2" }, "engines": { - "node": ">=4" + "node": ">=6.0" }, "peerDependenciesMeta": { - "eslint": { + "supports-color": { "optional": true } } }, - "node_modules/eslint-module-utils/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/http-proxy-agent/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/eslint-module-utils/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/http-reasons": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/http-reasons/-/http-reasons-0.1.0.tgz", + "integrity": "sha512-P6kYh0lKZ+y29T2Gqz+RlC9WBLhKe8kDmcJ+A+611jFfxdPsbMRQ5aNmFRM3lENqFkK+HTTL+tlQviAiv0AbLQ==", "dev": true }, - "node_modules/eslint-plugin-es": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-1.4.1.tgz", - "integrity": "sha512-5fa/gR2yR3NxQf+UXkeLeP8FBBl6tSgdrAz1+cF84v1FMM4twGwQoqTnn+QxFLcPOrF4pdKEJKDB/q9GoyJrCA==", + "node_modules/http-signature": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.3.6.tgz", + "integrity": "sha512-3adrsD6zqo4GsTqtO7FyrejHNv+NgiIfAfv68+jVlFmSr9OGy7zrxONceFRLKvnnZA5jbxQBX1u9PpB6Wi32Gw==", "dev": true, "dependencies": { - "eslint-utils": "^1.4.2", - "regexpp": "^2.0.1" + "assert-plus": "^1.0.0", + "jsprim": "^2.0.2", + "sshpk": "^1.14.1" }, "engines": { - "node": ">=6.5.0" - }, - "peerDependencies": { - "eslint": ">=4.19.1" + "node": ">=0.10" } }, - "node_modules/eslint-plugin-import": { - "version": "2.14.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.14.0.tgz", - "integrity": "sha512-FpuRtniD/AY6sXByma2Wr0TXvXJ4nA/2/04VPlfpmUDPOpOY264x+ILiwnrk/k4RINgDAyFZByxqPUbSQ5YE7g==", + "node_modules/httpntlm": { + "version": "1.8.13", + "resolved": "https://registry.npmjs.org/httpntlm/-/httpntlm-1.8.13.tgz", + "integrity": "sha512-2F2FDPiWT4rewPzNMg3uPhNkP3NExENlUGADRUDPQvuftuUTGW98nLZtGemCIW3G40VhWZYgkIDcQFAwZ3mf2Q==", "dev": true, + "funding": [ + { + "type": "paypal", + "url": "https://www.paypal.com/donate/?hosted_button_id=2CKNJLZJBW8ZC" + }, + { + "type": "buymeacoffee", + "url": "https://www.buymeacoffee.com/samdecrock" + } + ], "dependencies": { - "contains-path": "^0.1.0", - "debug": "^2.6.8", - "doctrine": "1.5.0", - "eslint-import-resolver-node": "^0.3.1", - "eslint-module-utils": "^2.2.0", - "has": "^1.0.1", - "lodash": "^4.17.4", - "minimatch": "^3.0.3", - "read-pkg-up": "^2.0.0", - "resolve": "^1.6.0" + "des.js": "^1.0.1", + "httpreq": ">=0.4.22", + "js-md4": "^0.3.2", + "underscore": "~1.12.1" }, "engines": { - "node": ">=4" - }, - "peerDependencies": { - "eslint": "2.x - 5.x" + "node": ">=10.4.0" } }, - "node_modules/eslint-plugin-import/node_modules/doctrine": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", - "integrity": "sha512-lsGyRuYr4/PIB0txi+Fy2xOMI2dGaTguCaotzFGkVZuKR5usKfcRWIFKNM3QNrU7hh/+w2bwTW+ZeXPK5l8uVg==", - "dev": true, - "dependencies": { - "esutils": "^2.0.2", - "isarray": "^1.0.0" - }, + "node_modules/httpntlm/node_modules/underscore": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.12.1.tgz", + "integrity": "sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw==", + "dev": true + }, + "node_modules/httpreq": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/httpreq/-/httpreq-1.1.1.tgz", + "integrity": "sha512-uhSZLPPD2VXXOSN8Cni3kIsoFHaU2pT/nySEU/fHr/ePbqHYr0jeiQRmUKLEirC09SFPsdMoA7LU7UXMd/w0Kw==", "engines": { - "node": ">=0.10.0" + "node": ">= 6.15.1" } }, - "node_modules/eslint-plugin-import/node_modules/find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==", - "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==", "dependencies": { - "locate-path": "^2.0.0" + "agent-base": "6", + "debug": "4" }, "engines": { - "node": ">=4" + "node": ">= 6" } }, - "node_modules/eslint-plugin-import/node_modules/hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true - }, - "node_modules/eslint-plugin-import/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/eslint-plugin-import/node_modules/load-json-file": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", - "integrity": "sha512-3p6ZOGNbiX4CdvEd1VcE6yi78UrGNpjHO33noGwHCnT/o2fyllJDepsm8+mFFv/DvtwFHht5HIHSyOy5a+ChVQ==", - "dev": true, + "node_modules/https-proxy-agent/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dependencies": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "strip-bom": "^3.0.0" + "ms": "2.1.2" }, "engines": { - "node": ">=4" + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "node_modules/eslint-plugin-import/node_modules/locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==", - "dev": true, - "dependencies": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - }, + "node_modules/https-proxy-agent/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/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==", "engines": { - "node": ">=4" + "node": ">=10.17.0" } }, - "node_modules/eslint-plugin-import/node_modules/normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, - "dependencies": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" + "node_modules/humanize-ms": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", + "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", + "optional": true, + "dependencies": { + "ms": "^2.0.0" } }, - "node_modules/eslint-plugin-import/node_modules/p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, + "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": { - "p-try": "^1.0.0" + "safer-buffer": ">= 2.1.2 < 3" }, "engines": { - "node": ">=4" + "node": ">=0.10.0" } }, - "node_modules/eslint-plugin-import/node_modules/p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==", - "dev": true, + "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.3.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.0.tgz", + "integrity": "sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==", + "engines": { + "node": ">= 4" + } + }, + "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==", "dependencies": { - "p-limit": "^1.1.0" + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" }, "engines": { - "node": ">=4" + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eslint-plugin-import/node_modules/p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==", - "dev": true, + "node_modules/import-from-esm": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/import-from-esm/-/import-from-esm-1.3.3.tgz", + "integrity": "sha512-U3Qt/CyfFpTUv6LOP2jRTLYjphH6zg3okMfHbyqRa/W2w6hr8OsJWVggNlR4jxuojQy81TgTJTxgSkyoteRGMQ==", + "dependencies": { + "debug": "^4.3.4", + "import-meta-resolve": "^4.0.0" + }, "engines": { - "node": ">=4" + "node": ">=16.20" } }, - "node_modules/eslint-plugin-import/node_modules/parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==", - "dev": true, + "node_modules/import-from-esm/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dependencies": { - "error-ex": "^1.2.0" + "ms": "2.1.2" }, "engines": { - "node": ">=0.10.0" + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "node_modules/eslint-plugin-import/node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", - "dev": true, + "node_modules/import-from-esm/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/import-meta-resolve": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-4.0.0.tgz", + "integrity": "sha512-okYUR7ZQPH+efeuMJGlq4f8ubUgO50kByRPyt/Cy1Io4PSRsPjxME+YlVaCOx+NIToW7hCsZNFJyTPFFKepRSA==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "devOptional": true, "engines": { - "node": ">=4" + "node": ">=0.8.19" } }, - "node_modules/eslint-plugin-import/node_modules/path-type": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", - "integrity": "sha512-dUnb5dXUf+kzhC/W/F4e5/SkluXIFf5VUHolW1Eg1irn1hGWjPGdsRcvYJ1nD6lhk8Ir7VM0bHJKsYTx8Jx9OQ==", - "dev": true, - "dependencies": { - "pify": "^2.0.0" - }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "devOptional": true, "engines": { - "node": ">=4" + "node": ">=8" } }, - "node_modules/eslint-plugin-import/node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", - "dev": true, + "node_modules/index-to-position": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/index-to-position/-/index-to-position-0.1.2.tgz", + "integrity": "sha512-MWDKS3AS1bGCHLBA2VLImJz42f7bJh8wQsTGCzI3j519/CASStoDONUBVz2I/VID0MpiX3SGSnbOD2xUalbE5g==", "engines": { - "node": ">=0.10.0" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/infer-owner": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", + "optional": true + }, + "node_modules/inflection": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/inflection/-/inflection-1.13.4.tgz", + "integrity": "sha512-6I/HUDeYFfuNCVS3td055BaXBwKYuzw7K3ExVMStBowKo9oOAMJIXIHvdyR3iboTCp1b+1i5DSkIZTcwIktuDw==", + "engines": [ + "node >= 0.4.0" + ] + }, + "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/eslint-plugin-import/node_modules/read-pkg": { + "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": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", - "integrity": "sha512-eFIBOPW7FGjzBuk3hdXEuNSiTZS/xEMlH49HxMyzb0hyPfu4EhVjT2DH32K1hSSmVq4sebAWnZuuY5auISUTGA==", + "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", + "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", + "engines": { + "node": ">=10" + } + }, + "node_modules/internal-slot": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.6.tgz", + "integrity": "sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg==", "dev": true, "dependencies": { - "load-json-file": "^2.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^2.0.0" + "get-intrinsic": "^1.2.2", + "hasown": "^2.0.0", + "side-channel": "^1.0.4" }, "engines": { - "node": ">=4" + "node": ">= 0.4" } }, - "node_modules/eslint-plugin-import/node_modules/read-pkg-up": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", - "integrity": "sha512-1orxQfbWGUiTn9XsPlChs6rLie/AV9jwZTGmu2NZw/CUDJQchXJFYE0Fq5j7+n558T1JhDWLdhyd1Zj+wLY//w==", - "dev": true, + "node_modules/into-stream": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/into-stream/-/into-stream-7.0.0.tgz", + "integrity": "sha512-2dYz766i9HprMBasCMvHMuazJ7u4WzhJwo5kb3iPSiW/iRYV6uPari3zHoqZlnuaR7V1bEiNMxikhp37rdBXbw==", "dependencies": { - "find-up": "^2.0.0", - "read-pkg": "^2.0.0" + "from2": "^2.3.0", + "p-is-promise": "^3.0.0" }, "engines": { - "node": ">=4" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eslint-plugin-import/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==", + "node_modules/ip": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", + "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==", + "optional": true + }, + "node_modules/ip-regex": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", + "integrity": "sha512-58yWmlHpp7VYfcdTwMTvwMmqx/Elfxjd9RXTDyMsbL7lLWmhMylLEqiYVLKuLzOZqVgiWXD9MfR62Vv89VRxkw==", "dev": true, "engines": { "node": ">=4" } }, - "node_modules/eslint-plugin-node": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-7.0.1.tgz", - "integrity": "sha512-lfVw3TEqThwq0j2Ba/Ckn2ABdwmL5dkOgAux1rvOk6CO7A6yGyPI2+zIxN6FyNkp1X1X/BSvKOceD6mBWSj4Yw==", - "dev": true, + "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-admin": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-admin/-/is-admin-4.0.0.tgz", + "integrity": "sha512-ODl+ygFCyHXMauhn+0mBebcwO1tiB+b4FoBiIC97gFDcmdO3JMD+YmIhSA8+1KVZuGwfsX8ANo2yblgW5KUPTg==", "dependencies": { - "eslint-plugin-es": "^1.3.1", - "eslint-utils": "^1.3.1", - "ignore": "^4.0.2", - "minimatch": "^3.0.4", - "resolve": "^1.8.1", - "semver": "^5.5.0" + "execa": "^5.1.1" }, "engines": { - "node": ">=6" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, - "peerDependencies": { - "eslint": ">=4.19.1" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eslint-plugin-promise": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-4.0.1.tgz", - "integrity": "sha512-Si16O0+Hqz1gDHsys6RtFRrW7cCTB6P7p3OJmKp3Y3dxpQE2qwOA7d3xnV+0mBmrPoi0RBnxlCKvqu70te6wjg==", + "node_modules/is-array-buffer": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", + "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", "dev": true, - "engines": { - "node": ">=6" + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.0", + "is-typed-array": "^1.1.10" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/eslint-plugin-react": { - "version": "7.11.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.11.1.tgz", - "integrity": "sha512-cVVyMadRyW7qsIUh3FHp3u6QHNhOgVrLQYdQEB1bPWBsgbNCHdFAeNMquBMCcZJu59eNthX053L70l7gRt4SCw==", + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" + }, + "node_modules/is-async-function": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz", + "integrity": "sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==", "dev": true, "dependencies": { - "array-includes": "^3.0.3", - "doctrine": "^2.1.0", - "has": "^1.0.3", - "jsx-ast-utils": "^2.0.1", - "prop-types": "^15.6.2" + "has-tostringtag": "^1.0.0" }, "engines": { - "node": ">=4" + "node": ">= 0.4" }, - "peerDependencies": { - "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/eslint-plugin-react/node_modules/doctrine": { + "node_modules/is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "dependencies": { + "has-bigints": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-binary-path": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", "dev": true, "dependencies": { - "esutils": "^2.0.2" + "binary-extensions": "^2.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/eslint-plugin-standard": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-standard/-/eslint-plugin-standard-4.0.2.tgz", - "integrity": "sha512-nKptN8l7jksXkwFk++PhJB3cCDTcXOEyhISIN86Ue2feJ1LFyY3PrY3/xT2keXlJSY5bpmbiTG0f885/YKAvTA==", - "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" - } - ], - "peerDependencies": { - "eslint": ">=5.0.0" - } - }, - "node_modules/eslint-scope": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", - "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", + "node_modules/is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", "dev": true, "dependencies": { - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" }, "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/eslint-utils": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz", - "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==", - "dev": true, - "dependencies": { - "eslint-visitor-keys": "^1.1.0" + "node": ">= 0.4" }, - "engines": { - "node": ">=6" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "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==", + "dev": true + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", "dev": true, "engines": { - "node": ">=4" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/eslint/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, + "node_modules/is-core-module": { + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" + "hasown": "^2.0.0" }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/eslint/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/espree": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-5.0.1.tgz", - "integrity": "sha512-qWAZcWh4XE/RwzLJejfcofscgMc9CamR6Tn1+XRXNzrvUSSbiAjGOI/fggztjIi7y9VLPqnICMIPiGyr8JaZ0A==", + "node_modules/is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", "dev": true, "dependencies": { - "acorn": "^6.0.7", - "acorn-jsx": "^5.0.0", - "eslint-visitor-keys": "^1.0.0" + "has-tostringtag": "^1.0.0" }, "engines": { - "node": ">=6.0.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/espree/node_modules/acorn": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", - "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==", - "dev": true, - "bin": { - "acorn": "bin/acorn" + "node_modules/is-elevated": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-elevated/-/is-elevated-4.0.0.tgz", + "integrity": "sha512-nHdo1tvG6ocQA+MESx+VmUae2dvB32mm87gzZxMlZT7gtURGC9quMpYrwuMqIFJTqKSP/wLLQnneG/Z2AIne6g==", + "dependencies": { + "is-admin": "^4.0.0", + "is-root": "^3.0.0" }, "engines": { - "node": ">=0.4.0" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, + "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": ">=4" + "node": ">=0.10.0" } }, - "node_modules/esquery": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.2.tgz", - "integrity": "sha512-JVSoLdTlTDkmjFmab7H/9SL9qGSyjElT3myyKp7krqjVFQCDLmj1QFaCLRFBszBKI0XVZaiiXvuPIX3ZwHe1Ng==", + "node_modules/is-finalizationregistry": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz", + "integrity": "sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==", "dev": true, "dependencies": { - "estraverse": "^5.1.0" + "call-bind": "^1.0.2" }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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": ">=0.10" + "node": ">=8" } }, - "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==", + "node_modules/is-generator-function": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", + "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, "engines": { - "node": ">=4.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "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, + "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": { - "estraverse": "^5.2.0" + "is-extglob": "^2.1.1" }, "engines": { - "node": ">=4.0" + "node": ">=0.10.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==", + "node_modules/is-ip": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-ip/-/is-ip-2.0.0.tgz", + "integrity": "sha512-9MTn0dteHETtyUx8pxqMwg5hMBi3pvlyglJ+b79KOCca0po23337LbVV2Hl4xmMvfw++ljnO0/+5G6G+0Szh6g==", "dev": true, + "dependencies": { + "ip-regex": "^2.0.0" + }, "engines": { - "node": ">=4.0" + "node": ">=4" } }, - "node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "node_modules/is-lambda": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", + "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==", + "optional": true + }, + "node_modules/is-map": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz", + "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==", "dev": true, - "engines": { - "node": ">=4.0" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "node_modules/is-negative-zero": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", + "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", "dev": true, "engines": { - "node": ">=0.10.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "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.6" + "node": ">=0.12.0" } }, - "node_modules/event-emitter": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", - "integrity": "sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==", - "dev": true, + "node_modules/is-number-like": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/is-number-like/-/is-number-like-1.0.8.tgz", + "integrity": "sha512-6rZi3ezCyFcn5L71ywzz2bS5b2Igl1En3eTlZlvKjpz1n3IZLAYMbKYAIQgFmEu0GENg92ziU/faEOA/aixjbA==", "dependencies": { - "d": "1", - "es5-ext": "~0.10.14" + "lodash.isfinite": "^3.3.2" } }, - "node_modules/eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", - "dev": true - }, - "node_modules/eventuate": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/eventuate/-/eventuate-4.0.0.tgz", - "integrity": "sha512-SysKo5/rgqCaXlO4H4DE62JXCFtDpdm+boWOzaeaYph3Xejy04Cc4/E2HDPnOES0MFb643WgKRlx09W2iVAIBw==", + "node_modules/is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "dev": true, "dependencies": { - "define-error": "~1.0.0", - "object-assign": "~3.0.0", - "shallow-copy": "0.0.1" - } - }, - "node_modules/eventuate/node_modules/object-assign": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz", - "integrity": "sha512-jHP15vXVGeVh1HuaA2wY6lxk+whK/x4KBG88VXeRma7CCun7iGD5qPc4eYykQ9sdQvg8jkwFKsSxHln2ybW3xQ==", + "has-tostringtag": "^1.0.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", - "dependencies": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - }, + "node_modules/is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", "engines": { - "node": ">=6" + "node": ">=8" } }, - "node_modules/expect-ct": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/expect-ct/-/expect-ct-0.2.0.tgz", - "integrity": "sha512-6SK3MG/Bbhm8MsgyJAylg+ucIOU71/FzyFalcfu5nY19dH8y/z0tBJU0wrNBXD4B27EoQtqPF/9wqH0iYAd04g==", + "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": ">=4.0.0" + "node": ">=8" } }, - "node_modules/express": { - "version": "4.17.3", - "resolved": "https://registry.npmjs.org/express/-/express-4.17.3.tgz", - "integrity": "sha512-yuSQpz5I+Ch7gFrPCk4/c+dIBKlQUxtgwqzph132bsT6qhuzss6I8cLJQz7B3rFblzd6wtcI0ZbGltH/C4LjUg==", - "dependencies": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.19.2", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.4.2", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "~1.1.2", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "~1.1.2", - "fresh": "0.5.2", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.7", - "qs": "6.9.7", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.17.2", - "serve-static": "1.14.2", - "setprototypeof": "1.2.0", - "statuses": "~1.5.0", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.10.0" - } + "node_modules/is-promise": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", + "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==", + "dev": true }, - "node_modules/express/node_modules/body-parser": { - "version": "1.19.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.2.tgz", - "integrity": "sha512-SAAwOxgoCKMGs9uUAUFHygfLAyaniaoun6I8mFY9pRAJL9+Kec34aU+oIjDhTycub1jozEfEwx1W1IuOYxVSFw==", + "node_modules/is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, "dependencies": { - "bytes": "3.1.2", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "~1.1.2", - "http-errors": "1.8.1", - "iconv-lite": "0.4.24", - "on-finished": "~2.3.0", - "qs": "6.9.7", - "raw-body": "2.4.3", - "type-is": "~1.6.18" + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" }, "engines": { - "node": ">= 0.8" - } - }, - "node_modules/express/node_modules/cookie": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", - "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", - "engines": { - "node": ">= 0.6" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/express/node_modules/depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "node_modules/is-root": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-root/-/is-root-3.0.0.tgz", + "integrity": "sha512-C13bL54yQdgniduW8KFe81ttgQINcwMgil/zyNuDzr/xjIyDMkcvcc9dON62RH9VBAHOI7le+lTo/U3PY3irwg==", "engines": { - "node": ">= 0.6" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/express/node_modules/http-errors": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", - "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", - "dependencies": { - "depd": "~1.1.2", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.1" - }, - "engines": { - "node": ">= 0.6" + "node_modules/is-set": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz", + "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/express/node_modules/on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", + "node_modules/is-shared-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", + "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "dev": true, "dependencies": { - "ee-first": "1.1.1" + "call-bind": "^1.0.2" }, - "engines": { - "node": ">= 0.8" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/express/node_modules/qs": { - "version": "6.9.7", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.7.tgz", - "integrity": "sha512-IhMFgUmuNpyRfxA90umL7ByLlgRXu6tIfKPpF5TmcfRLlLCckfP/g3IQmju6jjpu+Hh8rA+2p6A27ZSPOOHdKw==", + "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==", "engines": { - "node": ">=0.6" + "node": ">=8" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/express/node_modules/raw-body": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.3.tgz", - "integrity": "sha512-UlTNLIcu0uzb4D2f4WltY6cVjLi+/jEN4lgEUj3E04tpMDpUlkBo/eSn6zou9hum2VMNpCCUone0O0WeJim07g==", + "node_modules/is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, "dependencies": { - "bytes": "3.1.2", - "http-errors": "1.8.1", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" + "has-tostringtag": "^1.0.0" }, "engines": { - "node": ">= 0.8" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/ext": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz", - "integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==", + "node_modules/is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", "dev": true, "dependencies": { - "type": "^2.7.2" + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/ext/node_modules/type": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/type/-/type-2.7.2.tgz", - "integrity": "sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==", - "dev": true - }, - "node_modules/extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" - }, - "node_modules/external-editor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", - "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", - "dev": true, + "node_modules/is-text-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-2.0.0.tgz", + "integrity": "sha512-+oDTluR6WEjdXEJMnC2z6A4FRwFoYuvShVVEGsS7ewc0UTi2QtAKMDJuL4BDEVt+5T7MjFo12RP8ghOM75oKJw==", "dependencies": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" + "text-extensions": "^2.0.0" }, "engines": { - "node": ">=4" + "node": ">=8" } }, - "node_modules/extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", - "engines": [ - "node >=0.6.0" - ] - }, - "node_modules/faker": { - "version": "5.5.3", - "resolved": "https://registry.npmjs.org/faker/-/faker-5.5.3.tgz", - "integrity": "sha512-wLTv2a28wjUyWkbnX7u/ABZBkUkIF2fCd73V6P2oFqEGEktDfzWx4UxrSqtPRw0xPRAcjeAOIiJWqZm3pP4u3g==", - "dev": true - }, - "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==" - }, - "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==", + "node_modules/is-typed-array": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz", + "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==", + "dev": true, "dependencies": { - "@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" + "which-typed-array": "^1.1.11" }, "engines": { - "node": ">=8.6.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "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==" - }, - "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/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" }, - "node_modules/fast-redact": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-redact/-/fast-redact-2.1.0.tgz", - "integrity": "sha512-0LkHpTLyadJavq9sRzzyqIoMZemWli77K2/MGOkafrR64B9ItrvZ9aT+jluvNDsv0YEHjSNhlMBtbokuoqii4A==", + "node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true, "engines": { - "node": ">=6" - } - }, - "node_modules/fast-safe-stringify": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", - "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==" - }, - "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": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/feature-policy": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/feature-policy/-/feature-policy-0.3.0.tgz", - "integrity": "sha512-ZtijOTFN7TzCujt1fnNhfWPFPSHeZkesff9AXZj+UEjYBynWNUIYpC87Ve4wHzyexQsImicLu7WsC2LHq7/xrQ==", - "engines": { - "node": ">=4.0.0" + "node_modules/is-weakmap": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz", + "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/figures": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", - "integrity": "sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA==", + "node_modules/is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dev": true, "dependencies": { - "escape-string-regexp": "^1.0.5" + "call-bind": "^1.0.2" }, - "engines": { - "node": ">=4" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/file-entry-cache": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", - "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", + "node_modules/is-weakset": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz", + "integrity": "sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==", "dev": true, "dependencies": { - "flat-cache": "^2.0.1" + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" }, - "engines": { - "node": ">=4" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/file-type": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz", - "integrity": "sha512-RLoqTXE8/vPmMuTI88DAzhMYC99I8BWv7zYP4A1puo5HIjEJ5EX48ighy4ZyKMG9EDXxBgW6e++cn7d1xuFghA==", + "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==", "dev": true, "engines": { "node": ">=0.10.0" } }, - "node_modules/filelist": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", - "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", - "dependencies": { - "minimatch": "^5.0.1" - } + "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/filelist/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dependencies": { - "balanced-match": "^1.0.0" - } + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" }, - "node_modules/filelist/node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "node_modules/isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==" + }, + "node_modules/issue-parser": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/issue-parser/-/issue-parser-6.0.0.tgz", + "integrity": "sha512-zKa/Dxq2lGsBIXQ7CUZWTHfvxPC2ej0KfO7fIPqLlHB9J2hJ7rGhZ5rilhuufylr4RXYPzJUeFjKxz305OsNlA==", "dependencies": { - "brace-expansion": "^2.0.1" + "lodash.capitalize": "^4.2.1", + "lodash.escaperegexp": "^4.1.2", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.uniqby": "^4.7.0" }, "engines": { - "node": ">=10" + "node": ">=10.13" } }, - "node_modules/filesize": { - "version": "8.0.7", - "resolved": "https://registry.npmjs.org/filesize/-/filesize-8.0.7.tgz", - "integrity": "sha512-pjmC+bkIF8XI7fWaH8KxHcZL3DPybs1roSKP4rKDvy20tAWwIObE4+JIseG2byfGKhud5ZnM4YSGKBz7Sh0ndQ==", + "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": ">= 0.4.0" + "node": ">=8" } }, - "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==", + "node_modules/istanbul-lib-hook": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz", + "integrity": "sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ==", + "dev": true, "dependencies": { - "to-regex-range": "^5.0.1" + "append-transform": "^2.0.0" }, "engines": { "node": ">=8" } }, - "node_modules/finalhandler": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", - "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "node_modules/istanbul-lib-instrument": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", + "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", + "dev": true, "dependencies": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "statuses": "~1.5.0", - "unpipe": "~1.0.0" + "@babel/core": "^7.7.5", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.0.0", + "semver": "^6.3.0" }, "engines": { - "node": ">= 0.8" + "node": ">=8" } }, - "node_modules/finalhandler/node_modules/on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" + "node_modules/istanbul-lib-instrument/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" } }, - "node_modules/find-cache-dir": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", - "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", + "node_modules/istanbul-lib-processinfo": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.3.tgz", + "integrity": "sha512-NkwHbo3E00oybX6NGJi6ar0B29vxyvNwoC7eJ4G4Yq28UfY758Hgn/heV8VRFhevPED4LXfFz0DQ8z/0kw9zMg==", "dev": true, "dependencies": { - "commondir": "^1.0.1", - "make-dir": "^3.0.2", - "pkg-dir": "^4.1.0" + "archy": "^1.0.0", + "cross-spawn": "^7.0.3", + "istanbul-lib-coverage": "^3.2.0", + "p-map": "^3.0.0", + "rimraf": "^3.0.0", + "uuid": "^8.3.2" }, "engines": { "node": ">=8" - }, - "funding": { - "url": "https://github.com/avajs/find-cache-dir?sponsor=1" } }, - "node_modules/find-replace": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-2.0.1.tgz", - "integrity": "sha512-LzDo3Fpa30FLIBsh6DCDnMN1KW2g4QKkqKmejlImgWY67dDFPX/x9Kh/op/GK522DchQXEvDi/wD48HKW49XOQ==", - "dependencies": { - "array-back": "^2.0.0", - "test-value": "^3.0.0" - }, - "engines": { - "node": ">=4.0.0" + "node_modules/istanbul-lib-processinfo/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==", + "dev": true, + "bin": { + "uuid": "dist/bin/uuid" } }, - "node_modules/find-root": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", - "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==", - "dev": true - }, - "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==", + "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": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8" } }, - "node_modules/find-versions": { + "node_modules/istanbul-lib-report/node_modules/has-flag": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/find-versions/-/find-versions-4.0.0.tgz", - "integrity": "sha512-wgpWy002tA+wgmO27buH/9KzyEOQnKsG/R0yrcjPT9BOFm0zRBVQbZ95nRGXWMywS8YR5knRbpohio0bcJABxQ==", - "dependencies": { - "semver-regex": "^3.1.2" - }, + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8" } }, - "node_modules/flat": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", - "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "node_modules/istanbul-lib-report/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, - "bin": { - "flat": "cli.js" + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "node_modules/flat-cache": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", - "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", + "node_modules/istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", "dev": true, "dependencies": { - "flatted": "^2.0.0", - "rimraf": "2.6.3", - "write": "1.0.3" + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" }, "engines": { - "node": ">=4" + "node": ">=10" } }, - "node_modules/flatstr": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/flatstr/-/flatstr-1.0.12.tgz", - "integrity": "sha512-4zPxDyhCyiN2wIAtSLI6gc82/EjqZc1onI4Mz/l0pWrAlsSfYH/2ZIcU+e3oA2wDwbzIWNKwa23F8rh6+DRWkw==" - }, - "node_modules/flatted": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", - "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", - "dev": true - }, - "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" - } - ], + "node_modules/istanbul-lib-source-maps/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": ">=4.0" + "node": ">=6.0" }, "peerDependenciesMeta": { - "debug": { + "supports-color": { "optional": true } } }, - "node_modules/for-each": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", - "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", - "dev": true, - "dependencies": { - "is-callable": "^1.1.3" - } + "node_modules/istanbul-lib-source-maps/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/foreground-child": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", - "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", + "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": { - "cross-spawn": "^7.0.0", - "signal-exit": "^3.0.2" + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" }, "engines": { - "node": ">=8.0.0" + "node": ">=8" } }, - "node_modules/foreground-child/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==", + "node_modules/iterator.prototype": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.2.tgz", + "integrity": "sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==", "dev": true, "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" + "define-properties": "^1.2.1", + "get-intrinsic": "^1.2.1", + "has-symbols": "^1.0.3", + "reflect.getprototypeof": "^1.0.4", + "set-function-name": "^2.0.1" } }, - "node_modules/foreground-child/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, + "node_modules/jake": { + "version": "10.8.5", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.5.tgz", + "integrity": "sha512-sVpxYeuAhWt0OTWITwT98oyV0GsXyMlXCF+3L1SuafBVUIr/uILGRB+NqwkzhgXKvoJpDIpQvqkUALgdmQsQxw==", + "dependencies": { + "async": "^3.2.3", + "chalk": "^4.0.2", + "filelist": "^1.0.1", + "minimatch": "^3.0.4" + }, + "bin": { + "jake": "bin/cli.js" + }, "engines": { - "node": ">=8" + "node": ">=10" } }, - "node_modules/foreground-child/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, + "node_modules/jake/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": { - "shebang-regex": "^3.0.0" + "color-convert": "^2.0.1" }, "engines": { "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/foreground-child/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, + "node_modules/jake/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": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/foreground-child/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, + "node_modules/jake/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": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" + "color-name": "~1.1.4" }, "engines": { - "node": ">= 8" + "node": ">=7.0.0" } }, - "node_modules/forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", - "engines": { - "node": "*" - } + "node_modules/jake/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/form-data": { + "node_modules/jake/node_modules/has-flag": { "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" - }, + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "engines": { - "node": ">= 6" + "node": ">=8" } }, - "node_modules/formidable": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.2.1.tgz", - "integrity": "sha512-Fs9VRguL0gqGHkXS5GQiMCr1VhZBxz0JnJs4JmMp/2jL18Fmbzvv7vOFRU+U8TBkHEE/CX1qDXzJplVULgsLeg==", - "deprecated": "Please upgrade to latest, formidable@v2 or formidable@v3! Check these notes: https://bit.ly/2ZEqIau" - }, - "node_modules/forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "node_modules/jake/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": ">= 0.6" + "node": "*" } }, - "node_modules/frameguard": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/frameguard/-/frameguard-3.1.0.tgz", - "integrity": "sha512-TxgSKM+7LTA6sidjOiSZK9wxY0ffMPY3Wta//MqwmX0nZuEHc8QrkV8Fh3ZhMJeiH+Uyh/tcaarImRy8u77O7g==", + "node_modules/jake/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": ">=4.0.0" + "node": ">=8" } }, - "node_modules/fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "node_modules/java-properties": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/java-properties/-/java-properties-1.0.2.tgz", + "integrity": "sha512-qjdpeo2yKlYTH7nFdK0vbZWuTCesk4o63v5iVOlhMQPfuIZQfW/HI35SjfhA+4qpg36rnFSvUK5b1m+ckIblQQ==", "engines": { - "node": ">= 0.6" + "node": ">= 0.6.0" } }, - "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/jose": { + "version": "4.14.4", + "resolved": "https://registry.npmjs.org/jose/-/jose-4.14.4.tgz", + "integrity": "sha512-j8GhLiKmUAh+dsFXlX1aJCbt5KMibuKb+d7j1JaOJG6s2UjX1PQlW+OKB/sD4a/5ZYF4RcmYmLSndOoU3Lt/3g==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/panva" } }, - "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==", + "node_modules/js-beautify": { + "version": "1.14.7", + "resolved": "https://registry.npmjs.org/js-beautify/-/js-beautify-1.14.7.tgz", + "integrity": "sha512-5SOX1KXPFKx+5f6ZrPsIPEY7NwKeQz47n3jm2i+XeHx9MoRsfQenlOP13FQhWvg8JRS0+XLO6XYUQ2GX+q+T9A==", + "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" + "config-chain": "^1.1.13", + "editorconfig": "^0.15.3", + "glob": "^8.0.3", + "nopt": "^6.0.0" + }, + "bin": { + "css-beautify": "js/bin/css-beautify.js", + "html-beautify": "js/bin/html-beautify.js", + "js-beautify": "js/bin/js-beautify.js" + }, + "engines": { + "node": ">=10" } }, - "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==" - }, - "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==", + "node_modules/js-beautify/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, "dependencies": { - "safe-buffer": "~5.1.0" + "balanced-match": "^1.0.0" } }, - "node_modules/fromentries": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/fromentries/-/fromentries-1.3.2.tgz", - "integrity": "sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==", - "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/fs-extra": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.0.tgz", - "integrity": "sha512-0rcTq621PD5jM/e0a3EJoGC/1TC5ZBCERW82LQuwfGnCa1V8w7dpYH1yNu+SLb6E5dkeCBzKEyLGlFrnr+dUyw==", + "node_modules/js-beautify/node_modules/glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "dev": true, "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" }, "engines": { - "node": ">=14.14" - } - }, - "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" + "node": ">=12" }, - "engines": { - "node": ">= 8" + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "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/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "node_modules/js-beautify/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/ftp": { - "version": "0.3.10", - "resolved": "https://registry.npmjs.org/ftp/-/ftp-0.3.10.tgz", - "integrity": "sha512-faFVML1aBx2UoDStmLwv2Wptt4vw5x03xxX172nhA5Y5HBshW5JweqQ2W4xL4dezQTG8inJsuYcpPHHU3X5OTQ==", "dependencies": { - "readable-stream": "1.1.x", - "xregexp": "2.0.0" + "brace-expansion": "^2.0.1" }, "engines": { - "node": ">=0.8.0" + "node": ">=10" } }, - "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/js-md4": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/js-md4/-/js-md4-0.3.2.tgz", + "integrity": "sha512-/GDnfQYsltsjRswQhN9fhv3EMw2sCpUdrdxyWDOUK7eyD++r3gRhzgiQgc/x4MAv2i1iuQ4lxO5mvqM3vj4bwA==", + "dev": true }, - "node_modules/function.prototype.name": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", - "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", - "dev": true, + "node_modules/js-sha512": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/js-sha512/-/js-sha512-0.8.0.tgz", + "integrity": "sha512-PWsmefG6Jkodqt+ePTvBZCSMFgN7Clckjd0O7su3I0+BW2QWUTJNzjktHsztGLhncP2h8mcF9V9Y2Ha59pAViQ==", + "dev": true + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "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==", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.0", - "functions-have-names": "^1.2.2" + "argparse": "^2.0.1" }, - "engines": { - "node": ">= 0.4" + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==" + }, + "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" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">=4" } }, - "node_modules/functional-red-black-tree": { + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true + }, + "node_modules/json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==" + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" + }, + "node_modules/json-schema": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" + }, + "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==" + }, + "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", + "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/functions-have-names": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==" + }, + "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, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" } }, - "node_modules/gauge": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", - "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", "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" + "universalify": "^2.0.0" }, - "engines": { - "node": ">=10" + "optionalDependencies": { + "graceful-fs": "^4.1.6" } }, - "node_modules/gauge/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "node_modules/jsonfile/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", "engines": { - "node": ">=8" + "node": ">= 10.0.0" } }, - "node_modules/gauge/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/jsonparse": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", + "engines": [ + "node >= 0.2.0" + ] }, - "node_modules/gauge/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==", + "node_modules/jsonschema": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsonschema/-/jsonschema-1.4.1.tgz", + "integrity": "sha512-S6cATIPVv1z0IlxdN+zUk5EPjkGCdnhN4wVSBlvoUO1tOLJootbo9CquNJmbIh4yikWHiUedhRYrNPn1arpEmQ==", "engines": { - "node": ">=0.10.0" + "node": "*" } }, - "node_modules/gauge/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "node_modules/JSONStream": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", + "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "jsonparse": "^1.2.0", + "through": ">=2.2.7 <3" + }, + "bin": { + "JSONStream": "bin.js" }, "engines": { - "node": ">=8" + "node": "*" } }, - "node_modules/gauge/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "node_modules/jsprim": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-2.0.2.tgz", + "integrity": "sha512-gqXddjPqQ6G40VdnI6T6yObEC+pDNvyP95wdQhkWkg7crHH3km5qP1FsOXEkzEQwnz6gz5qGTn1c2Y52wP3OyQ==", + "dev": true, + "engines": [ + "node >=0.6.0" + ], "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.4.0", + "verror": "1.10.0" } }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "node_modules/jsx-ast-utils": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", + "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", "dev": true, + "dependencies": { + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "object.assign": "^4.1.4", + "object.values": "^1.1.6" + }, "engines": { - "node": ">=6.9.0" + "node": ">=4.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/just-extend": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.2.1.tgz", + "integrity": "sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg==", + "dev": true }, - "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==", + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", "dev": true, - "engines": { - "node": "*" + "dependencies": { + "json-buffer": "3.0.1" } }, - "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==", + "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": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.3" + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">= 0.8.0" } }, - "node_modules/get-package-type": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" + }, + "node_modules/liquid-json": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/liquid-json/-/liquid-json-0.3.1.tgz", + "integrity": "sha512-wUayTU8MS827Dam6MxgD72Ui+KOSF+u/eIqpatOtjnvgJ0+mnDq33uC2M7J0tPK+upe/DpUAuK4JUU89iBoNKQ==", "dev": true, "engines": { - "node": ">=8.0.0" + "node": ">=4" } }, - "node_modules/get-stdin": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-6.0.0.tgz", - "integrity": "sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g==", - "dev": true, + "node_modules/load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==", + "dependencies": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + }, "engines": { "node": ">=4" } }, - "node_modules/get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "node_modules/load-json-file/node_modules/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", "dependencies": { - "pump": "^3.0.0" + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" }, "engines": { - "node": ">=6" + "node": ">=4" } }, - "node_modules/get-symbol-description": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", - "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "node_modules/load-json-file/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/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": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" + "p-locate": "^5.0.0" }, "engines": { - "node": ">= 0.4" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", - "dependencies": { - "assert-plus": "^1.0.0" - } + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, - "node_modules/git-log-parser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/git-log-parser/-/git-log-parser-1.2.0.tgz", - "integrity": "sha512-rnCVNfkTL8tdNryFuaY0fYiBWEBcgF748O6ZI61rslBvr2o7U65c2/6npCRqH40vuAhtgtDiqLTJjBVdrejCzA==", - "dependencies": { - "argv-formatter": "~1.0.0", - "spawn-error-forwarder": "~1.0.0", - "split2": "~1.0.0", - "stream-combiner2": "~1.1.1", - "through2": "~2.0.0", - "traverse": "~0.6.6" - } + "node_modules/lodash-es": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", + "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==" }, - "node_modules/git-log-parser/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/lodash.assignwith": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.assignwith/-/lodash.assignwith-4.2.0.tgz", + "integrity": "sha512-ZznplvbvtjK2gMvnQ1BR/zqPFZmS6jbK4p+6Up4xcRYA7yMIwxHCfbTcrYxXKzzqLsQ05eJPVznEW3tuwV7k1g==" }, - "node_modules/git-log-parser/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/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/git-log-parser/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/lodash.capitalize": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/lodash.capitalize/-/lodash.capitalize-4.2.1.tgz", + "integrity": "sha512-kZzYOKspf8XVX5AvmQF94gQW0lejFVgb80G85bU4ZWzoJ6C03PQg3coYAUpSTpQWelrZELd3XWgHzw4Ck5kaIw==" }, - "node_modules/git-log-parser/node_modules/split2": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/split2/-/split2-1.0.0.tgz", - "integrity": "sha512-NKywug4u4pX/AZBB1FCPzZ6/7O+Xhz1qMVbzTvvKvikjO99oPN87SkK08mEY9P63/5lWjK+wgOOgApnTg5r6qg==", - "dependencies": { - "through2": "~2.0.0" - } + "node_modules/lodash.escaperegexp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz", + "integrity": "sha512-TM9YBvyC84ZxE3rgfefxUWiQKLilstD6k7PTGt6wfbtXF8ixIJLOL3VYyV/z+ZiPLsVxAsKAFVwWlWeb2Y8Yyw==" }, - "node_modules/git-log-parser/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/lodash.flattendeep": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", + "integrity": "sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==", + "dev": true }, - "node_modules/git-log-parser/node_modules/through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dependencies": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } + "node_modules/lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==", + "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==", + "node_modules/lodash.isfinite": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/lodash.isfinite/-/lodash.isfinite-3.3.2.tgz", + "integrity": "sha512-7FGG40uhC8Mm633uKW1r58aElFlBlxCrg9JfSi3P6aYiWmfiWF0PgMd86ZUsxE5GwWPdHoS2+48bwTh2VPkIQA==" + }, + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==" + }, + "node_modules/lodash.isstring": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", + "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==" + }, + "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/lodash.uniqby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.uniqby/-/lodash.uniqby-4.7.0.tgz", + "integrity": "sha512-e/zcLx6CSbmaEgFHCA7BnoQKyCtKMxnuWrJygbwPs/AIn+IMKl66L8/s+wBUn5LRw2pZx3bUHibiV1b6aTWIww==" + }, + "node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, "dependencies": { - "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" + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" }, "engines": { - "node": "*" + "node": ">=10" }, "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==", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true, - "engines": { - "node": ">=4" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/globalthis": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", - "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "node_modules/log-symbols/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "dependencies": { - "define-properties": "^1.1.3" + "color-convert": "^2.0.1" }, "engines": { - "node": ">= 0.4" + "node": ">=8" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "node_modules/log-symbols/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "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" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/globby/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" + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "node_modules/log-symbols/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "dependencies": { - "get-intrinsic": "^1.1.3" + "color-name": "~1.1.4" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">=7.0.0" } }, - "node_modules/graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" + "node_modules/log-symbols/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true }, - "node_modules/growl": { - "version": "1.10.5", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", - "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", + "node_modules/log-symbols/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": ">=4.x" + "node": ">=8" } }, - "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==", + "node_modules/log-symbols/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": { - "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" + "has-flag": "^4.0.0" }, - "optionalDependencies": { - "uglify-js": "^3.1.4" - } - }, - "node_modules/har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==", "engines": { - "node": ">=4" + "node": ">=8" } }, - "node_modules/har-validator": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", - "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", - "deprecated": "this library is no longer supported", - "dependencies": { - "ajv": "^6.12.3", - "har-schema": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/hard-rejection": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", - "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", - "engines": { - "node": ">=6" - } - }, - "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-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==", + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", "dev": true, "dependencies": { - "ansi-regex": "^2.0.0" + "js-tokens": "^3.0.0 || ^4.0.0" }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/has-bigints": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", - "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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" + "bin": { + "loose-envify": "cli.js" } }, - "node_modules/has-property-descriptors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", - "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "node_modules/loupe": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.7.tgz", + "integrity": "sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==", "dev": true, "dependencies": { - "get-intrinsic": "^1.1.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "get-func-name": "^2.0.1" } }, - "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==", + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", "dev": true, - "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" + "dependencies": { + "yallist": "^3.0.2" } }, - "node_modules/has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "node_modules/lru-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/lru-queue/-/lru-queue-0.1.0.tgz", + "integrity": "sha512-BpdYkt9EvGl8OfWHDQPISVpcl5xZthb+XPsbELj5AQXxIC8IriDZIQYjBJPEm5rS420sjZ0TLEzRcq5KdBhYrQ==", "dev": true, "dependencies": { - "has-symbols": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "es5-ext": "~0.10.2" } }, - "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/hasha": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.2.tgz", - "integrity": "sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==", - "dev": true, + "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": { - "is-stream": "^2.0.0", - "type-fest": "^0.8.0" - }, - "engines": { - "node": ">=8" + "semver": "^6.0.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/hasha/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" }, @@ -8242,93 +7903,86 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "dev": true, + "node_modules/make-dir/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "bin": { - "he": "bin/he" + "semver": "bin/semver.js" } }, - "node_modules/helmet": { - "version": "3.21.2", - "resolved": "https://registry.npmjs.org/helmet/-/helmet-3.21.2.tgz", - "integrity": "sha512-okUo+MeWgg00cKB8Csblu8EXgcIoDyb5ZS/3u0W4spCimeVuCUvVZ6Vj3O2VJ1Sxpyb8jCDvzu0L1KKT11pkIg==", + "node_modules/make-fetch-happen": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-9.1.0.tgz", + "integrity": "sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg==", + "optional": true, "dependencies": { - "depd": "2.0.0", - "dns-prefetch-control": "0.2.0", - "dont-sniff-mimetype": "1.1.0", - "expect-ct": "0.2.0", - "feature-policy": "0.3.0", - "frameguard": "3.1.0", - "helmet-crossdomain": "0.4.0", - "helmet-csp": "2.9.4", - "hide-powered-by": "1.1.0", - "hpkp": "2.0.0", - "hsts": "2.2.0", - "ienoopen": "1.1.0", - "nocache": "2.1.0", - "referrer-policy": "1.2.0", - "x-xss-protection": "1.3.0" + "agentkeepalive": "^4.1.3", + "cacache": "^15.2.0", + "http-cache-semantics": "^4.1.0", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^6.0.0", + "minipass": "^3.1.3", + "minipass-collect": "^1.0.2", + "minipass-fetch": "^1.3.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.2", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^6.0.0", + "ssri": "^8.0.0" }, "engines": { - "node": ">=4.0.0" + "node": ">= 10" } }, - "node_modules/helmet-crossdomain": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/helmet-crossdomain/-/helmet-crossdomain-0.4.0.tgz", - "integrity": "sha512-AB4DTykRw3HCOxovD1nPR16hllrVImeFp5VBV9/twj66lJ2nU75DP8FPL0/Jp4jj79JhTfG+pFI2MD02kWJ+fA==", + "node_modules/make-fetch-happen/node_modules/@tootallnate/once": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", + "optional": true, "engines": { - "node": ">=4.0.0" + "node": ">= 6" } }, - "node_modules/helmet-csp": { - "version": "2.9.4", - "resolved": "https://registry.npmjs.org/helmet-csp/-/helmet-csp-2.9.4.tgz", - "integrity": "sha512-qUgGx8+yk7Xl8XFEGI4MFu1oNmulxhQVTlV8HP8tV3tpfslCs30OZz/9uQqsWPvDISiu/NwrrCowsZBhFADYqg==", + "node_modules/make-fetch-happen/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "optional": true, "dependencies": { - "bowser": "^2.7.0", - "camelize": "1.0.0", - "content-security-policy-builder": "2.1.0", - "dasherize": "2.0.0" + "ms": "2.1.2" }, "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/hide-powered-by": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/hide-powered-by/-/hide-powered-by-1.1.0.tgz", - "integrity": "sha512-Io1zA2yOA1YJslkr+AJlWSf2yWFkKjvkcL9Ni1XSUqnGLr/qRQe2UI3Cn/J9MsJht7yEVCe0SscY1HgVMujbgg==", - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/hook-std": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/hook-std/-/hook-std-2.0.0.tgz", - "integrity": "sha512-zZ6T5WcuBMIUVh49iPQS9t977t7C0l7OtHrpeMb5uk48JdflRX0NSFvCekfYNmGQETnLq9W/isMyHl69kxGi8g==", - "engines": { - "node": ">=8" + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "node_modules/hosted-git-info": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", - "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", + "node_modules/make-fetch-happen/node_modules/http-proxy-agent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", + "optional": true, "dependencies": { - "lru-cache": "^6.0.0" + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" }, "engines": { - "node": ">=10" + "node": ">= 6" } }, - "node_modules/hosted-git-info/node_modules/lru-cache": { + "node_modules/make-fetch-happen/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==", + "optional": true, "dependencies": { "yallist": "^4.0.0" }, @@ -8336,368 +7990,484 @@ "node": ">=10" } }, - "node_modules/hosted-git-info/node_modules/yallist": { + "node_modules/make-fetch-happen/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==", + "optional": true + }, + "node_modules/make-fetch-happen/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/hpkp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/hpkp/-/hpkp-2.0.0.tgz", - "integrity": "sha512-TaZpC6cO/k3DFsjfzz1LnOobbVSq+J+7WpJxrVtN4L+8+BPQj8iBDRB2Dx49613N+e7/+ZSQ9ra+xZm7Blf4wg==" + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "optional": true }, - "node_modules/hsts": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/hsts/-/hsts-2.2.0.tgz", - "integrity": "sha512-ToaTnQ2TbJkochoVcdXYm4HOCliNozlviNsg+X2XQLQvZNI/kCHR9rZxVYpJB3UPcHz80PgxRyWQ7PdU1r+VBQ==", - "dependencies": { - "depd": "2.0.0" + "node_modules/marked": { + "version": "9.1.6", + "resolved": "https://registry.npmjs.org/marked/-/marked-9.1.6.tgz", + "integrity": "sha512-jcByLnIFkd5gSXZmjNvS1TlmRhCXZjIzHYlaGkPlLIekG55JDR2Z4va9tZwCiP+/RDERiNhMOFu01xd6O5ct1Q==", + "bin": { + "marked": "bin/marked.js" }, "engines": { - "node": ">=4.0.0" + "node": ">= 16" } }, - "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-cache-semantics": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", - "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", - "optional": 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==", + "node_modules/marked-terminal": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/marked-terminal/-/marked-terminal-6.2.0.tgz", + "integrity": "sha512-ubWhwcBFHnXsjYNsu+Wndpg0zhY4CahSpPlA70PlO0rR9r2sZpkyU+rkCsOWH+KMEkx847UpALON+HWgxowFtw==", "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" + "ansi-escapes": "^6.2.0", + "cardinal": "^2.1.1", + "chalk": "^5.3.0", + "cli-table3": "^0.6.3", + "node-emoji": "^2.1.3", + "supports-hyperlinks": "^3.0.0" }, "engines": { - "node": ">= 0.8" + "node": ">=16.0.0" + }, + "peerDependencies": { + "marked": ">=1 <12" } }, - "node_modules/http-errors/node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "node_modules/marked-terminal/node_modules/chalk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", "engines": { - "node": ">= 0.8" + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/http-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", - "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "node_modules/matcher": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/matcher/-/matcher-3.0.0.tgz", + "integrity": "sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==", + "dev": true, "dependencies": { - "@tootallnate/once": "2", - "agent-base": "6", - "debug": "4" + "escape-string-regexp": "^4.0.0" }, "engines": { - "node": ">= 6" + "node": ">=10" } }, - "node_modules/http-proxy-agent/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" - }, + "node_modules/matcher/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": ">=6.0" + "node": ">=10" }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/http-proxy-agent/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/http-reasons": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/http-reasons/-/http-reasons-0.1.0.tgz", - "integrity": "sha512-P6kYh0lKZ+y29T2Gqz+RlC9WBLhKe8kDmcJ+A+611jFfxdPsbMRQ5aNmFRM3lENqFkK+HTTL+tlQviAiv0AbLQ==", - "dev": true - }, - "node_modules/http-signature": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.3.6.tgz", - "integrity": "sha512-3adrsD6zqo4GsTqtO7FyrejHNv+NgiIfAfv68+jVlFmSr9OGy7zrxONceFRLKvnnZA5jbxQBX1u9PpB6Wi32Gw==", + "node_modules/md5": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/md5/-/md5-2.3.0.tgz", + "integrity": "sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==", "dev": true, "dependencies": { - "assert-plus": "^1.0.0", - "jsprim": "^2.0.2", - "sshpk": "^1.14.1" - }, + "charenc": "0.0.2", + "crypt": "0.0.2", + "is-buffer": "~1.1.6" + } + }, + "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.10" + "node": ">= 0.6" } }, - "node_modules/httpntlm": { - "version": "1.7.7", - "resolved": "https://registry.npmjs.org/httpntlm/-/httpntlm-1.7.7.tgz", - "integrity": "sha512-Pv2Rvrz8H0qv1Dne5mAdZ9JegG1uc6Vu5lwLflIY6s8RKHdZQbW39L4dYswSgqMDT0pkJILUTKjeyU0VPNRZjA==", + "node_modules/memoizee": { + "version": "0.4.15", + "resolved": "https://registry.npmjs.org/memoizee/-/memoizee-0.4.15.tgz", + "integrity": "sha512-UBWmJpLZd5STPm7PMUlOw/TSy972M+z8gcyQ5veOnSDRREz/0bmpyTfKt3/51DhEBqCZQn1udM/5flcSPYhkdQ==", "dev": true, "dependencies": { - "httpreq": ">=0.4.22", - "underscore": "~1.12.1" - }, + "d": "^1.0.1", + "es5-ext": "^0.10.53", + "es6-weak-map": "^2.0.3", + "event-emitter": "^0.3.5", + "is-promise": "^2.2.2", + "lru-queue": "^0.1.0", + "next-tick": "^1.1.0", + "timers-ext": "^0.1.7" + } + }, + "node_modules/meow": { + "version": "12.1.1", + "resolved": "https://registry.npmjs.org/meow/-/meow-12.1.1.tgz", + "integrity": "sha512-BhXM0Au22RwUneMPwSCnyhTOizdWoIEPU9sp0Aqa1PnDMR5Wv2FGXYDjuzJEIX+Eo2Rb8xuYe5jrnm5QowQFkw==", "engines": { - "node": ">=0.8.0" + "node": ">=16.10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/httpntlm/node_modules/underscore": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.12.1.tgz", - "integrity": "sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw==", - "dev": true + "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/httpreq": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/httpreq/-/httpreq-0.5.2.tgz", - "integrity": "sha512-2Jm+x9WkExDOeFRrdBCBSpLPT5SokTcRHkunV3pjKmX/cx6av8zQ0WtHUMDrYb6O4hBFzNU6sxJEypvRUVYKnw==", - "dev": true, + "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==" + }, + "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": ">= 6.15.1" + "node": ">= 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" - }, + "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": ">= 6" + "node": ">= 0.6" } }, - "node_modules/https-proxy-agent/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "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": { - "ms": "2.1.2" + "braces": "^3.0.2", + "picomatch": "^2.3.1" }, "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "node": ">=8.6" } }, - "node_modules/https-proxy-agent/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/mime": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/mime/-/mime-4.0.1.tgz", + "integrity": "sha512-5lZ5tyrIfliMXzFtkYyekWbtRXObT9OWa8IwQ5uxTBDHucNNwniRqo0yInflj+iYi5CBa6qxadGzGarDfuEOxA==", + "funding": [ + "https://github.com/sponsors/broofa" + ], + "bin": { + "mime": "bin/cli.js" + }, + "engines": { + "node": ">=16" + } }, - "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==", + "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": ">=10.17.0" + "node": ">= 0.6" } }, - "node_modules/humanize-ms": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", - "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", - "optional": true, + "node_modules/mime-format": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mime-format/-/mime-format-2.0.1.tgz", + "integrity": "sha512-XxU3ngPbEnrYnNbIX+lYSaYg0M01v6p2ntd2YaFksTu0vayaw5OJvbdRyWs07EYRlLED5qadUZ+xo+XhOvFhwg==", + "dev": true, "dependencies": { - "ms": "^2.0.0" + "charset": "^1.0.0" } }, - "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==", + "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": { - "safer-buffer": ">= 2.1.2 < 3" + "mime-db": "1.52.0" }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.6" } }, - "node_modules/ienoopen": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/ienoopen/-/ienoopen-1.1.0.tgz", - "integrity": "sha512-MFs36e/ca6ohEKtinTJ5VvAJ6oDRAYFdYXweUnGY9L9vcoqFOU4n2ZhmJ0C4z/cwGZ3YIQRSB3XZ1+ghZkY5NQ==", + "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==", "engines": { - "node": ">=4.0.0" + "node": ">=6" } }, - "node_modules/ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "dev": true, - "engines": { - "node": ">= 4" - } + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "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==", + "node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" + "brace-expansion": "^2.0.1" }, "engines": { - "node": ">=6" + "node": ">=16 || 14 >=14.17" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/import-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/import-from/-/import-from-4.0.0.tgz", - "integrity": "sha512-P9J71vT5nLlDeV8FHs5nNxaLbrpfAV5cF5srvbZfpwpcJoM/xZR3hiv+q+SAnuSmuGbXMWud063iIMx/V/EWZQ==", - "engines": { - "node": ">=12.2" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node_modules/minimatch/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dependencies": { + "balanced-match": "^1.0.0" } }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "devOptional": true, - "engines": { - "node": ">=0.8.19" + "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/indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "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/infer-owner": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", - "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", - "optional": true + "node_modules/minipass-collect": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", + "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", + "optional": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } }, - "node_modules/inflection": { - "version": "1.13.4", - "resolved": "https://registry.npmjs.org/inflection/-/inflection-1.13.4.tgz", - "integrity": "sha512-6I/HUDeYFfuNCVS3td055BaXBwKYuzw7K3ExVMStBowKo9oOAMJIXIHvdyR3iboTCp1b+1i5DSkIZTcwIktuDw==", - "engines": [ - "node >= 0.4.0" - ] + "node_modules/minipass-fetch": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-1.4.1.tgz", + "integrity": "sha512-CGH1eblLq26Y15+Azk7ey4xh0J/XfJfrCox5LDJiKqI2Q2iwOLOKrlmIaODiSQS8d18jalF6y2K2ePUm0CmShw==", + "optional": true, + "dependencies": { + "minipass": "^3.1.0", + "minipass-sized": "^1.0.3", + "minizlib": "^2.0.0" + }, + "engines": { + "node": ">=8" + }, + "optionalDependencies": { + "encoding": "^0.1.12" + } }, - "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==", + "node_modules/minipass-flush": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", + "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", + "optional": true, "dependencies": { - "once": "^1.3.0", - "wrappy": "1" + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" } }, - "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/minipass-pipeline": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", + "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", + "optional": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } }, - "node_modules/ini": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", - "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", + "node_modules/minipass-sized": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", + "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", + "optional": true, + "dependencies": { + "minipass": "^3.0.0" + }, "engines": { - "node": ">=10" + "node": ">=8" } }, - "node_modules/inquirer": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.5.2.tgz", - "integrity": "sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ==", - "dev": true, + "node_modules/minipass/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/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", "dependencies": { - "ansi-escapes": "^3.2.0", - "chalk": "^2.4.2", - "cli-cursor": "^2.1.0", - "cli-width": "^2.0.0", - "external-editor": "^3.0.3", - "figures": "^2.0.0", - "lodash": "^4.17.12", - "mute-stream": "0.0.7", - "run-async": "^2.2.0", - "rxjs": "^6.4.0", - "string-width": "^2.1.0", - "strip-ansi": "^5.1.0", - "through": "^2.3.6" + "minipass": "^3.0.0", + "yallist": "^4.0.0" }, "engines": { - "node": ">=6.0.0" + "node": ">= 8" } }, - "node_modules/inquirer/node_modules/ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "node_modules/minizlib/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/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/mocha": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.2.0.tgz", + "integrity": "sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg==", "dev": true, + "dependencies": { + "ansi-colors": "4.1.1", + "browser-stdout": "1.3.1", + "chokidar": "3.5.3", + "debug": "4.3.4", + "diff": "5.0.0", + "escape-string-regexp": "4.0.0", + "find-up": "5.0.0", + "glob": "7.2.0", + "he": "1.2.0", + "js-yaml": "4.1.0", + "log-symbols": "4.1.0", + "minimatch": "5.0.1", + "ms": "2.1.3", + "nanoid": "3.3.3", + "serialize-javascript": "6.0.0", + "strip-json-comments": "3.1.1", + "supports-color": "8.1.1", + "workerpool": "6.2.1", + "yargs": "16.2.0", + "yargs-parser": "20.2.4", + "yargs-unparser": "2.0.0" + }, + "bin": { + "_mocha": "bin/_mocha", + "mocha": "bin/mocha.js" + }, "engines": { - "node": ">=6" + "node": ">= 14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mochajs" } }, - "node_modules/inquirer/node_modules/strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "node_modules/mocha-junit-reporter": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/mocha-junit-reporter/-/mocha-junit-reporter-2.2.1.tgz", + "integrity": "sha512-iDn2tlKHn8Vh8o4nCzcUVW4q7iXp7cC4EB78N0cDHIobLymyHNwe0XG8HEHHjc3hJlXm0Vy6zcrxaIhnI2fWmw==", "dev": true, "dependencies": { - "ansi-regex": "^4.1.0" + "debug": "^4.3.4", + "md5": "^2.3.0", + "mkdirp": "^3.0.0", + "strip-ansi": "^6.0.1", + "xml": "^1.0.1" }, - "engines": { - "node": ">=6" + "peerDependencies": { + "mocha": ">=2.2.5" } }, - "node_modules/internal-slot": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", - "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", + "node_modules/mocha-junit-reporter/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": { - "get-intrinsic": "^1.2.0", - "has": "^1.0.3", - "side-channel": "^1.0.4" + "ms": "2.1.2" }, "engines": { - "node": ">= 0.4" + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": 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==", + "node_modules/mocha-junit-reporter/node_modules/mkdirp": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz", + "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==", + "dev": true, + "bin": { + "mkdirp": "dist/cjs/src/bin.js" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/mocha-junit-reporter/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/mocha/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": { - "from2": "^2.3.0", - "p-is-promise": "^3.0.0" + "ms": "2.1.2" }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/mocha/node_modules/debug/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/mocha/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" }, @@ -8705,2688 +8475,3352 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/ip": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", - "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==", - "optional": true - }, - "node_modules/ip-regex": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", - "integrity": "sha512-58yWmlHpp7VYfcdTwMTvwMmqx/Elfxjd9RXTDyMsbL7lLWmhMylLEqiYVLKuLzOZqVgiWXD9MfR62Vv89VRxkw==", + "node_modules/mocha/node_modules/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, "engines": { - "node": ">=4" + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "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==", + "node_modules/mocha/node_modules/glob/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": ">= 0.10" + "node": "*" } }, - "node_modules/is-admin": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-admin/-/is-admin-3.0.0.tgz", - "integrity": "sha512-wOa3CXFJAu8BZ2BDtG9xYOOrsq6oiSvc2jFPy4X/HINx5bmJUcW8e+apItVbU2E7GIfBVaFVO7Zit4oAWtTJcw==", + "node_modules/mocha/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/mocha/node_modules/minimatch": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", + "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mocha/node_modules/minimatch/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/mocha/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==", + "dev": true + }, + "node_modules/mocha/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/moment": { + "version": "2.30.1", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz", + "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==", + "engines": { + "node": "*" + } + }, + "node_modules/moment-timezone": { + "version": "0.5.44", + "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.44.tgz", + "integrity": "sha512-nv3YpzI/8lkQn0U6RkLd+f0W/zy/JnoR5/EyPz/dNkPTBjA2jNLCVxaiQ8QpeLymhSZvX0wCL5s27NQWdOPwAw==", + "dependencies": { + "moment": "^2.29.4" + }, + "engines": { + "node": "*" + } + }, + "node_modules/morgan": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.10.0.tgz", + "integrity": "sha512-AbegBVI4sh6El+1gNwvD5YIck7nSA36weD7xvIxG4in80j/UoK8AEGaWnnz8v1GxonMCltmlNs5ZKbGvl9b1XQ==", + "dependencies": { + "basic-auth": "~2.0.1", + "debug": "2.6.9", + "depd": "~2.0.0", + "on-finished": "~2.3.0", + "on-headers": "~1.0.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/morgan/node_modules/on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/multer": { + "version": "1.4.5-lts.1", + "resolved": "https://registry.npmjs.org/multer/-/multer-1.4.5-lts.1.tgz", + "integrity": "sha512-ywPWvcDMeH+z9gQq5qYHCCy+ethsk4goepZ45GLD63fOu0YcNecQxi64nDs3qluZB+murG3/D4dJ7+dGctcCQQ==", + "dependencies": { + "append-field": "^1.0.0", + "busboy": "^1.0.0", + "concat-stream": "^1.5.2", + "mkdirp": "^0.5.4", + "object-assign": "^4.1.1", + "type-is": "^1.6.4", + "xtend": "^4.0.0" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/multer/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/nanoid": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz", + "integrity": "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==", + "dev": true, + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "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/nconf": { + "version": "0.12.1", + "resolved": "https://registry.npmjs.org/nconf/-/nconf-0.12.1.tgz", + "integrity": "sha512-p2cfF+B3XXacQdswUYWZ0w6Vld0832A/tuqjLBu3H1sfUcby4N2oVbGhyuCkZv+t3iY3aiFEj7gZGqax9Q2c1w==", + "dependencies": { + "async": "^3.0.0", + "ini": "^2.0.0", + "secure-keys": "^1.0.0", + "yargs": "^16.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "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/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==" + }, + "node_modules/nerf-dart": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/nerf-dart/-/nerf-dart-1.0.0.tgz", + "integrity": "sha512-EZSPZB70jiVsivaBLYDCyntd5eH8NTSMOn3rB+HxwdmKThGELLdYv8qVIMWvZEFy9w8ZZpW9h9OB32l1rGtj7g==" + }, + "node_modules/newman": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/newman/-/newman-6.1.0.tgz", + "integrity": "sha512-0A/dSVnGvmnNv6RatCNMIYnSfMqkUjBLMac/Lvo+C0Zr8BQbweBuEw+zNR1kgPiBwUQmYVkRvGWJwI/cE3N2qA==", + "dev": true, + "dependencies": { + "@postman/tough-cookie": "4.1.3-postman.1", + "async": "3.2.5", + "chardet": "2.0.0", + "cli-progress": "3.12.0", + "cli-table3": "0.6.3", + "colors": "1.4.0", + "commander": "11.1.0", + "csv-parse": "4.16.3", + "filesize": "10.1.0", + "liquid-json": "0.3.1", + "lodash": "4.17.21", + "mkdirp": "3.0.1", + "postman-collection": "4.3.0", + "postman-collection-transformer": "4.1.8", + "postman-request": "2.88.1-postman.33", + "postman-runtime": "7.36.1", + "pretty-ms": "7.0.1", + "semver": "7.5.4", + "serialised-error": "1.1.3", + "word-wrap": "1.2.5", + "xmlbuilder": "15.1.1" + }, + "bin": { + "newman": "bin/newman.js" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/newman-reporter-junitfull": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/newman-reporter-junitfull/-/newman-reporter-junitfull-1.1.1.tgz", + "integrity": "sha512-ET5rU1qkeJ5yvFxcKQFkqGxWia50kdnufm1uzyeNYlUg6T+k07AvOS0mfp/Ejr0njnsiPfFLb9kC48F8pafq9A==", + "dev": true, + "dependencies": { + "lodash": "^4.17.10", + "moment": "^2.22.2", + "xmlbuilder": "^10.0.0" + }, + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "newman": ">=4" + } + }, + "node_modules/newman-reporter-junitfull/node_modules/xmlbuilder": { + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-10.1.1.tgz", + "integrity": "sha512-OyzrcFLL/nb6fMGHbiRDuPup9ljBycsdCypwuyg5AAHvyWzGfChJpCXMG88AGTIMFhGZ9RccFN1e6lhg3hkwKg==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/newman/node_modules/mkdirp": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz", + "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==", + "dev": true, + "bin": { + "mkdirp": "dist/cjs/src/bin.js" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/next-tick": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", + "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==", + "dev": true + }, + "node_modules/nise": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/nise/-/nise-5.1.5.tgz", + "integrity": "sha512-VJuPIfUFaXNRzETTQEEItTOP8Y171ijr+JLq42wHes3DiryR8vT+1TXQW/Rx8JNUhyYYWyIvjXTU6dOhJcs9Nw==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^2.0.0", + "@sinonjs/fake-timers": "^10.0.2", + "@sinonjs/text-encoding": "^0.7.1", + "just-extend": "^4.0.2", + "path-to-regexp": "^1.7.0" + } + }, + "node_modules/nise/node_modules/@sinonjs/commons": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-2.0.0.tgz", + "integrity": "sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==", + "dev": true, + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/nise/node_modules/@sinonjs/fake-timers": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", + "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^3.0.0" + } + }, + "node_modules/nise/node_modules/@sinonjs/fake-timers/node_modules/@sinonjs/commons": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.0.tgz", + "integrity": "sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA==", + "dev": true, + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/nise/node_modules/path-to-regexp": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", + "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", + "dev": true, + "dependencies": { + "isarray": "0.0.1" + } + }, + "node_modules/node-addon-api": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-4.3.0.tgz", + "integrity": "sha512-73sE9+3UaLYYFmDsFZnqCInzPyh3MqIwZO9cw58yIqAZhONrrabrYyYe3TuIqtIiOuTXVhsGau8hcrhhwSsDIQ==" + }, + "node_modules/node-emoji": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-2.1.3.tgz", + "integrity": "sha512-E2WEOVsgs7O16zsURJ/eH8BqhF029wGpEOnv7Urwdo2wmQanOACwJQh0devF9D9RhoZru0+9JXIS0dBXIAz+lA==", + "dependencies": { + "@sindresorhus/is": "^4.6.0", + "char-regex": "^1.0.2", + "emojilib": "^2.4.0", + "skin-tone": "^2.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/node-fetch": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.9.tgz", + "integrity": "sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg==", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-forge": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", + "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", + "dev": true, + "engines": { + "node": ">= 6.13.0" + } + }, + "node_modules/node-gyp": { + "version": "8.4.1", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-8.4.1.tgz", + "integrity": "sha512-olTJRgUtAb/hOXG0E93wZDs5YiJlgbXxTwQAFHyNlRsXQnYzUaF2aGgujZbw+hR8aF4ZG/rST57bWMWD16jr9w==", + "optional": true, + "dependencies": { + "env-paths": "^2.2.0", + "glob": "^7.1.4", + "graceful-fs": "^4.2.6", + "make-fetch-happen": "^9.1.0", + "nopt": "^5.0.0", + "npmlog": "^6.0.0", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.2", + "which": "^2.0.2" + }, + "bin": { + "node-gyp": "bin/node-gyp.js" + }, + "engines": { + "node": ">= 10.12.0" + } + }, + "node_modules/node-gyp/node_modules/are-we-there-yet": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz", + "integrity": "sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==", + "optional": true, + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/node-gyp/node_modules/gauge": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz", + "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==", + "optional": true, + "dependencies": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.3", + "console-control-strings": "^1.1.0", + "has-unicode": "^2.0.1", + "signal-exit": "^3.0.7", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.5" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/node-gyp/node_modules/nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "optional": true, + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/node-gyp/node_modules/npmlog": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz", + "integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==", + "optional": true, + "dependencies": { + "are-we-there-yet": "^3.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^4.0.3", + "set-blocking": "^2.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/node-gyp/node_modules/readable-stream": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.1.tgz", + "integrity": "sha512-+rQmrWMYGA90yenhTYsLWAsLsqVC8osOw6PKE1HDYiO0gdPeKe/xDHNzIAIn4C91YQ6oenEhfYqqc1883qHbjQ==", + "optional": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/node-gyp/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==", + "optional": true, + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/node-oauth1": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/node-oauth1/-/node-oauth1-1.3.0.tgz", + "integrity": "sha512-0yggixNfrA1KcBwvh/Hy2xAS1Wfs9dcg6TdFf2zN7gilcAigMdrtZ4ybrBSXBgLvGDw9V1p2MRnGBMq7XjTWLg==", + "dev": true + }, + "node_modules/node-preload": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/node-preload/-/node-preload-0.2.1.tgz", + "integrity": "sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==", + "dev": true, + "dependencies": { + "process-on-spawn": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/node-releases": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.10.tgz", + "integrity": "sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==", + "dev": true + }, + "node_modules/nodemailer": { + "version": "6.9.8", + "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.9.8.tgz", + "integrity": "sha512-cfrYUk16e67Ks051i4CntM9kshRYei1/o/Gi8K1d+R34OIs21xdFnW7Pt7EucmVKA0LKtqUGNcjMZ7ehjl49mQ==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/nodemailer-fetch": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/nodemailer-fetch/-/nodemailer-fetch-1.6.0.tgz", + "integrity": "sha512-P7S5CEVGAmDrrpn351aXOLYs1R/7fD5NamfMCHyi6WIkbjS2eeZUB/TkuvpOQr0bvRZicVqo59+8wbhR3yrJbQ==" + }, + "node_modules/nodemailer-shared": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/nodemailer-shared/-/nodemailer-shared-1.1.0.tgz", + "integrity": "sha512-68xW5LSyPWv8R0GLm6veAvm7E+XFXkVgvE3FW0FGxNMMZqMkPFeGDVALfR1DPdSfcoO36PnW7q5AAOgFImEZGg==", + "dependencies": { + "nodemailer-fetch": "1.6.0" + } + }, + "node_modules/nodemailer-smtp-transport": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/nodemailer-smtp-transport/-/nodemailer-smtp-transport-2.7.4.tgz", + "integrity": "sha512-1e86YhJ633OZWk3OHWS5TpuoYXG/LtY2/RzNiB5+EkFifDdqHCNHBnExd5cobx0ZSHJLNGM8EKnDuHRFIjFi6Q==", + "dependencies": { + "nodemailer-shared": "1.1.0", + "nodemailer-wellknown": "0.1.10", + "smtp-connection": "2.12.0" + } + }, + "node_modules/nodemailer-wellknown": { + "version": "0.1.10", + "resolved": "https://registry.npmjs.org/nodemailer-wellknown/-/nodemailer-wellknown-0.1.10.tgz", + "integrity": "sha512-/VV4mjAEjfm2fn0loUvrpjvugw5rgurNjPO4WU24CuVSoeumsyLOTgaEWG8WoGdPxh1biOAp5JxDoy1hlA2zsw==" + }, + "node_modules/nopt": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-6.0.0.tgz", + "integrity": "sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==", + "dev": true, + "dependencies": { + "abbrev": "^1.0.0" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/normalize-package-data": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-6.0.0.tgz", + "integrity": "sha512-UL7ELRVxYBHBgYEtZCXjxuD5vPxnmvMGq0jp/dGPKKrN7tfsBh2IY7TlJ15WWwdjRWD3RJbnsygUurTK3xkPkg==", + "dependencies": { + "hosted-git-info": "^7.0.0", + "is-core-module": "^2.8.1", + "semver": "^7.3.5", + "validate-npm-package-license": "^3.0.4" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "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/normalize-url": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.0.0.tgz", + "integrity": "sha512-uVFpKhj5MheNBJRTiMZ9pE/7hD1QTeEvugSJW/OmLzAp78PB5O6adfMNTvmfKhXBkvCzC+rqifWcVYpGFwTjnw==", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm": { + "version": "10.2.5", + "resolved": "https://registry.npmjs.org/npm/-/npm-10.2.5.tgz", + "integrity": "sha512-lXdZ7titEN8CH5YJk9C/aYRU9JeDxQ4d8rwIIDsvH3SMjLjHTukB2CFstMiB30zXs4vCrPN2WH6cDq1yHBeJAw==", + "bundleDependencies": [ + "@isaacs/string-locale-compare", + "@npmcli/arborist", + "@npmcli/config", + "@npmcli/fs", + "@npmcli/map-workspaces", + "@npmcli/package-json", + "@npmcli/promise-spawn", + "@npmcli/run-script", + "@sigstore/tuf", + "abbrev", + "archy", + "cacache", + "chalk", + "ci-info", + "cli-columns", + "cli-table3", + "columnify", + "fastest-levenshtein", + "fs-minipass", + "glob", + "graceful-fs", + "hosted-git-info", + "ini", + "init-package-json", + "is-cidr", + "json-parse-even-better-errors", + "libnpmaccess", + "libnpmdiff", + "libnpmexec", + "libnpmfund", + "libnpmhook", + "libnpmorg", + "libnpmpack", + "libnpmpublish", + "libnpmsearch", + "libnpmteam", + "libnpmversion", + "make-fetch-happen", + "minimatch", + "minipass", + "minipass-pipeline", + "ms", + "node-gyp", + "nopt", + "normalize-package-data", + "npm-audit-report", + "npm-install-checks", + "npm-package-arg", + "npm-pick-manifest", + "npm-profile", + "npm-registry-fetch", + "npm-user-validate", + "npmlog", + "p-map", + "pacote", + "parse-conflict-json", + "proc-log", + "qrcode-terminal", + "read", + "semver", + "spdx-expression-parse", + "ssri", + "strip-ansi", + "supports-color", + "tar", + "text-table", + "tiny-relative-date", + "treeverse", + "validate-npm-package-name", + "which", + "write-file-atomic" + ], + "dependencies": { + "@isaacs/string-locale-compare": "^1.1.0", + "@npmcli/arborist": "^7.2.1", + "@npmcli/config": "^8.0.2", + "@npmcli/fs": "^3.1.0", + "@npmcli/map-workspaces": "^3.0.4", + "@npmcli/package-json": "^5.0.0", + "@npmcli/promise-spawn": "^7.0.0", + "@npmcli/run-script": "^7.0.2", + "@sigstore/tuf": "^2.2.0", + "abbrev": "^2.0.0", + "archy": "~1.0.0", + "cacache": "^18.0.1", + "chalk": "^5.3.0", + "ci-info": "^4.0.0", + "cli-columns": "^4.0.0", + "cli-table3": "^0.6.3", + "columnify": "^1.6.0", + "fastest-levenshtein": "^1.0.16", + "fs-minipass": "^3.0.3", + "glob": "^10.3.10", + "graceful-fs": "^4.2.11", + "hosted-git-info": "^7.0.1", + "ini": "^4.1.1", + "init-package-json": "^6.0.0", + "is-cidr": "^5.0.3", + "json-parse-even-better-errors": "^3.0.1", + "libnpmaccess": "^8.0.1", + "libnpmdiff": "^6.0.3", + "libnpmexec": "^7.0.4", + "libnpmfund": "^5.0.1", + "libnpmhook": "^10.0.0", + "libnpmorg": "^6.0.1", + "libnpmpack": "^6.0.3", + "libnpmpublish": "^9.0.2", + "libnpmsearch": "^7.0.0", + "libnpmteam": "^6.0.0", + "libnpmversion": "^5.0.1", + "make-fetch-happen": "^13.0.0", + "minimatch": "^9.0.3", + "minipass": "^7.0.4", + "minipass-pipeline": "^1.2.4", + "ms": "^2.1.2", + "node-gyp": "^10.0.1", + "nopt": "^7.2.0", + "normalize-package-data": "^6.0.0", + "npm-audit-report": "^5.0.0", + "npm-install-checks": "^6.3.0", + "npm-package-arg": "^11.0.1", + "npm-pick-manifest": "^9.0.0", + "npm-profile": "^9.0.0", + "npm-registry-fetch": "^16.1.0", + "npm-user-validate": "^2.0.0", + "npmlog": "^7.0.1", + "p-map": "^4.0.0", + "pacote": "^17.0.5", + "parse-conflict-json": "^3.0.1", + "proc-log": "^3.0.0", + "qrcode-terminal": "^0.12.0", + "read": "^2.1.0", + "semver": "^7.5.4", + "spdx-expression-parse": "^3.0.1", + "ssri": "^10.0.5", + "strip-ansi": "^7.1.0", + "supports-color": "^9.4.0", + "tar": "^6.2.0", + "text-table": "~0.2.0", + "tiny-relative-date": "^1.3.0", + "treeverse": "^3.0.0", + "validate-npm-package-name": "^5.0.0", + "which": "^4.0.0", + "write-file-atomic": "^5.0.1" + }, + "bin": { + "npm": "bin/npm-cli.js", + "npx": "bin/npx-cli.js" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "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==", "dependencies": { - "execa": "^1.0.0" + "path-key": "^3.0.0" }, "engines": { "node": ">=8" } }, - "node_modules/is-array-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.1.tgz", - "integrity": "sha512-ASfLknmY8Xa2XtB4wmbz13Wu202baeA18cJBCeCy0wXUHZF0IPyVEXqKEcd+t2fNSLLL1vC6k7lxZEojNbISXQ==", - "dev": true, + "node_modules/npm/node_modules/@colors/colors": { + "version": "1.5.0", + "inBundle": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/npm/node_modules/@isaacs/cliui": { + "version": "8.0.2", + "inBundle": true, + "license": "ISC", "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", - "is-typed-array": "^1.1.10" + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">=12" } }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" + "node_modules/npm/node_modules/@isaacs/cliui/node_modules/emoji-regex": { + "version": "9.2.2", + "inBundle": true, + "license": "MIT" }, - "node_modules/is-bigint": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", - "dev": true, + "node_modules/npm/node_modules/@isaacs/cliui/node_modules/string-width": { + "version": "5.1.2", + "inBundle": true, + "license": "MIT", "dependencies": { - "has-bigints": "^1.0.1" + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "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, + "node_modules/npm/node_modules/@isaacs/string-locale-compare": { + "version": "1.1.0", + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/@npmcli/agent": { + "version": "2.2.0", + "inBundle": true, + "license": "ISC", "dependencies": { - "binary-extensions": "^2.0.0" + "agent-base": "^7.1.0", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.1", + "lru-cache": "^10.0.1", + "socks-proxy-agent": "^8.0.1" }, "engines": { - "node": ">=8" + "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/is-boolean-object": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", - "dev": true, + "node_modules/npm/node_modules/@npmcli/arborist": { + "version": "7.2.2", + "inBundle": true, + "license": "ISC", "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" + "@isaacs/string-locale-compare": "^1.1.0", + "@npmcli/fs": "^3.1.0", + "@npmcli/installed-package-contents": "^2.0.2", + "@npmcli/map-workspaces": "^3.0.2", + "@npmcli/metavuln-calculator": "^7.0.0", + "@npmcli/name-from-folder": "^2.0.0", + "@npmcli/node-gyp": "^3.0.0", + "@npmcli/package-json": "^5.0.0", + "@npmcli/query": "^3.0.1", + "@npmcli/run-script": "^7.0.2", + "bin-links": "^4.0.1", + "cacache": "^18.0.0", + "common-ancestor-path": "^1.0.1", + "hosted-git-info": "^7.0.1", + "json-parse-even-better-errors": "^3.0.0", + "json-stringify-nice": "^1.1.4", + "minimatch": "^9.0.0", + "nopt": "^7.0.0", + "npm-install-checks": "^6.2.0", + "npm-package-arg": "^11.0.1", + "npm-pick-manifest": "^9.0.0", + "npm-registry-fetch": "^16.0.0", + "npmlog": "^7.0.1", + "pacote": "^17.0.4", + "parse-conflict-json": "^3.0.0", + "proc-log": "^3.0.0", + "promise-all-reject-late": "^1.0.0", + "promise-call-limit": "^1.0.2", + "read-package-json-fast": "^3.0.2", + "semver": "^7.3.7", + "ssri": "^10.0.5", + "treeverse": "^3.0.0", + "walk-up-path": "^3.0.1" }, - "engines": { - "node": ">= 0.4" + "bin": { + "arborist": "bin/index.js" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": "^16.14.0 || >=18.0.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==", - "dev": true - }, - "node_modules/is-callable": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", - "dev": true, - "engines": { - "node": ">= 0.4" + "node_modules/npm/node_modules/@npmcli/config": { + "version": "8.0.3", + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/map-workspaces": "^3.0.2", + "ci-info": "^4.0.0", + "ini": "^4.1.0", + "nopt": "^7.0.0", + "proc-log": "^3.0.0", + "read-package-json-fast": "^3.0.2", + "semver": "^7.3.5", + "walk-up-path": "^3.0.1" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/is-core-module": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", - "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", + "node_modules/npm/node_modules/@npmcli/disparity-colors": { + "version": "3.0.0", + "inBundle": true, + "license": "ISC", "dependencies": { - "has": "^1.0.3" + "ansi-styles": "^4.3.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/is-date-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", - "dev": true, + "node_modules/npm/node_modules/@npmcli/disparity-colors/node_modules/ansi-styles": { + "version": "4.3.0", + "inBundle": true, + "license": "MIT", "dependencies": { - "has-tostringtag": "^1.0.0" + "color-convert": "^2.0.1" }, "engines": { - "node": ">= 0.4" + "node": ">=8" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/is-elevated": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-elevated/-/is-elevated-3.0.0.tgz", - "integrity": "sha512-wjcp6RkouU9jpg55zERl+BglvV5j4jx5c/EMvQ+d12j/+nIEenNWPu+qc0tCg3JkLodbKZMg1qhJzEwG4qjclg==", + "node_modules/npm/node_modules/@npmcli/fs": { + "version": "3.1.0", + "inBundle": true, + "license": "ISC", "dependencies": { - "is-admin": "^3.0.0", - "is-root": "^2.1.0" + "semver": "^7.3.5" }, "engines": { - "node": ">=8" + "node": "^14.17.0 || ^16.13.0 || >=18.0.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==", + "node_modules/npm/node_modules/@npmcli/git": { + "version": "5.0.3", + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/promise-spawn": "^7.0.0", + "lru-cache": "^10.0.1", + "npm-pick-manifest": "^9.0.0", + "proc-log": "^3.0.0", + "promise-inflight": "^1.0.1", + "promise-retry": "^2.0.1", + "semver": "^7.3.5", + "which": "^4.0.0" + }, "engines": { - "node": ">=0.10.0" + "node": "^16.14.0 || >=18.0.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==", + "node_modules/npm/node_modules/@npmcli/installed-package-contents": { + "version": "2.0.2", + "inBundle": true, + "license": "ISC", + "dependencies": { + "npm-bundled": "^3.0.0", + "npm-normalize-package-bin": "^3.0.0" + }, + "bin": { + "installed-package-contents": "lib/index.js" + }, "engines": { - "node": ">=4" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "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==", + "node_modules/npm/node_modules/@npmcli/map-workspaces": { + "version": "3.0.4", + "inBundle": true, + "license": "ISC", "dependencies": { - "is-extglob": "^2.1.1" + "@npmcli/name-from-folder": "^2.0.0", + "glob": "^10.2.2", + "minimatch": "^9.0.0", + "read-package-json-fast": "^3.0.0" }, "engines": { - "node": ">=0.10.0" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/is-ip": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-ip/-/is-ip-2.0.0.tgz", - "integrity": "sha512-9MTn0dteHETtyUx8pxqMwg5hMBi3pvlyglJ+b79KOCca0po23337LbVV2Hl4xmMvfw++ljnO0/+5G6G+0Szh6g==", - "dev": true, + "node_modules/npm/node_modules/@npmcli/metavuln-calculator": { + "version": "7.0.0", + "inBundle": true, + "license": "ISC", "dependencies": { - "ip-regex": "^2.0.0" + "cacache": "^18.0.0", + "json-parse-even-better-errors": "^3.0.0", + "pacote": "^17.0.0", + "semver": "^7.3.5" }, "engines": { - "node": ">=4" + "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/is-lambda": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", - "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==", - "optional": true - }, - "node_modules/is-negative-zero": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", - "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", - "dev": true, + "node_modules/npm/node_modules/@npmcli/name-from-folder": { + "version": "2.0.0", + "inBundle": true, + "license": "ISC", "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": "^14.17.0 || ^16.13.0 || >=18.0.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==", + "node_modules/npm/node_modules/@npmcli/node-gyp": { + "version": "3.0.0", + "inBundle": true, + "license": "ISC", "engines": { - "node": ">=0.12.0" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/is-number-like": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/is-number-like/-/is-number-like-1.0.8.tgz", - "integrity": "sha512-6rZi3ezCyFcn5L71ywzz2bS5b2Igl1En3eTlZlvKjpz1n3IZLAYMbKYAIQgFmEu0GENg92ziU/faEOA/aixjbA==", + "node_modules/npm/node_modules/@npmcli/package-json": { + "version": "5.0.0", + "inBundle": true, + "license": "ISC", "dependencies": { - "lodash.isfinite": "^3.3.2" + "@npmcli/git": "^5.0.0", + "glob": "^10.2.2", + "hosted-git-info": "^7.0.0", + "json-parse-even-better-errors": "^3.0.0", + "normalize-package-data": "^6.0.0", + "proc-log": "^3.0.0", + "semver": "^7.5.3" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/is-number-object": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", - "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", - "dev": true, + "node_modules/npm/node_modules/@npmcli/promise-spawn": { + "version": "7.0.0", + "inBundle": true, + "license": "ISC", "dependencies": { - "has-tostringtag": "^1.0.0" + "which": "^4.0.0" }, "engines": { - "node": ">= 0.4" + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@npmcli/query": { + "version": "3.0.1", + "inBundle": true, + "license": "ISC", + "dependencies": { + "postcss-selector-parser": "^6.0.10" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/is-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", - "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "node_modules/npm/node_modules/@npmcli/run-script": { + "version": "7.0.2", + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/node-gyp": "^3.0.0", + "@npmcli/promise-spawn": "^7.0.0", + "node-gyp": "^10.0.0", + "read-package-json-fast": "^3.0.0", + "which": "^4.0.0" + }, "engines": { - "node": ">=8" + "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/is-path-cwd": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", - "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", + "node_modules/npm/node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "inBundle": true, + "license": "MIT", + "optional": true, "engines": { - "node": ">=6" + "node": ">=14" } }, - "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==", + "node_modules/npm/node_modules/@sigstore/bundle": { + "version": "2.1.0", + "inBundle": true, + "license": "Apache-2.0", + "dependencies": { + "@sigstore/protobuf-specs": "^0.2.1" + }, "engines": { - "node": ">=8" + "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", + "node_modules/npm/node_modules/@sigstore/protobuf-specs": { + "version": "0.2.1", + "inBundle": true, + "license": "Apache-2.0", "engines": { - "node": ">=0.10.0" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/is-plain-object": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", - "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", + "node_modules/npm/node_modules/@sigstore/sign": { + "version": "2.2.0", + "inBundle": true, + "license": "Apache-2.0", + "dependencies": { + "@sigstore/bundle": "^2.1.0", + "@sigstore/protobuf-specs": "^0.2.1", + "make-fetch-happen": "^13.0.0" + }, "engines": { - "node": ">=0.10.0" + "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/is-promise": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", - "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==", - "dev": true - }, - "node_modules/is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", - "dev": true, + "node_modules/npm/node_modules/@sigstore/tuf": { + "version": "2.2.0", + "inBundle": true, + "license": "Apache-2.0", "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" + "@sigstore/protobuf-specs": "^0.2.1", + "tuf-js": "^2.1.0" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/is-resolvable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", - "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==", - "dev": true - }, - "node_modules/is-root": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-root/-/is-root-2.1.0.tgz", - "integrity": "sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg==", + "node_modules/npm/node_modules/@tufjs/canonical-json": { + "version": "2.0.0", + "inBundle": true, + "license": "MIT", "engines": { - "node": ">=6" + "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/is-shared-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", - "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", - "dev": true, + "node_modules/npm/node_modules/@tufjs/models": { + "version": "2.0.0", + "inBundle": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2" + "@tufjs/canonical-json": "2.0.0", + "minimatch": "^9.0.3" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": "^16.14.0 || >=18.0.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==", + "node_modules/npm/node_modules/abbrev": { + "version": "2.0.0", + "inBundle": true, + "license": "ISC", "engines": { - "node": ">=0.10.0" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", - "dev": true, + "node_modules/npm/node_modules/abort-controller": { + "version": "3.0.0", + "inBundle": true, + "license": "MIT", "dependencies": { - "has-tostringtag": "^1.0.0" + "event-target-shim": "^5.0.0" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=6.5" } }, - "node_modules/is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", - "dev": true, + "node_modules/npm/node_modules/agent-base": { + "version": "7.1.0", + "inBundle": true, + "license": "MIT", "dependencies": { - "has-symbols": "^1.0.2" + "debug": "^4.3.4" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">= 14" } }, - "node_modules/is-text-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-1.0.1.tgz", - "integrity": "sha512-xFuJpne9oFz5qDaodwmmG08e3CawH/2ZV8Qqza1Ko7Sk8POWbkRdwIoAWVhqvq0XeUzANEhKo2n0IXUGBm7A/w==", + "node_modules/npm/node_modules/aggregate-error": { + "version": "3.1.0", + "inBundle": true, + "license": "MIT", "dependencies": { - "text-extensions": "^1.0.0" + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/is-typed-array": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", - "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", - "dev": true, - "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0" + "node_modules/npm/node_modules/ansi-regex": { + "version": "6.0.1", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=12" }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/npm/node_modules/ansi-styles": { + "version": "6.2.1", + "inBundle": true, + "license": "MIT", "engines": { - "node": ">= 0.4" + "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/is-typedarray": { + "node_modules/npm/node_modules/aproba": { + "version": "2.0.0", + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/archy": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" + "inBundle": true, + "license": "MIT" }, - "node_modules/is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", - "dev": true, - "engines": { - "node": ">=10" + "node_modules/npm/node_modules/are-we-there-yet": { + "version": "4.0.1", + "inBundle": true, + "license": "ISC", + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^4.1.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/is-weakref": { + "node_modules/npm/node_modules/balanced-match": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", - "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", - "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/base64-js": { + "version": "1.5.1", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/bin-links": { + "version": "4.0.3", + "inBundle": true, + "license": "ISC", "dependencies": { - "call-bind": "^1.0.2" + "cmd-shim": "^6.0.0", + "npm-normalize-package-bin": "^3.0.0", + "read-cmd-shim": "^4.0.0", + "write-file-atomic": "^5.0.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.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==", - "dev": true, + "node_modules/npm/node_modules/binary-extensions": { + "version": "2.2.0", + "inBundle": true, + "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "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/npm/node_modules/brace-expansion": { + "version": "2.0.1", + "inBundle": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + "node_modules/npm/node_modules/buffer": { + "version": "6.0.3", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "inBundle": true, + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } }, - "node_modules/isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==" + "node_modules/npm/node_modules/builtins": { + "version": "5.0.1", + "inBundle": true, + "license": "MIT", + "dependencies": { + "semver": "^7.0.0" + } }, - "node_modules/issue-parser": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/issue-parser/-/issue-parser-6.0.0.tgz", - "integrity": "sha512-zKa/Dxq2lGsBIXQ7CUZWTHfvxPC2ej0KfO7fIPqLlHB9J2hJ7rGhZ5rilhuufylr4RXYPzJUeFjKxz305OsNlA==", + "node_modules/npm/node_modules/cacache": { + "version": "18.0.1", + "inBundle": true, + "license": "ISC", "dependencies": { - "lodash.capitalize": "^4.2.1", - "lodash.escaperegexp": "^4.1.2", - "lodash.isplainobject": "^4.0.6", - "lodash.isstring": "^4.0.1", - "lodash.uniqby": "^4.7.0" + "@npmcli/fs": "^3.1.0", + "fs-minipass": "^3.0.0", + "glob": "^10.2.2", + "lru-cache": "^10.0.1", + "minipass": "^7.0.3", + "minipass-collect": "^2.0.1", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "p-map": "^4.0.0", + "ssri": "^10.0.0", + "tar": "^6.1.11", + "unique-filename": "^3.0.0" }, "engines": { - "node": ">=10.13" + "node": "^16.14.0 || >=18.0.0" } }, - "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, + "node_modules/npm/node_modules/chalk": { + "version": "5.3.0", + "inBundle": true, + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/npm/node_modules/chownr": { + "version": "2.0.0", + "inBundle": true, + "license": "ISC", "engines": { - "node": ">=8" + "node": ">=10" } }, - "node_modules/istanbul-lib-hook": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz", - "integrity": "sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ==", - "dev": true, - "dependencies": { - "append-transform": "^2.0.0" - }, + "node_modules/npm/node_modules/ci-info": { + "version": "4.0.0", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "inBundle": true, + "license": "MIT", "engines": { "node": ">=8" } }, - "node_modules/istanbul-lib-instrument": { + "node_modules/npm/node_modules/cidr-regex": { "version": "4.0.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", - "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", - "dev": true, + "inBundle": true, + "license": "BSD-2-Clause", "dependencies": { - "@babel/core": "^7.7.5", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.0.0", - "semver": "^6.3.0" + "ip-regex": "^5.0.0" }, "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-instrument/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" + "node": ">=14" } }, - "node_modules/istanbul-lib-processinfo": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.3.tgz", - "integrity": "sha512-NkwHbo3E00oybX6NGJi6ar0B29vxyvNwoC7eJ4G4Yq28UfY758Hgn/heV8VRFhevPED4LXfFz0DQ8z/0kw9zMg==", - "dev": true, - "dependencies": { - "archy": "^1.0.0", - "cross-spawn": "^7.0.3", - "istanbul-lib-coverage": "^3.2.0", - "p-map": "^3.0.0", - "rimraf": "^3.0.0", - "uuid": "^8.3.2" - }, + "node_modules/npm/node_modules/clean-stack": { + "version": "2.2.0", + "inBundle": true, + "license": "MIT", "engines": { - "node": ">=8" + "node": ">=6" } }, - "node_modules/istanbul-lib-processinfo/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, + "node_modules/npm/node_modules/cli-columns": { + "version": "4.0.0", + "inBundle": true, + "license": "MIT", "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1" }, "engines": { - "node": ">= 8" + "node": ">= 10" } }, - "node_modules/istanbul-lib-processinfo/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, + "node_modules/npm/node_modules/cli-columns/node_modules/ansi-regex": { + "version": "5.0.1", + "inBundle": true, + "license": "MIT", "engines": { "node": ">=8" } }, - "node_modules/istanbul-lib-processinfo/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, + "node_modules/npm/node_modules/cli-columns/node_modules/strip-ansi": { + "version": "6.0.1", + "inBundle": true, + "license": "MIT", "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" + "ansi-regex": "^5.0.1" }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "engines": { + "node": ">=8" } }, - "node_modules/istanbul-lib-processinfo/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, + "node_modules/npm/node_modules/cli-table3": { + "version": "0.6.3", + "inBundle": true, + "license": "MIT", "dependencies": { - "shebang-regex": "^3.0.0" + "string-width": "^4.2.0" }, "engines": { - "node": ">=8" + "node": "10.* || >= 12.*" + }, + "optionalDependencies": { + "@colors/colors": "1.5.0" } }, - "node_modules/istanbul-lib-processinfo/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, + "node_modules/npm/node_modules/clone": { + "version": "1.0.4", + "inBundle": true, + "license": "MIT", "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-processinfo/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==", - "dev": true, - "bin": { - "uuid": "dist/bin/uuid" + "node": ">=0.8" } }, - "node_modules/istanbul-lib-processinfo/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" - }, + "node_modules/npm/node_modules/cmd-shim": { + "version": "6.0.2", + "inBundle": true, + "license": "ISC", "engines": { - "node": ">= 8" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "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, + "node_modules/npm/node_modules/color-convert": { + "version": "2.0.1", + "inBundle": true, + "license": "MIT", "dependencies": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^3.0.0", - "supports-color": "^7.1.0" + "color-name": "~1.1.4" }, "engines": { - "node": ">=8" + "node": ">=7.0.0" } }, - "node_modules/istanbul-lib-report/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/npm/node_modules/color-name": { + "version": "1.1.4", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/color-support": { + "version": "1.1.3", + "inBundle": true, + "license": "ISC", + "bin": { + "color-support": "bin.js" } }, - "node_modules/istanbul-lib-report/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, + "node_modules/npm/node_modules/columnify": { + "version": "1.6.0", + "inBundle": true, + "license": "MIT", "dependencies": { - "has-flag": "^4.0.0" + "strip-ansi": "^6.0.1", + "wcwidth": "^1.0.0" }, "engines": { - "node": ">=8" + "node": ">=8.0.0" } }, - "node_modules/istanbul-lib-source-maps": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", - "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", - "dev": true, - "dependencies": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" - }, + "node_modules/npm/node_modules/columnify/node_modules/ansi-regex": { + "version": "5.0.1", + "inBundle": true, + "license": "MIT", "engines": { - "node": ">=10" + "node": ">=8" } }, - "node_modules/istanbul-lib-source-maps/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, + "node_modules/npm/node_modules/columnify/node_modules/strip-ansi": { + "version": "6.0.1", + "inBundle": true, + "license": "MIT", "dependencies": { - "ms": "2.1.2" + "ansi-regex": "^5.0.1" }, "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "node": ">=8" } }, - "node_modules/istanbul-lib-source-maps/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/npm/node_modules/common-ancestor-path": { + "version": "1.0.1", + "inBundle": true, + "license": "ISC" }, - "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, + "node_modules/npm/node_modules/console-control-strings": { + "version": "1.1.0", + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/cross-spawn": { + "version": "7.0.3", + "inBundle": true, + "license": "MIT", "dependencies": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" }, "engines": { - "node": ">=8" + "node": ">= 8" } }, - "node_modules/jake": { - "version": "10.8.5", - "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.5.tgz", - "integrity": "sha512-sVpxYeuAhWt0OTWITwT98oyV0GsXyMlXCF+3L1SuafBVUIr/uILGRB+NqwkzhgXKvoJpDIpQvqkUALgdmQsQxw==", - "dependencies": { - "async": "^3.2.3", - "chalk": "^4.0.2", - "filelist": "^1.0.1", - "minimatch": "^3.0.4" + "node_modules/npm/node_modules/cross-spawn/node_modules/which": { + "version": "2.0.2", + "inBundle": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" }, "bin": { - "jake": "bin/cli.js" + "node-which": "bin/node-which" }, "engines": { - "node": ">=10" + "node": ">= 8" } }, - "node_modules/jake/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" + "node_modules/npm/node_modules/cssesc": { + "version": "3.0.0", + "inBundle": true, + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "node": ">=4" } }, - "node_modules/jake/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/npm/node_modules/debug": { + "version": "4.3.4", + "inBundle": true, + "license": "MIT", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "ms": "2.1.2" }, "engines": { - "node": ">=10" + "node": ">=6.0" }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "node_modules/jake/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/npm/node_modules/debug/node_modules/ms": { + "version": "2.1.2", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/defaults": { + "version": "1.0.4", + "inBundle": true, + "license": "MIT", "dependencies": { - "color-name": "~1.1.4" + "clone": "^1.0.2" }, - "engines": { - "node": ">=7.0.0" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/jake/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/npm/node_modules/delegates": { + "version": "1.0.0", + "inBundle": true, + "license": "MIT" }, - "node_modules/jake/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==", + "node_modules/npm/node_modules/diff": { + "version": "5.1.0", + "inBundle": true, + "license": "BSD-3-Clause", "engines": { - "node": ">=8" + "node": ">=0.3.1" } }, - "node_modules/jake/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==", + "node_modules/npm/node_modules/eastasianwidth": { + "version": "0.2.0", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/emoji-regex": { + "version": "8.0.0", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/encoding": { + "version": "0.1.13", + "inBundle": true, + "license": "MIT", + "optional": true, "dependencies": { - "has-flag": "^4.0.0" - }, + "iconv-lite": "^0.6.2" + } + }, + "node_modules/npm/node_modules/env-paths": { + "version": "2.2.1", + "inBundle": true, + "license": "MIT", "engines": { - "node": ">=8" + "node": ">=6" } }, - "node_modules/java-properties": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/java-properties/-/java-properties-1.0.2.tgz", - "integrity": "sha512-qjdpeo2yKlYTH7nFdK0vbZWuTCesk4o63v5iVOlhMQPfuIZQfW/HI35SjfhA+4qpg36rnFSvUK5b1m+ckIblQQ==", + "node_modules/npm/node_modules/err-code": { + "version": "2.0.3", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/event-target-shim": { + "version": "5.0.1", + "inBundle": true, + "license": "MIT", "engines": { - "node": ">= 0.6.0" + "node": ">=6" } }, - "node_modules/js-beautify": { - "version": "1.14.7", - "resolved": "https://registry.npmjs.org/js-beautify/-/js-beautify-1.14.7.tgz", - "integrity": "sha512-5SOX1KXPFKx+5f6ZrPsIPEY7NwKeQz47n3jm2i+XeHx9MoRsfQenlOP13FQhWvg8JRS0+XLO6XYUQ2GX+q+T9A==", - "dev": true, - "dependencies": { - "config-chain": "^1.1.13", - "editorconfig": "^0.15.3", - "glob": "^8.0.3", - "nopt": "^6.0.0" - }, - "bin": { - "css-beautify": "js/bin/css-beautify.js", - "html-beautify": "js/bin/html-beautify.js", - "js-beautify": "js/bin/js-beautify.js" - }, + "node_modules/npm/node_modules/events": { + "version": "3.3.0", + "inBundle": true, + "license": "MIT", "engines": { - "node": ">=10" + "node": ">=0.8.x" } }, - "node_modules/js-beautify/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" + "node_modules/npm/node_modules/exponential-backoff": { + "version": "3.1.1", + "inBundle": true, + "license": "Apache-2.0" + }, + "node_modules/npm/node_modules/fastest-levenshtein": { + "version": "1.0.16", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 4.9.1" } }, - "node_modules/js-beautify/node_modules/glob": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", - "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", - "dev": true, + "node_modules/npm/node_modules/foreground-child": { + "version": "3.1.1", + "inBundle": true, + "license": "ISC", "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" }, "engines": { - "node": ">=12" + "node": ">=14" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/js-beautify/node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "dev": true, + "node_modules/npm/node_modules/fs-minipass": { + "version": "3.0.3", + "inBundle": true, + "license": "ISC", "dependencies": { - "brace-expansion": "^2.0.1" + "minipass": "^7.0.3" }, "engines": { - "node": ">=10" - } - }, - "node_modules/js-sha512": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/js-sha512/-/js-sha512-0.8.0.tgz", - "integrity": "sha512-PWsmefG6Jkodqt+ePTvBZCSMFgN7Clckjd0O7su3I0+BW2QWUTJNzjktHsztGLhncP2h8mcF9V9Y2Ha59pAViQ==", - "dev": true - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" - }, - "node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==" - }, - "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/npm/node_modules/function-bind": { + "version": "1.1.2", + "inBundle": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==" - }, - "node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" - }, - "node_modules/json-schema": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", - "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" - }, - "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==" - }, - "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/json-stringify-safe": { + "node_modules/npm/node_modules/gauge": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==" - }, - "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" + "inBundle": true, + "license": "ISC", + "dependencies": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.3", + "console-control-strings": "^1.1.0", + "has-unicode": "^2.0.1", + "signal-exit": "^4.0.1", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.5" }, "engines": { - "node": ">=6" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "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/npm/node_modules/gauge/node_modules/ansi-regex": { + "version": "5.0.1", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" } }, - "node_modules/jsonparse": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", - "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", - "engines": [ - "node >= 0.2.0" - ] - }, - "node_modules/jsonschema": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/jsonschema/-/jsonschema-1.2.5.tgz", - "integrity": "sha512-kVTF+08x25PQ0CjuVc0gRM9EUPb0Fe9Ln/utFOgcdxEIOHuU7ooBk/UPTd7t1M91pP35m0MU1T8M5P7vP1bRRw==", + "node_modules/npm/node_modules/gauge/node_modules/strip-ansi": { + "version": "6.0.1", + "inBundle": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, "engines": { - "node": "*" + "node": ">=8" } }, - "node_modules/JSONStream": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", - "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", + "node_modules/npm/node_modules/glob": { + "version": "10.3.10", + "inBundle": true, + "license": "ISC", "dependencies": { - "jsonparse": "^1.2.0", - "through": ">=2.2.7 <3" + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.5", + "minimatch": "^9.0.1", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" }, "bin": { - "JSONStream": "bin.js" + "glob": "dist/esm/bin.mjs" }, "engines": { - "node": "*" + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/jsprim": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-2.0.2.tgz", - "integrity": "sha512-gqXddjPqQ6G40VdnI6T6yObEC+pDNvyP95wdQhkWkg7crHH3km5qP1FsOXEkzEQwnz6gz5qGTn1c2Y52wP3OyQ==", - "dev": true, - "engines": [ - "node >=0.6.0" - ], + "node_modules/npm/node_modules/graceful-fs": { + "version": "4.2.11", + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/has-unicode": { + "version": "2.0.1", + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/hasown": { + "version": "2.0.0", + "inBundle": true, + "license": "MIT", "dependencies": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.4.0", - "verror": "1.10.0" + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" } }, - "node_modules/jsx-ast-utils": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-2.4.1.tgz", - "integrity": "sha512-z1xSldJ6imESSzOjd3NNkieVJKRlKYSOtMG8SFyCj2FIrvSaSuli/WjpBkEzCBoR9bYYYFgqJw61Xhu7Lcgk+w==", - "dev": true, + "node_modules/npm/node_modules/hosted-git-info": { + "version": "7.0.1", + "inBundle": true, + "license": "ISC", "dependencies": { - "array-includes": "^3.1.1", - "object.assign": "^4.1.0" + "lru-cache": "^10.0.1" }, "engines": { - "node": ">=4.0" + "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/just-extend": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.2.1.tgz", - "integrity": "sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg==", - "dev": true + "node_modules/npm/node_modules/http-cache-semantics": { + "version": "4.1.1", + "inBundle": true, + "license": "BSD-2-Clause" }, - "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==", + "node_modules/npm/node_modules/http-proxy-agent": { + "version": "7.0.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, "engines": { - "node": ">=0.10.0" + "node": ">= 14" } }, - "node_modules/levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", - "dev": true, + "node_modules/npm/node_modules/https-proxy-agent": { + "version": "7.0.2", + "inBundle": true, + "license": "MIT", "dependencies": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" + "agent-base": "^7.0.2", + "debug": "4" }, "engines": { - "node": ">= 0.8.0" + "node": ">= 14" } }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" - }, - "node_modules/liquid-json": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/liquid-json/-/liquid-json-0.3.1.tgz", - "integrity": "sha512-wUayTU8MS827Dam6MxgD72Ui+KOSF+u/eIqpatOtjnvgJ0+mnDq33uC2M7J0tPK+upe/DpUAuK4JUU89iBoNKQ==", - "dev": true, + "node_modules/npm/node_modules/iconv-lite": { + "version": "0.6.3", + "inBundle": true, + "license": "MIT", + "optional": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, "engines": { - "node": ">=4" + "node": ">=0.10.0" } }, - "node_modules/load-json-file": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", - "integrity": "sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==", + "node_modules/npm/node_modules/ieee754": { + "version": "1.2.1", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "inBundle": true, + "license": "BSD-3-Clause" + }, + "node_modules/npm/node_modules/ignore-walk": { + "version": "6.0.4", + "inBundle": true, + "license": "ISC", "dependencies": { - "graceful-fs": "^4.1.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0", - "strip-bom": "^3.0.0" + "minimatch": "^9.0.0" }, "engines": { - "node": ">=4" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/load-json-file/node_modules/parse-json": { + "node_modules/npm/node_modules/imurmurhash": { + "version": "0.1.4", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/npm/node_modules/indent-string": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", - "dependencies": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - }, + "inBundle": true, + "license": "MIT", "engines": { - "node": ">=4" + "node": ">=8" } }, - "node_modules/load-json-file/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==", + "node_modules/npm/node_modules/ini": { + "version": "4.1.1", + "inBundle": true, + "license": "ISC", "engines": { - "node": ">=4" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/locate-path": { + "node_modules/npm/node_modules/init-package-json": { "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, + "inBundle": true, + "license": "ISC", "dependencies": { - "p-locate": "^5.0.0" + "npm-package-arg": "^11.0.0", + "promzard": "^1.0.0", + "read": "^2.0.0", + "read-package-json": "^7.0.0", + "semver": "^7.3.5", + "validate-npm-package-license": "^3.0.4", + "validate-npm-package-name": "^5.0.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - }, - "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.capitalize": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/lodash.capitalize/-/lodash.capitalize-4.2.1.tgz", - "integrity": "sha512-kZzYOKspf8XVX5AvmQF94gQW0lejFVgb80G85bU4ZWzoJ6C03PQg3coYAUpSTpQWelrZELd3XWgHzw4Ck5kaIw==" - }, - "node_modules/lodash.escaperegexp": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz", - "integrity": "sha512-TM9YBvyC84ZxE3rgfefxUWiQKLilstD6k7PTGt6wfbtXF8ixIJLOL3VYyV/z+ZiPLsVxAsKAFVwWlWeb2Y8Yyw==" - }, - "node_modules/lodash.flattendeep": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", - "integrity": "sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==", - "dev": true - }, - "node_modules/lodash.isfinite": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/lodash.isfinite/-/lodash.isfinite-3.3.2.tgz", - "integrity": "sha512-7FGG40uhC8Mm633uKW1r58aElFlBlxCrg9JfSi3P6aYiWmfiWF0PgMd86ZUsxE5GwWPdHoS2+48bwTh2VPkIQA==" - }, - "node_modules/lodash.ismatch": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.ismatch/-/lodash.ismatch-4.4.0.tgz", - "integrity": "sha512-fPMfXjGQEV9Xsq/8MTSgUf255gawYRbjwMyDbcvDhXgV7enSZA0hynz6vMPnpAb5iONEzBHBPsT+0zes5Z301g==" - }, - "node_modules/lodash.isplainobject": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", - "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==" - }, - "node_modules/lodash.isstring": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", - "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==" - }, - "node_modules/lodash.padend": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/lodash.padend/-/lodash.padend-4.6.1.tgz", - "integrity": "sha512-sOQs2aqGpbl27tmCS1QNZA09Uqp01ZzWfDUoD+xzTii0E7dSQfRKcRetFwa+uXaxaqL+TKm7CgD2JdKP7aZBSw==" - }, - "node_modules/lodash.uniqby": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/lodash.uniqby/-/lodash.uniqby-4.7.0.tgz", - "integrity": "sha512-e/zcLx6CSbmaEgFHCA7BnoQKyCtKMxnuWrJygbwPs/AIn+IMKl66L8/s+wBUn5LRw2pZx3bUHibiV1b6aTWIww==" + "node_modules/npm/node_modules/ip": { + "version": "2.0.0", + "inBundle": true, + "license": "MIT" }, - "node_modules/log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "dev": true, - "dependencies": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - }, + "node_modules/npm/node_modules/ip-regex": { + "version": "5.0.0", + "inBundle": true, + "license": "MIT", "engines": { - "node": ">=10" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/log-symbols/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, + "node_modules/npm/node_modules/is-cidr": { + "version": "5.0.3", + "inBundle": true, + "license": "BSD-2-Clause", "dependencies": { - "color-convert": "^2.0.1" + "cidr-regex": "4.0.3" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "node": ">=14" } }, - "node_modules/log-symbols/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, + "node_modules/npm/node_modules/is-core-module": { + "version": "2.13.1", + "inBundle": true, + "license": "MIT", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" + "hasown": "^2.0.0" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/log-symbols/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, + "node_modules/npm/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "inBundle": true, + "license": "MIT", "engines": { - "node": ">=7.0.0" + "node": ">=8" } }, - "node_modules/log-symbols/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "node_modules/npm/node_modules/is-lambda": { + "version": "1.0.1", + "inBundle": true, + "license": "MIT" }, - "node_modules/log-symbols/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/npm/node_modules/isexe": { + "version": "2.0.0", + "inBundle": true, + "license": "ISC" }, - "node_modules/log-symbols/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, + "node_modules/npm/node_modules/jackspeak": { + "version": "2.3.6", + "inBundle": true, + "license": "BlueOak-1.0.0", "dependencies": { - "has-flag": "^4.0.0" + "@isaacs/cliui": "^8.0.2" }, "engines": { - "node": ">=8" - } - }, - "node_modules/lolex": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lolex/-/lolex-4.2.0.tgz", - "integrity": "sha512-gKO5uExCXvSm6zbF562EvM+rd1kQDnB9AZBbiQVzf1ZmdDpxUSvpnAaVOP83N/31mRK8Ml8/VE8DMvsAZQ+7wg==", - "dev": true - }, - "node_modules/loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "dev": true, - "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" + "node": ">=14" }, - "bin": { - "loose-envify": "cli.js" + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" } }, - "node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "dependencies": { - "yallist": "^3.0.2" + "node_modules/npm/node_modules/json-parse-even-better-errors": { + "version": "3.0.1", + "inBundle": true, + "license": "MIT", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/lru-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/lru-queue/-/lru-queue-0.1.0.tgz", - "integrity": "sha512-BpdYkt9EvGl8OfWHDQPISVpcl5xZthb+XPsbELj5AQXxIC8IriDZIQYjBJPEm5rS420sjZ0TLEzRcq5KdBhYrQ==", - "dev": true, - "dependencies": { - "es5-ext": "~0.10.2" + "node_modules/npm/node_modules/json-stringify-nice": { + "version": "1.1.4", + "inBundle": true, + "license": "ISC", + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "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==", + "node_modules/npm/node_modules/jsonparse": { + "version": "1.3.1", + "engines": [ + "node >= 0.2.0" + ], + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/just-diff": { + "version": "6.0.2", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/just-diff-apply": { + "version": "5.5.0", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/libnpmaccess": { + "version": "8.0.2", + "inBundle": true, + "license": "ISC", "dependencies": { - "semver": "^6.0.0" + "npm-package-arg": "^11.0.1", + "npm-registry-fetch": "^16.0.0" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/make-dir/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "bin": { - "semver": "bin/semver.js" + "node_modules/npm/node_modules/libnpmdiff": { + "version": "6.0.4", + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/arborist": "^7.2.1", + "@npmcli/disparity-colors": "^3.0.0", + "@npmcli/installed-package-contents": "^2.0.2", + "binary-extensions": "^2.2.0", + "diff": "^5.1.0", + "minimatch": "^9.0.0", + "npm-package-arg": "^11.0.1", + "pacote": "^17.0.4", + "tar": "^6.2.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/make-fetch-happen": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-9.1.0.tgz", - "integrity": "sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg==", - "optional": true, + "node_modules/npm/node_modules/libnpmexec": { + "version": "7.0.5", + "inBundle": true, + "license": "ISC", "dependencies": { - "agentkeepalive": "^4.1.3", - "cacache": "^15.2.0", - "http-cache-semantics": "^4.1.0", - "http-proxy-agent": "^4.0.1", - "https-proxy-agent": "^5.0.0", - "is-lambda": "^1.0.1", - "lru-cache": "^6.0.0", - "minipass": "^3.1.3", - "minipass-collect": "^1.0.2", - "minipass-fetch": "^1.3.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.2", - "promise-retry": "^2.0.1", - "socks-proxy-agent": "^6.0.0", - "ssri": "^8.0.0" + "@npmcli/arborist": "^7.2.1", + "@npmcli/run-script": "^7.0.2", + "ci-info": "^4.0.0", + "npm-package-arg": "^11.0.1", + "npmlog": "^7.0.1", + "pacote": "^17.0.4", + "proc-log": "^3.0.0", + "read": "^2.0.0", + "read-package-json-fast": "^3.0.2", + "semver": "^7.3.7", + "walk-up-path": "^3.0.1" }, "engines": { - "node": ">= 10" + "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/make-fetch-happen/node_modules/@tootallnate/once": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", - "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", - "optional": true, + "node_modules/npm/node_modules/libnpmfund": { + "version": "5.0.2", + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/arborist": "^7.2.1" + }, "engines": { - "node": ">= 6" + "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/make-fetch-happen/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "optional": true, + "node_modules/npm/node_modules/libnpmhook": { + "version": "10.0.1", + "inBundle": true, + "license": "ISC", "dependencies": { - "ms": "2.1.2" + "aproba": "^2.0.0", + "npm-registry-fetch": "^16.0.0" }, "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/make-fetch-happen/node_modules/http-proxy-agent": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", - "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", - "optional": true, + "node_modules/npm/node_modules/libnpmorg": { + "version": "6.0.2", + "inBundle": true, + "license": "ISC", "dependencies": { - "@tootallnate/once": "1", - "agent-base": "6", - "debug": "4" + "aproba": "^2.0.0", + "npm-registry-fetch": "^16.0.0" }, "engines": { - "node": ">= 6" + "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/make-fetch-happen/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==", - "optional": true, + "node_modules/npm/node_modules/libnpmpack": { + "version": "6.0.4", + "inBundle": true, + "license": "ISC", "dependencies": { - "yallist": "^4.0.0" + "@npmcli/arborist": "^7.2.1", + "@npmcli/run-script": "^7.0.2", + "npm-package-arg": "^11.0.1", + "pacote": "^17.0.4" }, "engines": { - "node": ">=10" + "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/make-fetch-happen/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==", - "optional": true - }, - "node_modules/make-fetch-happen/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "optional": true - }, - "node_modules/map-obj": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", - "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==", - "engines": { - "node": ">=8" + "node_modules/npm/node_modules/libnpmpublish": { + "version": "9.0.3", + "inBundle": true, + "license": "ISC", + "dependencies": { + "ci-info": "^4.0.0", + "normalize-package-data": "^6.0.0", + "npm-package-arg": "^11.0.1", + "npm-registry-fetch": "^16.0.0", + "proc-log": "^3.0.0", + "semver": "^7.3.7", + "sigstore": "^2.1.0", + "ssri": "^10.0.5" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/marked": { - "version": "4.2.12", - "resolved": "https://registry.npmjs.org/marked/-/marked-4.2.12.tgz", - "integrity": "sha512-yr8hSKa3Fv4D3jdZmtMMPghgVt6TWbk86WQaWhDloQjRSQhMMYCAro7jP7VDJrjjdV8pxVxMssXS8B8Y5DZ5aw==", - "bin": { - "marked": "bin/marked.js" + "node_modules/npm/node_modules/libnpmsearch": { + "version": "7.0.1", + "inBundle": true, + "license": "ISC", + "dependencies": { + "npm-registry-fetch": "^16.0.0" }, "engines": { - "node": ">= 12" + "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/marked-terminal": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/marked-terminal/-/marked-terminal-5.1.1.tgz", - "integrity": "sha512-+cKTOx9P4l7HwINYhzbrBSyzgxO2HaHKGZGuB1orZsMIgXYaJyfidT81VXRdpelW/PcHEWxywscePVgI/oUF6g==", + "node_modules/npm/node_modules/libnpmteam": { + "version": "6.0.1", + "inBundle": true, + "license": "ISC", "dependencies": { - "ansi-escapes": "^5.0.0", - "cardinal": "^2.1.1", - "chalk": "^5.0.0", - "cli-table3": "^0.6.1", - "node-emoji": "^1.11.0", - "supports-hyperlinks": "^2.2.0" + "aproba": "^2.0.0", + "npm-registry-fetch": "^16.0.0" }, "engines": { - "node": ">=14.13.1 || >=16.0.0" - }, - "peerDependencies": { - "marked": "^1.0.0 || ^2.0.0 || ^3.0.0 || ^4.0.0" + "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/marked-terminal/node_modules/ansi-escapes": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-5.0.0.tgz", - "integrity": "sha512-5GFMVX8HqE/TB+FuBJGuO5XG0WrsA6ptUqoODaT/n9mmUaZFkqnBueB4leqGBCmrUHnCnC4PCZTCd0E7QQ83bA==", + "node_modules/npm/node_modules/libnpmversion": { + "version": "5.0.2", + "inBundle": true, + "license": "ISC", "dependencies": { - "type-fest": "^1.0.2" + "@npmcli/git": "^5.0.3", + "@npmcli/run-script": "^7.0.2", + "json-parse-even-better-errors": "^3.0.0", + "proc-log": "^3.0.0", + "semver": "^7.3.7" }, "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/marked-terminal/node_modules/chalk": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.2.0.tgz", - "integrity": "sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==", + "node_modules/npm/node_modules/lru-cache": { + "version": "10.1.0", + "inBundle": true, + "license": "ISC", "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "node": "14 || >=16.14" } }, - "node_modules/marked-terminal/node_modules/type-fest": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", - "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", - "engines": { - "node": ">=10" + "node_modules/npm/node_modules/make-fetch-happen": { + "version": "13.0.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/agent": "^2.0.0", + "cacache": "^18.0.0", + "http-cache-semantics": "^4.1.1", + "is-lambda": "^1.0.1", + "minipass": "^7.0.2", + "minipass-fetch": "^3.0.0", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.3", + "promise-retry": "^2.0.1", + "ssri": "^10.0.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/md5": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/md5/-/md5-2.3.0.tgz", - "integrity": "sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==", - "dev": true, + "node_modules/npm/node_modules/minimatch": { + "version": "9.0.3", + "inBundle": true, + "license": "ISC", "dependencies": { - "charenc": "0.0.2", - "crypt": "0.0.2", - "is-buffer": "~1.1.6" + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "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==", + "node_modules/npm/node_modules/minipass": { + "version": "7.0.4", + "inBundle": true, + "license": "ISC", "engines": { - "node": ">= 0.6" + "node": ">=16 || 14 >=14.17" } }, - "node_modules/memoizee": { - "version": "0.4.15", - "resolved": "https://registry.npmjs.org/memoizee/-/memoizee-0.4.15.tgz", - "integrity": "sha512-UBWmJpLZd5STPm7PMUlOw/TSy972M+z8gcyQ5veOnSDRREz/0bmpyTfKt3/51DhEBqCZQn1udM/5flcSPYhkdQ==", - "dev": true, + "node_modules/npm/node_modules/minipass-collect": { + "version": "2.0.1", + "inBundle": true, + "license": "ISC", "dependencies": { - "d": "^1.0.1", - "es5-ext": "^0.10.53", - "es6-weak-map": "^2.0.3", - "event-emitter": "^0.3.5", - "is-promise": "^2.2.2", - "lru-queue": "^0.1.0", - "next-tick": "^1.1.0", - "timers-ext": "^0.1.7" + "minipass": "^7.0.3" + }, + "engines": { + "node": ">=16 || 14 >=14.17" } }, - "node_modules/meow": { - "version": "8.1.2", - "resolved": "https://registry.npmjs.org/meow/-/meow-8.1.2.tgz", - "integrity": "sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==", - "dependencies": { - "@types/minimist": "^1.2.0", - "camelcase-keys": "^6.2.2", - "decamelize-keys": "^1.1.0", - "hard-rejection": "^2.1.0", - "minimist-options": "4.1.0", - "normalize-package-data": "^3.0.0", - "read-pkg-up": "^7.0.1", - "redent": "^3.0.0", - "trim-newlines": "^3.0.0", - "type-fest": "^0.18.0", - "yargs-parser": "^20.2.3" + "node_modules/npm/node_modules/minipass-fetch": { + "version": "3.0.4", + "inBundle": true, + "license": "MIT", + "dependencies": { + "minipass": "^7.0.3", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" }, "engines": { - "node": ">=10" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "optionalDependencies": { + "encoding": "^0.1.13" } }, - "node_modules/meow/node_modules/type-fest": { - "version": "0.18.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", - "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", + "node_modules/npm/node_modules/minipass-flush": { + "version": "1.0.5", + "inBundle": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, "engines": { - "node": ">=10" + "node": ">= 8" + } + }, + "node_modules/npm/node_modules/minipass-flush/node_modules/minipass": { + "version": "3.3.6", + "inBundle": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">=8" } }, - "node_modules/merge-descriptors": { + "node_modules/npm/node_modules/minipass-json-stream": { "version": "1.0.1", - "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==" - }, - "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" + "inBundle": true, + "license": "MIT", + "dependencies": { + "jsonparse": "^1.3.1", + "minipass": "^3.0.0" } }, - "node_modules/methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "node_modules/npm/node_modules/minipass-json-stream/node_modules/minipass": { + "version": "3.3.6", + "inBundle": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, "engines": { - "node": ">= 0.6" + "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==", + "node_modules/npm/node_modules/minipass-pipeline": { + "version": "1.2.4", + "inBundle": true, + "license": "ISC", "dependencies": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" + "minipass": "^3.0.0" }, "engines": { - "node": ">=8.6" + "node": ">=8" } }, - "node_modules/mime": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", - "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==", - "bin": { - "mime": "cli.js" + "node_modules/npm/node_modules/minipass-pipeline/node_modules/minipass": { + "version": "3.3.6", + "inBundle": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" }, "engines": { - "node": ">=10.0.0" + "node": ">=8" } }, - "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==", + "node_modules/npm/node_modules/minipass-sized": { + "version": "1.0.3", + "inBundle": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, "engines": { - "node": ">= 0.6" + "node": ">=8" } }, - "node_modules/mime-format": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/mime-format/-/mime-format-2.0.1.tgz", - "integrity": "sha512-XxU3ngPbEnrYnNbIX+lYSaYg0M01v6p2ntd2YaFksTu0vayaw5OJvbdRyWs07EYRlLED5qadUZ+xo+XhOvFhwg==", - "dev": true, + "node_modules/npm/node_modules/minipass-sized/node_modules/minipass": { + "version": "3.3.6", + "inBundle": true, + "license": "ISC", "dependencies": { - "charset": "^1.0.0" + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "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==", + "node_modules/npm/node_modules/minizlib": { + "version": "2.1.2", + "inBundle": true, + "license": "MIT", "dependencies": { - "mime-db": "1.52.0" + "minipass": "^3.0.0", + "yallist": "^4.0.0" }, "engines": { - "node": ">= 0.6" + "node": ">= 8" } }, - "node_modules/mimic-fn": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", - "dev": true, + "node_modules/npm/node_modules/minizlib/node_modules/minipass": { + "version": "3.3.6", + "inBundle": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, "engines": { - "node": ">=4" + "node": ">=8" } }, - "node_modules/min-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", - "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "node_modules/npm/node_modules/mkdirp": { + "version": "1.0.4", + "inBundle": true, + "license": "MIT", + "bin": { + "mkdirp": "bin/cmd.js" + }, "engines": { - "node": ">=4" + "node": ">=10" } }, - "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" - }, + "node_modules/npm/node_modules/ms": { + "version": "2.1.3", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/mute-stream": { + "version": "1.0.0", + "inBundle": true, + "license": "ISC", "engines": { - "node": "*" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "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/npm/node_modules/negotiator": { + "version": "0.6.3", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" } }, - "node_modules/minimist-options": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", - "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", + "node_modules/npm/node_modules/node-gyp": { + "version": "10.0.1", + "inBundle": true, + "license": "MIT", "dependencies": { - "arrify": "^1.0.1", - "is-plain-obj": "^1.1.0", - "kind-of": "^6.0.3" + "env-paths": "^2.2.0", + "exponential-backoff": "^3.1.1", + "glob": "^10.3.10", + "graceful-fs": "^4.2.6", + "make-fetch-happen": "^13.0.0", + "nopt": "^7.0.0", + "proc-log": "^3.0.0", + "semver": "^7.3.5", + "tar": "^6.1.2", + "which": "^4.0.0" + }, + "bin": { + "node-gyp": "bin/node-gyp.js" }, "engines": { - "node": ">= 6" + "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "node_modules/npm/node_modules/nopt": { + "version": "7.2.0", + "inBundle": true, + "license": "ISC", "dependencies": { - "yallist": "^4.0.0" + "abbrev": "^2.0.0" + }, + "bin": { + "nopt": "bin/nopt.js" }, "engines": { - "node": ">=8" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/minipass-collect": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", - "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", - "optional": true, + "node_modules/npm/node_modules/normalize-package-data": { + "version": "6.0.0", + "inBundle": true, + "license": "BSD-2-Clause", "dependencies": { - "minipass": "^3.0.0" + "hosted-git-info": "^7.0.0", + "is-core-module": "^2.8.1", + "semver": "^7.3.5", + "validate-npm-package-license": "^3.0.4" }, "engines": { - "node": ">= 8" + "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/minipass-fetch": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-1.4.1.tgz", - "integrity": "sha512-CGH1eblLq26Y15+Azk7ey4xh0J/XfJfrCox5LDJiKqI2Q2iwOLOKrlmIaODiSQS8d18jalF6y2K2ePUm0CmShw==", - "optional": true, - "dependencies": { - "minipass": "^3.1.0", - "minipass-sized": "^1.0.3", - "minizlib": "^2.0.0" - }, + "node_modules/npm/node_modules/npm-audit-report": { + "version": "5.0.0", + "inBundle": true, + "license": "ISC", "engines": { - "node": ">=8" - }, - "optionalDependencies": { - "encoding": "^0.1.12" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/minipass-flush": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", - "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", - "optional": true, + "node_modules/npm/node_modules/npm-bundled": { + "version": "3.0.0", + "inBundle": true, + "license": "ISC", "dependencies": { - "minipass": "^3.0.0" + "npm-normalize-package-bin": "^3.0.0" }, "engines": { - "node": ">= 8" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/minipass-pipeline": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", - "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", - "optional": true, + "node_modules/npm/node_modules/npm-install-checks": { + "version": "6.3.0", + "inBundle": true, + "license": "BSD-2-Clause", "dependencies": { - "minipass": "^3.0.0" + "semver": "^7.1.1" }, "engines": { - "node": ">=8" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/minipass-sized": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", - "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", - "optional": true, - "dependencies": { - "minipass": "^3.0.0" - }, + "node_modules/npm/node_modules/npm-normalize-package-bin": { + "version": "3.0.1", + "inBundle": true, + "license": "ISC", "engines": { - "node": ">=8" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/minipass/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/minizlib": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", - "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "node_modules/npm/node_modules/npm-package-arg": { + "version": "11.0.1", + "inBundle": true, + "license": "ISC", "dependencies": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" + "hosted-git-info": "^7.0.0", + "proc-log": "^3.0.0", + "semver": "^7.3.5", + "validate-npm-package-name": "^5.0.0" }, "engines": { - "node": ">= 8" + "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/minizlib/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/mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "node_modules/npm/node_modules/npm-packlist": { + "version": "8.0.1", + "inBundle": true, + "license": "ISC", "dependencies": { - "minimist": "^1.2.6" + "ignore-walk": "^6.0.4" }, - "bin": { - "mkdirp": "bin/cmd.js" + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/mocha": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-9.2.2.tgz", - "integrity": "sha512-L6XC3EdwT6YrIk0yXpavvLkn8h+EU+Y5UcCHKECyMbdUIxyMuZj4bX4U9e1nvnvUUvQVsV2VHQr5zLdcUkhW/g==", - "dev": true, + "node_modules/npm/node_modules/npm-pick-manifest": { + "version": "9.0.0", + "inBundle": true, + "license": "ISC", "dependencies": { - "@ungap/promise-all-settled": "1.1.2", - "ansi-colors": "4.1.1", - "browser-stdout": "1.3.1", - "chokidar": "3.5.3", - "debug": "4.3.3", - "diff": "5.0.0", - "escape-string-regexp": "4.0.0", - "find-up": "5.0.0", - "glob": "7.2.0", - "growl": "1.10.5", - "he": "1.2.0", - "js-yaml": "4.1.0", - "log-symbols": "4.1.0", - "minimatch": "4.2.1", - "ms": "2.1.3", - "nanoid": "3.3.1", - "serialize-javascript": "6.0.0", - "strip-json-comments": "3.1.1", - "supports-color": "8.1.1", - "which": "2.0.2", - "workerpool": "6.2.0", - "yargs": "16.2.0", - "yargs-parser": "20.2.4", - "yargs-unparser": "2.0.0" - }, - "bin": { - "_mocha": "bin/_mocha", - "mocha": "bin/mocha" + "npm-install-checks": "^6.0.0", + "npm-normalize-package-bin": "^3.0.0", + "npm-package-arg": "^11.0.0", + "semver": "^7.3.5" }, "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mochajs" + "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/mocha-junit-reporter": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mocha-junit-reporter/-/mocha-junit-reporter-2.0.0.tgz", - "integrity": "sha512-20HoWh2HEfhqmigfXOKUhZQyX23JImskc37ZOhIjBKoBEsb+4cAFRJpAVhFpnvsztLklW/gFVzsrobjLwmX4lA==", - "dev": true, + "node_modules/npm/node_modules/npm-profile": { + "version": "9.0.0", + "inBundle": true, + "license": "ISC", "dependencies": { - "debug": "^2.2.0", - "md5": "^2.1.0", - "mkdirp": "~0.5.1", - "strip-ansi": "^4.0.0", - "xml": "^1.0.0" + "npm-registry-fetch": "^16.0.0", + "proc-log": "^3.0.0" }, - "peerDependencies": { - "mocha": ">=2.2.5" + "engines": { + "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/mocha/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/mocha/node_modules/debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", - "dev": true, + "node_modules/npm/node_modules/npm-registry-fetch": { + "version": "16.1.0", + "inBundle": true, + "license": "ISC", "dependencies": { - "ms": "2.1.2" + "make-fetch-happen": "^13.0.0", + "minipass": "^7.0.2", + "minipass-fetch": "^3.0.0", + "minipass-json-stream": "^1.0.1", + "minizlib": "^2.1.2", + "npm-package-arg": "^11.0.0", + "proc-log": "^3.0.0" }, "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/mocha/node_modules/debug/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/mocha/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, + "node_modules/npm/node_modules/npm-user-validate": { + "version": "2.0.0", + "inBundle": true, + "license": "BSD-2-Clause", "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/mocha/node_modules/glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", - "dev": true, + "node_modules/npm/node_modules/npmlog": { + "version": "7.0.1", + "inBundle": true, + "license": "ISC", "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "are-we-there-yet": "^4.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^5.0.0", + "set-blocking": "^2.0.0" }, "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/mocha/node_modules/glob/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, + "node_modules/npm/node_modules/p-map": { + "version": "4.0.0", + "inBundle": true, + "license": "MIT", "dependencies": { - "brace-expansion": "^1.1.7" + "aggregate-error": "^3.0.0" }, "engines": { - "node": "*" - } - }, - "node_modules/mocha/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": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/mocha/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, + "node_modules/npm/node_modules/pacote": { + "version": "17.0.5", + "inBundle": true, + "license": "ISC", "dependencies": { - "argparse": "^2.0.1" + "@npmcli/git": "^5.0.0", + "@npmcli/installed-package-contents": "^2.0.1", + "@npmcli/promise-spawn": "^7.0.0", + "@npmcli/run-script": "^7.0.0", + "cacache": "^18.0.0", + "fs-minipass": "^3.0.0", + "minipass": "^7.0.2", + "npm-package-arg": "^11.0.0", + "npm-packlist": "^8.0.0", + "npm-pick-manifest": "^9.0.0", + "npm-registry-fetch": "^16.0.0", + "proc-log": "^3.0.0", + "promise-retry": "^2.0.1", + "read-package-json": "^7.0.0", + "read-package-json-fast": "^3.0.0", + "sigstore": "^2.0.0", + "ssri": "^10.0.0", + "tar": "^6.1.11" }, "bin": { - "js-yaml": "bin/js-yaml.js" + "pacote": "lib/bin.js" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/mocha/node_modules/minimatch": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-4.2.1.tgz", - "integrity": "sha512-9Uq1ChtSZO+Mxa/CL1eGizn2vRn3MlLgzhT0Iz8zaY8NdvxvB0d5QdPFmCKf7JKA9Lerx5vRrnwO03jsSfGG9g==", - "dev": true, + "node_modules/npm/node_modules/parse-conflict-json": { + "version": "3.0.1", + "inBundle": true, + "license": "ISC", "dependencies": { - "brace-expansion": "^1.1.7" + "json-parse-even-better-errors": "^3.0.0", + "just-diff": "^6.0.0", + "just-diff-apply": "^5.2.0" }, "engines": { - "node": ">=10" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/mocha/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==", - "dev": true - }, - "node_modules/mocha/node_modules/strip-json-comments": { + "node_modules/npm/node_modules/path-key": { "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, + "inBundle": true, + "license": "MIT", "engines": { "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/mocha/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, + "node_modules/npm/node_modules/path-scurry": { + "version": "1.10.1", + "inBundle": true, + "license": "BlueOak-1.0.0", "dependencies": { - "has-flag": "^4.0.0" + "lru-cache": "^9.1.1 || ^10.0.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" }, "engines": { - "node": ">=10" + "node": ">=16 || 14 >=14.17" }, "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/mocha/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, + "node_modules/npm/node_modules/postcss-selector-parser": { + "version": "6.0.13", + "inBundle": true, + "license": "MIT", "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" }, "engines": { - "node": ">= 8" + "node": ">=4" } }, - "node_modules/modify-values": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/modify-values/-/modify-values-1.0.1.tgz", - "integrity": "sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw==", + "node_modules/npm/node_modules/proc-log": { + "version": "3.0.0", + "inBundle": true, + "license": "ISC", "engines": { - "node": ">=0.10.0" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/moment": { - "version": "2.29.4", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz", - "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==", + "node_modules/npm/node_modules/process": { + "version": "0.11.10", + "inBundle": true, + "license": "MIT", "engines": { - "node": "*" + "node": ">= 0.6.0" } }, - "node_modules/moment-timezone": { - "version": "0.5.38", - "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.38.tgz", - "integrity": "sha512-nMIrzGah4+oYZPflDvLZUgoVUO4fvAqHstvG3xAUnMolWncuAiLDWNnJZj6EwJGMGfb1ZcuTFE6GI3hNOVWI/Q==", + "node_modules/npm/node_modules/promise-all-reject-late": { + "version": "1.0.1", + "inBundle": true, + "license": "ISC", + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/npm/node_modules/promise-call-limit": { + "version": "1.0.2", + "inBundle": true, + "license": "ISC", + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/npm/node_modules/promise-inflight": { + "version": "1.0.1", + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/promise-retry": { + "version": "2.0.1", + "inBundle": true, + "license": "MIT", "dependencies": { - "moment": ">= 2.9.0" + "err-code": "^2.0.2", + "retry": "^0.12.0" }, "engines": { - "node": "*" + "node": ">=10" } }, - "node_modules/morgan": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.9.1.tgz", - "integrity": "sha512-HQStPIV4y3afTiCYVxirakhlCfGkI161c76kKFca7Fk1JusM//Qeo1ej2XaMniiNeaZklMVrh3vTtIzpzwbpmA==", + "node_modules/npm/node_modules/promzard": { + "version": "1.0.0", + "inBundle": true, + "license": "ISC", "dependencies": { - "basic-auth": "~2.0.0", - "debug": "2.6.9", - "depd": "~1.1.2", - "on-finished": "~2.3.0", - "on-headers": "~1.0.1" + "read": "^2.0.0" }, "engines": { - "node": ">= 0.8.0" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/morgan/node_modules/depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", - "engines": { - "node": ">= 0.6" + "node_modules/npm/node_modules/qrcode-terminal": { + "version": "0.12.0", + "inBundle": true, + "bin": { + "qrcode-terminal": "bin/qrcode-terminal.js" } }, - "node_modules/morgan/node_modules/on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", + "node_modules/npm/node_modules/read": { + "version": "2.1.0", + "inBundle": true, + "license": "ISC", "dependencies": { - "ee-first": "1.1.1" + "mute-stream": "~1.0.0" }, "engines": { - "node": ">= 0.8" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "node_modules/multer": { - "version": "1.4.5-lts.1", - "resolved": "https://registry.npmjs.org/multer/-/multer-1.4.5-lts.1.tgz", - "integrity": "sha512-ywPWvcDMeH+z9gQq5qYHCCy+ethsk4goepZ45GLD63fOu0YcNecQxi64nDs3qluZB+murG3/D4dJ7+dGctcCQQ==", - "dependencies": { - "append-field": "^1.0.0", - "busboy": "^1.0.0", - "concat-stream": "^1.5.2", - "mkdirp": "^0.5.4", - "object-assign": "^4.1.1", - "type-is": "^1.6.4", - "xtend": "^4.0.0" - }, + "node_modules/npm/node_modules/read-cmd-shim": { + "version": "4.0.0", + "inBundle": true, + "license": "ISC", "engines": { - "node": ">= 6.0.0" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/multer/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==", + "node_modules/npm/node_modules/read-package-json": { + "version": "7.0.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "glob": "^10.2.2", + "json-parse-even-better-errors": "^3.0.0", + "normalize-package-data": "^6.0.0", + "npm-normalize-package-bin": "^3.0.0" + }, "engines": { - "node": ">=0.10.0" + "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/mute-stream": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", - "integrity": "sha512-r65nCZhrbXXb6dXOACihYApHw2Q6pV0M3V0PSxd74N0+D8nzAdEAITq2oAjA1jVnKI+tGvEBUpqiMh0+rW6zDQ==", - "dev": true - }, - "node_modules/nanoid": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.1.tgz", - "integrity": "sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==", - "dev": true, - "bin": { - "nanoid": "bin/nanoid.cjs" + "node_modules/npm/node_modules/read-package-json-fast": { + "version": "3.0.2", + "inBundle": true, + "license": "ISC", + "dependencies": { + "json-parse-even-better-errors": "^3.0.0", + "npm-normalize-package-bin": "^3.0.0" }, "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true - }, - "node_modules/nconf": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/nconf/-/nconf-0.12.0.tgz", - "integrity": "sha512-T3fZPw3c7Dfrz8JBQEbEcZJ2s8f7cUMpKuyBtsGQe0b71pcXx6gNh4oti2xh5dxB+gO9ufNfISBlGvvWtfyMcA==", + "node_modules/npm/node_modules/readable-stream": { + "version": "4.4.2", + "inBundle": true, + "license": "MIT", "dependencies": { - "async": "^3.0.0", - "ini": "^2.0.0", - "secure-keys": "^1.0.0", - "yargs": "^16.1.1" + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" }, "engines": { - "node": ">= 0.4.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, - "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==", + "node_modules/npm/node_modules/retry": { + "version": "0.12.0", + "inBundle": true, + "license": "MIT", "engines": { - "node": ">= 0.6" + "node": ">= 4" } }, - "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==" + "node_modules/npm/node_modules/safe-buffer": { + "version": "5.2.1", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "inBundle": true, + "license": "MIT" }, - "node_modules/nerf-dart": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/nerf-dart/-/nerf-dart-1.0.0.tgz", - "integrity": "sha512-EZSPZB70jiVsivaBLYDCyntd5eH8NTSMOn3rB+HxwdmKThGELLdYv8qVIMWvZEFy9w8ZZpW9h9OB32l1rGtj7g==" + "node_modules/npm/node_modules/safer-buffer": { + "version": "2.1.2", + "inBundle": true, + "license": "MIT", + "optional": true }, - "node_modules/newman": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/newman/-/newman-5.3.2.tgz", - "integrity": "sha512-cWy8pV0iwvMOZLTw3hkAHcwo2ZA0GKkXm8oUMn1Ltii3ZI2nKpnrg9QGdIT0hGHChRkX6prY5e3Aar7uykMGNg==", - "dev": true, + "node_modules/npm/node_modules/semver": { + "version": "7.5.4", + "inBundle": true, + "license": "ISC", "dependencies": { - "async": "3.2.3", - "chardet": "1.4.0", - "cli-progress": "3.10.0", - "cli-table3": "0.6.1", - "colors": "1.4.0", - "commander": "7.2.0", - "csv-parse": "4.16.3", - "eventemitter3": "4.0.7", - "filesize": "8.0.7", - "lodash": "4.17.21", - "mkdirp": "1.0.4", - "postman-collection": "4.1.1", - "postman-collection-transformer": "4.1.6", - "postman-request": "2.88.1-postman.31", - "postman-runtime": "7.29.0", - "pretty-ms": "7.0.1", - "semver": "7.3.5", - "serialised-error": "1.1.3", - "tough-cookie": "3.0.1", - "word-wrap": "1.2.3", - "xmlbuilder": "15.1.1" + "lru-cache": "^6.0.0" }, "bin": { - "newman": "bin/newman.js" + "semver": "bin/semver.js" }, "engines": { "node": ">=10" } }, - "node_modules/newman-reporter-junitfull": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/newman-reporter-junitfull/-/newman-reporter-junitfull-1.1.1.tgz", - "integrity": "sha512-ET5rU1qkeJ5yvFxcKQFkqGxWia50kdnufm1uzyeNYlUg6T+k07AvOS0mfp/Ejr0njnsiPfFLb9kC48F8pafq9A==", - "dev": true, + "node_modules/npm/node_modules/semver/node_modules/lru-cache": { + "version": "6.0.0", + "inBundle": true, + "license": "ISC", "dependencies": { - "lodash": "^4.17.10", - "moment": "^2.22.2", - "xmlbuilder": "^10.0.0" + "yallist": "^4.0.0" }, "engines": { - "node": ">=6" + "node": ">=10" + } + }, + "node_modules/npm/node_modules/set-blocking": { + "version": "2.0.0", + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/shebang-command": { + "version": "2.0.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" }, - "peerDependencies": { - "newman": ">=4" + "engines": { + "node": ">=8" } }, - "node_modules/newman-reporter-junitfull/node_modules/xmlbuilder": { - "version": "10.1.1", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-10.1.1.tgz", - "integrity": "sha512-OyzrcFLL/nb6fMGHbiRDuPup9ljBycsdCypwuyg5AAHvyWzGfChJpCXMG88AGTIMFhGZ9RccFN1e6lhg3hkwKg==", - "dev": true, + "node_modules/npm/node_modules/shebang-regex": { + "version": "3.0.0", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/signal-exit": { + "version": "4.1.0", + "inBundle": true, + "license": "ISC", "engines": { - "node": ">=4.0" + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/newman/node_modules/async": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.3.tgz", - "integrity": "sha512-spZRyzKL5l5BZQrr/6m/SqFdBN0q3OCI0f9rjfBzCMBIP4p75P620rR3gTmaksNOhmzgdxcaxdNfMy6anrbM0g==", - "dev": true - }, - "node_modules/newman/node_modules/chardet": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-1.4.0.tgz", - "integrity": "sha512-NpwMDdSIprbYx1CLnfbxEIarI0Z+s9MssEgggMNheGM+WD68yOhV7IEA/3r6tr0yTRgQD0HuZJDw32s99i6L+A==", - "dev": true - }, - "node_modules/newman/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, + "node_modules/npm/node_modules/sigstore": { + "version": "2.1.0", + "inBundle": true, + "license": "Apache-2.0", "dependencies": { - "yallist": "^4.0.0" + "@sigstore/bundle": "^2.1.0", + "@sigstore/protobuf-specs": "^0.2.1", + "@sigstore/sign": "^2.1.0", + "@sigstore/tuf": "^2.1.0" }, "engines": { - "node": ">=10" + "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/newman/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" - }, + "node_modules/npm/node_modules/smart-buffer": { + "version": "4.2.0", + "inBundle": true, + "license": "MIT", "engines": { - "node": ">=10" + "node": ">= 6.0.0", + "npm": ">= 3.0.0" } }, - "node_modules/newman/node_modules/semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dev": true, + "node_modules/npm/node_modules/socks": { + "version": "2.7.1", + "inBundle": true, + "license": "MIT", "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" + "ip": "^2.0.0", + "smart-buffer": "^4.2.0" }, "engines": { - "node": ">=10" + "node": ">= 10.13.0", + "npm": ">= 3.0.0" } }, - "node_modules/newman/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/next-tick": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", - "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==", - "dev": true - }, - "node_modules/nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" - }, - "node_modules/nise": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/nise/-/nise-1.5.3.tgz", - "integrity": "sha512-Ymbac/94xeIrMf59REBPOv0thr+CJVFMhrlAkW/gjCIE58BGQdCj0x7KRCb3yz+Ga2Rz3E9XXSvUyyxqqhjQAQ==", - "dev": true, + "node_modules/npm/node_modules/socks-proxy-agent": { + "version": "8.0.2", + "inBundle": true, + "license": "MIT", "dependencies": { - "@sinonjs/formatio": "^3.2.1", - "@sinonjs/text-encoding": "^0.7.1", - "just-extend": "^4.0.2", - "lolex": "^5.0.1", - "path-to-regexp": "^1.7.0" + "agent-base": "^7.0.2", + "debug": "^4.3.4", + "socks": "^2.7.1" + }, + "engines": { + "node": ">= 14" } }, - "node_modules/nise/node_modules/lolex": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/lolex/-/lolex-5.1.2.tgz", - "integrity": "sha512-h4hmjAvHTmd+25JSwrtTIuwbKdwg5NzZVRMLn9saij4SZaepCrTCxPr35H/3bjwfMJtN+t3CX8672UIkglz28A==", - "dev": true, + "node_modules/npm/node_modules/spdx-correct": { + "version": "3.2.0", + "inBundle": true, + "license": "Apache-2.0", "dependencies": { - "@sinonjs/commons": "^1.7.0" + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" } }, - "node_modules/nise/node_modules/path-to-regexp": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", - "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", - "dev": true, + "node_modules/npm/node_modules/spdx-exceptions": { + "version": "2.3.0", + "inBundle": true, + "license": "CC-BY-3.0" + }, + "node_modules/npm/node_modules/spdx-expression-parse": { + "version": "3.0.1", + "inBundle": true, + "license": "MIT", "dependencies": { - "isarray": "0.0.1" + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" } }, - "node_modules/nocache": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/nocache/-/nocache-2.1.0.tgz", - "integrity": "sha512-0L9FvHG3nfnnmaEQPjT9xhfN4ISk0A8/2j4M37Np4mcDesJjHgEUfgPhdCyZuFI954tjokaIj/A3NdpFNdEh4Q==", + "node_modules/npm/node_modules/spdx-license-ids": { + "version": "3.0.16", + "inBundle": true, + "license": "CC0-1.0" + }, + "node_modules/npm/node_modules/ssri": { + "version": "10.0.5", + "inBundle": true, + "license": "ISC", + "dependencies": { + "minipass": "^7.0.3" + }, "engines": { - "node": ">=4.0.0" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/node-addon-api": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-4.3.0.tgz", - "integrity": "sha512-73sE9+3UaLYYFmDsFZnqCInzPyh3MqIwZO9cw58yIqAZhONrrabrYyYe3TuIqtIiOuTXVhsGau8hcrhhwSsDIQ==" - }, - "node_modules/node-emoji": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.11.0.tgz", - "integrity": "sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==", + "node_modules/npm/node_modules/string_decoder": { + "version": "1.3.0", + "inBundle": true, + "license": "MIT", "dependencies": { - "lodash": "^4.17.21" + "safe-buffer": "~5.2.0" } }, - "node_modules/node-fetch": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.9.tgz", - "integrity": "sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg==", + "node_modules/npm/node_modules/string-width": { + "version": "4.2.3", + "inBundle": true, + "license": "MIT", "dependencies": { - "whatwg-url": "^5.0.0" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" }, "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } + "node": ">=8" } }, - "node_modules/node-gyp": { - "version": "8.4.1", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-8.4.1.tgz", - "integrity": "sha512-olTJRgUtAb/hOXG0E93wZDs5YiJlgbXxTwQAFHyNlRsXQnYzUaF2aGgujZbw+hR8aF4ZG/rST57bWMWD16jr9w==", - "optional": true, + "node_modules/npm/node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "inBundle": true, + "license": "MIT", "dependencies": { - "env-paths": "^2.2.0", - "glob": "^7.1.4", - "graceful-fs": "^4.2.6", - "make-fetch-happen": "^9.1.0", - "nopt": "^5.0.0", - "npmlog": "^6.0.0", - "rimraf": "^3.0.2", - "semver": "^7.3.5", - "tar": "^6.1.2", - "which": "^2.0.2" - }, - "bin": { - "node-gyp": "bin/node-gyp.js" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" }, "engines": { - "node": ">= 10.12.0" + "node": ">=8" } }, - "node_modules/node-gyp/node_modules/ansi-regex": { + "node_modules/npm/node_modules/string-width-cjs/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==", - "optional": true, + "inBundle": true, + "license": "MIT", "engines": { "node": ">=8" } }, - "node_modules/node-gyp/node_modules/are-we-there-yet": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz", - "integrity": "sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==", - "optional": true, - "dependencies": { - "delegates": "^1.0.0", - "readable-stream": "^3.6.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/node-gyp/node_modules/gauge": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz", - "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==", - "optional": true, + "node_modules/npm/node_modules/string-width-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "inBundle": true, + "license": "MIT", "dependencies": { - "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.3", - "console-control-strings": "^1.1.0", - "has-unicode": "^2.0.1", - "signal-exit": "^3.0.7", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wide-align": "^1.1.5" + "ansi-regex": "^5.0.1" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=8" } }, - "node_modules/node-gyp/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==", - "optional": true, + "node_modules/npm/node_modules/string-width/node_modules/ansi-regex": { + "version": "5.0.1", + "inBundle": true, + "license": "MIT", "engines": { "node": ">=8" } }, - "node_modules/node-gyp/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==", - "optional": true, + "node_modules/npm/node_modules/string-width/node_modules/strip-ansi": { + "version": "6.0.1", + "inBundle": true, + "license": "MIT", "dependencies": { - "yallist": "^4.0.0" + "ansi-regex": "^5.0.1" }, "engines": { - "node": ">=10" + "node": ">=8" } }, - "node_modules/node-gyp/node_modules/nopt": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", - "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", - "optional": true, + "node_modules/npm/node_modules/strip-ansi": { + "version": "7.1.0", + "inBundle": true, + "license": "MIT", "dependencies": { - "abbrev": "1" - }, - "bin": { - "nopt": "bin/nopt.js" + "ansi-regex": "^6.0.1" }, "engines": { - "node": ">=6" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/node-gyp/node_modules/npmlog": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz", - "integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==", - "optional": true, + "node_modules/npm/node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "inBundle": true, + "license": "MIT", "dependencies": { - "are-we-there-yet": "^3.0.0", - "console-control-strings": "^1.1.0", - "gauge": "^4.0.3", - "set-blocking": "^2.0.0" + "ansi-regex": "^5.0.1" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=8" } }, - "node_modules/node-gyp/node_modules/readable-stream": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.1.tgz", - "integrity": "sha512-+rQmrWMYGA90yenhTYsLWAsLsqVC8osOw6PKE1HDYiO0gdPeKe/xDHNzIAIn4C91YQ6oenEhfYqqc1883qHbjQ==", - "optional": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, + "node_modules/npm/node_modules/strip-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "inBundle": true, + "license": "MIT", "engines": { - "node": ">= 6" + "node": ">=8" } }, - "node_modules/node-gyp/node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "optional": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" + "node_modules/npm/node_modules/supports-color": { + "version": "9.4.0", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/chalk/supports-color?sponsor=1" } }, - "node_modules/node-gyp/node_modules/semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", - "optional": true, + "node_modules/npm/node_modules/tar": { + "version": "6.2.0", + "inBundle": true, + "license": "ISC", "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" + "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/node-gyp/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==", - "optional": true, - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/node-gyp/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==", - "optional": true, + "node_modules/npm/node_modules/tar/node_modules/fs-minipass": { + "version": "2.1.0", + "inBundle": true, + "license": "ISC", "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "minipass": "^3.0.0" }, "engines": { - "node": ">=8" + "node": ">= 8" } }, - "node_modules/node-gyp/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==", - "optional": true, + "node_modules/npm/node_modules/tar/node_modules/fs-minipass/node_modules/minipass": { + "version": "3.3.6", + "inBundle": true, + "license": "ISC", "dependencies": { - "ansi-regex": "^5.0.1" + "yallist": "^4.0.0" }, "engines": { "node": ">=8" } }, - "node_modules/node-gyp/node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "optional": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, + "node_modules/npm/node_modules/tar/node_modules/minipass": { + "version": "5.0.0", + "inBundle": true, + "license": "ISC", "engines": { - "node": ">= 8" + "node": ">=8" } }, - "node_modules/node-gyp/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "optional": true + "node_modules/npm/node_modules/text-table": { + "version": "0.2.0", + "inBundle": true, + "license": "MIT" }, - "node_modules/node-oauth1": { + "node_modules/npm/node_modules/tiny-relative-date": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/node-oauth1/-/node-oauth1-1.3.0.tgz", - "integrity": "sha512-0yggixNfrA1KcBwvh/Hy2xAS1Wfs9dcg6TdFf2zN7gilcAigMdrtZ4ybrBSXBgLvGDw9V1p2MRnGBMq7XjTWLg==", - "dev": true + "inBundle": true, + "license": "MIT" }, - "node_modules/node-preload": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/node-preload/-/node-preload-0.2.1.tgz", - "integrity": "sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==", - "dev": true, + "node_modules/npm/node_modules/treeverse": { + "version": "3.0.0", + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/tuf-js": { + "version": "2.1.0", + "inBundle": true, + "license": "MIT", "dependencies": { - "process-on-spawn": "^1.0.0" + "@tufjs/models": "2.0.0", + "debug": "^4.3.4", + "make-fetch-happen": "^13.0.0" }, "engines": { - "node": ">=8" + "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/node-releases": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.10.tgz", - "integrity": "sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==", - "dev": true + "node_modules/npm/node_modules/unique-filename": { + "version": "3.0.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "unique-slug": "^4.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } }, - "node_modules/nodemailer": { - "version": "6.7.3", - "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.7.3.tgz", - "integrity": "sha512-KUdDsspqx89sD4UUyUKzdlUOper3hRkDVkrKh/89G+d9WKsU5ox51NWS4tB1XR5dPUdR4SP0E3molyEfOvSa3g==", + "node_modules/npm/node_modules/unique-slug": { + "version": "4.0.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4" + }, "engines": { - "node": ">=6.0.0" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/nodemailer-fetch": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/nodemailer-fetch/-/nodemailer-fetch-1.3.0.tgz", - "integrity": "sha512-5P5+lR0+sWvk1UZGFoTida33dG0xAqk1Pv0t7cPlrJ09dLdZWh/kenxb0vOoUoNVOci4gmSYOnMHzvheSBeFag==" + "node_modules/npm/node_modules/util-deprecate": { + "version": "1.0.2", + "inBundle": true, + "license": "MIT" }, - "node_modules/nodemailer-shared": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/nodemailer-shared/-/nodemailer-shared-1.0.4.tgz", - "integrity": "sha512-tfqdDPbj6L3PywhNqCa988bDxxnffo3Gw0DZkaYwOYVsnMZFgF7LoffS4FAFbiGb1M+mcNBPX/Vy9l0A95fJAg==", + "node_modules/npm/node_modules/validate-npm-package-license": { + "version": "3.0.4", + "inBundle": true, + "license": "Apache-2.0", "dependencies": { - "nodemailer-fetch": "1.3.0" + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" } }, - "node_modules/nodemailer-smtp-transport": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/nodemailer-smtp-transport/-/nodemailer-smtp-transport-2.4.2.tgz", - "integrity": "sha512-VD3oQ5Xzgszg+2f0H3qAnXhciF6pZ9j2hHNaJqHEzh+caEs/cU1dDmCbpdN2bJxPYBeCilA2XshhtEnvxJgZGQ==", + "node_modules/npm/node_modules/validate-npm-package-name": { + "version": "5.0.0", + "inBundle": true, + "license": "ISC", "dependencies": { - "nodemailer-shared": "1.0.4", - "nodemailer-wellknown": "0.1.8", - "smtp-connection": "2.3.2" + "builtins": "^5.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/nodemailer-wellknown": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/nodemailer-wellknown/-/nodemailer-wellknown-0.1.8.tgz", - "integrity": "sha512-kxDRGWY6ZYtcKsCr4IMw5B9nST0EKK8Ay/JjgK96lBEdpt6nRl2ds5khTVv/BGLECbLIAzOsmIwP7KUt1C9frA==" + "node_modules/npm/node_modules/walk-up-path": { + "version": "3.0.1", + "inBundle": true, + "license": "ISC" }, - "node_modules/nopt": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-6.0.0.tgz", - "integrity": "sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==", - "dev": true, + "node_modules/npm/node_modules/wcwidth": { + "version": "1.0.1", + "inBundle": true, + "license": "MIT", "dependencies": { - "abbrev": "^1.0.0" + "defaults": "^1.0.3" + } + }, + "node_modules/npm/node_modules/which": { + "version": "4.0.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "isexe": "^3.1.1" }, "bin": { - "nopt": "bin/nopt.js" + "node-which": "bin/which.js" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "^16.13.0 || >=18.0.0" } }, - "node_modules/normalize-package-data": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", - "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", + "node_modules/npm/node_modules/which/node_modules/isexe": { + "version": "3.1.1", + "inBundle": true, + "license": "ISC", + "engines": { + "node": ">=16" + } + }, + "node_modules/npm/node_modules/wide-align": { + "version": "1.1.5", + "inBundle": true, + "license": "ISC", + "dependencies": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } + }, + "node_modules/npm/node_modules/wrap-ansi": { + "version": "8.1.0", + "inBundle": true, + "license": "MIT", "dependencies": { - "hosted-git-info": "^4.0.1", - "is-core-module": "^2.5.0", - "semver": "^7.3.4", - "validate-npm-package-license": "^3.0.1" + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" }, "engines": { - "node": ">=10" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/normalize-package-data/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==", + "node_modules/npm/node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "inBundle": true, + "license": "MIT", "dependencies": { - "yallist": "^4.0.0" + "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/npm/node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" } }, - "node_modules/normalize-package-data/node_modules/semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "node_modules/npm/node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { + "version": "4.3.0", + "inBundle": true, + "license": "MIT", "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" + "color-convert": "^2.0.1" }, "engines": { - "node": ">=10" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/normalize-package-data/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/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, + "node_modules/npm/node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "inBundle": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/normalize-url": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", - "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", + "node_modules/npm/node_modules/wrap-ansi/node_modules/emoji-regex": { + "version": "9.2.2", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/wrap-ansi/node_modules/string-width": { + "version": "5.1.2", + "inBundle": true, + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, "engines": { - "node": ">=10" + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "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==", + "node_modules/npm/node_modules/write-file-atomic": { + "version": "5.0.1", + "inBundle": true, + "license": "ISC", "dependencies": { - "path-key": "^2.0.0" + "imurmurhash": "^0.1.4", + "signal-exit": "^4.0.1" }, "engines": { - "node": ">=4" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, + "node_modules/npm/node_modules/yallist": { + "version": "4.0.0", + "inBundle": true, + "license": "ISC" + }, "node_modules/npmlog": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", @@ -11399,9 +11833,9 @@ } }, "node_modules/nyc": { - "version": "15.0.0", - "resolved": "https://registry.npmjs.org/nyc/-/nyc-15.0.0.tgz", - "integrity": "sha512-qcLBlNCKMDVuKb7d1fpxjPR8sHeMVX0CHarXAVzrVWoFrigCkYR8xcrjfXSPi5HXM7EU78L6ywO7w1c5rZNCNg==", + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/nyc/-/nyc-15.1.0.tgz", + "integrity": "sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A==", "dev": true, "dependencies": { "@istanbuljs/load-nyc-config": "^1.0.0", @@ -11412,6 +11846,7 @@ "find-cache-dir": "^3.2.0", "find-up": "^4.1.0", "foreground-child": "^2.0.0", + "get-package-type": "^0.1.0", "glob": "^7.1.6", "istanbul-lib-coverage": "^3.0.0", "istanbul-lib-hook": "^3.0.0", @@ -11419,10 +11854,9 @@ "istanbul-lib-processinfo": "^2.0.2", "istanbul-lib-report": "^3.0.0", "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.0.0", - "js-yaml": "^3.13.1", + "istanbul-reports": "^3.0.2", "make-dir": "^3.0.0", - "node-preload": "^0.2.0", + "node-preload": "^0.2.1", "p-map": "^3.0.0", "process-on-spawn": "^1.0.0", "resolve-from": "^5.0.0", @@ -11430,7 +11864,6 @@ "signal-exit": "^3.0.2", "spawn-wrap": "^2.0.0", "test-exclude": "^6.0.0", - "uuid": "^3.3.3", "yargs": "^15.0.2" }, "bin": { @@ -11440,15 +11873,6 @@ "node": ">=8.9" } }, - "node_modules/nyc/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==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/nyc/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", @@ -11506,15 +11930,6 @@ "node": ">=8" } }, - "node_modules/nyc/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/nyc/node_modules/locate-path": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", @@ -11563,47 +11978,6 @@ "node": ">=8" } }, - "node_modules/nyc/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/nyc/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==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/nyc/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==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/nyc/node_modules/wrap-ansi": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", @@ -11685,9 +12059,9 @@ } }, "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==", + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", + "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -11702,13 +12076,13 @@ } }, "node_modules/object.assign": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", - "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", + "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", "has-symbols": "^1.0.3", "object-keys": "^1.1.1" }, @@ -11719,11 +12093,92 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/object.entries": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.7.tgz", + "integrity": "sha512-jCBs/0plmPsOnrKAfFQXRG2NFjlhZgjjcBLSmTnEhU8U6vVTsVe8ANeQJCHTl3gSsI4J+0emOoCgoKlmQPMgmA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.fromentries": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.7.tgz", + "integrity": "sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.groupby": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.1.tgz", + "integrity": "sha512-HqaQtqLnp/8Bn4GL16cj+CUYbnpe1bh0TtEaWvybszDG4tgxCJuRpV8VGuvNaI1fAnI4lUJzDG55MXcOH4JZcQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1" + } + }, + "node_modules/object.hasown": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.3.tgz", + "integrity": "sha512-fFI4VcYpRHvSLXxP7yiZOMAd331cPfd2p7PFDVbgUsYOfCT3tICVqXWngbjr4m49OvsBwUBQ6O2uQoJvy3RexA==", + "dev": true, + "dependencies": { + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.values": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.7.tgz", + "integrity": "sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/on-error": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/on-error/-/on-error-2.1.0.tgz", "integrity": "sha512-wpKXxCW2wXLI+9DB9DDBVuOCN9C5rjyaP4GWwqhgrSd2ys1Vyc9yGaPmC5HSOdQ30x9zCLozi9mHx3lm01E+LQ==" }, + "node_modules/on-exit-leak-free": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/on-exit-leak-free/-/on-exit-leak-free-2.1.2.tgz", + "integrity": "sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==", + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/on-finished": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", @@ -11752,84 +12207,75 @@ } }, "node_modules/onetime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", - "integrity": "sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==", - "dev": true, + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", "dependencies": { - "mimic-fn": "^1.0.0" + "mimic-fn": "^2.1.0" }, "engines": { - "node": ">=4" + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", "dev": true, "dependencies": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" + "@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/os": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/os/-/os-0.1.1.tgz", - "integrity": "sha512-jg06S2xr5De63mLjZVJDf3/k37tpjppr2LR7MUOsxv8XuUCVpCnvbCksXCBcB5gQqQf/K0+87WGTRlAj5q7r1A==" - }, - "node_modules/os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/os/-/os-0.1.2.tgz", + "integrity": "sha512-ZoXJkvAnljwvc56MbvhtKVWmSkzV712k42Is2mA0+0KTSRakq5XXuXpjZjgAt9ctzl51ojhQWakQQpmOvXWfjQ==" }, "node_modules/p-each-series": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-2.2.0.tgz", - "integrity": "sha512-ycIL2+1V32th+8scbpTvyHNaHe02z0sjgh91XXjAk+ZeXoPN4Z46DVUnzdso0aX4KckKw0FNNFHdjZ2UsZvxiA==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-3.0.0.tgz", + "integrity": "sha512-lastgtAdoH9YaLyDa5i5z64q+kzOcQHsQ5SsZJD3q0VEyI8mq872S3geuNbRUQLVAE9siMfgKrpj7MloKFHruw==", "engines": { - "node": ">=8" + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/p-filter": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-filter/-/p-filter-2.1.0.tgz", - "integrity": "sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-filter/-/p-filter-4.1.0.tgz", + "integrity": "sha512-37/tPdZ3oJwHaS3gNJdenCDB3Tz26i9sjhnguBtvN0vYlRIiDNnvTWkuh+0hETV9rLPdJ3rlL3yVOYPIAnM8rw==", "dependencies": { - "p-map": "^2.0.0" + "p-map": "^7.0.1" }, "engines": { - "node": ">=8" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/p-filter/node_modules/p-map": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", - "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", - "engines": { - "node": ">=6" - } - }, - "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==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-7.0.1.tgz", + "integrity": "sha512-2wnaR0XL/FDOj+TgpDuRb2KTjLnu3Fma6b1ZUwGY7LcqenMcvP/YFpjpbPKY6WVGsbuJZRuoUz8iPrt8ORnAFw==", "engines": { - "node": ">=4" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/p-is-promise": { @@ -11883,29 +12329,21 @@ } }, "node_modules/p-reduce": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-reduce/-/p-reduce-2.1.0.tgz", - "integrity": "sha512-2USApvnsutq8uoxZBGbbWM0JIYLiEMJ9RlaN7fAzVNb9OZN0SHjjTTfIcb667XynS5Y1VhwDJVDa72TnPzAYWw==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-reduce/-/p-reduce-3.0.0.tgz", + "integrity": "sha512-xsrIUgI0Kn6iyDYm9StOpOeK29XM1aboGji26+QEortiFST1hGZaUQOLhtEbqHErPpGW/aSz6allwK2qcptp0Q==", "engines": { - "node": ">=8" - } - }, - "node_modules/p-retry": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", - "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", - "dependencies": { - "@types/retry": "0.12.0", - "retry": "^0.13.1" + "node": ">=12" }, - "engines": { - "node": ">=8" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/p-try": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, "engines": { "node": ">=6" } @@ -11983,6 +12421,7 @@ "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" } @@ -11995,24 +12434,19 @@ "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==", - "dev": true - }, "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==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "engines": { - "node": ">=4" + "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==" + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true }, "node_modules/path-to-regexp": { "version": "0.1.7", @@ -12042,9 +12476,9 @@ "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==" }, "node_modules/pg-connection-string": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.5.0.tgz", - "integrity": "sha512-r5o/V/ORTA6TmUnyWZR9nCj1klXCO2CEKNRlVuJptZe85QuhFayC7WeMic7ndayT5IRIR0S0xFxFi2ousartlQ==" + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.6.2.tgz", + "integrity": "sha512-ch6OwaeaPYcova4kKZ15sbJ2hKb/VP48ZD2gE7i1J+L4MspCtBMAx8nMgz7bksc7IojCIIWuEhHibSMFH8m8oA==" }, "node_modules/picocolors": { "version": "1.0.0", @@ -12072,25 +12506,62 @@ } }, "node_modules/pino": { - "version": "6.6.1", - "resolved": "https://registry.npmjs.org/pino/-/pino-6.6.1.tgz", - "integrity": "sha512-DOgm7rn6ctBkBYemHXSLj7+j3o3U1q1FWBXbHcprur8mA93QcJSycEkEqhqKiFB9Mx/3Qld2FGr6+9yfQza0kA==", + "version": "8.17.2", + "resolved": "https://registry.npmjs.org/pino/-/pino-8.17.2.tgz", + "integrity": "sha512-LA6qKgeDMLr2ux2y/YiUt47EfgQ+S9LznBWOJdN3q1dx2sv0ziDLUBeVpyVv17TEcGCBuWf0zNtg3M5m1NhhWQ==", "dependencies": { - "fast-redact": "^2.0.0", - "fast-safe-stringify": "^2.0.7", - "flatstr": "^1.0.12", - "pino-std-serializers": "^2.4.2", - "quick-format-unescaped": "^4.0.1", - "sonic-boom": "^1.0.2" + "atomic-sleep": "^1.0.0", + "fast-redact": "^3.1.1", + "on-exit-leak-free": "^2.1.0", + "pino-abstract-transport": "v1.1.0", + "pino-std-serializers": "^6.0.0", + "process-warning": "^3.0.0", + "quick-format-unescaped": "^4.0.3", + "real-require": "^0.2.0", + "safe-stable-stringify": "^2.3.1", + "sonic-boom": "^3.7.0", + "thread-stream": "^2.0.0" }, "bin": { "pino": "bin.js" } }, + "node_modules/pino-abstract-transport": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pino-abstract-transport/-/pino-abstract-transport-1.1.0.tgz", + "integrity": "sha512-lsleG3/2a/JIWUtf9Q5gUNErBqwIu1tUKTT3dUzaf5DySw9ra1wcqKjJjLX1VTY64Wk1eEOYsVGSaGfCK85ekA==", + "dependencies": { + "readable-stream": "^4.0.0", + "split2": "^4.0.0" + } + }, + "node_modules/pino-abstract-transport/node_modules/readable-stream": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.5.2.tgz", + "integrity": "sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==", + "dependencies": { + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/pino-abstract-transport/node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, "node_modules/pino-std-serializers": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-2.5.0.tgz", - "integrity": "sha512-wXqbqSrIhE58TdrxxlfLwU9eDhrzppQDvGhBEr1gYbzzM4KKo3Y63gSjiDXRKLVS2UOXdPNR2v+KnQgNrs+xUg==" + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-6.2.2.tgz", + "integrity": "sha512-cHjPPsE+vhj/tnhCy/wiMh3M3z3h/j15zHQX+S9GkTBgqJuTuJzYJ4gUyACLhDaJ7kk9ba9iRDmbH2tJU03OiA==" }, "node_modules/pkg-conf": { "version": "2.1.0", @@ -12165,20 +12636,6 @@ "node": ">=4" } }, - "node_modules/pkg-config": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/pkg-config/-/pkg-config-1.1.1.tgz", - "integrity": "sha512-ft/WI9YK6FuTuw4Ql+QUaNXtm/ASQNqDUUsZEgFZKyFpW6amyP8Gx01xrRs8KdiNbbqXfYxkOXplpq1euWbOjw==", - "dev": true, - "dependencies": { - "debug-log": "^1.0.0", - "find-root": "^1.0.0", - "xtend": "^4.0.1" - }, - "engines": { - "node": ">=0.10" - } - }, "node_modules/pkg-dir": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", @@ -12243,13 +12700,12 @@ "node": ">=8" } }, - "node_modules/pluralize": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-7.0.0.tgz", - "integrity": "sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow==", - "dev": true, + "node_modules/pony-cause": { + "version": "2.1.10", + "resolved": "https://registry.npmjs.org/pony-cause/-/pony-cause-2.1.10.tgz", + "integrity": "sha512-3IKLNXclQgkU++2fSi93sQ6BznFuxSLB11HdvZQ6JW/spahf/P1pAHBQEahr20rs0htZW0UDkM1HmA+nZkXKsw==", "engines": { - "node": ">=4" + "node": ">=12.0.0" } }, "node_modules/portscanner": { @@ -12274,100 +12730,55 @@ } }, "node_modules/postman-collection": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/postman-collection/-/postman-collection-4.1.1.tgz", - "integrity": "sha512-ODpJtlf8r99DMcTU7gFmi/yvQYckFzcuE6zL/fWnyrFT34ugdCBFlX+DN7M+AnP6lmR822fv5s60H4DnL4+fAg==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/postman-collection/-/postman-collection-4.3.0.tgz", + "integrity": "sha512-QpmNOw1JhAVQTFWRz443/qpKs4/3T1MFrKqDZ84RS1akxOzhXXr15kD8+/+jeA877qyy9rfMsrFgLe2W7aCPjw==", "dev": true, "dependencies": { - "faker": "5.5.3", + "@faker-js/faker": "5.5.3", "file-type": "3.9.0", "http-reasons": "0.1.0", - "iconv-lite": "0.6.3", - "liquid-json": "0.3.1", - "lodash": "4.17.21", - "mime-format": "2.0.1", - "mime-types": "2.1.34", - "postman-url-encoder": "3.0.5", - "semver": "7.3.5", - "uuid": "8.3.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/postman-collection-transformer": { - "version": "4.1.6", - "resolved": "https://registry.npmjs.org/postman-collection-transformer/-/postman-collection-transformer-4.1.6.tgz", - "integrity": "sha512-xvdQb6sZoWcG9xZXUPSuxocjcd6WCZlINlGGiuHdSfxhgiwQhj9qhF0JRFbagZ8xB0+pYUairD5MiCENc6DEVA==", - "dev": true, - "dependencies": { - "commander": "8.3.0", - "inherits": "2.0.4", - "lodash": "4.17.21", - "semver": "7.3.5", - "strip-json-comments": "3.1.1" - }, - "bin": { - "postman-collection-transformer": "bin/transform-collection.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/postman-collection-transformer/node_modules/commander": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", - "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", - "dev": true, - "engines": { - "node": ">= 12" - } - }, - "node_modules/postman-collection-transformer/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" + "iconv-lite": "0.6.3", + "liquid-json": "0.3.1", + "lodash": "4.17.21", + "mime-format": "2.0.1", + "mime-types": "2.1.35", + "postman-url-encoder": "3.0.5", + "semver": "7.5.4", + "uuid": "8.3.2" }, "engines": { "node": ">=10" } }, - "node_modules/postman-collection-transformer/node_modules/semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "node_modules/postman-collection-transformer": { + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/postman-collection-transformer/-/postman-collection-transformer-4.1.8.tgz", + "integrity": "sha512-smJ6X7Z7kbg6hp7JZPFixrSN3J3WkQed7DrWCC5tF7IxOMpFLqhtTtGssY8nD1inP8+mJf+N72Pf2ttUAHgBKw==", "dev": true, "dependencies": { - "lru-cache": "^6.0.0" + "commander": "8.3.0", + "inherits": "2.0.4", + "lodash": "4.17.21", + "semver": "7.5.4", + "strip-json-comments": "3.1.1" }, "bin": { - "semver": "bin/semver.js" + "postman-collection-transformer": "bin/transform-collection.js" }, "engines": { "node": ">=10" } }, - "node_modules/postman-collection-transformer/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==", + "node_modules/postman-collection-transformer/node_modules/commander": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", "dev": true, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 12" } }, - "node_modules/postman-collection-transformer/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/postman-collection/node_modules/iconv-lite": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", @@ -12380,54 +12791,6 @@ "node": ">=0.10.0" } }, - "node_modules/postman-collection/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/postman-collection/node_modules/mime-db": { - "version": "1.51.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz", - "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/postman-collection/node_modules/mime-types": { - "version": "2.1.34", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz", - "integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==", - "dev": true, - "dependencies": { - "mime-db": "1.51.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/postman-collection/node_modules/semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/postman-collection/node_modules/uuid": { "version": "8.3.2", "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", @@ -12437,23 +12800,18 @@ "uuid": "dist/bin/uuid" } }, - "node_modules/postman-collection/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/postman-request": { - "version": "2.88.1-postman.31", - "resolved": "https://registry.npmjs.org/postman-request/-/postman-request-2.88.1-postman.31.tgz", - "integrity": "sha512-OJbYqP7ItxQ84yHyuNpDywCZB0HYbpHJisMQ9lb1cSL3N5H3Td6a2+3l/a74UMd3u82BiGC5yQyYmdOIETP/nQ==", + "version": "2.88.1-postman.33", + "resolved": "https://registry.npmjs.org/postman-request/-/postman-request-2.88.1-postman.33.tgz", + "integrity": "sha512-uL9sCML4gPH6Z4hreDWbeinKU0p0Ke261nU7OvII95NU22HN6Dk7T/SaVPaj6T4TsQqGKIFw6/woLZnH7ugFNA==", "dev": true, "dependencies": { "@postman/form-data": "~3.1.1", + "@postman/tough-cookie": "~4.1.3-postman.1", "@postman/tunnel-agent": "^0.6.3", "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "brotli": "~1.3.2", + "aws4": "^1.12.0", + "brotli": "^1.3.3", "caseless": "~0.12.0", "combined-stream": "~1.0.6", "extend": "~3.0.2", @@ -12463,14 +12821,13 @@ "is-typedarray": "~1.0.0", "isstream": "~0.1.2", "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", + "mime-types": "^2.1.35", "oauth-sign": "~0.9.0", "performance-now": "^2.1.0", - "qs": "~6.5.2", + "qs": "~6.5.3", "safe-buffer": "^5.1.2", "stream-length": "^1.0.2", - "tough-cookie": "~2.5.0", - "uuid": "^3.3.2" + "uuid": "^8.3.2" }, "engines": { "node": ">= 6" @@ -12485,77 +12842,43 @@ "node": ">=0.6" } }, - "node_modules/postman-request/node_modules/tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "node_modules/postman-request/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==", "dev": true, - "dependencies": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - }, - "engines": { - "node": ">=0.8" + "bin": { + "uuid": "dist/bin/uuid" } }, "node_modules/postman-runtime": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/postman-runtime/-/postman-runtime-7.29.0.tgz", - "integrity": "sha512-eXxHREE/fUpohkGPRgBY1YccSGx9cyW3mtGiPyIE4zD5fYzasgBHqW6kbEND3Xrd3yf/uht/YI1H8O7J1+A1+w==", + "version": "7.36.1", + "resolved": "https://registry.npmjs.org/postman-runtime/-/postman-runtime-7.36.1.tgz", + "integrity": "sha512-SarhTewd+rp2cAdC6WFDdT4No0BR3e+tzBcQWZm/o+BDBeOf0W8MQsMKs3BozLMKoKOb/ImqW0jTsa0Rewo0cg==", "dev": true, "dependencies": { - "async": "3.2.3", - "aws4": "1.11.0", - "handlebars": "4.7.7", - "httpntlm": "1.7.7", + "@postman/tough-cookie": "4.1.3-postman.1", + "async": "3.2.5", + "aws4": "1.12.0", + "handlebars": "4.7.8", + "httpntlm": "1.8.13", + "jose": "4.14.4", "js-sha512": "0.8.0", "lodash": "4.17.21", - "mime-types": "2.1.34", + "mime-types": "2.1.35", + "node-forge": "1.3.1", "node-oauth1": "1.3.0", "performance-now": "2.1.0", - "postman-collection": "4.1.1", - "postman-request": "2.88.1-postman.31", - "postman-sandbox": "4.0.6", + "postman-collection": "4.3.0", + "postman-request": "2.88.1-postman.33", + "postman-sandbox": "4.4.0", "postman-url-encoder": "3.0.5", "serialised-error": "1.1.3", - "tough-cookie": "3.0.1", + "strip-json-comments": "3.1.1", "uuid": "8.3.2" }, "engines": { - "node": ">=10" - } - }, - "node_modules/postman-runtime/node_modules/async": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.3.tgz", - "integrity": "sha512-spZRyzKL5l5BZQrr/6m/SqFdBN0q3OCI0f9rjfBzCMBIP4p75P620rR3gTmaksNOhmzgdxcaxdNfMy6anrbM0g==", - "dev": true - }, - "node_modules/postman-runtime/node_modules/aws4": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", - "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==", - "dev": true - }, - "node_modules/postman-runtime/node_modules/mime-db": { - "version": "1.51.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz", - "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/postman-runtime/node_modules/mime-types": { - "version": "2.1.34", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz", - "integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==", - "dev": true, - "dependencies": { - "mime-db": "1.51.0" - }, - "engines": { - "node": ">= 0.6" + "node": ">=12" } }, "node_modules/postman-runtime/node_modules/uuid": { @@ -12568,14 +12891,15 @@ } }, "node_modules/postman-sandbox": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/postman-sandbox/-/postman-sandbox-4.0.6.tgz", - "integrity": "sha512-PPRanSNEE4zy3kO7CeSBHmAfJnGdD9ecHY/Mjh26CQuZZarGkNO8c0U/n+xX3+5M1BRNc82UYq6YCtdsSDqcng==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/postman-sandbox/-/postman-sandbox-4.4.0.tgz", + "integrity": "sha512-NvNodj44vqtZrgLvnqoqFxvqRL1Pw0MSLXGlzSu252iurmHCz59wUykNUQ8mQh0AXNM00gbN/lS1nrGfS1zqwA==", "dev": true, "dependencies": { "lodash": "4.17.21", + "postman-collection": "4.3.0", "teleport-javascript": "1.0.0", - "uvm": "2.0.2" + "uvm": "2.1.1" }, "engines": { "node": ">=10" @@ -12594,9 +12918,9 @@ } }, "node_modules/prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", + "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" @@ -12642,14 +12966,10 @@ "node": ">=8" } }, - "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/process-warning": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-3.0.0.tgz", + "integrity": "sha512-mqn0kFRl0EoqhnL0GQ0veqFHyIN1yig9RHh/InzORTUiZHFRAur+aMtRkELNwGs9aNwKS6tg/An4NYBPGwvtzQ==" }, "node_modules/promise-inflight": { "version": "1.0.1", @@ -12737,15 +13057,6 @@ "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==" }, - "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/punycode": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", @@ -12754,19 +13065,10 @@ "node": ">=6" } }, - "node_modules/q": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", - "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==", - "engines": { - "node": ">=0.6.0", - "teleport": ">=0.2.0" - } - }, "node_modules/qs": { - "version": "6.10.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", - "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==", + "version": "6.11.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.2.tgz", + "integrity": "sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==", "dependencies": { "side-channel": "^1.0.4" }, @@ -12777,6 +13079,12 @@ "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==", + "dev": true + }, "node_modules/queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", @@ -12801,14 +13109,6 @@ "resolved": "https://registry.npmjs.org/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz", "integrity": "sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==" }, - "node_modules/quick-lru": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", - "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", - "engines": { - "node": ">=8" - } - }, "node_modules/randombytes": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", @@ -12859,6 +13159,14 @@ "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" }, + "node_modules/rc/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/react-is": { "version": "16.13.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", @@ -12866,105 +13174,76 @@ "dev": true }, "node_modules/read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-9.0.1.tgz", + "integrity": "sha512-9viLL4/n1BJUCT1NXVTdS1jtm80yDEgR5T4yCelII49Mbj0v1rZdKqj7zCiYdbB0CuCgdrvHcNogAKTFPBocFA==", "dependencies": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" + "@types/normalize-package-data": "^2.4.3", + "normalize-package-data": "^6.0.0", + "parse-json": "^8.0.0", + "type-fest": "^4.6.0", + "unicorn-magic": "^0.1.0" }, "engines": { - "node": ">=8" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/read-pkg-up": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", - "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-11.0.0.tgz", + "integrity": "sha512-LOVbvF1Q0SZdjClSefZ0Nz5z8u+tIE7mV5NibzmE9VYmDe9CaBbAVtz1veOSZbofrdsilxuDAYnFenukZVp8/Q==", + "deprecated": "Renamed to read-package-up", "dependencies": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" + "find-up-simple": "^1.0.0", + "read-pkg": "^9.0.0", + "type-fest": "^4.6.0" }, "engines": { - "node": ">=8" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/read-pkg-up/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, + "node_modules/read-pkg-up/node_modules/type-fest": { + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.9.0.tgz", + "integrity": "sha512-KS/6lh/ynPGiHD/LnAobrEFq3Ad4pBzOlJ1wAnJx9N4EYoqFhMfLIBjUT2UEx4wg5ZE+cC1ob6DCSpppVo+rtg==", "engines": { - "node": ">=8" - } - }, - "node_modules/read-pkg-up/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dependencies": { - "p-locate": "^4.1.0" + "node": ">=16" }, - "engines": { - "node": ">=8" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/read-pkg-up/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "node_modules/read-pkg/node_modules/parse-json": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-8.1.0.tgz", + "integrity": "sha512-rum1bPifK5SSar35Z6EKZuYPJx85pkNaFrxBK3mwdfSJ1/WKbYrjoW/zTPSjRRamfmVX1ACBIdFAO0VRErW/EA==", "dependencies": { - "p-try": "^2.0.0" + "@babel/code-frame": "^7.22.13", + "index-to-position": "^0.1.2", + "type-fest": "^4.7.1" }, "engines": { - "node": ">=6" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/read-pkg-up/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/read-pkg/node_modules/hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==" - }, - "node_modules/read-pkg/node_modules/normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dependencies": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, "node_modules/read-pkg/node_modules/type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.9.0.tgz", + "integrity": "sha512-KS/6lh/ynPGiHD/LnAobrEFq3Ad4pBzOlJ1wAnJx9N4EYoqFhMfLIBjUT2UEx4wg5ZE+cC1ob6DCSpppVo+rtg==", "engines": { - "node": ">=8" + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/readable-stream": { @@ -12990,16 +13269,12 @@ "node": ">=8.10.0" } }, - "node_modules/redent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", - "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", - "dependencies": { - "indent-string": "^4.0.0", - "strip-indent": "^3.0.0" - }, + "node_modules/real-require": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/real-require/-/real-require-0.2.0.tgz", + "integrity": "sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==", "engines": { - "node": ">=8" + "node": ">= 12.13.0" } }, "node_modules/redeyed": { @@ -13010,36 +13285,35 @@ "esprima": "~4.0.0" } }, - "node_modules/reduce-flatten": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-1.0.1.tgz", - "integrity": "sha512-j5WfFJfc9CoXv/WbwVLHq74i/hdTUpy+iNC534LxczMRP67vJeK3V9JOdnL0N1cIRbn9mYhE2yVjvvKXDxvNXQ==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/referrer-policy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/referrer-policy/-/referrer-policy-1.2.0.tgz", - "integrity": "sha512-LgQJIuS6nAy1Jd88DCQRemyE3mS+ispwlqMk3b0yjZ257fI1v9c+/p6SD5gP5FGyXUIgrNOAfmyioHwZtYv2VA==", + "node_modules/reflect.getprototypeof": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.4.tgz", + "integrity": "sha512-ECkTw8TmJwW60lOTR+ZkODISW6RQ8+2CL3COqtiJKLd6MmB45hN51HprHFziKLGkAuTGQhBb91V8cy+KHlaCjw==", + "dev": true, + "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" + }, "engines": { - "node": ">=4.0.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/regenerator-runtime": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" - }, "node_modules/regexp.prototype.flags": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", - "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz", + "integrity": "sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "functions-have-names": "^1.2.2" + "define-properties": "^1.2.0", + "set-function-name": "^2.0.0" }, "engines": { "node": ">= 0.4" @@ -13049,20 +13323,23 @@ } }, "node_modules/regexpp": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", - "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", "dev": true, "engines": { - "node": ">=6.5.0" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" } }, "node_modules/registry-auth-token": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-5.0.1.tgz", - "integrity": "sha512-UfxVOj8seK1yaIOiieV4FIP01vfBDLsY0H9sQzi9EbbUdJiuuBjJgLa1DpImXMNPnVkBD4eVxTEXcrZA6kfpJA==", + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-5.0.2.tgz", + "integrity": "sha512-o/3ikDxtXaA59BmZuZrJZDJv8NMDGSj+6j6XaeBmHw8eY1i1qd9+6H+LjVvQXx3HN6aRCGa1cUdJ9RaJZUugnQ==", "dependencies": { - "@pnpm/npm-conf": "^1.0.4" + "@pnpm/npm-conf": "^2.1.0" }, "engines": { "node": ">=14" @@ -13235,32 +13512,17 @@ "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", "dev": true }, - "node_modules/require-uncached": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", - "integrity": "sha512-Xct+41K3twrbBHdxAgMoOS+cNcoqIjfM2/VxBF4LL2hVph7YsF8VSKyQ3BDFZwEVbok9yeDl2le/qo0S77WG2w==", - "dev": true, - "dependencies": { - "caller-path": "^0.1.0", - "resolve-from": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/require-uncached/node_modules/resolve-from": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz", - "integrity": "sha512-kT10v4dhrlLNcnO084hEjvXCI1wUG9qZLoz2RogxqDQQYy7IxjI/iMUkOtQTNEh6rzHxvdQWHsJyel1pKOVCxg==", - "dev": true, - "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==", + "dev": true }, "node_modules/resolve": { "version": "1.22.1", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "dev": true, "dependencies": { "is-core-module": "^2.9.0", "path-parse": "^1.0.7", @@ -13278,37 +13540,13 @@ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "engines": { - "node": ">=4" - } - }, - "node_modules/restore-cursor": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", - "integrity": "sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==", - "dev": true, - "dependencies": { - "onetime": "^2.0.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/retry": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", - "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", - "engines": { - "node": ">= 4" + "node": ">=4" } }, "node_modules/retry-as-promised": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/retry-as-promised/-/retry-as-promised-3.1.0.tgz", - "integrity": "sha512-g6T9rr5G4AfRVJZcnCbbmpcTDw8NJSnmVrvrJ9Pm9OWAzigocIcFp4+ItwHGJIr0wx0YzwlCJOvvEKQrZhzPOw==", - "dependencies": { - "any-promise": "^1.3.0" - } + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/retry-as-promised/-/retry-as-promised-7.0.4.tgz", + "integrity": "sha512-XgmCoxKWkDofwH8WddD0w85ZfqYz+ZHlr5yo+3YUCfycWawU56T5ckWXsScsj5B8tqUcIG67DxXByo3VUgiAdA==" }, "node_modules/reusify": { "version": "1.0.4", @@ -13320,24 +13558,34 @@ } }, "node_modules/rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", - "dev": true, + "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/run-async": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", - "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", + "node_modules/roarr": { + "version": "2.15.4", + "resolved": "https://registry.npmjs.org/roarr/-/roarr-2.15.4.tgz", + "integrity": "sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A==", "dev": true, + "dependencies": { + "boolean": "^3.0.1", + "detect-node": "^2.0.4", + "globalthis": "^1.0.1", + "json-stringify-safe": "^5.0.1", + "semver-compare": "^1.0.0", + "sprintf-js": "^1.1.2" + }, "engines": { - "node": ">=0.12.0" + "node": ">=8.0" } }, "node_modules/run-parallel": { @@ -13362,18 +13610,30 @@ "queue-microtask": "^1.2.2" } }, - "node_modules/rxjs": { - "version": "6.6.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "node_modules/safe-array-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.1.tgz", + "integrity": "sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q==", "dev": true, "dependencies": { - "tslib": "^1.9.0" + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" }, "engines": { - "npm": ">=2.0.0" + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/safe-array-concat/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + }, "node_modules/safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -13407,6 +13667,14 @@ "url": "https://github.com/sponsors/ljharb" } }, + "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/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", @@ -13418,640 +13686,531 @@ "integrity": "sha512-nZi59hW3Sl5P3+wOO89eHBAAGwmCPd2aE1+dLZV5MO+ItQctIvAqihzaAXIQhvtH4KJPxM080HsnqltR2y8cWg==" }, "node_modules/semantic-release": { - "version": "19.0.3", - "resolved": "https://registry.npmjs.org/semantic-release/-/semantic-release-19.0.3.tgz", - "integrity": "sha512-HaFbydST1cDKZHuFZxB8DTrBLJVK/AnDExpK0s3EqLIAAUAHUgnd+VSJCUtTYQKkAkauL8G9CucODrVCc7BuAA==", - "dependencies": { - "@semantic-release/commit-analyzer": "^9.0.2", - "@semantic-release/error": "^3.0.0", - "@semantic-release/github": "^8.0.0", - "@semantic-release/npm": "^9.0.0", - "@semantic-release/release-notes-generator": "^10.0.0", - "aggregate-error": "^3.0.0", - "cosmiconfig": "^7.0.0", + "version": "22.0.12", + "resolved": "https://registry.npmjs.org/semantic-release/-/semantic-release-22.0.12.tgz", + "integrity": "sha512-0mhiCR/4sZb00RVFJIUlMuiBkW3NMpVIW2Gse7noqEMoFGkvfPPAImEQbkBV8xga4KOPP4FdTRYuLLy32R1fPw==", + "dependencies": { + "@semantic-release/commit-analyzer": "^11.0.0", + "@semantic-release/error": "^4.0.0", + "@semantic-release/github": "^9.0.0", + "@semantic-release/npm": "^11.0.0", + "@semantic-release/release-notes-generator": "^12.0.0", + "aggregate-error": "^5.0.0", + "cosmiconfig": "^8.0.0", "debug": "^4.0.0", - "env-ci": "^5.0.0", - "execa": "^5.0.0", - "figures": "^3.0.0", - "find-versions": "^4.0.0", + "env-ci": "^10.0.0", + "execa": "^8.0.0", + "figures": "^6.0.0", + "find-versions": "^5.1.0", "get-stream": "^6.0.0", "git-log-parser": "^1.2.0", - "hook-std": "^2.0.0", - "hosted-git-info": "^4.0.0", - "lodash": "^4.17.21", - "marked": "^4.0.10", - "marked-terminal": "^5.0.0", + "hook-std": "^3.0.0", + "hosted-git-info": "^7.0.0", + "import-from-esm": "^1.3.1", + "lodash-es": "^4.17.21", + "marked": "^9.0.0", + "marked-terminal": "^6.0.0", "micromatch": "^4.0.2", - "p-each-series": "^2.1.0", - "p-reduce": "^2.0.0", - "read-pkg-up": "^7.0.0", + "p-each-series": "^3.0.0", + "p-reduce": "^3.0.0", + "read-pkg-up": "^11.0.0", "resolve-from": "^5.0.0", "semver": "^7.3.2", - "semver-diff": "^3.1.1", + "semver-diff": "^4.0.0", "signale": "^1.2.1", - "yargs": "^16.2.0" + "yargs": "^17.5.1" }, "bin": { "semantic-release": "bin/semantic-release.js" }, "engines": { - "node": ">=16 || ^14.17" - } - }, - "node_modules/semantic-release/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==", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/semantic-release/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/semantic-release/node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "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": "^18.17 || >=20.6.1" } }, - "node_modules/semantic-release/node_modules/figures": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", - "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "node_modules/semantic-release/node_modules/aggregate-error": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-5.0.0.tgz", + "integrity": "sha512-gOsf2YwSlleG6IjRYG2A7k0HmBMEo6qVNk9Bp/EaLgAJT5ngH6PXbqa4ItvnEwCm/velL5jAnQgsHsWnjhGmvw==", "dependencies": { - "escape-string-regexp": "^1.0.5" + "clean-stack": "^5.2.0", + "indent-string": "^5.0.0" }, "engines": { - "node": ">=8" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/semantic-release/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==", - "engines": { - "node": ">=10" + "node_modules/semantic-release/node_modules/clean-stack": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-5.2.0.tgz", + "integrity": "sha512-TyUIUJgdFnCISzG5zu3291TAsE77ddchd0bepon1VVQrKLGKFED4iXFEDQ24mIPdPBbyE16PK3F8MYE1CmcBEQ==", + "dependencies": { + "escape-string-regexp": "5.0.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/semantic-release/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==", "engines": { - "node": ">=8" + "node": ">=14.16" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/semantic-release/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/semantic-release/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==", - "engines": { - "node": ">=6" - } - }, - "node_modules/semantic-release/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/semantic-release/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==", + "node_modules/semantic-release/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": { - "path-key": "^3.0.0" + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" }, "engines": { - "node": ">=8" + "node": ">=12" } }, - "node_modules/semantic-release/node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "node_modules/semantic-release/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dependencies": { - "mimic-fn": "^2.1.0" + "ms": "2.1.2" }, "engines": { - "node": ">=6" + "node": ">=6.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/semantic-release/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==", - "engines": { - "node": ">=8" + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "node_modules/semantic-release/node_modules/resolve-from": { + "node_modules/semantic-release/node_modules/escape-string-regexp": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "engines": { - "node": ">=8" - } - }, - "node_modules/semantic-release/node_modules/semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", "engines": { - "node": ">=10" - } - }, - "node_modules/semantic-release/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==", - "dependencies": { - "shebang-regex": "^3.0.0" + "node": ">=12" }, - "engines": { - "node": ">=8" - } - }, - "node_modules/semantic-release/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==", - "engines": { - "node": ">=8" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/semantic-release/node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "node_modules/semantic-release/node_modules/execa": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", + "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" + "cross-spawn": "^7.0.3", + "get-stream": "^8.0.1", + "human-signals": "^5.0.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^4.1.0", + "strip-final-newline": "^3.0.0" }, "engines": { - "node": ">= 8" - } - }, - "node_modules/semantic-release/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/semver": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", - "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==", - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/semver-diff": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz", - "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==", - "dependencies": { - "semver": "^6.3.0" + "node": ">=16.17" }, - "engines": { - "node": ">=8" - } - }, - "node_modules/semver-diff/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "bin": { - "semver": "bin/semver.js" + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, - "node_modules/semver-regex": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/semver-regex/-/semver-regex-3.1.4.tgz", - "integrity": "sha512-6IiqeZNgq01qGf0TId0t3NvKzSvUsjcpdEO3AQNeIjR6A2+ckTnQlDpl4qu1bjRv0RzN3FP9hzFmws3lKqRWkA==", + "node_modules/semantic-release/node_modules/execa/node_modules/get-stream": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", + "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", "engines": { - "node": ">=8" + "node": ">=16" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/send": { - "version": "0.17.2", - "resolved": "https://registry.npmjs.org/send/-/send-0.17.2.tgz", - "integrity": "sha512-UJYB6wFSJE3G00nEivR5rgWp8c2xXvJ3OPWPhmuteU0IKj8nKbG3DrjiOmLwpnHGYWAVwA69zmTm++YG0Hmwww==", - "dependencies": { - "debug": "2.6.9", - "depd": "~1.1.2", - "destroy": "~1.0.4", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "1.8.1", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "~2.3.0", - "range-parser": "~1.2.1", - "statuses": "~1.5.0" + "node_modules/semantic-release/node_modules/figures": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/figures/-/figures-6.0.1.tgz", + "integrity": "sha512-0oY/olScYD4IhQ8u//gCPA4F3mlTn2dacYmiDm/mbDQvpmLjV4uH+zhsQ5IyXRyvqkvtUkXkNdGvg5OFJTCsuQ==", + "dependencies": { + "is-unicode-supported": "^2.0.0" }, "engines": { - "node": ">= 0.8.0" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/send/node_modules/depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "node_modules/semantic-release/node_modules/human-signals": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", + "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", "engines": { - "node": ">= 0.6" + "node": ">=16.17.0" } }, - "node_modules/send/node_modules/destroy": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "integrity": "sha512-3NdhDuEXnfun/z7x9GOElY49LoqVHoGScmOKwmxhsS8N5Y+Z8KyPPDnaSzqWgYt/ji4mqwfTS34Htrk0zPIXVg==" - }, - "node_modules/send/node_modules/http-errors": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", - "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", - "dependencies": { - "depd": "~1.1.2", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.1" - }, + "node_modules/semantic-release/node_modules/indent-string": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", + "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", "engines": { - "node": ">= 0.6" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/send/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" - }, + "node_modules/semantic-release/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==", "engines": { - "node": ">=4" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "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/send/node_modules/on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", - "dependencies": { - "ee-first": "1.1.1" + "node_modules/semantic-release/node_modules/is-unicode-supported": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.0.0.tgz", + "integrity": "sha512-FRdAyx5lusK1iHG0TWpVtk9+1i+GjrzRffhDg4ovQ7mcidMQ6mj+MhKPmvh7Xwyv5gIS06ns49CA7Sqg7lC22Q==", + "engines": { + "node": ">=18" }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/semantic-release/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==", "engines": { - "node": ">= 0.8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/sequelize": { - "version": "6.29.0", - "resolved": "https://registry.npmjs.org/sequelize/-/sequelize-6.29.0.tgz", - "integrity": "sha512-m8Wi90rs3NZP9coXE52c7PL4Q078nwYZXqt1IxPvgki7nOFn0p/F0eKsYDBXCPw9G8/BCEa6zZNk0DQUAT4ypA==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/sequelize" - } - ], + "node_modules/semantic-release/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/semantic-release/node_modules/npm-run-path": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.2.0.tgz", + "integrity": "sha512-W4/tgAXFqFA0iL7fk0+uQ3g7wkL8xJmx3XdK0VGb4cHW//eZTtKGvFBBoRKVTpY7n6ze4NL9ly7rgXcHufqXKg==", "dependencies": { - "@types/debug": "^4.1.7", - "@types/validator": "^13.7.1", - "debug": "^4.3.3", - "dottie": "^2.0.2", - "inflection": "^1.13.2", - "lodash": "^4.17.21", - "moment": "^2.29.1", - "moment-timezone": "^0.5.35", - "pg-connection-string": "^2.5.0", - "retry-as-promised": "^7.0.3", - "semver": "^7.3.5", - "sequelize-pool": "^7.1.0", - "toposort-class": "^1.0.1", - "uuid": "^8.3.2", - "validator": "^13.7.0", - "wkx": "^0.5.0" + "path-key": "^4.0.0" }, "engines": { - "node": ">=10.0.0" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, - "peerDependenciesMeta": { - "ibm_db": { - "optional": true - }, - "mariadb": { - "optional": true - }, - "mysql2": { - "optional": true - }, - "oracledb": { - "optional": true - }, - "pg": { - "optional": true - }, - "pg-hstore": { - "optional": true - }, - "snowflake-sdk": { - "optional": true - }, - "sqlite3": { - "optional": true - }, - "tedious": { - "optional": true - } + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/sequelize-cli": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/sequelize-cli/-/sequelize-cli-5.5.0.tgz", - "integrity": "sha512-twVQ02alCpr2XvxNmpi32C48WZs6xHTH1OFTfTS5Meg3BVqOM8ghiZoml4FITFjlD8sAJSQjlAHTwqTbuolA6Q==", - "dev": true, + "node_modules/semantic-release/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==", "dependencies": { - "bluebird": "^3.5.3", - "cli-color": "^1.4.0", - "fs-extra": "^7.0.1", - "js-beautify": "^1.8.8", - "lodash": "^4.17.5", - "resolve": "^1.5.0", - "umzug": "^2.1.0", - "yargs": "^13.1.0" - }, - "bin": { - "sequelize": "lib/sequelize" + "mimic-fn": "^4.0.0" }, "engines": { - "node": ">=6.0.0" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/sequelize-cli/node_modules/ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", - "dev": true, + "node_modules/semantic-release/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==", "engines": { - "node": ">=6" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/sequelize-cli/node_modules/cliui": { + "node_modules/semantic-release/node_modules/resolve-from": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", - "dev": true, - "dependencies": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "engines": { + "node": ">=8" } }, - "node_modules/sequelize-cli/node_modules/emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "dev": true + "node_modules/semantic-release/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } }, - "node_modules/sequelize-cli/node_modules/find-up": { + "node_modules/semantic-release/node_modules/strip-final-newline": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "dependencies": { - "locate-path": "^3.0.0" - }, + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", "engines": { - "node": ">=6" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/sequelize-cli/node_modules/fs-extra": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", - "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", - "dev": true, + "node_modules/semantic-release/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": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" + "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": ">=6 <7 || >=8" + "node": ">=12" } }, - "node_modules/sequelize-cli/node_modules/jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", - "dev": true, - "optionalDependencies": { - "graceful-fs": "^4.1.6" + "node_modules/semantic-release/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/sequelize-cli/node_modules/locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, + "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": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" }, "engines": { - "node": ">=6" + "node": ">=10" } }, - "node_modules/sequelize-cli/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, + "node_modules/semver-compare": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", + "integrity": "sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==", + "dev": true + }, + "node_modules/semver-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-4.0.0.tgz", + "integrity": "sha512-0Ju4+6A8iOnpL/Thra7dZsSlOHYAHIeMxfhWQRI1/VLcT3WDBZKKtQt/QkBOsiIN9ZpuvHE6cGZ0x4glCMmfiA==", "dependencies": { - "p-try": "^2.0.0" + "semver": "^7.3.5" }, "engines": { - "node": ">=6" + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/sequelize-cli/node_modules/p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, + "node_modules/semver-regex": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/semver-regex/-/semver-regex-4.0.5.tgz", + "integrity": "sha512-hunMQrEy1T6Jr2uEVjrAIqjwWcQTgOAcIM52C8MY1EZSD3DDNft04XzvYKPqjED65bNVVko0YI38nYeEHCX3yw==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/semver/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": { - "p-limit": "^2.0.0" + "yallist": "^4.0.0" }, "engines": { - "node": ">=6" + "node": ">=10" } }, - "node_modules/sequelize-cli/node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", - "dev": true, + "node_modules/semver/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/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/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/sequelize-cli/node_modules/string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, + "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/sequelize": { + "version": "6.35.2", + "resolved": "https://registry.npmjs.org/sequelize/-/sequelize-6.35.2.tgz", + "integrity": "sha512-EdzLaw2kK4/aOnWQ7ed/qh3B6/g+1DvmeXr66RwbcqSm/+QRS9X0LDI5INBibsy4eNJHWIRPo3+QK0zL+IPBHg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/sequelize" + } + ], "dependencies": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" + "@types/debug": "^4.1.8", + "@types/validator": "^13.7.17", + "debug": "^4.3.4", + "dottie": "^2.0.6", + "inflection": "^1.13.4", + "lodash": "^4.17.21", + "moment": "^2.29.4", + "moment-timezone": "^0.5.43", + "pg-connection-string": "^2.6.1", + "retry-as-promised": "^7.0.4", + "semver": "^7.5.4", + "sequelize-pool": "^7.1.0", + "toposort-class": "^1.0.1", + "uuid": "^8.3.2", + "validator": "^13.9.0", + "wkx": "^0.5.0" }, "engines": { - "node": ">=6" + "node": ">=10.0.0" + }, + "peerDependenciesMeta": { + "ibm_db": { + "optional": true + }, + "mariadb": { + "optional": true + }, + "mysql2": { + "optional": true + }, + "oracledb": { + "optional": true + }, + "pg": { + "optional": true + }, + "pg-hstore": { + "optional": true + }, + "snowflake-sdk": { + "optional": true + }, + "sqlite3": { + "optional": true + }, + "tedious": { + "optional": true + } } }, - "node_modules/sequelize-cli/node_modules/strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "node_modules/sequelize-cli": { + "version": "6.6.2", + "resolved": "https://registry.npmjs.org/sequelize-cli/-/sequelize-cli-6.6.2.tgz", + "integrity": "sha512-V8Oh+XMz2+uquLZltZES6MVAD+yEnmMfwfn+gpXcDiwE3jyQygLt4xoI0zG8gKt6cRcs84hsKnXAKDQjG/JAgg==", "dev": true, "dependencies": { - "ansi-regex": "^4.1.0" + "cli-color": "^2.0.3", + "fs-extra": "^9.1.0", + "js-beautify": "^1.14.5", + "lodash": "^4.17.21", + "resolve": "^1.22.1", + "umzug": "^2.3.0", + "yargs": "^16.2.0" + }, + "bin": { + "sequelize": "lib/sequelize", + "sequelize-cli": "lib/sequelize" }, "engines": { - "node": ">=6" - } - }, - "node_modules/sequelize-cli/node_modules/universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "dev": true, - "engines": { - "node": ">= 4.0.0" + "node": ">=10.0.0" } }, - "node_modules/sequelize-cli/node_modules/wrap-ansi": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", - "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "node_modules/sequelize-cli/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": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" }, "engines": { - "node": ">=6" + "node": ">=10" } }, - "node_modules/sequelize-cli/node_modules/y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", - "dev": true - }, - "node_modules/sequelize-cli/node_modules/yargs": { - "version": "13.3.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", - "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", + "node_modules/sequelize-cli/node_modules/umzug": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/umzug/-/umzug-2.3.0.tgz", + "integrity": "sha512-Z274K+e8goZK8QJxmbRPhl89HPO1K+ORFtm6rySPhFKfKc5GHhqdzD0SGhSWHkzoXasqJuItdhorSvY7/Cgflw==", "dev": true, "dependencies": { - "cliui": "^5.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^13.1.2" + "bluebird": "^3.7.2" + }, + "engines": { + "node": ">=6.0.0" } }, - "node_modules/sequelize-cli/node_modules/yargs-parser": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", - "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", + "node_modules/sequelize-cli/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", "dev": true, - "dependencies": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" + "engines": { + "node": ">= 10.0.0" } }, "node_modules/sequelize-pool": { @@ -14078,41 +14237,11 @@ } } }, - "node_modules/sequelize/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/sequelize/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/sequelize/node_modules/retry-as-promised": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/retry-as-promised/-/retry-as-promised-7.0.4.tgz", - "integrity": "sha512-XgmCoxKWkDofwH8WddD0w85ZfqYz+ZHlr5yo+3YUCfycWawU56T5ckWXsScsj5B8tqUcIG67DxXByo3VUgiAdA==" - }, - "node_modules/sequelize/node_modules/semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/sequelize/node_modules/uuid": { "version": "8.3.2", "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", @@ -14121,11 +14250,6 @@ "uuid": "dist/bin/uuid" } }, - "node_modules/sequelize/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/serialised-error": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/serialised-error/-/serialised-error-1.1.3.tgz", @@ -14137,6 +14261,33 @@ "uuid": "^3.0.0" } }, + "node_modules/serialize-error": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-7.0.1.tgz", + "integrity": "sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==", + "dev": true, + "dependencies": { + "type-fest": "^0.13.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/serialize-error/node_modules/type-fest": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", + "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/serialize-javascript": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", @@ -14147,14 +14298,14 @@ } }, "node_modules/serve-static": { - "version": "1.14.2", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.2.tgz", - "integrity": "sha512-+TMNA9AFxUEGuC0z2mevogSnn9MXKb4fa7ngeRMJaaGv8vTwnIEkKi+QGvPt33HSnf8pRS+WGM0EbMtCJLKMBQ==", + "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.17.2" + "send": "0.18.0" }, "engines": { "node": ">= 0.8.0" @@ -14165,6 +14316,34 @@ "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" }, + "node_modules/set-function-length": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.1.1.tgz", + "integrity": "sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==", + "dependencies": { + "define-data-property": "^1.1.1", + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-function-name": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.1.tgz", + "integrity": "sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==", + "dev": true, + "dependencies": { + "define-data-property": "^1.0.1", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", @@ -14176,22 +14355,22 @@ "integrity": "sha512-b6i4ZpVuUxB9h5gfCxPiusKYkqTMOjEbBs4wMaFbkfia4yFv92UKZ6Df8WXcKbn08JNL/abvg3FnMAOfakDvUw==" }, "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==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dependencies": { - "shebang-regex": "^1.0.0" + "shebang-regex": "^3.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, "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==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, "node_modules/side-channel": { @@ -14232,59 +14411,83 @@ } }, "node_modules/sinon": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/sinon/-/sinon-7.5.0.tgz", - "integrity": "sha512-AoD0oJWerp0/rY9czP/D6hDTTUYGpObhZjMpd7Cl/A6+j0xBE+ayL/ldfggkBXUs0IkvIiM1ljM8+WkOc5k78Q==", + "version": "17.0.1", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-17.0.1.tgz", + "integrity": "sha512-wmwE19Lie0MLT+ZYNpDymasPHUKTaZHUH/pKEubRXIzySv9Atnlw+BUMGCzWgV7b7wO+Hw6f1TEOr0IUnmU8/g==", "dev": true, "dependencies": { - "@sinonjs/commons": "^1.4.0", - "@sinonjs/formatio": "^3.2.1", - "@sinonjs/samsam": "^3.3.3", - "diff": "^3.5.0", - "lolex": "^4.2.0", - "nise": "^1.5.2", - "supports-color": "^5.5.0" + "@sinonjs/commons": "^3.0.0", + "@sinonjs/fake-timers": "^11.2.2", + "@sinonjs/samsam": "^8.0.0", + "diff": "^5.1.0", + "nise": "^5.1.5", + "supports-color": "^7.2.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/sinon" } }, "node_modules/sinon-chai": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/sinon-chai/-/sinon-chai-3.3.0.tgz", - "integrity": "sha512-r2JhDY7gbbmh5z3Q62pNbrjxZdOAjpsqW/8yxAZRSqLZqowmfGZPGUZPFf3UX36NLis0cv8VEM5IJh9HgkSOAA==", + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/sinon-chai/-/sinon-chai-3.7.0.tgz", + "integrity": "sha512-mf5NURdUaSdnatJx3uhoBOrY9dtL19fiOtAdT1Azxg3+lNJFiuN0uzaU3xX1LeAfL17kHQhTAJgpsfhbMJMY2g==", "dev": true, "peerDependencies": { "chai": "^4.0.0", - "sinon": ">=4.0.0 <8.0.0" + "sinon": ">=4.0.0" } }, "node_modules/sinon/node_modules/diff": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", - "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.1.0.tgz", + "integrity": "sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==", "dev": true, "engines": { "node": ">=0.3.1" } }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "node_modules/sinon/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/slice-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", - "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", + "node_modules/sinon/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": { - "ansi-styles": "^3.2.0", - "astral-regex": "^1.0.0", - "is-fullwidth-code-point": "^2.0.0" + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/skin-tone": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/skin-tone/-/skin-tone-2.0.0.tgz", + "integrity": "sha512-kUMbT1oBJCpgrnKoSr0o6wPtvRWT9W9UKvGLwfJYO2WuahZRHOpEyL1ckyMGgMWh0UdpmaoFqKKD29WTomNEGA==", + "dependencies": { + "unicode-emoji-modifier-base": "^1.0.0" }, "engines": { - "node": ">=6" + "node": ">=8" + } + }, + "node_modules/slash": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz", + "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/smart-buffer": { @@ -14298,18 +14501,41 @@ } }, "node_modules/smtp-connection": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/smtp-connection/-/smtp-connection-2.3.2.tgz", - "integrity": "sha512-ORefDrSgddCYkJE7oH3jB6WRv2Z7laZLCMRYD4GFFB8oaZw/hnil7exDBP4yBYs3OgschOuvVdCauUQAblTWvQ==", + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/smtp-connection/-/smtp-connection-2.12.0.tgz", + "integrity": "sha512-UP5jK4s5SGcUcqPN4U9ingqKt9mXYSKa52YhqxPuMecAnUOsVJpOmtgGaOm1urUBJZlzDt1M9WhZZkgbhxQlvg==", + "dependencies": { + "httpntlm": "1.6.1", + "nodemailer-shared": "1.1.0" + } + }, + "node_modules/smtp-connection/node_modules/httpntlm": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/httpntlm/-/httpntlm-1.6.1.tgz", + "integrity": "sha512-Tcz3Ct9efvNqw3QdTl3h6IgRRlIQxwKkJELN/aAIGnzi2xvb3pDHdnMs8BrxWLV6OoT4DlVyhzSVhFt/tk0lIw==", "dependencies": { - "nodemailer-shared": "1.0.4" + "httpreq": ">=0.4.22", + "underscore": "~1.7.0" + }, + "engines": { + "node": ">=0.8.0" } }, + "node_modules/smtp-connection/node_modules/underscore": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.7.0.tgz", + "integrity": "sha512-cp0oQQyZhUM1kpJDLdGO1jPZHgS/MpzoWYfe9+CM2h/QGDZlqwT2T3YGukuBdaNJ/CAPoeyAZRRHz8JFo176vA==" + }, "node_modules/snyk": { - "version": "1.1109.0", - "resolved": "https://registry.npmjs.org/snyk/-/snyk-1.1109.0.tgz", - "integrity": "sha512-sBcibkAfcq6nXr6t0GieDjdc8kQfEf429+M1VKavGfLaJPQNIqSjtOhQJ5FcZqaB/mCWa1szektkHeyAiB4m9A==", + "version": "1.1266.0", + "resolved": "https://registry.npmjs.org/snyk/-/snyk-1.1266.0.tgz", + "integrity": "sha512-upsITfOo/ioJn4F9BmKUIHeVtHNijvk4fx/2u5SfsNCHYabWSbMR2bmGdB1aD1TUonm92VB2hTJTBTYL2FRo5A==", "dev": true, + "hasInstallScript": true, + "dependencies": { + "@sentry/node": "^7.36.0", + "global-agent": "^3.0.0" + }, "bin": { "snyk": "bin/snyk" }, @@ -14369,12 +14595,11 @@ "optional": true }, "node_modules/sonic-boom": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-1.4.1.tgz", - "integrity": "sha512-LRHh/A8tpW7ru89lrlkU4AszXt1dbwSjVWguGrmlxE7tawVmDBlI1PILMkXAxJTwqhgsEeTHzj36D5CmHgQmNg==", + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-3.7.0.tgz", + "integrity": "sha512-IudtNvSqA/ObjN97tfgNmOKyDOs4dNcg4cUUsHDebqsgb8wGBBwb31LIgShNO8fye0dFI52X1+tFoKKI6Rq1Gg==", "dependencies": { - "atomic-sleep": "^1.0.0", - "flatstr": "^1.0.12" + "atomic-sleep": "^1.0.0" } }, "node_modules/source-map": { @@ -14398,49 +14623,19 @@ "dependencies": { "foreground-child": "^2.0.0", "is-windows": "^1.0.2", - "make-dir": "^3.0.0", - "rimraf": "^3.0.0", - "signal-exit": "^3.0.2", - "which": "^2.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/spawn-wrap/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/spawn-wrap/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" + "make-dir": "^3.0.0", + "rimraf": "^3.0.0", + "signal-exit": "^3.0.2", + "which": "^2.0.1" }, "engines": { - "node": ">= 8" + "node": ">=8" } }, "node_modules/spdx-correct": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", - "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", "dependencies": { "spdx-expression-parse": "^3.0.0", "spdx-license-ids": "^3.0.0" @@ -14461,59 +14656,28 @@ } }, "node_modules/spdx-license-ids": { - "version": "3.0.12", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.12.tgz", - "integrity": "sha512-rr+VVSXtRhO4OHbXUiAF7xW3Bo9DuuF6C5jH+q/x15j2jniycgKbxU09Hr0WqlSLUs4i4ltHGXqTe7VHclYWyA==" - }, - "node_modules/split": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", - "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==", - "dependencies": { - "through": "2" - }, - "engines": { - "node": "*" - } + "version": "3.0.16", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.16.tgz", + "integrity": "sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw==" }, "node_modules/split2": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz", - "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==", - "dependencies": { - "readable-stream": "^3.0.0" - } - }, - "node_modules/split2/node_modules/readable-stream": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.1.tgz", - "integrity": "sha512-+rQmrWMYGA90yenhTYsLWAsLsqVC8osOw6PKE1HDYiO0gdPeKe/xDHNzIAIn4C91YQ6oenEhfYqqc1883qHbjQ==", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", + "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", "engines": { - "node": ">= 6" - } - }, - "node_modules/split2/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": ">= 10.x" } }, "node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", + "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", + "dev": true }, "node_modules/sqlite3": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/sqlite3/-/sqlite3-5.1.5.tgz", - "integrity": "sha512-7sP16i4wI+yKnGOO2q2ijze7EjQ9US+Vw7DYYwxfFtqNZDGgBcEw0oeDaDvUTq66uJOzVd/z6MkIg+c9erSJKg==", + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/sqlite3/-/sqlite3-5.1.6.tgz", + "integrity": "sha512-olYkWoKFVNSSSQNvxVUfjiVbz3YtBwTJj+mfV5zpHmqW3sELx2Cf4QCdirMelhM5Zh+KDVaKgQHqCxrqiWHybw==", "hasInstallScript": true, "dependencies": { "@mapbox/node-pre-gyp": "^1.0.0", @@ -14578,276 +14742,207 @@ } }, "node_modules/standard": { - "version": "12.0.1", - "resolved": "https://registry.npmjs.org/standard/-/standard-12.0.1.tgz", - "integrity": "sha512-UqdHjh87OG2gUrNCSM4QRLF5n9h3TFPwrCNyVlkqu31Hej0L/rc8hzKqVvkb2W3x0WMq7PzZdkLfEcBhVOR6lg==", + "version": "17.1.0", + "resolved": "https://registry.npmjs.org/standard/-/standard-17.1.0.tgz", + "integrity": "sha512-jaDqlNSzLtWYW4lvQmU0EnxWMUGQiwHasZl5ZEIwx3S/ijZDjZOzs1y1QqKwKs5vqnFpGtizo4NOYX2s0Voq/g==", "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": { - "eslint": "~5.4.0", - "eslint-config-standard": "12.0.0", - "eslint-config-standard-jsx": "6.0.2", - "eslint-plugin-import": "~2.14.0", - "eslint-plugin-node": "~7.0.1", - "eslint-plugin-promise": "~4.0.0", - "eslint-plugin-react": "~7.11.1", - "eslint-plugin-standard": "~4.0.0", - "standard-engine": "~9.0.0" + "eslint": "^8.41.0", + "eslint-config-standard": "17.1.0", + "eslint-config-standard-jsx": "^11.0.0", + "eslint-plugin-import": "^2.27.5", + "eslint-plugin-n": "^15.7.0", + "eslint-plugin-promise": "^6.1.1", + "eslint-plugin-react": "^7.32.2", + "standard-engine": "^15.0.0", + "version-guard": "^1.1.1" }, "bin": { - "standard": "bin/cmd.js" + "standard": "bin/cmd.cjs" }, "engines": { - "node": ">=4" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, "node_modules/standard-engine": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/standard-engine/-/standard-engine-9.0.0.tgz", - "integrity": "sha512-ZfNfCWZ2Xq67VNvKMPiVMKHnMdvxYzvZkf1AH8/cw2NLDBm5LRsxMqvEJpsjLI/dUosZ3Z1d6JlHDp5rAvvk2w==", + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/standard-engine/-/standard-engine-15.1.0.tgz", + "integrity": "sha512-VHysfoyxFu/ukT+9v49d4BRXIokFRZuH3z1VRxzFArZdjSCFpro6rEIU3ji7e4AoAtuSfKBkiOmsrDqKW5ZSRw==", "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": { - "deglob": "^2.1.0", - "get-stdin": "^6.0.0", - "minimist": "^1.1.0", - "pkg-conf": "^2.0.0" - } - }, - "node_modules/standard/node_modules/acorn": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", - "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==", - "dev": true, - "bin": { - "acorn": "bin/acorn" + "get-stdin": "^8.0.0", + "minimist": "^1.2.6", + "pkg-conf": "^3.1.0", + "xdg-basedir": "^4.0.0" }, "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/standard/node_modules/chardet": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz", - "integrity": "sha512-j/Toj7f1z98Hh2cYo2BVr85EpIRWqUi7rtRSGxh/cqUjqrnJe9l9UE7IUGd2vQ2p+kSHLkSzObQPZPLUC6TQwg==", - "dev": true - }, - "node_modules/standard/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": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, - "node_modules/standard/node_modules/doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "node_modules/standard-engine/node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", "dev": true, "dependencies": { - "esutils": "^2.0.2" + "locate-path": "^3.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=6" } }, - "node_modules/standard/node_modules/eslint": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-5.4.0.tgz", - "integrity": "sha512-UIpL91XGex3qtL6qwyCQJar2j3osKxK9e3ano3OcGEIRM4oWIpCkDg9x95AXEC2wMs7PnxzOkPZ2gq+tsMS9yg==", + "node_modules/standard-engine/node_modules/load-json-file": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-5.3.0.tgz", + "integrity": "sha512-cJGP40Jc/VXUsp8/OrnyKyTZ1y6v/dphm3bioS+RrKXjK2BB6wHUd6JptZEFDGgGahMT+InnZO5i1Ei9mpC8Bw==", "dev": true, "dependencies": { - "ajv": "^6.5.0", - "babel-code-frame": "^6.26.0", - "chalk": "^2.1.0", - "cross-spawn": "^6.0.5", - "debug": "^3.1.0", - "doctrine": "^2.1.0", - "eslint-scope": "^4.0.0", - "eslint-utils": "^1.3.1", - "eslint-visitor-keys": "^1.0.0", - "espree": "^4.0.0", - "esquery": "^1.0.1", - "esutils": "^2.0.2", - "file-entry-cache": "^2.0.0", - "functional-red-black-tree": "^1.0.1", - "glob": "^7.1.2", - "globals": "^11.7.0", - "ignore": "^4.0.2", - "imurmurhash": "^0.1.4", - "inquirer": "^5.2.0", - "is-resolvable": "^1.1.0", - "js-yaml": "^3.11.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.3.0", - "lodash": "^4.17.5", - "minimatch": "^3.0.4", - "mkdirp": "^0.5.1", - "natural-compare": "^1.4.0", - "optionator": "^0.8.2", - "path-is-inside": "^1.0.2", - "pluralize": "^7.0.0", - "progress": "^2.0.0", - "regexpp": "^2.0.0", - "require-uncached": "^1.0.3", - "semver": "^5.5.0", - "strip-ansi": "^4.0.0", - "strip-json-comments": "^2.0.1", - "table": "^4.0.3", - "text-table": "^0.2.0" - }, - "bin": { - "eslint": "bin/eslint.js" + "graceful-fs": "^4.1.15", + "parse-json": "^4.0.0", + "pify": "^4.0.1", + "strip-bom": "^3.0.0", + "type-fest": "^0.3.0" }, "engines": { - "node": "^6.14.0 || ^8.10.0 || >=9.10.0" + "node": ">=6" } }, - "node_modules/standard/node_modules/espree": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-4.1.0.tgz", - "integrity": "sha512-I5BycZW6FCVIub93TeVY1s7vjhP9CY6cXCznIRfiig7nRviKZYdRnj/sHEWC6A7WE9RDWOFq9+7OsWSYz8qv2w==", + "node_modules/standard-engine/node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", "dev": true, "dependencies": { - "acorn": "^6.0.2", - "acorn-jsx": "^5.0.0", - "eslint-visitor-keys": "^1.0.0" + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" }, "engines": { - "node": ">=6.0.0" + "node": ">=6" } }, - "node_modules/standard/node_modules/external-editor": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz", - "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==", + "node_modules/standard-engine/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, "dependencies": { - "chardet": "^0.4.0", - "iconv-lite": "^0.4.17", - "tmp": "^0.0.33" + "p-try": "^2.0.0" }, "engines": { - "node": ">=0.12" + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/standard/node_modules/file-entry-cache": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz", - "integrity": "sha512-uXP/zGzxxFvFfcZGgBIwotm+Tdc55ddPAzF7iHshP4YGaXMww7rSF9peD9D1sui5ebONg5UobsZv+FfgEpGv/w==", + "node_modules/standard-engine/node_modules/p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", "dev": true, "dependencies": { - "flat-cache": "^1.2.1", - "object-assign": "^4.0.1" + "p-limit": "^2.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=6" } }, - "node_modules/standard/node_modules/flat-cache": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.4.tgz", - "integrity": "sha512-VwyB3Lkgacfik2vhqR4uv2rvebqmDvFu4jlN/C1RzWoJEo8I7z4Q404oiqYCkq41mni8EzQnm95emU9seckwtg==", + "node_modules/standard-engine/node_modules/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", "dev": true, "dependencies": { - "circular-json": "^0.3.1", - "graceful-fs": "^4.1.2", - "rimraf": "~2.6.2", - "write": "^0.2.1" + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" }, "engines": { - "node": ">=0.10.0" + "node": ">=4" } }, - "node_modules/standard/node_modules/inquirer": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-5.2.0.tgz", - "integrity": "sha512-E9BmnJbAKLPGonz0HeWHtbKf+EeSP93paWO3ZYoUpq/aowXvYGjjCSuashhXPpzbArIjBbji39THkxTz9ZeEUQ==", + "node_modules/standard-engine/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", "dev": true, - "dependencies": { - "ansi-escapes": "^3.0.0", - "chalk": "^2.0.0", - "cli-cursor": "^2.1.0", - "cli-width": "^2.0.0", - "external-editor": "^2.1.0", - "figures": "^2.0.0", - "lodash": "^4.3.0", - "mute-stream": "0.0.7", - "run-async": "^2.2.0", - "rxjs": "^5.5.2", - "string-width": "^2.1.0", - "strip-ansi": "^4.0.0", - "through": "^2.3.6" - }, "engines": { - "node": ">=6.0.0" + "node": ">=4" } }, - "node_modules/standard/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==", - "dev": true - }, - "node_modules/standard/node_modules/rxjs": { - "version": "5.5.12", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.5.12.tgz", - "integrity": "sha512-xx2itnL5sBbqeeiVgNPVuQQ1nC8Jp2WfNJhXWHmElW9YmrpS9UVnNzhP3EH3HFqexO5Tlp8GhYY+WEcqcVMvGw==", + "node_modules/standard-engine/node_modules/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", "dev": true, - "dependencies": { - "symbol-observable": "1.0.1" - }, "engines": { - "npm": ">=2.0.0" + "node": ">=6" } }, - "node_modules/standard/node_modules/slice-ansi": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-1.0.0.tgz", - "integrity": "sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==", + "node_modules/standard-engine/node_modules/pkg-conf": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/pkg-conf/-/pkg-conf-3.1.0.tgz", + "integrity": "sha512-m0OTbR/5VPNPqO1ph6Fqbj7Hv6QU7gR/tQW40ZqrL1rjgCU85W6C1bJn0BItuJqnR98PWzw7Z8hHeChD1WrgdQ==", "dev": true, "dependencies": { - "is-fullwidth-code-point": "^2.0.0" + "find-up": "^3.0.0", + "load-json-file": "^5.2.0" }, "engines": { - "node": ">=4" + "node": ">=6" } }, - "node_modules/standard/node_modules/table": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/table/-/table-4.0.3.tgz", - "integrity": "sha512-S7rnFITmBH1EnyKcvxBh1LjYeQMmnZtCXSEbHcH6S0NoKit24ZuFO/T1vDcLdYsLQkM188PVVhQmzKIuThNkKg==", + "node_modules/standard-engine/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, - "dependencies": { - "ajv": "^6.0.1", - "ajv-keywords": "^3.0.0", - "chalk": "^2.1.0", - "lodash": "^4.17.4", - "slice-ansi": "1.0.0", - "string-width": "^2.1.1" - }, "engines": { - "node": ">=4.0.0" + "node": ">=4" } }, - "node_modules/standard/node_modules/write": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz", - "integrity": "sha512-CJ17OoULEKXpA5pef3qLj5AxTJ6mSt7g84he2WIskKwqFO4T97d5V7Tadl0DYDk7qyUOQD5WlUlOMChaYrhxeA==", + "node_modules/standard-engine/node_modules/type-fest": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.3.1.tgz", + "integrity": "sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ==", "dev": true, - "dependencies": { - "mkdirp": "^0.5.1" - }, "engines": { - "node": ">=0.10.0" + "node": ">=6" } }, "node_modules/statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", "engines": { - "node": ">= 0.6" + "node": ">= 0.8" } }, "node_modules/stealthy-require": { @@ -14914,6 +15009,14 @@ "integrity": "sha512-UfFSr22dmHPQqPP9XWHRhq+gWnHCYguQGkXQlbyPtW5qTnhFWA8/iXg765tH0cAjy7l/zPJ1aBTO0g5XgA7kvQ==", "dev": true }, + "node_modules/stream-read-all": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/stream-read-all/-/stream-read-all-3.0.1.tgz", + "integrity": "sha512-EWZT9XOceBPlVJRrYcykW8jyRSZYbkb/0ZK36uLEmoWVO5gxBOnntNTseNzfREsqxqdfEGQrD8SXQ3QWbBmq8A==", + "engines": { + "node": ">=10" + } + }, "node_modules/streamsearch": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", @@ -14927,68 +15030,106 @@ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==" }, + "node_modules/string-argv": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz", + "integrity": "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==", + "engines": { + "node": ">=0.6.19" + } + }, "node_modules/string-format": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/string-format/-/string-format-2.0.0.tgz", "integrity": "sha512-bbEs3scLeYNXLecRRuk6uJxdXUSj6le/8rNPHChIJTn2V79aXVTR1EH2OH5zLKKoz0V02fOUKZZcw01pLUShZA==" }, "node_modules/string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "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": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" }, "engines": { - "node": ">=4" + "node": ">=8" + } + }, + "node_modules/string.prototype.matchall": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.10.tgz", + "integrity": "sha512-rGXbGmOEosIQi6Qva94HUjgPs9vKW+dkG7Y8Q5O2OYkWL6wFaTRZO8zM4mhP94uX55wgyrXzfS2aGtGzUL7EJQ==", + "dev": true, + "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", + "set-function-name": "^2.0.0", + "side-channel": "^1.0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz", + "integrity": "sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/string.prototype.trimend": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", - "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz", + "integrity": "sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/string.prototype.trimstart": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", - "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz", + "integrity": "sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "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==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dependencies": { - "ansi-regex": "^3.0.0" + "ansi-regex": "^5.0.1" }, "engines": { - "node": ">=4" - } - }, - "node_modules/strip-ansi/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": ">=8" } }, "node_modules/strip-bom": { @@ -15000,138 +15141,104 @@ "node": ">=8" } }, - "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-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==", "engines": { - "node": ">=6" - } - }, - "node_modules/strip-indent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", - "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", - "dependencies": { - "min-indent": "^1.0.0" - }, - "engines": { - "node": ">=8" + "node": ">=6" } }, "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==", + "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": ">=0.10.0" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/superagent": { - "version": "3.8.3", - "resolved": "https://registry.npmjs.org/superagent/-/superagent-3.8.3.tgz", - "integrity": "sha512-GLQtLMCoEIK4eDv6OGtkOoSMt3D+oq0y3dsxMuYuDvaNUvuT8eFBuLmfR0iYYzHC1e8hpzC6ZsxbuP6DIalMFA==", - "deprecated": "Please upgrade to v7.0.2+ of superagent. We have fixed numerous issues with streams, form-data, attach(), filesystem errors not bubbling up (ENOENT on attach()), and all tests are now passing. See the releases tab for more information at .", + "version": "8.1.2", + "resolved": "https://registry.npmjs.org/superagent/-/superagent-8.1.2.tgz", + "integrity": "sha512-6WTxW1EB6yCxV5VFOIPQruWGHqc3yI7hEmZK6h+pyk69Lk/Ut7rLUY6W/ONF2MjBuGjvmMiIpsrVJ2vjrHlslA==", "dev": true, "dependencies": { - "component-emitter": "^1.2.0", - "cookiejar": "^2.1.0", - "debug": "^3.1.0", - "extend": "^3.0.0", - "form-data": "^2.3.1", - "formidable": "^1.2.0", - "methods": "^1.1.1", - "mime": "^1.4.1", - "qs": "^6.5.1", - "readable-stream": "^2.3.5" + "component-emitter": "^1.3.0", + "cookiejar": "^2.1.4", + "debug": "^4.3.4", + "fast-safe-stringify": "^2.1.1", + "form-data": "^4.0.0", + "formidable": "^2.1.2", + "methods": "^1.1.2", + "mime": "2.6.0", + "qs": "^6.11.0", + "semver": "^7.3.8" }, "engines": { - "node": ">= 4.0" + "node": ">=6.4.0 <13 || >=14" } }, "node_modules/superagent/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "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.1" + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "node_modules/superagent/node_modules/form-data": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", - "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", + "node_modules/superagent/node_modules/formidable": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/formidable/-/formidable-2.1.2.tgz", + "integrity": "sha512-CM3GuJ57US06mlpQ47YcunuUZ9jpm8Vx+P2CGt2j7HpgkKZO/DJYQ0Bobim8G6PFQmK5lOqOOdUXboU+h73A4g==", "dev": true, "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" + "dezalgo": "^1.0.4", + "hexoid": "^1.0.0", + "once": "^1.4.0", + "qs": "^6.11.0" }, - "engines": { - "node": ">= 0.12" + "funding": { + "url": "https://ko-fi.com/tunnckoCore/commissions" } }, - "node_modules/superagent/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/superagent/node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", "dev": true, "bin": { "mime": "cli.js" }, "engines": { - "node": ">=4" + "node": ">=4.0.0" } }, "node_modules/superagent/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==", - "dev": true - }, - "node_modules/superagent/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/superagent/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==", + "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/superagent/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==", + "node_modules/superagent/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": { - "safe-buffer": "~5.1.0" + "wrappy": "1" } }, "node_modules/supports-color": { @@ -15146,15 +15253,15 @@ } }, "node_modules/supports-hyperlinks": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz", - "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-3.0.0.tgz", + "integrity": "sha512-QBDPHyPQDRTy9ku4URNGY5Lah8PAaXs6tAAwp55sL5WCsSW7GIfdf6W5ixfziW+t7wh3GVvHyHHyQ1ESsoRvaA==", "dependencies": { "has-flag": "^4.0.0", "supports-color": "^7.0.0" }, "engines": { - "node": ">=8" + "node": ">=14.18" } }, "node_modules/supports-hyperlinks/node_modules/has-flag": { @@ -15180,6 +15287,7 @@ "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" }, @@ -15188,102 +15296,58 @@ } }, "node_modules/swagger-ui-dist": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/swagger-ui-dist/-/swagger-ui-dist-4.18.1.tgz", - "integrity": "sha512-n7AT4wzKIPpHy/BGflJOepGMrbY/7Cd5yVd9ptVczaJGAKScbVJrZxFbAE2ZSZa8KmqdQ0+pOs3/5mWY5tSMZQ==" + "version": "5.10.5", + "resolved": "https://registry.npmjs.org/swagger-ui-dist/-/swagger-ui-dist-5.10.5.tgz", + "integrity": "sha512-Uv8E7hV/nXALQKgW86X1i58gl1O6DFg+Uq54sDwhYqucBBxj/47dLNw872TNILNlOTuPA6dRvUMGQdmlpaX8qQ==" }, "node_modules/swagger-ui-express": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/swagger-ui-express/-/swagger-ui-express-4.6.2.tgz", - "integrity": "sha512-MHIOaq9JrTTB3ygUJD+08PbjM5Tt/q7x80yz9VTFIatw8j5uIWKcr90S0h5NLMzFEDC6+eVprtoeA5MDZXCUKQ==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/swagger-ui-express/-/swagger-ui-express-5.0.0.tgz", + "integrity": "sha512-tsU9tODVvhyfkNSvf03E6FAk+z+5cU3lXAzMy6Pv4av2Gt2xA0++fogwC4qo19XuFf6hdxevPuVCSKFuMHJhFA==", "dependencies": { - "swagger-ui-dist": ">=4.11.0" + "swagger-ui-dist": ">=5.0.0" }, "engines": { "node": ">= v0.10.32" }, "peerDependencies": { - "express": ">=4.0.0" - } - }, - "node_modules/symbol-observable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.0.1.tgz", - "integrity": "sha512-Kb3PrPYz4HanVF1LVGuAdW6LoVgIwjUYJGzFe7NDrBLCN4lsV/5J0MFurV+ygS4bRVwrCEt2c7MQ1R2a72oJDw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/table": { - "version": "5.4.6", - "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", - "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", - "dev": true, - "dependencies": { - "ajv": "^6.10.2", - "lodash": "^4.17.14", - "slice-ansi": "^2.1.0", - "string-width": "^3.0.0" - }, - "engines": { - "node": ">=6.0.0" + "express": ">=4.0.0 || >=5.0.0-beta" } }, "node_modules/table-layout": { - "version": "0.4.5", - "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-0.4.5.tgz", - "integrity": "sha512-zTvf0mcggrGeTe/2jJ6ECkJHAQPIYEwDoqsiqBjI24mvRmQbInK5jq33fyypaCBxX08hMkfmdOqj6haT33EqWw==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-3.0.2.tgz", + "integrity": "sha512-rpyNZYRw+/C+dYkcQ3Pr+rLxW4CfHpXjPDnG7lYhdRoUcZTUt+KEsX+94RGp/aVp/MQU35JCITv2T/beY4m+hw==", "dependencies": { - "array-back": "^2.0.0", - "deep-extend": "~0.6.0", - "lodash.padend": "^4.6.1", - "typical": "^2.6.1", - "wordwrapjs": "^3.0.0" + "@75lb/deep-merge": "^1.1.1", + "array-back": "^6.2.2", + "command-line-args": "^5.2.1", + "command-line-usage": "^7.0.0", + "stream-read-all": "^3.0.1", + "typical": "^7.1.1", + "wordwrapjs": "^5.1.0" + }, + "bin": { + "table-layout": "bin/cli.js" }, "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/table/node_modules/ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", - "dev": true, - "engines": { - "node": ">=6" + "node": ">=12.17" } }, - "node_modules/table/node_modules/emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "dev": true - }, - "node_modules/table/node_modules/string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "dependencies": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - }, + "node_modules/table-layout/node_modules/array-back": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/array-back/-/array-back-6.2.2.tgz", + "integrity": "sha512-gUAZ7HPyb4SJczXAMUXMGAvI976JoK3qEx9v1FTmeYuJj0IBiaKttG1ydtGKdkfqWkIkouke7nG8ufGy77+Cvw==", "engines": { - "node": ">=6" + "node": ">=12.17" } }, - "node_modules/table/node_modules/strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "dependencies": { - "ansi-regex": "^4.1.0" - }, + "node_modules/table-layout/node_modules/typical": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/typical/-/typical-7.1.1.tgz", + "integrity": "sha512-T+tKVNs6Wu7IWiAce5BgMd7OZfNYUndHwc5MknN+UHOudi7sGZzuHdCadllRuqJ3fPtgFtIH9+lt9qRv6lmpfA==", "engines": { - "node": ">=6" + "node": ">=12.17" } }, "node_modules/tar": { @@ -15333,48 +15397,47 @@ "dev": true }, "node_modules/temp-dir": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz", - "integrity": "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-3.0.0.tgz", + "integrity": "sha512-nHc6S/bwIilKHNRgK/3jlhDoIHcp45YgyiwcAk46Tr0LfEqGBVpmiAyuiuxeVE44m3mXnEeVhaipLOEWmH+Njw==", "engines": { - "node": ">=8" + "node": ">=14.16" } }, "node_modules/tempy": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/tempy/-/tempy-1.0.1.tgz", - "integrity": "sha512-biM9brNqxSc04Ee71hzFbryD11nX7VPhQQY32AdDmjFvodsRFz/3ufeoTZ6uYkRFfGo188tENcASNs3vTdsM0w==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/tempy/-/tempy-3.1.0.tgz", + "integrity": "sha512-7jDLIdD2Zp0bDe5r3D2qtkd1QOCacylBuL7oa4udvN6v2pqr4+LcCr67C8DR1zkpaZ8XosF5m1yQSabKAW6f2g==", "dependencies": { - "del": "^6.0.0", - "is-stream": "^2.0.0", - "temp-dir": "^2.0.0", - "type-fest": "^0.16.0", - "unique-string": "^2.0.0" + "is-stream": "^3.0.0", + "temp-dir": "^3.0.0", + "type-fest": "^2.12.2", + "unique-string": "^3.0.0" }, "engines": { - "node": ">=10" + "node": ">=14.16" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/tempy/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==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", "engines": { - "node": ">=8" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/tempy/node_modules/type-fest": { - "version": "0.16.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.16.0.tgz", - "integrity": "sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==", + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", + "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", "engines": { - "node": ">=10" + "node": ">=12.20" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -15394,24 +15457,27 @@ "node": ">=8" } }, - "node_modules/test-value": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/test-value/-/test-value-3.0.0.tgz", - "integrity": "sha512-sVACdAWcZkSU9x7AOmJo5TqE+GyNJknHaHsMrR6ZnhjVlVN9Yx6FjHrsKZ3BjIpPCT68zYesPWkakrNupwfOTQ==", + "node_modules/test-exclude/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": { - "array-back": "^2.0.0", - "typical": "^2.6.1" + "brace-expansion": "^1.1.7" }, "engines": { - "node": ">=4.0.0" + "node": "*" } }, "node_modules/text-extensions": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-1.9.0.tgz", - "integrity": "sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-2.4.0.tgz", + "integrity": "sha512-te/NtwBwfiNRLf9Ijqx3T0nlqZiQ2XrrtBvu+cLL8ZRrGkO0NHTug8MYFKyoSrv/sHTaSKfilUkizV6XhxMJ3g==", "engines": { - "node": ">=0.10" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/text-table": { @@ -15420,40 +15486,19 @@ "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", "dev": true }, + "node_modules/thread-stream": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/thread-stream/-/thread-stream-2.4.1.tgz", + "integrity": "sha512-d/Ex2iWd1whipbT681JmTINKw0ZwOUBZm7+Gjs64DHuX34mmw8vJL2bFAaNacaW72zYiTJxSHi5abUuOi5nsfg==", + "dependencies": { + "real-require": "^0.2.0" + } + }, "node_modules/through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==" }, - "node_modules/through2": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", - "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", - "dependencies": { - "readable-stream": "3" - } - }, - "node_modules/through2/node_modules/readable-stream": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.1.tgz", - "integrity": "sha512-+rQmrWMYGA90yenhTYsLWAsLsqVC8osOw6PKE1HDYiO0gdPeKe/xDHNzIAIn4C91YQ6oenEhfYqqc1883qHbjQ==", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/through2/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/timers-ext": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/timers-ext/-/timers-ext-0.1.7.tgz", @@ -15464,18 +15509,6 @@ "next-tick": "1" } }, - "node_modules/tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "dev": true, - "dependencies": { - "os-tmpdir": "~1.0.2" - }, - "engines": { - "node": ">=0.6.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", @@ -15509,20 +15542,6 @@ "resolved": "https://registry.npmjs.org/toposort-class/-/toposort-class-1.0.1.tgz", "integrity": "sha512-OsLcGGbYF3rMjPUf8oKktyvCiUxSbqMMS39m33MAjLTC1DVIH6x3WSt63/M77ihI09+Sdfk1AXvfhCEeUmC7mg==" }, - "node_modules/tough-cookie": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-3.0.1.tgz", - "integrity": "sha512-yQyJ0u4pZsv9D4clxO69OEjLWYw+jbgspjTue4lTQZLfV0c5l1VmK2y1JK8E9ahdpltPOaAThPcp5nKPUgSnsg==", - "dev": true, - "dependencies": { - "ip-regex": "^2.1.0", - "psl": "^1.1.28", - "punycode": "^2.1.1" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/tr46": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", @@ -15536,19 +15555,38 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/trim-newlines": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", - "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==", - "engines": { - "node": ">=8" + "node_modules/tsconfig-paths": { + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", + "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", + "dev": true, + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" } }, - "node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true + "node_modules/tsconfig-paths/node_modules/json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dev": true, + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/tsconfig-paths/node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "engines": { + "node": ">=4" + } }, "node_modules/tunnel-agent": { "version": "0.6.0", @@ -15573,12 +15611,12 @@ "dev": true }, "node_modules/type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", + "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.1.2" + "prelude-ls": "^1.2.1" }, "engines": { "node": ">= 0.8.0" @@ -15597,20 +15635,72 @@ "version": "0.8.1", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "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/typed-array-buffer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz", + "integrity": "sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz", + "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + }, "engines": { - "node": ">=8" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "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==", + "node_modules/typed-array-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz", + "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==", + "dev": true, "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" }, "engines": { - "node": ">= 0.6" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/typed-array-length": { @@ -15642,9 +15732,12 @@ } }, "node_modules/typical": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/typical/-/typical-2.6.1.tgz", - "integrity": "sha512-ofhi8kjIje6npGozTip9Fr8iecmYfEbS06i0JnIg+rh51KakryWF4+jX8lLKZVhy6N+ID45WYSFCxPOdTWCzNg==" + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/typical/-/typical-4.0.0.tgz", + "integrity": "sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw==", + "engines": { + "node": ">=8" + } }, "node_modules/uglify-js": { "version": "3.17.4", @@ -15659,15 +15752,66 @@ } }, "node_modules/umzug": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/umzug/-/umzug-2.2.0.tgz", - "integrity": "sha512-xZLW76ax70pND9bx3wqwb8zqkFGzZIK8dIHD9WdNy/CrNfjWcwQgQkGCuUqcuwEBvUm+g07z+qWvY+pxDmMEEw==", + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/umzug/-/umzug-3.5.0.tgz", + "integrity": "sha512-bL6JjH716l0kg7V2Acrw5UmUgeLxdAZv3drMhKrJCXxEfK/qyM+B5s3ai1BjG1NyEGeXTOkhFIUgkMFo6zqVBg==", + "dependencies": { + "@rushstack/ts-command-line": "^4.12.2", + "emittery": "^0.13.0", + "glob": "^8.0.3", + "pony-cause": "^2.1.4", + "type-fest": "^3.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/umzug/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/umzug/node_modules/glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", "dependencies": { - "babel-runtime": "^6.23.0", - "bluebird": "^3.5.3" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" }, "engines": { - "node": ">=6.0.0" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/umzug/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/umzug/node_modules/type-fest": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-3.13.1.tgz", + "integrity": "sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/unbox-primitive": { @@ -15686,15 +15830,28 @@ } }, "node_modules/underscore": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.1.tgz", - "integrity": "sha512-hzSoAVtJF+3ZtiFX0VgfFPHEDRm7Y/QPjGyNo4TVdnDTdft3tr8hEkD25a1jC+TjTuE7tkHGKkhwCgs9dgBB2g==" + "version": "1.13.6", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.6.tgz", + "integrity": "sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==" }, - "node_modules/uniq": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", - "integrity": "sha512-Gw+zz50YNKPDKXs+9d+aKAjVwpjNwqzvNpLigIruT4HA9lMZNdMqs9x07kKHB/L9WRzqp4+DlTU5s4wG2esdoA==", - "dev": true + "node_modules/unicode-emoji-modifier-base": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unicode-emoji-modifier-base/-/unicode-emoji-modifier-base-1.0.0.tgz", + "integrity": "sha512-yLSH4py7oFH3oG/9K+XWrz1pSi3dfUrWEnInbxMfArOfc1+33BlGPQtLsOYwvdMy11AwUBetYuaRxSPqgkq+8g==", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicorn-magic": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.1.0.tgz", + "integrity": "sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, "node_modules/unique-filename": { "version": "1.1.1", @@ -15715,27 +15872,31 @@ } }, "node_modules/unique-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", - "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-3.0.0.tgz", + "integrity": "sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ==", "dependencies": { - "crypto-random-string": "^2.0.0" + "crypto-random-string": "^4.0.0" }, "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/universal-user-agent": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.0.tgz", - "integrity": "sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w==" + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.1.tgz", + "integrity": "sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ==" }, "node_modules/universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", + "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", + "dev": true, "engines": { - "node": ">= 10.0.0" + "node": ">= 4.0.0" } }, "node_modules/unpipe": { @@ -15781,9 +15942,22 @@ } }, "node_modules/url-join": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.1.tgz", - "integrity": "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==" + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/url-join/-/url-join-5.0.0.tgz", + "integrity": "sha512-n2huDr9h9yzd6exQVnH/jU5mr+Pfx08LRXXZhkLLetAMESRj+anQsTAh940iMrIetKAmry9coFuZQ2jY8/p3WA==", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.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==", + "dev": true, + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } }, "node_modules/util": { "version": "0.10.4", @@ -15821,21 +15995,21 @@ } }, "node_modules/uvm": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/uvm/-/uvm-2.0.2.tgz", - "integrity": "sha512-Ra+aPiS5GXAbwXmyNExqdS42sTqmmx4XWEDF8uJlsTfOkKf9Rd9xNgav1Yckv4HfVEZg4iOFODWHFYuJ+9Fzfg==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/uvm/-/uvm-2.1.1.tgz", + "integrity": "sha512-BZ5w8adTpNNr+zczOBRpaX/hH8UPKAf7fmCnidrcsqt3bn8KT9bDIfuS7hgRU9RXgiN01su2pwysBONY6w8W5w==", "dev": true, "dependencies": { - "flatted": "3.1.1" + "flatted": "3.2.6" }, "engines": { "node": ">=10" } }, "node_modules/uvm/node_modules/flatted": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.1.1.tgz", - "integrity": "sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA==", + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.6.tgz", + "integrity": "sha512-0sQoMh9s0BYsm+12Huy/rkKxVu4R1+r96YX5cG44rHV0pQ6iC3Q+mkoMFaGWObMFYQxCVT+ssG1ksneA2MI9KQ==", "dev": true }, "node_modules/validate-npm-package-license": { @@ -15881,6 +16055,15 @@ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==" }, + "node_modules/version-guard": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/version-guard/-/version-guard-1.1.1.tgz", + "integrity": "sha512-MGQLX89UxmYHgDvcXyjBI0cbmoW+t/dANDppNPrno64rYr8nH4SHSuElQuSYdXGEs0mUzdQe1BY+FhVPNsAmJQ==", + "dev": true, + "engines": { + "node": ">=0.10.48" + } + }, "node_modules/webidl-conversions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", @@ -15896,14 +16079,17 @@ } }, "node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dependencies": { "isexe": "^2.0.0" }, "bin": { - "which": "bin/which" + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" } }, "node_modules/which-boxed-primitive": { @@ -15922,6 +16108,53 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/which-builtin-type": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.1.3.tgz", + "integrity": "sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==", + "dev": true, + "dependencies": { + "function.prototype.name": "^1.1.5", + "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.9" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-builtin-type/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + }, + "node_modules/which-collection": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz", + "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==", + "dev": true, + "dependencies": { + "is-map": "^2.0.1", + "is-set": "^2.0.1", + "is-weakmap": "^2.0.1", + "is-weakset": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/which-module": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", @@ -15929,17 +16162,16 @@ "dev": true }, "node_modules/which-typed-array": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz", - "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==", + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.13.tgz", + "integrity": "sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==", "dev": true, "dependencies": { "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", + "call-bind": "^1.0.4", "for-each": "^0.3.3", "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0", - "is-typed-array": "^1.1.10" + "has-tostringtag": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -15965,9 +16197,9 @@ } }, "node_modules/word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", "dev": true, "engines": { "node": ">=0.10.0" @@ -15979,21 +16211,17 @@ "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==" }, "node_modules/wordwrapjs": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-3.0.0.tgz", - "integrity": "sha512-mO8XtqyPvykVCsrwj5MlOVWvSnCdT+C+QVbm6blradR7JExAhbkZ7hZ9A+9NUtwzSqrlUo9a67ws0EiILrvRpw==", - "dependencies": { - "reduce-flatten": "^1.0.1", - "typical": "^2.6.1" - }, + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-5.1.0.tgz", + "integrity": "sha512-JNjcULU2e4KJwUNv6CHgI46UvDGitb6dGryHajXTDiLgg1/RiGoPSDw4kZfYnwGtEXf2ZMeIewDQgFGzkCB2Sg==", "engines": { - "node": ">=4.0.0" + "node": ">=12.17" } }, "node_modules/workerpool": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.0.tgz", - "integrity": "sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz", + "integrity": "sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==", "dev": true }, "node_modules/wrap-ansi": { @@ -16012,14 +16240,6 @@ "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/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", @@ -16050,55 +16270,11 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, - "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": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", - "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", - "dev": true, - "dependencies": { - "mkdirp": "^0.5.1" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/write-file-atomic": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", @@ -16111,12 +16287,13 @@ "typedarray-to-buffer": "^3.1.5" } }, - "node_modules/x-xss-protection": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/x-xss-protection/-/x-xss-protection-1.3.0.tgz", - "integrity": "sha512-kpyBI9TlVipZO4diReZMAHWtS0MMa/7Kgx8hwG/EuZLiA6sg4Ah/4TRdASHhRRN3boobzcYgFRUFSgHRge6Qhg==", + "node_modules/xdg-basedir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", + "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==", + "dev": true, "engines": { - "node": ">=4.0.0" + "node": ">=8" } }, "node_modules/xml": { @@ -16177,14 +16354,6 @@ "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", "dev": true }, - "node_modules/yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", - "engines": { - "node": ">= 6" - } - }, "node_modules/yargs": { "version": "16.2.0", "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", @@ -16258,46 +16427,6 @@ "node": ">=8" } }, - "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/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", From 9d4f5f95bdb9cec444db5bd63b05b3051a25dc1f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emirhan=20Durmu=C5=9F?= Date: Tue, 2 Jan 2024 17:03:08 +0300 Subject: [PATCH 007/178] workflow --- .github/workflows/ci.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 625cdd9fa..fda904366 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -145,7 +145,7 @@ jobs: env: PAT: ${{ secrets.PAT }} run: | - sed -i.back "s|PAT|${PAT}|g" ./path/to/.npmrc + sed -i.back "s|PAT|${PAT}|g" .npmrc - run: npm install From 79158213cb2ab771263e98ae52b28aac83761b35 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emirhan=20Durmu=C5=9F?= Date: Tue, 2 Jan 2024 17:13:11 +0300 Subject: [PATCH 008/178] pack --- package-lock.json | 16443 -------------------------------------------- 1 file changed, 16443 deletions(-) delete mode 100644 package-lock.json diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index 980ea504b..000000000 --- a/package-lock.json +++ /dev/null @@ -1,16443 +0,0 @@ -{ - "name": "iofogcontroller", - "version": "3.0.4", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "iofogcontroller", - "version": "3.0.4", - "hasInstallScript": true, - "license": "EPL-2.0", - "dependencies": { - "@iofog/ecn-viewer": "3.0.2", - "axios": "1.6.3", - "body-parser": "^1.20.2", - "child_process": "1.0.2", - "command-line-args": "5.2.1", - "command-line-usage": "7.0.1", - "concurrent-queue": "7.0.2", - "cookie-parser": "1.4.6", - "cors": "2.8.5", - "daemonize2": "0.4.2", - "ejs": "3.1.9", - "express": "4.18.2", - "formidable": "3.5.1", - "ftp": "0.3.10", - "helmet": "7.1.0", - "is-elevated": "4.0.0", - "js-yaml": "4.1.0", - "jsonschema": "1.4.1", - "minimatch": "9.0.3", - "moment": "2.30.1", - "moment-timezone": "0.5.44", - "morgan": "1.10.0", - "multer": "1.4.5-lts.1", - "nconf": "0.12.1", - "nodemailer": "6.9.8", - "nodemailer-smtp-transport": "2.7.4", - "os": "0.1.2", - "path": "0.12.7", - "pino": "8.17.2", - "pino-std-serializers": "6.2.2", - "portscanner": "2.2.0", - "qs": "6.11.2", - "request": "2.88.0", - "request-promise": "4.2.4", - "retry-as-promised": "7.0.4", - "semantic-release": "22.0.12", - "semver": "7.5.4", - "sequelize": "6.35.2", - "sqlite3": "^5.1.6", - "string-format": "2.0.0", - "swagger-ui-express": "^5.0.0", - "umzug": "3.5.0", - "underscore": "1.13.6", - "xss-clean": "0.1.1" - }, - "bin": { - "iofog-controller": "src/main.js" - }, - "devDependencies": { - "acorn": "8.11.3", - "bdd-lazy-var": "2.6.1", - "chai": "4.3.10", - "chai-as-promised": "7.1.1", - "chai-http": "4.4.0", - "eslint": "8.56.0", - "eslint-config-google": "0.14.0", - "mocha": "10.2.0", - "mocha-junit-reporter": "2.2.1", - "newman": "6.1.0", - "newman-reporter-junitfull": "1.1.1", - "nyc": "15.1.0", - "sequelize-cli": "6.6.2", - "sinon": "17.0.1", - "sinon-chai": "3.7.0", - "snyk": "^1.1266.0", - "standard": "17.1.0" - } - }, - "node_modules/@75lb/deep-merge": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@75lb/deep-merge/-/deep-merge-1.1.1.tgz", - "integrity": "sha512-xvgv6pkMGBA6GwdyJbNAnDmfAIR/DfWhrj9jgWh3TY7gRm3KO46x/GPjRg6wJ0nOepwqrNxFfojebh0Df4h4Tw==", - "dependencies": { - "lodash.assignwith": "^4.2.0", - "typical": "^7.1.1" - }, - "engines": { - "node": ">=12.17" - } - }, - "node_modules/@75lb/deep-merge/node_modules/typical": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/typical/-/typical-7.1.1.tgz", - "integrity": "sha512-T+tKVNs6Wu7IWiAce5BgMd7OZfNYUndHwc5MknN+UHOudi7sGZzuHdCadllRuqJ3fPtgFtIH9+lt9qRv6lmpfA==", - "engines": { - "node": ">=12.17" - } - }, - "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.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", - "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", - "dev": true, - "dependencies": { - "@jridgewell/gen-mapping": "^0.1.0", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", - "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", - "dependencies": { - "@babel/highlight": "^7.23.4", - "chalk": "^2.4.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/compat-data": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.21.0.tgz", - "integrity": "sha512-gMuZsmsgxk/ENC3O/fRw5QY8A9/uxQbbCEypnLIiYYc/qVJtEV7ouxC3EllIIwNzMqAQee5tanFabWsUOutS7g==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.21.0.tgz", - "integrity": "sha512-PuxUbxcW6ZYe656yL3EAhpy7qXKq0DmYsrJLpbB8XrsCP9Nm+XCg9XFMb5vIDliPD7+U/+M+QJlH17XOcB7eXA==", - "dev": true, - "dependencies": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.21.0", - "@babel/helper-compilation-targets": "^7.20.7", - "@babel/helper-module-transforms": "^7.21.0", - "@babel/helpers": "^7.21.0", - "@babel/parser": "^7.21.0", - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.0", - "@babel/types": "^7.21.0", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.2", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@babel/core/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/@babel/core/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/@babel/core/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/generator": { - "version": "7.21.1", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.21.1.tgz", - "integrity": "sha512-1lT45bAYlQhFn/BHivJs43AiW2rg3/UbLyShGfF3C0KmHvO5fSghWd5kBJy30kpRRucGzXStvnnCFniCR2kXAA==", - "dev": true, - "dependencies": { - "@babel/types": "^7.21.0", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", - "jsesc": "^2.5.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/generator/node_modules/@jridgewell/gen-mapping": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", - "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/@babel/helper-compilation-targets": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.7.tgz", - "integrity": "sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ==", - "dev": true, - "dependencies": { - "@babel/compat-data": "^7.20.5", - "@babel/helper-validator-option": "^7.18.6", - "browserslist": "^4.21.3", - "lru-cache": "^5.1.1", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/helper-environment-visitor": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", - "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-function-name": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz", - "integrity": "sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg==", - "dev": true, - "dependencies": { - "@babel/template": "^7.20.7", - "@babel/types": "^7.21.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-hoist-variables": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", - "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", - "dev": true, - "dependencies": { - "@babel/types": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", - "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", - "dev": true, - "dependencies": { - "@babel/types": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.21.2", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.21.2.tgz", - "integrity": "sha512-79yj2AR4U/Oqq/WOV7Lx6hUjau1Zfo4cI+JLAVYeMV5XIlbOhmjEk5ulbTc9fMpmlojzZHkUUxAiK+UKn+hNQQ==", - "dev": true, - "dependencies": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-simple-access": "^7.20.2", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/helper-validator-identifier": "^7.19.1", - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.2", - "@babel/types": "^7.21.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-simple-access": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz", - "integrity": "sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==", - "dev": true, - "dependencies": { - "@babel/types": "^7.20.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-split-export-declaration": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", - "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", - "dev": true, - "dependencies": { - "@babel/types": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.19.4", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", - "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-option": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.21.0.tgz", - "integrity": "sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.21.0.tgz", - "integrity": "sha512-XXve0CBtOW0pd7MRzzmoyuSj0e3SEzj8pgyFxnTT1NJZL38BD1MK7yYrm8yefRPIDvNNe14xR4FdbHwpInD4rA==", - "dev": true, - "dependencies": { - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.0", - "@babel/types": "^7.21.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", - "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", - "dependencies": { - "@babel/helper-validator-identifier": "^7.22.20", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/parser": { - "version": "7.21.2", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.21.2.tgz", - "integrity": "sha512-URpaIJQwEkEC2T9Kn+Ai6Xe/02iNaVCuT/PtoRz3GPVJVDpPd7mLo+VddTbhCRU9TXqW5mSrQfXZyi8kDKOVpQ==", - "dev": true, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/template": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz", - "integrity": "sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.18.6", - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.21.2", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.21.2.tgz", - "integrity": "sha512-ts5FFU/dSUPS13tv8XiEObDu9K+iagEKME9kAbaP7r0Y9KtZJZ+NGndDvWoRAYNpeWafbpFeki3q9QoMD6gxyw==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.21.1", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.21.0", - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.21.2", - "@babel/types": "^7.21.2", - "debug": "^4.1.0", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse/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/@babel/traverse/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/@babel/types": { - "version": "7.21.2", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.21.2.tgz", - "integrity": "sha512-3wRZSs7jiFaB8AjxiiD+VqN5DTG2iRvJGQ+qYFrs/654lg6kGTQWIOFjlBo5RaXuAZjBmP3+OQH4dmhqiiyYxw==", - "dev": true, - "dependencies": { - "@babel/helper-string-parser": "^7.19.4", - "@babel/helper-validator-identifier": "^7.19.1", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@colors/colors": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", - "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", - "optional": true, - "engines": { - "node": ">=0.1.90" - } - }, - "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.10.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", - "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", - "dev": true, - "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" - } - }, - "node_modules/@eslint/eslintrc": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", - "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", - "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/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/@eslint/eslintrc/node_modules/globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", - "dev": true, - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@eslint/eslintrc/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/@eslint/eslintrc/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/@eslint/eslintrc/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/@eslint/js": { - "version": "8.56.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.56.0.tgz", - "integrity": "sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/@faker-js/faker": { - "version": "5.5.3", - "resolved": "https://registry.npmjs.org/@faker-js/faker/-/faker-5.5.3.tgz", - "integrity": "sha512-R11tGE6yIFwqpaIqcfkcg7AICXzFg14+5h5v0TfF/9+RMDL6jhzCy/pxHVOfbALGdtVYdt6JdR21tuxEgl34dw==", - "dev": true - }, - "node_modules/@gar/promisify": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", - "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==", - "optional": true - }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.11.13", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.13.tgz", - "integrity": "sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==", - "dev": true, - "dependencies": { - "@humanwhocodes/object-schema": "^2.0.1", - "debug": "^4.1.1", - "minimatch": "^3.0.5" - }, - "engines": { - "node": ">=10.10.0" - } - }, - "node_modules/@humanwhocodes/config-array/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/@humanwhocodes/config-array/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/@humanwhocodes/config-array/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/@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": "2.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz", - "integrity": "sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==", - "dev": true - }, - "node_modules/@iofog/ecn-viewer": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@iofog/ecn-viewer/-/ecn-viewer-3.0.2.tgz", - "integrity": "sha512-Uq8BWdFc164bKn21biLKvRufr0XKaLyJklGiOLIIz6e0Xu2f5Xp0Bvc3Mi2DdgLdlO7f1xohE5Ms3cO1rGF1Vw==" - }, - "node_modules/@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", - "dev": true, - "dependencies": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "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/@jridgewell/gen-mapping": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", - "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", - "dev": true, - "dependencies": { - "@jridgewell/set-array": "^1.0.0", - "@jridgewell/sourcemap-codec": "^1.4.10" - }, - "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.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", - "dev": true - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.17", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", - "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", - "dev": true, - "dependencies": { - "@jridgewell/resolve-uri": "3.1.0", - "@jridgewell/sourcemap-codec": "1.4.14" - } - }, - "node_modules/@mapbox/node-pre-gyp": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.10.tgz", - "integrity": "sha512-4ySo4CjzStuprMwk35H5pPbkymjv1SF3jGLj6rAHp/xT/RF7TL7bd9CTm1xDY49K2qF7jmR/g7k+SkLETP6opA==", - "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/@mapbox/node-pre-gyp/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/@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/@npmcli/fs": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-1.1.1.tgz", - "integrity": "sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ==", - "optional": true, - "dependencies": { - "@gar/promisify": "^1.0.1", - "semver": "^7.3.5" - } - }, - "node_modules/@npmcli/move-file": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.1.2.tgz", - "integrity": "sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==", - "deprecated": "This functionality has been moved to @npmcli/fs", - "optional": true, - "dependencies": { - "mkdirp": "^1.0.4", - "rimraf": "^3.0.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@npmcli/move-file/node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "optional": true, - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@octokit/auth-token": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-4.0.0.tgz", - "integrity": "sha512-tY/msAuJo6ARbK6SPIxZrPBms3xPbfwBrulZe0Wtr/DIY9lje2HeV1uoebShn6mx7SjCHif6EjMvoREj+gZ+SA==", - "engines": { - "node": ">= 18" - } - }, - "node_modules/@octokit/core": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/@octokit/core/-/core-5.0.2.tgz", - "integrity": "sha512-cZUy1gUvd4vttMic7C0lwPed8IYXWYp8kHIMatyhY8t8n3Cpw2ILczkV5pGMPqef7v0bLo0pOHrEHarsau2Ydg==", - "dependencies": { - "@octokit/auth-token": "^4.0.0", - "@octokit/graphql": "^7.0.0", - "@octokit/request": "^8.0.2", - "@octokit/request-error": "^5.0.0", - "@octokit/types": "^12.0.0", - "before-after-hook": "^2.2.0", - "universal-user-agent": "^6.0.0" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/@octokit/endpoint": { - "version": "9.0.4", - "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-9.0.4.tgz", - "integrity": "sha512-DWPLtr1Kz3tv8L0UvXTDP1fNwM0S+z6EJpRcvH66orY6Eld4XBMCSYsaWp4xIm61jTWxK68BrR7ibO+vSDnZqw==", - "dependencies": { - "@octokit/types": "^12.0.0", - "universal-user-agent": "^6.0.0" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/@octokit/graphql": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-7.0.2.tgz", - "integrity": "sha512-OJ2iGMtj5Tg3s6RaXH22cJcxXRi7Y3EBqbHTBRq+PQAqfaS8f/236fUrWhfSn8P4jovyzqucxme7/vWSSZBX2Q==", - "dependencies": { - "@octokit/request": "^8.0.1", - "@octokit/types": "^12.0.0", - "universal-user-agent": "^6.0.0" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/@octokit/openapi-types": { - "version": "19.1.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-19.1.0.tgz", - "integrity": "sha512-6G+ywGClliGQwRsjvqVYpklIfa7oRPA0vyhPQG/1Feh+B+wU0vGH1JiJ5T25d3g1JZYBHzR2qefLi9x8Gt+cpw==" - }, - "node_modules/@octokit/plugin-paginate-rest": { - "version": "9.1.5", - "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-9.1.5.tgz", - "integrity": "sha512-WKTQXxK+bu49qzwv4qKbMMRXej1DU2gq017euWyKVudA6MldaSSQuxtz+vGbhxV4CjxpUxjZu6rM2wfc1FiWVg==", - "dependencies": { - "@octokit/types": "^12.4.0" - }, - "engines": { - "node": ">= 18" - }, - "peerDependencies": { - "@octokit/core": ">=5" - } - }, - "node_modules/@octokit/plugin-retry": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/@octokit/plugin-retry/-/plugin-retry-6.0.1.tgz", - "integrity": "sha512-SKs+Tz9oj0g4p28qkZwl/topGcb0k0qPNX/i7vBKmDsjoeqnVfFUquqrE/O9oJY7+oLzdCtkiWSXLpLjvl6uog==", - "dependencies": { - "@octokit/request-error": "^5.0.0", - "@octokit/types": "^12.0.0", - "bottleneck": "^2.15.3" - }, - "engines": { - "node": ">= 18" - }, - "peerDependencies": { - "@octokit/core": ">=5" - } - }, - "node_modules/@octokit/plugin-throttling": { - "version": "8.1.3", - "resolved": "https://registry.npmjs.org/@octokit/plugin-throttling/-/plugin-throttling-8.1.3.tgz", - "integrity": "sha512-pfyqaqpc0EXh5Cn4HX9lWYsZ4gGbjnSmUILeu4u2gnuM50K/wIk9s1Pxt3lVeVwekmITgN/nJdoh43Ka+vye8A==", - "dependencies": { - "@octokit/types": "^12.2.0", - "bottleneck": "^2.15.3" - }, - "engines": { - "node": ">= 18" - }, - "peerDependencies": { - "@octokit/core": "^5.0.0" - } - }, - "node_modules/@octokit/request": { - "version": "8.1.6", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-8.1.6.tgz", - "integrity": "sha512-YhPaGml3ncZC1NfXpP3WZ7iliL1ap6tLkAp6MvbK2fTTPytzVUyUesBBogcdMm86uRYO5rHaM1xIWxigWZ17MQ==", - "dependencies": { - "@octokit/endpoint": "^9.0.0", - "@octokit/request-error": "^5.0.0", - "@octokit/types": "^12.0.0", - "universal-user-agent": "^6.0.0" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/@octokit/request-error": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-5.0.1.tgz", - "integrity": "sha512-X7pnyTMV7MgtGmiXBwmO6M5kIPrntOXdyKZLigNfQWSEQzVxR4a4vo49vJjTWX70mPndj8KhfT4Dx+2Ng3vnBQ==", - "dependencies": { - "@octokit/types": "^12.0.0", - "deprecation": "^2.0.0", - "once": "^1.4.0" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/@octokit/request-error/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/@octokit/types": { - "version": "12.4.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-12.4.0.tgz", - "integrity": "sha512-FLWs/AvZllw/AGVs+nJ+ELCDZZJk+kY0zMen118xhL2zD0s1etIUHm1odgjP7epxYU1ln7SZxEUWYop5bhsdgQ==", - "dependencies": { - "@octokit/openapi-types": "^19.1.0" - } - }, - "node_modules/@pnpm/config.env-replace": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@pnpm/config.env-replace/-/config.env-replace-1.1.0.tgz", - "integrity": "sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==", - "engines": { - "node": ">=12.22.0" - } - }, - "node_modules/@pnpm/network.ca-file": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@pnpm/network.ca-file/-/network.ca-file-1.0.2.tgz", - "integrity": "sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==", - "dependencies": { - "graceful-fs": "4.2.10" - }, - "engines": { - "node": ">=12.22.0" - } - }, - "node_modules/@pnpm/npm-conf": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/@pnpm/npm-conf/-/npm-conf-2.2.2.tgz", - "integrity": "sha512-UA91GwWPhFExt3IizW6bOeY/pQ0BkuNwKjk9iQW9KqxluGCrg4VenZ0/L+2Y0+ZOtme72EVvg6v0zo3AMQRCeA==", - "dependencies": { - "@pnpm/config.env-replace": "^1.1.0", - "@pnpm/network.ca-file": "^1.0.1", - "config-chain": "^1.1.11" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@postman/form-data": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@postman/form-data/-/form-data-3.1.1.tgz", - "integrity": "sha512-vjh8Q2a8S6UCm/KKs31XFJqEEgmbjBmpPNVV2eVav6905wyFAwaUOBGA1NPBI4ERH9MMZc6w0umFgM6WbEPMdg==", - "dev": true, - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/@postman/tough-cookie": { - "version": "4.1.3-postman.1", - "resolved": "https://registry.npmjs.org/@postman/tough-cookie/-/tough-cookie-4.1.3-postman.1.tgz", - "integrity": "sha512-txpgUqZOnWYnUHZpHjkfb0IwVH4qJmyq77pPnJLlfhMtdCLMFTEeQHlzQiK906aaNCe4NEB5fGJHo9uzGbFMeA==", - "dev": true, - "dependencies": { - "psl": "^1.1.33", - "punycode": "^2.1.1", - "universalify": "^0.2.0", - "url-parse": "^1.5.3" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@postman/tunnel-agent": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/@postman/tunnel-agent/-/tunnel-agent-0.6.3.tgz", - "integrity": "sha512-k57fzmAZ2PJGxfOA4SGR05ejorHbVAa/84Hxh/2nAztjNXc4ZjOm9NUIk6/Z6LCrBvJZqjRZbN8e/nROVUPVdg==", - "dev": true, - "dependencies": { - "safe-buffer": "^5.0.1" - }, - "engines": { - "node": "*" - } - }, - "node_modules/@rushstack/ts-command-line": { - "version": "4.17.1", - "resolved": "https://registry.npmjs.org/@rushstack/ts-command-line/-/ts-command-line-4.17.1.tgz", - "integrity": "sha512-2jweO1O57BYP5qdBGl6apJLB+aRIn5ccIRTPDyULh0KMwVzFqWtw6IZWt1qtUoZD/pD2RNkIOosH6Cq45rIYeg==", - "dependencies": { - "@types/argparse": "1.0.38", - "argparse": "~1.0.9", - "colors": "~1.2.1", - "string-argv": "~0.3.1" - } - }, - "node_modules/@rushstack/ts-command-line/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/@rushstack/ts-command-line/node_modules/colors": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.2.5.tgz", - "integrity": "sha512-erNRLao/Y3Fv54qUa0LBB+//Uf3YwMUmdJinN20yMXm9zdKKqH9wt7R9IIVZ+K7ShzfpLV/Zg8+VyrBJYB4lpg==", - "engines": { - "node": ">=0.1.90" - } - }, - "node_modules/@rushstack/ts-command-line/node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" - }, - "node_modules/@semantic-release/commit-analyzer": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/@semantic-release/commit-analyzer/-/commit-analyzer-11.1.0.tgz", - "integrity": "sha512-cXNTbv3nXR2hlzHjAMgbuiQVtvWHTlwwISt60B+4NZv01y/QRY7p2HcJm8Eh2StzcTJoNnflvKjHH/cjFS7d5g==", - "dependencies": { - "conventional-changelog-angular": "^7.0.0", - "conventional-commits-filter": "^4.0.0", - "conventional-commits-parser": "^5.0.0", - "debug": "^4.0.0", - "import-from-esm": "^1.0.3", - "lodash-es": "^4.17.21", - "micromatch": "^4.0.2" - }, - "engines": { - "node": "^18.17 || >=20.6.1" - }, - "peerDependencies": { - "semantic-release": ">=20.1.0" - } - }, - "node_modules/@semantic-release/commit-analyzer/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/@semantic-release/commit-analyzer/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/@semantic-release/error": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@semantic-release/error/-/error-4.0.0.tgz", - "integrity": "sha512-mgdxrHTLOjOddRVYIYDo0fR3/v61GNN1YGkfbrjuIKg/uMgCd+Qzo3UAXJ+woLQQpos4pl5Esuw5A7AoNlzjUQ==", - "engines": { - "node": ">=18" - } - }, - "node_modules/@semantic-release/github": { - "version": "9.2.6", - "resolved": "https://registry.npmjs.org/@semantic-release/github/-/github-9.2.6.tgz", - "integrity": "sha512-shi+Lrf6exeNZF+sBhK+P011LSbhmIAoUEgEY6SsxF8irJ+J2stwI5jkyDQ+4gzYyDImzV6LCKdYB9FXnQRWKA==", - "dependencies": { - "@octokit/core": "^5.0.0", - "@octokit/plugin-paginate-rest": "^9.0.0", - "@octokit/plugin-retry": "^6.0.0", - "@octokit/plugin-throttling": "^8.0.0", - "@semantic-release/error": "^4.0.0", - "aggregate-error": "^5.0.0", - "debug": "^4.3.4", - "dir-glob": "^3.0.1", - "globby": "^14.0.0", - "http-proxy-agent": "^7.0.0", - "https-proxy-agent": "^7.0.0", - "issue-parser": "^6.0.0", - "lodash-es": "^4.17.21", - "mime": "^4.0.0", - "p-filter": "^4.0.0", - "url-join": "^5.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "semantic-release": ">=20.1.0" - } - }, - "node_modules/@semantic-release/github/node_modules/agent-base": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.0.tgz", - "integrity": "sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==", - "dependencies": { - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/@semantic-release/github/node_modules/aggregate-error": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-5.0.0.tgz", - "integrity": "sha512-gOsf2YwSlleG6IjRYG2A7k0HmBMEo6qVNk9Bp/EaLgAJT5ngH6PXbqa4ItvnEwCm/velL5jAnQgsHsWnjhGmvw==", - "dependencies": { - "clean-stack": "^5.2.0", - "indent-string": "^5.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@semantic-release/github/node_modules/clean-stack": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-5.2.0.tgz", - "integrity": "sha512-TyUIUJgdFnCISzG5zu3291TAsE77ddchd0bepon1VVQrKLGKFED4iXFEDQ24mIPdPBbyE16PK3F8MYE1CmcBEQ==", - "dependencies": { - "escape-string-regexp": "5.0.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@semantic-release/github/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/@semantic-release/github/node_modules/escape-string-regexp": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", - "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@semantic-release/github/node_modules/https-proxy-agent": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.2.tgz", - "integrity": "sha512-NmLNjm6ucYwtcUmL7JQC1ZQ57LmHP4lT15FQ8D61nak1rO6DH+fz5qNK2Ap5UN4ZapYICE3/0KodcLYSPsPbaA==", - "dependencies": { - "agent-base": "^7.0.2", - "debug": "4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/@semantic-release/github/node_modules/indent-string": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", - "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@semantic-release/github/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/@semantic-release/npm": { - "version": "11.0.2", - "resolved": "https://registry.npmjs.org/@semantic-release/npm/-/npm-11.0.2.tgz", - "integrity": "sha512-owtf3RjyPvRE63iUKZ5/xO4uqjRpVQDUB9+nnXj0xwfIeM9pRl+cG+zGDzdftR4m3f2s4Wyf3SexW+kF5DFtWA==", - "dependencies": { - "@semantic-release/error": "^4.0.0", - "aggregate-error": "^5.0.0", - "execa": "^8.0.0", - "fs-extra": "^11.0.0", - "lodash-es": "^4.17.21", - "nerf-dart": "^1.0.0", - "normalize-url": "^8.0.0", - "npm": "^10.0.0", - "rc": "^1.2.8", - "read-pkg": "^9.0.0", - "registry-auth-token": "^5.0.0", - "semver": "^7.1.2", - "tempy": "^3.0.0" - }, - "engines": { - "node": "^18.17 || >=20" - }, - "peerDependencies": { - "semantic-release": ">=20.1.0" - } - }, - "node_modules/@semantic-release/npm/node_modules/aggregate-error": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-5.0.0.tgz", - "integrity": "sha512-gOsf2YwSlleG6IjRYG2A7k0HmBMEo6qVNk9Bp/EaLgAJT5ngH6PXbqa4ItvnEwCm/velL5jAnQgsHsWnjhGmvw==", - "dependencies": { - "clean-stack": "^5.2.0", - "indent-string": "^5.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@semantic-release/npm/node_modules/clean-stack": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-5.2.0.tgz", - "integrity": "sha512-TyUIUJgdFnCISzG5zu3291TAsE77ddchd0bepon1VVQrKLGKFED4iXFEDQ24mIPdPBbyE16PK3F8MYE1CmcBEQ==", - "dependencies": { - "escape-string-regexp": "5.0.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@semantic-release/npm/node_modules/escape-string-regexp": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", - "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@semantic-release/npm/node_modules/execa": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", - "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^8.0.1", - "human-signals": "^5.0.0", - "is-stream": "^3.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^5.1.0", - "onetime": "^6.0.0", - "signal-exit": "^4.1.0", - "strip-final-newline": "^3.0.0" - }, - "engines": { - "node": ">=16.17" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/@semantic-release/npm/node_modules/get-stream": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", - "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@semantic-release/npm/node_modules/human-signals": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", - "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", - "engines": { - "node": ">=16.17.0" - } - }, - "node_modules/@semantic-release/npm/node_modules/indent-string": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", - "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@semantic-release/npm/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==", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@semantic-release/npm/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==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@semantic-release/npm/node_modules/npm-run-path": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.2.0.tgz", - "integrity": "sha512-W4/tgAXFqFA0iL7fk0+uQ3g7wkL8xJmx3XdK0VGb4cHW//eZTtKGvFBBoRKVTpY7n6ze4NL9ly7rgXcHufqXKg==", - "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/@semantic-release/npm/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==", - "dependencies": { - "mimic-fn": "^4.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@semantic-release/npm/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==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@semantic-release/npm/node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@semantic-release/npm/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==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@semantic-release/release-notes-generator": { - "version": "12.1.0", - "resolved": "https://registry.npmjs.org/@semantic-release/release-notes-generator/-/release-notes-generator-12.1.0.tgz", - "integrity": "sha512-g6M9AjUKAZUZnxaJZnouNBeDNTCUrJ5Ltj+VJ60gJeDaRRahcHsry9HW8yKrnKkKNkx5lbWiEP1FPMqVNQz8Kg==", - "dependencies": { - "conventional-changelog-angular": "^7.0.0", - "conventional-changelog-writer": "^7.0.0", - "conventional-commits-filter": "^4.0.0", - "conventional-commits-parser": "^5.0.0", - "debug": "^4.0.0", - "get-stream": "^7.0.0", - "import-from-esm": "^1.0.3", - "into-stream": "^7.0.0", - "lodash-es": "^4.17.21", - "read-pkg-up": "^11.0.0" - }, - "engines": { - "node": "^18.17 || >=20.6.1" - }, - "peerDependencies": { - "semantic-release": ">=20.1.0" - } - }, - "node_modules/@semantic-release/release-notes-generator/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/@semantic-release/release-notes-generator/node_modules/get-stream": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-7.0.1.tgz", - "integrity": "sha512-3M8C1EOFN6r8AMUhwUAACIoXZJEOufDU5+0gFFN5uNs6XYOralD2Pqkl7m046va6x77FwposWXbAhPPIOus7mQ==", - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@semantic-release/release-notes-generator/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/@sentry-internal/tracing": { - "version": "7.91.0", - "resolved": "https://registry.npmjs.org/@sentry-internal/tracing/-/tracing-7.91.0.tgz", - "integrity": "sha512-JH5y6gs6BS0its7WF2DhySu7nkhPDfZcdpAXldxzIlJpqFkuwQKLU5nkYJpiIyZz1NHYYtW5aum2bV2oCOdDRA==", - "dev": true, - "dependencies": { - "@sentry/core": "7.91.0", - "@sentry/types": "7.91.0", - "@sentry/utils": "7.91.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@sentry/core": { - "version": "7.91.0", - "resolved": "https://registry.npmjs.org/@sentry/core/-/core-7.91.0.tgz", - "integrity": "sha512-tu+gYq4JrTdrR+YSh5IVHF0fJi/Pi9y0HZ5H9HnYy+UMcXIotxf6hIEaC6ZKGeLWkGXffz2gKpQLe/g6vy/lPA==", - "dev": true, - "dependencies": { - "@sentry/types": "7.91.0", - "@sentry/utils": "7.91.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@sentry/node": { - "version": "7.91.0", - "resolved": "https://registry.npmjs.org/@sentry/node/-/node-7.91.0.tgz", - "integrity": "sha512-hTIfSQxD7L+AKIqyjoq8CWBRkEQrrMZmA3GSZgPI5JFWBHgO0HBo5TH/8TU81oEJh6kqqHAl2ObMhmcnaFqlzg==", - "dev": true, - "dependencies": { - "@sentry-internal/tracing": "7.91.0", - "@sentry/core": "7.91.0", - "@sentry/types": "7.91.0", - "@sentry/utils": "7.91.0", - "https-proxy-agent": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@sentry/types": { - "version": "7.91.0", - "resolved": "https://registry.npmjs.org/@sentry/types/-/types-7.91.0.tgz", - "integrity": "sha512-bcQnb7J3P3equbCUc+sPuHog2Y47yGD2sCkzmnZBjvBT0Z1B4f36fI/5WjyZhTjLSiOdg3F2otwvikbMjmBDew==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@sentry/utils": { - "version": "7.91.0", - "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-7.91.0.tgz", - "integrity": "sha512-fvxjrEbk6T6Otu++Ax9ntlQ0sGRiwSC179w68aC3u26Wr30FAIRKqHTCCdc2jyWk7Gd9uWRT/cq+g8NG/8BfSg==", - "dev": true, - "dependencies": { - "@sentry/types": "7.91.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@sindresorhus/is": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", - "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/is?sponsor=1" - } - }, - "node_modules/@sindresorhus/merge-streams": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-1.0.0.tgz", - "integrity": "sha512-rUV5WyJrJLoloD4NDN1V1+LDMDWOa4OTsT4yYJwQNpTU6FWxkxHpL7eu4w+DmiH8x/EAM1otkPE1+LaspIbplw==", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@sinonjs/commons": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.0.tgz", - "integrity": "sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA==", - "dev": true, - "dependencies": { - "type-detect": "4.0.8" - } - }, - "node_modules/@sinonjs/fake-timers": { - "version": "11.2.2", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-11.2.2.tgz", - "integrity": "sha512-G2piCSxQ7oWOxwGSAyFHfPIsyeJGXYtc6mFbnFA+kRXkiEnTl8c/8jul2S329iFBnDI9HGoeWWAZvuvOkZccgw==", - "dev": true, - "dependencies": { - "@sinonjs/commons": "^3.0.0" - } - }, - "node_modules/@sinonjs/samsam": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-8.0.0.tgz", - "integrity": "sha512-Bp8KUVlLp8ibJZrnvq2foVhP0IVX2CIprMJPK0vqGqgrDa0OHVKeZyBykqskkrdxV6yKBPmGasO8LVjAKR3Gew==", - "dev": true, - "dependencies": { - "@sinonjs/commons": "^2.0.0", - "lodash.get": "^4.4.2", - "type-detect": "^4.0.8" - } - }, - "node_modules/@sinonjs/samsam/node_modules/@sinonjs/commons": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-2.0.0.tgz", - "integrity": "sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==", - "dev": true, - "dependencies": { - "type-detect": "4.0.8" - } - }, - "node_modules/@sinonjs/text-encoding": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.2.tgz", - "integrity": "sha512-sXXKG+uL9IrKqViTtao2Ws6dy0znu9sOaP1di/jKGW1M6VssO8vlpXCQcpZ+jisQ1tTFAC5Jo/EOzFbggBagFQ==", - "dev": true - }, - "node_modules/@types/argparse": { - "version": "1.0.38", - "resolved": "https://registry.npmjs.org/@types/argparse/-/argparse-1.0.38.tgz", - "integrity": "sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA==" - }, - "node_modules/@types/chai": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.4.tgz", - "integrity": "sha512-KnRanxnpfpjUTqTCXslZSEdLfXExwgNxYPdiO2WGUj8+HDjFi8R3k5RVKPeSCzLjCcshCAtVO2QBbVuAV4kTnw==", - "dev": true - }, - "node_modules/@types/cookiejar": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@types/cookiejar/-/cookiejar-2.1.5.tgz", - "integrity": "sha512-he+DHOWReW0nghN24E1WUqM0efK4kI9oTqDm6XmK8ZPe2djZ90BSNdGnIyCLzCPw7/pogPlGbzI2wHGGmi4O/Q==", - "dev": true - }, - "node_modules/@types/debug": { - "version": "4.1.12", - "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", - "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", - "dependencies": { - "@types/ms": "*" - } - }, - "node_modules/@types/json5": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", - "dev": true - }, - "node_modules/@types/ms": { - "version": "0.7.34", - "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz", - "integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==" - }, - "node_modules/@types/node": { - "version": "18.14.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.14.2.tgz", - "integrity": "sha512-1uEQxww3DaghA0RxqHx0O0ppVlo43pJhepY51OxuQIKHpjbnYLA7vcdwioNPzIqmC2u3I/dmylcqjlh0e7AyUA==" - }, - "node_modules/@types/normalize-package-data": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz", - "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==" - }, - "node_modules/@types/superagent": { - "version": "4.1.13", - "resolved": "https://registry.npmjs.org/@types/superagent/-/superagent-4.1.13.tgz", - "integrity": "sha512-YIGelp3ZyMiH0/A09PMAORO0EBGlF5xIKfDpK74wdYvWUs2o96b5CItJcWPdH409b7SAXIIG6p8NdU/4U2Maww==", - "dev": true, - "dependencies": { - "@types/cookiejar": "*", - "@types/node": "*" - } - }, - "node_modules/@types/validator": { - "version": "13.11.7", - "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.11.7.tgz", - "integrity": "sha512-q0JomTsJ2I5Mv7dhHhQLGjMvX0JJm5dyZ1DXQySIUzU1UlwzB8bt+R6+LODUbz0UDIOvEzGc28tk27gBJw2N8Q==" - }, - "node_modules/@ungap/structured-clone": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", - "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", - "dev": true - }, - "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/abort-controller": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", - "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", - "dependencies": { - "event-target-shim": "^5.0.0" - }, - "engines": { - "node": ">=6.5" - } - }, - "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.11.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", - "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "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/afterward": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/afterward/-/afterward-2.0.0.tgz", - "integrity": "sha512-7n9Vkbb8cmMRKKSfe5qgyqX4Yjdaty0QP/+GXYawZK8Vcq+8E5FCmbWbwfCoiBnDoAY/edKLNg2TwgGcwdA+3Q==", - "dependencies": { - "define-error": "~1.0.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/agent-base/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/agent-base/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/agentkeepalive": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.2.1.tgz", - "integrity": "sha512-Zn4cw2NEqd+9fiSVWMscnjyQ1a8Yfoc5oBajLeo5w+YBHgDUcEBY2hS4YpTz6iN5f/2zQiktcuM6tS8x1p9dpA==", - "optional": true, - "dependencies": { - "debug": "^4.1.0", - "depd": "^1.1.2", - "humanize-ms": "^1.2.1" - }, - "engines": { - "node": ">= 8.0.0" - } - }, - "node_modules/agentkeepalive/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "optional": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/agentkeepalive/node_modules/depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", - "optional": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/agentkeepalive/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==", - "optional": true - }, - "node_modules/aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "devOptional": true, - "dependencies": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "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-colors": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", - "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/ansi-escapes": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-6.2.0.tgz", - "integrity": "sha512-kzRaCqXnpzWs+3z5ABPQiVke+iq0KXkHo8xiWV4RPTi5Yli0l97BEQuhXV1s7+aSU/fu1kUuxgS4MsQ0fRuygw==", - "dependencies": { - "type-fest": "^3.0.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ansi-escapes/node_modules/type-fest": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-3.13.1.tgz", - "integrity": "sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==", - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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": "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/ansicolors": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/ansicolors/-/ansicolors-0.3.2.tgz", - "integrity": "sha512-QXu7BPrP29VllRxH8GwB7x5iX5qWKAAMLqKQGWTeLWVlNHNOpVMJ91dsxQAIWXpjuW5wqvxu3Jd/nRjrJ+0pqg==" - }, - "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/append-field": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/append-field/-/append-field-1.0.0.tgz", - "integrity": "sha512-klpgFSWLW1ZEs8svjfb7g4qWY0YS5imI82dTg+QahUvJ8YqAY0P10Uk8tTyh9ZGuYEZEMaeJYCF5BFuX552hsw==" - }, - "node_modules/append-transform": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-2.0.0.tgz", - "integrity": "sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==", - "dev": true, - "dependencies": { - "default-require-extensions": "^3.0.0" - }, - "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/archy": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", - "integrity": "sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==", - "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==", - "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.1", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.1.tgz", - "integrity": "sha512-+rQmrWMYGA90yenhTYsLWAsLsqVC8osOw6PKE1HDYiO0gdPeKe/xDHNzIAIn4C91YQ6oenEhfYqqc1883qHbjQ==", - "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/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/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" - }, - "node_modules/argv-formatter": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/argv-formatter/-/argv-formatter-1.0.0.tgz", - "integrity": "sha512-F2+Hkm9xFaRg+GkaNnbwXNDV5O6pnCFEmqyhvfC/Ic5LbgOWjJh3L+mN/s91rxVL3znE7DYVpW0GJFT+4YBgWw==" - }, - "node_modules/array-back": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/array-back/-/array-back-3.1.0.tgz", - "integrity": "sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==", - "engines": { - "node": ">=6" - } - }, - "node_modules/array-buffer-byte-length": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", - "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "is-array-buffer": "^3.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array-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-ify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz", - "integrity": "sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==" - }, - "node_modules/array-includes": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.7.tgz", - "integrity": "sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1", - "is-string": "^1.0.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.findlastindex": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.3.tgz", - "integrity": "sha512-LzLoiOMAxvy+Gd3BAq3B7VeIgPdo+Q8hthvKtXybMvRV0jrXfJM/t8mw7nNlpEcVlVUnCnM2KSX4XU5HmpodOA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0", - "get-intrinsic": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.flat": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", - "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.flatmap": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", - "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.tosorted": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.2.tgz", - "integrity": "sha512-HuQCHOlk1Weat5jzStICBCd83NxiIMwqDg/dHEsoefabn/hJRj5pVdWcPUSpRrwhwxZOsQassMpgN/xRYFBMIg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0", - "get-intrinsic": "^1.2.1" - } - }, - "node_modules/arraybuffer.prototype.slice": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz", - "integrity": "sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==", - "dev": true, - "dependencies": { - "array-buffer-byte-length": "^1.0.0", - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1", - "is-array-buffer": "^3.0.2", - "is-shared-array-buffer": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/asap": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" - }, - "node_modules/asn1": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", - "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", - "dependencies": { - "safer-buffer": "~2.1.0" - } - }, - "node_modules/assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", - "engines": { - "node": ">=0.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": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz", - "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==" - }, - "node_modules/asynciterator.prototype": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/asynciterator.prototype/-/asynciterator.prototype-1.0.0.tgz", - "integrity": "sha512-wwHYEIS0Q80f5mosx3L/dfG5t5rjEa9Ft51GTaNt862EnpyGHpgz2RkZvLPp1oF5TnAiTohkEKVEu8pQPJI7Vg==", - "dev": true, - "dependencies": { - "has-symbols": "^1.0.3" - } - }, - "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/atomic-sleep": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/atomic-sleep/-/atomic-sleep-1.0.0.tgz", - "integrity": "sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==", - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/available-typed-arrays": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", - "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", - "engines": { - "node": "*" - } - }, - "node_modules/aws4": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz", - "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==" - }, - "node_modules/axios": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.3.tgz", - "integrity": "sha512-fWyNdeawGam70jXSVlKl+SUNVcL6j6W79CuSIPfi6HnDUmSCH6gyUys/HrqHeA/wU0Az41rRgean494d0Jb+ww==", - "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==", - "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/basic-auth": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", - "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", - "dependencies": { - "safe-buffer": "5.1.2" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/basic-auth/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/bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", - "dependencies": { - "tweetnacl": "^0.14.3" - } - }, - "node_modules/bdd-lazy-var": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/bdd-lazy-var/-/bdd-lazy-var-2.6.1.tgz", - "integrity": "sha512-X3ADwcFji/IHIrYJhTTpaiWhoOx4pl4whdAx1dmvdeUPsMUb7fVYFvf/Q33VEAEAVkEwi5rgNSZ0Y9oOVeQV+A==", - "dev": true, - "peerDependencies": { - "jasmine": ">=2", - "jasmine-core": ">=2", - "jest": ">=20", - "mocha": ">=2.3" - }, - "peerDependenciesMeta": { - "jasmine": { - "optional": true - }, - "jasmine-core": { - "optional": true - }, - "jest": { - "optional": true - }, - "mocha": { - "optional": true - } - } - }, - "node_modules/before-after-hook": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.3.tgz", - "integrity": "sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==" - }, - "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/bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" - }, - "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/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/boolean": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/boolean/-/boolean-3.2.0.tgz", - "integrity": "sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==", - "dev": true - }, - "node_modules/bottleneck": { - "version": "2.19.5", - "resolved": "https://registry.npmjs.org/bottleneck/-/bottleneck-2.19.5.tgz", - "integrity": "sha512-VHiNCbI1lKdl44tGrhNfU3lup0Tj/ZBMJB5/2ZbNXRCPuRCO7ed2mgcK4r17y+KB2EfuYuRaVlwNbAeaWGSpbw==" - }, - "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/brotli": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/brotli/-/brotli-1.3.3.tgz", - "integrity": "sha512-oTKjJdShmDuGW94SyyaoQvAjf30dZaHnjJ8uAF+u2/vGJkJbJPJAT1gDiOJP5v1Zb6f9KEyW/1HpuaWIXtGHPg==", - "dev": true, - "dependencies": { - "base64-js": "^1.1.2" - } - }, - "node_modules/browser-stdout": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", - "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", - "dev": true - }, - "node_modules/browserslist": { - "version": "4.21.5", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz", - "integrity": "sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - } - ], - "dependencies": { - "caniuse-lite": "^1.0.30001449", - "electron-to-chromium": "^1.4.284", - "node-releases": "^2.0.8", - "update-browserslist-db": "^1.0.10" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" - }, - "node_modules/builtins": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.0.1.tgz", - "integrity": "sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==", - "dev": true, - "dependencies": { - "semver": "^7.0.0" - } - }, - "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/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/cacache": { - "version": "15.3.0", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.3.0.tgz", - "integrity": "sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==", - "optional": true, - "dependencies": { - "@npmcli/fs": "^1.0.0", - "@npmcli/move-file": "^1.0.1", - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "glob": "^7.1.4", - "infer-owner": "^1.0.4", - "lru-cache": "^6.0.0", - "minipass": "^3.1.1", - "minipass-collect": "^1.0.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.2", - "mkdirp": "^1.0.3", - "p-map": "^4.0.0", - "promise-inflight": "^1.0.1", - "rimraf": "^3.0.2", - "ssri": "^8.0.1", - "tar": "^6.0.2", - "unique-filename": "^1.1.1" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/cacache/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==", - "optional": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/cacache/node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "optional": true, - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/cacache/node_modules/p-map": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", - "optional": true, - "dependencies": { - "aggregate-error": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cacache/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "optional": true - }, - "node_modules/caching-transform": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-4.0.0.tgz", - "integrity": "sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==", - "dev": true, - "dependencies": { - "hasha": "^5.0.0", - "make-dir": "^3.0.0", - "package-hash": "^4.0.0", - "write-file-atomic": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/call-bind": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz", - "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==", - "dependencies": { - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.1", - "set-function-length": "^1.1.1" - }, - "funding": { - "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==", - "engines": { - "node": ">=6" - } - }, - "node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001458", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001458.tgz", - "integrity": "sha512-lQ1VlUUq5q9ro9X+5gOEyH7i3vm+AYVT1WDCVB69XOZ17KZRhnZ9J0Sqz7wTHQaLBJccNCHq8/Ww5LlOIZbB0w==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - } - ] - }, - "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/cardinal": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/cardinal/-/cardinal-2.1.1.tgz", - "integrity": "sha512-JSr5eOgoEymtYHBjNWyjrMqet9Am2miJhlfKNdqLp6zoeAh0KN5dRAcxlecj5mAJrmQomgiOBj35xHLrFjqBpw==", - "dependencies": { - "ansicolors": "~0.3.2", - "redeyed": "~2.1.0" - }, - "bin": { - "cdl": "bin/cdl.js" - } - }, - "node_modules/caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" - }, - "node_modules/chai": { - "version": "4.3.10", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.10.tgz", - "integrity": "sha512-0UXG04VuVbruMUYbJ6JctvH0YnC/4q3/AkT18q4NaITo91CUm0liMS9VqzT9vZhVQ/1eqPanMWjBM+Juhfb/9g==", - "dev": true, - "dependencies": { - "assertion-error": "^1.1.0", - "check-error": "^1.0.3", - "deep-eql": "^4.1.3", - "get-func-name": "^2.0.2", - "loupe": "^2.3.6", - "pathval": "^1.1.1", - "type-detect": "^4.0.8" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/chai-as-promised": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/chai-as-promised/-/chai-as-promised-7.1.1.tgz", - "integrity": "sha512-azL6xMoi+uxu6z4rhWQ1jbdUhOMhis2PvscD/xjLqNMkv3BPPp2JyyuTHOrf9BOosGpNQ11v6BKv/g57RXbiaA==", - "dev": true, - "dependencies": { - "check-error": "^1.0.2" - }, - "peerDependencies": { - "chai": ">= 2.1.2 < 5" - } - }, - "node_modules/chai-http": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/chai-http/-/chai-http-4.4.0.tgz", - "integrity": "sha512-uswN3rZpawlRaa5NiDUHcDZ3v2dw5QgLyAwnQ2tnVNuP7CwIsOFuYJ0xR1WiR7ymD4roBnJIzOUep7w9jQMFJA==", - "dev": true, - "dependencies": { - "@types/chai": "4", - "@types/superagent": "4.1.13", - "charset": "^1.0.1", - "cookiejar": "^2.1.4", - "is-ip": "^2.0.0", - "methods": "^1.1.2", - "qs": "^6.11.2", - "superagent": "^8.0.9" - }, - "engines": { - "node": ">=10" - } - }, - "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/chalk-template": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/chalk-template/-/chalk-template-0.4.0.tgz", - "integrity": "sha512-/ghrgmhfY8RaSdeo43hNXxpoHAtxdbskUHjPpfqUWGttFgycUhYPGx3YZBCnUCvOa7Doivn1IZec3DEGFoMgLg==", - "dependencies": { - "chalk": "^4.1.2" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/chalk-template?sponsor=1" - } - }, - "node_modules/chalk-template/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/chalk-template/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-template/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/chalk-template/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/chalk-template/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-template/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/char-regex": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", - "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", - "engines": { - "node": ">=10" - } - }, - "node_modules/chardet": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-2.0.0.tgz", - "integrity": "sha512-xVgPpulCooDjY6zH4m9YW3jbkaBe3FKIAvF5sj5t7aBNsVl2ljIE+xwJ4iNgiDZHFQvNIpjdKdVOQvvk5ZfxbQ==", - "dev": true - }, - "node_modules/charenc": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", - "integrity": "sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/charset": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/charset/-/charset-1.0.1.tgz", - "integrity": "sha512-6dVyOOYjpfFcL1Y4qChrAoQLRHvj2ziyhcm0QJlhOcAhykL/k1kTUPbeo+87MNRTRdk2OIIsIXbuF3x2wi5EXg==", - "dev": true, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/check-error": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz", - "integrity": "sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==", - "dev": true, - "dependencies": { - "get-func-name": "^2.0.2" - }, - "engines": { - "node": "*" - } - }, - "node_modules/child_process": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/child_process/-/child_process-1.0.2.tgz", - "integrity": "sha512-Wmza/JzL0SiWz7kl6MhIKT5ceIlnFPJX+lwUGj7Clhy5MMldsSoJR0+uvRzOS5Kv45Mq7t1PoE8TsOA9bzvb6g==" - }, - "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/clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "devOptional": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/cli-color": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/cli-color/-/cli-color-2.0.3.tgz", - "integrity": "sha512-OkoZnxyC4ERN3zLzZaY9Emb7f/MhBOIpePv0Ycok0fJYT+Ouo00UBEIwsVsr0yoow++n5YWlSUgST9GKhNHiRQ==", - "dev": true, - "dependencies": { - "d": "^1.0.1", - "es5-ext": "^0.10.61", - "es6-iterator": "^2.0.3", - "memoizee": "^0.4.15", - "timers-ext": "^0.1.7" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/cli-progress": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/cli-progress/-/cli-progress-3.12.0.tgz", - "integrity": "sha512-tRkV3HJ1ASwm19THiiLIXLO7Im7wlTuKnvkYaTkyoAPefqjNg7W7DHKUlGRxy9vxDvbyCYQkQozvptuMkGCg8A==", - "dev": true, - "dependencies": { - "string-width": "^4.2.3" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/cli-table3": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.3.tgz", - "integrity": "sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==", - "dependencies": { - "string-width": "^4.2.0" - }, - "engines": { - "node": "10.* || >= 12.*" - }, - "optionalDependencies": { - "@colors/colors": "1.5.0" - } - }, - "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": "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/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/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/colors": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", - "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", - "dev": true, - "engines": { - "node": ">=0.1.90" - } - }, - "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/command-line-args": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-5.2.1.tgz", - "integrity": "sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg==", - "dependencies": { - "array-back": "^3.1.0", - "find-replace": "^3.0.0", - "lodash.camelcase": "^4.3.0", - "typical": "^4.0.0" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/command-line-usage": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-7.0.1.tgz", - "integrity": "sha512-NCyznE//MuTjwi3y84QVUGEOT+P5oto1e1Pk/jFPVdPPfsG03qpTIl3yw6etR+v73d0lXsoojRpvbru2sqePxQ==", - "dependencies": { - "array-back": "^6.2.2", - "chalk-template": "^0.4.0", - "table-layout": "^3.0.0", - "typical": "^7.1.1" - }, - "engines": { - "node": ">=12.20.0" - } - }, - "node_modules/command-line-usage/node_modules/array-back": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/array-back/-/array-back-6.2.2.tgz", - "integrity": "sha512-gUAZ7HPyb4SJczXAMUXMGAvI976JoK3qEx9v1FTmeYuJj0IBiaKttG1ydtGKdkfqWkIkouke7nG8ufGy77+Cvw==", - "engines": { - "node": ">=12.17" - } - }, - "node_modules/command-line-usage/node_modules/typical": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/typical/-/typical-7.1.1.tgz", - "integrity": "sha512-T+tKVNs6Wu7IWiAce5BgMd7OZfNYUndHwc5MknN+UHOudi7sGZzuHdCadllRuqJ3fPtgFtIH9+lt9qRv6lmpfA==", - "engines": { - "node": ">=12.17" - } - }, - "node_modules/commander": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz", - "integrity": "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==", - "dev": true, - "engines": { - "node": ">=16" - } - }, - "node_modules/commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", - "dev": true - }, - "node_modules/compare-func": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-2.0.0.tgz", - "integrity": "sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==", - "dependencies": { - "array-ify": "^1.0.0", - "dot-prop": "^5.1.0" - } - }, - "node_modules/component-emitter": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.1.tgz", - "integrity": "sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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/concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "engines": [ - "node >= 0.8" - ], - "dependencies": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - } - }, - "node_modules/concat-stream/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/concat-stream/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/concat-stream/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/concat-stream/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/concurrent-queue": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/concurrent-queue/-/concurrent-queue-7.0.2.tgz", - "integrity": "sha512-icXDqc0JBdcQ3ubXiXcqVhuFeRrec39zVD2X5z7FKwwj0pImnfLWtAhGyX4CcBDD+YoqLesClOeRss+pZnm6/Q==", - "dependencies": { - "afterward": "~2.0.0", - "define-error": "~1.0.0", - "eventuate": "~4.0.0", - "object-assign": "~4.0.1", - "on-error": "~2.1.0", - "once": "~1.3.2", - "promise-polyfill": "~2.1.0" - } - }, - "node_modules/config-chain": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", - "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", - "dependencies": { - "ini": "^1.3.4", - "proto-list": "~1.2.1" - } - }, - "node_modules/config-chain/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/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/conventional-changelog-angular": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-7.0.0.tgz", - "integrity": "sha512-ROjNchA9LgfNMTTFSIWPzebCwOGFdgkEq45EnvvrmSLvCtAw0HSmrCs7/ty+wAeYUZyNay0YMUNYFTRL72PkBQ==", - "dependencies": { - "compare-func": "^2.0.0" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/conventional-changelog-writer": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-7.0.1.tgz", - "integrity": "sha512-Uo+R9neH3r/foIvQ0MKcsXkX642hdm9odUp7TqgFS7BsalTcjzRlIfWZrZR1gbxOozKucaKt5KAbjW8J8xRSmA==", - "dependencies": { - "conventional-commits-filter": "^4.0.0", - "handlebars": "^4.7.7", - "json-stringify-safe": "^5.0.1", - "meow": "^12.0.1", - "semver": "^7.5.2", - "split2": "^4.0.0" - }, - "bin": { - "conventional-changelog-writer": "cli.mjs" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/conventional-commits-filter": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-4.0.0.tgz", - "integrity": "sha512-rnpnibcSOdFcdclpFwWa+pPlZJhXE7l+XK04zxhbWrhgpR96h33QLz8hITTXbcYICxVr3HZFtbtUAQ+4LdBo9A==", - "engines": { - "node": ">=16" - } - }, - "node_modules/conventional-commits-parser": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-5.0.0.tgz", - "integrity": "sha512-ZPMl0ZJbw74iS9LuX9YIAiW8pfM5p3yh2o/NbXHbkFuZzY5jvdi5jFycEOkmBW5H5I7nA+D6f3UcsCLP2vvSEA==", - "dependencies": { - "is-text-path": "^2.0.0", - "JSONStream": "^1.3.5", - "meow": "^12.0.1", - "split2": "^4.0.0" - }, - "bin": { - "conventional-commits-parser": "cli.mjs" - }, - "engines": { - "node": ">=16" - } - }, - "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.4.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", - "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie-parser": { - "version": "1.4.6", - "resolved": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.4.6.tgz", - "integrity": "sha512-z3IzaNjdwUC2olLIB5/ITd0/setiaFMLYiZJle7xg5Fe9KWAceil7xszYfHHBtDFYLSgJduS2Ty0P1uJdPDJeA==", - "dependencies": { - "cookie": "0.4.1", - "cookie-signature": "1.0.6" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "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/cookiejar": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.4.tgz", - "integrity": "sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==", - "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/cors": { - "version": "2.8.5", - "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", - "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", - "dependencies": { - "object-assign": "^4", - "vary": "^1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/cosmiconfig": { - "version": "8.3.6", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", - "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", - "dependencies": { - "import-fresh": "^3.3.0", - "js-yaml": "^4.1.0", - "parse-json": "^5.2.0", - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/d-fischer" - }, - "peerDependencies": { - "typescript": ">=4.9.5" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": 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==", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/crypt": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz", - "integrity": "sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/crypto-random-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-4.0.0.tgz", - "integrity": "sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==", - "dependencies": { - "type-fest": "^1.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/crypto-random-string/node_modules/type-fest": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", - "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/csv-parse": { - "version": "4.16.3", - "resolved": "https://registry.npmjs.org/csv-parse/-/csv-parse-4.16.3.tgz", - "integrity": "sha512-cO1I/zmz4w2dcKHVvpCr7JVRu8/FymG5OEpmvsZYlccYolPBLoVGKUHgNoc4ZGkFeFlWGEDmMyBM+TTqRdW/wg==", - "dev": true - }, - "node_modules/d": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", - "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", - "dev": true, - "dependencies": { - "es5-ext": "^0.10.50", - "type": "^1.0.1" - } - }, - "node_modules/daemonize2": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/daemonize2/-/daemonize2-0.4.2.tgz", - "integrity": "sha512-dzB3qdxvcJ2AWyESI8xv90qZ4wZt4P+lvQUT1sVKcrbEKSvBk/8zkDlZvMyaWmoKe7DXLGu00z59b7K9gkzbqQ==", - "engines": { - "node": ">0.8.x" - } - }, - "node_modules/dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", - "dependencies": { - "assert-plus": "^1.0.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "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/decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "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==", - "engines": { - "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/default-require-extensions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-3.0.1.tgz", - "integrity": "sha512-eXTJmRbm2TIt9MgWTsOH1wEuhew6XGZcMeGKCtLedIg/NCsg1iBePXkceTdK4Fii7pzmN9tGsZhKzZ4h7O/fxw==", - "dev": true, - "dependencies": { - "strip-bom": "^4.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/define-data-property": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", - "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", - "dependencies": { - "get-intrinsic": "^1.2.1", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/define-error": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-error/-/define-error-1.0.0.tgz", - "integrity": "sha512-HLdUb9mNENZ/tjnZGlITfOnx7wSM7a6e+WEDyhKSrsN/g5dJUS6kepG6qJApRLAdjRofQ2W8R3yrtI6GeyGGVg==", - "dependencies": { - "capture-stack-trace": "~1.0.0" - } - }, - "node_modules/define-properties": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", - "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", - "dev": true, - "dependencies": { - "define-data-property": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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/deprecation": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz", - "integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==" - }, - "node_modules/des.js": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.1.0.tgz", - "integrity": "sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg==", - "dev": true, - "dependencies": { - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" - } - }, - "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/detect-node": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", - "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", - "dev": true - }, - "node_modules/dezalgo": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.4.tgz", - "integrity": "sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==", - "dependencies": { - "asap": "^2.0.0", - "wrappy": "1" - } - }, - "node_modules/diff": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", - "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", - "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/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/dot-prop": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", - "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", - "dependencies": { - "is-obj": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/dottie": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/dottie/-/dottie-2.0.6.tgz", - "integrity": "sha512-iGCHkfUc5kFekGiqhe8B/mdaurD+lakO9txNnTvKtA6PISrw86LgqHvRzWYPyoE2Ph5aMIrCw9/uko6XHTKCwA==" - }, - "node_modules/duplexer2": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", - "integrity": "sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==", - "dependencies": { - "readable-stream": "^2.0.2" - } - }, - "node_modules/duplexer2/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/duplexer2/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/duplexer2/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/duplexer2/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/ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", - "dependencies": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, - "node_modules/editorconfig": { - "version": "0.15.3", - "resolved": "https://registry.npmjs.org/editorconfig/-/editorconfig-0.15.3.tgz", - "integrity": "sha512-M9wIMFx96vq0R4F+gRpY3o2exzb8hEj/n9S8unZtHSvYjibBp/iMufSzvmOcV/laG0ZtuTVGtiJggPOSW2r93g==", - "dev": true, - "dependencies": { - "commander": "^2.19.0", - "lru-cache": "^4.1.5", - "semver": "^5.6.0", - "sigmund": "^1.0.1" - }, - "bin": { - "editorconfig": "bin/editorconfig" - } - }, - "node_modules/editorconfig/node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true - }, - "node_modules/editorconfig/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==", - "dev": true, - "dependencies": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - }, - "node_modules/editorconfig/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/editorconfig/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==", - "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/ejs": { - "version": "3.1.9", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.9.tgz", - "integrity": "sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ==", - "dependencies": { - "jake": "^10.8.5" - }, - "bin": { - "ejs": "bin/cli.js" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/electron-to-chromium": { - "version": "1.4.313", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.313.tgz", - "integrity": "sha512-QckB9OVqr2oybjIrbMI99uF+b9+iTja5weFe0ePbqLb5BHqXOJUO1SG6kDj/1WtWPRIBr51N153AEq8m7HuIaA==", - "dev": true - }, - "node_modules/emittery": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", - "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sindresorhus/emittery?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/emojilib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/emojilib/-/emojilib-2.4.0.tgz", - "integrity": "sha512-5U0rVMU5Y2n2+ykNLQqMoqklN9ICBT/KsvC1Gz6vqHbz2AXXGkG+Pm5rMWk/8Vjrr/mY9985Hi8DYzn1F09Nyw==" - }, - "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/encoding": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", - "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", - "optional": true, - "dependencies": { - "iconv-lite": "^0.6.2" - } - }, - "node_modules/encoding/node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "optional": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/env-ci": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/env-ci/-/env-ci-10.0.0.tgz", - "integrity": "sha512-U4xcd/utDYFgMh0yWj07R1H6L5fwhVbmxBCpnL0DbVSDZVnsC82HONw0wxtxNkIAcua3KtbomQvIk5xFZGAQJw==", - "dependencies": { - "execa": "^8.0.0", - "java-properties": "^1.0.2" - }, - "engines": { - "node": "^18.17 || >=20.6.1" - } - }, - "node_modules/env-ci/node_modules/execa": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", - "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^8.0.1", - "human-signals": "^5.0.0", - "is-stream": "^3.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^5.1.0", - "onetime": "^6.0.0", - "signal-exit": "^4.1.0", - "strip-final-newline": "^3.0.0" - }, - "engines": { - "node": ">=16.17" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/env-ci/node_modules/get-stream": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", - "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/env-ci/node_modules/human-signals": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", - "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", - "engines": { - "node": ">=16.17.0" - } - }, - "node_modules/env-ci/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==", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/env-ci/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==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/env-ci/node_modules/npm-run-path": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.2.0.tgz", - "integrity": "sha512-W4/tgAXFqFA0iL7fk0+uQ3g7wkL8xJmx3XdK0VGb4cHW//eZTtKGvFBBoRKVTpY7n6ze4NL9ly7rgXcHufqXKg==", - "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/env-ci/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==", - "dependencies": { - "mimic-fn": "^4.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/env-ci/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==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/env-ci/node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/env-ci/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==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/env-paths": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", - "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", - "optional": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/err-code": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", - "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", - "optional": true - }, - "node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, - "node_modules/es-abstract": { - "version": "1.22.3", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.3.tgz", - "integrity": "sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA==", - "dev": true, - "dependencies": { - "array-buffer-byte-length": "^1.0.0", - "arraybuffer.prototype.slice": "^1.0.2", - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.5", - "es-set-tostringtag": "^2.0.1", - "es-to-primitive": "^1.2.1", - "function.prototype.name": "^1.1.6", - "get-intrinsic": "^1.2.2", - "get-symbol-description": "^1.0.0", - "globalthis": "^1.0.3", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0", - "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.13.1", - "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.5.1", - "safe-array-concat": "^1.0.1", - "safe-regex-test": "^1.0.0", - "string.prototype.trim": "^1.2.8", - "string.prototype.trimend": "^1.0.7", - "string.prototype.trimstart": "^1.0.7", - "typed-array-buffer": "^1.0.0", - "typed-array-byte-length": "^1.0.0", - "typed-array-byte-offset": "^1.0.0", - "typed-array-length": "^1.0.4", - "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.13" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es-iterator-helpers": { - "version": "1.0.15", - "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.15.tgz", - "integrity": "sha512-GhoY8uYqd6iwUl2kgjTm4CZAf6oo5mHK7BPqx3rKgx893YSsy0LGHV6gfqqQvZt/8xM8xeOnfXBCfqclMKkJ5g==", - "dev": true, - "dependencies": { - "asynciterator.prototype": "^1.0.0", - "call-bind": "^1.0.2", - "define-properties": "^1.2.1", - "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.2", - "safe-array-concat": "^1.0.1" - } - }, - "node_modules/es-set-tostringtag": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.2.tgz", - "integrity": "sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.2.2", - "has-tostringtag": "^1.0.0", - "hasown": "^2.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-shim-unscopables": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", - "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", - "dev": true, - "dependencies": { - "hasown": "^2.0.0" - } - }, - "node_modules/es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, - "dependencies": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es5-ext": { - "version": "0.10.62", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.62.tgz", - "integrity": "sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==", - "dev": true, - "hasInstallScript": true, - "dependencies": { - "es6-iterator": "^2.0.3", - "es6-symbol": "^3.1.3", - "next-tick": "^1.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/es6-error": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", - "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", - "dev": true - }, - "node_modules/es6-iterator": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", - "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==", - "dev": true, - "dependencies": { - "d": "1", - "es5-ext": "^0.10.35", - "es6-symbol": "^3.1.1" - } - }, - "node_modules/es6-symbol": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", - "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", - "dev": true, - "dependencies": { - "d": "^1.0.1", - "ext": "^1.1.2" - } - }, - "node_modules/es6-weak-map": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.3.tgz", - "integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==", - "dev": true, - "dependencies": { - "d": "1", - "es5-ext": "^0.10.46", - "es6-iterator": "^2.0.3", - "es6-symbol": "^3.1.1" - } - }, - "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/eslint": { - "version": "8.56.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.56.0.tgz", - "integrity": "sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==", - "dev": true, - "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.4", - "@eslint/js": "8.56.0", - "@humanwhocodes/config-array": "^0.11.13", - "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "@ungap/structured-clone": "^1.2.0", - "ajv": "^6.12.4", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.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-google": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/eslint-config-google/-/eslint-config-google-0.14.0.tgz", - "integrity": "sha512-WsbX4WbjuMvTdeVL6+J3rK1RGhCTqjsFjX7UMSMgZiyxxaNLkoJENbrGExzERFeoTpGw3F3FypTiWAP9ZXzkEw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - }, - "peerDependencies": { - "eslint": ">=5.16.0" - } - }, - "node_modules/eslint-config-standard": { - "version": "17.1.0", - "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-17.1.0.tgz", - "integrity": "sha512-IwHwmaBNtDK4zDHQukFDW5u/aTb8+meQWZvNFWkiGmbWjD6bqyuSSBxxXKkCftCUzc1zwCH2m/baCNDLGmuO5Q==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "eslint": "^8.0.1", - "eslint-plugin-import": "^2.25.2", - "eslint-plugin-n": "^15.0.0 || ^16.0.0 ", - "eslint-plugin-promise": "^6.0.0" - } - }, - "node_modules/eslint-config-standard-jsx": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/eslint-config-standard-jsx/-/eslint-config-standard-jsx-11.0.0.tgz", - "integrity": "sha512-+1EV/R0JxEK1L0NGolAr8Iktm3Rgotx3BKwgaX+eAuSX8D952LULKtjgZD3F+e6SvibONnhLwoTi9DPxN5LvvQ==", - "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" - } - ], - "peerDependencies": { - "eslint": "^8.8.0", - "eslint-plugin-react": "^7.28.0" - } - }, - "node_modules/eslint-import-resolver-node": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", - "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", - "dev": true, - "dependencies": { - "debug": "^3.2.7", - "is-core-module": "^2.13.0", - "resolve": "^1.22.4" - } - }, - "node_modules/eslint-import-resolver-node/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/eslint-import-resolver-node/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==", - "dev": true - }, - "node_modules/eslint-import-resolver-node/node_modules/resolve": { - "version": "1.22.8", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", - "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", - "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/eslint-module-utils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz", - "integrity": "sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==", - "dev": true, - "dependencies": { - "debug": "^3.2.7" - }, - "engines": { - "node": ">=4" - }, - "peerDependenciesMeta": { - "eslint": { - "optional": true - } - } - }, - "node_modules/eslint-module-utils/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/eslint-module-utils/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==", - "dev": true - }, - "node_modules/eslint-plugin-es": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-4.1.0.tgz", - "integrity": "sha512-GILhQTnjYE2WorX5Jyi5i4dz5ALWxBIdQECVQavL6s7cI76IZTDWleTHkxz/QT3kvcs2QlGHvKLYsSlPOlPXnQ==", - "dev": true, - "dependencies": { - "eslint-utils": "^2.0.0", - "regexpp": "^3.0.0" - }, - "engines": { - "node": ">=8.10.0" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - }, - "peerDependencies": { - "eslint": ">=4.19.1" - } - }, - "node_modules/eslint-plugin-es/node_modules/eslint-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", - "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", - "dev": true, - "dependencies": { - "eslint-visitor-keys": "^1.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - } - }, - "node_modules/eslint-plugin-es/node_modules/eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/eslint-plugin-import": { - "version": "2.29.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz", - "integrity": "sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==", - "dev": true, - "dependencies": { - "array-includes": "^3.1.7", - "array.prototype.findlastindex": "^1.2.3", - "array.prototype.flat": "^1.3.2", - "array.prototype.flatmap": "^1.3.2", - "debug": "^3.2.7", - "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.9", - "eslint-module-utils": "^2.8.0", - "hasown": "^2.0.0", - "is-core-module": "^2.13.1", - "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.15.0" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" - } - }, - "node_modules/eslint-plugin-import/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/eslint-plugin-import/node_modules/doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dev": true, - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/eslint-plugin-import/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/eslint-plugin-import/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==", - "dev": true - }, - "node_modules/eslint-plugin-import/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/eslint-plugin-n": { - "version": "15.7.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-15.7.0.tgz", - "integrity": "sha512-jDex9s7D/Qial8AGVIHq4W7NswpUD5DPDL2RH8Lzd9EloWUuvUkHfv4FRLMipH5q2UtyurorBkPeNi1wVWNh3Q==", - "dev": true, - "dependencies": { - "builtins": "^5.0.1", - "eslint-plugin-es": "^4.1.0", - "eslint-utils": "^3.0.0", - "ignore": "^5.1.1", - "is-core-module": "^2.11.0", - "minimatch": "^3.1.2", - "resolve": "^1.22.1", - "semver": "^7.3.8" - }, - "engines": { - "node": ">=12.22.0" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - }, - "peerDependencies": { - "eslint": ">=7.0.0" - } - }, - "node_modules/eslint-plugin-n/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/eslint-plugin-promise": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-6.1.1.tgz", - "integrity": "sha512-tjqWDwVZQo7UIPMeDReOpUgHCmCiH+ePnVT+5zVapL0uuHnegBUs2smM13CzOs2Xb5+MHMRFTs9v24yjba4Oig==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" - } - }, - "node_modules/eslint-plugin-react": { - "version": "7.33.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.33.2.tgz", - "integrity": "sha512-73QQMKALArI8/7xGLNI/3LylrEYrlKZSb5C9+q3OtOewTnMQi5cT+aE9E41sLCmli3I9PGGmD1yiZydyo4FEPw==", - "dev": true, - "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.12", - "estraverse": "^5.3.0", - "jsx-ast-utils": "^2.4.1 || ^3.0.0", - "minimatch": "^3.1.2", - "object.entries": "^1.1.6", - "object.fromentries": "^2.0.6", - "object.hasown": "^1.1.2", - "object.values": "^1.1.6", - "prop-types": "^15.8.1", - "resolve": "^2.0.0-next.4", - "semver": "^6.3.1", - "string.prototype.matchall": "^4.0.8" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" - } - }, - "node_modules/eslint-plugin-react/node_modules/doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dev": true, - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/eslint-plugin-react/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/eslint-plugin-react/node_modules/resolve": { - "version": "2.0.0-next.5", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", - "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", - "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/eslint-plugin-react/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/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-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", - "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", - "dev": true, - "dependencies": { - "eslint-visitor-keys": "^2.0.0" - }, - "engines": { - "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - }, - "peerDependencies": { - "eslint": ">=5" - } - }, - "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "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/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/eslint/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/eslint/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/eslint/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/eslint/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/eslint/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/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/eslint/node_modules/globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", - "dev": true, - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/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/eslint/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/eslint/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/eslint/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/eslint/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/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/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/esquery": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.2.tgz", - "integrity": "sha512-JVSoLdTlTDkmjFmab7H/9SL9qGSyjElT3myyKp7krqjVFQCDLmj1QFaCLRFBszBKI0XVZaiiXvuPIX3ZwHe1Ng==", - "dev": true, - "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "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/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", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/event-emitter": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", - "integrity": "sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==", - "dev": true, - "dependencies": { - "d": "1", - "es5-ext": "~0.10.14" - } - }, - "node_modules/event-target-shim": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", - "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", - "engines": { - "node": ">=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/eventuate": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/eventuate/-/eventuate-4.0.0.tgz", - "integrity": "sha512-SysKo5/rgqCaXlO4H4DE62JXCFtDpdm+boWOzaeaYph3Xejy04Cc4/E2HDPnOES0MFb643WgKRlx09W2iVAIBw==", - "dependencies": { - "define-error": "~1.0.0", - "object-assign": "~3.0.0", - "shallow-copy": "0.0.1" - } - }, - "node_modules/eventuate/node_modules/object-assign": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz", - "integrity": "sha512-jHP15vXVGeVh1HuaA2wY6lxk+whK/x4KBG88VXeRma7CCun7iGD5qPc4eYykQ9sdQvg8jkwFKsSxHln2ybW3xQ==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "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/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/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/express/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/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/ext": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz", - "integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==", - "dev": true, - "dependencies": { - "type": "^2.7.2" - } - }, - "node_modules/ext/node_modules/type": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/type/-/type-2.7.2.tgz", - "integrity": "sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==", - "dev": true - }, - "node_modules/extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" - }, - "node_modules/extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", - "engines": [ - "node >=0.6.0" - ] - }, - "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==" - }, - "node_modules/fast-glob": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", - "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", - "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-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==" - }, - "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/fast-redact": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/fast-redact/-/fast-redact-3.3.0.tgz", - "integrity": "sha512-6T5V1QK1u4oF+ATxs1lWUmlEk6P2T9HqJG3e2DnHOdVgZy2rFJBoEnrIedcTXlkAHU/zKC+7KETJ+KGGKwxgMQ==", - "engines": { - "node": ">=6" - } - }, - "node_modules/fast-safe-stringify": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", - "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==", - "dev": true - }, - "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/figures": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", - "integrity": "sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA==", - "dependencies": { - "escape-string-regexp": "^1.0.5" - }, - "engines": { - "node": ">=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/file-type": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz", - "integrity": "sha512-RLoqTXE8/vPmMuTI88DAzhMYC99I8BWv7zYP4A1puo5HIjEJ5EX48ighy4ZyKMG9EDXxBgW6e++cn7d1xuFghA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/filelist": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", - "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", - "dependencies": { - "minimatch": "^5.0.1" - } - }, - "node_modules/filelist/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/filelist/node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/filesize": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/filesize/-/filesize-10.1.0.tgz", - "integrity": "sha512-GTLKYyBSDz3nPhlLVPjPWZCnhkd9TrrRArNcy8Z+J2cqScB7h2McAzR6NBX6nYOoWafql0roY8hrocxnZBv9CQ==", - "dev": true, - "engines": { - "node": ">= 10.4.0" - } - }, - "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/find-cache-dir": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", - "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", - "dev": true, - "dependencies": { - "commondir": "^1.0.1", - "make-dir": "^3.0.2", - "pkg-dir": "^4.1.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/avajs/find-cache-dir?sponsor=1" - } - }, - "node_modules/find-replace": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-3.0.0.tgz", - "integrity": "sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ==", - "dependencies": { - "array-back": "^3.0.1" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "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/find-up-simple": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/find-up-simple/-/find-up-simple-1.0.0.tgz", - "integrity": "sha512-q7Us7kcjj2VMePAa02hDAF6d+MzsdsAWEwYyOpwUtlerRBkOEPBCRZrAV4XfcSN8fHAgaD0hP7miwoay6DCprw==", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/find-versions": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/find-versions/-/find-versions-5.1.0.tgz", - "integrity": "sha512-+iwzCJ7C5v5KgcBuueqVoNiHVoQpwiUK5XFLjf0affFTep+Wcw93tPvmb8tqujDNmzhBDPddnWV/qgWSXgq+Hg==", - "dependencies": { - "semver-regex": "^4.0.5" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/flat": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", - "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", - "dev": true, - "bin": { - "flat": "cli.js" - } - }, - "node_modules/flat-cache": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", - "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", - "dev": true, - "dependencies": { - "flatted": "^3.2.9", - "keyv": "^4.5.3", - "rimraf": "^3.0.2" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/flatted": { - "version": "3.2.9", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz", - "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==", - "dev": true - }, - "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/for-each": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", - "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", - "dev": true, - "dependencies": { - "is-callable": "^1.1.3" - } - }, - "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/forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", - "engines": { - "node": "*" - } - }, - "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/formidable": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/formidable/-/formidable-3.5.1.tgz", - "integrity": "sha512-WJWKelbRHN41m5dumb0/k8TeAx7Id/y3a+Z7QfhxP/htI9Js5zYaEDtG8uMgG0vM0lOlqnmjE99/kfpOYi/0Og==", - "dependencies": { - "dezalgo": "^1.0.4", - "hexoid": "^1.0.0", - "once": "^1.4.0" - }, - "funding": { - "url": "https://ko-fi.com/tunnckoCore/commissions" - } - }, - "node_modules/formidable/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/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/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/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/fromentries": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/fromentries/-/fromentries-1.3.2.tgz", - "integrity": "sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==", - "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/fs-extra": { - "version": "11.2.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", - "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=14.14" - } - }, - "node_modules/fs-extra/node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "engines": { - "node": ">= 10.0.0" - } - }, - "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.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" - }, - "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/ftp": { - "version": "0.3.10", - "resolved": "https://registry.npmjs.org/ftp/-/ftp-0.3.10.tgz", - "integrity": "sha512-faFVML1aBx2UoDStmLwv2Wptt4vw5x03xxX172nhA5Y5HBshW5JweqQ2W4xL4dezQTG8inJsuYcpPHHU3X5OTQ==", - "dependencies": { - "readable-stream": "1.1.x", - "xregexp": "2.0.0" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/function.prototype.name": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", - "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "functions-have-names": "^1.2.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/functions-have-names": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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/gauge/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/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true, - "engines": { - "node": ">=6.9.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/get-func-name": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", - "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/get-intrinsic": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz", - "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==", - "dependencies": { - "function-bind": "^1.1.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-package-type": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", - "dev": true, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/get-stdin": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-8.0.0.tgz", - "integrity": "sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/get-symbol-description": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", - "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", - "dependencies": { - "assert-plus": "^1.0.0" - } - }, - "node_modules/git-log-parser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/git-log-parser/-/git-log-parser-1.2.0.tgz", - "integrity": "sha512-rnCVNfkTL8tdNryFuaY0fYiBWEBcgF748O6ZI61rslBvr2o7U65c2/6npCRqH40vuAhtgtDiqLTJjBVdrejCzA==", - "dependencies": { - "argv-formatter": "~1.0.0", - "spawn-error-forwarder": "~1.0.0", - "split2": "~1.0.0", - "stream-combiner2": "~1.1.1", - "through2": "~2.0.0", - "traverse": "~0.6.6" - } - }, - "node_modules/git-log-parser/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/git-log-parser/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/git-log-parser/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/git-log-parser/node_modules/split2": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/split2/-/split2-1.0.0.tgz", - "integrity": "sha512-NKywug4u4pX/AZBB1FCPzZ6/7O+Xhz1qMVbzTvvKvikjO99oPN87SkK08mEY9P63/5lWjK+wgOOgApnTg5r6qg==", - "dependencies": { - "through2": "~2.0.0" - } - }, - "node_modules/git-log-parser/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/git-log-parser/node_modules/through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dependencies": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, - "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==", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/glob/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/global-agent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/global-agent/-/global-agent-3.0.0.tgz", - "integrity": "sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q==", - "dev": true, - "dependencies": { - "boolean": "^3.0.1", - "es6-error": "^4.1.1", - "matcher": "^3.0.0", - "roarr": "^2.15.3", - "semver": "^7.3.2", - "serialize-error": "^7.0.1" - }, - "engines": { - "node": ">=10.0" - } - }, - "node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/globalthis": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", - "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", - "dev": true, - "dependencies": { - "define-properties": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/globby": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-14.0.0.tgz", - "integrity": "sha512-/1WM/LNHRAOH9lZta77uGbq0dAEQM+XjNesWwhlERDVenqothRbnzTrL3/LrIoEPPjeUHC3vrS6TwoyxeHs7MQ==", - "dependencies": { - "@sindresorhus/merge-streams": "^1.0.0", - "fast-glob": "^3.3.2", - "ignore": "^5.2.4", - "path-type": "^5.0.0", - "slash": "^5.1.0", - "unicorn-magic": "^0.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/globby/node_modules/path-type": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-5.0.0.tgz", - "integrity": "sha512-5HviZNaZcfqP95rwpv+1HDgUamezbqdSYTyzjTvwtJSnIH+3vnbmWsItli8OFEndS984VT55M3jduxZbX351gg==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dependencies": { - "get-intrinsic": "^1.1.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" - }, - "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/handlebars": { - "version": "4.7.8", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", - "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", - "dependencies": { - "minimist": "^1.2.5", - "neo-async": "^2.6.2", - "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/har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==", - "engines": { - "node": ">=4" - } - }, - "node_modules/har-validator": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", - "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", - "deprecated": "this library is no longer supported", - "dependencies": { - "ajv": "^6.12.3", - "har-schema": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/has-bigints": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", - "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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-property-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz", - "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==", - "dependencies": { - "get-intrinsic": "^1.2.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", - "dev": true, - "dependencies": { - "has-symbols": "^1.0.2" - }, - "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/hasha": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.2.tgz", - "integrity": "sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==", - "dev": true, - "dependencies": { - "is-stream": "^2.0.0", - "type-fest": "^0.8.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/hasown": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", - "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "dev": true, - "bin": { - "he": "bin/he" - } - }, - "node_modules/helmet": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/helmet/-/helmet-7.1.0.tgz", - "integrity": "sha512-g+HZqgfbpXdCkme/Cd/mZkV0aV3BZZZSugecH03kl38m/Kmdx8jKjBikpDj2cr+Iynv4KpYEviojNdTJActJAg==", - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/hexoid": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/hexoid/-/hexoid-1.0.0.tgz", - "integrity": "sha512-QFLV0taWQOZtvIRIAdBChesmogZrtuXvVWsFHZTk2SU+anspqZ2vMnoLg7IE1+Uk16N19APic1BuF8bC8c2m5g==", - "engines": { - "node": ">=8" - } - }, - "node_modules/hook-std": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/hook-std/-/hook-std-3.0.0.tgz", - "integrity": "sha512-jHRQzjSDzMtFy34AGj1DN+vq54WVuhSvKgrHf0OMiFQTwDD4L/qqofVEWjLOBMTn5+lCD3fPg32W9yOfnEJTTw==", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/hosted-git-info": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.1.tgz", - "integrity": "sha512-+K84LB1DYwMHoHSgaOY/Jfhw3ucPmSET5v98Ke/HdNSw4a0UktWzyW1mjhjpuxxTqOOsfWT/7iVshHmVZ4IpOA==", - "dependencies": { - "lru-cache": "^10.0.1" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/hosted-git-info/node_modules/lru-cache": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.1.0.tgz", - "integrity": "sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag==", - "engines": { - "node": "14 || >=16.14" - } - }, - "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-cache-semantics": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", - "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", - "optional": 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/http-proxy-agent": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.0.tgz", - "integrity": "sha512-+ZT+iBxVUQ1asugqnD6oWoRiS25AkjNfG085dKJGtGxkdwLQrMKU5wJr2bOOFAXzKcTuqq+7fZlTMgG3SRfIYQ==", - "dependencies": { - "agent-base": "^7.1.0", - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/http-proxy-agent/node_modules/agent-base": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.0.tgz", - "integrity": "sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==", - "dependencies": { - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/http-proxy-agent/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/http-proxy-agent/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/http-reasons": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/http-reasons/-/http-reasons-0.1.0.tgz", - "integrity": "sha512-P6kYh0lKZ+y29T2Gqz+RlC9WBLhKe8kDmcJ+A+611jFfxdPsbMRQ5aNmFRM3lENqFkK+HTTL+tlQviAiv0AbLQ==", - "dev": true - }, - "node_modules/http-signature": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.3.6.tgz", - "integrity": "sha512-3adrsD6zqo4GsTqtO7FyrejHNv+NgiIfAfv68+jVlFmSr9OGy7zrxONceFRLKvnnZA5jbxQBX1u9PpB6Wi32Gw==", - "dev": true, - "dependencies": { - "assert-plus": "^1.0.0", - "jsprim": "^2.0.2", - "sshpk": "^1.14.1" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/httpntlm": { - "version": "1.8.13", - "resolved": "https://registry.npmjs.org/httpntlm/-/httpntlm-1.8.13.tgz", - "integrity": "sha512-2F2FDPiWT4rewPzNMg3uPhNkP3NExENlUGADRUDPQvuftuUTGW98nLZtGemCIW3G40VhWZYgkIDcQFAwZ3mf2Q==", - "dev": true, - "funding": [ - { - "type": "paypal", - "url": "https://www.paypal.com/donate/?hosted_button_id=2CKNJLZJBW8ZC" - }, - { - "type": "buymeacoffee", - "url": "https://www.buymeacoffee.com/samdecrock" - } - ], - "dependencies": { - "des.js": "^1.0.1", - "httpreq": ">=0.4.22", - "js-md4": "^0.3.2", - "underscore": "~1.12.1" - }, - "engines": { - "node": ">=10.4.0" - } - }, - "node_modules/httpntlm/node_modules/underscore": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.12.1.tgz", - "integrity": "sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw==", - "dev": true - }, - "node_modules/httpreq": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/httpreq/-/httpreq-1.1.1.tgz", - "integrity": "sha512-uhSZLPPD2VXXOSN8Cni3kIsoFHaU2pT/nySEU/fHr/ePbqHYr0jeiQRmUKLEirC09SFPsdMoA7LU7UXMd/w0Kw==", - "engines": { - "node": ">= 6.15.1" - } - }, - "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/https-proxy-agent/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/https-proxy-agent/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/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==", - "engines": { - "node": ">=10.17.0" - } - }, - "node_modules/humanize-ms": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", - "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", - "optional": true, - "dependencies": { - "ms": "^2.0.0" - } - }, - "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.3.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.0.tgz", - "integrity": "sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==", - "engines": { - "node": ">= 4" - } - }, - "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==", - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/import-from-esm": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/import-from-esm/-/import-from-esm-1.3.3.tgz", - "integrity": "sha512-U3Qt/CyfFpTUv6LOP2jRTLYjphH6zg3okMfHbyqRa/W2w6hr8OsJWVggNlR4jxuojQy81TgTJTxgSkyoteRGMQ==", - "dependencies": { - "debug": "^4.3.4", - "import-meta-resolve": "^4.0.0" - }, - "engines": { - "node": ">=16.20" - } - }, - "node_modules/import-from-esm/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/import-from-esm/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/import-meta-resolve": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-4.0.0.tgz", - "integrity": "sha512-okYUR7ZQPH+efeuMJGlq4f8ubUgO50kByRPyt/Cy1Io4PSRsPjxME+YlVaCOx+NIToW7hCsZNFJyTPFFKepRSA==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "devOptional": true, - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "devOptional": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/index-to-position": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/index-to-position/-/index-to-position-0.1.2.tgz", - "integrity": "sha512-MWDKS3AS1bGCHLBA2VLImJz42f7bJh8wQsTGCzI3j519/CASStoDONUBVz2I/VID0MpiX3SGSnbOD2xUalbE5g==", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/infer-owner": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", - "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", - "optional": true - }, - "node_modules/inflection": { - "version": "1.13.4", - "resolved": "https://registry.npmjs.org/inflection/-/inflection-1.13.4.tgz", - "integrity": "sha512-6I/HUDeYFfuNCVS3td055BaXBwKYuzw7K3ExVMStBowKo9oOAMJIXIHvdyR3iboTCp1b+1i5DSkIZTcwIktuDw==", - "engines": [ - "node >= 0.4.0" - ] - }, - "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": "2.0.0", - "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", - "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", - "engines": { - "node": ">=10" - } - }, - "node_modules/internal-slot": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.6.tgz", - "integrity": "sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.2.2", - "hasown": "^2.0.0", - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/into-stream": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/into-stream/-/into-stream-7.0.0.tgz", - "integrity": "sha512-2dYz766i9HprMBasCMvHMuazJ7u4WzhJwo5kb3iPSiW/iRYV6uPari3zHoqZlnuaR7V1bEiNMxikhp37rdBXbw==", - "dependencies": { - "from2": "^2.3.0", - "p-is-promise": "^3.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ip": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", - "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==", - "optional": true - }, - "node_modules/ip-regex": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", - "integrity": "sha512-58yWmlHpp7VYfcdTwMTvwMmqx/Elfxjd9RXTDyMsbL7lLWmhMylLEqiYVLKuLzOZqVgiWXD9MfR62Vv89VRxkw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "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-admin": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-admin/-/is-admin-4.0.0.tgz", - "integrity": "sha512-ODl+ygFCyHXMauhn+0mBebcwO1tiB+b4FoBiIC97gFDcmdO3JMD+YmIhSA8+1KVZuGwfsX8ANo2yblgW5KUPTg==", - "dependencies": { - "execa": "^5.1.1" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-array-buffer": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", - "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.0", - "is-typed-array": "^1.1.10" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" - }, - "node_modules/is-async-function": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz", - "integrity": "sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-bigint": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", - "dev": true, - "dependencies": { - "has-bigints": "^1.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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-boolean-object": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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==", - "dev": true - }, - "node_modules/is-callable": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-core-module": { - "version": "2.13.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", - "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", - "dependencies": { - "hasown": "^2.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-date-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-elevated": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-elevated/-/is-elevated-4.0.0.tgz", - "integrity": "sha512-nHdo1tvG6ocQA+MESx+VmUae2dvB32mm87gzZxMlZT7gtURGC9quMpYrwuMqIFJTqKSP/wLLQnneG/Z2AIne6g==", - "dependencies": { - "is-admin": "^4.0.0", - "is-root": "^3.0.0" - }, - "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", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-finalizationregistry": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz", - "integrity": "sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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-generator-function": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", - "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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-ip": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-ip/-/is-ip-2.0.0.tgz", - "integrity": "sha512-9MTn0dteHETtyUx8pxqMwg5hMBi3pvlyglJ+b79KOCca0po23337LbVV2Hl4xmMvfw++ljnO0/+5G6G+0Szh6g==", - "dev": true, - "dependencies": { - "ip-regex": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/is-lambda": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", - "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==", - "optional": true - }, - "node_modules/is-map": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz", - "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-negative-zero": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", - "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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-number-like": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/is-number-like/-/is-number-like-1.0.8.tgz", - "integrity": "sha512-6rZi3ezCyFcn5L71ywzz2bS5b2Igl1En3eTlZlvKjpz1n3IZLAYMbKYAIQgFmEu0GENg92ziU/faEOA/aixjbA==", - "dependencies": { - "lodash.isfinite": "^3.3.2" - } - }, - "node_modules/is-number-object": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", - "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", - "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", - "engines": { - "node": ">=8" - } - }, - "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-promise": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", - "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==", - "dev": true - }, - "node_modules/is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-root": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-root/-/is-root-3.0.0.tgz", - "integrity": "sha512-C13bL54yQdgniduW8KFe81ttgQINcwMgil/zyNuDzr/xjIyDMkcvcc9dON62RH9VBAHOI7le+lTo/U3PY3irwg==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-set": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz", - "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-shared-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", - "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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==", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", - "dev": true, - "dependencies": { - "has-symbols": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-text-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-2.0.0.tgz", - "integrity": "sha512-+oDTluR6WEjdXEJMnC2z6A4FRwFoYuvShVVEGsS7ewc0UTi2QtAKMDJuL4BDEVt+5T7MjFo12RP8ghOM75oKJw==", - "dependencies": { - "text-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-typed-array": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz", - "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==", - "dev": true, - "dependencies": { - "which-typed-array": "^1.1.11" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" - }, - "node_modules/is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-weakmap": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz", - "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-weakref": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", - "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-weakset": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz", - "integrity": "sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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==", - "dev": true, - "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/isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==" - }, - "node_modules/issue-parser": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/issue-parser/-/issue-parser-6.0.0.tgz", - "integrity": "sha512-zKa/Dxq2lGsBIXQ7CUZWTHfvxPC2ej0KfO7fIPqLlHB9J2hJ7rGhZ5rilhuufylr4RXYPzJUeFjKxz305OsNlA==", - "dependencies": { - "lodash.capitalize": "^4.2.1", - "lodash.escaperegexp": "^4.1.2", - "lodash.isplainobject": "^4.0.6", - "lodash.isstring": "^4.0.1", - "lodash.uniqby": "^4.7.0" - }, - "engines": { - "node": ">=10.13" - } - }, - "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-hook": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz", - "integrity": "sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ==", - "dev": true, - "dependencies": { - "append-transform": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-instrument": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", - "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", - "dev": true, - "dependencies": { - "@babel/core": "^7.7.5", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.0.0", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-instrument/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/istanbul-lib-processinfo": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.3.tgz", - "integrity": "sha512-NkwHbo3E00oybX6NGJi6ar0B29vxyvNwoC7eJ4G4Yq28UfY758Hgn/heV8VRFhevPED4LXfFz0DQ8z/0kw9zMg==", - "dev": true, - "dependencies": { - "archy": "^1.0.0", - "cross-spawn": "^7.0.3", - "istanbul-lib-coverage": "^3.2.0", - "p-map": "^3.0.0", - "rimraf": "^3.0.0", - "uuid": "^8.3.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-processinfo/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==", - "dev": true, - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "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-lib-report/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/istanbul-lib-report/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/istanbul-lib-source-maps": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", - "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", - "dev": true, - "dependencies": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-lib-source-maps/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/istanbul-lib-source-maps/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/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/iterator.prototype": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.2.tgz", - "integrity": "sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==", - "dev": true, - "dependencies": { - "define-properties": "^1.2.1", - "get-intrinsic": "^1.2.1", - "has-symbols": "^1.0.3", - "reflect.getprototypeof": "^1.0.4", - "set-function-name": "^2.0.1" - } - }, - "node_modules/jake": { - "version": "10.8.5", - "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.5.tgz", - "integrity": "sha512-sVpxYeuAhWt0OTWITwT98oyV0GsXyMlXCF+3L1SuafBVUIr/uILGRB+NqwkzhgXKvoJpDIpQvqkUALgdmQsQxw==", - "dependencies": { - "async": "^3.2.3", - "chalk": "^4.0.2", - "filelist": "^1.0.1", - "minimatch": "^3.0.4" - }, - "bin": { - "jake": "bin/cli.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/jake/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/jake/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/jake/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/jake/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/jake/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/jake/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/jake/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/java-properties": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/java-properties/-/java-properties-1.0.2.tgz", - "integrity": "sha512-qjdpeo2yKlYTH7nFdK0vbZWuTCesk4o63v5iVOlhMQPfuIZQfW/HI35SjfhA+4qpg36rnFSvUK5b1m+ckIblQQ==", - "engines": { - "node": ">= 0.6.0" - } - }, - "node_modules/jose": { - "version": "4.14.4", - "resolved": "https://registry.npmjs.org/jose/-/jose-4.14.4.tgz", - "integrity": "sha512-j8GhLiKmUAh+dsFXlX1aJCbt5KMibuKb+d7j1JaOJG6s2UjX1PQlW+OKB/sD4a/5ZYF4RcmYmLSndOoU3Lt/3g==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/panva" - } - }, - "node_modules/js-beautify": { - "version": "1.14.7", - "resolved": "https://registry.npmjs.org/js-beautify/-/js-beautify-1.14.7.tgz", - "integrity": "sha512-5SOX1KXPFKx+5f6ZrPsIPEY7NwKeQz47n3jm2i+XeHx9MoRsfQenlOP13FQhWvg8JRS0+XLO6XYUQ2GX+q+T9A==", - "dev": true, - "dependencies": { - "config-chain": "^1.1.13", - "editorconfig": "^0.15.3", - "glob": "^8.0.3", - "nopt": "^6.0.0" - }, - "bin": { - "css-beautify": "js/bin/css-beautify.js", - "html-beautify": "js/bin/html-beautify.js", - "js-beautify": "js/bin/js-beautify.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/js-beautify/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/js-beautify/node_modules/glob": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", - "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/js-beautify/node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/js-md4": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/js-md4/-/js-md4-0.3.2.tgz", - "integrity": "sha512-/GDnfQYsltsjRswQhN9fhv3EMw2sCpUdrdxyWDOUK7eyD++r3gRhzgiQgc/x4MAv2i1iuQ4lxO5mvqM3vj4bwA==", - "dev": true - }, - "node_modules/js-sha512": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/js-sha512/-/js-sha512-0.8.0.tgz", - "integrity": "sha512-PWsmefG6Jkodqt+ePTvBZCSMFgN7Clckjd0O7su3I0+BW2QWUTJNzjktHsztGLhncP2h8mcF9V9Y2Ha59pAViQ==", - "dev": true - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" - }, - "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==", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==" - }, - "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/json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true - }, - "node_modules/json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==" - }, - "node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" - }, - "node_modules/json-schema": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", - "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" - }, - "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==" - }, - "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/json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==" - }, - "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/jsonfile/node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/jsonparse": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", - "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", - "engines": [ - "node >= 0.2.0" - ] - }, - "node_modules/jsonschema": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsonschema/-/jsonschema-1.4.1.tgz", - "integrity": "sha512-S6cATIPVv1z0IlxdN+zUk5EPjkGCdnhN4wVSBlvoUO1tOLJootbo9CquNJmbIh4yikWHiUedhRYrNPn1arpEmQ==", - "engines": { - "node": "*" - } - }, - "node_modules/JSONStream": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", - "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", - "dependencies": { - "jsonparse": "^1.2.0", - "through": ">=2.2.7 <3" - }, - "bin": { - "JSONStream": "bin.js" - }, - "engines": { - "node": "*" - } - }, - "node_modules/jsprim": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-2.0.2.tgz", - "integrity": "sha512-gqXddjPqQ6G40VdnI6T6yObEC+pDNvyP95wdQhkWkg7crHH3km5qP1FsOXEkzEQwnz6gz5qGTn1c2Y52wP3OyQ==", - "dev": true, - "engines": [ - "node >=0.6.0" - ], - "dependencies": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.4.0", - "verror": "1.10.0" - } - }, - "node_modules/jsx-ast-utils": { - "version": "3.3.5", - "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", - "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", - "dev": true, - "dependencies": { - "array-includes": "^3.1.6", - "array.prototype.flat": "^1.3.1", - "object.assign": "^4.1.4", - "object.values": "^1.1.6" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/just-extend": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.2.1.tgz", - "integrity": "sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg==", - "dev": true - }, - "node_modules/keyv": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", - "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", - "dev": true, - "dependencies": { - "json-buffer": "3.0.1" - } - }, - "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/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" - }, - "node_modules/liquid-json": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/liquid-json/-/liquid-json-0.3.1.tgz", - "integrity": "sha512-wUayTU8MS827Dam6MxgD72Ui+KOSF+u/eIqpatOtjnvgJ0+mnDq33uC2M7J0tPK+upe/DpUAuK4JUU89iBoNKQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/load-json-file": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", - "integrity": "sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==", - "dependencies": { - "graceful-fs": "^4.1.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0", - "strip-bom": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/load-json-file/node_modules/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", - "dependencies": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/load-json-file/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/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": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - }, - "node_modules/lodash-es": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", - "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==" - }, - "node_modules/lodash.assignwith": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.assignwith/-/lodash.assignwith-4.2.0.tgz", - "integrity": "sha512-ZznplvbvtjK2gMvnQ1BR/zqPFZmS6jbK4p+6Up4xcRYA7yMIwxHCfbTcrYxXKzzqLsQ05eJPVznEW3tuwV7k1g==" - }, - "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.capitalize": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/lodash.capitalize/-/lodash.capitalize-4.2.1.tgz", - "integrity": "sha512-kZzYOKspf8XVX5AvmQF94gQW0lejFVgb80G85bU4ZWzoJ6C03PQg3coYAUpSTpQWelrZELd3XWgHzw4Ck5kaIw==" - }, - "node_modules/lodash.escaperegexp": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz", - "integrity": "sha512-TM9YBvyC84ZxE3rgfefxUWiQKLilstD6k7PTGt6wfbtXF8ixIJLOL3VYyV/z+ZiPLsVxAsKAFVwWlWeb2Y8Yyw==" - }, - "node_modules/lodash.flattendeep": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", - "integrity": "sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==", - "dev": true - }, - "node_modules/lodash.get": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", - "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==", - "dev": true - }, - "node_modules/lodash.isfinite": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/lodash.isfinite/-/lodash.isfinite-3.3.2.tgz", - "integrity": "sha512-7FGG40uhC8Mm633uKW1r58aElFlBlxCrg9JfSi3P6aYiWmfiWF0PgMd86ZUsxE5GwWPdHoS2+48bwTh2VPkIQA==" - }, - "node_modules/lodash.isplainobject": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", - "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==" - }, - "node_modules/lodash.isstring": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", - "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==" - }, - "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/lodash.uniqby": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/lodash.uniqby/-/lodash.uniqby-4.7.0.tgz", - "integrity": "sha512-e/zcLx6CSbmaEgFHCA7BnoQKyCtKMxnuWrJygbwPs/AIn+IMKl66L8/s+wBUn5LRw2pZx3bUHibiV1b6aTWIww==" - }, - "node_modules/log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "dev": true, - "dependencies": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/log-symbols/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/log-symbols/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "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/log-symbols/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/log-symbols/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/log-symbols/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/log-symbols/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/loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "dev": true, - "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" - }, - "bin": { - "loose-envify": "cli.js" - } - }, - "node_modules/loupe": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.7.tgz", - "integrity": "sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==", - "dev": true, - "dependencies": { - "get-func-name": "^2.0.1" - } - }, - "node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/lru-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/lru-queue/-/lru-queue-0.1.0.tgz", - "integrity": "sha512-BpdYkt9EvGl8OfWHDQPISVpcl5xZthb+XPsbELj5AQXxIC8IriDZIQYjBJPEm5rS420sjZ0TLEzRcq5KdBhYrQ==", - "dev": true, - "dependencies": { - "es5-ext": "~0.10.2" - } - }, - "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.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/make-fetch-happen": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-9.1.0.tgz", - "integrity": "sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg==", - "optional": true, - "dependencies": { - "agentkeepalive": "^4.1.3", - "cacache": "^15.2.0", - "http-cache-semantics": "^4.1.0", - "http-proxy-agent": "^4.0.1", - "https-proxy-agent": "^5.0.0", - "is-lambda": "^1.0.1", - "lru-cache": "^6.0.0", - "minipass": "^3.1.3", - "minipass-collect": "^1.0.2", - "minipass-fetch": "^1.3.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.2", - "promise-retry": "^2.0.1", - "socks-proxy-agent": "^6.0.0", - "ssri": "^8.0.0" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/make-fetch-happen/node_modules/@tootallnate/once": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", - "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", - "optional": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/make-fetch-happen/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "optional": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/make-fetch-happen/node_modules/http-proxy-agent": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", - "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", - "optional": true, - "dependencies": { - "@tootallnate/once": "1", - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/make-fetch-happen/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==", - "optional": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/make-fetch-happen/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==", - "optional": true - }, - "node_modules/make-fetch-happen/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "optional": true - }, - "node_modules/marked": { - "version": "9.1.6", - "resolved": "https://registry.npmjs.org/marked/-/marked-9.1.6.tgz", - "integrity": "sha512-jcByLnIFkd5gSXZmjNvS1TlmRhCXZjIzHYlaGkPlLIekG55JDR2Z4va9tZwCiP+/RDERiNhMOFu01xd6O5ct1Q==", - "bin": { - "marked": "bin/marked.js" - }, - "engines": { - "node": ">= 16" - } - }, - "node_modules/marked-terminal": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/marked-terminal/-/marked-terminal-6.2.0.tgz", - "integrity": "sha512-ubWhwcBFHnXsjYNsu+Wndpg0zhY4CahSpPlA70PlO0rR9r2sZpkyU+rkCsOWH+KMEkx847UpALON+HWgxowFtw==", - "dependencies": { - "ansi-escapes": "^6.2.0", - "cardinal": "^2.1.1", - "chalk": "^5.3.0", - "cli-table3": "^0.6.3", - "node-emoji": "^2.1.3", - "supports-hyperlinks": "^3.0.0" - }, - "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "marked": ">=1 <12" - } - }, - "node_modules/marked-terminal/node_modules/chalk": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", - "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/matcher": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/matcher/-/matcher-3.0.0.tgz", - "integrity": "sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==", - "dev": true, - "dependencies": { - "escape-string-regexp": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/matcher/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/md5": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/md5/-/md5-2.3.0.tgz", - "integrity": "sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==", - "dev": true, - "dependencies": { - "charenc": "0.0.2", - "crypt": "0.0.2", - "is-buffer": "~1.1.6" - } - }, - "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/memoizee": { - "version": "0.4.15", - "resolved": "https://registry.npmjs.org/memoizee/-/memoizee-0.4.15.tgz", - "integrity": "sha512-UBWmJpLZd5STPm7PMUlOw/TSy972M+z8gcyQ5veOnSDRREz/0bmpyTfKt3/51DhEBqCZQn1udM/5flcSPYhkdQ==", - "dev": true, - "dependencies": { - "d": "^1.0.1", - "es5-ext": "^0.10.53", - "es6-weak-map": "^2.0.3", - "event-emitter": "^0.3.5", - "is-promise": "^2.2.2", - "lru-queue": "^0.1.0", - "next-tick": "^1.1.0", - "timers-ext": "^0.1.7" - } - }, - "node_modules/meow": { - "version": "12.1.1", - "resolved": "https://registry.npmjs.org/meow/-/meow-12.1.1.tgz", - "integrity": "sha512-BhXM0Au22RwUneMPwSCnyhTOizdWoIEPU9sp0Aqa1PnDMR5Wv2FGXYDjuzJEIX+Eo2Rb8xuYe5jrnm5QowQFkw==", - "engines": { - "node": ">=16.10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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/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==" - }, - "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": "4.0.1", - "resolved": "https://registry.npmjs.org/mime/-/mime-4.0.1.tgz", - "integrity": "sha512-5lZ5tyrIfliMXzFtkYyekWbtRXObT9OWa8IwQ5uxTBDHucNNwniRqo0yInflj+iYi5CBa6qxadGzGarDfuEOxA==", - "funding": [ - "https://github.com/sponsors/broofa" - ], - "bin": { - "mime": "bin/cli.js" - }, - "engines": { - "node": ">=16" - } - }, - "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-format": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/mime-format/-/mime-format-2.0.1.tgz", - "integrity": "sha512-XxU3ngPbEnrYnNbIX+lYSaYg0M01v6p2ntd2YaFksTu0vayaw5OJvbdRyWs07EYRlLED5qadUZ+xo+XhOvFhwg==", - "dev": true, - "dependencies": { - "charset": "^1.0.0" - } - }, - "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-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "engines": { - "node": ">=6" - } - }, - "node_modules/minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", - "dev": true - }, - "node_modules/minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/minimatch/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "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/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/minipass-collect": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", - "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", - "optional": true, - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/minipass-fetch": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-1.4.1.tgz", - "integrity": "sha512-CGH1eblLq26Y15+Azk7ey4xh0J/XfJfrCox5LDJiKqI2Q2iwOLOKrlmIaODiSQS8d18jalF6y2K2ePUm0CmShw==", - "optional": true, - "dependencies": { - "minipass": "^3.1.0", - "minipass-sized": "^1.0.3", - "minizlib": "^2.0.0" - }, - "engines": { - "node": ">=8" - }, - "optionalDependencies": { - "encoding": "^0.1.12" - } - }, - "node_modules/minipass-flush": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", - "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", - "optional": true, - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/minipass-pipeline": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", - "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", - "optional": true, - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minipass-sized": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", - "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", - "optional": true, - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minipass/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/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/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, - "node_modules/mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "dependencies": { - "minimist": "^1.2.6" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/mocha": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.2.0.tgz", - "integrity": "sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg==", - "dev": true, - "dependencies": { - "ansi-colors": "4.1.1", - "browser-stdout": "1.3.1", - "chokidar": "3.5.3", - "debug": "4.3.4", - "diff": "5.0.0", - "escape-string-regexp": "4.0.0", - "find-up": "5.0.0", - "glob": "7.2.0", - "he": "1.2.0", - "js-yaml": "4.1.0", - "log-symbols": "4.1.0", - "minimatch": "5.0.1", - "ms": "2.1.3", - "nanoid": "3.3.3", - "serialize-javascript": "6.0.0", - "strip-json-comments": "3.1.1", - "supports-color": "8.1.1", - "workerpool": "6.2.1", - "yargs": "16.2.0", - "yargs-parser": "20.2.4", - "yargs-unparser": "2.0.0" - }, - "bin": { - "_mocha": "bin/_mocha", - "mocha": "bin/mocha.js" - }, - "engines": { - "node": ">= 14.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mochajs" - } - }, - "node_modules/mocha-junit-reporter": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/mocha-junit-reporter/-/mocha-junit-reporter-2.2.1.tgz", - "integrity": "sha512-iDn2tlKHn8Vh8o4nCzcUVW4q7iXp7cC4EB78N0cDHIobLymyHNwe0XG8HEHHjc3hJlXm0Vy6zcrxaIhnI2fWmw==", - "dev": true, - "dependencies": { - "debug": "^4.3.4", - "md5": "^2.3.0", - "mkdirp": "^3.0.0", - "strip-ansi": "^6.0.1", - "xml": "^1.0.1" - }, - "peerDependencies": { - "mocha": ">=2.2.5" - } - }, - "node_modules/mocha-junit-reporter/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/mocha-junit-reporter/node_modules/mkdirp": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz", - "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==", - "dev": true, - "bin": { - "mkdirp": "dist/cjs/src/bin.js" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/mocha-junit-reporter/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/mocha/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/mocha/node_modules/debug/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/mocha/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/mocha/node_modules/glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/mocha/node_modules/glob/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/mocha/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/mocha/node_modules/minimatch": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", - "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/mocha/node_modules/minimatch/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/mocha/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==", - "dev": true - }, - "node_modules/mocha/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/moment": { - "version": "2.30.1", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz", - "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==", - "engines": { - "node": "*" - } - }, - "node_modules/moment-timezone": { - "version": "0.5.44", - "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.44.tgz", - "integrity": "sha512-nv3YpzI/8lkQn0U6RkLd+f0W/zy/JnoR5/EyPz/dNkPTBjA2jNLCVxaiQ8QpeLymhSZvX0wCL5s27NQWdOPwAw==", - "dependencies": { - "moment": "^2.29.4" - }, - "engines": { - "node": "*" - } - }, - "node_modules/morgan": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.10.0.tgz", - "integrity": "sha512-AbegBVI4sh6El+1gNwvD5YIck7nSA36weD7xvIxG4in80j/UoK8AEGaWnnz8v1GxonMCltmlNs5ZKbGvl9b1XQ==", - "dependencies": { - "basic-auth": "~2.0.1", - "debug": "2.6.9", - "depd": "~2.0.0", - "on-finished": "~2.3.0", - "on-headers": "~1.0.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/morgan/node_modules/on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "node_modules/multer": { - "version": "1.4.5-lts.1", - "resolved": "https://registry.npmjs.org/multer/-/multer-1.4.5-lts.1.tgz", - "integrity": "sha512-ywPWvcDMeH+z9gQq5qYHCCy+ethsk4goepZ45GLD63fOu0YcNecQxi64nDs3qluZB+murG3/D4dJ7+dGctcCQQ==", - "dependencies": { - "append-field": "^1.0.0", - "busboy": "^1.0.0", - "concat-stream": "^1.5.2", - "mkdirp": "^0.5.4", - "object-assign": "^4.1.1", - "type-is": "^1.6.4", - "xtend": "^4.0.0" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/multer/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/nanoid": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz", - "integrity": "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==", - "dev": true, - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "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/nconf": { - "version": "0.12.1", - "resolved": "https://registry.npmjs.org/nconf/-/nconf-0.12.1.tgz", - "integrity": "sha512-p2cfF+B3XXacQdswUYWZ0w6Vld0832A/tuqjLBu3H1sfUcby4N2oVbGhyuCkZv+t3iY3aiFEj7gZGqax9Q2c1w==", - "dependencies": { - "async": "^3.0.0", - "ini": "^2.0.0", - "secure-keys": "^1.0.0", - "yargs": "^16.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "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/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==" - }, - "node_modules/nerf-dart": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/nerf-dart/-/nerf-dart-1.0.0.tgz", - "integrity": "sha512-EZSPZB70jiVsivaBLYDCyntd5eH8NTSMOn3rB+HxwdmKThGELLdYv8qVIMWvZEFy9w8ZZpW9h9OB32l1rGtj7g==" - }, - "node_modules/newman": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/newman/-/newman-6.1.0.tgz", - "integrity": "sha512-0A/dSVnGvmnNv6RatCNMIYnSfMqkUjBLMac/Lvo+C0Zr8BQbweBuEw+zNR1kgPiBwUQmYVkRvGWJwI/cE3N2qA==", - "dev": true, - "dependencies": { - "@postman/tough-cookie": "4.1.3-postman.1", - "async": "3.2.5", - "chardet": "2.0.0", - "cli-progress": "3.12.0", - "cli-table3": "0.6.3", - "colors": "1.4.0", - "commander": "11.1.0", - "csv-parse": "4.16.3", - "filesize": "10.1.0", - "liquid-json": "0.3.1", - "lodash": "4.17.21", - "mkdirp": "3.0.1", - "postman-collection": "4.3.0", - "postman-collection-transformer": "4.1.8", - "postman-request": "2.88.1-postman.33", - "postman-runtime": "7.36.1", - "pretty-ms": "7.0.1", - "semver": "7.5.4", - "serialised-error": "1.1.3", - "word-wrap": "1.2.5", - "xmlbuilder": "15.1.1" - }, - "bin": { - "newman": "bin/newman.js" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/newman-reporter-junitfull": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/newman-reporter-junitfull/-/newman-reporter-junitfull-1.1.1.tgz", - "integrity": "sha512-ET5rU1qkeJ5yvFxcKQFkqGxWia50kdnufm1uzyeNYlUg6T+k07AvOS0mfp/Ejr0njnsiPfFLb9kC48F8pafq9A==", - "dev": true, - "dependencies": { - "lodash": "^4.17.10", - "moment": "^2.22.2", - "xmlbuilder": "^10.0.0" - }, - "engines": { - "node": ">=6" - }, - "peerDependencies": { - "newman": ">=4" - } - }, - "node_modules/newman-reporter-junitfull/node_modules/xmlbuilder": { - "version": "10.1.1", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-10.1.1.tgz", - "integrity": "sha512-OyzrcFLL/nb6fMGHbiRDuPup9ljBycsdCypwuyg5AAHvyWzGfChJpCXMG88AGTIMFhGZ9RccFN1e6lhg3hkwKg==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/newman/node_modules/mkdirp": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz", - "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==", - "dev": true, - "bin": { - "mkdirp": "dist/cjs/src/bin.js" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/next-tick": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", - "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==", - "dev": true - }, - "node_modules/nise": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/nise/-/nise-5.1.5.tgz", - "integrity": "sha512-VJuPIfUFaXNRzETTQEEItTOP8Y171ijr+JLq42wHes3DiryR8vT+1TXQW/Rx8JNUhyYYWyIvjXTU6dOhJcs9Nw==", - "dev": true, - "dependencies": { - "@sinonjs/commons": "^2.0.0", - "@sinonjs/fake-timers": "^10.0.2", - "@sinonjs/text-encoding": "^0.7.1", - "just-extend": "^4.0.2", - "path-to-regexp": "^1.7.0" - } - }, - "node_modules/nise/node_modules/@sinonjs/commons": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-2.0.0.tgz", - "integrity": "sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==", - "dev": true, - "dependencies": { - "type-detect": "4.0.8" - } - }, - "node_modules/nise/node_modules/@sinonjs/fake-timers": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", - "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", - "dev": true, - "dependencies": { - "@sinonjs/commons": "^3.0.0" - } - }, - "node_modules/nise/node_modules/@sinonjs/fake-timers/node_modules/@sinonjs/commons": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.0.tgz", - "integrity": "sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA==", - "dev": true, - "dependencies": { - "type-detect": "4.0.8" - } - }, - "node_modules/nise/node_modules/path-to-regexp": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", - "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", - "dev": true, - "dependencies": { - "isarray": "0.0.1" - } - }, - "node_modules/node-addon-api": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-4.3.0.tgz", - "integrity": "sha512-73sE9+3UaLYYFmDsFZnqCInzPyh3MqIwZO9cw58yIqAZhONrrabrYyYe3TuIqtIiOuTXVhsGau8hcrhhwSsDIQ==" - }, - "node_modules/node-emoji": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-2.1.3.tgz", - "integrity": "sha512-E2WEOVsgs7O16zsURJ/eH8BqhF029wGpEOnv7Urwdo2wmQanOACwJQh0devF9D9RhoZru0+9JXIS0dBXIAz+lA==", - "dependencies": { - "@sindresorhus/is": "^4.6.0", - "char-regex": "^1.0.2", - "emojilib": "^2.4.0", - "skin-tone": "^2.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/node-fetch": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.9.tgz", - "integrity": "sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg==", - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "node_modules/node-forge": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", - "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", - "dev": true, - "engines": { - "node": ">= 6.13.0" - } - }, - "node_modules/node-gyp": { - "version": "8.4.1", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-8.4.1.tgz", - "integrity": "sha512-olTJRgUtAb/hOXG0E93wZDs5YiJlgbXxTwQAFHyNlRsXQnYzUaF2aGgujZbw+hR8aF4ZG/rST57bWMWD16jr9w==", - "optional": true, - "dependencies": { - "env-paths": "^2.2.0", - "glob": "^7.1.4", - "graceful-fs": "^4.2.6", - "make-fetch-happen": "^9.1.0", - "nopt": "^5.0.0", - "npmlog": "^6.0.0", - "rimraf": "^3.0.2", - "semver": "^7.3.5", - "tar": "^6.1.2", - "which": "^2.0.2" - }, - "bin": { - "node-gyp": "bin/node-gyp.js" - }, - "engines": { - "node": ">= 10.12.0" - } - }, - "node_modules/node-gyp/node_modules/are-we-there-yet": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz", - "integrity": "sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==", - "optional": true, - "dependencies": { - "delegates": "^1.0.0", - "readable-stream": "^3.6.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/node-gyp/node_modules/gauge": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz", - "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==", - "optional": true, - "dependencies": { - "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.3", - "console-control-strings": "^1.1.0", - "has-unicode": "^2.0.1", - "signal-exit": "^3.0.7", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wide-align": "^1.1.5" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/node-gyp/node_modules/nopt": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", - "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", - "optional": true, - "dependencies": { - "abbrev": "1" - }, - "bin": { - "nopt": "bin/nopt.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/node-gyp/node_modules/npmlog": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz", - "integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==", - "optional": true, - "dependencies": { - "are-we-there-yet": "^3.0.0", - "console-control-strings": "^1.1.0", - "gauge": "^4.0.3", - "set-blocking": "^2.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/node-gyp/node_modules/readable-stream": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.1.tgz", - "integrity": "sha512-+rQmrWMYGA90yenhTYsLWAsLsqVC8osOw6PKE1HDYiO0gdPeKe/xDHNzIAIn4C91YQ6oenEhfYqqc1883qHbjQ==", - "optional": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/node-gyp/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==", - "optional": true, - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/node-oauth1": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/node-oauth1/-/node-oauth1-1.3.0.tgz", - "integrity": "sha512-0yggixNfrA1KcBwvh/Hy2xAS1Wfs9dcg6TdFf2zN7gilcAigMdrtZ4ybrBSXBgLvGDw9V1p2MRnGBMq7XjTWLg==", - "dev": true - }, - "node_modules/node-preload": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/node-preload/-/node-preload-0.2.1.tgz", - "integrity": "sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==", - "dev": true, - "dependencies": { - "process-on-spawn": "^1.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/node-releases": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.10.tgz", - "integrity": "sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==", - "dev": true - }, - "node_modules/nodemailer": { - "version": "6.9.8", - "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.9.8.tgz", - "integrity": "sha512-cfrYUk16e67Ks051i4CntM9kshRYei1/o/Gi8K1d+R34OIs21xdFnW7Pt7EucmVKA0LKtqUGNcjMZ7ehjl49mQ==", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/nodemailer-fetch": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/nodemailer-fetch/-/nodemailer-fetch-1.6.0.tgz", - "integrity": "sha512-P7S5CEVGAmDrrpn351aXOLYs1R/7fD5NamfMCHyi6WIkbjS2eeZUB/TkuvpOQr0bvRZicVqo59+8wbhR3yrJbQ==" - }, - "node_modules/nodemailer-shared": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/nodemailer-shared/-/nodemailer-shared-1.1.0.tgz", - "integrity": "sha512-68xW5LSyPWv8R0GLm6veAvm7E+XFXkVgvE3FW0FGxNMMZqMkPFeGDVALfR1DPdSfcoO36PnW7q5AAOgFImEZGg==", - "dependencies": { - "nodemailer-fetch": "1.6.0" - } - }, - "node_modules/nodemailer-smtp-transport": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/nodemailer-smtp-transport/-/nodemailer-smtp-transport-2.7.4.tgz", - "integrity": "sha512-1e86YhJ633OZWk3OHWS5TpuoYXG/LtY2/RzNiB5+EkFifDdqHCNHBnExd5cobx0ZSHJLNGM8EKnDuHRFIjFi6Q==", - "dependencies": { - "nodemailer-shared": "1.1.0", - "nodemailer-wellknown": "0.1.10", - "smtp-connection": "2.12.0" - } - }, - "node_modules/nodemailer-wellknown": { - "version": "0.1.10", - "resolved": "https://registry.npmjs.org/nodemailer-wellknown/-/nodemailer-wellknown-0.1.10.tgz", - "integrity": "sha512-/VV4mjAEjfm2fn0loUvrpjvugw5rgurNjPO4WU24CuVSoeumsyLOTgaEWG8WoGdPxh1biOAp5JxDoy1hlA2zsw==" - }, - "node_modules/nopt": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-6.0.0.tgz", - "integrity": "sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==", - "dev": true, - "dependencies": { - "abbrev": "^1.0.0" - }, - "bin": { - "nopt": "bin/nopt.js" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/normalize-package-data": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-6.0.0.tgz", - "integrity": "sha512-UL7ELRVxYBHBgYEtZCXjxuD5vPxnmvMGq0jp/dGPKKrN7tfsBh2IY7TlJ15WWwdjRWD3RJbnsygUurTK3xkPkg==", - "dependencies": { - "hosted-git-info": "^7.0.0", - "is-core-module": "^2.8.1", - "semver": "^7.3.5", - "validate-npm-package-license": "^3.0.4" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "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/normalize-url": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.0.0.tgz", - "integrity": "sha512-uVFpKhj5MheNBJRTiMZ9pE/7hD1QTeEvugSJW/OmLzAp78PB5O6adfMNTvmfKhXBkvCzC+rqifWcVYpGFwTjnw==", - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/npm": { - "version": "10.2.5", - "resolved": "https://registry.npmjs.org/npm/-/npm-10.2.5.tgz", - "integrity": "sha512-lXdZ7titEN8CH5YJk9C/aYRU9JeDxQ4d8rwIIDsvH3SMjLjHTukB2CFstMiB30zXs4vCrPN2WH6cDq1yHBeJAw==", - "bundleDependencies": [ - "@isaacs/string-locale-compare", - "@npmcli/arborist", - "@npmcli/config", - "@npmcli/fs", - "@npmcli/map-workspaces", - "@npmcli/package-json", - "@npmcli/promise-spawn", - "@npmcli/run-script", - "@sigstore/tuf", - "abbrev", - "archy", - "cacache", - "chalk", - "ci-info", - "cli-columns", - "cli-table3", - "columnify", - "fastest-levenshtein", - "fs-minipass", - "glob", - "graceful-fs", - "hosted-git-info", - "ini", - "init-package-json", - "is-cidr", - "json-parse-even-better-errors", - "libnpmaccess", - "libnpmdiff", - "libnpmexec", - "libnpmfund", - "libnpmhook", - "libnpmorg", - "libnpmpack", - "libnpmpublish", - "libnpmsearch", - "libnpmteam", - "libnpmversion", - "make-fetch-happen", - "minimatch", - "minipass", - "minipass-pipeline", - "ms", - "node-gyp", - "nopt", - "normalize-package-data", - "npm-audit-report", - "npm-install-checks", - "npm-package-arg", - "npm-pick-manifest", - "npm-profile", - "npm-registry-fetch", - "npm-user-validate", - "npmlog", - "p-map", - "pacote", - "parse-conflict-json", - "proc-log", - "qrcode-terminal", - "read", - "semver", - "spdx-expression-parse", - "ssri", - "strip-ansi", - "supports-color", - "tar", - "text-table", - "tiny-relative-date", - "treeverse", - "validate-npm-package-name", - "which", - "write-file-atomic" - ], - "dependencies": { - "@isaacs/string-locale-compare": "^1.1.0", - "@npmcli/arborist": "^7.2.1", - "@npmcli/config": "^8.0.2", - "@npmcli/fs": "^3.1.0", - "@npmcli/map-workspaces": "^3.0.4", - "@npmcli/package-json": "^5.0.0", - "@npmcli/promise-spawn": "^7.0.0", - "@npmcli/run-script": "^7.0.2", - "@sigstore/tuf": "^2.2.0", - "abbrev": "^2.0.0", - "archy": "~1.0.0", - "cacache": "^18.0.1", - "chalk": "^5.3.0", - "ci-info": "^4.0.0", - "cli-columns": "^4.0.0", - "cli-table3": "^0.6.3", - "columnify": "^1.6.0", - "fastest-levenshtein": "^1.0.16", - "fs-minipass": "^3.0.3", - "glob": "^10.3.10", - "graceful-fs": "^4.2.11", - "hosted-git-info": "^7.0.1", - "ini": "^4.1.1", - "init-package-json": "^6.0.0", - "is-cidr": "^5.0.3", - "json-parse-even-better-errors": "^3.0.1", - "libnpmaccess": "^8.0.1", - "libnpmdiff": "^6.0.3", - "libnpmexec": "^7.0.4", - "libnpmfund": "^5.0.1", - "libnpmhook": "^10.0.0", - "libnpmorg": "^6.0.1", - "libnpmpack": "^6.0.3", - "libnpmpublish": "^9.0.2", - "libnpmsearch": "^7.0.0", - "libnpmteam": "^6.0.0", - "libnpmversion": "^5.0.1", - "make-fetch-happen": "^13.0.0", - "minimatch": "^9.0.3", - "minipass": "^7.0.4", - "minipass-pipeline": "^1.2.4", - "ms": "^2.1.2", - "node-gyp": "^10.0.1", - "nopt": "^7.2.0", - "normalize-package-data": "^6.0.0", - "npm-audit-report": "^5.0.0", - "npm-install-checks": "^6.3.0", - "npm-package-arg": "^11.0.1", - "npm-pick-manifest": "^9.0.0", - "npm-profile": "^9.0.0", - "npm-registry-fetch": "^16.1.0", - "npm-user-validate": "^2.0.0", - "npmlog": "^7.0.1", - "p-map": "^4.0.0", - "pacote": "^17.0.5", - "parse-conflict-json": "^3.0.1", - "proc-log": "^3.0.0", - "qrcode-terminal": "^0.12.0", - "read": "^2.1.0", - "semver": "^7.5.4", - "spdx-expression-parse": "^3.0.1", - "ssri": "^10.0.5", - "strip-ansi": "^7.1.0", - "supports-color": "^9.4.0", - "tar": "^6.2.0", - "text-table": "~0.2.0", - "tiny-relative-date": "^1.3.0", - "treeverse": "^3.0.0", - "validate-npm-package-name": "^5.0.0", - "which": "^4.0.0", - "write-file-atomic": "^5.0.1" - }, - "bin": { - "npm": "bin/npm-cli.js", - "npx": "bin/npx-cli.js" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "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==", - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/@colors/colors": { - "version": "1.5.0", - "inBundle": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=0.1.90" - } - }, - "node_modules/npm/node_modules/@isaacs/cliui": { - "version": "8.0.2", - "inBundle": true, - "license": "ISC", - "dependencies": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/npm/node_modules/@isaacs/cliui/node_modules/emoji-regex": { - "version": "9.2.2", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/@isaacs/cliui/node_modules/string-width": { - "version": "5.1.2", - "inBundle": true, - "license": "MIT", - "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/npm/node_modules/@isaacs/string-locale-compare": { - "version": "1.1.0", - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/@npmcli/agent": { - "version": "2.2.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "agent-base": "^7.1.0", - "http-proxy-agent": "^7.0.0", - "https-proxy-agent": "^7.0.1", - "lru-cache": "^10.0.1", - "socks-proxy-agent": "^8.0.1" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/@npmcli/arborist": { - "version": "7.2.2", - "inBundle": true, - "license": "ISC", - "dependencies": { - "@isaacs/string-locale-compare": "^1.1.0", - "@npmcli/fs": "^3.1.0", - "@npmcli/installed-package-contents": "^2.0.2", - "@npmcli/map-workspaces": "^3.0.2", - "@npmcli/metavuln-calculator": "^7.0.0", - "@npmcli/name-from-folder": "^2.0.0", - "@npmcli/node-gyp": "^3.0.0", - "@npmcli/package-json": "^5.0.0", - "@npmcli/query": "^3.0.1", - "@npmcli/run-script": "^7.0.2", - "bin-links": "^4.0.1", - "cacache": "^18.0.0", - "common-ancestor-path": "^1.0.1", - "hosted-git-info": "^7.0.1", - "json-parse-even-better-errors": "^3.0.0", - "json-stringify-nice": "^1.1.4", - "minimatch": "^9.0.0", - "nopt": "^7.0.0", - "npm-install-checks": "^6.2.0", - "npm-package-arg": "^11.0.1", - "npm-pick-manifest": "^9.0.0", - "npm-registry-fetch": "^16.0.0", - "npmlog": "^7.0.1", - "pacote": "^17.0.4", - "parse-conflict-json": "^3.0.0", - "proc-log": "^3.0.0", - "promise-all-reject-late": "^1.0.0", - "promise-call-limit": "^1.0.2", - "read-package-json-fast": "^3.0.2", - "semver": "^7.3.7", - "ssri": "^10.0.5", - "treeverse": "^3.0.0", - "walk-up-path": "^3.0.1" - }, - "bin": { - "arborist": "bin/index.js" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/@npmcli/config": { - "version": "8.0.3", - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/map-workspaces": "^3.0.2", - "ci-info": "^4.0.0", - "ini": "^4.1.0", - "nopt": "^7.0.0", - "proc-log": "^3.0.0", - "read-package-json-fast": "^3.0.2", - "semver": "^7.3.5", - "walk-up-path": "^3.0.1" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/@npmcli/disparity-colors": { - "version": "3.0.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "ansi-styles": "^4.3.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/@npmcli/disparity-colors/node_modules/ansi-styles": { - "version": "4.3.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/npm/node_modules/@npmcli/fs": { - "version": "3.1.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "semver": "^7.3.5" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/@npmcli/git": { - "version": "5.0.3", - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/promise-spawn": "^7.0.0", - "lru-cache": "^10.0.1", - "npm-pick-manifest": "^9.0.0", - "proc-log": "^3.0.0", - "promise-inflight": "^1.0.1", - "promise-retry": "^2.0.1", - "semver": "^7.3.5", - "which": "^4.0.0" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/@npmcli/installed-package-contents": { - "version": "2.0.2", - "inBundle": true, - "license": "ISC", - "dependencies": { - "npm-bundled": "^3.0.0", - "npm-normalize-package-bin": "^3.0.0" - }, - "bin": { - "installed-package-contents": "lib/index.js" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/@npmcli/map-workspaces": { - "version": "3.0.4", - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/name-from-folder": "^2.0.0", - "glob": "^10.2.2", - "minimatch": "^9.0.0", - "read-package-json-fast": "^3.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/@npmcli/metavuln-calculator": { - "version": "7.0.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "cacache": "^18.0.0", - "json-parse-even-better-errors": "^3.0.0", - "pacote": "^17.0.0", - "semver": "^7.3.5" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/@npmcli/name-from-folder": { - "version": "2.0.0", - "inBundle": true, - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/@npmcli/node-gyp": { - "version": "3.0.0", - "inBundle": true, - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/@npmcli/package-json": { - "version": "5.0.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/git": "^5.0.0", - "glob": "^10.2.2", - "hosted-git-info": "^7.0.0", - "json-parse-even-better-errors": "^3.0.0", - "normalize-package-data": "^6.0.0", - "proc-log": "^3.0.0", - "semver": "^7.5.3" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/@npmcli/promise-spawn": { - "version": "7.0.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "which": "^4.0.0" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/@npmcli/query": { - "version": "3.0.1", - "inBundle": true, - "license": "ISC", - "dependencies": { - "postcss-selector-parser": "^6.0.10" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/@npmcli/run-script": { - "version": "7.0.2", - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/node-gyp": "^3.0.0", - "@npmcli/promise-spawn": "^7.0.0", - "node-gyp": "^10.0.0", - "read-package-json-fast": "^3.0.0", - "which": "^4.0.0" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "inBundle": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/npm/node_modules/@sigstore/bundle": { - "version": "2.1.0", - "inBundle": true, - "license": "Apache-2.0", - "dependencies": { - "@sigstore/protobuf-specs": "^0.2.1" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/@sigstore/protobuf-specs": { - "version": "0.2.1", - "inBundle": true, - "license": "Apache-2.0", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/@sigstore/sign": { - "version": "2.2.0", - "inBundle": true, - "license": "Apache-2.0", - "dependencies": { - "@sigstore/bundle": "^2.1.0", - "@sigstore/protobuf-specs": "^0.2.1", - "make-fetch-happen": "^13.0.0" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/@sigstore/tuf": { - "version": "2.2.0", - "inBundle": true, - "license": "Apache-2.0", - "dependencies": { - "@sigstore/protobuf-specs": "^0.2.1", - "tuf-js": "^2.1.0" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/@tufjs/canonical-json": { - "version": "2.0.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/@tufjs/models": { - "version": "2.0.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "@tufjs/canonical-json": "2.0.0", - "minimatch": "^9.0.3" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/abbrev": { - "version": "2.0.0", - "inBundle": true, - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/abort-controller": { - "version": "3.0.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "event-target-shim": "^5.0.0" - }, - "engines": { - "node": ">=6.5" - } - }, - "node_modules/npm/node_modules/agent-base": { - "version": "7.1.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/npm/node_modules/aggregate-error": { - "version": "3.1.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/ansi-regex": { - "version": "6.0.1", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/npm/node_modules/ansi-styles": { - "version": "6.2.1", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/npm/node_modules/aproba": { - "version": "2.0.0", - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/archy": { - "version": "1.0.0", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/are-we-there-yet": { - "version": "4.0.1", - "inBundle": true, - "license": "ISC", - "dependencies": { - "delegates": "^1.0.0", - "readable-stream": "^4.1.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/balanced-match": { - "version": "1.0.2", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/base64-js": { - "version": "1.5.1", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/bin-links": { - "version": "4.0.3", - "inBundle": true, - "license": "ISC", - "dependencies": { - "cmd-shim": "^6.0.0", - "npm-normalize-package-bin": "^3.0.0", - "read-cmd-shim": "^4.0.0", - "write-file-atomic": "^5.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/binary-extensions": { - "version": "2.2.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/brace-expansion": { - "version": "2.0.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/npm/node_modules/buffer": { - "version": "6.0.3", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "inBundle": true, - "license": "MIT", - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, - "node_modules/npm/node_modules/builtins": { - "version": "5.0.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "semver": "^7.0.0" - } - }, - "node_modules/npm/node_modules/cacache": { - "version": "18.0.1", - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/fs": "^3.1.0", - "fs-minipass": "^3.0.0", - "glob": "^10.2.2", - "lru-cache": "^10.0.1", - "minipass": "^7.0.3", - "minipass-collect": "^2.0.1", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "p-map": "^4.0.0", - "ssri": "^10.0.0", - "tar": "^6.1.11", - "unique-filename": "^3.0.0" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/chalk": { - "version": "5.3.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/npm/node_modules/chownr": { - "version": "2.0.0", - "inBundle": true, - "license": "ISC", - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/ci-info": { - "version": "4.0.0", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/cidr-regex": { - "version": "4.0.3", - "inBundle": true, - "license": "BSD-2-Clause", - "dependencies": { - "ip-regex": "^5.0.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/npm/node_modules/clean-stack": { - "version": "2.2.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/npm/node_modules/cli-columns": { - "version": "4.0.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/npm/node_modules/cli-columns/node_modules/ansi-regex": { - "version": "5.0.1", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/cli-columns/node_modules/strip-ansi": { - "version": "6.0.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/cli-table3": { - "version": "0.6.3", - "inBundle": true, - "license": "MIT", - "dependencies": { - "string-width": "^4.2.0" - }, - "engines": { - "node": "10.* || >= 12.*" - }, - "optionalDependencies": { - "@colors/colors": "1.5.0" - } - }, - "node_modules/npm/node_modules/clone": { - "version": "1.0.4", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=0.8" - } - }, - "node_modules/npm/node_modules/cmd-shim": { - "version": "6.0.2", - "inBundle": true, - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/color-convert": { - "version": "2.0.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/npm/node_modules/color-name": { - "version": "1.1.4", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/color-support": { - "version": "1.1.3", - "inBundle": true, - "license": "ISC", - "bin": { - "color-support": "bin.js" - } - }, - "node_modules/npm/node_modules/columnify": { - "version": "1.6.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "strip-ansi": "^6.0.1", - "wcwidth": "^1.0.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/npm/node_modules/columnify/node_modules/ansi-regex": { - "version": "5.0.1", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/columnify/node_modules/strip-ansi": { - "version": "6.0.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/common-ancestor-path": { - "version": "1.0.1", - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/console-control-strings": { - "version": "1.1.0", - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/cross-spawn": { - "version": "7.0.3", - "inBundle": true, - "license": "MIT", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/npm/node_modules/cross-spawn/node_modules/which": { - "version": "2.0.2", - "inBundle": true, - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/npm/node_modules/cssesc": { - "version": "3.0.0", - "inBundle": true, - "license": "MIT", - "bin": { - "cssesc": "bin/cssesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/npm/node_modules/debug": { - "version": "4.3.4", - "inBundle": true, - "license": "MIT", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/npm/node_modules/debug/node_modules/ms": { - "version": "2.1.2", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/defaults": { - "version": "1.0.4", - "inBundle": true, - "license": "MIT", - "dependencies": { - "clone": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/npm/node_modules/delegates": { - "version": "1.0.0", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/diff": { - "version": "5.1.0", - "inBundle": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/npm/node_modules/eastasianwidth": { - "version": "0.2.0", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/emoji-regex": { - "version": "8.0.0", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/encoding": { - "version": "0.1.13", - "inBundle": true, - "license": "MIT", - "optional": true, - "dependencies": { - "iconv-lite": "^0.6.2" - } - }, - "node_modules/npm/node_modules/env-paths": { - "version": "2.2.1", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/npm/node_modules/err-code": { - "version": "2.0.3", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/event-target-shim": { - "version": "5.0.1", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/npm/node_modules/events": { - "version": "3.3.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=0.8.x" - } - }, - "node_modules/npm/node_modules/exponential-backoff": { - "version": "3.1.1", - "inBundle": true, - "license": "Apache-2.0" - }, - "node_modules/npm/node_modules/fastest-levenshtein": { - "version": "1.0.16", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 4.9.1" - } - }, - "node_modules/npm/node_modules/foreground-child": { - "version": "3.1.1", - "inBundle": true, - "license": "ISC", - "dependencies": { - "cross-spawn": "^7.0.0", - "signal-exit": "^4.0.1" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/npm/node_modules/fs-minipass": { - "version": "3.0.3", - "inBundle": true, - "license": "ISC", - "dependencies": { - "minipass": "^7.0.3" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/function-bind": { - "version": "1.1.2", - "inBundle": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/npm/node_modules/gauge": { - "version": "5.0.1", - "inBundle": true, - "license": "ISC", - "dependencies": { - "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.3", - "console-control-strings": "^1.1.0", - "has-unicode": "^2.0.1", - "signal-exit": "^4.0.1", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wide-align": "^1.1.5" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/gauge/node_modules/ansi-regex": { - "version": "5.0.1", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/gauge/node_modules/strip-ansi": { - "version": "6.0.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/glob": { - "version": "10.3.10", - "inBundle": true, - "license": "ISC", - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^2.3.5", - "minimatch": "^9.0.1", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", - "path-scurry": "^1.10.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/npm/node_modules/graceful-fs": { - "version": "4.2.11", - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/has-unicode": { - "version": "2.0.1", - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/hasown": { - "version": "2.0.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/npm/node_modules/hosted-git-info": { - "version": "7.0.1", - "inBundle": true, - "license": "ISC", - "dependencies": { - "lru-cache": "^10.0.1" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/http-cache-semantics": { - "version": "4.1.1", - "inBundle": true, - "license": "BSD-2-Clause" - }, - "node_modules/npm/node_modules/http-proxy-agent": { - "version": "7.0.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "agent-base": "^7.1.0", - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/npm/node_modules/https-proxy-agent": { - "version": "7.0.2", - "inBundle": true, - "license": "MIT", - "dependencies": { - "agent-base": "^7.0.2", - "debug": "4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/npm/node_modules/iconv-lite": { - "version": "0.6.3", - "inBundle": true, - "license": "MIT", - "optional": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/npm/node_modules/ieee754": { - "version": "1.2.1", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "inBundle": true, - "license": "BSD-3-Clause" - }, - "node_modules/npm/node_modules/ignore-walk": { - "version": "6.0.4", - "inBundle": true, - "license": "ISC", - "dependencies": { - "minimatch": "^9.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/imurmurhash": { - "version": "0.1.4", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/npm/node_modules/indent-string": { - "version": "4.0.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/ini": { - "version": "4.1.1", - "inBundle": true, - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/init-package-json": { - "version": "6.0.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "npm-package-arg": "^11.0.0", - "promzard": "^1.0.0", - "read": "^2.0.0", - "read-package-json": "^7.0.0", - "semver": "^7.3.5", - "validate-npm-package-license": "^3.0.4", - "validate-npm-package-name": "^5.0.0" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/ip": { - "version": "2.0.0", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/ip-regex": { - "version": "5.0.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/npm/node_modules/is-cidr": { - "version": "5.0.3", - "inBundle": true, - "license": "BSD-2-Clause", - "dependencies": { - "cidr-regex": "4.0.3" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/npm/node_modules/is-core-module": { - "version": "2.13.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "hasown": "^2.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/npm/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/is-lambda": { - "version": "1.0.1", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/isexe": { - "version": "2.0.0", - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/jackspeak": { - "version": "2.3.6", - "inBundle": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" - } - }, - "node_modules/npm/node_modules/json-parse-even-better-errors": { - "version": "3.0.1", - "inBundle": true, - "license": "MIT", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/json-stringify-nice": { - "version": "1.1.4", - "inBundle": true, - "license": "ISC", - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/npm/node_modules/jsonparse": { - "version": "1.3.1", - "engines": [ - "node >= 0.2.0" - ], - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/just-diff": { - "version": "6.0.2", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/just-diff-apply": { - "version": "5.5.0", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/libnpmaccess": { - "version": "8.0.2", - "inBundle": true, - "license": "ISC", - "dependencies": { - "npm-package-arg": "^11.0.1", - "npm-registry-fetch": "^16.0.0" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/libnpmdiff": { - "version": "6.0.4", - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/arborist": "^7.2.1", - "@npmcli/disparity-colors": "^3.0.0", - "@npmcli/installed-package-contents": "^2.0.2", - "binary-extensions": "^2.2.0", - "diff": "^5.1.0", - "minimatch": "^9.0.0", - "npm-package-arg": "^11.0.1", - "pacote": "^17.0.4", - "tar": "^6.2.0" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/libnpmexec": { - "version": "7.0.5", - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/arborist": "^7.2.1", - "@npmcli/run-script": "^7.0.2", - "ci-info": "^4.0.0", - "npm-package-arg": "^11.0.1", - "npmlog": "^7.0.1", - "pacote": "^17.0.4", - "proc-log": "^3.0.0", - "read": "^2.0.0", - "read-package-json-fast": "^3.0.2", - "semver": "^7.3.7", - "walk-up-path": "^3.0.1" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/libnpmfund": { - "version": "5.0.2", - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/arborist": "^7.2.1" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/libnpmhook": { - "version": "10.0.1", - "inBundle": true, - "license": "ISC", - "dependencies": { - "aproba": "^2.0.0", - "npm-registry-fetch": "^16.0.0" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/libnpmorg": { - "version": "6.0.2", - "inBundle": true, - "license": "ISC", - "dependencies": { - "aproba": "^2.0.0", - "npm-registry-fetch": "^16.0.0" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/libnpmpack": { - "version": "6.0.4", - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/arborist": "^7.2.1", - "@npmcli/run-script": "^7.0.2", - "npm-package-arg": "^11.0.1", - "pacote": "^17.0.4" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/libnpmpublish": { - "version": "9.0.3", - "inBundle": true, - "license": "ISC", - "dependencies": { - "ci-info": "^4.0.0", - "normalize-package-data": "^6.0.0", - "npm-package-arg": "^11.0.1", - "npm-registry-fetch": "^16.0.0", - "proc-log": "^3.0.0", - "semver": "^7.3.7", - "sigstore": "^2.1.0", - "ssri": "^10.0.5" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/libnpmsearch": { - "version": "7.0.1", - "inBundle": true, - "license": "ISC", - "dependencies": { - "npm-registry-fetch": "^16.0.0" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/libnpmteam": { - "version": "6.0.1", - "inBundle": true, - "license": "ISC", - "dependencies": { - "aproba": "^2.0.0", - "npm-registry-fetch": "^16.0.0" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/libnpmversion": { - "version": "5.0.2", - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/git": "^5.0.3", - "@npmcli/run-script": "^7.0.2", - "json-parse-even-better-errors": "^3.0.0", - "proc-log": "^3.0.0", - "semver": "^7.3.7" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/lru-cache": { - "version": "10.1.0", - "inBundle": true, - "license": "ISC", - "engines": { - "node": "14 || >=16.14" - } - }, - "node_modules/npm/node_modules/make-fetch-happen": { - "version": "13.0.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/agent": "^2.0.0", - "cacache": "^18.0.0", - "http-cache-semantics": "^4.1.1", - "is-lambda": "^1.0.1", - "minipass": "^7.0.2", - "minipass-fetch": "^3.0.0", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.3", - "promise-retry": "^2.0.1", - "ssri": "^10.0.0" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/minimatch": { - "version": "9.0.3", - "inBundle": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/npm/node_modules/minipass": { - "version": "7.0.4", - "inBundle": true, - "license": "ISC", - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/npm/node_modules/minipass-collect": { - "version": "2.0.1", - "inBundle": true, - "license": "ISC", - "dependencies": { - "minipass": "^7.0.3" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/npm/node_modules/minipass-fetch": { - "version": "3.0.4", - "inBundle": true, - "license": "MIT", - "dependencies": { - "minipass": "^7.0.3", - "minipass-sized": "^1.0.3", - "minizlib": "^2.1.2" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - }, - "optionalDependencies": { - "encoding": "^0.1.13" - } - }, - "node_modules/npm/node_modules/minipass-flush": { - "version": "1.0.5", - "inBundle": true, - "license": "ISC", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/npm/node_modules/minipass-flush/node_modules/minipass": { - "version": "3.3.6", - "inBundle": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/minipass-json-stream": { - "version": "1.0.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "jsonparse": "^1.3.1", - "minipass": "^3.0.0" - } - }, - "node_modules/npm/node_modules/minipass-json-stream/node_modules/minipass": { - "version": "3.3.6", - "inBundle": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/minipass-pipeline": { - "version": "1.2.4", - "inBundle": true, - "license": "ISC", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/minipass-pipeline/node_modules/minipass": { - "version": "3.3.6", - "inBundle": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/minipass-sized": { - "version": "1.0.3", - "inBundle": true, - "license": "ISC", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/minipass-sized/node_modules/minipass": { - "version": "3.3.6", - "inBundle": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/minizlib": { - "version": "2.1.2", - "inBundle": true, - "license": "MIT", - "dependencies": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/npm/node_modules/minizlib/node_modules/minipass": { - "version": "3.3.6", - "inBundle": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/mkdirp": { - "version": "1.0.4", - "inBundle": true, - "license": "MIT", - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/ms": { - "version": "2.1.3", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/mute-stream": { - "version": "1.0.0", - "inBundle": true, - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/negotiator": { - "version": "0.6.3", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/npm/node_modules/node-gyp": { - "version": "10.0.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "env-paths": "^2.2.0", - "exponential-backoff": "^3.1.1", - "glob": "^10.3.10", - "graceful-fs": "^4.2.6", - "make-fetch-happen": "^13.0.0", - "nopt": "^7.0.0", - "proc-log": "^3.0.0", - "semver": "^7.3.5", - "tar": "^6.1.2", - "which": "^4.0.0" - }, - "bin": { - "node-gyp": "bin/node-gyp.js" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/nopt": { - "version": "7.2.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "abbrev": "^2.0.0" - }, - "bin": { - "nopt": "bin/nopt.js" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/normalize-package-data": { - "version": "6.0.0", - "inBundle": true, - "license": "BSD-2-Clause", - "dependencies": { - "hosted-git-info": "^7.0.0", - "is-core-module": "^2.8.1", - "semver": "^7.3.5", - "validate-npm-package-license": "^3.0.4" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/npm-audit-report": { - "version": "5.0.0", - "inBundle": true, - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/npm-bundled": { - "version": "3.0.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "npm-normalize-package-bin": "^3.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/npm-install-checks": { - "version": "6.3.0", - "inBundle": true, - "license": "BSD-2-Clause", - "dependencies": { - "semver": "^7.1.1" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/npm-normalize-package-bin": { - "version": "3.0.1", - "inBundle": true, - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/npm-package-arg": { - "version": "11.0.1", - "inBundle": true, - "license": "ISC", - "dependencies": { - "hosted-git-info": "^7.0.0", - "proc-log": "^3.0.0", - "semver": "^7.3.5", - "validate-npm-package-name": "^5.0.0" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/npm-packlist": { - "version": "8.0.1", - "inBundle": true, - "license": "ISC", - "dependencies": { - "ignore-walk": "^6.0.4" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/npm-pick-manifest": { - "version": "9.0.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "npm-install-checks": "^6.0.0", - "npm-normalize-package-bin": "^3.0.0", - "npm-package-arg": "^11.0.0", - "semver": "^7.3.5" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/npm-profile": { - "version": "9.0.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "npm-registry-fetch": "^16.0.0", - "proc-log": "^3.0.0" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/npm-registry-fetch": { - "version": "16.1.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "make-fetch-happen": "^13.0.0", - "minipass": "^7.0.2", - "minipass-fetch": "^3.0.0", - "minipass-json-stream": "^1.0.1", - "minizlib": "^2.1.2", - "npm-package-arg": "^11.0.0", - "proc-log": "^3.0.0" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/npm-user-validate": { - "version": "2.0.0", - "inBundle": true, - "license": "BSD-2-Clause", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/npmlog": { - "version": "7.0.1", - "inBundle": true, - "license": "ISC", - "dependencies": { - "are-we-there-yet": "^4.0.0", - "console-control-strings": "^1.1.0", - "gauge": "^5.0.0", - "set-blocking": "^2.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/p-map": { - "version": "4.0.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "aggregate-error": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/npm/node_modules/pacote": { - "version": "17.0.5", - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/git": "^5.0.0", - "@npmcli/installed-package-contents": "^2.0.1", - "@npmcli/promise-spawn": "^7.0.0", - "@npmcli/run-script": "^7.0.0", - "cacache": "^18.0.0", - "fs-minipass": "^3.0.0", - "minipass": "^7.0.2", - "npm-package-arg": "^11.0.0", - "npm-packlist": "^8.0.0", - "npm-pick-manifest": "^9.0.0", - "npm-registry-fetch": "^16.0.0", - "proc-log": "^3.0.0", - "promise-retry": "^2.0.1", - "read-package-json": "^7.0.0", - "read-package-json-fast": "^3.0.0", - "sigstore": "^2.0.0", - "ssri": "^10.0.0", - "tar": "^6.1.11" - }, - "bin": { - "pacote": "lib/bin.js" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/parse-conflict-json": { - "version": "3.0.1", - "inBundle": true, - "license": "ISC", - "dependencies": { - "json-parse-even-better-errors": "^3.0.0", - "just-diff": "^6.0.0", - "just-diff-apply": "^5.2.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/path-key": { - "version": "3.1.1", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/path-scurry": { - "version": "1.10.1", - "inBundle": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "lru-cache": "^9.1.1 || ^10.0.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/npm/node_modules/postcss-selector-parser": { - "version": "6.0.13", - "inBundle": true, - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/npm/node_modules/proc-log": { - "version": "3.0.0", - "inBundle": true, - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/process": { - "version": "0.11.10", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 0.6.0" - } - }, - "node_modules/npm/node_modules/promise-all-reject-late": { - "version": "1.0.1", - "inBundle": true, - "license": "ISC", - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/npm/node_modules/promise-call-limit": { - "version": "1.0.2", - "inBundle": true, - "license": "ISC", - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/npm/node_modules/promise-inflight": { - "version": "1.0.1", - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/promise-retry": { - "version": "2.0.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "err-code": "^2.0.2", - "retry": "^0.12.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/promzard": { - "version": "1.0.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "read": "^2.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/qrcode-terminal": { - "version": "0.12.0", - "inBundle": true, - "bin": { - "qrcode-terminal": "bin/qrcode-terminal.js" - } - }, - "node_modules/npm/node_modules/read": { - "version": "2.1.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "mute-stream": "~1.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/read-cmd-shim": { - "version": "4.0.0", - "inBundle": true, - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/read-package-json": { - "version": "7.0.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "glob": "^10.2.2", - "json-parse-even-better-errors": "^3.0.0", - "normalize-package-data": "^6.0.0", - "npm-normalize-package-bin": "^3.0.0" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/read-package-json-fast": { - "version": "3.0.2", - "inBundle": true, - "license": "ISC", - "dependencies": { - "json-parse-even-better-errors": "^3.0.0", - "npm-normalize-package-bin": "^3.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/readable-stream": { - "version": "4.4.2", - "inBundle": true, - "license": "MIT", - "dependencies": { - "abort-controller": "^3.0.0", - "buffer": "^6.0.3", - "events": "^3.3.0", - "process": "^0.11.10", - "string_decoder": "^1.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/retry": { - "version": "0.12.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/npm/node_modules/safe-buffer": { - "version": "5.2.1", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/safer-buffer": { - "version": "2.1.2", - "inBundle": true, - "license": "MIT", - "optional": true - }, - "node_modules/npm/node_modules/semver": { - "version": "7.5.4", - "inBundle": true, - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/semver/node_modules/lru-cache": { - "version": "6.0.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/set-blocking": { - "version": "2.0.0", - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/shebang-command": { - "version": "2.0.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/shebang-regex": { - "version": "3.0.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/signal-exit": { - "version": "4.1.0", - "inBundle": true, - "license": "ISC", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/npm/node_modules/sigstore": { - "version": "2.1.0", - "inBundle": true, - "license": "Apache-2.0", - "dependencies": { - "@sigstore/bundle": "^2.1.0", - "@sigstore/protobuf-specs": "^0.2.1", - "@sigstore/sign": "^2.1.0", - "@sigstore/tuf": "^2.1.0" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/smart-buffer": { - "version": "4.2.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 6.0.0", - "npm": ">= 3.0.0" - } - }, - "node_modules/npm/node_modules/socks": { - "version": "2.7.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "ip": "^2.0.0", - "smart-buffer": "^4.2.0" - }, - "engines": { - "node": ">= 10.13.0", - "npm": ">= 3.0.0" - } - }, - "node_modules/npm/node_modules/socks-proxy-agent": { - "version": "8.0.2", - "inBundle": true, - "license": "MIT", - "dependencies": { - "agent-base": "^7.0.2", - "debug": "^4.3.4", - "socks": "^2.7.1" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/npm/node_modules/spdx-correct": { - "version": "3.2.0", - "inBundle": true, - "license": "Apache-2.0", - "dependencies": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/npm/node_modules/spdx-exceptions": { - "version": "2.3.0", - "inBundle": true, - "license": "CC-BY-3.0" - }, - "node_modules/npm/node_modules/spdx-expression-parse": { - "version": "3.0.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/npm/node_modules/spdx-license-ids": { - "version": "3.0.16", - "inBundle": true, - "license": "CC0-1.0" - }, - "node_modules/npm/node_modules/ssri": { - "version": "10.0.5", - "inBundle": true, - "license": "ISC", - "dependencies": { - "minipass": "^7.0.3" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/string_decoder": { - "version": "1.3.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/npm/node_modules/string-width": { - "version": "4.2.3", - "inBundle": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/string-width-cjs": { - "name": "string-width", - "version": "4.2.3", - "inBundle": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/string-width-cjs/node_modules/ansi-regex": { - "version": "5.0.1", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/string-width-cjs/node_modules/strip-ansi": { - "version": "6.0.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/string-width/node_modules/ansi-regex": { - "version": "5.0.1", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/string-width/node_modules/strip-ansi": { - "version": "6.0.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/strip-ansi": { - "version": "7.1.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/npm/node_modules/strip-ansi-cjs": { - "name": "strip-ansi", - "version": "6.0.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/strip-ansi-cjs/node_modules/ansi-regex": { - "version": "5.0.1", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/supports-color": { - "version": "9.4.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/npm/node_modules/tar": { - "version": "6.2.0", - "inBundle": true, - "license": "ISC", - "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/npm/node_modules/tar/node_modules/fs-minipass": { - "version": "2.1.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/npm/node_modules/tar/node_modules/fs-minipass/node_modules/minipass": { - "version": "3.3.6", - "inBundle": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/tar/node_modules/minipass": { - "version": "5.0.0", - "inBundle": true, - "license": "ISC", - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/text-table": { - "version": "0.2.0", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/tiny-relative-date": { - "version": "1.3.0", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/treeverse": { - "version": "3.0.0", - "inBundle": true, - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/tuf-js": { - "version": "2.1.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "@tufjs/models": "2.0.0", - "debug": "^4.3.4", - "make-fetch-happen": "^13.0.0" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/unique-filename": { - "version": "3.0.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "unique-slug": "^4.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/unique-slug": { - "version": "4.0.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "imurmurhash": "^0.1.4" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/util-deprecate": { - "version": "1.0.2", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/validate-npm-package-license": { - "version": "3.0.4", - "inBundle": true, - "license": "Apache-2.0", - "dependencies": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "node_modules/npm/node_modules/validate-npm-package-name": { - "version": "5.0.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "builtins": "^5.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/walk-up-path": { - "version": "3.0.1", - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/wcwidth": { - "version": "1.0.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "defaults": "^1.0.3" - } - }, - "node_modules/npm/node_modules/which": { - "version": "4.0.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "isexe": "^3.1.1" - }, - "bin": { - "node-which": "bin/which.js" - }, - "engines": { - "node": "^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/which/node_modules/isexe": { - "version": "3.1.1", - "inBundle": true, - "license": "ISC", - "engines": { - "node": ">=16" - } - }, - "node_modules/npm/node_modules/wide-align": { - "version": "1.1.5", - "inBundle": true, - "license": "ISC", - "dependencies": { - "string-width": "^1.0.2 || 2 || 3 || 4" - } - }, - "node_modules/npm/node_modules/wrap-ansi": { - "version": "8.1.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/npm/node_modules/wrap-ansi-cjs": { - "name": "wrap-ansi", - "version": "7.0.0", - "inBundle": true, - "license": "MIT", - "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/npm/node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { - "version": "5.0.1", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { - "version": "4.3.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/npm/node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { - "version": "6.0.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/wrap-ansi/node_modules/emoji-regex": { - "version": "9.2.2", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/wrap-ansi/node_modules/string-width": { - "version": "5.1.2", - "inBundle": true, - "license": "MIT", - "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/npm/node_modules/write-file-atomic": { - "version": "5.0.1", - "inBundle": true, - "license": "ISC", - "dependencies": { - "imurmurhash": "^0.1.4", - "signal-exit": "^4.0.1" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/yallist": { - "version": "4.0.0", - "inBundle": true, - "license": "ISC" - }, - "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/nyc": { - "version": "15.1.0", - "resolved": "https://registry.npmjs.org/nyc/-/nyc-15.1.0.tgz", - "integrity": "sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A==", - "dev": true, - "dependencies": { - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "caching-transform": "^4.0.0", - "convert-source-map": "^1.7.0", - "decamelize": "^1.2.0", - "find-cache-dir": "^3.2.0", - "find-up": "^4.1.0", - "foreground-child": "^2.0.0", - "get-package-type": "^0.1.0", - "glob": "^7.1.6", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-hook": "^3.0.0", - "istanbul-lib-instrument": "^4.0.0", - "istanbul-lib-processinfo": "^2.0.2", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.0.2", - "make-dir": "^3.0.0", - "node-preload": "^0.2.1", - "p-map": "^3.0.0", - "process-on-spawn": "^1.0.0", - "resolve-from": "^5.0.0", - "rimraf": "^3.0.0", - "signal-exit": "^3.0.2", - "spawn-wrap": "^2.0.0", - "test-exclude": "^6.0.0", - "yargs": "^15.0.2" - }, - "bin": { - "nyc": "bin/nyc.js" - }, - "engines": { - "node": ">=8.9" - } - }, - "node_modules/nyc/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/nyc/node_modules/cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", - "dev": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" - } - }, - "node_modules/nyc/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/nyc/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/nyc/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/nyc/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/nyc/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/nyc/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/nyc/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/nyc/node_modules/wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/nyc/node_modules/y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", - "dev": true - }, - "node_modules/nyc/node_modules/yargs": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", - "dev": true, - "dependencies": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/nyc/node_modules/yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "dev": true, - "dependencies": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", - "engines": { - "node": "*" - } - }, - "node_modules/object-assign": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.0.1.tgz", - "integrity": "sha512-c6legOHWepAbWnp3j5SRUMpxCXBKI4rD7A5Osn9IzZ8w4O/KccXdW0lqdkQKbpk0eHGjNgKihgzY6WuEq99Tfw==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-hash": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-1.3.1.tgz", - "integrity": "sha512-OSuu/pU4ENM9kmREg0BdNrUDIl1heYa4mBZacJc+vVWz4GtAwu7jO8s4AIt2aGRUTqxykpWzI3Oqnsm13tTMDA==", - "dev": true, - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/object-inspect": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", - "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.assign": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", - "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.5", - "define-properties": "^1.2.1", - "has-symbols": "^1.0.3", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.entries": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.7.tgz", - "integrity": "sha512-jCBs/0plmPsOnrKAfFQXRG2NFjlhZgjjcBLSmTnEhU8U6vVTsVe8ANeQJCHTl3gSsI4J+0emOoCgoKlmQPMgmA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.fromentries": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.7.tgz", - "integrity": "sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.groupby": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.1.tgz", - "integrity": "sha512-HqaQtqLnp/8Bn4GL16cj+CUYbnpe1bh0TtEaWvybszDG4tgxCJuRpV8VGuvNaI1fAnI4lUJzDG55MXcOH4JZcQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1" - } - }, - "node_modules/object.hasown": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.3.tgz", - "integrity": "sha512-fFI4VcYpRHvSLXxP7yiZOMAd331cPfd2p7PFDVbgUsYOfCT3tICVqXWngbjr4m49OvsBwUBQ6O2uQoJvy3RexA==", - "dev": true, - "dependencies": { - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.values": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.7.tgz", - "integrity": "sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/on-error": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/on-error/-/on-error-2.1.0.tgz", - "integrity": "sha512-wpKXxCW2wXLI+9DB9DDBVuOCN9C5rjyaP4GWwqhgrSd2ys1Vyc9yGaPmC5HSOdQ30x9zCLozi9mHx3lm01E+LQ==" - }, - "node_modules/on-exit-leak-free": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/on-exit-leak-free/-/on-exit-leak-free-2.1.2.tgz", - "integrity": "sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==", - "engines": { - "node": ">=14.0.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/on-headers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", - "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/once": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", - "integrity": "sha512-6vaNInhu+CHxtONf3zw3vq4SP2DOQhjBvIa3rNcG0+P7eKWlYH6Peu7rHizSloRU2EwMz6GraLieis9Ac9+p1w==", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "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/os": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/os/-/os-0.1.2.tgz", - "integrity": "sha512-ZoXJkvAnljwvc56MbvhtKVWmSkzV712k42Is2mA0+0KTSRakq5XXuXpjZjgAt9ctzl51ojhQWakQQpmOvXWfjQ==" - }, - "node_modules/p-each-series": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-3.0.0.tgz", - "integrity": "sha512-lastgtAdoH9YaLyDa5i5z64q+kzOcQHsQ5SsZJD3q0VEyI8mq872S3geuNbRUQLVAE9siMfgKrpj7MloKFHruw==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-filter": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-filter/-/p-filter-4.1.0.tgz", - "integrity": "sha512-37/tPdZ3oJwHaS3gNJdenCDB3Tz26i9sjhnguBtvN0vYlRIiDNnvTWkuh+0hETV9rLPdJ3rlL3yVOYPIAnM8rw==", - "dependencies": { - "p-map": "^7.0.1" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-filter/node_modules/p-map": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-7.0.1.tgz", - "integrity": "sha512-2wnaR0XL/FDOj+TgpDuRb2KTjLnu3Fma6b1ZUwGY7LcqenMcvP/YFpjpbPKY6WVGsbuJZRuoUz8iPrt8ORnAFw==", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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/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/p-map": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", - "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", - "dev": true, - "dependencies": { - "aggregate-error": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-reduce": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-reduce/-/p-reduce-3.0.0.tgz", - "integrity": "sha512-xsrIUgI0Kn6iyDYm9StOpOeK29XM1aboGji26+QEortiFST1hGZaUQOLhtEbqHErPpGW/aSz6allwK2qcptp0Q==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/package-hash": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-4.0.0.tgz", - "integrity": "sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.15", - "hasha": "^5.0.0", - "lodash.flattendeep": "^4.4.0", - "release-zalgo": "^1.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "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==", - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/parse-ms": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-2.1.0.tgz", - "integrity": "sha512-kHt7kzLoS9VBZfUsiKjv43mr91ea+U05EyKkEtqp7vNbHxmaVuEqN7XxeEVnGrMtYOAxGrDElSi96K7EgO1zCA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "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": { - "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/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==", - "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==", - "engines": { - "node": ">=8" - } - }, - "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/performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==" - }, - "node_modules/pg-connection-string": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.6.2.tgz", - "integrity": "sha512-ch6OwaeaPYcova4kKZ15sbJ2hKb/VP48ZD2gE7i1J+L4MspCtBMAx8nMgz7bksc7IojCIIWuEhHibSMFH8m8oA==" - }, - "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==", - "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/pino": { - "version": "8.17.2", - "resolved": "https://registry.npmjs.org/pino/-/pino-8.17.2.tgz", - "integrity": "sha512-LA6qKgeDMLr2ux2y/YiUt47EfgQ+S9LznBWOJdN3q1dx2sv0ziDLUBeVpyVv17TEcGCBuWf0zNtg3M5m1NhhWQ==", - "dependencies": { - "atomic-sleep": "^1.0.0", - "fast-redact": "^3.1.1", - "on-exit-leak-free": "^2.1.0", - "pino-abstract-transport": "v1.1.0", - "pino-std-serializers": "^6.0.0", - "process-warning": "^3.0.0", - "quick-format-unescaped": "^4.0.3", - "real-require": "^0.2.0", - "safe-stable-stringify": "^2.3.1", - "sonic-boom": "^3.7.0", - "thread-stream": "^2.0.0" - }, - "bin": { - "pino": "bin.js" - } - }, - "node_modules/pino-abstract-transport": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/pino-abstract-transport/-/pino-abstract-transport-1.1.0.tgz", - "integrity": "sha512-lsleG3/2a/JIWUtf9Q5gUNErBqwIu1tUKTT3dUzaf5DySw9ra1wcqKjJjLX1VTY64Wk1eEOYsVGSaGfCK85ekA==", - "dependencies": { - "readable-stream": "^4.0.0", - "split2": "^4.0.0" - } - }, - "node_modules/pino-abstract-transport/node_modules/readable-stream": { - "version": "4.5.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.5.2.tgz", - "integrity": "sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==", - "dependencies": { - "abort-controller": "^3.0.0", - "buffer": "^6.0.3", - "events": "^3.3.0", - "process": "^0.11.10", - "string_decoder": "^1.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/pino-abstract-transport/node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/pino-std-serializers": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-6.2.2.tgz", - "integrity": "sha512-cHjPPsE+vhj/tnhCy/wiMh3M3z3h/j15zHQX+S9GkTBgqJuTuJzYJ4gUyACLhDaJ7kk9ba9iRDmbH2tJU03OiA==" - }, - "node_modules/pkg-conf": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/pkg-conf/-/pkg-conf-2.1.0.tgz", - "integrity": "sha512-C+VUP+8jis7EsQZIhDYmS5qlNtjv2yP4SNtjXK9AP1ZcTRlnSfuumaTnRfYZnYgUUYVIKqL0fRvmUGDV2fmp6g==", - "dependencies": { - "find-up": "^2.0.0", - "load-json-file": "^4.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/pkg-conf/node_modules/find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==", - "dependencies": { - "locate-path": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/pkg-conf/node_modules/locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==", - "dependencies": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/pkg-conf/node_modules/p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dependencies": { - "p-try": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/pkg-conf/node_modules/p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==", - "dependencies": { - "p-limit": "^1.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/pkg-conf/node_modules/p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==", - "engines": { - "node": ">=4" - } - }, - "node_modules/pkg-conf/node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", - "engines": { - "node": ">=4" - } - }, - "node_modules/pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "dependencies": { - "find-up": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-dir/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-dir/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-dir/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pkg-dir/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pony-cause": { - "version": "2.1.10", - "resolved": "https://registry.npmjs.org/pony-cause/-/pony-cause-2.1.10.tgz", - "integrity": "sha512-3IKLNXclQgkU++2fSi93sQ6BznFuxSLB11HdvZQ6JW/spahf/P1pAHBQEahr20rs0htZW0UDkM1HmA+nZkXKsw==", - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/portscanner": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/portscanner/-/portscanner-2.2.0.tgz", - "integrity": "sha512-IFroCz/59Lqa2uBvzK3bKDbDDIEaAY8XJ1jFxcLWTqosrsc32//P4VuSB2vZXoHiHqOmx8B5L5hnKOxL/7FlPw==", - "dependencies": { - "async": "^2.6.0", - "is-number-like": "^1.0.3" - }, - "engines": { - "node": ">=0.4", - "npm": ">=1.0.0" - } - }, - "node_modules/portscanner/node_modules/async": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", - "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", - "dependencies": { - "lodash": "^4.17.14" - } - }, - "node_modules/postman-collection": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/postman-collection/-/postman-collection-4.3.0.tgz", - "integrity": "sha512-QpmNOw1JhAVQTFWRz443/qpKs4/3T1MFrKqDZ84RS1akxOzhXXr15kD8+/+jeA877qyy9rfMsrFgLe2W7aCPjw==", - "dev": true, - "dependencies": { - "@faker-js/faker": "5.5.3", - "file-type": "3.9.0", - "http-reasons": "0.1.0", - "iconv-lite": "0.6.3", - "liquid-json": "0.3.1", - "lodash": "4.17.21", - "mime-format": "2.0.1", - "mime-types": "2.1.35", - "postman-url-encoder": "3.0.5", - "semver": "7.5.4", - "uuid": "8.3.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/postman-collection-transformer": { - "version": "4.1.8", - "resolved": "https://registry.npmjs.org/postman-collection-transformer/-/postman-collection-transformer-4.1.8.tgz", - "integrity": "sha512-smJ6X7Z7kbg6hp7JZPFixrSN3J3WkQed7DrWCC5tF7IxOMpFLqhtTtGssY8nD1inP8+mJf+N72Pf2ttUAHgBKw==", - "dev": true, - "dependencies": { - "commander": "8.3.0", - "inherits": "2.0.4", - "lodash": "4.17.21", - "semver": "7.5.4", - "strip-json-comments": "3.1.1" - }, - "bin": { - "postman-collection-transformer": "bin/transform-collection.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/postman-collection-transformer/node_modules/commander": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", - "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", - "dev": true, - "engines": { - "node": ">= 12" - } - }, - "node_modules/postman-collection/node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dev": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postman-collection/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==", - "dev": true, - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/postman-request": { - "version": "2.88.1-postman.33", - "resolved": "https://registry.npmjs.org/postman-request/-/postman-request-2.88.1-postman.33.tgz", - "integrity": "sha512-uL9sCML4gPH6Z4hreDWbeinKU0p0Ke261nU7OvII95NU22HN6Dk7T/SaVPaj6T4TsQqGKIFw6/woLZnH7ugFNA==", - "dev": true, - "dependencies": { - "@postman/form-data": "~3.1.1", - "@postman/tough-cookie": "~4.1.3-postman.1", - "@postman/tunnel-agent": "^0.6.3", - "aws-sign2": "~0.7.0", - "aws4": "^1.12.0", - "brotli": "^1.3.3", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "har-validator": "~5.1.3", - "http-signature": "~1.3.1", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "^2.1.35", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.3", - "safe-buffer": "^5.1.2", - "stream-length": "^1.0.2", - "uuid": "^8.3.2" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/postman-request/node_modules/qs": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", - "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", - "dev": true, - "engines": { - "node": ">=0.6" - } - }, - "node_modules/postman-request/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==", - "dev": true, - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/postman-runtime": { - "version": "7.36.1", - "resolved": "https://registry.npmjs.org/postman-runtime/-/postman-runtime-7.36.1.tgz", - "integrity": "sha512-SarhTewd+rp2cAdC6WFDdT4No0BR3e+tzBcQWZm/o+BDBeOf0W8MQsMKs3BozLMKoKOb/ImqW0jTsa0Rewo0cg==", - "dev": true, - "dependencies": { - "@postman/tough-cookie": "4.1.3-postman.1", - "async": "3.2.5", - "aws4": "1.12.0", - "handlebars": "4.7.8", - "httpntlm": "1.8.13", - "jose": "4.14.4", - "js-sha512": "0.8.0", - "lodash": "4.17.21", - "mime-types": "2.1.35", - "node-forge": "1.3.1", - "node-oauth1": "1.3.0", - "performance-now": "2.1.0", - "postman-collection": "4.3.0", - "postman-request": "2.88.1-postman.33", - "postman-sandbox": "4.4.0", - "postman-url-encoder": "3.0.5", - "serialised-error": "1.1.3", - "strip-json-comments": "3.1.1", - "uuid": "8.3.2" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/postman-runtime/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==", - "dev": true, - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/postman-sandbox": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/postman-sandbox/-/postman-sandbox-4.4.0.tgz", - "integrity": "sha512-NvNodj44vqtZrgLvnqoqFxvqRL1Pw0MSLXGlzSu252iurmHCz59wUykNUQ8mQh0AXNM00gbN/lS1nrGfS1zqwA==", - "dev": true, - "dependencies": { - "lodash": "4.17.21", - "postman-collection": "4.3.0", - "teleport-javascript": "1.0.0", - "uvm": "2.1.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/postman-url-encoder": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/postman-url-encoder/-/postman-url-encoder-3.0.5.tgz", - "integrity": "sha512-jOrdVvzUXBC7C+9gkIkpDJ3HIxOHTIqjpQ4C1EMt1ZGeMvSEpbFCKq23DEfgsj46vMnDgyQf+1ZLp2Wm+bKSsA==", - "dev": true, - "dependencies": { - "punycode": "^2.1.1" - }, - "engines": { - "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/pretty-ms": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-7.0.1.tgz", - "integrity": "sha512-973driJZvxiGOQ5ONsFhOF/DtzPMOMtgC11kCpUrPGMTgqp2q/1gwzCquocrN33is0VZ5GFHXZYMM9l6h67v2Q==", - "dev": true, - "dependencies": { - "parse-ms": "^2.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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/process-on-spawn": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/process-on-spawn/-/process-on-spawn-1.0.0.tgz", - "integrity": "sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg==", - "dev": true, - "dependencies": { - "fromentries": "^1.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/process-warning": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-3.0.0.tgz", - "integrity": "sha512-mqn0kFRl0EoqhnL0GQ0veqFHyIN1yig9RHh/InzORTUiZHFRAur+aMtRkELNwGs9aNwKS6tg/An4NYBPGwvtzQ==" - }, - "node_modules/promise-inflight": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", - "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", - "optional": true - }, - "node_modules/promise-polyfill": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/promise-polyfill/-/promise-polyfill-2.1.4.tgz", - "integrity": "sha512-/DVUJXyaiYr7Pu0q2qPV/OtABpiukAHswJb9VV/tUVFsvC5iZUTyVPxfEr8cIVatGa5/Mxeli8QMyzAMBmoiYg==" - }, - "node_modules/promise-retry": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", - "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", - "optional": true, - "dependencies": { - "err-code": "^2.0.2", - "retry": "^0.12.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/promise-retry/node_modules/retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", - "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", - "optional": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/prop-types": { - "version": "15.8.1", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", - "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", - "dev": true, - "dependencies": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" - } - }, - "node_modules/prop-types/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/proto-list": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", - "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==" - }, - "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/pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==", - "dev": true - }, - "node_modules/psl": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", - "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==" - }, - "node_modules/punycode": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", - "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", - "engines": { - "node": ">=6" - } - }, - "node_modules/qs": { - "version": "6.11.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.2.tgz", - "integrity": "sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==", - "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==", - "dev": true - }, - "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/quick-format-unescaped": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz", - "integrity": "sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==" - }, - "node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, - "dependencies": { - "safe-buffer": "^5.1.0" - } - }, - "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==", - "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/rc/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/rc/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/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", - "dev": true - }, - "node_modules/read-pkg": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-9.0.1.tgz", - "integrity": "sha512-9viLL4/n1BJUCT1NXVTdS1jtm80yDEgR5T4yCelII49Mbj0v1rZdKqj7zCiYdbB0CuCgdrvHcNogAKTFPBocFA==", - "dependencies": { - "@types/normalize-package-data": "^2.4.3", - "normalize-package-data": "^6.0.0", - "parse-json": "^8.0.0", - "type-fest": "^4.6.0", - "unicorn-magic": "^0.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/read-pkg-up": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-11.0.0.tgz", - "integrity": "sha512-LOVbvF1Q0SZdjClSefZ0Nz5z8u+tIE7mV5NibzmE9VYmDe9CaBbAVtz1veOSZbofrdsilxuDAYnFenukZVp8/Q==", - "deprecated": "Renamed to read-package-up", - "dependencies": { - "find-up-simple": "^1.0.0", - "read-pkg": "^9.0.0", - "type-fest": "^4.6.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/read-pkg-up/node_modules/type-fest": { - "version": "4.9.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.9.0.tgz", - "integrity": "sha512-KS/6lh/ynPGiHD/LnAobrEFq3Ad4pBzOlJ1wAnJx9N4EYoqFhMfLIBjUT2UEx4wg5ZE+cC1ob6DCSpppVo+rtg==", - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/read-pkg/node_modules/parse-json": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-8.1.0.tgz", - "integrity": "sha512-rum1bPifK5SSar35Z6EKZuYPJx85pkNaFrxBK3mwdfSJ1/WKbYrjoW/zTPSjRRamfmVX1ACBIdFAO0VRErW/EA==", - "dependencies": { - "@babel/code-frame": "^7.22.13", - "index-to-position": "^0.1.2", - "type-fest": "^4.7.1" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/read-pkg/node_modules/type-fest": { - "version": "4.9.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.9.0.tgz", - "integrity": "sha512-KS/6lh/ynPGiHD/LnAobrEFq3Ad4pBzOlJ1wAnJx9N4EYoqFhMfLIBjUT2UEx4wg5ZE+cC1ob6DCSpppVo+rtg==", - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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/real-require": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/real-require/-/real-require-0.2.0.tgz", - "integrity": "sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==", - "engines": { - "node": ">= 12.13.0" - } - }, - "node_modules/redeyed": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/redeyed/-/redeyed-2.1.1.tgz", - "integrity": "sha512-FNpGGo1DycYAdnrKFxCMmKYgo/mILAqtRYbkdQD8Ep/Hk2PQ5+aEAEx+IU713RTDmuBaH0c8P5ZozurNu5ObRQ==", - "dependencies": { - "esprima": "~4.0.0" - } - }, - "node_modules/reflect.getprototypeof": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.4.tgz", - "integrity": "sha512-ECkTw8TmJwW60lOTR+ZkODISW6RQ8+2CL3COqtiJKLd6MmB45hN51HprHFziKLGkAuTGQhBb91V8cy+KHlaCjw==", - "dev": true, - "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" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/regexp.prototype.flags": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz", - "integrity": "sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "set-function-name": "^2.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/regexpp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", - "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - } - }, - "node_modules/registry-auth-token": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-5.0.2.tgz", - "integrity": "sha512-o/3ikDxtXaA59BmZuZrJZDJv8NMDGSj+6j6XaeBmHw8eY1i1qd9+6H+LjVvQXx3HN6aRCGa1cUdJ9RaJZUugnQ==", - "dependencies": { - "@pnpm/npm-conf": "^2.1.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/release-zalgo": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", - "integrity": "sha512-gUAyHVHPPC5wdqX/LG4LWtRYtgjxyX78oanFNTMMyFEfOqdC54s3eE82imuWKbOeqYht2CrNf64Qb8vgmmtZGA==", - "dev": true, - "dependencies": { - "es6-error": "^4.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/request": { - "version": "2.88.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", - "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", - "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", - "dependencies": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.0", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.4.3", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - }, - "engines": { - "node": ">= 4" - } - }, - "node_modules/request-promise": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/request-promise/-/request-promise-4.2.4.tgz", - "integrity": "sha512-8wgMrvE546PzbR5WbYxUQogUnUDfM0S7QIFZMID+J73vdFARkFy+HElj4T+MWYhpXwlLp0EQ8Zoj8xUA0he4Vg==", - "deprecated": "request-promise has been deprecated because it extends the now deprecated request package, see https://github.com/request/request/issues/3142", - "dependencies": { - "bluebird": "^3.5.0", - "request-promise-core": "1.1.2", - "stealthy-require": "^1.1.1", - "tough-cookie": "^2.3.3" - }, - "engines": { - "node": ">=0.10.0" - }, - "peerDependencies": { - "request": "^2.34" - } - }, - "node_modules/request-promise-core": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.2.tgz", - "integrity": "sha512-UHYyq1MO8GsefGEt7EprS8UrXsm1TxEvFUX1IMTuSLU2Rh7fTIdFtl8xD7JiEYiWU2dl+NYAjCTksTehQUxPag==", - "dependencies": { - "lodash": "^4.17.11" - }, - "engines": { - "node": ">=0.10.0" - }, - "peerDependencies": { - "request": "^2.34" - } - }, - "node_modules/request-promise/node_modules/tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "dependencies": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/request/node_modules/form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 0.12" - } - }, - "node_modules/request/node_modules/http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==", - "dependencies": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - }, - "engines": { - "node": ">=0.8", - "npm": ">=1.3.7" - } - }, - "node_modules/request/node_modules/jsprim": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", - "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", - "dependencies": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.4.0", - "verror": "1.10.0" - }, - "engines": { - "node": ">=0.6.0" - } - }, - "node_modules/request/node_modules/punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==" - }, - "node_modules/request/node_modules/qs": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", - "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/request/node_modules/tough-cookie": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", - "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", - "dependencies": { - "psl": "^1.1.24", - "punycode": "^1.4.1" - }, - "engines": { - "node": ">=0.8" - } - }, - "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/require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true - }, - "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==", - "dev": true - }, - "node_modules/resolve": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", - "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", - "dev": true, - "dependencies": { - "is-core-module": "^2.9.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-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "engines": { - "node": ">=4" - } - }, - "node_modules/retry-as-promised": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/retry-as-promised/-/retry-as-promised-7.0.4.tgz", - "integrity": "sha512-XgmCoxKWkDofwH8WddD0w85ZfqYz+ZHlr5yo+3YUCfycWawU56T5ckWXsScsj5B8tqUcIG67DxXByo3VUgiAdA==" - }, - "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/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/roarr": { - "version": "2.15.4", - "resolved": "https://registry.npmjs.org/roarr/-/roarr-2.15.4.tgz", - "integrity": "sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A==", - "dev": true, - "dependencies": { - "boolean": "^3.0.1", - "detect-node": "^2.0.4", - "globalthis": "^1.0.1", - "json-stringify-safe": "^5.0.1", - "semver-compare": "^1.0.0", - "sprintf-js": "^1.1.2" - }, - "engines": { - "node": ">=8.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-array-concat": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.1.tgz", - "integrity": "sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.1", - "has-symbols": "^1.0.3", - "isarray": "^2.0.5" - }, - "engines": { - "node": ">=0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/safe-array-concat/node_modules/isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/safe-regex-test": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", - "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", - "is-regex": "^1.1.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, - "node_modules/secure-keys": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/secure-keys/-/secure-keys-1.0.0.tgz", - "integrity": "sha512-nZi59hW3Sl5P3+wOO89eHBAAGwmCPd2aE1+dLZV5MO+ItQctIvAqihzaAXIQhvtH4KJPxM080HsnqltR2y8cWg==" - }, - "node_modules/semantic-release": { - "version": "22.0.12", - "resolved": "https://registry.npmjs.org/semantic-release/-/semantic-release-22.0.12.tgz", - "integrity": "sha512-0mhiCR/4sZb00RVFJIUlMuiBkW3NMpVIW2Gse7noqEMoFGkvfPPAImEQbkBV8xga4KOPP4FdTRYuLLy32R1fPw==", - "dependencies": { - "@semantic-release/commit-analyzer": "^11.0.0", - "@semantic-release/error": "^4.0.0", - "@semantic-release/github": "^9.0.0", - "@semantic-release/npm": "^11.0.0", - "@semantic-release/release-notes-generator": "^12.0.0", - "aggregate-error": "^5.0.0", - "cosmiconfig": "^8.0.0", - "debug": "^4.0.0", - "env-ci": "^10.0.0", - "execa": "^8.0.0", - "figures": "^6.0.0", - "find-versions": "^5.1.0", - "get-stream": "^6.0.0", - "git-log-parser": "^1.2.0", - "hook-std": "^3.0.0", - "hosted-git-info": "^7.0.0", - "import-from-esm": "^1.3.1", - "lodash-es": "^4.17.21", - "marked": "^9.0.0", - "marked-terminal": "^6.0.0", - "micromatch": "^4.0.2", - "p-each-series": "^3.0.0", - "p-reduce": "^3.0.0", - "read-pkg-up": "^11.0.0", - "resolve-from": "^5.0.0", - "semver": "^7.3.2", - "semver-diff": "^4.0.0", - "signale": "^1.2.1", - "yargs": "^17.5.1" - }, - "bin": { - "semantic-release": "bin/semantic-release.js" - }, - "engines": { - "node": "^18.17 || >=20.6.1" - } - }, - "node_modules/semantic-release/node_modules/aggregate-error": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-5.0.0.tgz", - "integrity": "sha512-gOsf2YwSlleG6IjRYG2A7k0HmBMEo6qVNk9Bp/EaLgAJT5ngH6PXbqa4ItvnEwCm/velL5jAnQgsHsWnjhGmvw==", - "dependencies": { - "clean-stack": "^5.2.0", - "indent-string": "^5.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/semantic-release/node_modules/clean-stack": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-5.2.0.tgz", - "integrity": "sha512-TyUIUJgdFnCISzG5zu3291TAsE77ddchd0bepon1VVQrKLGKFED4iXFEDQ24mIPdPBbyE16PK3F8MYE1CmcBEQ==", - "dependencies": { - "escape-string-regexp": "5.0.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/semantic-release/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/semantic-release/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/semantic-release/node_modules/escape-string-regexp": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", - "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/semantic-release/node_modules/execa": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", - "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^8.0.1", - "human-signals": "^5.0.0", - "is-stream": "^3.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^5.1.0", - "onetime": "^6.0.0", - "signal-exit": "^4.1.0", - "strip-final-newline": "^3.0.0" - }, - "engines": { - "node": ">=16.17" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/semantic-release/node_modules/execa/node_modules/get-stream": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", - "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/semantic-release/node_modules/figures": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/figures/-/figures-6.0.1.tgz", - "integrity": "sha512-0oY/olScYD4IhQ8u//gCPA4F3mlTn2dacYmiDm/mbDQvpmLjV4uH+zhsQ5IyXRyvqkvtUkXkNdGvg5OFJTCsuQ==", - "dependencies": { - "is-unicode-supported": "^2.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/semantic-release/node_modules/human-signals": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", - "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", - "engines": { - "node": ">=16.17.0" - } - }, - "node_modules/semantic-release/node_modules/indent-string": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", - "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/semantic-release/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==", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/semantic-release/node_modules/is-unicode-supported": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.0.0.tgz", - "integrity": "sha512-FRdAyx5lusK1iHG0TWpVtk9+1i+GjrzRffhDg4ovQ7mcidMQ6mj+MhKPmvh7Xwyv5gIS06ns49CA7Sqg7lC22Q==", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/semantic-release/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==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/semantic-release/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/semantic-release/node_modules/npm-run-path": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.2.0.tgz", - "integrity": "sha512-W4/tgAXFqFA0iL7fk0+uQ3g7wkL8xJmx3XdK0VGb4cHW//eZTtKGvFBBoRKVTpY7n6ze4NL9ly7rgXcHufqXKg==", - "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/semantic-release/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==", - "dependencies": { - "mimic-fn": "^4.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/semantic-release/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==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/semantic-release/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "engines": { - "node": ">=8" - } - }, - "node_modules/semantic-release/node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/semantic-release/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==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/semantic-release/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/semantic-release/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/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/semver-compare": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", - "integrity": "sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==", - "dev": true - }, - "node_modules/semver-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-4.0.0.tgz", - "integrity": "sha512-0Ju4+6A8iOnpL/Thra7dZsSlOHYAHIeMxfhWQRI1/VLcT3WDBZKKtQt/QkBOsiIN9ZpuvHE6cGZ0x4glCMmfiA==", - "dependencies": { - "semver": "^7.3.5" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/semver-regex": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/semver-regex/-/semver-regex-4.0.5.tgz", - "integrity": "sha512-hunMQrEy1T6Jr2uEVjrAIqjwWcQTgOAcIM52C8MY1EZSD3DDNft04XzvYKPqjED65bNVVko0YI38nYeEHCX3yw==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/semver/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/semver/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/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/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/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/sequelize": { - "version": "6.35.2", - "resolved": "https://registry.npmjs.org/sequelize/-/sequelize-6.35.2.tgz", - "integrity": "sha512-EdzLaw2kK4/aOnWQ7ed/qh3B6/g+1DvmeXr66RwbcqSm/+QRS9X0LDI5INBibsy4eNJHWIRPo3+QK0zL+IPBHg==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/sequelize" - } - ], - "dependencies": { - "@types/debug": "^4.1.8", - "@types/validator": "^13.7.17", - "debug": "^4.3.4", - "dottie": "^2.0.6", - "inflection": "^1.13.4", - "lodash": "^4.17.21", - "moment": "^2.29.4", - "moment-timezone": "^0.5.43", - "pg-connection-string": "^2.6.1", - "retry-as-promised": "^7.0.4", - "semver": "^7.5.4", - "sequelize-pool": "^7.1.0", - "toposort-class": "^1.0.1", - "uuid": "^8.3.2", - "validator": "^13.9.0", - "wkx": "^0.5.0" - }, - "engines": { - "node": ">=10.0.0" - }, - "peerDependenciesMeta": { - "ibm_db": { - "optional": true - }, - "mariadb": { - "optional": true - }, - "mysql2": { - "optional": true - }, - "oracledb": { - "optional": true - }, - "pg": { - "optional": true - }, - "pg-hstore": { - "optional": true - }, - "snowflake-sdk": { - "optional": true - }, - "sqlite3": { - "optional": true - }, - "tedious": { - "optional": true - } - } - }, - "node_modules/sequelize-cli": { - "version": "6.6.2", - "resolved": "https://registry.npmjs.org/sequelize-cli/-/sequelize-cli-6.6.2.tgz", - "integrity": "sha512-V8Oh+XMz2+uquLZltZES6MVAD+yEnmMfwfn+gpXcDiwE3jyQygLt4xoI0zG8gKt6cRcs84hsKnXAKDQjG/JAgg==", - "dev": true, - "dependencies": { - "cli-color": "^2.0.3", - "fs-extra": "^9.1.0", - "js-beautify": "^1.14.5", - "lodash": "^4.17.21", - "resolve": "^1.22.1", - "umzug": "^2.3.0", - "yargs": "^16.2.0" - }, - "bin": { - "sequelize": "lib/sequelize", - "sequelize-cli": "lib/sequelize" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/sequelize-cli/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/sequelize-cli/node_modules/umzug": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/umzug/-/umzug-2.3.0.tgz", - "integrity": "sha512-Z274K+e8goZK8QJxmbRPhl89HPO1K+ORFtm6rySPhFKfKc5GHhqdzD0SGhSWHkzoXasqJuItdhorSvY7/Cgflw==", - "dev": true, - "dependencies": { - "bluebird": "^3.7.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/sequelize-cli/node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "dev": true, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/sequelize-pool": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/sequelize-pool/-/sequelize-pool-7.1.0.tgz", - "integrity": "sha512-G9c0qlIWQSK29pR/5U2JF5dDQeqqHRragoyahj/Nx4KOOQ3CPPfzxnfqFPCSB7x5UgjOgnZ61nSxz+fjDpRlJg==", - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/sequelize/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/sequelize/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/sequelize/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/serialised-error": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/serialised-error/-/serialised-error-1.1.3.tgz", - "integrity": "sha512-vybp3GItaR1ZtO2nxZZo8eOo7fnVaNtP3XE2vJKgzkKR2bagCkdJ1EpYYhEMd3qu/80DwQk9KjsNSxE3fXWq0g==", - "dev": true, - "dependencies": { - "object-hash": "^1.1.2", - "stack-trace": "0.0.9", - "uuid": "^3.0.0" - } - }, - "node_modules/serialize-error": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-7.0.1.tgz", - "integrity": "sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==", - "dev": true, - "dependencies": { - "type-fest": "^0.13.1" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/serialize-error/node_modules/type-fest": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", - "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/serialize-javascript": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", - "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", - "dev": true, - "dependencies": { - "randombytes": "^2.1.0" - } - }, - "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/set-function-length": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.1.1.tgz", - "integrity": "sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==", - "dependencies": { - "define-data-property": "^1.1.1", - "get-intrinsic": "^1.2.1", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/set-function-name": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.1.tgz", - "integrity": "sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==", - "dev": true, - "dependencies": { - "define-data-property": "^1.0.1", - "functions-have-names": "^1.2.3", - "has-property-descriptors": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" - }, - "node_modules/shallow-copy": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/shallow-copy/-/shallow-copy-0.0.1.tgz", - "integrity": "sha512-b6i4ZpVuUxB9h5gfCxPiusKYkqTMOjEbBs4wMaFbkfia4yFv92UKZ6Df8WXcKbn08JNL/abvg3FnMAOfakDvUw==" - }, - "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==", - "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==", - "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/sigmund": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", - "integrity": "sha512-fCvEXfh6NWpm+YSuY2bpXb/VIihqWA6hLsgboC+0nl71Q7N7o2eaCW8mJa/NLvQhs6jpd3VZV4UiUQlV6+lc8g==", - "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/signale": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/signale/-/signale-1.4.0.tgz", - "integrity": "sha512-iuh+gPf28RkltuJC7W5MRi6XAjTDCAPC/prJUpQoG4vIP3MJZ+GTydVnodXA7pwvTKb2cA0m9OFZW/cdWy/I/w==", - "dependencies": { - "chalk": "^2.3.2", - "figures": "^2.0.0", - "pkg-conf": "^2.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/sinon": { - "version": "17.0.1", - "resolved": "https://registry.npmjs.org/sinon/-/sinon-17.0.1.tgz", - "integrity": "sha512-wmwE19Lie0MLT+ZYNpDymasPHUKTaZHUH/pKEubRXIzySv9Atnlw+BUMGCzWgV7b7wO+Hw6f1TEOr0IUnmU8/g==", - "dev": true, - "dependencies": { - "@sinonjs/commons": "^3.0.0", - "@sinonjs/fake-timers": "^11.2.2", - "@sinonjs/samsam": "^8.0.0", - "diff": "^5.1.0", - "nise": "^5.1.5", - "supports-color": "^7.2.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/sinon" - } - }, - "node_modules/sinon-chai": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/sinon-chai/-/sinon-chai-3.7.0.tgz", - "integrity": "sha512-mf5NURdUaSdnatJx3uhoBOrY9dtL19fiOtAdT1Azxg3+lNJFiuN0uzaU3xX1LeAfL17kHQhTAJgpsfhbMJMY2g==", - "dev": true, - "peerDependencies": { - "chai": "^4.0.0", - "sinon": ">=4.0.0" - } - }, - "node_modules/sinon/node_modules/diff": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.1.0.tgz", - "integrity": "sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==", - "dev": true, - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/sinon/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/sinon/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/skin-tone": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/skin-tone/-/skin-tone-2.0.0.tgz", - "integrity": "sha512-kUMbT1oBJCpgrnKoSr0o6wPtvRWT9W9UKvGLwfJYO2WuahZRHOpEyL1ckyMGgMWh0UdpmaoFqKKD29WTomNEGA==", - "dependencies": { - "unicode-emoji-modifier-base": "^1.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/slash": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz", - "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==", - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/smart-buffer": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", - "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", - "optional": true, - "engines": { - "node": ">= 6.0.0", - "npm": ">= 3.0.0" - } - }, - "node_modules/smtp-connection": { - "version": "2.12.0", - "resolved": "https://registry.npmjs.org/smtp-connection/-/smtp-connection-2.12.0.tgz", - "integrity": "sha512-UP5jK4s5SGcUcqPN4U9ingqKt9mXYSKa52YhqxPuMecAnUOsVJpOmtgGaOm1urUBJZlzDt1M9WhZZkgbhxQlvg==", - "dependencies": { - "httpntlm": "1.6.1", - "nodemailer-shared": "1.1.0" - } - }, - "node_modules/smtp-connection/node_modules/httpntlm": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/httpntlm/-/httpntlm-1.6.1.tgz", - "integrity": "sha512-Tcz3Ct9efvNqw3QdTl3h6IgRRlIQxwKkJELN/aAIGnzi2xvb3pDHdnMs8BrxWLV6OoT4DlVyhzSVhFt/tk0lIw==", - "dependencies": { - "httpreq": ">=0.4.22", - "underscore": "~1.7.0" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/smtp-connection/node_modules/underscore": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.7.0.tgz", - "integrity": "sha512-cp0oQQyZhUM1kpJDLdGO1jPZHgS/MpzoWYfe9+CM2h/QGDZlqwT2T3YGukuBdaNJ/CAPoeyAZRRHz8JFo176vA==" - }, - "node_modules/snyk": { - "version": "1.1266.0", - "resolved": "https://registry.npmjs.org/snyk/-/snyk-1.1266.0.tgz", - "integrity": "sha512-upsITfOo/ioJn4F9BmKUIHeVtHNijvk4fx/2u5SfsNCHYabWSbMR2bmGdB1aD1TUonm92VB2hTJTBTYL2FRo5A==", - "dev": true, - "hasInstallScript": true, - "dependencies": { - "@sentry/node": "^7.36.0", - "global-agent": "^3.0.0" - }, - "bin": { - "snyk": "bin/snyk" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/socks": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz", - "integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==", - "optional": true, - "dependencies": { - "ip": "^2.0.0", - "smart-buffer": "^4.2.0" - }, - "engines": { - "node": ">= 10.13.0", - "npm": ">= 3.0.0" - } - }, - "node_modules/socks-proxy-agent": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-6.2.1.tgz", - "integrity": "sha512-a6KW9G+6B3nWZ1yB8G7pJwL3ggLy1uTzKAgCb7ttblwqdz9fMGJUuTy3uFzEP48FAs9FLILlmzDlE2JJhVQaXQ==", - "optional": true, - "dependencies": { - "agent-base": "^6.0.2", - "debug": "^4.3.3", - "socks": "^2.6.2" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/socks-proxy-agent/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "optional": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/socks-proxy-agent/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==", - "optional": true - }, - "node_modules/sonic-boom": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-3.7.0.tgz", - "integrity": "sha512-IudtNvSqA/ObjN97tfgNmOKyDOs4dNcg4cUUsHDebqsgb8wGBBwb31LIgShNO8fye0dFI52X1+tFoKKI6Rq1Gg==", - "dependencies": { - "atomic-sleep": "^1.0.0" - } - }, - "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==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/spawn-error-forwarder": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/spawn-error-forwarder/-/spawn-error-forwarder-1.0.0.tgz", - "integrity": "sha512-gRjMgK5uFjbCvdibeGJuy3I5OYz6VLoVdsOJdA6wV0WlfQVLFueoqMxwwYD9RODdgb6oUIvlRlsyFSiQkMKu0g==" - }, - "node_modules/spawn-wrap": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-2.0.0.tgz", - "integrity": "sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==", - "dev": true, - "dependencies": { - "foreground-child": "^2.0.0", - "is-windows": "^1.0.2", - "make-dir": "^3.0.0", - "rimraf": "^3.0.0", - "signal-exit": "^3.0.2", - "which": "^2.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/spdx-correct": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", - "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", - "dependencies": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-exceptions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==" - }, - "node_modules/spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-license-ids": { - "version": "3.0.16", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.16.tgz", - "integrity": "sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw==" - }, - "node_modules/split2": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", - "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", - "engines": { - "node": ">= 10.x" - } - }, - "node_modules/sprintf-js": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", - "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", - "dev": true - }, - "node_modules/sqlite3": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/sqlite3/-/sqlite3-5.1.6.tgz", - "integrity": "sha512-olYkWoKFVNSSSQNvxVUfjiVbz3YtBwTJj+mfV5zpHmqW3sELx2Cf4QCdirMelhM5Zh+KDVaKgQHqCxrqiWHybw==", - "hasInstallScript": true, - "dependencies": { - "@mapbox/node-pre-gyp": "^1.0.0", - "node-addon-api": "^4.2.0", - "tar": "^6.1.11" - }, - "optionalDependencies": { - "node-gyp": "8.x" - }, - "peerDependencies": { - "node-gyp": "8.x" - }, - "peerDependenciesMeta": { - "node-gyp": { - "optional": true - } - } - }, - "node_modules/sshpk": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz", - "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==", - "dependencies": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - }, - "bin": { - "sshpk-conv": "bin/sshpk-conv", - "sshpk-sign": "bin/sshpk-sign", - "sshpk-verify": "bin/sshpk-verify" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ssri": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz", - "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==", - "optional": true, - "dependencies": { - "minipass": "^3.1.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/stack-trace": { - "version": "0.0.9", - "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.9.tgz", - "integrity": "sha512-vjUc6sfgtgY0dxCdnc40mK6Oftjo9+2K8H/NG81TMhgL392FtiPA9tn9RLyTxXmTLPJPjF3VyzFp6bsWFLisMQ==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/standard": { - "version": "17.1.0", - "resolved": "https://registry.npmjs.org/standard/-/standard-17.1.0.tgz", - "integrity": "sha512-jaDqlNSzLtWYW4lvQmU0EnxWMUGQiwHasZl5ZEIwx3S/ijZDjZOzs1y1QqKwKs5vqnFpGtizo4NOYX2s0Voq/g==", - "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": { - "eslint": "^8.41.0", - "eslint-config-standard": "17.1.0", - "eslint-config-standard-jsx": "^11.0.0", - "eslint-plugin-import": "^2.27.5", - "eslint-plugin-n": "^15.7.0", - "eslint-plugin-promise": "^6.1.1", - "eslint-plugin-react": "^7.32.2", - "standard-engine": "^15.0.0", - "version-guard": "^1.1.1" - }, - "bin": { - "standard": "bin/cmd.cjs" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/standard-engine": { - "version": "15.1.0", - "resolved": "https://registry.npmjs.org/standard-engine/-/standard-engine-15.1.0.tgz", - "integrity": "sha512-VHysfoyxFu/ukT+9v49d4BRXIokFRZuH3z1VRxzFArZdjSCFpro6rEIU3ji7e4AoAtuSfKBkiOmsrDqKW5ZSRw==", - "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": { - "get-stdin": "^8.0.0", - "minimist": "^1.2.6", - "pkg-conf": "^3.1.0", - "xdg-basedir": "^4.0.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/standard-engine/node_modules/find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "dependencies": { - "locate-path": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/standard-engine/node_modules/load-json-file": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-5.3.0.tgz", - "integrity": "sha512-cJGP40Jc/VXUsp8/OrnyKyTZ1y6v/dphm3bioS+RrKXjK2BB6wHUd6JptZEFDGgGahMT+InnZO5i1Ei9mpC8Bw==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.15", - "parse-json": "^4.0.0", - "pify": "^4.0.1", - "strip-bom": "^3.0.0", - "type-fest": "^0.3.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/standard-engine/node_modules/locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "dependencies": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/standard-engine/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/standard-engine/node_modules/p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "dependencies": { - "p-limit": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/standard-engine/node_modules/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", - "dev": true, - "dependencies": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/standard-engine/node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/standard-engine/node_modules/pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/standard-engine/node_modules/pkg-conf": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/pkg-conf/-/pkg-conf-3.1.0.tgz", - "integrity": "sha512-m0OTbR/5VPNPqO1ph6Fqbj7Hv6QU7gR/tQW40ZqrL1rjgCU85W6C1bJn0BItuJqnR98PWzw7Z8hHeChD1WrgdQ==", - "dev": true, - "dependencies": { - "find-up": "^3.0.0", - "load-json-file": "^5.2.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/standard-engine/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/standard-engine/node_modules/type-fest": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.3.1.tgz", - "integrity": "sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "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/stealthy-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", - "integrity": "sha512-ZnWpYnYugiOVEY5GkcuJK1io5V8QmNYChG62gSit9pQVGErXtrKuPC55ITaVSukmMta5qpMU7vqLt2Lnni4f/g==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/stream-combiner2": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.1.1.tgz", - "integrity": "sha512-3PnJbYgS56AeWgtKF5jtJRT6uFJe56Z0Hc5Ngg/6sI6rIt8iiMBTa9cvdyFfpMQjaVHr8dusbNeFGIIonxOvKw==", - "dependencies": { - "duplexer2": "~0.1.0", - "readable-stream": "^2.0.2" - } - }, - "node_modules/stream-combiner2/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-combiner2/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-combiner2/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/stream-combiner2/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/stream-length": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/stream-length/-/stream-length-1.0.2.tgz", - "integrity": "sha512-aI+qKFiwoDV4rsXiS7WRoCt+v2RX1nUj17+KJC5r2gfh5xoSJIfP6Y3Do/HtvesFcTSWthIuJ3l1cvKQY/+nZg==", - "dev": true, - "dependencies": { - "bluebird": "^2.6.2" - } - }, - "node_modules/stream-length/node_modules/bluebird": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-2.11.0.tgz", - "integrity": "sha512-UfFSr22dmHPQqPP9XWHRhq+gWnHCYguQGkXQlbyPtW5qTnhFWA8/iXg765tH0cAjy7l/zPJ1aBTO0g5XgA7kvQ==", - "dev": true - }, - "node_modules/stream-read-all": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/stream-read-all/-/stream-read-all-3.0.1.tgz", - "integrity": "sha512-EWZT9XOceBPlVJRrYcykW8jyRSZYbkb/0ZK36uLEmoWVO5gxBOnntNTseNzfREsqxqdfEGQrD8SXQ3QWbBmq8A==", - "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-argv": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz", - "integrity": "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==", - "engines": { - "node": ">=0.6.19" - } - }, - "node_modules/string-format": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/string-format/-/string-format-2.0.0.tgz", - "integrity": "sha512-bbEs3scLeYNXLecRRuk6uJxdXUSj6le/8rNPHChIJTn2V79aXVTR1EH2OH5zLKKoz0V02fOUKZZcw01pLUShZA==" - }, - "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/string.prototype.matchall": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.10.tgz", - "integrity": "sha512-rGXbGmOEosIQi6Qva94HUjgPs9vKW+dkG7Y8Q5O2OYkWL6wFaTRZO8zM4mhP94uX55wgyrXzfS2aGtGzUL7EJQ==", - "dev": true, - "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", - "set-function-name": "^2.0.0", - "side-channel": "^1.0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trim": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz", - "integrity": "sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimend": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz", - "integrity": "sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimstart": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz", - "integrity": "sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "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==", - "engines": { - "node": ">=6" - } - }, - "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/superagent": { - "version": "8.1.2", - "resolved": "https://registry.npmjs.org/superagent/-/superagent-8.1.2.tgz", - "integrity": "sha512-6WTxW1EB6yCxV5VFOIPQruWGHqc3yI7hEmZK6h+pyk69Lk/Ut7rLUY6W/ONF2MjBuGjvmMiIpsrVJ2vjrHlslA==", - "dev": true, - "dependencies": { - "component-emitter": "^1.3.0", - "cookiejar": "^2.1.4", - "debug": "^4.3.4", - "fast-safe-stringify": "^2.1.1", - "form-data": "^4.0.0", - "formidable": "^2.1.2", - "methods": "^1.1.2", - "mime": "2.6.0", - "qs": "^6.11.0", - "semver": "^7.3.8" - }, - "engines": { - "node": ">=6.4.0 <13 || >=14" - } - }, - "node_modules/superagent/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/superagent/node_modules/formidable": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/formidable/-/formidable-2.1.2.tgz", - "integrity": "sha512-CM3GuJ57US06mlpQ47YcunuUZ9jpm8Vx+P2CGt2j7HpgkKZO/DJYQ0Bobim8G6PFQmK5lOqOOdUXboU+h73A4g==", - "dev": true, - "dependencies": { - "dezalgo": "^1.0.4", - "hexoid": "^1.0.0", - "once": "^1.4.0", - "qs": "^6.11.0" - }, - "funding": { - "url": "https://ko-fi.com/tunnckoCore/commissions" - } - }, - "node_modules/superagent/node_modules/mime": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", - "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", - "dev": true, - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/superagent/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/superagent/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/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-hyperlinks": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-3.0.0.tgz", - "integrity": "sha512-QBDPHyPQDRTy9ku4URNGY5Lah8PAaXs6tAAwp55sL5WCsSW7GIfdf6W5ixfziW+t7wh3GVvHyHHyQ1ESsoRvaA==", - "dependencies": { - "has-flag": "^4.0.0", - "supports-color": "^7.0.0" - }, - "engines": { - "node": ">=14.18" - } - }, - "node_modules/supports-hyperlinks/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/supports-hyperlinks/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/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-ui-dist": { - "version": "5.10.5", - "resolved": "https://registry.npmjs.org/swagger-ui-dist/-/swagger-ui-dist-5.10.5.tgz", - "integrity": "sha512-Uv8E7hV/nXALQKgW86X1i58gl1O6DFg+Uq54sDwhYqucBBxj/47dLNw872TNILNlOTuPA6dRvUMGQdmlpaX8qQ==" - }, - "node_modules/swagger-ui-express": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/swagger-ui-express/-/swagger-ui-express-5.0.0.tgz", - "integrity": "sha512-tsU9tODVvhyfkNSvf03E6FAk+z+5cU3lXAzMy6Pv4av2Gt2xA0++fogwC4qo19XuFf6hdxevPuVCSKFuMHJhFA==", - "dependencies": { - "swagger-ui-dist": ">=5.0.0" - }, - "engines": { - "node": ">= v0.10.32" - }, - "peerDependencies": { - "express": ">=4.0.0 || >=5.0.0-beta" - } - }, - "node_modules/table-layout": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-3.0.2.tgz", - "integrity": "sha512-rpyNZYRw+/C+dYkcQ3Pr+rLxW4CfHpXjPDnG7lYhdRoUcZTUt+KEsX+94RGp/aVp/MQU35JCITv2T/beY4m+hw==", - "dependencies": { - "@75lb/deep-merge": "^1.1.1", - "array-back": "^6.2.2", - "command-line-args": "^5.2.1", - "command-line-usage": "^7.0.0", - "stream-read-all": "^3.0.1", - "typical": "^7.1.1", - "wordwrapjs": "^5.1.0" - }, - "bin": { - "table-layout": "bin/cli.js" - }, - "engines": { - "node": ">=12.17" - } - }, - "node_modules/table-layout/node_modules/array-back": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/array-back/-/array-back-6.2.2.tgz", - "integrity": "sha512-gUAZ7HPyb4SJczXAMUXMGAvI976JoK3qEx9v1FTmeYuJj0IBiaKttG1ydtGKdkfqWkIkouke7nG8ufGy77+Cvw==", - "engines": { - "node": ">=12.17" - } - }, - "node_modules/table-layout/node_modules/typical": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/typical/-/typical-7.1.1.tgz", - "integrity": "sha512-T+tKVNs6Wu7IWiAce5BgMd7OZfNYUndHwc5MknN+UHOudi7sGZzuHdCadllRuqJ3fPtgFtIH9+lt9qRv6lmpfA==", - "engines": { - "node": ">=12.17" - } - }, - "node_modules/tar": { - "version": "6.1.13", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.13.tgz", - "integrity": "sha512-jdIBIN6LTIe2jqzay/2vtYLlBHa3JF42ot3h1dW8Q0PaAG4v8rm0cvpVePtau5C6OKXGGcgO9q2AMNSWxiLqKw==", - "dependencies": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^4.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/tar/node_modules/minipass": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.2.4.tgz", - "integrity": "sha512-lwycX3cBMTvcejsHITUgYj6Gy6A7Nh4Q6h9NP4sTHY1ccJlC7yKzDmiShEHsJ16Jf1nKGDEaiHxiltsJEvk0nQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/tar/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/tar/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/teleport-javascript": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/teleport-javascript/-/teleport-javascript-1.0.0.tgz", - "integrity": "sha512-j1llvWVFyEn/6XIFDfX5LAU43DXe0GCt3NfXDwJ8XpRRMkS+i50SAkonAONBy+vxwPFBd50MFU8a2uj8R/ccLg==", - "dev": true - }, - "node_modules/temp-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-3.0.0.tgz", - "integrity": "sha512-nHc6S/bwIilKHNRgK/3jlhDoIHcp45YgyiwcAk46Tr0LfEqGBVpmiAyuiuxeVE44m3mXnEeVhaipLOEWmH+Njw==", - "engines": { - "node": ">=14.16" - } - }, - "node_modules/tempy": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/tempy/-/tempy-3.1.0.tgz", - "integrity": "sha512-7jDLIdD2Zp0bDe5r3D2qtkd1QOCacylBuL7oa4udvN6v2pqr4+LcCr67C8DR1zkpaZ8XosF5m1yQSabKAW6f2g==", - "dependencies": { - "is-stream": "^3.0.0", - "temp-dir": "^3.0.0", - "type-fest": "^2.12.2", - "unique-string": "^3.0.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/tempy/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==", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/tempy/node_modules/type-fest": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", - "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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/test-exclude/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/text-extensions": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-2.4.0.tgz", - "integrity": "sha512-te/NtwBwfiNRLf9Ijqx3T0nlqZiQ2XrrtBvu+cLL8ZRrGkO0NHTug8MYFKyoSrv/sHTaSKfilUkizV6XhxMJ3g==", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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/thread-stream": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/thread-stream/-/thread-stream-2.4.1.tgz", - "integrity": "sha512-d/Ex2iWd1whipbT681JmTINKw0ZwOUBZm7+Gjs64DHuX34mmw8vJL2bFAaNacaW72zYiTJxSHi5abUuOi5nsfg==", - "dependencies": { - "real-require": "^0.2.0" - } - }, - "node_modules/through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==" - }, - "node_modules/timers-ext": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/timers-ext/-/timers-ext-0.1.7.tgz", - "integrity": "sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ==", - "dev": true, - "dependencies": { - "es5-ext": "~0.10.46", - "next-tick": "1" - } - }, - "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==", - "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/toposort-class": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toposort-class/-/toposort-class-1.0.1.tgz", - "integrity": "sha512-OsLcGGbYF3rMjPUf8oKktyvCiUxSbqMMS39m33MAjLTC1DVIH6x3WSt63/M77ihI09+Sdfk1AXvfhCEeUmC7mg==" - }, - "node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" - }, - "node_modules/traverse": { - "version": "0.6.7", - "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.6.7.tgz", - "integrity": "sha512-/y956gpUo9ZNCb99YjxG7OaslxZWHfCHAUUfshwqOXmxUIvqLjVO581BT+gM59+QV9tFe6/CGG53tsA1Y7RSdg==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/tsconfig-paths": { - "version": "3.15.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", - "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", - "dev": true, - "dependencies": { - "@types/json5": "^0.0.29", - "json5": "^1.0.2", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" - } - }, - "node_modules/tsconfig-paths/node_modules/json5": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", - "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", - "dev": true, - "dependencies": { - "minimist": "^1.2.0" - }, - "bin": { - "json5": "lib/cli.js" - } - }, - "node_modules/tsconfig-paths/node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "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/tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==" - }, - "node_modules/type": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", - "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==", - "dev": true - }, - "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", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "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/typed-array-buffer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz", - "integrity": "sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.1", - "is-typed-array": "^1.1.10" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/typed-array-byte-length": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz", - "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "has-proto": "^1.0.1", - "is-typed-array": "^1.1.10" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typed-array-byte-offset": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz", - "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==", - "dev": true, - "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "has-proto": "^1.0.1", - "is-typed-array": "^1.1.10" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typed-array-length": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", - "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "is-typed-array": "^1.1.9" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" - }, - "node_modules/typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "dev": true, - "dependencies": { - "is-typedarray": "^1.0.0" - } - }, - "node_modules/typical": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/typical/-/typical-4.0.0.tgz", - "integrity": "sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw==", - "engines": { - "node": ">=8" - } - }, - "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==", - "optional": true, - "bin": { - "uglifyjs": "bin/uglifyjs" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/umzug": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/umzug/-/umzug-3.5.0.tgz", - "integrity": "sha512-bL6JjH716l0kg7V2Acrw5UmUgeLxdAZv3drMhKrJCXxEfK/qyM+B5s3ai1BjG1NyEGeXTOkhFIUgkMFo6zqVBg==", - "dependencies": { - "@rushstack/ts-command-line": "^4.12.2", - "emittery": "^0.13.0", - "glob": "^8.0.3", - "pony-cause": "^2.1.4", - "type-fest": "^3.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/umzug/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/umzug/node_modules/glob": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", - "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/umzug/node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/umzug/node_modules/type-fest": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-3.13.1.tgz", - "integrity": "sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==", - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/unbox-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", - "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-bigints": "^1.0.2", - "has-symbols": "^1.0.3", - "which-boxed-primitive": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/underscore": { - "version": "1.13.6", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.6.tgz", - "integrity": "sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==" - }, - "node_modules/unicode-emoji-modifier-base": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unicode-emoji-modifier-base/-/unicode-emoji-modifier-base-1.0.0.tgz", - "integrity": "sha512-yLSH4py7oFH3oG/9K+XWrz1pSi3dfUrWEnInbxMfArOfc1+33BlGPQtLsOYwvdMy11AwUBetYuaRxSPqgkq+8g==", - "engines": { - "node": ">=4" - } - }, - "node_modules/unicorn-magic": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.1.0.tgz", - "integrity": "sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/unique-filename": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", - "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", - "optional": true, - "dependencies": { - "unique-slug": "^2.0.0" - } - }, - "node_modules/unique-slug": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", - "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", - "optional": true, - "dependencies": { - "imurmurhash": "^0.1.4" - } - }, - "node_modules/unique-string": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-3.0.0.tgz", - "integrity": "sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ==", - "dependencies": { - "crypto-random-string": "^4.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/universal-user-agent": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.1.tgz", - "integrity": "sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ==" - }, - "node_modules/universalify": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", - "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", - "dev": true, - "engines": { - "node": ">= 4.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/update-browserslist-db": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", - "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - } - ], - "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" - }, - "bin": { - "browserslist-lint": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/url-join": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/url-join/-/url-join-5.0.0.tgz", - "integrity": "sha512-n2huDr9h9yzd6exQVnH/jU5mr+Pfx08LRXXZhkLLetAMESRj+anQsTAh940iMrIetKAmry9coFuZQ2jY8/p3WA==", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.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==", - "dev": true, - "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-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" - }, - "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/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": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", - "bin": { - "uuid": "bin/uuid" - } - }, - "node_modules/uvm": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/uvm/-/uvm-2.1.1.tgz", - "integrity": "sha512-BZ5w8adTpNNr+zczOBRpaX/hH8UPKAf7fmCnidrcsqt3bn8KT9bDIfuS7hgRU9RXgiN01su2pwysBONY6w8W5w==", - "dev": true, - "dependencies": { - "flatted": "3.2.6" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/uvm/node_modules/flatted": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.6.tgz", - "integrity": "sha512-0sQoMh9s0BYsm+12Huy/rkKxVu4R1+r96YX5cG44rHV0pQ6iC3Q+mkoMFaGWObMFYQxCVT+ssG1ksneA2MI9KQ==", - "dev": true - }, - "node_modules/validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dependencies": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "node_modules/validator": { - "version": "13.9.0", - "resolved": "https://registry.npmjs.org/validator/-/validator-13.9.0.tgz", - "integrity": "sha512-B+dGG8U3fdtM0/aNK4/X8CXq/EcxU2WPrPEkJGslb47qyHsxmbggTWK0yEA4qnYVNF+nxNlN88o14hIcPmSIEA==", - "engines": { - "node": ">= 0.10" - } - }, - "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/verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", - "engines": [ - "node >=0.6.0" - ], - "dependencies": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, - "node_modules/verror/node_modules/core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==" - }, - "node_modules/version-guard": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/version-guard/-/version-guard-1.1.1.tgz", - "integrity": "sha512-MGQLX89UxmYHgDvcXyjBI0cbmoW+t/dANDppNPrno64rYr8nH4SHSuElQuSYdXGEs0mUzdQe1BY+FhVPNsAmJQ==", - "dev": true, - "engines": { - "node": ">=0.10.48" - } - }, - "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==", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/which-boxed-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", - "dev": true, - "dependencies": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-builtin-type": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.1.3.tgz", - "integrity": "sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==", - "dev": true, - "dependencies": { - "function.prototype.name": "^1.1.5", - "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.9" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-builtin-type/node_modules/isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true - }, - "node_modules/which-collection": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz", - "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==", - "dev": true, - "dependencies": { - "is-map": "^2.0.1", - "is-set": "^2.0.1", - "is-weakmap": "^2.0.1", - "is-weakset": "^2.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==", - "dev": true - }, - "node_modules/which-typed-array": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.13.tgz", - "integrity": "sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==", - "dev": true, - "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.4", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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/wkx": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/wkx/-/wkx-0.5.0.tgz", - "integrity": "sha512-Xng/d4Ichh8uN4l0FToV/258EjMGU9MGcA0HV2d9B/ZpZB3lqQm7nkOdZdm5GhKtLLhAE7PiVQwN4eN+2YJJUg==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/word-wrap": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", - "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", - "dev": true, - "engines": { - "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==" - }, - "node_modules/wordwrapjs": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-5.1.0.tgz", - "integrity": "sha512-JNjcULU2e4KJwUNv6CHgI46UvDGitb6dGryHajXTDiLgg1/RiGoPSDw4kZfYnwGtEXf2ZMeIewDQgFGzkCB2Sg==", - "engines": { - "node": ">=12.17" - } - }, - "node_modules/workerpool": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz", - "integrity": "sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==", - "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/wrap-ansi/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/wrap-ansi/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/wrap-ansi/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/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": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", - "dev": true, - "dependencies": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } - }, - "node_modules/xdg-basedir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", - "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/xml": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/xml/-/xml-1.0.1.tgz", - "integrity": "sha512-huCv9IH9Tcf95zuYCsQraZtWnJvBtLVE0QHMOs8bWyZAFZNDcYjsPq1nEx8jKA9y+Beo9v+7OBPRisQTjinQMw==", - "dev": true - }, - "node_modules/xmlbuilder": { - "version": "15.1.1", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-15.1.1.tgz", - "integrity": "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==", - "dev": true, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/xregexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-2.0.0.tgz", - "integrity": "sha512-xl/50/Cf32VsGq/1R8jJE5ajH1yMCQkpmoS10QbFZWl2Oor4H0Me64Pu2yxvsRWK3m6soJbmGfzSR7BYmDcWAA==", - "engines": { - "node": "*" - } - }, - "node_modules/xss-clean": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/xss-clean/-/xss-clean-0.1.1.tgz", - "integrity": "sha512-On99yydxoAEkHpraR7Wjg9cD6UmKfbtH2HXO1it2djid32osHL7Qr8bIu+dGYoOeKzf3ZszLfz1gwR/D7whZ2A==", - "dependencies": { - "xss-filters": "1.2.6" - } - }, - "node_modules/xss-filters": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/xss-filters/-/xss-filters-1.2.6.tgz", - "integrity": "sha512-uqgwZRpVJCDfHsRX9lDrkPyCitQYzPklmLSbajJncATZKAUd1tF1x9y2VyPNFMv8SsSWed80xorSS5qGpw3WiA==" - }, - "node_modules/xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "engines": { - "node": ">=0.4" - } - }, - "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": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "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.4", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", - "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", - "engines": { - "node": ">=10" - } - }, - "node_modules/yargs-unparser": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", - "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", - "dev": true, - "dependencies": { - "camelcase": "^6.0.0", - "decamelize": "^4.0.0", - "flat": "^5.0.2", - "is-plain-obj": "^2.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/yargs-unparser/node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/yargs-unparser/node_modules/decamelize": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", - "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/yargs-unparser/node_modules/is-plain-obj": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", - "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "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 f835f806873eaa16adea60c0579904f466ebbd34 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emirhan=20Durmu=C5=9F?= Date: Tue, 2 Jan 2024 17:20:14 +0300 Subject: [PATCH 009/178] pack --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 0bfde5f01..dc5f54cf5 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "iofogcontroller", - "version": "3.0.4", + "version": "3.0.5", "description": "ioFog Controller project for Eclipse IoFog @ iofog.org \\nCopyright (c) 2023 Datasance Teknoloji A.S.", "main": "./src/main.js", "author": "Emirhan Durmus", From 5a2b3abfe18822e1792f7a80abf81247fd37da48 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emirhan=20Durmu=C5=9F?= Date: Tue, 2 Jan 2024 17:55:56 +0300 Subject: [PATCH 010/178] pack --- .github/workflows/ci.yaml | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index fda904366..72c9aa4a2 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -165,7 +165,7 @@ jobs: - name: npm pack with version from package version run: | - npm --no-git-tag-version version ${{ steps.version.outputs.pkg_version }} + npm pack npm publish diff --git a/package.json b/package.json index dc5f54cf5..0bfde5f01 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "iofogcontroller", - "version": "3.0.5", + "version": "3.0.4", "description": "ioFog Controller project for Eclipse IoFog @ iofog.org \\nCopyright (c) 2023 Datasance Teknoloji A.S.", "main": "./src/main.js", "author": "Emirhan Durmus", From 5160f05f7cbd4b71f204bc40b989b91b9af2abfd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emirhan=20Durmu=C5=9F?= Date: Tue, 2 Jan 2024 17:57:05 +0300 Subject: [PATCH 011/178] workflow --- .github/workflows/ci.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 72c9aa4a2..fda904366 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -165,7 +165,7 @@ jobs: - name: npm pack with version from package version run: | - + npm --no-git-tag-version version ${{ steps.version.outputs.pkg_version }} npm pack npm publish From cf70e3aac3115cfe7e69932a329877ec589e6a03 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emirhan=20Durmu=C5=9F?= Date: Tue, 2 Jan 2024 18:02:47 +0300 Subject: [PATCH 012/178] workflow --- .github/workflows/ci.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index fda904366..72c9aa4a2 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -165,7 +165,7 @@ jobs: - name: npm pack with version from package version run: | - npm --no-git-tag-version version ${{ steps.version.outputs.pkg_version }} + npm pack npm publish From 7f875e98b9da1a355601722de51eeb177ac37a18 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emirhan=20Durmu=C5=9F?= Date: Tue, 2 Jan 2024 18:20:27 +0300 Subject: [PATCH 013/178] publish config --- .npmrc | 2 +- package.json | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/.npmrc b/.npmrc index 25346e481..07627cd5c 100644 --- a/.npmrc +++ b/.npmrc @@ -1,2 +1,2 @@ //npm.pkg.github.com/:_authToken=PAT -@NAMESPACE:registry=https://npm.pkg.github.com \ No newline at end of file +@NAMESPACE:registry=https://npm.pkg.github.com/Datasance \ No newline at end of file diff --git a/package.json b/package.json index 0bfde5f01..183a51bc3 100644 --- a/package.json +++ b/package.json @@ -24,6 +24,9 @@ "type": "git", "url": "https://github.com/datasance/Controller" }, + "publishConfig": { + "registry": "https://npm.pkg.github.com/Datasance" + }, "scripts": { "prestart": "npm run lint", "start": "node scripts/scripts-api.js start", From 81d7daa0353647896595abd39651cd50e4dc5c12 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emirhan=20Durmu=C5=9F?= Date: Tue, 2 Jan 2024 18:45:57 +0300 Subject: [PATCH 014/178] npmrc --- .npmrc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.npmrc b/.npmrc index 07627cd5c..597b2416a 100644 --- a/.npmrc +++ b/.npmrc @@ -1,2 +1,2 @@ -//npm.pkg.github.com/:_authToken=PAT -@NAMESPACE:registry=https://npm.pkg.github.com/Datasance \ No newline at end of file +registry=https://npm.pkg.github.com/Datasance +//npm.pkg.github.com/:_authToken=PAT \ No newline at end of file From 7a8a3149551453ee6dc99e8f442b8882dba17ac1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emirhan=20Durmu=C5=9F?= Date: Tue, 2 Jan 2024 18:50:28 +0300 Subject: [PATCH 015/178] npmrc --- .npmrc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.npmrc b/.npmrc index 597b2416a..a6e95c091 100644 --- a/.npmrc +++ b/.npmrc @@ -1,2 +1,2 @@ -registry=https://npm.pkg.github.com/Datasance +registry=https://npm.pkg.github.com/ //npm.pkg.github.com/:_authToken=PAT \ No newline at end of file From 2403f1a1ad89072283cc2cbc06e6c8440c1f2bf7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emirhan=20Durmu=C5=9F?= Date: Tue, 2 Jan 2024 18:52:25 +0300 Subject: [PATCH 016/178] npmrc --- .npmrc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.npmrc b/.npmrc index a6e95c091..07627cd5c 100644 --- a/.npmrc +++ b/.npmrc @@ -1,2 +1,2 @@ -registry=https://npm.pkg.github.com/ -//npm.pkg.github.com/:_authToken=PAT \ No newline at end of file +//npm.pkg.github.com/:_authToken=PAT +@NAMESPACE:registry=https://npm.pkg.github.com/Datasance \ No newline at end of file From f8c4b24bb5376c6d68a79c6fedf8126bd1c4cc54 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emirhan=20Durmu=C5=9F?= Date: Tue, 2 Jan 2024 19:02:06 +0300 Subject: [PATCH 017/178] workflow --- .github/workflows/ci.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 72c9aa4a2..eea71ce21 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -165,7 +165,7 @@ jobs: - name: npm pack with version from package version run: | - + npm login --scope=@NAMESPACE --auth-type=legacy --registry=https://npm.pkg.github.com -u ${{ github.actor }} -p ${{ secrets.PAT }} npm pack npm publish From d63ded26cc01282c9820de456930a51f5772b8ea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emirhan=20Durmu=C5=9F?= Date: Tue, 2 Jan 2024 23:56:00 +0300 Subject: [PATCH 018/178] workflow --- .github/workflows/ci.yaml | 4 ++-- .npmrc | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index eea71ce21..4eff1fbe0 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -165,9 +165,9 @@ jobs: - name: npm pack with version from package version run: | - npm login --scope=@NAMESPACE --auth-type=legacy --registry=https://npm.pkg.github.com -u ${{ github.actor }} -p ${{ secrets.PAT }} + npm pack - npm publish + npm publish --registry=https://npm.pkg.github.com/ - name: Login to Github Container Registry uses: docker/login-action@v2 diff --git a/.npmrc b/.npmrc index 07627cd5c..ac38f6281 100644 --- a/.npmrc +++ b/.npmrc @@ -1,2 +1,2 @@ //npm.pkg.github.com/:_authToken=PAT -@NAMESPACE:registry=https://npm.pkg.github.com/Datasance \ No newline at end of file +@NAMESPACE:registry=https://npm.pkg.github.com/ \ No newline at end of file From 300b509ffa161be0ad3762423b6e29f198fc5d46 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emirhan=20Durmu=C5=9F?= Date: Wed, 3 Jan 2024 00:04:35 +0300 Subject: [PATCH 019/178] registry --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 183a51bc3..d533b8231 100644 --- a/package.json +++ b/package.json @@ -22,10 +22,10 @@ "homepage": "https://www.datasance.com", "repository": { "type": "git", - "url": "https://github.com/datasance/Controller" + "url": "https://github.com/Datasance/Controller" }, "publishConfig": { - "registry": "https://npm.pkg.github.com/Datasance" + "registry": "https://npm.pkg.github.com/" }, "scripts": { "prestart": "npm run lint", From 8c17f29ef7321b37ecee1b389bb075d6d9d12902 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emirhan=20Durmu=C5=9F?= Date: Wed, 3 Jan 2024 00:18:41 +0300 Subject: [PATCH 020/178] pkg repo edit --- .npmrc | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.npmrc b/.npmrc index ac38f6281..11cf9fea1 100644 --- a/.npmrc +++ b/.npmrc @@ -1,2 +1,2 @@ //npm.pkg.github.com/:_authToken=PAT -@NAMESPACE:registry=https://npm.pkg.github.com/ \ No newline at end of file +@Datasance:registry=https://npm.pkg.github.com/ \ No newline at end of file diff --git a/package.json b/package.json index d533b8231..0def6cf1d 100644 --- a/package.json +++ b/package.json @@ -1,5 +1,5 @@ { - "name": "iofogcontroller", + "name": "@datasance/iofogcontroller", "version": "3.0.4", "description": "ioFog Controller project for Eclipse IoFog @ iofog.org \\nCopyright (c) 2023 Datasance Teknoloji A.S.", "main": "./src/main.js", From 6eb4f13aba54a4fd7d4a130b14f1ff6a3e09be32 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emirhan=20Durmu=C5=9F?= Date: Wed, 3 Jan 2024 00:36:01 +0300 Subject: [PATCH 021/178] npm publish --- .github/workflows/ci.yaml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 4eff1fbe0..d9ac0b3f2 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -165,8 +165,6 @@ jobs: - name: npm pack with version from package version run: | - - npm pack npm publish --registry=https://npm.pkg.github.com/ - name: Login to Github Container Registry From 95eba20fd67bb5df76833736c544c7699b0d86e8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emirhan=20Durmu=C5=9F?= Date: Wed, 3 Jan 2024 01:03:56 +0300 Subject: [PATCH 022/178] workflow and dockerfile --- .github/workflows/ci.yaml | 31 ++++++++++++++++++++----------- Dockerfile.dev | 4 +++- Dockerfile.rel | 5 ++++- 3 files changed, 27 insertions(+), 13 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index d9ac0b3f2..a5da53947 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -125,15 +125,7 @@ jobs: pull-requests: write repository-projects: write security-events: write - statuses: write - strategy: - matrix: - platform: - - linux/amd64 - - linux/386 - - linux/arm/v6 - - linux/arm/v7 - - linux/arm64 + statuses: write name: Publish Controller steps: - uses: actions/checkout@v3 @@ -165,8 +157,26 @@ jobs: - name: npm pack with version from package version run: | + npm pack npm publish --registry=https://npm.pkg.github.com/ + - name: 'Get Previous tag' + id: previoustag + uses: "WyriHaximus/github-action-get-previous-tag@v1" + with: + fallback: 0.0.0 + - name: Set image tag + shell: bash + id: tags + run: | + if [[ ${{ github.ref_name }} =~ ^v.* ]] ; then + VERSION=${{ github.ref_name }} + echo "VERSION=${VERSION:1}" >> "${GITHUB_OUTPUT}" + else + VERSION=${{ steps.previoustag.outputs.tag }} + echo "VERSION=${VERSION:1}-${{ github.run_number }}" >> "${GITHUB_OUTPUT}" + fi + - name: Login to Github Container Registry uses: docker/login-action@v2 with: @@ -179,9 +189,8 @@ jobs: id: build_push_ghcr with: file: Dockerfile.dev - platforms: ${{ matrix.platforms }} push: true - outputs: type=image,name=target,annotation-index.org.opencontainers.image.description=Proxy + outputs: type=image,name=target,annotation-index.org.opencontainers.image.description=Controller tags: | ghcr.io/datasance/${{ env.IMAGE_NAME }}:${{ steps.tags.outputs.VERSION }} ghcr.io/datasance/${{ env.IMAGE_NAME }}:latest diff --git a/Dockerfile.dev b/Dockerfile.dev index 4b22594b8..6668bda69 100644 --- a/Dockerfile.dev +++ b/Dockerfile.dev @@ -36,5 +36,7 @@ RUN npm i -g /tmp/iofog-controller.tgz && \ rm -rf /tmp/iofog-controller.tgz && \ iofog-controller config dev-mode --on # RUN sudo rm -rf /usr/local/lib/node_modules/iofogcontroller/src/data/sqlite_files - +LABEL org.opencontainers.image.description controller +LABEL org.opencontainers.image.source=https://github.com/datasance/controller +LABEL org.opencontainers.image.licenses=EPL2.0 CMD [ "node", "/usr/local/lib/node_modules/@iofog/iofogcontroller/src/server.js" ] diff --git a/Dockerfile.rel b/Dockerfile.rel index be0bc0a7b..554fb3f86 100644 --- a/Dockerfile.rel +++ b/Dockerfile.rel @@ -30,11 +30,14 @@ ENV PYTHONUNBUFFERED=1 RUN apk add --update --no-cache python3 && ln -sf python3 /usr/bin/python RUN python3 -m ensurepip RUN pip3 install --no-cache --upgrade pip setuptools - +LABEL org.opencontainers.image.description controller +LABEL org.opencontainers.image.source=https://github.com/datasance/controller +LABEL org.opencontainers.image.licenses=EPL2.0 COPY --from=builder /tmp/iofog-iofogcontroller-*.tgz /tmp/iofog-controller.tgz RUN npm i -g /tmp/iofog-controller.tgz && \ rm -rf /tmp/iofog-controller.tgz && \ iofog-controller config dev-mode --on + CMD [ "node", "/usr/local/lib/node_modules/@iofog/iofogcontroller/src/server.js" ] From d3a9e5c9ad097fa0e14710fc59253f24d634c716 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emirhan=20Durmu=C5=9F?= Date: Wed, 3 Jan 2024 01:48:41 +0300 Subject: [PATCH 023/178] dockerfile update --- Dockerfile.dev | 6 +++--- Dockerfile.rel | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Dockerfile.dev b/Dockerfile.dev index 6668bda69..460e6c51f 100644 --- a/Dockerfile.dev +++ b/Dockerfile.dev @@ -16,7 +16,7 @@ RUN npm version $PKG_VERSION --allow-same-version --no-git-tag-version RUN npm pack -FROM node:hydrogen-alpine3.19 +FROM node:hydrogen-alpine3.17 RUN apk add sudo logrotate g++ make @@ -30,7 +30,7 @@ RUN apk add --update --no-cache python3 && ln -sf python3 /usr/bin/python RUN python3 -m ensurepip RUN pip3 install --no-cache --upgrade pip setuptools -COPY --from=builder /tmp/iofog-iofogcontroller-*.tgz /tmp/iofog-controller.tgz +COPY --from=builder /tmp/datasance-iofogcontroller-*.tgz /tmp/iofog-controller.tgz RUN npm i -g /tmp/iofog-controller.tgz && \ rm -rf /tmp/iofog-controller.tgz && \ @@ -39,4 +39,4 @@ RUN npm i -g /tmp/iofog-controller.tgz && \ LABEL org.opencontainers.image.description controller LABEL org.opencontainers.image.source=https://github.com/datasance/controller LABEL org.opencontainers.image.licenses=EPL2.0 -CMD [ "node", "/usr/local/lib/node_modules/@iofog/iofogcontroller/src/server.js" ] +CMD [ "node", "/usr/local/lib/node_modules/@datasance/iofogcontroller/src/server.js" ] diff --git a/Dockerfile.rel b/Dockerfile.rel index 554fb3f86..62df6f6b5 100644 --- a/Dockerfile.rel +++ b/Dockerfile.rel @@ -19,7 +19,7 @@ RUN npm version $PKG_VERSION --allow-same-version RUN npm pack -FROM node:hydrogen-alpine3.19 +FROM node:hydrogen-alpine3.17 RUN apk add sudo logrotate g++ make @@ -33,11 +33,11 @@ RUN pip3 install --no-cache --upgrade pip setuptools LABEL org.opencontainers.image.description controller LABEL org.opencontainers.image.source=https://github.com/datasance/controller LABEL org.opencontainers.image.licenses=EPL2.0 -COPY --from=builder /tmp/iofog-iofogcontroller-*.tgz /tmp/iofog-controller.tgz +COPY --from=builder /tmp/datasance-iofogcontroller-*.tgz /tmp/iofog-controller.tgz RUN npm i -g /tmp/iofog-controller.tgz && \ rm -rf /tmp/iofog-controller.tgz && \ iofog-controller config dev-mode --on -CMD [ "node", "/usr/local/lib/node_modules/@iofog/iofogcontroller/src/server.js" ] +CMD [ "node", "/usr/local/lib/node_modules/@datasance/iofogcontroller/src/server.js" ] From 1e4c05515a1e8e60d80494515c86f64bec6e663c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emirhan=20Durmu=C5=9F?= Date: Fri, 26 Jan 2024 20:50:17 +0300 Subject: [PATCH 024/178] add subscription_key to userprofile --- docs/swagger.yaml | 11 +++++++++++ src/cli/user.js | 7 +++++++ src/controllers/user-controller.js | 6 ++++-- src/data/managers/user-manager.js | 8 ++++++++ src/data/migrations/20180930155645-create-user.js | 7 ++++++- src/data/models/user.js | 7 ++++++- src/schemas/user.js | 11 +++++++---- src/services/user-service.js | 9 ++++++--- 8 files changed, 55 insertions(+), 11 deletions(-) diff --git a/docs/swagger.yaml b/docs/swagger.yaml index 4c055721d..3db6fb94d 100755 --- a/docs/swagger.yaml +++ b/docs/swagger.yaml @@ -5322,6 +5322,7 @@ components: - firstName - lastName - email + - subscription_key - emailActivated properties: userId: @@ -5332,6 +5333,8 @@ components: type: string email: type: string + subscription_key: + type: string emailActivated: type: boolean UserProfileDetailsResponse: @@ -5340,6 +5343,7 @@ components: - firstName - lastName - email + - subscription_key properties: firstName: type: string @@ -5347,6 +5351,8 @@ components: type: string email: type: string + subscription_key: + type: string UserProfileUpdatesRequest: type: object properties: @@ -5354,6 +5360,8 @@ components: type: string lastName: type: string + subscription_key: + type: string UserActivateRequest: type: object required: @@ -5392,6 +5400,7 @@ components: - lastName - email - password + - subscription_key properties: firstName: type: string @@ -5401,6 +5410,8 @@ components: type: string password: type: string + subscription_key: + type: string VersionCommandResponse: type: object required: diff --git a/src/cli/user.js b/src/cli/user.js index 252fa44c7..273b8b1ee 100644 --- a/src/cli/user.js +++ b/src/cli/user.js @@ -60,6 +60,13 @@ class User extends BaseCLIHandler { description: 'User\'s password', group: [constants.CMD_ADD, constants.CMD_UPDATE] }, + { + name: 'subscription_key', + alias: 's', + type: String, + description: 'User\'s susbcription_key', + group: [constants.CMD_ADD, constants.CMD_UPDATE] + }, { name: 'force', alias: 'F', diff --git a/src/controllers/user-controller.js b/src/controllers/user-controller.js index 939c2b896..e007ac59b 100644 --- a/src/controllers/user-controller.js +++ b/src/controllers/user-controller.js @@ -27,7 +27,8 @@ const userSignupEndPoint = async function (req) { firstName: user.firstName, lastName: user.lastName, email: user.email, - password: encryptedPassword + password: encryptedPassword, + subscription_key: user.subscription_key } return UserService.signUp(newUser, false) } @@ -64,7 +65,8 @@ const getUserProfileEndPoint = async function (req, user) { return { firstName: user.firstName, lastName: user.lastName, - email: user.email + email: user.email, + subscription_key: user.subscription_key } } diff --git a/src/data/managers/user-manager.js b/src/data/managers/user-manager.js index 78d2b5f6e..d6095ad2f 100644 --- a/src/data/managers/user-manager.js +++ b/src/data/managers/user-manager.js @@ -78,6 +78,14 @@ class UserManager extends BaseManager { }, transaction) } + updateSubscriptionKey (userId, newSubscriptionKey, transaction) { + return this.update({ + id: userId + }, { + subscription_key: newSubscriptionKey + }, transaction) + } + updateTempPassword (userId, tempPassword, transaction) { return this.update({ id: userId diff --git a/src/data/migrations/20180930155645-create-user.js b/src/data/migrations/20180930155645-create-user.js index 6a1a686d9..33501cb05 100644 --- a/src/data/migrations/20180930155645-create-user.js +++ b/src/data/migrations/20180930155645-create-user.js @@ -41,7 +41,12 @@ module.exports = { type: Sequelize.BOOLEAN, field: 'email_activated', defaultValue: false - } + }, + subscriptionKey: { + type: DataTypes.STRING(100), + field: 'subscription_key', + defaultValue: '' + } }) }, down: (queryInterface, Sequelize) => { diff --git a/src/data/models/user.js b/src/data/models/user.js index 48a38a4f1..22abff638 100644 --- a/src/data/models/user.js +++ b/src/data/models/user.js @@ -40,7 +40,12 @@ module.exports = (sequelize, DataTypes) => { type: DataTypes.BOOLEAN, field: 'email_activated', defaultValue: false - } + }, + subscriptionKey: { + type: DataTypes.STRING(100), + field: 'subscription_key', + defaultValue: '' + } }, { tableName: 'Users', timestamps: false, diff --git a/src/schemas/user.js b/src/schemas/user.js index 06e60e036..f4afb5eab 100644 --- a/src/schemas/user.js +++ b/src/schemas/user.js @@ -22,9 +22,10 @@ const signUp = { 'pattern': '^(([^<>()\\[\\]\\\\.,;:\\s@"]+(\\.[^<>()\\[\\]\\\\.,;:\\s@"]+)*)|(".+"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}' + '\\.[0-9]{1,3}\\.[0-9]{1,3}])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$' }, - 'password': { 'type': 'string', 'minLength': 8 } + 'password': { 'type': 'string', 'minLength': 8 }, + 'subscription_key': { 'type': 'string', 'minLength': 15 } }, - 'required': ['email', 'password', 'firstName', 'lastName'], + 'required': ['email', 'password', 'firstName', 'lastName', 'subscription_key'], 'additionalProperties': true } @@ -82,7 +83,8 @@ const updateUserProfile = { 'type': 'object', 'properties': { 'firstName': { 'type': 'string', 'minLength': 3 }, - 'lastName': { 'type': 'string', 'minLength': 3 } + 'lastName': { 'type': 'string', 'minLength': 3 }, + 'subscription_key': { 'type': 'string', 'minLength': 15 } }, 'required': [], 'additionalProperties': true @@ -94,7 +96,8 @@ const updateUserProfileCLI = { 'properties': { 'firstName': { 'type': 'string', 'minLength': 3 }, 'lastName': { 'type': 'string', 'minLength': 3 }, - 'password': { 'type': 'string', 'minLength': 8 } + 'password': { 'type': 'string', 'minLength': 8 }, + 'subscription_key': { 'type': 'string', 'minLength': 15 } }, 'required': [], 'additionalProperties': true diff --git a/src/services/user-service.js b/src/services/user-service.js index 777fe3324..2431c10f6 100644 --- a/src/services/user-service.js +++ b/src/services/user-service.js @@ -141,11 +141,13 @@ const updateUserDetails = async function (user, profileData, isCLI, transaction) ? { firstName: profileData.firstName, lastName: profileData.lastName, - password: password + password: password, + subscrtiption_key: profileData.subscrtiption_key } : { firstName: profileData.firstName, - lastName: profileData.lastName + lastName: profileData.lastName, + subscrtiption_key: profileData.subscrtiption_key } updateObject = AppHelper.deleteUndefinedFields(updateObject) @@ -155,7 +157,8 @@ const updateUserDetails = async function (user, profileData, isCLI, transaction) return { firstName: updateObject.firstName, lastName: updateObject.lastName, - email: user.email + email: user.email, + subscrtiption_key: profileData.subscrtiption_key } } From 5b4e629096b5e48b16ed40f88e822c6a4cfc1a7c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emirhan=20Durmu=C5=9F?= Date: Fri, 26 Jan 2024 21:27:43 +0300 Subject: [PATCH 025/178] makefile and create-user data type fix --- Makefile | 14 ++++++++++++++ src/data/migrations/20180930155645-create-user.js | 5 +++-- 2 files changed, 17 insertions(+), 2 deletions(-) create mode 100644 Makefile diff --git a/Makefile b/Makefile new file mode 100644 index 000000000..a8960fddf --- /dev/null +++ b/Makefile @@ -0,0 +1,14 @@ +DOCKER_IMAGE_VERSION=1.0 +DOCKER_IMAGE_NAME=emirhandurmus/controller +DOCKER_IMAGE_TAGNAME=$(DOCKER_IMAGE_NAME):$(DOCKER_IMAGE_VERSION) + +default: build + +build: + docker build -t $(DOCKER_IMAGE_TAGNAME) -f Dockerfile.dev . + docker tag $(DOCKER_IMAGE_TAGNAME) $(DOCKER_IMAGE_NAME):latest + +push:build + docker push $(DOCKER_IMAGE_TAGNAME) + docker push $(DOCKER_IMAGE_NAME) + diff --git a/src/data/migrations/20180930155645-create-user.js b/src/data/migrations/20180930155645-create-user.js index 33501cb05..397ab3df7 100644 --- a/src/data/migrations/20180930155645-create-user.js +++ b/src/data/migrations/20180930155645-create-user.js @@ -42,8 +42,9 @@ module.exports = { field: 'email_activated', defaultValue: false }, - subscriptionKey: { - type: DataTypes.STRING(100), + SubscriptionKey: { + /* eslint-disable new-cap */ + type: Sequelize.STRING(100), field: 'subscription_key', defaultValue: '' } From de613807a54a245d33e7c44bb8c0b885a816d811 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emirhan=20Durmu=C5=9F?= Date: Fri, 26 Jan 2024 23:52:36 +0300 Subject: [PATCH 026/178] commit --- src/data/migrations/20180930155645-create-user.js | 2 +- src/data/models/user.js | 2 +- test/postman_collection.json | 8 ++++---- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/data/migrations/20180930155645-create-user.js b/src/data/migrations/20180930155645-create-user.js index 397ab3df7..283cf6df8 100644 --- a/src/data/migrations/20180930155645-create-user.js +++ b/src/data/migrations/20180930155645-create-user.js @@ -47,7 +47,7 @@ module.exports = { type: Sequelize.STRING(100), field: 'subscription_key', defaultValue: '' - } + } }) }, down: (queryInterface, Sequelize) => { diff --git a/src/data/models/user.js b/src/data/models/user.js index 22abff638..8081a5f4a 100644 --- a/src/data/models/user.js +++ b/src/data/models/user.js @@ -45,7 +45,7 @@ module.exports = (sequelize, DataTypes) => { type: DataTypes.STRING(100), field: 'subscription_key', defaultValue: '' - } + } }, { tableName: 'Users', timestamps: false, diff --git a/test/postman_collection.json b/test/postman_collection.json index fae782fa3..f5627f641 100644 --- a/test/postman_collection.json +++ b/test/postman_collection.json @@ -20,7 +20,7 @@ "", "var data = JSON.parse(responseBody);", "", - "tests[\"Response validation passed\"] = data.hasOwnProperty('userId') && data.firstName && data.lastName && data.email && data.hasOwnProperty('emailActivated');" + "tests[\"Response validation passed\"] = data.hasOwnProperty('userId') && data.firstName && data.lastName && data.email && data.subscription_key && data.hasOwnProperty('emailActivated');" ], "type": "text/javascript" } @@ -36,7 +36,7 @@ ], "body": { "mode": "raw", - "raw": "{\n \"firstName\": \"John\",\n \"lastName\": \"Doe\",\n \"email\": \"user@domain.com\",\n \"password\": \"#Bugs4Fun\"\n}" + "raw": "{\n \"firstName\": \"John\",\n \"lastName\": \"Doe\",\n \"email\": \"user@domain.com\",\n \"password\": \"#Bugs4Fun\",\n \"subscription-key\": \"xxxx-xxxx-xxxx-xxxx\"\n}" }, "url": { "raw": "{{host}}/api/v3/user/signup", @@ -282,7 +282,7 @@ "", "var data = JSON.parse(responseBody);", "", - "tests[\"Response validation passed\"] = data.firstName && data.lastName && data.email;" + "tests[\"Response validation passed\"] = data.firstName && data.lastName && data.email && data.subscription_key;" ], "type": "text/javascript" } @@ -362,7 +362,7 @@ "", "var data = JSON.parse(responseBody);", "", - "tests[\"Response validation passed\"] = data.firstName && data.lastName && data.email;" + "tests[\"Response validation passed\"] = data.firstName && data.lastName && data.email && data.subscription_key;" ], "type": "text/javascript" } From 7912ced84bc7b0380f69ba8e027c83e0306472af Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emirhan=20Durmu=C5=9F?= Date: Sat, 27 Jan 2024 14:26:10 +0300 Subject: [PATCH 027/178] subscriptionKey modification --- docs/swagger.json | 2 +- docs/swagger.yaml | 16 ++--- src/cli/user.js | 4 +- src/controllers/user-controller.js | 4 +- src/data/managers/user-manager.js | 8 --- .../migrations/20180930155645-create-user.js | 4 +- src/data/models/user.js | 2 +- src/schemas/user.js | 8 +-- src/services/user-service.js | 7 ++- test/postman_collection.json | 62 +++++++++---------- 10 files changed, 55 insertions(+), 62 deletions(-) diff --git a/docs/swagger.json b/docs/swagger.json index 3e57c5ac5..283fa21f1 100644 --- a/docs/swagger.json +++ b/docs/swagger.json @@ -1,5 +1,5 @@ { - "swagger" : "3.0.0", + "openapi" : "3.0.0", "info" : { "version" : "3.0.0", "title" : "ioFog Controller" diff --git a/docs/swagger.yaml b/docs/swagger.yaml index 3db6fb94d..6069a1511 100755 --- a/docs/swagger.yaml +++ b/docs/swagger.yaml @@ -1,4 +1,4 @@ -swagger: "3.0.0" +openapi: "3.0.0" info: version: 3.0.0 title: ioFog Controller @@ -5322,7 +5322,7 @@ components: - firstName - lastName - email - - subscription_key + - subscriptionKey - emailActivated properties: userId: @@ -5333,7 +5333,7 @@ components: type: string email: type: string - subscription_key: + subscriptionKey: type: string emailActivated: type: boolean @@ -5343,7 +5343,7 @@ components: - firstName - lastName - email - - subscription_key + - subscriptionKey properties: firstName: type: string @@ -5351,7 +5351,7 @@ components: type: string email: type: string - subscription_key: + subscriptionKey: type: string UserProfileUpdatesRequest: type: object @@ -5360,7 +5360,7 @@ components: type: string lastName: type: string - subscription_key: + subscriptionKey: type: string UserActivateRequest: type: object @@ -5400,7 +5400,7 @@ components: - lastName - email - password - - subscription_key + - subscriptionKey properties: firstName: type: string @@ -5410,7 +5410,7 @@ components: type: string password: type: string - subscription_key: + subscriptionKey: type: string VersionCommandResponse: type: object diff --git a/src/cli/user.js b/src/cli/user.js index 273b8b1ee..fdd0ad6e3 100644 --- a/src/cli/user.js +++ b/src/cli/user.js @@ -61,10 +61,10 @@ class User extends BaseCLIHandler { group: [constants.CMD_ADD, constants.CMD_UPDATE] }, { - name: 'subscription_key', + name: 'subscriptionKey', alias: 's', type: String, - description: 'User\'s susbcription_key', + description: 'User\'s subscriptionKey', group: [constants.CMD_ADD, constants.CMD_UPDATE] }, { diff --git a/src/controllers/user-controller.js b/src/controllers/user-controller.js index e007ac59b..de0db5059 100644 --- a/src/controllers/user-controller.js +++ b/src/controllers/user-controller.js @@ -28,7 +28,7 @@ const userSignupEndPoint = async function (req) { lastName: user.lastName, email: user.email, password: encryptedPassword, - subscription_key: user.subscription_key + subscriptionKey: user.subscriptionKey } return UserService.signUp(newUser, false) } @@ -66,7 +66,7 @@ const getUserProfileEndPoint = async function (req, user) { firstName: user.firstName, lastName: user.lastName, email: user.email, - subscription_key: user.subscription_key + subscriptionKey: user.subscriptionKey } } diff --git a/src/data/managers/user-manager.js b/src/data/managers/user-manager.js index d6095ad2f..78d2b5f6e 100644 --- a/src/data/managers/user-manager.js +++ b/src/data/managers/user-manager.js @@ -78,14 +78,6 @@ class UserManager extends BaseManager { }, transaction) } - updateSubscriptionKey (userId, newSubscriptionKey, transaction) { - return this.update({ - id: userId - }, { - subscription_key: newSubscriptionKey - }, transaction) - } - updateTempPassword (userId, tempPassword, transaction) { return this.update({ id: userId diff --git a/src/data/migrations/20180930155645-create-user.js b/src/data/migrations/20180930155645-create-user.js index 283cf6df8..d1d119d5c 100644 --- a/src/data/migrations/20180930155645-create-user.js +++ b/src/data/migrations/20180930155645-create-user.js @@ -42,10 +42,10 @@ module.exports = { field: 'email_activated', defaultValue: false }, - SubscriptionKey: { + subscriptionKey: { /* eslint-disable new-cap */ type: Sequelize.STRING(100), - field: 'subscription_key', + field: 'subscriptionKey', defaultValue: '' } }) diff --git a/src/data/models/user.js b/src/data/models/user.js index 8081a5f4a..acd0a827f 100644 --- a/src/data/models/user.js +++ b/src/data/models/user.js @@ -43,7 +43,7 @@ module.exports = (sequelize, DataTypes) => { }, subscriptionKey: { type: DataTypes.STRING(100), - field: 'subscription_key', + field: 'subscriptionKey', defaultValue: '' } }, { diff --git a/src/schemas/user.js b/src/schemas/user.js index f4afb5eab..d65fe9d58 100644 --- a/src/schemas/user.js +++ b/src/schemas/user.js @@ -23,9 +23,9 @@ const signUp = { '\\.[0-9]{1,3}\\.[0-9]{1,3}])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$' }, 'password': { 'type': 'string', 'minLength': 8 }, - 'subscription_key': { 'type': 'string', 'minLength': 15 } + 'subscriptionKey': { 'type': 'string', 'minLength': 15 } }, - 'required': ['email', 'password', 'firstName', 'lastName', 'subscription_key'], + 'required': ['email', 'password', 'firstName', 'lastName'], 'additionalProperties': true } @@ -84,7 +84,7 @@ const updateUserProfile = { 'properties': { 'firstName': { 'type': 'string', 'minLength': 3 }, 'lastName': { 'type': 'string', 'minLength': 3 }, - 'subscription_key': { 'type': 'string', 'minLength': 15 } + 'subscriptionKey': { 'type': 'string', 'minLength': 15 } }, 'required': [], 'additionalProperties': true @@ -97,7 +97,7 @@ const updateUserProfileCLI = { 'firstName': { 'type': 'string', 'minLength': 3 }, 'lastName': { 'type': 'string', 'minLength': 3 }, 'password': { 'type': 'string', 'minLength': 8 }, - 'subscription_key': { 'type': 'string', 'minLength': 15 } + 'subscriptionKey': { 'type': 'string', 'minLength': 15 } }, 'required': [], 'additionalProperties': true diff --git a/src/services/user-service.js b/src/services/user-service.js index 2431c10f6..f500ea9a0 100644 --- a/src/services/user-service.js +++ b/src/services/user-service.js @@ -142,12 +142,12 @@ const updateUserDetails = async function (user, profileData, isCLI, transaction) firstName: profileData.firstName, lastName: profileData.lastName, password: password, - subscrtiption_key: profileData.subscrtiption_key + subscriptionKey: profileData.subscriptionKey } : { firstName: profileData.firstName, lastName: profileData.lastName, - subscrtiption_key: profileData.subscrtiption_key + subscriptionKey: profileData.subscriptionKey } updateObject = AppHelper.deleteUndefinedFields(updateObject) @@ -158,7 +158,7 @@ const updateUserDetails = async function (user, profileData, isCLI, transaction) firstName: updateObject.firstName, lastName: updateObject.lastName, email: user.email, - subscrtiption_key: profileData.subscrtiption_key + subscriptionKey: profileData.subscriptionKey } } @@ -312,6 +312,7 @@ async function _handleCreateUser (user, isEmailActivationEnabled, transaction) { firstName: newUser.firstName, lastName: newUser.lastName, email: newUser.email, + subscriptionKey: newUser.subscriptionKey, emailActivated: user.emailActivated } } diff --git a/test/postman_collection.json b/test/postman_collection.json index f5627f641..2cd28d63e 100644 --- a/test/postman_collection.json +++ b/test/postman_collection.json @@ -20,7 +20,7 @@ "", "var data = JSON.parse(responseBody);", "", - "tests[\"Response validation passed\"] = data.hasOwnProperty('userId') && data.firstName && data.lastName && data.email && data.subscription_key && data.hasOwnProperty('emailActivated');" + "tests[\"Response validation passed\"] = data.hasOwnProperty('userId') && data.firstName && data.lastName && data.email && data.subscriptionKey && data.hasOwnProperty('emailActivated');" ], "type": "text/javascript" } @@ -36,7 +36,7 @@ ], "body": { "mode": "raw", - "raw": "{\n \"firstName\": \"John\",\n \"lastName\": \"Doe\",\n \"email\": \"user@domain.com\",\n \"password\": \"#Bugs4Fun\",\n \"subscription-key\": \"xxxx-xxxx-xxxx-xxxx\"\n}" + "raw": "{\n \"firstName\": \"John\",\n \"lastName\": \"Doe\",\n \"email\": \"user@domain.com\",\n \"password\": \"#Bugs4Fun\",\n \"subscriptionKey\": \"xxxx-xxxx-xxxx-xxxx\"\n}" }, "url": { "raw": "{{host}}/api/v3/user/signup", @@ -282,7 +282,7 @@ "", "var data = JSON.parse(responseBody);", "", - "tests[\"Response validation passed\"] = data.firstName && data.lastName && data.email && data.subscription_key;" + "tests[\"Response validation passed\"] = data.firstName && data.lastName && data.email && data.subscriptionKey;" ], "type": "text/javascript" } @@ -362,7 +362,7 @@ "", "var data = JSON.parse(responseBody);", "", - "tests[\"Response validation passed\"] = data.firstName && data.lastName && data.email && data.subscription_key;" + "tests[\"Response validation passed\"] = data.firstName && data.lastName && data.email && data.subscriptionKey;" ], "type": "text/javascript" } @@ -382,7 +382,7 @@ ], "body": { "mode": "raw", - "raw": "{\n \"firstName\": \"Saeid\",\n \"lastName\": \"Rezaei\"\n}" + "raw": "{\n \"firstName\": \"Saeid\",\n \"lastName\": \"Rezaei\",\n \"subscriptionKey\": \"XXXX-XXXX-XXXX-XXXX\"\n}" }, "url": { "raw": "{{host}}/api/v3/user/profile", @@ -700,7 +700,7 @@ "", "var data = JSON.parse(responseBody);", "", - "tests[\"Response validation passed\"] = data.hasOwnProperty('userId') && data.firstName && data.lastName && data.email && data.hasOwnProperty('emailActivated');" + "tests[\"Response validation passed\"] = data.hasOwnProperty('userId') && data.firstName && data.lastName && data.email && data.subscriptionKey && data.hasOwnProperty('emailActivated');" ], "type": "text/javascript" } @@ -716,7 +716,7 @@ ], "body": { "mode": "raw", - "raw": "{\n \"firstName\": \"John\",\n \"lastName\": \"Doe\",\n \"email\": \"user@domain.com\",\n \"password\": \"#Bugs4Fun\"\n}" + "raw": "{\n \"firstName\": \"John\",\n \"lastName\": \"Doe\",\n \"email\": \"user@domain.com\",\n \"password\": \"#Bugs4Fun\",\n \"subscriptionKey\": \"XXXX-XXXX-XXXX-XXXX\"\n}" }, "url": { "raw": "{{host}}/api/v3/user/signup", @@ -1907,7 +1907,7 @@ "", "var data = JSON.parse(responseBody);", "", - "tests[\"Response validation passed\"] = data.hasOwnProperty('userId') && data.firstName && data.lastName && data.email && data.hasOwnProperty('emailActivated');" + "tests[\"Response validation passed\"] = data.hasOwnProperty('userId') && data.firstName && data.lastName && data.email && data.subscriptionKey && data.hasOwnProperty('emailActivated');" ], "type": "text/javascript" } @@ -1923,7 +1923,7 @@ ], "body": { "mode": "raw", - "raw": "{\n \"firstName\": \"John\",\n \"lastName\": \"Doe\",\n \"email\": \"user@domain.com\",\n \"password\": \"#Bugs4Fun\"\n}" + "raw": "{\n \"firstName\": \"John\",\n \"lastName\": \"Doe\",\n \"email\": \"user@domain.com\",\n \"password\": \"#Bugs4Fun\",\n \"subscriptionKey\": \"XXXX-XXXX-XXXX-XXXX\"\n}" }, "url": { "raw": "{{host}}/api/v3/user/signup", @@ -3343,7 +3343,7 @@ "", "var data = JSON.parse(responseBody);", "", - "tests[\"Response validation passed\"] = data.hasOwnProperty('userId') && data.firstName && data.lastName && data.email && data.hasOwnProperty('emailActivated');" + "tests[\"Response validation passed\"] = data.hasOwnProperty('userId') && data.firstName && data.lastName && data.email && data.subscriptionKey && data.hasOwnProperty('emailActivated');" ], "type": "text/javascript" } @@ -3359,7 +3359,7 @@ ], "body": { "mode": "raw", - "raw": "{\n \"firstName\": \"John\",\n \"lastName\": \"Doe\",\n \"email\": \"user@domain.com\",\n \"password\": \"#Bugs4Fun\"\n}" + "raw": "{\n \"firstName\": \"John\",\n \"lastName\": \"Doe\",\n \"email\": \"user@domain.com\",\n \"password\": \"#Bugs4Fun\",\n \"subscriptionKey\": \"XXXX-XXXX-XXXX-XXXX\"\n }" }, "url": { "raw": "{{host}}/api/v3/user/signup", @@ -4398,7 +4398,7 @@ "", "var data = JSON.parse(responseBody);", "", - "tests[\"Response validation passed\"] = data.hasOwnProperty('userId') && data.firstName && data.lastName && data.email && data.hasOwnProperty('emailActivated');" + "tests[\"Response validation passed\"] = data.hasOwnProperty('userId') && data.firstName && data.lastName && data.email && data.subscriptionKey && data.hasOwnProperty('emailActivated');" ], "type": "text/javascript" } @@ -4414,7 +4414,7 @@ ], "body": { "mode": "raw", - "raw": "{\n \"firstName\": \"John\",\n \"lastName\": \"Doe\",\n \"email\": \"user@domain.com\",\n \"password\": \"#Bugs4Fun\"\n}" + "raw": "{\n \"firstName\": \"John\",\n \"lastName\": \"Doe\",\n \"email\": \"user@domain.com\",\n \"password\": \"#Bugs4Fun\",\n \"subscriptionKey\": \"XXXX-XXXX-XXXX-XXXX\"\n}" }, "url": { "raw": "{{host}}/api/v3/user/signup", @@ -5530,7 +5530,7 @@ "", "var data = JSON.parse(responseBody);", "", - "tests[\"Response validation passed\"] = data.hasOwnProperty('userId') && data.firstName && data.lastName && data.email && data.hasOwnProperty('emailActivated');" + "tests[\"Response validation passed\"] = data.hasOwnProperty('userId') && data.firstName && data.lastName && data.email && data.subscriptionKey && data.hasOwnProperty('emailActivated');" ], "type": "text/javascript" } @@ -5546,7 +5546,7 @@ ], "body": { "mode": "raw", - "raw": "{\n \"firstName\": \"John\",\n \"lastName\": \"Doe\",\n \"email\": \"user@domain.com\",\n \"password\": \"#Bugs4Fun\"\n}" + "raw": "{\n \"firstName\": \"John\",\n \"lastName\": \"Doe\",\n \"email\": \"user@domain.com\",\n \"password\": \"#Bugs4Fun\",\n \"subscriptionKey\": \"XXXX-XXXX-XXXX-XXXX\"\n}" }, "url": { "raw": "{{host}}/api/v3/user/signup", @@ -5965,7 +5965,7 @@ "", "var data = JSON.parse(responseBody);", "", - "tests[\"Response validation passed\"] = data.hasOwnProperty('userId') && data.firstName && data.lastName && data.email && data.hasOwnProperty('emailActivated');" + "tests[\"Response validation passed\"] = data.hasOwnProperty('userId') && data.firstName && data.lastName && data.email && data.subscriptionKey && data.hasOwnProperty('emailActivated');" ], "type": "text/javascript" } @@ -5981,7 +5981,7 @@ ], "body": { "mode": "raw", - "raw": "{\n \"firstName\": \"John\",\n \"lastName\": \"Doe\",\n \"email\": \"user@domain.com\",\n \"password\": \"#Bugs4Fun\"\n}" + "raw": "{\n \"firstName\": \"John\",\n \"lastName\": \"Doe\",\n \"email\": \"user@domain.com\",\n \"password\": \"#Bugs4Fun\",\n \"subscriptionKey\": \"XXXX-XXXX-XXXX-XXXX\"\n}" }, "url": { "raw": "{{host}}/api/v3/user/signup", @@ -7792,7 +7792,7 @@ "", "var data = JSON.parse(responseBody);", "", - "tests[\"Response validation passed\"] = data.hasOwnProperty('userId') && data.firstName && data.lastName && data.email && data.hasOwnProperty('emailActivated');" + "tests[\"Response validation passed\"] = data.hasOwnProperty('userId') && data.firstName && data.lastName && data.email && data.subscriptionKey && data.hasOwnProperty('emailActivated');" ], "type": "text/javascript" } @@ -7808,7 +7808,7 @@ ], "body": { "mode": "raw", - "raw": "{\n \"firstName\": \"John\",\n \"lastName\": \"Doe\",\n \"email\": \"user@domain.com\",\n \"password\": \"#Bugs4Fun\"\n}" + "raw": "{\n \"firstName\": \"John\",\n \"lastName\": \"Doe\",\n \"email\": \"user@domain.com\",\n \"password\": \"#Bugs4Fun\",\n \"subscriptionKey\": \"XXXX-XXXX-XXXX-XXXX\"\n}" }, "url": { "raw": "{{host}}/api/v3/user/signup", @@ -8192,7 +8192,7 @@ "", "var data = JSON.parse(responseBody);", "", - "tests[\"Response validation passed\"] = data.hasOwnProperty('userId') && data.firstName && data.lastName && data.email && data.hasOwnProperty('emailActivated');" + "tests[\"Response validation passed\"] = data.hasOwnProperty('userId') && data.firstName && data.lastName && data.email && data.subscriptionKey && data.hasOwnProperty('emailActivated');" ], "type": "text/javascript" } @@ -8208,7 +8208,7 @@ ], "body": { "mode": "raw", - "raw": "{\n \"firstName\": \"John\",\n \"lastName\": \"Doe\",\n \"email\": \"user@domain.com\",\n \"password\": \"#Bugs4Fun\"\n}" + "raw": "{\n \"firstName\": \"John\",\n \"lastName\": \"Doe\",\n \"email\": \"user@domain.com\",\n \"password\": \"#Bugs4Fun\",\n \"subscriptionKey\": \"XXXX-XXXX-XXXX-XXXX\"\n}" }, "url": { "raw": "{{host}}/api/v3/user/signup", @@ -8682,7 +8682,7 @@ "", "var data = JSON.parse(responseBody);", "", - "tests[\"Response validation passed\"] = data.hasOwnProperty('userId') && data.firstName && data.lastName && data.email && data.hasOwnProperty('emailActivated');" + "tests[\"Response validation passed\"] = data.hasOwnProperty('userId') && data.firstName && data.lastName && data.email && data.subscriptionKey && data.hasOwnProperty('emailActivated');" ], "type": "text/javascript" } @@ -8698,7 +8698,7 @@ ], "body": { "mode": "raw", - "raw": "{\n \"firstName\": \"John\",\n \"lastName\": \"Doe\",\n \"email\": \"user@domain.com\",\n \"password\": \"#Bugs4Fun\"\n}" + "raw": "{\n \"firstName\": \"John\",\n \"lastName\": \"Doe\",\n \"email\": \"user@domain.com\",\n \"password\": \"#Bugs4Fun\",\n \"subscriptionKey\": \"XXXX-XXXX-XXXX-XXXX\"\n}" }, "url": { "raw": "{{host}}/api/v3/user/signup", @@ -10513,7 +10513,7 @@ "", "var data = JSON.parse(responseBody);", "", - "tests[\"Response validation passed\"] = data.hasOwnProperty('userId') && data.firstName && data.lastName && data.email && data.hasOwnProperty('emailActivated');" + "tests[\"Response validation passed\"] = data.hasOwnProperty('userId') && data.firstName && data.lastName && data.email && data.subscriptionKey && data.hasOwnProperty('emailActivated');" ], "type": "text/javascript" } @@ -10529,7 +10529,7 @@ ], "body": { "mode": "raw", - "raw": "{\n \"firstName\": \"John\",\n \"lastName\": \"Doe\",\n \"email\": \"user@domain.com\",\n \"password\": \"#Bugs4Fun\"\n}" + "raw": "{\n \"firstName\": \"John\",\n \"lastName\": \"Doe\",\n \"email\": \"user@domain.com\",\n \"password\": \"#Bugs4Fun\",\n \"subscriptionKey\": \"XXXX-XXXX-XXXX-XXXX\"\n}" }, "url": { "raw": "{{host}}/api/v3/user/signup", @@ -11401,7 +11401,7 @@ "", "var data = JSON.parse(responseBody);", "", - "tests[\"Response validation passed\"] = data.hasOwnProperty('userId') && data.firstName && data.lastName && data.email && data.hasOwnProperty('emailActivated');" + "tests[\"Response validation passed\"] = data.hasOwnProperty('userId') && data.firstName && data.lastName && data.email && data.subscriptionKey && data.hasOwnProperty('emailActivated');" ], "type": "text/javascript" } @@ -11417,7 +11417,7 @@ ], "body": { "mode": "raw", - "raw": "{\n \"firstName\": \"John\",\n \"lastName\": \"Doe\",\n \"email\": \"user@domain.com\",\n \"password\": \"#Bugs4Fun\"\n}" + "raw": "{\n \"firstName\": \"John\",\n \"lastName\": \"Doe\",\n \"email\": \"user@domain.com\",\n \"password\": \"#Bugs4Fun\",\n \"subscriptionKey\": \"XXXX-XXXX-XXXX-XXXX\"\n}" }, "url": { "raw": "{{host}}/api/v3/user/signup", @@ -12351,7 +12351,7 @@ "", "var data = JSON.parse(responseBody);", "", - "tests[\"Response validation passed\"] = data.hasOwnProperty('userId') && data.firstName && data.lastName && data.email && data.hasOwnProperty('emailActivated');" + "tests[\"Response validation passed\"] = data.hasOwnProperty('userId') && data.firstName && data.lastName && data.email && data.subscriptionKey && data.hasOwnProperty('emailActivated');" ], "type": "text/javascript" } @@ -12367,7 +12367,7 @@ ], "body": { "mode": "raw", - "raw": "{\n \"firstName\": \"John\",\n \"lastName\": \"Doe\",\n \"email\": \"user@domain.com\",\n \"password\": \"#Bugs4Fun\"\n}" + "raw": "{\n \"firstName\": \"John\",\n \"lastName\": \"Doe\",\n \"email\": \"user@domain.com\",\n \"password\": \"#Bugs4Fun\",\n \"subscriptionKey\": \"XXXX-XXXX-XXXX-XXXX\"\n}" }, "url": { "raw": "{{host}}/api/v3/user/signup", @@ -12698,7 +12698,7 @@ "", "var data = JSON.parse(responseBody);", "", - "tests[\"Response validation passed\"] = data.hasOwnProperty('userId') && data.firstName && data.lastName && data.email && data.hasOwnProperty('emailActivated');" + "tests[\"Response validation passed\"] = data.hasOwnProperty('userId') && data.firstName && data.lastName && data.email && data.subscriptionKey && data.hasOwnProperty('emailActivated');" ], "type": "text/javascript" } @@ -12714,7 +12714,7 @@ ], "body": { "mode": "raw", - "raw": "{\n \"firstName\": \"John\",\n \"lastName\": \"Doe\",\n \"email\": \"user@domain.com\",\n \"password\": \"#Bugs4Fun\"\n}" + "raw": "{\n \"firstName\": \"John\",\n \"lastName\": \"Doe\",\n \"email\": \"user@domain.com\",\n \"password\": \"#Bugs4Fun\",\n \"subscriptionKey\": \"XXXX-XXXX-XXXX-XXXX\"\n}" }, "url": { "raw": "{{host}}/api/v3/user/signup", From e21f0313af078747fca8263667d4b61e388473cc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emirhan=20Durmu=C5=9F?= Date: Sat, 27 Jan 2024 15:37:34 +0300 Subject: [PATCH 028/178] swagger aut edit --- docs/swagger.yaml | 687 ++++++++++++---------------------------------- 1 file changed, 169 insertions(+), 518 deletions(-) diff --git a/docs/swagger.yaml b/docs/swagger.yaml index 6069a1511..e56f60c48 100755 --- a/docs/swagger.yaml +++ b/docs/swagger.yaml @@ -59,13 +59,8 @@ paths: - ioFog summary: Returns list of ioFog nodes operationId: getIOFogNodes - parameters: - - in: header - name: Authorization - description: User token - required: true - schema: - type: string + security: + - tokenHeader: [] requestBody: content: application/json: @@ -95,13 +90,8 @@ paths: - ioFog summary: Creates a new ioFog node operationId: createIOFogNode - parameters: - - in: header - name: Authorization - description: User token - required: true - schema: - type: string + security: + - tokenHeader: [] requestBody: $ref: "#/components/requestBodies/UpdateIOFogNodeRequestBody" responses: @@ -135,12 +125,8 @@ paths: required: true schema: type: string - - in: header - name: Authorization - description: User token - required: true - schema: - type: string + security: + - tokenHeader: [] requestBody: $ref: "#/components/requestBodies/UpdateIOFogNodeRequestBody" responses: @@ -171,12 +157,8 @@ paths: required: true schema: type: string - - in: header - name: Authorization - description: User token - required: true - schema: - type: string + security: + - tokenHeader: [] responses: "202": description: Accepted @@ -203,12 +185,8 @@ paths: required: true schema: type: string - - in: header - name: Authorization - description: User token - required: true - schema: - type: string + security: + - tokenHeader: [] responses: "200": description: Success @@ -240,12 +218,8 @@ paths: required: true schema: type: string - - in: header - name: Authorization - description: User token - required: true - schema: - type: string + security: + - tokenHeader: [] responses: "201": description: Success @@ -271,12 +245,6 @@ paths: summary: Set change version command operationId: setVersionCommand parameters: - - in: header - name: Authorization - description: User token - required: true - schema: - type: string - in: path name: uuid description: ioFog node id @@ -292,6 +260,8 @@ paths: enum: - upgrade - rollback + security: + - tokenHeader: [] responses: "204": description: Success @@ -315,18 +285,14 @@ paths: summary: remote reboot fog agent operationId: setRebootCommand parameters: - - in: header - name: Authorization - description: User Token - required: true - schema: - type: string - in: path name: uuid description: ioFog node id required: true schema: type: string + security: + - tokenHeader: [] responses: "204": description: Success @@ -346,18 +312,14 @@ paths: summary: prune reboot fog agent operationId: setPruneCommand parameters: - - in: header - name: Authorization - description: User Token - required: true - schema: - type: string - in: path name: uuid description: ioFog node id required: true schema: type: string + security: + - tokenHeader: [] responses: "204": description: Success @@ -383,12 +345,8 @@ paths: required: true schema: type: string - - in: header - name: Authorization - description: User token - required: true - schema: - type: string + security: + - tokenHeader: [] responses: "200": description: Success @@ -420,12 +378,8 @@ paths: required: true schema: type: string - - in: header - name: Authorization - description: User token - required: true - schema: - type: string + security: + - tokenHeader: [] responses: "200": description: Success @@ -450,13 +404,8 @@ paths: - Application summary: Lists all applications operationId: listApplication - parameters: - - in: header - name: Authorization - description: User Token - required: true - schema: - type: string + security: + - tokenHeader: [] responses: "200": description: Success @@ -481,13 +430,8 @@ paths: summary: Creates an application operationId: createApplication deprecated: true - parameters: - - in: header - name: Authorization - description: User Token - required: true - schema: - type: string + security: + - tokenHeader: [] requestBody: content: application/json: @@ -518,13 +462,8 @@ paths: - Application summary: Creates an application using a YAML file operationId: createApplicationYAML - parameters: - - in: header - name: Authorization - description: User Token - required: true - schema: - type: string + security: + - tokenHeader: [] requestBody: required: true content: @@ -560,18 +499,14 @@ paths: deprecated: true operationId: updateApplication parameters: - - in: header - name: Authorization - description: User Token - required: true - schema: - type: string - in: path name: name description: Application name required: true schema: type: string + security: + - tokenHeader: [] requestBody: content: application/json: @@ -598,18 +533,14 @@ paths: summary: Updates an application metadata operationId: patchApplication parameters: - - in: header - name: Authorization - description: User Token - required: true - schema: - type: string - in: path name: name description: Application name required: true schema: type: string + security: + - tokenHeader: [] requestBody: content: application/json: @@ -643,18 +574,14 @@ paths: summary: Deletes an application operationId: deleteApplication parameters: - - in: header - name: Authorization - description: User Token - required: true - schema: - type: string - in: path name: name description: Application name required: true schema: type: string + security: + - tokenHeader: [] responses: "204": description: Success @@ -675,18 +602,14 @@ paths: summary: Gets an application details operationId: getApplication parameters: - - in: header - name: Authorization - description: User Token - required: true - schema: - type: string - in: path name: name description: Application name required: true schema: type: string + security: + - tokenHeader: [] responses: "200": description: Success @@ -712,18 +635,14 @@ paths: summary: Updates an application using a YAML file operationId: updateApplicationYAML parameters: - - in: header - name: Authorization - description: User Token - required: true - schema: - type: string - in: path name: name description: Application name required: true schema: type: string + security: + - tokenHeader: [] requestBody: required: true content: @@ -754,13 +673,8 @@ paths: - Application Template summary: Lists all application templates operationId: listApplicationTemplates - parameters: - - in: header - name: Authorization - description: User Token - required: true - schema: - type: string + security: + - tokenHeader: [] responses: "200": description: Success @@ -786,13 +700,8 @@ paths: summary: Creates an application template operationId: createApplicationTemplate deprecated: true - parameters: - - in: header - name: Authorization - description: User Token - required: true - schema: - type: string + security: + - tokenHeader: [] requestBody: $ref: "#/components/requestBodies/ApplicationTemplateCreateRequest" responses: @@ -817,13 +726,8 @@ paths: - Application Template summary: Creates an application template using a YAML file operationId: createApplicationTemplateYAML - parameters: - - in: header - name: Authorization - description: User Token - required: true - schema: - type: string + security: + - tokenHeader: [] requestBody: required: true content: @@ -858,18 +762,14 @@ paths: operationId: updateOrCreateApplicationTemplate deprecated: true parameters: - - in: header - name: Authorization - description: User Token - required: true - schema: - type: string - in: path name: name description: Application template name required: true schema: type: string + security: + - tokenHeader: [] requestBody: $ref: "#/components/requestBodies/ApplicationTemplateCreateRequest" responses: @@ -894,18 +794,14 @@ paths: summary: Patches an application template operationId: patchApplicationTemplate parameters: - - in: header - name: Authorization - description: User Token - required: true - schema: - type: string - in: path name: name description: Application template name required: true schema: type: string + security: + - tokenHeader: [] requestBody: content: application/json: @@ -932,18 +828,14 @@ paths: summary: Deletes an application template operationId: deleteApplicationTemplate parameters: - - in: header - name: Authorization - description: User Token - required: true - schema: - type: string - in: path name: name description: Application template name required: true schema: type: string + security: + - tokenHeader: [] responses: "200": description: Success @@ -964,18 +856,14 @@ paths: summary: Gets an application template operationId: getApplicationTemplate parameters: - - in: header - name: Authorization - description: User Token - required: true - schema: - type: string - in: path name: name description: Application template name required: true schema: type: string + security: + - tokenHeader: [] responses: "200": description: Success @@ -1001,18 +889,14 @@ paths: summary: Updates or creates an application template operationId: updateOrCreateApplicationTemplateFromYaml parameters: - - in: header - name: Authorization - description: User Token - required: true - schema: - type: string - in: path name: name description: Application template name required: true schema: type: string + security: + - tokenHeader: [] requestBody: required: true content: @@ -1506,13 +1390,8 @@ paths: - ioFog summary: Retrieves HAL USB info operationId: getAgentHalUsbInfo - parameters: - - in: header - name: Authorization - description: User token - required: true - schema: - type: string + security: + - tokenHeader: [] responses: "200": description: Success @@ -1679,13 +1558,8 @@ paths: - Catalog summary: Gets microservices catalog operationId: getMicroservicesCatalog - parameters: - - in: header - name: Authorization - description: User Token - required: true - schema: - type: string + security: + - tokenHeader: [] responses: "200": description: Success @@ -1707,13 +1581,8 @@ paths: - Catalog summary: Creates a new microservice catalog item operationId: createMicroserviceCatalogItem - parameters: - - in: header - name: Authorization - description: User Token - required: true - schema: - type: string + security: + - tokenHeader: [] requestBody: $ref: "#/components/requestBodies/CreateUpdateCatalogItemRequestBody" responses: @@ -1746,18 +1615,14 @@ paths: summary: Gets microservice catalog item info operationId: getMicroserviceCatalogItem parameters: - - in: header - name: Authorization - description: User Token - required: true - schema: - type: string - in: path name: id description: Catalog Item Id required: true schema: type: string + security: + - tokenHeader: [] responses: "200": description: Catalog Item Info @@ -1782,18 +1647,14 @@ paths: summary: Updates a microservice catalog item operationId: updateMicroserviceCatalogItem parameters: - - in: header - name: Authorization - description: User Token - required: true - schema: - type: string - in: path name: id description: Catalog Item Id required: true schema: type: string + security: + - tokenHeader: [] requestBody: $ref: "#/components/requestBodies/CreateUpdateCatalogItemRequestBody" responses: @@ -1820,18 +1681,14 @@ paths: summary: Deletes a microservice catalog item operationId: deleteMicroserviceCatalogItem parameters: - - in: header - name: Authorization - description: User Token - required: true - schema: - type: string - in: path name: id description: Catalog Item Id required: true schema: type: string + security: + - tokenHeader: [] responses: "204": description: Success @@ -1853,13 +1710,8 @@ paths: summary: Gets list of flows deprecated: true operationId: getFlowsList - parameters: - - in: header - name: Authorization - description: User Token - required: true - schema: - type: string + security: + - tokenHeader: [] responses: "200": description: Success @@ -1882,13 +1734,8 @@ paths: summary: Creates a new flow deprecated: true operationId: createFlow - parameters: - - in: header - name: Authorization - description: User Token - required: true - schema: - type: string + security: + - tokenHeader: [] requestBody: $ref: "#/components/requestBodies/NewFlowRequest" responses: @@ -1920,18 +1767,14 @@ paths: operationId: getFlowInfo deprecated: true parameters: - - in: header - name: Authorization - description: User Token - required: true - schema: - type: string - in: path name: id description: Flow Id required: true schema: type: string + security: + - tokenHeader: [] responses: "200": description: Success @@ -1957,18 +1800,14 @@ paths: operationId: updateFlow deprecated: true parameters: - - in: header - name: Authorization - description: User Token - required: true - schema: - type: string - in: path name: id description: Flow Id required: true schema: type: string + security: + - tokenHeader: [] requestBody: $ref: "#/components/requestBodies/NewFlowRequest" responses: @@ -1994,18 +1833,14 @@ paths: operationId: deleteFlow deprecated: true parameters: - - in: header - name: Authorization - description: User Token - required: true - schema: - type: string - in: path name: id description: Flow Id required: true schema: type: string + security: + - tokenHeader: [] responses: "204": description: Success @@ -2027,12 +1862,6 @@ paths: summary: Gets list of microservices operationId: getMicroservicesList parameters: - - in: header - name: Authorization - description: User Token - required: true - schema: - type: string - in: query name: flowId deprecated: true @@ -2046,6 +1875,8 @@ paths: required: false schema: type: string + security: + - tokenHeader: [] responses: "200": description: Success @@ -2068,13 +1899,8 @@ paths: summary: Creates a new microservice on an ioFog node operationId: createMicroservice deprecated: true - parameters: - - in: header - name: Authorization - description: User Token - required: true - schema: - type: string + security: + - tokenHeader: [] requestBody: content: application/json: @@ -2111,13 +1937,8 @@ paths: - Microservices summary: Creates a new microservice in an Application operationId: createMicroserviceYAML - parameters: - - in: header - name: Authorization - description: User Token - required: true - schema: - type: string + security: + - tokenHeader: [] requestBody: required: true content: @@ -2158,18 +1979,14 @@ paths: summary: Gets a microservice info operationId: getMicroserviceInfo parameters: - - in: header - name: Authorization - description: User Token - required: true - schema: - type: string - in: path name: uuid description: Microservice Uuid required: true schema: type: string + security: + - tokenHeader: [] responses: "200": description: Success @@ -2195,18 +2012,14 @@ paths: deprecated: true operationId: updateMicroservice parameters: - - in: header - name: Authorization - description: User Token - required: true - schema: - type: string - in: path name: uuid description: Microservice Uuid required: true schema: type: string + security: + - tokenHeader: [] requestBody: content: application/json: @@ -2238,18 +2051,14 @@ paths: summary: Deletes a microservice operationId: deleteMicroservice parameters: - - in: header - name: Authorization - description: User Token - required: true - schema: - type: string - in: path name: uuid description: Microservice Uuid required: true schema: type: string + security: + - tokenHeader: [] responses: "204": description: Success @@ -2273,18 +2082,14 @@ paths: summary: Updates a microservice operationId: updateMicroserviceYAML parameters: - - in: header - name: Authorization - description: User Token - required: true - schema: - type: string - in: path name: uuid description: Microservice Uuid required: true schema: type: string + security: + - tokenHeader: [] requestBody: required: true content: @@ -2322,12 +2127,6 @@ paths: operationId: createMicroserviceRoute deprecated: true parameters: - - in: header - name: Authorization - description: User Token - required: true - schema: - type: string - in: path name: uuid description: Microservice Uuid @@ -2340,6 +2139,8 @@ paths: required: true schema: type: string + security: + - tokenHeader: [] responses: "204": description: Created @@ -2363,12 +2164,6 @@ paths: operationId: deleteMicroserviceRoute deprecated: true parameters: - - in: header - name: Authorization - description: User Token - required: true - schema: - type: string - in: path name: uuid description: Microservice Uuid @@ -2381,6 +2176,8 @@ paths: required: true schema: type: string + security: + - tokenHeader: [] responses: "204": description: Success @@ -2404,18 +2201,14 @@ paths: summary: Creates a port mapping for microservice operationId: createMicroservicePortMapping parameters: - - in: header - name: Authorization - description: User Token - required: true - schema: - type: string - in: path name: uuid description: Microservice Uuid required: true schema: type: string + security: + - tokenHeader: [] requestBody: content: application/json: @@ -2449,18 +2242,14 @@ paths: summary: Get a port mapping list for microservice operationId: getMicroservicePortMapping parameters: - - in: header - name: Authorization - description: User Token - required: true - schema: - type: string - in: path name: uuid description: Microservice Uuid required: true schema: type: string + security: + - tokenHeader: [] responses: "200": description: Created @@ -2486,12 +2275,6 @@ paths: summary: Deletes a port mapping for microservice operationId: deleteMicroservicePortMapping parameters: - - in: header - name: Authorization - description: User Token - required: true - schema: - type: string - in: path name: uuid description: Microservice Uuid @@ -2504,6 +2287,8 @@ paths: required: true schema: type: string + security: + - tokenHeader: [] responses: "204": description: Success @@ -2525,18 +2310,14 @@ paths: summary: Creates a volume mapping for microservice operationId: createMicroserviceVolumeMapping parameters: - - in: header - name: Authorization - description: User Token - required: true - schema: - type: string - in: path name: uuid description: Microservice Uuid required: true schema: type: string + security: + - tokenHeader: [] requestBody: content: application/json: @@ -2573,18 +2354,14 @@ paths: summary: Get a volume mapping list for microservice operationId: getMicroserviceVolumeMapping parameters: - - in: header - name: Authorization - description: User Token - required: true - schema: - type: string - in: path name: uuid description: Microservice Uuid required: true schema: type: string + security: + - tokenHeader: [] responses: "200": description: Success @@ -2610,12 +2387,6 @@ paths: summary: Deletes a volume mapping for microservice operationId: deleteMicroserviceVolumeMapping parameters: - - in: header - name: Authorization - description: User Token - required: true - schema: - type: string - in: path name: uuid description: Microservice Uuid @@ -2628,6 +2399,8 @@ paths: required: true schema: type: string + security: + - tokenHeader: [] responses: "204": description: Success @@ -2651,18 +2424,14 @@ paths: summary: Send request to create image snapshot operationId: createImageSnapshot parameters: - - in: header - name: Authorization - description: User Token - required: true - schema: - type: string - in: path name: uuid description: Microservice UUID required: true schema: type: string + security: + - tokenHeader: [] responses: "201": description: Created @@ -2690,18 +2459,14 @@ paths: summary: Download image snapshot operationId: downloadImageSnapshot parameters: - - in: header - name: Authorization - description: User Token - required: true - schema: - type: string - in: path name: uuid description: Microservice UUID required: true schema: type: string + security: + - tokenHeader: [] responses: "200": description: Success @@ -2728,18 +2493,14 @@ paths: summary: Enables Microservice Strace Option operationId: enableMicroserviceStrace parameters: - - in: header - name: Authorization - description: User Token - required: true - schema: - type: string - in: path name: uuid description: Microservice UUID required: true schema: type: string + security: + - tokenHeader: [] requestBody: content: application/json: @@ -2772,12 +2533,6 @@ paths: summary: Gets Strace Data for Microservice operationId: getMicroserviceStrace parameters: - - in: header - name: Authorization - description: User Token - required: true - schema: - type: string - in: path name: uuid description: Microservice UUID @@ -2792,6 +2547,8 @@ paths: enum: - file - string + security: + - tokenHeader: [] responses: "200": description: Success @@ -2825,12 +2582,8 @@ paths: description: Microservice UUID schema: type: string - - in: header - name: Authorization - description: User Token - required: true - schema: - type: string + security: + - tokenHeader: [] requestBody: content: application/json: @@ -2866,12 +2619,8 @@ paths: required: true schema: type: string - - in: header - name: Authorization - description: User Token - required: true - schema: - type: string + security: + - tokenHeader: [] requestBody: content: application/json: @@ -2906,12 +2655,8 @@ paths: required: true schema: type: string - - in: header - name: Authorization - description: User token - required: true - schema: - type: string + security: + - tokenHeader: [] responses: "200": description: Success @@ -2936,13 +2681,8 @@ paths: - Registries summary: Creates new registry operationId: createRegistry - parameters: - - in: header - name: Authorization - description: User Token - required: true - schema: - type: string + security: + - tokenHeader: [] requestBody: content: application/json: @@ -2967,13 +2707,8 @@ paths: - Registries summary: Gets list of registries operationId: getRegistryList - parameters: - - in: header - name: Authorization - description: User token - required: true - schema: - type: string + security: + - tokenHeader: [] responses: "200": description: Success @@ -3003,12 +2738,8 @@ paths: required: true schema: type: string - - in: header - name: Authorization - description: User token - required: true - schema: - type: string + security: + - tokenHeader: [] responses: "204": description: Deleted @@ -3035,12 +2766,8 @@ paths: required: true schema: type: string - - in: header - name: Authorization - description: User token - required: true - schema: - type: string + security: + - tokenHeader: [] requestBody: content: application/json: @@ -3097,13 +2824,8 @@ paths: - User summary: Logout operationId: logout - parameters: - - in: header - name: Authorization - description: User token - required: true - schema: - type: string + security: + - tokenHeader: [] responses: "204": description: Success @@ -3199,13 +2921,8 @@ paths: - User summary: Get current user profile data operationId: getUserProfile - parameters: - - in: header - name: Authorization - description: User token - required: true - schema: - type: string + security: + - tokenHeader: [] responses: "200": description: Success @@ -3227,13 +2944,8 @@ paths: - User summary: Update user profile operationId: updateUserProfile - parameters: - - in: header - name: Authorization - description: User Token - required: true - schema: - type: string + security: + - tokenHeader: [] requestBody: content: application/json: @@ -3264,13 +2976,8 @@ paths: - User summary: Delete account operationId: deleteAccount - parameters: - - in: header - name: Authorization - description: User Token - required: true - schema: - type: string + security: + - tokenHeader: [] requestBody: content: application/json: @@ -3295,13 +3002,8 @@ paths: - User summary: change password operationId: changePassword - parameters: - - in: header - name: Authorization - description: User Token - required: true - schema: - type: string + security: + - tokenHeader: [] requestBody: content: application/json: @@ -3353,13 +3055,8 @@ paths: - Routing summary: Get routes operationId: getRoutes - parameters: - - in: header - name: Authorization - description: User Token - required: true - schema: - type: string + security: + - tokenHeader: [] responses: "200": description: Success @@ -3381,13 +3078,8 @@ paths: - Routing summary: Creates a new route operationId: createRoute - parameters: - - in: header - name: Authorization - description: User Token - required: true - schema: - type: string + security: + - tokenHeader: [] requestBody: content: application/json: @@ -3425,18 +3117,14 @@ paths: summary: Gets a route info operationId: getRoute parameters: - - in: header - name: Authorization - description: User Token - required: true - schema: - type: string - in: path name: name description: Route name required: true schema: type: string + security: + - tokenHeader: [] responses: "200": description: Route Info @@ -3461,18 +3149,14 @@ paths: summary: Updates a route operationId: updateRoute parameters: - - in: header - name: Authorization - description: User Token - required: true - schema: - type: string - in: path name: name description: Route name required: true schema: type: string + security: + - tokenHeader: [] requestBody: content: application/json: @@ -3504,18 +3188,14 @@ paths: summary: Deletes a route operationId: deleteRoute parameters: - - in: header - name: Authorization - description: User Token - required: true - schema: - type: string - in: path name: name description: Route name required: true schema: type: string + security: + - tokenHeader: [] responses: "204": description: Success @@ -3536,13 +3216,8 @@ paths: - Edge Resource summary: Get Edge Resources operationId: getEdgeResources - parameters: - - in: header - name: Authorization - description: User Token - required: true - schema: - type: string + security: + - tokenHeader: [] responses: "200": description: Success @@ -3566,12 +3241,6 @@ paths: summary: Get Specific Edge Resource operationId: getEdgeResourceDetail parameters: - - in: header - name: Authorization - description: User Token - required: true - schema: - type: string - in: path name: name description: Edge Resource name @@ -3584,6 +3253,8 @@ paths: required: true schema: type: string + security: + - tokenHeader: [] responses: "200": description: Success @@ -3606,12 +3277,6 @@ paths: summary: Update/Create Specific Edge Resource operationId: putEdgeResource parameters: - - in: header - name: Authorization - description: User Token - required: true - schema: - type: string - in: path name: name description: Edge Resource name @@ -3624,6 +3289,8 @@ paths: required: true schema: type: string + security: + - tokenHeader: [] requestBody: content: application/json: @@ -3653,12 +3320,6 @@ paths: summary: Deletes an Edge Resource operationId: deleteEdgeResource parameters: - - in: header - name: Authorization - description: User Token - required: true - schema: - type: string - in: path name: name description: Edge Resource name @@ -3671,6 +3332,8 @@ paths: required: true schema: type: string + security: + - tokenHeader: [] responses: "204": description: Success @@ -3692,18 +3355,14 @@ paths: summary: Get Specific Edge Resource versions operationId: getEdgeResourceVersions parameters: - - in: header - name: Authorization - description: User Token - required: true - schema: - type: string - in: path name: name description: Edge Resource name required: true schema: type: string + security: + - tokenHeader: [] responses: "200": description: Success @@ -3726,13 +3385,8 @@ paths: - Edge Resource summary: Create Specific Edge Resource operationId: postEdgeResource - parameters: - - in: header - name: Authorization - description: User Token - required: true - schema: - type: string + security: + - tokenHeader: [] requestBody: content: application/json: @@ -3763,12 +3417,6 @@ paths: summary: Attach Edge Resource to Agent operationId: postEdgeResourceLink parameters: - - in: header - name: Authorization - description: User Token - required: true - schema: - type: string - in: path name: name description: Edge Resource Name @@ -3781,6 +3429,8 @@ paths: required: true schema: type: string + security: + - tokenHeader: [] requestBody: content: application/json: @@ -3808,12 +3458,6 @@ paths: summary: Detach Edge Resource from Agent operationId: deleteEdgeResourceLink parameters: - - in: header - name: Authorization - description: User Token - required: true - schema: - type: string - in: path name: name description: Edge Resource Name @@ -3826,6 +3470,8 @@ paths: required: true schema: type: string + security: + - tokenHeader: [] requestBody: content: application/json: @@ -3878,6 +3524,11 @@ servers: - url: http://localhost:51121/api/v3 - url: https://localhost:51121/api/v3 components: + securitySchemes: + tokenHeader: + type: apiKey + in: header + name: Authorization requestBodies: UpdateIOFogNodeRequestBody: content: From 14cc78a1cb3a8f1d16271babe6a891fa0ba1de9c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emirhan=20Durmu=C5=9F?= Date: Sun, 28 Jan 2024 14:51:13 +0300 Subject: [PATCH 029/178] commit --- src/services/microservice-ports/proxy.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/services/microservice-ports/proxy.js b/src/services/microservice-ports/proxy.js index f6767c71b..76e3342be 100644 --- a/src/services/microservice-ports/proxy.js +++ b/src/services/microservice-ports/proxy.js @@ -1,6 +1,6 @@ /* only "[a-zA-Z0-9][a-zA-Z0-9_.-]" are allowed * ******************************************************************************* - * * Copyright (c) 2022 Edgeworx, Inc. + * * Copyright (c) 2023 Datasance Teknoloji A.S. * * * * This program and the accompanying materials are made available under the * * terms of the Eclipse Public License v. 2.0 which is available at From 9a2a999014f8127e55dd919d90d712b9c2fbfda4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emirhan=20Durmu=C5=9F?= Date: Sun, 28 Jan 2024 16:07:42 +0300 Subject: [PATCH 030/178] swagger yaml agentToken auth edit --- docs/swagger.yaml | 331 +++++++++++++++++----------------------------- 1 file changed, 123 insertions(+), 208 deletions(-) diff --git a/docs/swagger.yaml b/docs/swagger.yaml index e56f60c48..8fb8b138e 100755 --- a/docs/swagger.yaml +++ b/docs/swagger.yaml @@ -60,7 +60,7 @@ paths: summary: Returns list of ioFog nodes operationId: getIOFogNodes security: - - tokenHeader: [] + - userToken: [] requestBody: content: application/json: @@ -91,7 +91,7 @@ paths: summary: Creates a new ioFog node operationId: createIOFogNode security: - - tokenHeader: [] + - userToken: [] requestBody: $ref: "#/components/requestBodies/UpdateIOFogNodeRequestBody" responses: @@ -126,7 +126,7 @@ paths: schema: type: string security: - - tokenHeader: [] + - userToken: [] requestBody: $ref: "#/components/requestBodies/UpdateIOFogNodeRequestBody" responses: @@ -158,7 +158,7 @@ paths: schema: type: string security: - - tokenHeader: [] + - userToken: [] responses: "202": description: Accepted @@ -186,7 +186,7 @@ paths: schema: type: string security: - - tokenHeader: [] + - userToken: [] responses: "200": description: Success @@ -219,7 +219,7 @@ paths: schema: type: string security: - - tokenHeader: [] + - userToken: [] responses: "201": description: Success @@ -261,7 +261,7 @@ paths: - upgrade - rollback security: - - tokenHeader: [] + - userToken: [] responses: "204": description: Success @@ -292,7 +292,7 @@ paths: schema: type: string security: - - tokenHeader: [] + - userToken: [] responses: "204": description: Success @@ -319,7 +319,7 @@ paths: schema: type: string security: - - tokenHeader: [] + - userToken: [] responses: "204": description: Success @@ -346,7 +346,7 @@ paths: schema: type: string security: - - tokenHeader: [] + - userToken: [] responses: "200": description: Success @@ -379,7 +379,7 @@ paths: schema: type: string security: - - tokenHeader: [] + - userToken: [] responses: "200": description: Success @@ -405,7 +405,7 @@ paths: summary: Lists all applications operationId: listApplication security: - - tokenHeader: [] + - userToken: [] responses: "200": description: Success @@ -431,7 +431,7 @@ paths: operationId: createApplication deprecated: true security: - - tokenHeader: [] + - userToken: [] requestBody: content: application/json: @@ -463,7 +463,7 @@ paths: summary: Creates an application using a YAML file operationId: createApplicationYAML security: - - tokenHeader: [] + - userToken: [] requestBody: required: true content: @@ -506,7 +506,7 @@ paths: schema: type: string security: - - tokenHeader: [] + - userToken: [] requestBody: content: application/json: @@ -540,7 +540,7 @@ paths: schema: type: string security: - - tokenHeader: [] + - userToken: [] requestBody: content: application/json: @@ -581,7 +581,7 @@ paths: schema: type: string security: - - tokenHeader: [] + - userToken: [] responses: "204": description: Success @@ -609,7 +609,7 @@ paths: schema: type: string security: - - tokenHeader: [] + - userToken: [] responses: "200": description: Success @@ -642,7 +642,7 @@ paths: schema: type: string security: - - tokenHeader: [] + - userToken: [] requestBody: required: true content: @@ -674,7 +674,7 @@ paths: summary: Lists all application templates operationId: listApplicationTemplates security: - - tokenHeader: [] + - userToken: [] responses: "200": description: Success @@ -701,7 +701,7 @@ paths: operationId: createApplicationTemplate deprecated: true security: - - tokenHeader: [] + - userToken: [] requestBody: $ref: "#/components/requestBodies/ApplicationTemplateCreateRequest" responses: @@ -727,7 +727,7 @@ paths: summary: Creates an application template using a YAML file operationId: createApplicationTemplateYAML security: - - tokenHeader: [] + - userToken: [] requestBody: required: true content: @@ -769,7 +769,7 @@ paths: schema: type: string security: - - tokenHeader: [] + - userToken: [] requestBody: $ref: "#/components/requestBodies/ApplicationTemplateCreateRequest" responses: @@ -801,7 +801,7 @@ paths: schema: type: string security: - - tokenHeader: [] + - userToken: [] requestBody: content: application/json: @@ -835,7 +835,7 @@ paths: schema: type: string security: - - tokenHeader: [] + - userToken: [] responses: "200": description: Success @@ -863,7 +863,7 @@ paths: schema: type: string security: - - tokenHeader: [] + - userToken: [] responses: "200": description: Success @@ -896,7 +896,7 @@ paths: schema: type: string security: - - tokenHeader: [] + - userToken: [] requestBody: required: true content: @@ -988,13 +988,8 @@ paths: - Agent summary: Get an ioFog node configuration operationId: getIOFogNodeConfig - parameters: - - in: header - name: Authorization - description: Agent Token - required: true - schema: - type: string + security: + - agentToken: [] responses: "200": description: Success @@ -1016,13 +1011,8 @@ paths: - Agent summary: Updates an ioFog node configuration operationId: updateIOFogNodeConfig - parameters: - - in: header - name: Authorization - description: Agent Token - required: true - schema: - type: string + security: + - agentToken: [] requestBody: content: application/json: @@ -1049,13 +1039,8 @@ paths: - Agent summary: Gets ioFog node changes operationId: getIOFogNodeChanges - parameters: - - in: header - name: Authorization - description: Agent Token - required: true - schema: - type: string + security: + - agentToken: [] responses: "200": description: Success @@ -1079,13 +1064,8 @@ paths: - Agent summary: Resets ioFog node changes list operationId: resetIOFogNodeChanges - parameters: - - in: header - name: Authorization - description: Agent Token - required: true - schema: - type: string + security: + - agentToken: [] responses: "200": description: Success @@ -1106,13 +1086,8 @@ paths: - Agent summary: Posts agent status to ioFog node operationId: postAgentStatus - parameters: - - in: header - name: Authorization - description: Agent Token - required: true - schema: - type: string + security: + - agentToken: [] requestBody: content: application/json: @@ -1139,13 +1114,8 @@ paths: - Agent summary: Gets microservices running on an ioFog node operationId: getAgentMicroservicesList - parameters: - - in: header - name: Authorization - description: Agent Token - required: true - schema: - type: string + security: + - agentToken: [] responses: "200": description: Success @@ -1175,12 +1145,8 @@ paths: description: Microservice UUID schema: type: string - - in: header - name: Authorization - description: Agent Token - required: true - schema: - type: string + security: + - agentToken: [] responses: "200": description: Success @@ -1205,13 +1171,8 @@ paths: - Agent summary: Gets list of Docker registries operationId: getRegistriesList - parameters: - - in: header - name: Authorization - description: Agent Token - required: true - schema: - type: string + security: + - agentToken: [] responses: "200": description: Success @@ -1234,13 +1195,8 @@ paths: - Agent summary: Get an ioFog node tunnel configuration operationId: getIOFogNodeTunnelConfig - parameters: - - in: header - name: Authorization - description: Agent Token - required: true - schema: - type: string + security: + - agentToken: [] responses: "200": description: Success @@ -1265,13 +1221,8 @@ paths: - Agent summary: Get an ioFog node strace info operationId: getIOFogNodeStraceInfo - parameters: - - in: header - name: Authorization - description: Agent Token - required: true - schema: - type: string + security: + - agentToken: [] responses: "200": description: Success @@ -1295,13 +1246,8 @@ paths: - Agent summary: Posts agent strace to ioFog node operationId: postIOFogNodeStraceBuffer - parameters: - - in: header - name: Authorization - description: Agent Token - required: true - schema: - type: string + security: + - agentToken: [] requestBody: content: application/json: @@ -1330,13 +1276,8 @@ paths: - Agent summary: Get change version command operationId: getChangeVersion - parameters: - - in: header - name: Authorization - description: Agent Token - required: true - schema: - type: string + security: + - agentToken: [] responses: "200": description: Success @@ -1361,13 +1302,8 @@ paths: - Agent summary: Updates HAL hardware info operationId: putHalHardwareInfo - parameters: - - in: header - name: Authorization - description: Agent Token - required: true - schema: - type: string + security: + - agentToken: [] requestBody: $ref: "#/components/requestBodies/HalInfo" responses: @@ -1391,7 +1327,7 @@ paths: summary: Retrieves HAL USB info operationId: getAgentHalUsbInfo security: - - tokenHeader: [] + - userToken: [] responses: "200": description: Success @@ -1415,13 +1351,8 @@ paths: - Agent summary: Updates HAL USB info operationId: putHalUsbInfo - parameters: - - in: header - name: Authorization - description: Agent Token - required: true - schema: - type: string + security: + - agentToken: [] requestBody: $ref: "#/components/requestBodies/HalInfo" responses: @@ -1444,13 +1375,8 @@ paths: - Agent summary: Deletes an ioFog node operationId: deleteAgentNode - parameters: - - in: header - name: Authorization - description: Agent token - required: true - schema: - type: string + security: + - agentToken: [] responses: "204": description: No Content @@ -1469,13 +1395,8 @@ paths: - Agent summary: Get image snapshot info operationId: getImageSnapshot - parameters: - - in: header - name: Authorization - description: Agent Token - required: true - schema: - type: string + security: + - agentToken: [] responses: "200": description: Success @@ -1499,13 +1420,8 @@ paths: - Agent summary: Put image snapshot info on controller operationId: putImageSnapshot - parameters: - - in: header - name: Authorization - description: Agent Token - required: true - schema: - type: string + security: + - agentToken: [] requestBody: content: application/json: @@ -1532,13 +1448,8 @@ paths: - Agent summary: Post tracking info operationId: postTracking - parameters: - - in: header - name: Authorization - description: Agent Token - required: true - schema: - type: string + security: + - agentToken: [] requestBody: content: application/json: @@ -1559,7 +1470,7 @@ paths: summary: Gets microservices catalog operationId: getMicroservicesCatalog security: - - tokenHeader: [] + - userToken: [] responses: "200": description: Success @@ -1582,7 +1493,7 @@ paths: summary: Creates a new microservice catalog item operationId: createMicroserviceCatalogItem security: - - tokenHeader: [] + - userToken: [] requestBody: $ref: "#/components/requestBodies/CreateUpdateCatalogItemRequestBody" responses: @@ -1622,7 +1533,7 @@ paths: schema: type: string security: - - tokenHeader: [] + - userToken: [] responses: "200": description: Catalog Item Info @@ -1654,7 +1565,7 @@ paths: schema: type: string security: - - tokenHeader: [] + - userToken: [] requestBody: $ref: "#/components/requestBodies/CreateUpdateCatalogItemRequestBody" responses: @@ -1688,7 +1599,7 @@ paths: schema: type: string security: - - tokenHeader: [] + - userToken: [] responses: "204": description: Success @@ -1711,7 +1622,7 @@ paths: deprecated: true operationId: getFlowsList security: - - tokenHeader: [] + - userToken: [] responses: "200": description: Success @@ -1735,7 +1646,7 @@ paths: deprecated: true operationId: createFlow security: - - tokenHeader: [] + - userToken: [] requestBody: $ref: "#/components/requestBodies/NewFlowRequest" responses: @@ -1774,7 +1685,7 @@ paths: schema: type: string security: - - tokenHeader: [] + - userToken: [] responses: "200": description: Success @@ -1807,7 +1718,7 @@ paths: schema: type: string security: - - tokenHeader: [] + - userToken: [] requestBody: $ref: "#/components/requestBodies/NewFlowRequest" responses: @@ -1840,7 +1751,7 @@ paths: schema: type: string security: - - tokenHeader: [] + - userToken: [] responses: "204": description: Success @@ -1876,7 +1787,7 @@ paths: schema: type: string security: - - tokenHeader: [] + - userToken: [] responses: "200": description: Success @@ -1900,7 +1811,7 @@ paths: operationId: createMicroservice deprecated: true security: - - tokenHeader: [] + - userToken: [] requestBody: content: application/json: @@ -1938,7 +1849,7 @@ paths: summary: Creates a new microservice in an Application operationId: createMicroserviceYAML security: - - tokenHeader: [] + - userToken: [] requestBody: required: true content: @@ -1986,7 +1897,7 @@ paths: schema: type: string security: - - tokenHeader: [] + - userToken: [] responses: "200": description: Success @@ -2019,7 +1930,7 @@ paths: schema: type: string security: - - tokenHeader: [] + - userToken: [] requestBody: content: application/json: @@ -2058,7 +1969,7 @@ paths: schema: type: string security: - - tokenHeader: [] + - userToken: [] responses: "204": description: Success @@ -2089,7 +2000,7 @@ paths: schema: type: string security: - - tokenHeader: [] + - userToken: [] requestBody: required: true content: @@ -2140,7 +2051,7 @@ paths: schema: type: string security: - - tokenHeader: [] + - userToken: [] responses: "204": description: Created @@ -2177,7 +2088,7 @@ paths: schema: type: string security: - - tokenHeader: [] + - userToken: [] responses: "204": description: Success @@ -2208,7 +2119,7 @@ paths: schema: type: string security: - - tokenHeader: [] + - userToken: [] requestBody: content: application/json: @@ -2249,7 +2160,7 @@ paths: schema: type: string security: - - tokenHeader: [] + - userToken: [] responses: "200": description: Created @@ -2288,7 +2199,7 @@ paths: schema: type: string security: - - tokenHeader: [] + - userToken: [] responses: "204": description: Success @@ -2317,7 +2228,7 @@ paths: schema: type: string security: - - tokenHeader: [] + - userToken: [] requestBody: content: application/json: @@ -2361,7 +2272,7 @@ paths: schema: type: string security: - - tokenHeader: [] + - userToken: [] responses: "200": description: Success @@ -2400,7 +2311,7 @@ paths: schema: type: string security: - - tokenHeader: [] + - userToken: [] responses: "204": description: Success @@ -2431,7 +2342,7 @@ paths: schema: type: string security: - - tokenHeader: [] + - userToken: [] responses: "201": description: Created @@ -2466,7 +2377,7 @@ paths: schema: type: string security: - - tokenHeader: [] + - userToken: [] responses: "200": description: Success @@ -2500,7 +2411,7 @@ paths: schema: type: string security: - - tokenHeader: [] + - userToken: [] requestBody: content: application/json: @@ -2548,7 +2459,7 @@ paths: - file - string security: - - tokenHeader: [] + - userToken: [] responses: "200": description: Success @@ -2583,7 +2494,7 @@ paths: schema: type: string security: - - tokenHeader: [] + - userToken: [] requestBody: content: application/json: @@ -2620,7 +2531,7 @@ paths: schema: type: string security: - - tokenHeader: [] + - userToken: [] requestBody: content: application/json: @@ -2656,7 +2567,7 @@ paths: schema: type: string security: - - tokenHeader: [] + - userToken: [] responses: "200": description: Success @@ -2682,7 +2593,7 @@ paths: summary: Creates new registry operationId: createRegistry security: - - tokenHeader: [] + - userToken: [] requestBody: content: application/json: @@ -2708,7 +2619,7 @@ paths: summary: Gets list of registries operationId: getRegistryList security: - - tokenHeader: [] + - userToken: [] responses: "200": description: Success @@ -2739,7 +2650,7 @@ paths: schema: type: string security: - - tokenHeader: [] + - userToken: [] responses: "204": description: Deleted @@ -2767,7 +2678,7 @@ paths: schema: type: string security: - - tokenHeader: [] + - userToken: [] requestBody: content: application/json: @@ -2825,7 +2736,7 @@ paths: summary: Logout operationId: logout security: - - tokenHeader: [] + - userToken: [] responses: "204": description: Success @@ -2922,7 +2833,7 @@ paths: summary: Get current user profile data operationId: getUserProfile security: - - tokenHeader: [] + - userToken: [] responses: "200": description: Success @@ -2945,7 +2856,7 @@ paths: summary: Update user profile operationId: updateUserProfile security: - - tokenHeader: [] + - userToken: [] requestBody: content: application/json: @@ -2977,7 +2888,7 @@ paths: summary: Delete account operationId: deleteAccount security: - - tokenHeader: [] + - userToken: [] requestBody: content: application/json: @@ -3003,7 +2914,7 @@ paths: summary: change password operationId: changePassword security: - - tokenHeader: [] + - userToken: [] requestBody: content: application/json: @@ -3056,7 +2967,7 @@ paths: summary: Get routes operationId: getRoutes security: - - tokenHeader: [] + - userToken: [] responses: "200": description: Success @@ -3079,7 +2990,7 @@ paths: summary: Creates a new route operationId: createRoute security: - - tokenHeader: [] + - userToken: [] requestBody: content: application/json: @@ -3124,7 +3035,7 @@ paths: schema: type: string security: - - tokenHeader: [] + - userToken: [] responses: "200": description: Route Info @@ -3156,7 +3067,7 @@ paths: schema: type: string security: - - tokenHeader: [] + - userToken: [] requestBody: content: application/json: @@ -3195,7 +3106,7 @@ paths: schema: type: string security: - - tokenHeader: [] + - userToken: [] responses: "204": description: Success @@ -3217,7 +3128,7 @@ paths: summary: Get Edge Resources operationId: getEdgeResources security: - - tokenHeader: [] + - userToken: [] responses: "200": description: Success @@ -3254,7 +3165,7 @@ paths: schema: type: string security: - - tokenHeader: [] + - userToken: [] responses: "200": description: Success @@ -3290,7 +3201,7 @@ paths: schema: type: string security: - - tokenHeader: [] + - userToken: [] requestBody: content: application/json: @@ -3333,7 +3244,7 @@ paths: schema: type: string security: - - tokenHeader: [] + - userToken: [] responses: "204": description: Success @@ -3362,7 +3273,7 @@ paths: schema: type: string security: - - tokenHeader: [] + - userToken: [] responses: "200": description: Success @@ -3386,7 +3297,7 @@ paths: summary: Create Specific Edge Resource operationId: postEdgeResource security: - - tokenHeader: [] + - userToken: [] requestBody: content: application/json: @@ -3430,7 +3341,7 @@ paths: schema: type: string security: - - tokenHeader: [] + - userToken: [] requestBody: content: application/json: @@ -3471,7 +3382,7 @@ paths: schema: type: string security: - - tokenHeader: [] + - userToken: [] requestBody: content: application/json: @@ -3525,7 +3436,11 @@ servers: - url: https://localhost:51121/api/v3 components: securitySchemes: - tokenHeader: + userToken: + type: apiKey + in: header + name: Authorization + agentToken: type: apiKey in: header name: Authorization From ecbb29863348269f1caf91d7a03487bf6da893c4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emirhan=20Durmu=C5=9F?= Date: Sat, 3 Feb 2024 23:07:26 +0300 Subject: [PATCH 031/178] api version editing --- docs/swagger.json | 4 +- docs/swagger.yaml | 8 +- src/config/constants.js | 2 +- src/config/default.json | 8 +- ...0180928121334-insert-catalog-item-image.js | 4 +- src/main.js | 2 +- src/routes/agent.js | 40 +- src/routes/application.js | 16 +- src/routes/applicationTemplate.js | 16 +- src/routes/capabilities.js | 4 +- src/routes/catalog.js | 10 +- src/routes/config.js | 6 +- src/routes/controller.js | 6 +- src/routes/diagnostics.js | 10 +- src/routes/edgeResource.js | 16 +- src/routes/flow.js | 10 +- src/routes/iofog.js | 22 +- src/routes/kubelet.js | 26 +- src/routes/microservices.js | 32 +- src/routes/registries.js | 12 +- src/routes/router.js | 4 +- src/routes/routing.js | 10 +- src/routes/tunnel.js | 6 +- src/routes/user.js | 28 +- test/application-template-update.yaml | 2 +- test/application-template.yaml | 2 +- test/application-test.yaml | 2 +- test/application-update-test.yaml | 2 +- test/postman_collection.json | 1148 ++++++++--------- test/src/template/app.yml | 2 +- test/src/template/simple.yml | 2 +- 31 files changed, 731 insertions(+), 731 deletions(-) diff --git a/docs/swagger.json b/docs/swagger.json index 283fa21f1..11df5eaa8 100644 --- a/docs/swagger.json +++ b/docs/swagger.json @@ -1,8 +1,8 @@ { "openapi" : "3.0.0", "info" : { - "version" : "3.0.0", - "title" : "ioFog Controller" + "version" : "1.0.0", + "title" : "Datasance PoT-ioFog Controller" }, "tags" : [ { "name" : "Controller", diff --git a/docs/swagger.yaml b/docs/swagger.yaml index 8fb8b138e..c840cdcaa 100755 --- a/docs/swagger.yaml +++ b/docs/swagger.yaml @@ -1,7 +1,7 @@ openapi: "3.0.0" info: - version: 3.0.0 - title: ioFog Controller + version: 1.0.0 + title: Datasance PoT-ioFog Controller paths: /status: get: @@ -3432,8 +3432,8 @@ tags: - name: User description: Manage your users servers: - - url: http://localhost:51121/api/v3 - - url: https://localhost:51121/api/v3 + - url: http://localhost:51121/api/v1 + - url: https://localhost:51121/api/v1 components: securitySchemes: userToken: diff --git a/src/config/constants.js b/src/config/constants.js index 863a834d2..ce524edf5 100644 --- a/src/config/constants.js +++ b/src/config/constants.js @@ -19,7 +19,7 @@ module.exports = { 'Server:DevMode': false, 'Email:ActivationEnabled': false, - 'Email:HomeUrl': 'https://iofog.org', + 'Email:HomeUrl': 'https://datasance.com', 'Service:LogsDirectory': '/var/log/iofog-controller', 'Service:LogsFileSize': 10485760, diff --git a/src/config/default.json b/src/config/default.json index df913aa36..51747dcc9 100644 --- a/src/config/default.json +++ b/src/config/default.json @@ -38,12 +38,12 @@ }, "SystemImages": { "Router": { - "1": "iofog/router:latest", - "2": "iofog/router:latest" + "1": "ghcr.io/datasance/router:latest", + "2": "ghcr.io/datasance/router:latest" }, "Proxy": { - "1": "iofog/proxy:latest", - "2": "iofog/proxy-arm:latest" + "1": "ghcr.io/datasance/proxy:latest", + "2": "ghcr.io/datasance/proxy:latest" }, "PortRouter": { "1": "iofog/port-router:latest", diff --git a/src/data/seeders/20180928121334-insert-catalog-item-image.js b/src/data/seeders/20180928121334-insert-catalog-item-image.js index e75a67cb9..682876fa3 100644 --- a/src/data/seeders/20180928121334-insert-catalog-item-image.js +++ b/src/data/seeders/20180928121334-insert-catalog-item-image.js @@ -26,12 +26,12 @@ module.exports = { { catalog_item_id: 3, fog_type_id: 1, - container_image: 'iofog/hal' + container_image: 'ghcr.io/datasance/hal' }, { catalog_item_id: 3, fog_type_id: 2, - container_image: 'iofog/hal-arm' + container_image: 'ghcr.io/datasance/hal-arm' }, { catalog_item_id: 4, diff --git a/src/main.js b/src/main.js index 96d700c1a..c79b59e2d 100644 --- a/src/main.js +++ b/src/main.js @@ -41,7 +41,7 @@ const isDaemonElevated = async () => { return false } const protocol = isHTTPS() ? 'https' : 'http' - return getJSONFromURL(`${protocol}://localhost:${apiPort}/api/v3/status`) + return getJSONFromURL(`${protocol}://localhost:${apiPort}/api/v1/status`) .then(result => { // The server is running but you couldn't see it, requires administrative privileges if (result.status === 'online') { diff --git a/src/routes/agent.js b/src/routes/agent.js index e2e86e273..97161bf4e 100644 --- a/src/routes/agent.js +++ b/src/routes/agent.js @@ -21,7 +21,7 @@ const logger = require('../logger') module.exports = [ { method: 'post', - path: '/api/v3/agent/provision', + path: '/api/v1/agent/provision', middleware: async (req, res) => { logger.apiReq(req) @@ -53,7 +53,7 @@ module.exports = [ }, { method: 'post', - path: '/api/v3/agent/deprovision', + path: '/api/v1/agent/deprovision', middleware: async (req, res) => { logger.apiReq(req) @@ -82,7 +82,7 @@ module.exports = [ }, { method: 'get', - path: '/api/v3/agent/config', + path: '/api/v1/agent/config', middleware: async (req, res) => { logger.apiReq(req) @@ -106,7 +106,7 @@ module.exports = [ }, { method: 'patch', - path: '/api/v3/agent/config', + path: '/api/v1/agent/config', middleware: async (req, res) => { logger.apiReq(req) @@ -135,7 +135,7 @@ module.exports = [ }, { method: 'get', - path: '/api/v3/agent/config/changes', + path: '/api/v1/agent/config/changes', middleware: async (req, res) => { logger.apiReq(req) @@ -164,7 +164,7 @@ module.exports = [ }, { method: 'patch', - path: '/api/v3/agent/config/changes', + path: '/api/v1/agent/config/changes', middleware: async (req, res) => { logger.apiReq(req) @@ -193,7 +193,7 @@ module.exports = [ }, { method: 'put', - path: '/api/v3/agent/status', + path: '/api/v1/agent/status', middleware: async (req, res) => { logger.apiReq(req) @@ -222,7 +222,7 @@ module.exports = [ }, { method: 'get', - path: '/api/v3/agent/edgeResources', + path: '/api/v1/agent/edgeResources', middleware: async (req, res) => { logger.apiReq(req) @@ -247,7 +247,7 @@ module.exports = [ }, { method: 'get', - path: '/api/v3/agent/microservices', + path: '/api/v1/agent/microservices', middleware: async (req, res) => { logger.apiReq(req) @@ -272,7 +272,7 @@ module.exports = [ }, { method: 'get', - path: '/api/v3/agent/microservices/:microserviceUuid', + path: '/api/v1/agent/microservices/:microserviceUuid', middleware: async (req, res) => { logger.apiReq(req) @@ -301,7 +301,7 @@ module.exports = [ }, { method: 'get', - path: '/api/v3/agent/registries', + path: '/api/v1/agent/registries', middleware: async (req, res) => { logger.apiReq(req) @@ -326,7 +326,7 @@ module.exports = [ }, { method: 'get', - path: '/api/v3/agent/tunnel', + path: '/api/v1/agent/tunnel', middleware: async (req, res) => { logger.apiReq(req) @@ -355,7 +355,7 @@ module.exports = [ }, { method: 'get', - path: '/api/v3/agent/strace', + path: '/api/v1/agent/strace', middleware: async (req, res) => { logger.apiReq(req) @@ -384,7 +384,7 @@ module.exports = [ }, { method: 'put', - path: '/api/v3/agent/strace', + path: '/api/v1/agent/strace', middleware: async (req, res) => { logger.apiReq(req) @@ -417,7 +417,7 @@ module.exports = [ }, { method: 'get', - path: '/api/v3/agent/version', + path: '/api/v1/agent/version', middleware: async (req, res) => { logger.apiReq(req) @@ -446,7 +446,7 @@ module.exports = [ }, { method: 'put', - path: '/api/v3/agent/hal/hw', + path: '/api/v1/agent/hal/hw', middleware: async (req, res) => { logger.apiReq(req) @@ -475,7 +475,7 @@ module.exports = [ }, { method: 'put', - path: '/api/v3/agent/hal/usb', + path: '/api/v1/agent/hal/usb', middleware: async (req, res) => { logger.apiReq(req) @@ -504,7 +504,7 @@ module.exports = [ }, { method: 'delete', - path: '/api/v3/agent/delete-node', + path: '/api/v1/agent/delete-node', middleware: async (req, res) => { logger.apiReq(req) @@ -529,7 +529,7 @@ module.exports = [ }, { method: 'get', - path: '/api/v3/agent/image-snapshot', + path: '/api/v1/agent/image-snapshot', middleware: async (req, res) => { logger.apiReq(req) @@ -558,7 +558,7 @@ module.exports = [ }, { method: 'put', - path: '/api/v3/agent/image-snapshot', + path: '/api/v1/agent/image-snapshot', middleware: async (req, res) => { logger.apiReq(req) diff --git a/src/routes/application.js b/src/routes/application.js index 860912f89..18cfe4608 100644 --- a/src/routes/application.js +++ b/src/routes/application.js @@ -19,7 +19,7 @@ const logger = require('../logger') module.exports = [ { method: 'get', - path: '/api/v3/application', + path: '/api/v1/application', middleware: async (req, res) => { logger.apiReq(req) @@ -43,7 +43,7 @@ module.exports = [ }, { method: 'post', - path: '/api/v3/application', + path: '/api/v1/application', supportSubstitution: true, middleware: async (req, res) => { logger.apiReq(req) @@ -72,7 +72,7 @@ module.exports = [ }, { method: 'post', - path: '/api/v3/application/yaml', + path: '/api/v1/application/yaml', fileInput: 'application', middleware: async (req, res) => { logger.apiReq(req) @@ -101,7 +101,7 @@ module.exports = [ }, { method: 'get', - path: '/api/v3/application/:name', + path: '/api/v1/application/:name', middleware: async (req, res) => { logger.apiReq(req) @@ -130,7 +130,7 @@ module.exports = [ }, { method: 'patch', - path: '/api/v3/application/:name', + path: '/api/v1/application/:name', supportSubstitution: true, middleware: async (req, res) => { logger.apiReq(req) @@ -163,7 +163,7 @@ module.exports = [ }, { method: 'put', - path: '/api/v3/application/yaml/:name', + path: '/api/v1/application/yaml/:name', fileInput: 'application', middleware: async (req, res) => { logger.apiReq(req) @@ -196,7 +196,7 @@ module.exports = [ }, { method: 'put', - path: '/api/v3/application/:name', + path: '/api/v1/application/:name', supportSubstitution: true, middleware: async (req, res) => { logger.apiReq(req) @@ -229,7 +229,7 @@ module.exports = [ }, { method: 'delete', - path: '/api/v3/application/:name', + path: '/api/v1/application/:name', middleware: async (req, res) => { logger.apiReq(req) diff --git a/src/routes/applicationTemplate.js b/src/routes/applicationTemplate.js index ad0d5af7a..c25958b58 100644 --- a/src/routes/applicationTemplate.js +++ b/src/routes/applicationTemplate.js @@ -19,7 +19,7 @@ const logger = require('../logger') module.exports = [ { method: 'get', - path: '/api/v3/applicationTemplates', + path: '/api/v1/applicationTemplates', middleware: async (req, res) => { logger.apiReq(req) @@ -43,7 +43,7 @@ module.exports = [ }, { method: 'post', - path: '/api/v3/applicationTemplate', + path: '/api/v1/applicationTemplate', middleware: async (req, res) => { logger.apiReq(req) @@ -71,7 +71,7 @@ module.exports = [ }, { method: 'post', - path: '/api/v3/applicationTemplate/yaml', + path: '/api/v1/applicationTemplate/yaml', fileInput: 'template', middleware: async (req, res) => { logger.apiReq(req) @@ -100,7 +100,7 @@ module.exports = [ }, { method: 'get', - path: '/api/v3/applicationTemplate/:name', + path: '/api/v1/applicationTemplate/:name', middleware: async (req, res) => { logger.apiReq(req) @@ -128,7 +128,7 @@ module.exports = [ }, { method: 'patch', - path: '/api/v3/applicationTemplate/:name', + path: '/api/v1/applicationTemplate/:name', middleware: async (req, res) => { logger.apiReq(req) @@ -160,7 +160,7 @@ module.exports = [ }, { method: 'put', - path: '/api/v3/applicationTemplate/yaml/:name', + path: '/api/v1/applicationTemplate/yaml/:name', fileInput: 'template', middleware: async (req, res) => { logger.apiReq(req) @@ -193,7 +193,7 @@ module.exports = [ }, { method: 'put', - path: '/api/v3/applicationTemplate/:name', + path: '/api/v1/applicationTemplate/:name', middleware: async (req, res) => { logger.apiReq(req) @@ -225,7 +225,7 @@ module.exports = [ }, { method: 'delete', - path: '/api/v3/applicationTemplate/:name', + path: '/api/v1/applicationTemplate/:name', middleware: async (req, res) => { logger.apiReq(req) diff --git a/src/routes/capabilities.js b/src/routes/capabilities.js index 400e5750e..a4f684f6d 100644 --- a/src/routes/capabilities.js +++ b/src/routes/capabilities.js @@ -15,7 +15,7 @@ const logger = require('../logger') module.exports = [ { method: 'head', - path: '/api/v3/capabilities/edgeResources', + path: '/api/v1/capabilities/edgeResources', middleware: async (req, res) => { logger.apiReq(req) res.sendStatus(204) @@ -23,7 +23,7 @@ module.exports = [ }, { method: 'head', - path: '/api/v3/capabilities/applicationTemplates', + path: '/api/v1/capabilities/applicationTemplates', middleware: async (req, res) => { logger.apiReq(req) res.sendStatus(204) diff --git a/src/routes/catalog.js b/src/routes/catalog.js index 631da303c..e7275a860 100644 --- a/src/routes/catalog.js +++ b/src/routes/catalog.js @@ -19,7 +19,7 @@ const logger = require('../logger') module.exports = [ { method: 'get', - path: '/api/v3/catalog/microservices', + path: '/api/v1/catalog/microservices', middleware: async (req, res) => { logger.apiReq(req) @@ -47,7 +47,7 @@ module.exports = [ }, { method: 'post', - path: '/api/v3/catalog/microservices', + path: '/api/v1/catalog/microservices', supportSubstitution: true, middleware: async (req, res) => { logger.apiReq(req) @@ -84,7 +84,7 @@ module.exports = [ }, { method: 'get', - path: '/api/v3/catalog/microservices/:id', + path: '/api/v1/catalog/microservices/:id', middleware: async (req, res) => { logger.apiReq(req) @@ -116,7 +116,7 @@ module.exports = [ }, { method: 'patch', - path: '/api/v3/catalog/microservices/:id', + path: '/api/v1/catalog/microservices/:id', supportSubstitution: true, middleware: async (req, res) => { logger.apiReq(req) @@ -157,7 +157,7 @@ module.exports = [ }, { method: 'delete', - path: '/api/v3/catalog/microservices/:id', + path: '/api/v1/catalog/microservices/:id', middleware: async (req, res) => { logger.apiReq(req) diff --git a/src/routes/config.js b/src/routes/config.js index 118f13a1f..1cf961afe 100644 --- a/src/routes/config.js +++ b/src/routes/config.js @@ -19,7 +19,7 @@ const Errors = require('../helpers/errors') module.exports = [ { method: 'get', - path: '/api/v3/config', + path: '/api/v1/config', middleware: async (req, res) => { logger.apiReq(req) @@ -42,7 +42,7 @@ module.exports = [ }, { method: 'get', - path: '/api/v3/config/:key', + path: '/api/v1/config/:key', middleware: async (req, res) => { logger.apiReq(req) @@ -70,7 +70,7 @@ module.exports = [ }, { method: 'put', - path: '/api/v3/config', + path: '/api/v1/config', supportSubstitution: true, middleware: async (req, res) => { logger.apiReq(req) diff --git a/src/routes/controller.js b/src/routes/controller.js index 3cd8fc98f..6dd20d300 100644 --- a/src/routes/controller.js +++ b/src/routes/controller.js @@ -18,7 +18,7 @@ const logger = require('../logger') module.exports = [ { method: 'get', - path: '/api/v3/status', + path: '/api/v1/status', middleware: async (req, res) => { logger.apiReq(req) @@ -36,7 +36,7 @@ module.exports = [ }, { method: 'get', - path: '/api/v3/email-activation', + path: '/api/v1/email-activation', middleware: async (req, res) => { logger.apiReq(req) @@ -54,7 +54,7 @@ module.exports = [ }, { method: 'get', - path: '/api/v3/fog-types/', + path: '/api/v1/fog-types/', middleware: async (req, res) => { logger.apiReq(req) diff --git a/src/routes/diagnostics.js b/src/routes/diagnostics.js index 67acfce2d..5df090b4c 100644 --- a/src/routes/diagnostics.js +++ b/src/routes/diagnostics.js @@ -20,7 +20,7 @@ const logger = require('../logger') module.exports = [ { method: 'post', - path: '/api/v3/microservices/:uuid/image-snapshot', + path: '/api/v1/microservices/:uuid/image-snapshot', middleware: async (req, res) => { logger.apiReq(req) @@ -52,7 +52,7 @@ module.exports = [ }, { method: 'get', - path: '/api/v3/microservices/:uuid/image-snapshot', + path: '/api/v1/microservices/:uuid/image-snapshot', middleware: async (req, res) => { logger.apiReq(req) @@ -92,7 +92,7 @@ module.exports = [ }, { method: 'patch', - path: '/api/v3/microservices/:uuid/strace', + path: '/api/v1/microservices/:uuid/strace', middleware: async (req, res) => { logger.apiReq(req) @@ -128,7 +128,7 @@ module.exports = [ }, { method: 'get', - path: '/api/v3/microservices/:uuid/strace', + path: '/api/v1/microservices/:uuid/strace', middleware: async (req, res) => { logger.apiReq(req) @@ -160,7 +160,7 @@ module.exports = [ }, { method: 'put', - path: '/api/v3/microservices/:uuid/strace', + path: '/api/v1/microservices/:uuid/strace', middleware: async (req, res) => { logger.apiReq(req) diff --git a/src/routes/edgeResource.js b/src/routes/edgeResource.js index f67a68be3..3a972adcb 100644 --- a/src/routes/edgeResource.js +++ b/src/routes/edgeResource.js @@ -19,7 +19,7 @@ const Errors = require('../helpers/errors') module.exports = [ { method: 'get', - path: '/api/v3/edgeResources', + path: '/api/v1/edgeResources', middleware: async (req, res) => { logger.apiReq(req) @@ -42,7 +42,7 @@ module.exports = [ }, { method: 'get', - path: '/api/v3/edgeResource/:name/:version', + path: '/api/v1/edgeResource/:name/:version', middleware: async (req, res) => { logger.apiReq(req) @@ -70,7 +70,7 @@ module.exports = [ }, { method: 'get', - path: '/api/v3/edgeResource/:name', + path: '/api/v1/edgeResource/:name', middleware: async (req, res) => { logger.apiReq(req) @@ -98,7 +98,7 @@ module.exports = [ }, { method: 'put', - path: '/api/v3/edgeResource/:name/:version', + path: '/api/v1/edgeResource/:name/:version', supportSubstitution: true, middleware: async (req, res) => { logger.apiReq(req) @@ -130,7 +130,7 @@ module.exports = [ }, { method: 'delete', - path: '/api/v3/edgeResource/:name/:version', + path: '/api/v1/edgeResource/:name/:version', middleware: async (req, res) => { logger.apiReq(req) @@ -161,7 +161,7 @@ module.exports = [ }, { method: 'post', - path: '/api/v3/edgeResource', + path: '/api/v1/edgeResource', supportSubstitution: true, middleware: async (req, res) => { logger.apiReq(req) @@ -189,7 +189,7 @@ module.exports = [ }, { method: 'post', - path: '/api/v3/edgeResource/:name/:version/link', + path: '/api/v1/edgeResource/:name/:version/link', middleware: async (req, res) => { logger.apiReq(req) @@ -216,7 +216,7 @@ module.exports = [ }, { method: 'delete', - path: '/api/v3/edgeResource/:name/:version/link', + path: '/api/v1/edgeResource/:name/:version/link', middleware: async (req, res) => { logger.apiReq(req) diff --git a/src/routes/flow.js b/src/routes/flow.js index 951e69206..16b8616cf 100644 --- a/src/routes/flow.js +++ b/src/routes/flow.js @@ -19,7 +19,7 @@ const logger = require('../logger') module.exports = [ { method: 'get', - path: '/api/v3/flow', + path: '/api/v1/flow', middleware: async (req, res) => { logger.apiReq(req) @@ -43,7 +43,7 @@ module.exports = [ }, { method: 'post', - path: '/api/v3/flow', + path: '/api/v1/flow', middleware: async (req, res) => { logger.apiReq(req) @@ -71,7 +71,7 @@ module.exports = [ }, { method: 'get', - path: '/api/v3/flow/:id', + path: '/api/v1/flow/:id', middleware: async (req, res) => { logger.apiReq(req) @@ -99,7 +99,7 @@ module.exports = [ }, { method: 'patch', - path: '/api/v3/flow/:id', + path: '/api/v1/flow/:id', middleware: async (req, res) => { logger.apiReq(req) @@ -131,7 +131,7 @@ module.exports = [ }, { method: 'delete', - path: '/api/v3/flow/:id', + path: '/api/v1/flow/:id', middleware: async (req, res) => { logger.apiReq(req) diff --git a/src/routes/iofog.js b/src/routes/iofog.js index 1a6a734d3..a38e14124 100644 --- a/src/routes/iofog.js +++ b/src/routes/iofog.js @@ -19,7 +19,7 @@ const logger = require('../logger') module.exports = [ { method: 'get', - path: '/api/v3/iofog-list', + path: '/api/v1/iofog-list', middleware: async (req, res) => { logger.apiReq(req) @@ -47,7 +47,7 @@ module.exports = [ }, { method: 'post', - path: '/api/v3/iofog', + path: '/api/v1/iofog', supportSubstitution: true, middleware: async (req, res) => { logger.apiReq(req) @@ -76,7 +76,7 @@ module.exports = [ }, { method: 'patch', - path: '/api/v3/iofog/:uuid', + path: '/api/v1/iofog/:uuid', supportSubstitution: true, middleware: async (req, res) => { logger.apiReq(req) @@ -109,7 +109,7 @@ module.exports = [ }, { method: 'delete', - path: '/api/v3/iofog/:uuid', + path: '/api/v1/iofog/:uuid', middleware: async (req, res) => { logger.apiReq(req) @@ -137,7 +137,7 @@ module.exports = [ }, { method: 'get', - path: '/api/v3/iofog/:uuid', + path: '/api/v1/iofog/:uuid', middleware: async (req, res) => { logger.apiReq(req) @@ -165,7 +165,7 @@ module.exports = [ }, { method: 'get', - path: '/api/v3/iofog/:uuid/provisioning-key', + path: '/api/v1/iofog/:uuid/provisioning-key', middleware: async (req, res) => { logger.apiReq(req) @@ -194,7 +194,7 @@ module.exports = [ }, { method: 'post', - path: '/api/v3/iofog/:uuid/version/:versionCommand', + path: '/api/v1/iofog/:uuid/version/:versionCommand', middleware: async (req, res) => { logger.apiReq(req) @@ -227,7 +227,7 @@ module.exports = [ }, { method: 'post', - path: '/api/v3/iofog/:uuid/reboot', + path: '/api/v1/iofog/:uuid/reboot', middleware: async (req, res) => { logger.apiReq(req) @@ -260,7 +260,7 @@ module.exports = [ }, { method: 'get', - path: '/api/v3/iofog/:uuid/hal/hw', + path: '/api/v1/iofog/:uuid/hal/hw', middleware: async (req, res) => { logger.apiReq(req) @@ -289,7 +289,7 @@ module.exports = [ }, { method: 'get', - path: '/api/v3/iofog/:uuid/hal/usb', + path: '/api/v1/iofog/:uuid/hal/usb', middleware: async (req, res) => { logger.apiReq(req) @@ -317,7 +317,7 @@ module.exports = [ }, { method: 'post', - path: '/api/v3/iofog/:uuid/prune', + path: '/api/v1/iofog/:uuid/prune', middleware: async (req, res) => { logger.apiReq(req) diff --git a/src/routes/kubelet.js b/src/routes/kubelet.js index 174272453..54e7a5bcf 100644 --- a/src/routes/kubelet.js +++ b/src/routes/kubelet.js @@ -20,7 +20,7 @@ const ResponseDecorator = require('../decorators/response-decorator') module.exports = [ { method: 'post', - path: '/api/v3/k8s/createPod', + path: '/api/v1/k8s/createPod', middleware: async (req, res) => { logger.apiReq(req) @@ -53,7 +53,7 @@ module.exports = [ }, { method: 'put', - path: '/api/v3/k8s/updatePod', + path: '/api/v1/k8s/updatePod', middleware: async (req, res) => { logger.apiReq(req) @@ -86,7 +86,7 @@ module.exports = [ }, { method: 'delete', - path: '/api/v3/k8s/deletePod', + path: '/api/v1/k8s/deletePod', middleware: async (req, res) => { logger.apiReq(req) @@ -119,7 +119,7 @@ module.exports = [ }, { method: 'get', - path: '/api/v3/k8s/getPod', + path: '/api/v1/k8s/getPod', middleware: async (req, res) => { logger.apiReq(req) @@ -152,7 +152,7 @@ module.exports = [ }, { method: 'get', - path: '/api/v3/k8s/getContainerLogs', + path: '/api/v1/k8s/getContainerLogs', middleware: async (req, res) => { logger.apiReq(req) @@ -185,7 +185,7 @@ module.exports = [ }, { method: 'get', - path: '/api/v3/k8s/getPodStatus', + path: '/api/v1/k8s/getPodStatus', middleware: async (req, res) => { logger.apiReq(req) @@ -218,7 +218,7 @@ module.exports = [ }, { method: 'get', - path: '/api/v3/k8s/getPods', + path: '/api/v1/k8s/getPods', middleware: async (req, res) => { logger.apiReq(req) @@ -251,7 +251,7 @@ module.exports = [ }, { method: 'get', - path: '/api/v3/k8s/capacity', + path: '/api/v1/k8s/capacity', middleware: async (req, res) => { logger.apiReq(req) @@ -284,7 +284,7 @@ module.exports = [ }, { method: 'get', - path: '/api/v3/k8s/allocatable', + path: '/api/v1/k8s/allocatable', middleware: async (req, res) => { logger.apiReq(req) @@ -317,7 +317,7 @@ module.exports = [ }, { method: 'get', - path: '/api/v3/k8s/nodeConditions', + path: '/api/v1/k8s/nodeConditions', middleware: async (req, res) => { logger.apiReq(req) @@ -350,7 +350,7 @@ module.exports = [ }, { method: 'get', - path: '/api/v3/k8s/nodeAddresses', + path: '/api/v1/k8s/nodeAddresses', middleware: async (req, res) => { logger.apiReq(req) @@ -383,7 +383,7 @@ module.exports = [ }, { method: 'get', - path: '/api/v3/k8s/vk-token', + path: '/api/v1/k8s/vk-token', middleware: async (req, res) => { logger.apiReq(req) @@ -408,7 +408,7 @@ module.exports = [ }, { method: 'get', - path: '/api/v3/k8s/scheduler-token', + path: '/api/v1/k8s/scheduler-token', middleware: async (req, res) => { logger.apiReq(req) diff --git a/src/routes/microservices.js b/src/routes/microservices.js index b0c6cdd97..a005c5048 100644 --- a/src/routes/microservices.js +++ b/src/routes/microservices.js @@ -19,7 +19,7 @@ const logger = require('../logger') module.exports = [ { method: 'get', - path: '/api/v3/microservices/public-ports', + path: '/api/v1/microservices/public-ports', middleware: async (req, res) => { logger.apiReq(req) @@ -47,7 +47,7 @@ module.exports = [ }, { method: 'get', - path: '/api/v3/microservices/', + path: '/api/v1/microservices/', middleware: async (req, res) => { logger.apiReq(req) @@ -72,7 +72,7 @@ module.exports = [ }, { method: 'post', - path: '/api/v3/microservices', + path: '/api/v1/microservices', supportSubstitution: true, middleware: async (req, res) => { logger.apiReq(req) @@ -102,7 +102,7 @@ module.exports = [ }, { method: 'post', - path: '/api/v3/microservices/yaml', + path: '/api/v1/microservices/yaml', supportSubstitution: true, fileInput: 'microservice', middleware: async (req, res) => { @@ -133,7 +133,7 @@ module.exports = [ }, { method: 'get', - path: '/api/v3/microservices/:uuid', + path: '/api/v1/microservices/:uuid', middleware: async (req, res) => { logger.apiReq(req) @@ -163,7 +163,7 @@ module.exports = [ { method: 'patch', - path: '/api/v3/microservices/:uuid', + path: '/api/v1/microservices/:uuid', supportSubstitution: true, middleware: async (req, res) => { logger.apiReq(req) @@ -198,7 +198,7 @@ module.exports = [ { method: 'patch', - path: '/api/v3/microservices/yaml/:uuid', + path: '/api/v1/microservices/yaml/:uuid', supportSubstitution: true, fileInput: 'microservice', middleware: async (req, res) => { @@ -233,7 +233,7 @@ module.exports = [ }, { method: 'delete', - path: '/api/v3/microservices/:uuid', + path: '/api/v1/microservices/:uuid', middleware: async (req, res) => { logger.apiReq(req) @@ -262,7 +262,7 @@ module.exports = [ }, { method: 'post', - path: '/api/v3/microservices/:uuid/routes/:receiverUuid', + path: '/api/v1/microservices/:uuid/routes/:receiverUuid', middleware: async (req, res) => { logger.apiReq(req) @@ -295,7 +295,7 @@ module.exports = [ }, { method: 'delete', - path: '/api/v3/microservices/:uuid/routes/:receiverUuid', + path: '/api/v1/microservices/:uuid/routes/:receiverUuid', middleware: async (req, res) => { logger.apiReq(req) @@ -328,7 +328,7 @@ module.exports = [ }, { method: 'post', - path: '/api/v3/microservices/:uuid/port-mapping', + path: '/api/v1/microservices/:uuid/port-mapping', middleware: async (req, res) => { logger.apiReq(req) @@ -361,7 +361,7 @@ module.exports = [ }, { method: 'delete', - path: '/api/v3/microservices/:uuid/port-mapping/:internalPort', + path: '/api/v1/microservices/:uuid/port-mapping/:internalPort', middleware: async (req, res) => { logger.apiReq(req) @@ -390,7 +390,7 @@ module.exports = [ }, { method: 'get', - path: '/api/v3/microservices/:uuid/port-mapping', + path: '/api/v1/microservices/:uuid/port-mapping', middleware: async (req, res) => { logger.apiReq(req) @@ -419,7 +419,7 @@ module.exports = [ }, { method: 'get', - path: '/api/v3/microservices/:uuid/volume-mapping', + path: '/api/v1/microservices/:uuid/volume-mapping', middleware: async (req, res) => { logger.apiReq(req) @@ -451,7 +451,7 @@ module.exports = [ }, { method: 'post', - path: '/api/v3/microservices/:uuid/volume-mapping', + path: '/api/v1/microservices/:uuid/volume-mapping', middleware: async (req, res) => { logger.apiReq(req) @@ -487,7 +487,7 @@ module.exports = [ }, { method: 'delete', - path: '/api/v3/microservices/:uuid/volume-mapping/:id', + path: '/api/v1/microservices/:uuid/volume-mapping/:id', middleware: async (req, res) => { logger.apiReq(req) diff --git a/src/routes/registries.js b/src/routes/registries.js index 6080487ef..8d327d588 100644 --- a/src/routes/registries.js +++ b/src/routes/registries.js @@ -19,10 +19,10 @@ const logger = require('../logger') module.exports = [ { method: 'post', - path: '/api/v3/registries', + path: '/api/v1/registries', supportSubstitution: true, middleware: async (req, res) => { - logger.apiReq('POST /api/v3/registries') // don't use req as arg, because password not encrypted + logger.apiReq('POST /api/v1/registries') // don't use req as arg, because password not encrypted const successCode = constants.HTTP_CODE_CREATED const errorCodes = [ @@ -46,7 +46,7 @@ module.exports = [ }, { method: 'get', - path: '/api/v3/registries', + path: '/api/v1/registries', middleware: async (req, res) => { logger.apiReq(req) @@ -72,7 +72,7 @@ module.exports = [ }, { method: 'delete', - path: '/api/v3/registries/:id', + path: '/api/v1/registries/:id', middleware: async (req, res) => { logger.apiReq(req) @@ -102,10 +102,10 @@ module.exports = [ }, { method: 'patch', - path: '/api/v3/registries/:id', + path: '/api/v1/registries/:id', supportSubstitution: true, middleware: async (req, res) => { - logger.apiReq('PATCH /api/v3/registries') // don't use req as arg, because password not encrypted + logger.apiReq('PATCH /api/v1/registries') // don't use req as arg, because password not encrypted const successCode = constants.HTTP_CODE_NO_CONTENT const errorCodes = [ diff --git a/src/routes/router.js b/src/routes/router.js index ba3aa1d8a..0dbc5e8df 100644 --- a/src/routes/router.js +++ b/src/routes/router.js @@ -19,7 +19,7 @@ const Errors = require('../helpers/errors') module.exports = [ { method: 'get', - path: '/api/v3/router', + path: '/api/v1/router', middleware: async (req, res) => { logger.apiReq(req) @@ -46,7 +46,7 @@ module.exports = [ }, { method: 'put', - path: '/api/v3/router', + path: '/api/v1/router', supportSubstitution: true, middleware: async (req, res) => { logger.apiReq(req) diff --git a/src/routes/routing.js b/src/routes/routing.js index a7e78d752..ac54028d2 100644 --- a/src/routes/routing.js +++ b/src/routes/routing.js @@ -19,7 +19,7 @@ const Errors = require('../helpers/errors') module.exports = [ { method: 'get', - path: '/api/v3/routes', + path: '/api/v1/routes', middleware: async (req, res) => { logger.apiReq(req) @@ -46,7 +46,7 @@ module.exports = [ }, { method: 'get', - path: '/api/v3/routes/:appName/:name', + path: '/api/v1/routes/:appName/:name', middleware: async (req, res) => { logger.apiReq(req) @@ -73,7 +73,7 @@ module.exports = [ }, { method: 'post', - path: '/api/v3/routes', + path: '/api/v1/routes', supportSubstitution: true, middleware: async (req, res) => { logger.apiReq(req) @@ -109,7 +109,7 @@ module.exports = [ }, { method: 'patch', - path: '/api/v3/routes/:appName/:name', + path: '/api/v1/routes/:appName/:name', supportSubstitution: true, middleware: async (req, res) => { logger.apiReq(req) @@ -143,7 +143,7 @@ module.exports = [ }, { method: 'delete', - path: '/api/v3/routes/:appName/:name', + path: '/api/v1/routes/:appName/:name', middleware: async (req, res) => { logger.apiReq(req) diff --git a/src/routes/tunnel.js b/src/routes/tunnel.js index 840f4551f..ed0d369fc 100644 --- a/src/routes/tunnel.js +++ b/src/routes/tunnel.js @@ -19,9 +19,9 @@ const logger = require('../logger') module.exports = [ { method: 'patch', - path: '/api/v3/iofog/:id/tunnel', + path: '/api/v1/iofog/:id/tunnel', middleware: async (req, res) => { - logger.apiReq('POST /api/v3/iofog/:id/tunnel') // don't use req as arg, because password not encrypted + logger.apiReq('POST /api/v1/iofog/:id/tunnel') // don't use req as arg, because password not encrypted const successCode = constants.HTTP_CODE_NO_CONTENT const errorCodes = [ @@ -49,7 +49,7 @@ module.exports = [ }, { method: 'get', - path: '/api/v3/iofog/:id/tunnel', + path: '/api/v1/iofog/:id/tunnel', middleware: async (req, res) => { logger.apiReq(req) diff --git a/src/routes/user.js b/src/routes/user.js index 0f7f7703b..9ad3945df 100644 --- a/src/routes/user.js +++ b/src/routes/user.js @@ -22,9 +22,9 @@ const logger = require('../logger') module.exports = [ { method: 'post', - path: '/api/v3/user/login', + path: '/api/v1/user/login', middleware: async (req, res) => { - logger.apiReq('POST /api/v3/user/login') // don't use req as arg, because password not encrypted + logger.apiReq('POST /api/v1/user/login') // don't use req as arg, because password not encrypted const successCode = constants.HTTP_CODE_SUCCESS const errorCodes = [ @@ -45,13 +45,13 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes('POST /api/v3/user/login', { args: { statusCode: responseObject.code } }) + logger.apiRes('POST /api/v1/user/login', { args: { statusCode: responseObject.code } }) // don't use req and responseObject as args, because they have password and token } }, { method: 'post', - path: '/api/v3/user/logout', + path: '/api/v1/user/logout', middleware: async (req, res) => { logger.apiReq(req) @@ -73,9 +73,9 @@ module.exports = [ }, { method: 'post', - path: '/api/v3/user/signup', + path: '/api/v1/user/signup', middleware: async (req, res) => { - logger.apiReq('POST /api/v3/user/signup') // don't use req as arg, because password not encrypted + logger.apiReq('POST /api/v1/user/signup') // don't use req as arg, because password not encrypted const successCode = constants.HTTP_CODE_CREATED const errorCodes = [ @@ -97,7 +97,7 @@ module.exports = [ }, { method: 'get', - path: '/api/v3/user/signup/resend-activation', + path: '/api/v1/user/signup/resend-activation', middleware: async (req, res) => { logger.apiReq(req) @@ -122,7 +122,7 @@ module.exports = [ }, { method: 'post', - path: '/api/v3/user/activate', + path: '/api/v1/user/activate', middleware: async (req, res) => { logger.apiReq(req) @@ -152,7 +152,7 @@ module.exports = [ }, { method: 'get', - path: '/api/v3/user/profile', + path: '/api/v1/user/profile', middleware: async (req, res) => { logger.apiReq(req) @@ -176,7 +176,7 @@ module.exports = [ }, { method: 'patch', - path: '/api/v3/user/profile', + path: '/api/v1/user/profile', middleware: async (req, res) => { logger.apiReq(req) @@ -205,7 +205,7 @@ module.exports = [ }, { method: 'delete', - path: '/api/v3/user/profile', + path: '/api/v1/user/profile', middleware: async (req, res) => { logger.apiReq(req) @@ -230,9 +230,9 @@ module.exports = [ }, { method: 'patch', - path: '/api/v3/user/password', + path: '/api/v1/user/password', middleware: async (req, res) => { - logger.apiReq('PATCH /api/v3/user/password') // don't use req as arg, because password not encrypted + logger.apiReq('PATCH /api/v1/user/password') // don't use req as arg, because password not encrypted const successCode = constants.HTTP_CODE_NO_CONTENT const errorCodes = [ @@ -259,7 +259,7 @@ module.exports = [ }, { method: 'delete', - path: '/api/v3/user/password', + path: '/api/v1/user/password', middleware: async (req, res) => { logger.apiReq(req) diff --git a/test/application-template-update.yaml b/test/application-template-update.yaml index d4a55b54c..fa96dcea0 100644 --- a/test/application-template-update.yaml +++ b/test/application-template-update.yaml @@ -1,5 +1,5 @@ kind: ApplicationTemplate -apiVersion: iofog.org/v3 +apiVersion: datasance.com/v1 metadata: name: 'app-template-from-yaml' spec: diff --git a/test/application-template.yaml b/test/application-template.yaml index 2c2b6ce03..6d4dd682a 100644 --- a/test/application-template.yaml +++ b/test/application-template.yaml @@ -1,5 +1,5 @@ kind: ApplicationTemplate -apiVersion: iofog.org/v3 +apiVersion: datasance.com/v1 metadata: name: 'app-template-from-yaml' spec: diff --git a/test/application-test.yaml b/test/application-test.yaml index 7d8bf35ce..4c2484e26 100644 --- a/test/application-test.yaml +++ b/test/application-test.yaml @@ -1,5 +1,5 @@ kind: Application -apiVersion: iofog.org/v3 +apiVersion: datasance.com/v1 metadata: name: "healthcare-wearable-flow" spec: diff --git a/test/application-update-test.yaml b/test/application-update-test.yaml index 2f1b3d3c6..6a560efce 100644 --- a/test/application-update-test.yaml +++ b/test/application-update-test.yaml @@ -1,5 +1,5 @@ kind: Application -apiVersion: iofog.org/v3 +apiVersion: datasance.com/v1 metadata: name: "healthcare-wearable-flow" spec: diff --git a/test/postman_collection.json b/test/postman_collection.json index 2cd28d63e..92fabe783 100644 --- a/test/postman_collection.json +++ b/test/postman_collection.json @@ -39,13 +39,13 @@ "raw": "{\n \"firstName\": \"John\",\n \"lastName\": \"Doe\",\n \"email\": \"user@domain.com\",\n \"password\": \"#Bugs4Fun\",\n \"subscriptionKey\": \"xxxx-xxxx-xxxx-xxxx\"\n}" }, "url": { - "raw": "{{host}}/api/v3/user/signup", + "raw": "{{host}}/api/v1/user/signup", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "user", "signup" ] @@ -83,13 +83,13 @@ "raw": "{\n \"activationCode\": \"string\"\n}" }, "url": { - "raw": "{{host}}/api/v3/user/activate", + "raw": "{{host}}/api/v1/user/activate", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "user", "activate" ] @@ -131,13 +131,13 @@ "raw": "{\n \"email\": \"user@domain.com\",\n \"password\": \"#Bugs4Fun\"\n}" }, "url": { - "raw": "{{host}}/api/v3/user/login", + "raw": "{{host}}/api/v1/user/login", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "user", "login" ] @@ -171,13 +171,13 @@ "raw": "" }, "url": { - "raw": "{{host}}/api/v3/user/logout", + "raw": "{{host}}/api/v1/user/logout", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "user", "logout" ] @@ -219,13 +219,13 @@ "raw": "{\n \"email\": \"user@domain.com\",\n \"password\": \"#Bugs4Fun\"\n}" }, "url": { - "raw": "{{host}}/api/v3/user/login", + "raw": "{{host}}/api/v1/user/login", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "user", "login" ] @@ -250,13 +250,13 @@ "method": "GET", "header": [], "url": { - "raw": "{{host}}/api/v3/user/signup/resend-activation?email=user@domain.com", + "raw": "{{host}}/api/v1/user/signup/resend-activation?email=user@domain.com", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "user", "signup", "resend-activation" @@ -297,13 +297,13 @@ } ], "url": { - "raw": "{{host}}/api/v3/user/profile", + "raw": "{{host}}/api/v1/user/profile", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "user", "profile" ] @@ -337,13 +337,13 @@ "raw": "{\n \"email\": \"user@domain.com\"\n}" }, "url": { - "raw": "{{host}}/api/v3/user/password", + "raw": "{{host}}/api/v1/user/password", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "user", "password" ] @@ -385,13 +385,13 @@ "raw": "{\n \"firstName\": \"Saeid\",\n \"lastName\": \"Rezaei\",\n \"subscriptionKey\": \"XXXX-XXXX-XXXX-XXXX\"\n}" }, "url": { - "raw": "{{host}}/api/v3/user/profile", + "raw": "{{host}}/api/v1/user/profile", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "user", "profile" ] @@ -429,13 +429,13 @@ "raw": "{\n \"oldPassword\": \"#Bugs4Fun\",\n \"newPassword\": \"#Bugs4Fun2\"\n}" }, "url": { - "raw": "{{host}}/api/v3/user/password", + "raw": "{{host}}/api/v1/user/password", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "user", "password" ] @@ -477,13 +477,13 @@ "raw": "{\n \"email\": \"user@domain.com\",\n \"password\": \"#Bugs4Fun2\"\n}" }, "url": { - "raw": "{{host}}/api/v3/user/login", + "raw": "{{host}}/api/v1/user/login", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "user", "login" ] @@ -521,13 +521,13 @@ "raw": "" }, "url": { - "raw": "{{host}}/api/v3/user/profile", + "raw": "{{host}}/api/v1/user/profile", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "user", "profile" ] @@ -582,13 +582,13 @@ "method": "GET", "header": [], "url": { - "raw": "{{host}}/api/v3/status", + "raw": "{{host}}/api/v1/status", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "status" ] } @@ -616,13 +616,13 @@ "method": "GET", "header": [], "url": { - "raw": "{{host}}/api/v3/email-activation", + "raw": "{{host}}/api/v1/email-activation", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "email-activation" ] } @@ -650,13 +650,13 @@ "method": "GET", "header": [], "url": { - "raw": "{{host}}/api/v3/fog-types", + "raw": "{{host}}/api/v1/fog-types", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "fog-types" ] } @@ -719,13 +719,13 @@ "raw": "{\n \"firstName\": \"John\",\n \"lastName\": \"Doe\",\n \"email\": \"user@domain.com\",\n \"password\": \"#Bugs4Fun\",\n \"subscriptionKey\": \"XXXX-XXXX-XXXX-XXXX\"\n}" }, "url": { - "raw": "{{host}}/api/v3/user/signup", + "raw": "{{host}}/api/v1/user/signup", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "user", "signup" ] @@ -767,13 +767,13 @@ "raw": "{\n \"email\": \"user@domain.com\",\n \"password\": \"#Bugs4Fun\"\n}" }, "url": { - "raw": "{{host}}/api/v3/user/login", + "raw": "{{host}}/api/v1/user/login", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "user", "login" ] @@ -819,13 +819,13 @@ "raw": "{\n \"name\": \"system node\",\n \"routerMode\": \"interior\",\n \"messagingPort\": 5672,\n \"edgeRouterPort\": 56722,\n \"interRouterPort\": 56721,\n \"host\": \"localhost\",\n \"isSystem\": true,\n \"location\": \"string\",\n \"latitude\": 0,\n \"longitude\": 0,\n \"description\": \"string\",\n \"dockerUrl\": \"string\",\n \"diskLimit\": 0,\n \"diskDirectory\": \"string\",\n \"memoryLimit\": 0,\n \"cpuLimit\": 0,\n \"logLimit\": 0,\n \"logDirectory\": \"string\",\n \"logFileCount\": 0,\n \"statusFrequency\": 0,\n \"changeFrequency\": 0,\n \"deviceScanFrequency\": 0,\n \"bluetoothEnabled\": false,\n \"watchdogEnabled\": true,\n \"abstractedHardwareEnabled\": false,\n \"fogType\": 1\n,\n \"host\": \"1.2.3.4\"\n}" }, "url": { - "raw": "{{host}}/api/v3/iofog", + "raw": "{{host}}/api/v1/iofog", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "iofog" ] } @@ -870,13 +870,13 @@ "raw": "{\n \"name\": \"string\",\n \"host\": \"1.2.3.4\",\n \"location\": \"string\",\n \"latitude\": 0,\n \"longitude\": 0,\n \"description\": \"string\",\n \"dockerUrl\": \"string\",\n \"diskLimit\": 0,\n \"diskDirectory\": \"string\",\n \"memoryLimit\": 0,\n \"cpuLimit\": 0,\n \"logLimit\": 0,\n \"logDirectory\": \"string\",\n \"logFileCount\": 0,\n \"statusFrequency\": 0,\n \"changeFrequency\": 0,\n \"deviceScanFrequency\": 0,\n \"bluetoothEnabled\": false,\n \"watchdogEnabled\": true,\n \"abstractedHardwareEnabled\": false,\n \"fogType\": 1\n,\n \"host\": \"1.2.3.4\"\n}" }, "url": { - "raw": "{{host}}/api/v3/iofog", + "raw": "{{host}}/api/v1/iofog", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "iofog" ] } @@ -917,13 +917,13 @@ } ], "url": { - "raw": "{{host}}/api/v3/iofog/{{node-id}}/provisioning-key", + "raw": "{{host}}/api/v1/iofog/{{node-id}}/provisioning-key", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "iofog", "{{node-id}}", "provisioning-key" @@ -964,13 +964,13 @@ "raw": "{\n\t\"type\": 1,\n\t\"key\":\"{{provisioning-key}}\"\n}" }, "url": { - "raw": "{{host}}/api/v3/agent/provision", + "raw": "{{host}}/api/v1/agent/provision", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "agent", "provision" ] @@ -1014,13 +1014,13 @@ } ], "url": { - "raw": "{{host}}/api/v3/agent/config", + "raw": "{{host}}/api/v1/agent/config", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "agent", "config" ] @@ -1059,13 +1059,13 @@ } ], "url": { - "raw": "{{host}}/api/v3/agent/image-snapshot", + "raw": "{{host}}/api/v1/agent/image-snapshot", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "agent", "image-snapshot" ] @@ -1104,13 +1104,13 @@ } ], "url": { - "raw": "{{host}}/api/v3/agent/microservices/abcedf", + "raw": "{{host}}/api/v1/agent/microservices/abcedf", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "agent", "microservices", "abcedf" @@ -1147,13 +1147,13 @@ } ], "url": { - "raw": "{{host}}/api/v3/agent/strace", + "raw": "{{host}}/api/v1/agent/strace", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "agent", "strace" ] @@ -1193,13 +1193,13 @@ "raw": "{\r\n \"info\": \"testData\"\r\n}" }, "url": { - "raw": "{{host}}/api/v3/agent/hal/hw", + "raw": "{{host}}/api/v1/agent/hal/hw", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "agent", "hal", "hw" @@ -1240,13 +1240,13 @@ "raw": "{\r\n \"info\": \"testData2\"\r\n}" }, "url": { - "raw": "{{host}}/api/v3/agent/hal/usb", + "raw": "{{host}}/api/v1/agent/hal/usb", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "agent", "hal", "usb" @@ -1290,13 +1290,13 @@ "raw": "{\r\n \"straceData\": [\r\n {\r\n \"microserviceUuid\": \"abcdef\",\r\n \"buffer\": \"test\"\r\n }\r\n ]\r\n}" }, "url": { - "raw": "{{host}}/api/v3/agent/strace", + "raw": "{{host}}/api/v1/agent/strace", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "agent", "strace" ] @@ -1336,13 +1336,13 @@ "raw": "{\r\n \"daemonStatus\": \"RUNNING\",\r\n \"daemonOperatingDuration\": 15,\r\n \"daemonLastStart\": 25,\r\n \"memoryUsage\": 16,\r\n \"diskUsage\": 14,\r\n \"cpuUsage\": 17,\r\n \"memoryViolation\": true,\r\n \"diskViolation\": true,\r\n \"cpuViolation\": true,\r\n \"microserviceStatus\": \"[]\",\r\n \"repositoryCount\": 5,\r\n \"repositoryStatus\": \"RUNNING\",\r\n \"systemTime\": 155,\r\n \"lastStatusTime\": 166,\r\n \"ipAddress\": \"192.168.0.1\",\r\n \"processedMessages\": 255,\r\n \"microserviceMessageCounts\": \"counts\",\r\n \"messageSpeed\": 52,\r\n \"lastCommandTime\": 57,\r\n \"tunnelStatus\": \"on\",\r\n \"version\": \"1\",\r\n \"isReadyToUpgrade\": true,\r\n \"isReadyToRollback\": true\r\n}" }, "url": { - "raw": "{{host}}/api/v3/agent/status", + "raw": "{{host}}/api/v1/agent/status", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "agent", "status" ] @@ -1385,13 +1385,13 @@ "raw": "{\r\n \"info\": \"testData2\"\r\n}" }, "url": { - "raw": "{{host}}/api/v3/agent/image-snapshot", + "raw": "{{host}}/api/v1/agent/image-snapshot", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "agent", "image-snapshot" ] @@ -1438,13 +1438,13 @@ "raw": "{\n \"name\": \"application-msvc-name\",\n \"isSystem\": false,\n \"description\": \"Description\",\n \"isActivated\": true,\n \"microservices\": [\n {\n \"name\": \"msvc-1\",\n \"config\": \"string\",\n \"images\": [\n {\n \"containerImage\": \"hello-world\",\n \"fogTypeId\": 1\n },\n {\n \"containerImage\": \"hello-world\",\n \"fogTypeId\": 2\n }\n ],\n \"registryId\": 1,\n \"application\": \"{{application-name-2}}\",\n \"iofogUuid\": \"{{node-id}}\",\n \"rootHostAccess\": true,\n \"logSize\": 0,\n \"volumeMappings\": [\n {\n \"hostDestination\": \"/var/dest\",\n \"containerDestination\": \"/var/dest\",\n \"accessMode\": \"rw\"\n }\n ],\n \"ports\": [{\n \"internal\": 81,\n \"external\": 5001\n }, {\n \"internal\": 80,\n \"external\": 5002,\n \"protocol\": \"udp\"\n }],\n \"routes\": [],\n \"env\": [\n {\n \"key\": \"KEY1\",\n \"value\": \"value1\"\n },\n {\n \"key\": \"KEY2\",\n \"value\": \"value2\"\n }\n ],\n \"cmd\": [\n \"test\",\n \"--arg1\",\n \"--arg2\"\n ]\n },\n {\n \"name\": \"msvc-2\",\n \"config\": \"string\",\n \"images\": [\n {\n \"containerImage\": \"hello-world\",\n \"fogTypeId\": 1\n },\n {\n \"containerImage\": \"hello-world\",\n \"fogTypeId\": 2\n }\n ],\n \"registryId\": 1,\n \"application\": \"{{application-name-2}}\",\n \"iofogUuid\": \"{{node-id}}\",\n \"rootHostAccess\": true,\n \"logSize\": 0,\n \"volumeMappings\": [\n {\n \"hostDestination\": \"/var/dest\",\n \"containerDestination\": \"/var/dest\",\n \"accessMode\": \"rw\"\n }\n ],\n \"ports\": [],\n \"routes\": [],\n \"env\": [\n {\n \"key\": \"KEY1\",\n \"value\": \"value1\"\n },\n {\n \"key\": \"KEY2\",\n \"value\": \"value2\"\n }\n ],\n \"cmd\": [\n \"test\",\n \"--arg1\",\n \"--arg2\"\n ]\n },\n {\n \"name\": \"msvc-3\",\n \"config\": \"string\",\n \"images\": [\n {\n \"containerImage\": \"hello-world\",\n \"fogTypeId\": 1\n },\n {\n \"containerImage\": \"hello-world\",\n \"fogTypeId\": 2\n }\n ],\n \"registryId\": 1,\n \"application\": \"{{application-name-2}}\",\n \"iofogUuid\": \"{{node-id}}\",\n \"rootHostAccess\": true,\n \"logSize\": 0,\n \"volumeMappings\": [\n {\n \"hostDestination\": \"/var/dest\",\n \"containerDestination\": \"/var/dest\",\n \"accessMode\": \"rw\"\n }\n ],\n \"ports\": [],\n \"routes\": [],\n \"env\": [\n {\n \"key\": \"KEY1\",\n \"value\": \"value1\"\n },\n {\n \"key\": \"KEY2\",\n \"value\": \"value2\"\n }\n ],\n \"cmd\": [\n \"test\",\n \"--arg1\",\n \"--arg2\"\n ]\n }\n ],\n \"routes\": [\n {\n \"from\": \"msvc-1\",\n \"to\": \"msvc-2\",\n \"name\": \"m1-2\"\n }\n ]\n}" }, "url": { - "raw": "{{host}}/api/v3/application", + "raw": "{{host}}/api/v1/application", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "application" ] } @@ -1483,13 +1483,13 @@ "raw": "{\r\n \"networkInterface\": \"wlan0\",\r\n \"dockerUrl\": \"http://google.com\",\r\n \"diskLimit\": 15,\r\n \"diskDirectory\": \"testDirectoryPath\",\r\n \"memoryLimit\": 150,\r\n \"cpuLimit\": 17,\r\n \"logLimit\": 16,\r\n \"logDirectory\": \"testLogPath\",\r\n \"logFileCount\": 7,\r\n \"statusFrequency\": 35,\r\n \"changeFrequency\": 36,\r\n \"deviceScanFrequency\": 37,\r\n \"watchdogEnabled\": true,\r\n \"latitude\": 22,\r\n \"longitude\": 66,\r\n \"gpsMode\": \"manual\",\r\n \"dockerPruningFrequency\": 35,\r\n \"availableDiskThreshold\": 95,\r\n \"logLevel\": \"INFO\"\r\n}" }, "url": { - "raw": "{{host}}/api/v3/agent/config", + "raw": "{{host}}/api/v1/agent/config", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "agent", "config" ] @@ -1531,13 +1531,13 @@ } ], "url": { - "raw": "{{host}}/api/v3/agent/config/changes", + "raw": "{{host}}/api/v1/agent/config/changes", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "agent", "config", "changes" @@ -1577,13 +1577,13 @@ } ], "url": { - "raw": "{{host}}/api/v3/agent/tunnel", + "raw": "{{host}}/api/v1/agent/tunnel", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "agent", "tunnel" ] @@ -1622,13 +1622,13 @@ } ], "url": { - "raw": "{{host}}/api/v3/agent/registries", + "raw": "{{host}}/api/v1/agent/registries", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "agent", "registries" ] @@ -1667,13 +1667,13 @@ } ], "url": { - "raw": "{{host}}/api/v3/agent/version", + "raw": "{{host}}/api/v1/agent/version", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "agent", "version" ] @@ -1720,13 +1720,13 @@ } ], "url": { - "raw": "{{host}}/api/v3/agent/microservices", + "raw": "{{host}}/api/v1/agent/microservices", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "agent", "microservices" ] @@ -1766,13 +1766,13 @@ "raw": "{\n\t\"type\": 1,\n\t\"key\":\"testtesttest\"\n}" }, "url": { - "raw": "{{host}}/api/v3/iofog/{{system-node-id}}", + "raw": "{{host}}/api/v1/iofog/{{system-node-id}}", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "iofog", "{{system-node-id}}" ] @@ -1812,13 +1812,13 @@ "raw": "" }, "url": { - "raw": "{{host}}/api/v3/iofog/{{node-id}}", + "raw": "{{host}}/api/v1/iofog/{{node-id}}", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "iofog", "{{node-id}}" ] @@ -1856,13 +1856,13 @@ "raw": "" }, "url": { - "raw": "{{host}}/api/v3/user/profile", + "raw": "{{host}}/api/v1/user/profile", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "user", "profile" ] @@ -1926,13 +1926,13 @@ "raw": "{\n \"firstName\": \"John\",\n \"lastName\": \"Doe\",\n \"email\": \"user@domain.com\",\n \"password\": \"#Bugs4Fun\",\n \"subscriptionKey\": \"XXXX-XXXX-XXXX-XXXX\"\n}" }, "url": { - "raw": "{{host}}/api/v3/user/signup", + "raw": "{{host}}/api/v1/user/signup", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "user", "signup" ] @@ -1974,13 +1974,13 @@ "raw": "{\n \"email\": \"user@domain.com\",\n \"password\": \"#Bugs4Fun\"\n}" }, "url": { - "raw": "{{host}}/api/v3/user/login", + "raw": "{{host}}/api/v1/user/login", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "user", "login" ] @@ -2026,13 +2026,13 @@ "raw": "{\n \"name\": \"system node\",\n \"routerMode\": \"interior\",\n \"messagingPort\": 5672,\n \"edgeRouterPort\": 56722,\n \"interRouterPort\": 56721,\n \"host\": \"localhost\",\n \"isSystem\": true,\n \"location\": \"string\",\n \"latitude\": 0,\n \"longitude\": 0,\n \"description\": \"string\",\n \"dockerUrl\": \"string\",\n \"diskLimit\": 0,\n \"diskDirectory\": \"string\",\n \"memoryLimit\": 0,\n \"cpuLimit\": 0,\n \"logLimit\": 0,\n \"logDirectory\": \"string\",\n \"logFileCount\": 0,\n \"statusFrequency\": 0,\n \"changeFrequency\": 0,\n \"deviceScanFrequency\": 0,\n \"bluetoothEnabled\": false,\n \"watchdogEnabled\": true,\n \"abstractedHardwareEnabled\": false,\n \"fogType\": 1\n,\n \"host\": \"1.2.3.4\"\n}" }, "url": { - "raw": "{{host}}/api/v3/iofog", + "raw": "{{host}}/api/v1/iofog", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "iofog" ] } @@ -2077,13 +2077,13 @@ "raw": "{\n \"name\": \"string\",\n \"host\": \"1.2.3.4\",\n \"location\": \"string\",\n \"latitude\": 0,\n \"longitude\": 0,\n \"description\": \"string\",\n \"dockerUrl\": \"string\",\n \"diskLimit\": 0,\n \"diskDirectory\": \"string\",\n \"memoryLimit\": 0,\n \"cpuLimit\": 0,\n \"logLimit\": 0,\n \"logDirectory\": \"string\",\n \"logFileCount\": 0,\n \"statusFrequency\": 0,\n \"changeFrequency\": 0,\n \"deviceScanFrequency\": 0,\n \"bluetoothEnabled\": false,\n \"watchdogEnabled\": true,\n \"abstractedHardwareEnabled\": false,\n \"fogType\": 1\n,\n \"host\": \"1.2.3.4\"\n}" }, "url": { - "raw": "{{host}}/api/v3/iofog", + "raw": "{{host}}/api/v1/iofog", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "iofog" ] } @@ -2127,13 +2127,13 @@ "raw": "{\n \"name\": \"application-name\",\n \"isSystem\": false,\n \"description\": \"Description\",\n \"isActivated\": true\n}" }, "url": { - "raw": "{{host}}/api/v3/application", + "raw": "{{host}}/api/v1/application", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "application" ] } @@ -2179,13 +2179,13 @@ "raw": "{\n \"name\": \"application-msvc-name\",\n \"isSystem\": false,\n \"description\": \"Description\",\n \"isActivated\": true,\n \"microservices\": [\n {\n \"name\": \"msvc-1\",\n \"config\": \"string\",\n \"images\": [\n {\n \"containerImage\": \"hello-world\",\n \"fogTypeId\": 1\n },\n {\n \"containerImage\": \"hello-world\",\n \"fogTypeId\": 2\n }\n ],\n \"registryId\": 1,\n \"application\": \"{{application-name-2}}\",\n \"iofogUuid\": \"{{node-id}}\",\n \"rootHostAccess\": true,\n \"logSize\": 0,\n \"volumeMappings\": [\n {\n \"hostDestination\": \"/var/dest\",\n \"containerDestination\": \"/var/dest\",\n \"accessMode\": \"rw\"\n }\n ],\n \"ports\": [],\n \"routes\": [],\n \"env\": [\n {\n \"key\": \"KEY1\",\n \"value\": \"value1\"\n },\n {\n \"key\": \"KEY2\",\n \"value\": \"value2\"\n }\n ],\n \"cmd\": [\n \"test\",\n \"--arg1\",\n \"--arg2\"\n ]\n },\n {\n \"name\": \"msvc-2\",\n \"config\": \"string\",\n \"images\": [\n {\n \"containerImage\": \"hello-world\",\n \"fogTypeId\": 1\n },\n {\n \"containerImage\": \"hello-world\",\n \"fogTypeId\": 2\n }\n ],\n \"registryId\": 1,\n \"application\": \"{{application-name-2}}\",\n \"iofogUuid\": \"{{node-id}}\",\n \"rootHostAccess\": true,\n \"logSize\": 0,\n \"volumeMappings\": [\n {\n \"hostDestination\": \"/var/dest\",\n \"containerDestination\": \"/var/dest\",\n \"accessMode\": \"rw\"\n }\n ],\n \"ports\": [],\n \"routes\": [],\n \"env\": [\n {\n \"key\": \"KEY1\",\n \"value\": \"value1\"\n },\n {\n \"key\": \"KEY2\",\n \"value\": \"value2\"\n }\n ],\n \"cmd\": [\n \"test\",\n \"--arg1\",\n \"--arg2\"\n ]\n },\n {\n \"name\": \"msvc-3\",\n \"config\": \"string\",\n \"images\": [\n {\n \"containerImage\": \"hello-world\",\n \"fogTypeId\": 1\n },\n {\n \"containerImage\": \"hello-world\",\n \"fogTypeId\": 2\n }\n ],\n \"registryId\": 1,\n \"application\": \"{{application-name-2}}\",\n \"iofogUuid\": \"{{node-id}}\",\n \"rootHostAccess\": true,\n \"logSize\": 0,\n \"volumeMappings\": [\n {\n \"hostDestination\": \"/var/dest\",\n \"containerDestination\": \"/var/dest\",\n \"accessMode\": \"rw\"\n }\n ],\n \"ports\": [],\n \"routes\": [],\n \"env\": [\n {\n \"key\": \"KEY1\",\n \"value\": \"value1\"\n },\n {\n \"key\": \"KEY2\",\n \"value\": \"value2\"\n }\n ],\n \"cmd\": [\n \"test\",\n \"--arg1\",\n \"--arg2\"\n ]\n }\n ],\n \"routes\": [\n {\n \"from\": \"msvc-1\",\n \"to\": \"msvc-2\",\n \"name\": \"m1-2\"\n }\n ]\n}" }, "url": { - "raw": "{{host}}/api/v3/application", + "raw": "{{host}}/api/v1/application", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "application" ] } @@ -2236,13 +2236,13 @@ ] }, "url": { - "raw": "{{host}}/api/v3/application/yaml", + "raw": "{{host}}/api/v1/application/yaml", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "application", "yaml" ] @@ -2282,13 +2282,13 @@ } ], "url": { - "raw": "{{host}}/api/v3/routes/{{application-msvc-name}}/{{application-route-name}}", + "raw": "{{host}}/api/v1/routes/{{application-msvc-name}}/{{application-route-name}}", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "routes", "{{application-msvc-name}}", "{{application-route-name}}" @@ -2330,13 +2330,13 @@ "raw": "{\n \"routes\": [\n {\n \"from\": \"msvc-1\",\n \"to\": \"msvc-3\",\n \"name\": \"m1-2\"\n },\n {\n \"from\": \"msvc-1\",\n \"to\": \"msvc-1\",\n \"name\": \"m1-1\"\n }\n ]\n}" }, "url": { - "raw": "{{host}}/api/v3/application/{{application-msvc-name}}", + "raw": "{{host}}/api/v1/application/{{application-msvc-name}}", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "application", "{{application-msvc-name}}" ] @@ -2377,13 +2377,13 @@ } ], "url": { - "raw": "{{host}}/api/v3/application/{{application-msvc-name}}", + "raw": "{{host}}/api/v1/application/{{application-msvc-name}}", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "application", "{{application-msvc-name}}" ] @@ -2423,13 +2423,13 @@ } ], "url": { - "raw": "{{host}}/api/v3/routes/{{application-msvc-name}}/{{application-route-name}}", + "raw": "{{host}}/api/v1/routes/{{application-msvc-name}}/{{application-route-name}}", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "routes", "{{application-msvc-name}}", "{{application-route-name}}" @@ -2479,13 +2479,13 @@ } ], "url": { - "raw": "{{host}}/api/v3/microservices?application={{application-msvc-name}}", + "raw": "{{host}}/api/v1/microservices?application={{application-msvc-name}}", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "microservices" ], "query": [ @@ -2529,13 +2529,13 @@ "raw": "{\n \"description\": \"Description\",\n \"microservices\": [\n {\n \"name\": \"msvc-1\",\n \"config\": \"string\",\n \"images\": [\n {\n \"containerImage\": \"hello-world\",\n \"fogTypeId\": 1\n },\n {\n \"containerImage\": \"hello-world\",\n \"fogTypeId\": 2\n }\n ],\n \"registryId\": 1,\n \"application\": \"{{application-name-2}}\",\n \"iofogUuid\": \"{{node-id}}\",\n \"rootHostAccess\": true,\n \"logSize\": 0,\n \"volumeMappings\": [\n {\n \"hostDestination\": \"/var/dest\",\n \"containerDestination\": \"/var/dest\",\n \"accessMode\": \"rw\"\n }\n ],\n \"ports\": [],\n \"routes\": [],\n \"env\": [\n {\n \"key\": \"KEY1\",\n \"value\": \"value1\"\n },\n {\n \"key\": \"KEY2\",\n \"value\": \"value2\"\n }\n ],\n \"cmd\": [\n \"test\",\n \"--arg1\",\n \"--arg2\"\n ]\n },\n {\n \"name\": \"msvc-2\",\n \"config\": \"string\",\n \"images\": [\n {\n \"containerImage\": \"hello-world\",\n \"fogTypeId\": 1\n },\n {\n \"containerImage\": \"hello-world\",\n \"fogTypeId\": 2\n }\n ],\n \"registryId\": 1,\n \"application\": \"{{application-name-2}}\",\n \"iofogUuid\": \"{{node-id}}\",\n \"rootHostAccess\": true,\n \"logSize\": 0,\n \"volumeMappings\": [\n {\n \"hostDestination\": \"/var/dest\",\n \"containerDestination\": \"/var/dest\",\n \"accessMode\": \"rw\"\n }\n ],\n \"ports\": [],\n \"routes\": [],\n \"env\": [\n {\n \"key\": \"KEY1\",\n \"value\": \"value1\"\n },\n {\n \"key\": \"KEY2\",\n \"value\": \"value2\"\n }\n ],\n \"cmd\": [\n \"test\",\n \"--arg1\",\n \"--arg2\"\n ]\n }\n ]\n}" }, "url": { - "raw": "{{host}}/api/v3/application/{{application-msvc-name}}", + "raw": "{{host}}/api/v1/application/{{application-msvc-name}}", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "application", "{{application-msvc-name}}" ] @@ -2580,13 +2580,13 @@ ] }, "url": { - "raw": "{{host}}/api/v3/application/yaml/{{application-yaml-name}}", + "raw": "{{host}}/api/v1/application/yaml/{{application-yaml-name}}", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "application", "yaml", "{{application-yaml-name}}" @@ -2645,13 +2645,13 @@ } ], "url": { - "raw": "{{host}}/api/v3/microservices?application={{application-yaml-name}}", + "raw": "{{host}}/api/v1/microservices?application={{application-yaml-name}}", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "microservices" ], "query": [ @@ -2705,13 +2705,13 @@ } ], "url": { - "raw": "{{host}}/api/v3/microservices?application={{application-msvc-name}}", + "raw": "{{host}}/api/v1/microservices?application={{application-msvc-name}}", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "microservices" ], "query": [ @@ -2755,13 +2755,13 @@ } ], "url": { - "raw": "{{host}}/api/v3/application", + "raw": "{{host}}/api/v1/application", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "application" ] } @@ -2799,13 +2799,13 @@ } ], "url": { - "raw": "{{host}}/api/v3/application/{{application-name}}", + "raw": "{{host}}/api/v1/application/{{application-name}}", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "application", "{{application-name}}" ] @@ -2845,13 +2845,13 @@ "raw": "{\n \"name\": \"application-name-22\",\n \"isSystem\": true,\n \"description\": \"Description\",\n \"isActivated\": true\n}" }, "url": { - "raw": "{{host}}/api/v3/application/{{application-name}}", + "raw": "{{host}}/api/v1/application/{{application-name}}", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "application", "{{application-name}}" ] @@ -2890,13 +2890,13 @@ } ], "url": { - "raw": "{{host}}/api/v3/application", + "raw": "{{host}}/api/v1/application", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "application" ] } @@ -2934,13 +2934,13 @@ "raw": "" }, "url": { - "raw": "{{host}}/api/v3/application/{{application-name}}", + "raw": "{{host}}/api/v1/application/{{application-name}}", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "application", "{{application-name}}" ] @@ -2979,13 +2979,13 @@ "raw": "" }, "url": { - "raw": "{{host}}/api/v3/application/{{application-msvc-name}}", + "raw": "{{host}}/api/v1/application/{{application-msvc-name}}", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "application", "{{application-msvc-name}}" ] @@ -3024,13 +3024,13 @@ "raw": "" }, "url": { - "raw": "{{host}}/api/v3/application/{{application-yaml-name}}", + "raw": "{{host}}/api/v1/application/{{application-yaml-name}}", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "application", "{{application-yaml-name}}" ] @@ -3069,13 +3069,13 @@ } ], "url": { - "raw": "{{host}}/api/v3/application", + "raw": "{{host}}/api/v1/application", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "application" ] } @@ -3116,13 +3116,13 @@ } ], "url": { - "raw": "{{host}}/api/v3/microservices", + "raw": "{{host}}/api/v1/microservices", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "microservices" ] } @@ -3156,13 +3156,13 @@ } ], "url": { - "raw": "{{host}}/api/v3/route/{{application-route-name}}", + "raw": "{{host}}/api/v1/route/{{application-route-name}}", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "route", "{{application-route-name}}" ] @@ -3202,13 +3202,13 @@ "raw": "{\n\t\"type\": 1,\n\t\"key\":\"testtesttest\"\n}" }, "url": { - "raw": "{{host}}/api/v3/iofog/{{system-node-id}}", + "raw": "{{host}}/api/v1/iofog/{{system-node-id}}", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "iofog", "{{system-node-id}}" ] @@ -3248,13 +3248,13 @@ "raw": "" }, "url": { - "raw": "{{host}}/api/v3/iofog/{{node-id}}", + "raw": "{{host}}/api/v1/iofog/{{node-id}}", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "iofog", "{{node-id}}" ] @@ -3292,13 +3292,13 @@ "raw": "" }, "url": { - "raw": "{{host}}/api/v3/user/profile", + "raw": "{{host}}/api/v1/user/profile", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "user", "profile" ] @@ -3362,13 +3362,13 @@ "raw": "{\n \"firstName\": \"John\",\n \"lastName\": \"Doe\",\n \"email\": \"user@domain.com\",\n \"password\": \"#Bugs4Fun\",\n \"subscriptionKey\": \"XXXX-XXXX-XXXX-XXXX\"\n }" }, "url": { - "raw": "{{host}}/api/v3/user/signup", + "raw": "{{host}}/api/v1/user/signup", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "user", "signup" ] @@ -3410,13 +3410,13 @@ "raw": "{\n \"email\": \"user@domain.com\",\n \"password\": \"#Bugs4Fun\"\n}" }, "url": { - "raw": "{{host}}/api/v3/user/login", + "raw": "{{host}}/api/v1/user/login", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "user", "login" ] @@ -3462,13 +3462,13 @@ "raw": "{\n \"name\": \"system node\",\n \"routerMode\": \"interior\",\n \"messagingPort\": 5672,\n \"edgeRouterPort\": 56722,\n \"interRouterPort\": 56721,\n \"host\": \"localhost\",\n \"isSystem\": true,\n \"location\": \"string\",\n \"latitude\": 0,\n \"longitude\": 0,\n \"description\": \"string\",\n \"dockerUrl\": \"string\",\n \"diskLimit\": 0,\n \"diskDirectory\": \"string\",\n \"memoryLimit\": 0,\n \"cpuLimit\": 0,\n \"logLimit\": 0,\n \"logDirectory\": \"string\",\n \"logFileCount\": 0,\n \"statusFrequency\": 0,\n \"changeFrequency\": 0,\n \"deviceScanFrequency\": 0,\n \"bluetoothEnabled\": false,\n \"watchdogEnabled\": true,\n \"abstractedHardwareEnabled\": false,\n \"fogType\": 1\n,\n \"host\": \"1.2.3.4\"\n}" }, "url": { - "raw": "{{host}}/api/v3/iofog", + "raw": "{{host}}/api/v1/iofog", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "iofog" ] } @@ -3513,13 +3513,13 @@ "raw": "{\n \"name\": \"string\",\n \"host\": \"1.2.3.4\",\n \"location\": \"string\",\n \"latitude\": 0,\n \"longitude\": 0,\n \"description\": \"string\",\n \"dockerUrl\": \"string\",\n \"diskLimit\": 0,\n \"diskDirectory\": \"string\",\n \"memoryLimit\": 0,\n \"cpuLimit\": 0,\n \"logLimit\": 0,\n \"logDirectory\": \"string\",\n \"logFileCount\": 0,\n \"statusFrequency\": 0,\n \"changeFrequency\": 0,\n \"deviceScanFrequency\": 0,\n \"bluetoothEnabled\": false,\n \"watchdogEnabled\": true,\n \"abstractedHardwareEnabled\": false,\n \"fogType\": 1\n,\n \"host\": \"1.2.3.4\"\n}" }, "url": { - "raw": "{{host}}/api/v3/iofog", + "raw": "{{host}}/api/v1/iofog", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "iofog" ] } @@ -3567,13 +3567,13 @@ "raw": "{\n \"name\": \"application-template-name\",\n \"variables\": [\n {\n \"key\": \"agent-1-name\",\n \"description\": \"Agent name for msvc-1\"\n },\n {\n \"key\": \"env-value-1\",\n \"description\": \"ENV variable value for KEY1\"\n },\n {\n \"key\": \"env-value-2\",\n \"description\": \"ENV variable value for KEY2\",\n \"defaultValue\": \"test42\"\n }\n ],\n \"application\": {\n \"microservices\": [\n {\n \"name\": \"msvc-1\",\n \"config\": \"string\",\n \"images\": [\n {\n \"containerImage\": \"hello-world\",\n \"fogTypeId\": 1\n },\n {\n \"containerImage\": \"hello-world\",\n \"fogTypeId\": 2\n }\n ],\n \"registryId\": 1,\n \"agentName\": \"{{ agent-1-name }}\",\n \"rootHostAccess\": true,\n \"logSize\": 0,\n \"volumeMappings\": [\n {\n \"hostDestination\": \"/var/dest\",\n \"containerDestination\": \"/var/dest\",\n \"accessMode\": \"rw\"\n }\n ],\n \"ports\": [],\n \"routes\": [],\n \"env\": [\n {\n \"key\": \"KEY1\",\n \"value\": \"{{ env-value-1 }}\"\n },\n {\n \"key\": \"KEY2\",\n \"value\": \"{{ env-value-2 }}\"\n }\n ],\n \"cmd\": [\n \"test\",\n \"--arg1\",\n \"--arg2\"\n ]\n },\n {\n \"name\": \"msvc-2\",\n \"config\": \"string\",\n \"images\": [\n {\n \"containerImage\": \"hello-world\",\n \"fogTypeId\": 1\n },\n {\n \"containerImage\": \"hello-world\",\n \"fogTypeId\": 2\n }\n ],\n \"registryId\": 1,\n \"application\": \"{{application-name-2}}\",\n \"iofogUuid\": \"{{node-id}}\",\n \"rootHostAccess\": true,\n \"logSize\": 0,\n \"volumeMappings\": [\n {\n \"hostDestination\": \"/var/dest\",\n \"containerDestination\": \"/var/dest\",\n \"accessMode\": \"rw\"\n }\n ],\n \"ports\": [],\n \"routes\": [],\n \"env\": [\n {\n \"key\": \"KEY1\",\n \"value\": \"value1\"\n },\n {\n \"key\": \"KEY2\",\n \"value\": \"value2\"\n }\n ],\n \"cmd\": [\n \"test\",\n \"--arg1\",\n \"--arg2\"\n ]\n },\n {\n \"name\": \"msvc-3\",\n \"config\": \"string\",\n \"images\": [\n {\n \"containerImage\": \"hello-world\",\n \"fogTypeId\": 1\n },\n {\n \"containerImage\": \"hello-world\",\n \"fogTypeId\": 2\n }\n ],\n \"registryId\": 1,\n \"application\": \"{{application-name-2}}\",\n \"iofogUuid\": \"{{node-id}}\",\n \"rootHostAccess\": true,\n \"logSize\": 0,\n \"volumeMappings\": [\n {\n \"hostDestination\": \"/var/dest\",\n \"containerDestination\": \"/var/dest\",\n \"accessMode\": \"rw\"\n }\n ],\n \"ports\": [],\n \"routes\": [],\n \"env\": [\n {\n \"key\": \"KEY1\",\n \"value\": \"value1\"\n },\n {\n \"key\": \"KEY2\",\n \"value\": \"value2\"\n }\n ],\n \"cmd\": [\n \"test\",\n \"--arg1\",\n \"--arg2\"\n ]\n }\n ],\n \"routes\": [\n {\n \"from\": \"msvc-1\",\n \"to\": \"msvc-2\",\n \"name\": \"m1-2\"\n }\n ]\n }\n}" }, "url": { - "raw": "{{host}}/api/v3/applicationTemplate", + "raw": "{{host}}/api/v1/applicationTemplate", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "applicationTemplate" ] } @@ -3627,13 +3627,13 @@ ] }, "url": { - "raw": "{{host}}/api/v3/applicationTemplate/yaml", + "raw": "{{host}}/api/v1/applicationTemplate/yaml", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "applicationTemplate", "yaml" ] @@ -3673,13 +3673,13 @@ "raw": "{\n \"variables\": [\n {\n \"key\": \"agent-1-name\",\n \"description\": \"Agent name for msvc-1\"\n },\n {\n \"key\": \"env-value-1\",\n \"description\": \"ENV variable value for KEY1\"\n },\n {\n \"key\": \"env-value-2\",\n \"description\": \"ENV variable value for KEY2\",\n \"defaultValue\": \"test42\"\n }\n ],\n \"application\": {\n \"microservices\": [\n {\n \"name\": \"msvc-1\",\n \"config\": \"string\",\n \"images\": [\n {\n \"containerImage\": \"hello-world\",\n \"fogTypeId\": 1\n },\n {\n \"containerImage\": \"hello-world\",\n \"fogTypeId\": 2\n }\n ],\n \"registryId\": 1,\n \"agentName\": \"{{ agent-1-name }}\",\n \"rootHostAccess\": true,\n \"logSize\": 0,\n \"volumeMappings\": [\n {\n \"hostDestination\": \"/var/dest\",\n \"containerDestination\": \"/var/dest\",\n \"accessMode\": \"rw\"\n }\n ],\n \"ports\": [],\n \"routes\": [],\n \"env\": [\n {\n \"key\": \"KEY1\",\n \"value\": \"{{ env-value-1 }}\"\n },\n {\n \"key\": \"KEY2\",\n \"value\": \"{{ env-value-2 }}\"\n }\n ],\n \"cmd\": [\n \"test\",\n \"--arg1\",\n \"--arg2\"\n ]\n },\n {\n \"name\": \"msvc-2\",\n \"config\": \"string\",\n \"images\": [\n {\n \"containerImage\": \"hello-world\",\n \"fogTypeId\": 1\n },\n {\n \"containerImage\": \"hello-world\",\n \"fogTypeId\": 2\n }\n ],\n \"registryId\": 1,\n \"application\": \"{{application-name-2}}\",\n \"iofogUuid\": \"{{node-id}}\",\n \"rootHostAccess\": true,\n \"logSize\": 0,\n \"volumeMappings\": [\n {\n \"hostDestination\": \"/var/dest\",\n \"containerDestination\": \"/var/dest\",\n \"accessMode\": \"rw\"\n }\n ],\n \"ports\": [],\n \"routes\": [],\n \"env\": [\n {\n \"key\": \"KEY1\",\n \"value\": \"value1\"\n },\n {\n \"key\": \"KEY2\",\n \"value\": \"value2\"\n }\n ],\n \"cmd\": [\n \"test\",\n \"--arg1\",\n \"--arg2\"\n ]\n }\n ],\n \"routes\": [\n {\n \"from\": \"msvc-1\",\n \"to\": \"msvc-2\",\n \"name\": \"m1-2\"\n }\n ]\n }\n}" }, "url": { - "raw": "{{host}}/api/v3/applicationTemplate/{{application-template-name}}", + "raw": "{{host}}/api/v1/applicationTemplate/{{application-template-name}}", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "applicationTemplate", "{{application-template-name}}" ] @@ -3725,13 +3725,13 @@ ] }, "url": { - "raw": "{{host}}/api/v3/applicationTemplate/yaml/{{application-template-from-yaml-name}}", + "raw": "{{host}}/api/v1/applicationTemplate/yaml/{{application-template-from-yaml-name}}", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "applicationTemplate", "yaml", "{{application-template-from-yaml-name}}" @@ -3774,13 +3774,13 @@ "raw": "{\n \"name\": \"application-template-22\",\n \"description\": \"Description\"\n}" }, "url": { - "raw": "{{host}}/api/v3/applicationTemplate/{{application-template-name}}", + "raw": "{{host}}/api/v1/applicationTemplate/{{application-template-name}}", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "applicationTemplate", "{{application-template-name}}" ] @@ -3822,13 +3822,13 @@ "raw": "{\n \"name\": \"application-template-from-yaml-22\",\n \"description\": \"Description\"\n}" }, "url": { - "raw": "{{host}}/api/v3/applicationTemplate/{{application-template-from-yaml-name}}", + "raw": "{{host}}/api/v1/applicationTemplate/{{application-template-from-yaml-name}}", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "applicationTemplate", "{{application-template-from-yaml-name}}" ] @@ -3867,13 +3867,13 @@ } ], "url": { - "raw": "{{host}}/api/v3/applicationTemplates", + "raw": "{{host}}/api/v1/applicationTemplates", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "applicationTemplates" ] } @@ -3920,13 +3920,13 @@ } ], "url": { - "raw": "{{host}}/api/v3/applicationTemplate/{{application-template-from-yaml-name}}", + "raw": "{{host}}/api/v1/applicationTemplate/{{application-template-from-yaml-name}}", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "applicationTemplate", "{{application-template-from-yaml-name}}" ] @@ -3975,13 +3975,13 @@ "raw": "{\n \"name\": \"application-name-2\",\n \"template\": {\n \"name\": \"{{application-template-from-yaml-name}}\",\n \"variables\": [\n {\n \"key\": \"agent-1-name\",\n \"value\": \"string\"\n },\n {\n \"key\": \"env-value-1\",\n \"value\": \"12345\"\n },\n {\n \"key\": \"agent-2-name\",\n \"value\": \"string\"\n }\n ]\n },\n \"isSystem\": false,\n \"isActivated\": true,\n \"description\": \"new application from template\"\n}" }, "url": { - "raw": "{{host}}/api/v3/application", + "raw": "{{host}}/api/v1/application", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "application" ] } @@ -4025,13 +4025,13 @@ } ], "url": { - "raw": "{{host}}/api/v3/application/{{application-name}}", + "raw": "{{host}}/api/v1/application/{{application-name}}", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "application", "{{application-name}}" ] @@ -4076,13 +4076,13 @@ } ], "url": { - "raw": "{{host}}/api/v3/microservices/{{application-msvc-uuid}}", + "raw": "{{host}}/api/v1/microservices/{{application-msvc-uuid}}", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "microservices", "{{application-msvc-uuid}}" ] @@ -4121,13 +4121,13 @@ "raw": "" }, "url": { - "raw": "{{host}}/api/v3/application/{{application-name}}", + "raw": "{{host}}/api/v1/application/{{application-name}}", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "application", "{{application-name}}" ] @@ -4166,13 +4166,13 @@ "raw": "" }, "url": { - "raw": "{{host}}/api/v3/applicationTemplate/{{application-template-name}}", + "raw": "{{host}}/api/v1/applicationTemplate/{{application-template-name}}", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "applicationTemplate", "{{application-template-name}}" ] @@ -4211,13 +4211,13 @@ "raw": "" }, "url": { - "raw": "{{host}}/api/v3/applicationTemplate/{{application-template-from-yaml-name}}", + "raw": "{{host}}/api/v1/applicationTemplate/{{application-template-from-yaml-name}}", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "applicationTemplate", "{{application-template-from-yaml-name}}" ] @@ -4257,13 +4257,13 @@ "raw": "{\n\t\"type\": 1,\n\t\"key\":\"testtesttest\"\n}" }, "url": { - "raw": "{{host}}/api/v3/iofog/{{system-node-id}}", + "raw": "{{host}}/api/v1/iofog/{{system-node-id}}", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "iofog", "{{system-node-id}}" ] @@ -4303,13 +4303,13 @@ "raw": "" }, "url": { - "raw": "{{host}}/api/v3/iofog/{{node-id}}", + "raw": "{{host}}/api/v1/iofog/{{node-id}}", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "iofog", "{{node-id}}" ] @@ -4347,13 +4347,13 @@ "raw": "" }, "url": { - "raw": "{{host}}/api/v3/user/profile", + "raw": "{{host}}/api/v1/user/profile", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "user", "profile" ] @@ -4417,13 +4417,13 @@ "raw": "{\n \"firstName\": \"John\",\n \"lastName\": \"Doe\",\n \"email\": \"user@domain.com\",\n \"password\": \"#Bugs4Fun\",\n \"subscriptionKey\": \"XXXX-XXXX-XXXX-XXXX\"\n}" }, "url": { - "raw": "{{host}}/api/v3/user/signup", + "raw": "{{host}}/api/v1/user/signup", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "user", "signup" ] @@ -4465,13 +4465,13 @@ "raw": "{\n \"email\": \"user@domain.com\",\n \"password\": \"#Bugs4Fun\"\n}" }, "url": { - "raw": "{{host}}/api/v3/user/login", + "raw": "{{host}}/api/v1/user/login", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "user", "login" ] @@ -4517,13 +4517,13 @@ "raw": "{\n \"name\": \"system node\",\n \"routerMode\": \"interior\",\n \"messagingPort\": 5672,\n \"edgeRouterPort\": 56722,\n \"interRouterPort\": 56721,\n \"host\": \"localhost\",\n \"isSystem\": true,\n \"location\": \"string\",\n \"latitude\": 0,\n \"longitude\": 0,\n \"description\": \"string\",\n \"dockerUrl\": \"string\",\n \"diskLimit\": 0,\n \"diskDirectory\": \"string\",\n \"memoryLimit\": 0,\n \"cpuLimit\": 0,\n \"logLimit\": 0,\n \"logDirectory\": \"string\",\n \"logFileCount\": 0,\n \"statusFrequency\": 0,\n \"changeFrequency\": 0,\n \"deviceScanFrequency\": 0,\n \"bluetoothEnabled\": false,\n \"watchdogEnabled\": true,\n \"abstractedHardwareEnabled\": false,\n \"fogType\": 1\n,\n \"host\": \"1.2.3.4\"\n}" }, "url": { - "raw": "{{host}}/api/v3/iofog", + "raw": "{{host}}/api/v1/iofog", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "iofog" ] } @@ -4568,13 +4568,13 @@ "raw": "{\n \"name\": \"node1\",\n \"location\": \"string\",\n \"latitude\": 0,\n \"longitude\": 0,\n \"description\": \"string\",\n \"dockerUrl\": \"string\",\n \"diskLimit\": 0,\n \"diskDirectory\": \"string\",\n \"memoryLimit\": 0,\n \"cpuLimit\": 0,\n \"logLimit\": 0,\n \"logDirectory\": \"string\",\n \"logFileCount\": 0,\n \"statusFrequency\": 0,\n \"changeFrequency\": 0,\n \"deviceScanFrequency\": 0,\n \"bluetoothEnabled\": false,\n \"watchdogEnabled\": true,\n \"abstractedHardwareEnabled\": false,\n \"fogType\": 1,\n \"host\": \"1.2.3.4\"\n}" }, "url": { - "raw": "{{host}}/api/v3/iofog", + "raw": "{{host}}/api/v1/iofog", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "iofog" ] } @@ -4619,13 +4619,13 @@ "raw": "{\n \"name\": \"node2\",\n \"location\": \"string\",\n \"latitude\": 0,\n \"longitude\": 0,\n \"description\": \"string\",\n \"dockerUrl\": \"string\",\n \"diskLimit\": 0,\n \"diskDirectory\": \"string\",\n \"memoryLimit\": 0,\n \"cpuLimit\": 0,\n \"logLimit\": 0,\n \"logDirectory\": \"string\",\n \"logFileCount\": 0,\n \"statusFrequency\": 0,\n \"changeFrequency\": 0,\n \"deviceScanFrequency\": 0,\n \"bluetoothEnabled\": false,\n \"watchdogEnabled\": true,\n \"abstractedHardwareEnabled\": false,\n \"fogType\": 1,\n \"host\": \"1.2.3.5\"\n}" }, "url": { - "raw": "{{host}}/api/v3/iofog", + "raw": "{{host}}/api/v1/iofog", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "iofog" ] } @@ -4673,13 +4673,13 @@ "raw": "{\n \"name\": \"com.orange.smart-door\",\n \"version\": \"0.0.1\",\n \"description\": \"Orange Smart Door\",\n \"display\": {\n \"name\": \"Smart Door\",\n \"icon\": \"help\",\n \"color\": \"#ff0000\"\n },\n \"interfaceProtocol\": \"https\",\n \"interface\": {\n \"endpoints\": [\n {\n \"name\": \"liveness\",\n \"url\": \"https://localhost:91121\",\n \"method\": \"GET\"\n },\n {\n \"name\": \"version\",\n \"url\": \"https://localhost:91121/version\",\n \"method\": \"GET\"\n }\n ]\n },\n \"orchestrationTags\": [\n \"orange\",\n \"smart-door\"\n ]\n}" }, "url": { - "raw": "{{host}}/api/v3/edgeResource", + "raw": "{{host}}/api/v1/edgeResource", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "edgeResource" ] } @@ -4723,13 +4723,13 @@ "raw": "{\n \"name\": \"application-name-1\",\n \"isSystem\": false,\n \"description\": \"Description\",\n \"isActivated\": true,\n \"microservices\": [\n {\n \"name\": \"redistest\",\n \"config\": \"string\",\n \"images\": [\n {\n \"containerImage\": \"redis\",\n \"fogTypeId\": 1\n },\n {\n \"containerImage\": \"redis\",\n \"fogTypeId\": 2\n }\n ],\n \"registryId\": 1,\n \"application\": \"application-name-1\",\n \"iofogUuid\": \"{{node-id-1}}\",\n \"rootHostAccess\": false,\n \"logSize\": 0,\n \"volumeMappings\": [],\n \"ports\": [\n {\n \"internal\": 6379,\n \"external\": 6379,\n \"publicMode\": false\n }\n ]\n }\n ]\n}" }, "url": { - "raw": "{{host}}/api/v3/application", + "raw": "{{host}}/api/v1/application", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "application" ] } @@ -4776,13 +4776,13 @@ "raw": "{\n \"name\": \"application-msvc-name\",\n \"isSystem\": false,\n \"description\": \"Description\",\n \"isActivated\": true,\n \"microservices\": [\n {\n \"name\": \"msvc-1\",\n \"config\": \"string\",\n \"images\": [\n {\n \"containerImage\": \"hello-world\",\n \"fogTypeId\": 1\n },\n {\n \"containerImage\": \"hello-world\",\n \"fogTypeId\": 2\n }\n ],\n \"registryId\": 1,\n \"application\": \"application-msvc-name\",\n \"iofogUuid\": \"{{node-id-2}}\",\n \"rootHostAccess\": true,\n \"logSize\": 0,\n \"volumeMappings\": [\n {\n \"hostDestination\": \"/var/dest\",\n \"containerDestination\": \"/var/dest\",\n \"accessMode\": \"rw\"\n }\n ],\n \"ports\": [\n {\n \"internal\": 1881,\n \"external\": 1882\n }\n ],\n \"routes\": [],\n \"env\": [\n { \n \"key\": \"selfname\",\n \"value\": \"{{ self.name | upcase }}\"\n },\n {\n \"key\": \"sharedToken\",\n \"value\": \"sekrittoken\"\n },\n {\n \"key\": \"http_proxy\",\n \"value\": \"http://myproxy:8080/\"\n },\n {\n \"key\": \"https_proxy\",\n \"value\": \"{{ self.microservices | where: \\\"name\\\", \\\"msvc-1\\\" | first | map: \\\"env\\\" | first | where: \\\"key\\\" , \\\"http_proxy\\\" | first | map: \\\"value\\\" | first }}\"\n }\n ],\n \"cmd\": [\n \"test\",\n \"--arg1\",\n \"--arg2\"\n ]\n },\n {\n \"name\": \"msvc-2\",\n \"config\": \"string\",\n \"images\": [\n {\n \"containerImage\": \"hello-world\",\n \"fogTypeId\": 1\n },\n {\n \"containerImage\": \"hello-world\",\n \"fogTypeId\": 2\n }\n ],\n \"registryId\": 1,\n \"application\": \"application-msvc-name\",\n \"iofogUuid\": \"{{node-id-2}}\",\n \"rootHostAccess\": true,\n \"logSize\": 0,\n \"volumeMappings\": [\n {\n \"hostDestination\": \"/var/dest\",\n \"containerDestination\": \"/var/dest\",\n \"accessMode\": \"rw\"\n }\n ],\n \"ports\": [],\n \"routes\": [],\n \"env\": [\n { \n \"key\": \"selfname\",\n \"value\": \"{{ self.name | upcase }}\"\n },\n {\n \"key\": \"sharedToken\",\n \"value\": \"{{ self.microservices | where: \\\"name\\\", \\\"msvc-1\\\" | first | map: \\\"env\\\" | first | where: \\\"key\\\", \\\"sharedToken\\\" | first | map: \\\"value\\\" | first }}\"\n },\n {\n \"key\": \"http_proxy\",\n \"value\": \"{{ self.microservices | where: \\\"name\\\", \\\"msvc-1\\\" | first | map: \\\"env\\\" | first | where: \\\"key\\\" , \\\"http_proxy\\\" | first | map: \\\"value\\\" | first }}\"\n },\n {\n \"key\": \"https_proxy\",\n \"value\": \"{{ self.microservices | where: \\\"name\\\", \\\"msvc-1\\\" | first | map: \\\"env\\\" | first | where: \\\"key\\\" , \\\"http_proxy\\\" | first | map: \\\"value\\\" | first }}\"\n },\n {\n \"key\": \"rulesengineHOST\",\n \"value\": \"{% assign curmsvc= self.microservices | where: \\\"name\\\", \\\"msvc-1\\\" | first %}{{ curmsvc | findMicroserviceAgent | map: \\\"host\\\" | first }}\"\n },\n {\n \"key\": \"rulesenginePORT\",\n \"value\": \"{{ self.microservices | where: \\\"name\\\", \\\"msvc-1\\\" | first | map: \\\"ports\\\" | first | map: \\\"external\\\" | first | toString }}\"\n },\n {\n \"key\": \"redisHost\",\n \"value\": \"{% assign redisApp = \\\"application-name-1\\\" | findApplication %}{% assign redismsvc = redisApp.microservices | where: \\\"name\\\", \\\"redistest\\\" | first %}{{ redismsvc | findMicroserviceAgent | map: \\\"host\\\"}}:{{ redismsvc | map: \\\"ports\\\" | first | first | map: \\\"external\\\" | first | toString }}\"\n },\n {\n \"key\": \"edgeResLiveness\",\n \"value\": \"{{ \\\"com.orange.smart-door\\\" | findEdgeResource: \\\"0.0.1\\\" | map: \\\"interface\\\" | map: \\\"endpoints\\\" | first | where: \\\"name\\\", \\\"liveness\\\" | first | map: \\\"url\\\" | first }}\"\n },\n {\n \"key\": \"edgeResVersion\",\n \"value\": \"{{ \\\"com.orange.smart-door\\\" | findEdgeResource | map: \\\"interface\\\" | map: \\\"endpoints\\\" | first | where: \\\"name\\\", \\\"version\\\" | first | map: \\\"url\\\" | first }}\"\n }\n ],\n \"cmd\": [\n \"test\",\n \"--arg1\",\n \"--arg2\"\n ]\n },\n {\n \"name\": \"msvc-3\",\n \"config\": \"string\",\n \"images\": [\n {\n \"containerImage\": \"hello-world\",\n \"fogTypeId\": 1\n },\n {\n \"containerImage\": \"hello-world\",\n \"fogTypeId\": 2\n }\n ],\n \"registryId\": 1,\n \"application\": \"application-msvc-name\",\n \"iofogUuid\": \"{{node-id-2}}\",\n \"rootHostAccess\": true,\n \"logSize\": 0,\n \"volumeMappings\": [\n {\n \"hostDestination\": \"/var/dest\",\n \"containerDestination\": \"/var/dest\",\n \"accessMode\": \"rw\"\n }\n ],\n \"ports\": [],\n \"routes\": [],\n \"env\": [\n {\n \"key\": \"KEY1\",\n \"value\": \"value1\"\n },\n {\n \"key\": \"KEY2\",\n \"value\": \"value2\"\n }\n ],\n \"cmd\": [\n \"test\",\n \"--arg1\",\n \"--arg2\"\n ]\n }\n ],\n \"routes\": [\n {\n \"from\": \"msvc-1\",\n \"to\": \"msvc-2\",\n \"name\": \"m1-2\"\n }\n ]\n}" }, "url": { - "raw": "{{host}}/api/v3/application", + "raw": "{{host}}/api/v1/application", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "application" ] } @@ -4844,13 +4844,13 @@ } ], "url": { - "raw": "{{host}}/api/v3/microservices?application={{application-msvc-name}}", + "raw": "{{host}}/api/v1/microservices?application={{application-msvc-name}}", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "microservices" ], "query": [ @@ -4894,13 +4894,13 @@ } ], "url": { - "raw": "{{host}}/api/v3/application", + "raw": "{{host}}/api/v1/application", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "application" ] } @@ -4938,13 +4938,13 @@ } ], "url": { - "raw": "{{host}}/api/v3/application/{{application-name-2}}", + "raw": "{{host}}/api/v1/application/{{application-name-2}}", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "application", "{{application-name-2}}" ] @@ -4984,13 +4984,13 @@ "raw": "{\n \"name\": \"application-name-22\",\n \"isSystem\": true,\n \"description\": \"Description\",\n \"isActivated\": true\n}" }, "url": { - "raw": "{{host}}/api/v3/application/{{application-name-1}}", + "raw": "{{host}}/api/v1/application/{{application-name-1}}", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "application", "{{application-name-1}}" ] @@ -5029,13 +5029,13 @@ } ], "url": { - "raw": "{{host}}/api/v3/application", + "raw": "{{host}}/api/v1/application", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "application" ] } @@ -5073,13 +5073,13 @@ "raw": "" }, "url": { - "raw": "{{host}}/api/v3/application/{{application-name-1}}", + "raw": "{{host}}/api/v1/application/{{application-name-1}}", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "application", "{{application-name-1}}" ] @@ -5118,13 +5118,13 @@ "raw": "" }, "url": { - "raw": "{{host}}/api/v3/application/{{application-msvc-name}}", + "raw": "{{host}}/api/v1/application/{{application-msvc-name}}", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "application", "{{application-msvc-name}}" ] @@ -5163,13 +5163,13 @@ } ], "url": { - "raw": "{{host}}/api/v3/application", + "raw": "{{host}}/api/v1/application", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "application" ] } @@ -5210,13 +5210,13 @@ } ], "url": { - "raw": "{{host}}/api/v3/microservices", + "raw": "{{host}}/api/v1/microservices", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "microservices" ] } @@ -5250,13 +5250,13 @@ } ], "url": { - "raw": "{{host}}/api/v3/route/{{application-route-name}}", + "raw": "{{host}}/api/v1/route/{{application-route-name}}", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "route", "{{application-route-name}}" ] @@ -5296,13 +5296,13 @@ "raw": "" }, "url": { - "raw": "{{host}}/api/v3/edgeResource/{{edge-resource-name}}/{{edge-resource-version}}", + "raw": "{{host}}/api/v1/edgeResource/{{edge-resource-name}}/{{edge-resource-version}}", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "edgeResource", "{{edge-resource-name}}", "{{edge-resource-version}}" @@ -5343,13 +5343,13 @@ "raw": "{\n\t\"type\": 1,\n\t\"key\":\"testtesttest\"\n}" }, "url": { - "raw": "{{host}}/api/v3/iofog/{{system-node-id}}", + "raw": "{{host}}/api/v1/iofog/{{system-node-id}}", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "iofog", "{{system-node-id}}" ] @@ -5389,13 +5389,13 @@ "raw": "" }, "url": { - "raw": "{{host}}/api/v3/iofog/{{node-id-2}}", + "raw": "{{host}}/api/v1/iofog/{{node-id-2}}", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "iofog", "{{node-id-2}}" ] @@ -5435,13 +5435,13 @@ "raw": "" }, "url": { - "raw": "{{host}}/api/v3/iofog/{{node-id-1}}", + "raw": "{{host}}/api/v1/iofog/{{node-id-1}}", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "iofog", "{{node-id-1}}" ] @@ -5479,13 +5479,13 @@ "raw": "" }, "url": { - "raw": "{{host}}/api/v3/user/profile", + "raw": "{{host}}/api/v1/user/profile", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "user", "profile" ] @@ -5549,13 +5549,13 @@ "raw": "{\n \"firstName\": \"John\",\n \"lastName\": \"Doe\",\n \"email\": \"user@domain.com\",\n \"password\": \"#Bugs4Fun\",\n \"subscriptionKey\": \"XXXX-XXXX-XXXX-XXXX\"\n}" }, "url": { - "raw": "{{host}}/api/v3/user/signup", + "raw": "{{host}}/api/v1/user/signup", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "user", "signup" ] @@ -5597,13 +5597,13 @@ "raw": "{\n \"email\": \"user@domain.com\",\n \"password\": \"#Bugs4Fun\"\n}" }, "url": { - "raw": "{{host}}/api/v3/user/login", + "raw": "{{host}}/api/v1/user/login", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "user", "login" ] @@ -5648,13 +5648,13 @@ "raw": "{\n \"name\": \"flow-name\",\n \"isSystem\": false,\n \"description\": \"Description\",\n \"isActivated\": true\n}" }, "url": { - "raw": "{{host}}/api/v3/flow", + "raw": "{{host}}/api/v1/flow", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "flow" ] } @@ -5692,13 +5692,13 @@ } ], "url": { - "raw": "{{host}}/api/v3/flow", + "raw": "{{host}}/api/v1/flow", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "flow" ] } @@ -5736,13 +5736,13 @@ } ], "url": { - "raw": "{{host}}/api/v3/flow/{{flow-id}}", + "raw": "{{host}}/api/v1/flow/{{flow-id}}", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "flow", "{{flow-id}}" ] @@ -5781,13 +5781,13 @@ "raw": "{\n \"name\": \"flow-name-22\",\n \"isSystem\": true,\n \"description\": \"Description\",\n \"isActivated\": true\n}" }, "url": { - "raw": "{{host}}/api/v3/flow/{{flow-id}}", + "raw": "{{host}}/api/v1/flow/{{flow-id}}", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "flow", "{{flow-id}}" ] @@ -5826,13 +5826,13 @@ } ], "url": { - "raw": "{{host}}/api/v3/flow", + "raw": "{{host}}/api/v1/flow", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "flow" ] } @@ -5870,13 +5870,13 @@ "raw": "" }, "url": { - "raw": "{{host}}/api/v3/flow/{{flow-id}}", + "raw": "{{host}}/api/v1/flow/{{flow-id}}", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "flow", "{{flow-id}}" ] @@ -5914,13 +5914,13 @@ "raw": "" }, "url": { - "raw": "{{host}}/api/v3/user/profile", + "raw": "{{host}}/api/v1/user/profile", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "user", "profile" ] @@ -5984,13 +5984,13 @@ "raw": "{\n \"firstName\": \"John\",\n \"lastName\": \"Doe\",\n \"email\": \"user@domain.com\",\n \"password\": \"#Bugs4Fun\",\n \"subscriptionKey\": \"XXXX-XXXX-XXXX-XXXX\"\n}" }, "url": { - "raw": "{{host}}/api/v3/user/signup", + "raw": "{{host}}/api/v1/user/signup", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "user", "signup" ] @@ -6032,13 +6032,13 @@ "raw": "{\n \"email\": \"user@domain.com\",\n \"password\": \"#Bugs4Fun\"\n}" }, "url": { - "raw": "{{host}}/api/v3/user/login", + "raw": "{{host}}/api/v1/user/login", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "user", "login" ] @@ -6084,13 +6084,13 @@ "raw": "{\n \"name\": \"system node\",\n \"routerMode\": \"interior\",\n \"messagingPort\": 5672,\n \"edgeRouterPort\": 56722,\n \"interRouterPort\": 56721,\n \"host\": \"localhost\",\n \"isSystem\": true,\n \"location\": \"string\",\n \"latitude\": 0,\n \"longitude\": 0,\n \"description\": \"string\",\n \"dockerUrl\": \"string\",\n \"diskLimit\": 0,\n \"diskDirectory\": \"string\",\n \"memoryLimit\": 0,\n \"cpuLimit\": 0,\n \"logLimit\": 0,\n \"logDirectory\": \"string\",\n \"logFileCount\": 0,\n \"statusFrequency\": 0,\n \"changeFrequency\": 0,\n \"deviceScanFrequency\": 0,\n \"bluetoothEnabled\": false,\n \"watchdogEnabled\": true,\n \"abstractedHardwareEnabled\": false,\n \"fogType\": 1\n,\n \"host\": \"1.2.3.4\"\n}" }, "url": { - "raw": "{{host}}/api/v3/iofog", + "raw": "{{host}}/api/v1/iofog", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "iofog" ] } @@ -6135,13 +6135,13 @@ "raw": "{\n \"name\": \"string\",\n \"host\": \"1.2.3.4\",\n \"location\": \"string\",\n \"latitude\": 0,\n \"longitude\": 0,\n \"description\": \"string\",\n \"dockerUrl\": \"string\",\n \"diskLimit\": 0,\n \"diskDirectory\": \"string\",\n \"memoryLimit\": 0,\n \"cpuLimit\": 0,\n \"logLimit\": 0,\n \"logDirectory\": \"string\",\n \"logFileCount\": 0,\n \"statusFrequency\": 0,\n \"changeFrequency\": 0,\n \"deviceScanFrequency\": 0,\n \"bluetoothEnabled\": false,\n \"watchdogEnabled\": true,\n \"abstractedHardwareEnabled\": false,\n \"fogType\": 1\n,\n \"host\": \"1.2.3.4\"\n}" }, "url": { - "raw": "{{host}}/api/v3/iofog", + "raw": "{{host}}/api/v1/iofog", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "iofog" ] } @@ -6186,13 +6186,13 @@ "raw": "{\n \"name\": \"flow-name\",\n \"description\": \"Description\",\n \"isActivated\": true\n}" }, "url": { - "raw": "{{host}}/api/v3/flow", + "raw": "{{host}}/api/v1/flow", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "flow" ] } @@ -6236,13 +6236,13 @@ "raw": "{\n \"name\": \"flow-name-second\",\n \"description\": \"Description\",\n \"isActivated\": true\n}" }, "url": { - "raw": "{{host}}/api/v3/flow", + "raw": "{{host}}/api/v1/flow", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "flow" ] } @@ -6286,13 +6286,13 @@ "raw": "{\n \"name\": \"string\",\n \"description\": \"string\",\n \"category\": \"string\",\n \"images\": [\n {\n \"containerImage\": \"x86 docker image name\",\n \"fogTypeId\": 1\n },\n {\n \"containerImage\": \"ARM docker image name\",\n \"fogTypeId\": 2\n }\n ],\n \"publisher\": \"string\",\n \"diskRequired\": 0,\n \"ramRequired\": 0,\n \"picture\": \"string\",\n \"isPublic\": true,\n \"registryId\": 1,\n \"inputType\": {\n \"infoType\": \"string\",\n \"infoFormat\": \"string\"\n },\n \"outputType\": {\n \"infoType\": \"string\",\n \"infoFormat\": \"string\"\n },\n \"configExample\": \"string\"\n}" }, "url": { - "raw": "{{host}}/api/v3/catalog/microservices", + "raw": "{{host}}/api/v1/catalog/microservices", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "catalog", "microservices" ] @@ -6337,13 +6337,13 @@ "raw": "{\n \"name\": \"name2\",\n \"config\": \"string\",\n \"catalogItemId\": {{item-id}},\n \"flowId\": {{flow-id}},\n \"iofogUuid\": \"{{node-id}}\",\n \"rootHostAccess\": true,\n \"logSize\": 0,\n \"volumeMappings\": [\n {\n \"hostDestination\": \"/var/dest\",\n \"containerDestination\": \"/var/dest\",\n \"accessMode\": \"rw\"\n }\n ],\n \"ports\": [\n {\n \"internal\": 1,\n \"external\": 1,\n \"publicMode\": false\n }\n ],\n \"routes\": [\n ],\n \"env\": [\n {\n \"key\": \"KEY1\",\n \"value\": \"value1\"\n },\n {\n \"key\": \"KEY2\",\n \"value\": \"value2\"\n }\n ],\n \"cmd\": [\n \t\"test\",\n \t\"--arg1\",\n \t\"--arg2\"\n ]\n}\n" }, "url": { - "raw": "{{host}}/api/v3/microservices", + "raw": "{{host}}/api/v1/microservices", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "microservices" ] } @@ -6385,13 +6385,13 @@ "raw": "{\n \"name\": \"namesec\",\n \"config\": \"string\",\n \"images\": [{\"containerImage\": \"hello-world\"\n,\"fogTypeId\": 1}, {\"containerImage\": \"hello-world\"\n,\"fogTypeId\": 2}]\n, \"registryId\": 1,\n \"flowId\": {{flow-id-2}},\n \"iofogUuid\": \"{{node-id}}\",\n \"rootHostAccess\": true,\n \"logSize\": 0,\n \"volumeMappings\": [\n {\n \"hostDestination\": \"/var/dest\",\n \"containerDestination\": \"/var/dest\",\n \"accessMode\": \"rw\"\n }\n ],\n \"ports\": [],\n \"routes\": [\n ],\n \"env\": [\n {\n \"key\": \"KEY1\",\n \"value\": \"value1\"\n },\n {\n \"key\": \"KEY2\",\n \"value\": \"value2\"\n }\n ],\n \"cmd\": [\n \t\"test\",\n \t\"--arg1\",\n \t\"--arg2\"\n ]\n}\n" }, "url": { - "raw": "{{host}}/api/v3/microservices", + "raw": "{{host}}/api/v1/microservices", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "microservices" ] } @@ -6435,13 +6435,13 @@ "raw": "{\n \"name\": \"name-without-catalog\",\n \"config\": \"string\",\n \"images\": [{\"containerImage\": \"hello-world\"\n,\"fogTypeId\": 1}, {\"containerImage\": \"hello-world\"\n,\"fogTypeId\": 2}]\n, \"registryId\": 1,\n \"flowId\": {{flow-id}},\n \"iofogUuid\": \"{{node-id}}\",\n \"rootHostAccess\": true,\n \"logSize\": 0,\n \"volumeMappings\": [\n {\n \"hostDestination\": \"/var/dest\",\n \"containerDestination\": \"/var/dest\",\n \"accessMode\": \"rw\"\n }\n ],\n \"ports\": [\n {\n \"internal\": 2,\n \"external\": 2,\n \"publicMode\": false\n }\n ],\n \"routes\": [\n ],\n \"env\": [\n {\n \"key\": \"KEY1\",\n \"value\": \"value1\"\n },\n {\n \"key\": \"KEY2\",\n \"value\": \"value2\"\n }\n ],\n \"cmd\": [\n \t\"test\",\n \t\"--arg1\",\n \t\"--arg2\"\n ]\n}\n" }, "url": { - "raw": "{{host}}/api/v3/microservices", + "raw": "{{host}}/api/v1/microservices", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "microservices" ] } @@ -6485,13 +6485,13 @@ "raw": "{\n \"name\": \"route-name\",\n \"sourceMicroserviceUuid\": \"{{ms-no-catalog-id}}\",\n \"destMicroserviceUuid\": \"{{ms-id}}\"\n}\n" }, "url": { - "raw": "{{host}}/api/v3/routes", + "raw": "{{host}}/api/v1/routes", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "routes" ] } @@ -6531,13 +6531,13 @@ "raw": "{\n \"name\": \"route-name-updated\",\n \"sourceMicroserviceUuid\": \"{{ms-no-catalog-id}}\",\n \"destMicroserviceUuid\": \"{{ms-id}}\"\n}\n" }, "url": { - "raw": "{{host}}/api/v3/routes/{{flow-name}}/{{route-name}}", + "raw": "{{host}}/api/v1/routes/{{flow-name}}/{{route-name}}", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "routes", "{{flow-name}}", "{{route-name}}" @@ -6577,13 +6577,13 @@ "raw": "" }, "url": { - "raw": "{{host}}/api/v3/routes/{{flow-name}}/{{route-name}}", + "raw": "{{host}}/api/v1/routes/{{flow-name}}/{{route-name}}", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "routes", "{{flow-name}}", "{{route-name}}" @@ -6629,13 +6629,13 @@ } ], "url": { - "raw": "{{host}}/api/v3/microservices", + "raw": "{{host}}/api/v1/microservices", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "microservices" ] } @@ -6683,13 +6683,13 @@ } ], "url": { - "raw": "{{host}}/api/v3/microservices?flowId={{flow-id}}", + "raw": "{{host}}/api/v1/microservices?flowId={{flow-id}}", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "microservices" ], "query": [ @@ -6733,13 +6733,13 @@ } ], "url": { - "raw": "{{host}}/api/v3/microservices/{{ms-id}}", + "raw": "{{host}}/api/v1/microservices/{{ms-id}}", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "microservices", "{{ms-id}}" ] @@ -6778,13 +6778,13 @@ } ], "url": { - "raw": "{{host}}/api/v3/microservices/{{ms-no-catalog-id}}", + "raw": "{{host}}/api/v1/microservices/{{ms-no-catalog-id}}", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "microservices", "{{ms-no-catalog-id}}" ] @@ -6823,13 +6823,13 @@ "raw": "{\n \"name\": \"name3\",\n \"config\": \"string\",\n \"rebuild\": true,\n \"iofogUuid\": \"{{node-id}}\",\n \"rootHostAccess\": true,\n \"logSize\": 0,\n \"volumeMappings\": [\n {\n \"hostDestination\": \"/var/dest\",\n \"containerDestination\": \"/var/dest\",\n \"accessMode\": \"rw\"\n }\n ]\n}" }, "url": { - "raw": "{{host}}/api/v3/microservices/{{ms-id}}", + "raw": "{{host}}/api/v1/microservices/{{ms-id}}", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "microservices", "{{ms-id}}" ] @@ -6868,13 +6868,13 @@ "raw": "{\n \"images\": [\n {\n \"containerImage\": \"hello-world-updated\",\n \"fogTypeId\": 1\n },\n {\n \"containerImage\": \"hello-world-updated\",\n \"fogTypeId\": 2\n }\n ],\n \"registryId\": 2,\n \"config\": \"string\",\n \"rebuild\": true,\n \"iofogUuid\": \"{{node-id}}\",\n \"rootHostAccess\": true,\n \"logSize\": 0,\n \"volumeMappings\": [\n {\n \"hostDestination\": \"/var/dest\",\n \"containerDestination\": \"/var/dest\",\n \"accessMode\": \"rw\"\n }\n ]\n}" }, "url": { - "raw": "{{host}}/api/v3/microservices/{{ms-no-catalog-id}}", + "raw": "{{host}}/api/v1/microservices/{{ms-no-catalog-id}}", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "microservices", "{{ms-no-catalog-id}}" ] @@ -6913,13 +6913,13 @@ } ], "url": { - "raw": "{{host}}/api/v3/microservices/{{ms-no-catalog-id}}", + "raw": "{{host}}/api/v1/microservices/{{ms-no-catalog-id}}", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "microservices", "{{ms-no-catalog-id}}" ] @@ -6958,13 +6958,13 @@ "raw": "{\n \"catalogItemId\": 14,\n \"config\": \"string\",\n \"rebuild\": true,\n \"iofogUuid\": \"{{node-id}}\",\n \"rootHostAccess\": true,\n \"logSize\": 0,\n \"volumeMappings\": [\n {\n \"hostDestination\": \"/var/dest\",\n \"containerDestination\": \"/var/dest\",\n \"accessMode\": \"rw\"\n }\n ]\n}" }, "url": { - "raw": "{{host}}/api/v3/microservices/{{ms-no-catalog-id}}", + "raw": "{{host}}/api/v1/microservices/{{ms-no-catalog-id}}", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "microservices", "{{ms-no-catalog-id}}" ] @@ -7003,13 +7003,13 @@ } ], "url": { - "raw": "{{host}}/api/v3/microservices/{{ms-no-catalog-id}}", + "raw": "{{host}}/api/v1/microservices/{{ms-no-catalog-id}}", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "microservices", "{{ms-no-catalog-id}}" ] @@ -7048,13 +7048,13 @@ "raw": "{\n \"images\": [\n {\n \"containerImage\": \"hello-world-updated\",\n \"fogTypeId\": 1\n },\n {\n \"containerImage\": \"hello-world-updated\",\n \"fogTypeId\": 2\n }\n ],\n \"registryId\": 2,\n \"catalogItemId\": null,\n \"config\": \"string\",\n \"rebuild\": true,\n \"iofogUuid\": \"{{node-id}}\",\n \"rootHostAccess\": true,\n \"logSize\": 0,\n \"volumeMappings\": [\n {\n \"hostDestination\": \"/var/dest\",\n \"containerDestination\": \"/var/dest\",\n \"accessMode\": \"rw\"\n }\n ]\n}" }, "url": { - "raw": "{{host}}/api/v3/microservices/{{ms-no-catalog-id}}", + "raw": "{{host}}/api/v1/microservices/{{ms-no-catalog-id}}", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "microservices", "{{ms-no-catalog-id}}" ] @@ -7093,13 +7093,13 @@ } ], "url": { - "raw": "{{host}}/api/v3/microservices/{{ms-no-catalog-id}}", + "raw": "{{host}}/api/v1/microservices/{{ms-no-catalog-id}}", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "microservices", "{{ms-no-catalog-id}}" ] @@ -7144,13 +7144,13 @@ "raw": "\n{\n\"sourceMicroserviceUuid\": \"{{ms-id}}\",\n \"destMicroserviceUuid\": \"{{ms-id}}\",\n \"name\": \"my-route\"\n}" }, "url": { - "raw": "{{host}}/api/v3/routes", + "raw": "{{host}}/api/v1/routes", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "routes" ] } @@ -7188,13 +7188,13 @@ "raw": "" }, "url": { - "raw": "{{host}}/api/v3/routes/{{flow-name}}/{{route-id}}", + "raw": "{{host}}/api/v1/routes/{{flow-name}}/{{route-id}}", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "routes", "{{flow-name}}", "{{route-id}}" @@ -7234,13 +7234,13 @@ "raw": "{\n \"internal\": 15,\n \"external\": 155,\n \"publicMode\": false\n}" }, "url": { - "raw": "{{host}}/api/v3/microservices/{{ms-id}}/port-mapping", + "raw": "{{host}}/api/v1/microservices/{{ms-id}}/port-mapping", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "microservices", "{{ms-id}}", "port-mapping" @@ -7280,13 +7280,13 @@ } ], "url": { - "raw": "{{host}}/api/v3/microservices/{{ms-id}}/port-mapping", + "raw": "{{host}}/api/v1/microservices/{{ms-id}}/port-mapping", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "microservices", "{{ms-id}}", "port-mapping" @@ -7326,13 +7326,13 @@ "raw": "" }, "url": { - "raw": "{{host}}/api/v3/microservices/{{ms-id}}/port-mapping/15", + "raw": "{{host}}/api/v1/microservices/{{ms-id}}/port-mapping/15", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "microservices", "{{ms-id}}", "port-mapping", @@ -7380,13 +7380,13 @@ "raw": " {\n \"hostDestination\": \"/var/dest7\",\n \"containerDestination\": \"/var/dest\",\n \"accessMode\": \"rw\"\n }" }, "url": { - "raw": "{{host}}/api/v3/microservices/{{ms-id}}/volume-mapping", + "raw": "{{host}}/api/v1/microservices/{{ms-id}}/volume-mapping", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "microservices", "{{ms-id}}", "volume-mapping" @@ -7421,13 +7421,13 @@ } ], "url": { - "raw": "{{host}}/api/v3/microservices/{{ms-id}}/volume-mapping", + "raw": "{{host}}/api/v1/microservices/{{ms-id}}/volume-mapping", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "microservices", "{{ms-id}}", "volume-mapping" @@ -7466,13 +7466,13 @@ "raw": "" }, "url": { - "raw": "{{host}}/api/v3/microservices/{{ms-id}}/volume-mapping/{{volume-id}}", + "raw": "{{host}}/api/v1/microservices/{{ms-id}}/volume-mapping/{{volume-id}}", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "microservices", "{{ms-id}}", "volume-mapping", @@ -7513,13 +7513,13 @@ "raw": "{\n\t\"withCleanup\": false\n}" }, "url": { - "raw": "{{host}}/api/v3/microservices/{{ms-id}}", + "raw": "{{host}}/api/v1/microservices/{{ms-id}}", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "microservices", "{{ms-id}}" ] @@ -7558,13 +7558,13 @@ "raw": "" }, "url": { - "raw": "{{host}}/api/v3/flow/{{flow-id}}", + "raw": "{{host}}/api/v1/flow/{{flow-id}}", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "flow", "{{flow-id}}" ] @@ -7604,13 +7604,13 @@ "raw": "" }, "url": { - "raw": "{{host}}/api/v3/catalog/microservices/{{item-id}}", + "raw": "{{host}}/api/v1/catalog/microservices/{{item-id}}", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "catalog", "microservices", "{{item-id}}" @@ -7651,13 +7651,13 @@ "raw": "{\n\t\"type\": 1,\n\t\"key\":\"testtesttest\"\n}" }, "url": { - "raw": "{{host}}/api/v3/iofog/{{system-node-id}}", + "raw": "{{host}}/api/v1/iofog/{{system-node-id}}", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "iofog", "{{system-node-id}}" ] @@ -7697,13 +7697,13 @@ "raw": "" }, "url": { - "raw": "{{host}}/api/v3/iofog/{{node-id}}", + "raw": "{{host}}/api/v1/iofog/{{node-id}}", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "iofog", "{{node-id}}" ] @@ -7741,13 +7741,13 @@ "raw": "" }, "url": { - "raw": "{{host}}/api/v3/user/profile", + "raw": "{{host}}/api/v1/user/profile", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "user", "profile" ] @@ -7811,13 +7811,13 @@ "raw": "{\n \"firstName\": \"John\",\n \"lastName\": \"Doe\",\n \"email\": \"user@domain.com\",\n \"password\": \"#Bugs4Fun\",\n \"subscriptionKey\": \"XXXX-XXXX-XXXX-XXXX\"\n}" }, "url": { - "raw": "{{host}}/api/v3/user/signup", + "raw": "{{host}}/api/v1/user/signup", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "user", "signup" ] @@ -7859,13 +7859,13 @@ "raw": "{\n \"email\": \"user@domain.com\",\n \"password\": \"#Bugs4Fun\"\n}" }, "url": { - "raw": "{{host}}/api/v3/user/login", + "raw": "{{host}}/api/v1/user/login", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "user", "login" ] @@ -7910,13 +7910,13 @@ "raw": "{\n \"name\": \"string\",\n \"description\": \"string\",\n \"category\": \"string\",\n \"images\": [\n {\n \"containerImage\": \"x86 docker image name\",\n \"fogTypeId\": 1\n },\n {\n \"containerImage\": \"ARM docker image name\",\n \"fogTypeId\": 2\n }\n ],\n \"publisher\": \"string\",\n \"diskRequired\": 0,\n \"ramRequired\": 0,\n \"picture\": \"string\",\n \"isPublic\": true,\n \"registryId\": 1,\n \"inputType\": {\n \"infoType\": \"string\",\n \"infoFormat\": \"string\"\n },\n \"outputType\": {\n \"infoType\": \"string\",\n \"infoFormat\": \"string\"\n },\n \"configExample\": \"string\"\n}" }, "url": { - "raw": "{{host}}/api/v3/catalog/microservices", + "raw": "{{host}}/api/v1/catalog/microservices", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "catalog", "microservices" ] @@ -7955,13 +7955,13 @@ } ], "url": { - "raw": "{{host}}/api/v3/catalog/microservices", + "raw": "{{host}}/api/v1/catalog/microservices", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "catalog", "microservices" ] @@ -8002,13 +8002,13 @@ } ], "url": { - "raw": "{{host}}/api/v3/catalog/microservices/{{item-id}}", + "raw": "{{host}}/api/v1/catalog/microservices/{{item-id}}", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "catalog", "microservices", "{{item-id}}" @@ -8049,13 +8049,13 @@ "raw": "{\n \"name\": \"string\",\n \"description\": \"string\",\n \"category\": \"string\",\n \"images\": [\n {\n \"containerImage\": \"x86 docker image name\",\n \"fogTypeId\": 1\n },\n {\n \"containerImage\": \"ARM docker image name\",\n \"fogTypeId\": 2\n }\n ],\n \"publisher\": \"string\",\n \"diskRequired\": 0,\n \"ramRequired\": 0,\n \"picture\": \"string\",\n \"isPublic\": true,\n \"registryId\": 1,\n \"inputType\": {\n \"infoType\": \"string\",\n \"infoFormat\": \"string\"\n },\n \"outputType\": {\n \"infoType\": \"string\",\n \"infoFormat\": \"string\"\n },\n \"configExample\": \"string\"\n}\n" }, "url": { - "raw": "{{host}}/api/v3/catalog/microservices/{{item-id}}", + "raw": "{{host}}/api/v1/catalog/microservices/{{item-id}}", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "catalog", "microservices", "{{item-id}}" @@ -8096,13 +8096,13 @@ "raw": "" }, "url": { - "raw": "{{host}}/api/v3/catalog/microservices/{{item-id}}", + "raw": "{{host}}/api/v1/catalog/microservices/{{item-id}}", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "catalog", "microservices", "{{item-id}}" @@ -8141,13 +8141,13 @@ "raw": "" }, "url": { - "raw": "{{host}}/api/v3/user/profile", + "raw": "{{host}}/api/v1/user/profile", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "user", "profile" ] @@ -8211,13 +8211,13 @@ "raw": "{\n \"firstName\": \"John\",\n \"lastName\": \"Doe\",\n \"email\": \"user@domain.com\",\n \"password\": \"#Bugs4Fun\",\n \"subscriptionKey\": \"XXXX-XXXX-XXXX-XXXX\"\n}" }, "url": { - "raw": "{{host}}/api/v3/user/signup", + "raw": "{{host}}/api/v1/user/signup", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "user", "signup" ] @@ -8259,13 +8259,13 @@ "raw": "{\n \"email\": \"user@domain.com\",\n \"password\": \"#Bugs4Fun\"\n}" }, "url": { - "raw": "{{host}}/api/v3/user/login", + "raw": "{{host}}/api/v1/user/login", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "user", "login" ] @@ -8311,13 +8311,13 @@ "raw": "{\n \"name\": \"system node\",\n \"routerMode\": \"interior\",\n \"messagingPort\": 5672,\n \"edgeRouterPort\": 56722,\n \"interRouterPort\": 56721,\n \"host\": \"localhost\",\n \"isSystem\": true,\n \"location\": \"string\",\n \"latitude\": 0,\n \"longitude\": 0,\n \"description\": \"string\",\n \"dockerUrl\": \"string\",\n \"diskLimit\": 0,\n \"diskDirectory\": \"string\",\n \"memoryLimit\": 0,\n \"cpuLimit\": 0,\n \"logLimit\": 0,\n \"logDirectory\": \"string\",\n \"logFileCount\": 0,\n \"statusFrequency\": 0,\n \"changeFrequency\": 0,\n \"deviceScanFrequency\": 0,\n \"bluetoothEnabled\": false,\n \"watchdogEnabled\": true,\n \"abstractedHardwareEnabled\": false,\n \"fogType\": 1\n,\n \"host\": \"1.2.3.4\"\n}" }, "url": { - "raw": "{{host}}/api/v3/iofog", + "raw": "{{host}}/api/v1/iofog", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "iofog" ] } @@ -8362,13 +8362,13 @@ "raw": "{\n \"name\": \"string\",\n \"host\": \"1.2.3.4\",\n \"location\": \"string\",\n \"latitude\": 0,\n \"longitude\": 0,\n \"description\": \"string\",\n \"dockerUrl\": \"string\",\n \"diskLimit\": 0,\n \"diskDirectory\": \"string\",\n \"memoryLimit\": 0,\n \"cpuLimit\": 0,\n \"logLimit\": 0,\n \"logDirectory\": \"string\",\n \"logFileCount\": 0,\n \"statusFrequency\": 0,\n \"changeFrequency\": 0,\n \"deviceScanFrequency\": 0,\n \"bluetoothEnabled\": false,\n \"watchdogEnabled\": true,\n \"abstractedHardwareEnabled\": false,\n \"fogType\": 1,\n \"dockerPruningFrequency\": 35,\n \"availableDiskThreshold\": 95,\n \"logLevel\": \"INFO\"\n,\n \"host\": \"1.2.3.4\"\n}" }, "url": { - "raw": "{{host}}/api/v3/iofog", + "raw": "{{host}}/api/v1/iofog", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "iofog" ] } @@ -8406,13 +8406,13 @@ "raw": "{\n \"action\": \"open\"\n}" }, "url": { - "raw": "{{host}}/api/v3/iofog/{{node-id}}/tunnel", + "raw": "{{host}}/api/v1/iofog/{{node-id}}/tunnel", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "iofog", "{{node-id}}", "tunnel" @@ -8448,13 +8448,13 @@ } ], "url": { - "raw": "{{host}}/api/v3/iofog/{{node-id}}/tunnel", + "raw": "{{host}}/api/v1/iofog/{{node-id}}/tunnel", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "iofog", "{{node-id}}", "tunnel" @@ -8494,13 +8494,13 @@ "raw": "{\n \"action\": \"close\"\n}" }, "url": { - "raw": "{{host}}/api/v3/iofog/{{node-id}}/tunnel", + "raw": "{{host}}/api/v1/iofog/{{node-id}}/tunnel", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "iofog", "{{node-id}}", "tunnel" @@ -8541,13 +8541,13 @@ "raw": "{\n\t\"type\": 1,\n\t\"key\":\"testtesttest\"\n}" }, "url": { - "raw": "{{host}}/api/v3/iofog/{{system-node-id}}", + "raw": "{{host}}/api/v1/iofog/{{system-node-id}}", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "iofog", "{{system-node-id}}" ] @@ -8587,13 +8587,13 @@ "raw": "" }, "url": { - "raw": "{{host}}/api/v3/iofog/{{node-id}}", + "raw": "{{host}}/api/v1/iofog/{{node-id}}", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "iofog", "{{node-id}}" ] @@ -8631,13 +8631,13 @@ "raw": "" }, "url": { - "raw": "{{host}}/api/v3/user/profile", + "raw": "{{host}}/api/v1/user/profile", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "user", "profile" ] @@ -8701,13 +8701,13 @@ "raw": "{\n \"firstName\": \"John\",\n \"lastName\": \"Doe\",\n \"email\": \"user@domain.com\",\n \"password\": \"#Bugs4Fun\",\n \"subscriptionKey\": \"XXXX-XXXX-XXXX-XXXX\"\n}" }, "url": { - "raw": "{{host}}/api/v3/user/signup", + "raw": "{{host}}/api/v1/user/signup", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "user", "signup" ] @@ -8749,13 +8749,13 @@ "raw": "{\n \"email\": \"user@domain.com\",\n \"password\": \"#Bugs4Fun\"\n}" }, "url": { - "raw": "{{host}}/api/v3/user/login", + "raw": "{{host}}/api/v1/user/login", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "user", "login" ] @@ -8801,13 +8801,13 @@ "raw": "{\n \"name\": \"system node\",\n \"routerMode\": \"interior\",\n \"messagingPort\": 5672,\n \"edgeRouterPort\": 56722,\n \"interRouterPort\": 56721,\n \"host\": \"localhost\",\n \"isSystem\": true,\n \"location\": \"string\",\n \"latitude\": 0,\n \"longitude\": 0,\n \"description\": \"string\",\n \"dockerUrl\": \"string\",\n \"diskLimit\": 0,\n \"diskDirectory\": \"string\",\n \"memoryLimit\": 0,\n \"cpuLimit\": 0,\n \"logLimit\": 0,\n \"logDirectory\": \"string\",\n \"logFileCount\": 0,\n \"statusFrequency\": 0,\n \"changeFrequency\": 0,\n \"deviceScanFrequency\": 0,\n \"bluetoothEnabled\": false,\n \"watchdogEnabled\": true,\n \"abstractedHardwareEnabled\": false,\n \"fogType\": 1\n,\n \"host\": \"1.2.3.4\"\n}" }, "url": { - "raw": "{{host}}/api/v3/iofog", + "raw": "{{host}}/api/v1/iofog", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "iofog" ] } @@ -8852,13 +8852,13 @@ "raw": "{\n \"name\": \"string\",\n \"host\": \"1.2.3.4\",\n \"location\": \"string\",\n \"latitude\": 0,\n \"longitude\": 0,\n \"description\": \"string\",\n \"dockerUrl\": \"string\",\n \"diskLimit\": 0,\n \"diskDirectory\": \"string\",\n \"memoryLimit\": 0,\n \"cpuLimit\": 0,\n \"logLimit\": 0,\n \"logDirectory\": \"string\",\n \"logFileCount\": 0,\n \"statusFrequency\": 0,\n \"changeFrequency\": 0,\n \"deviceScanFrequency\": 0,\n \"bluetoothEnabled\": false,\n \"watchdogEnabled\": true,\n \"abstractedHardwareEnabled\": false,\n \"fogType\": 1\n,\n \"host\": \"1.2.3.4\"\n}" }, "url": { - "raw": "{{host}}/api/v3/iofog", + "raw": "{{host}}/api/v1/iofog", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "iofog" ] } @@ -8902,13 +8902,13 @@ "raw": "{\n \"name\": \"application-name\",\n \"description\": \"Description\",\n \"isActivated\": true\n}" }, "url": { - "raw": "{{host}}/api/v3/application", + "raw": "{{host}}/api/v1/application", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "application" ] } @@ -8952,13 +8952,13 @@ "raw": "{\n \"name\": \"application-name-second\",\n \"description\": \"Description\",\n \"isActivated\": true\n}" }, "url": { - "raw": "{{host}}/api/v3/application", + "raw": "{{host}}/api/v1/application", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "application" ] } @@ -9002,13 +9002,13 @@ "raw": "{\n \"name\": \"string\",\n \"description\": \"string\",\n \"category\": \"string\",\n \"images\": [\n {\n \"containerImage\": \"x86 docker image name\",\n \"fogTypeId\": 1\n },\n {\n \"containerImage\": \"ARM docker image name\",\n \"fogTypeId\": 2\n }\n ],\n \"publisher\": \"string\",\n \"diskRequired\": 0,\n \"ramRequired\": 0,\n \"picture\": \"string\",\n \"isPublic\": true,\n \"registryId\": 1,\n \"inputType\": {\n \"infoType\": \"string\",\n \"infoFormat\": \"string\"\n },\n \"outputType\": {\n \"infoType\": \"string\",\n \"infoFormat\": \"string\"\n },\n \"configExample\": \"string\"\n}" }, "url": { - "raw": "{{host}}/api/v3/catalog/microservices", + "raw": "{{host}}/api/v1/catalog/microservices", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "catalog", "microservices" ] @@ -9054,13 +9054,13 @@ "raw": "{\n \"name\": \"name2\",\n \"config\": \"string\",\n \"catalogItemId\": {{item-id}},\n \"application\": \"{{application-name}}\",\n \"iofogUuid\": \"{{node-id}}\",\n \"rootHostAccess\": true,\n \"logSize\": 0,\n \"volumeMappings\": [\n {\n \"hostDestination\": \"/var/dest\",\n \"containerDestination\": \"/var/dest\",\n \"accessMode\": \"rw\"\n }\n ],\n \"ports\": [\n {\n \"internal\": 1,\n \"external\": 1,\n \"publicMode\": false\n }\n ],\n \"routes\": [\n ],\n \"env\": [\n {\n \"key\": \"KEY1\",\n \"value\": \"value1\"\n },\n {\n \"key\": \"KEY2\",\n \"value\": \"value2\"\n }\n ],\n \"cmd\": [\n \t\"test\",\n \t\"--arg1\",\n \t\"--arg2\"\n ]\n}\n" }, "url": { - "raw": "{{host}}/api/v3/microservices", + "raw": "{{host}}/api/v1/microservices", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "microservices" ] } @@ -9102,13 +9102,13 @@ "raw": "{\n \"name\": \"namesec\",\n \"config\": \"string\",\n \"images\": [{\"containerImage\": \"hello-world\"\n,\"fogTypeId\": 1}, {\"containerImage\": \"hello-world\"\n,\"fogTypeId\": 2}]\n, \"registryId\": 1,\n \"application\": \"{{application-name-2}}\",\n \"iofogUuid\": \"{{node-id}}\",\n \"rootHostAccess\": true,\n \"logSize\": 0,\n \"volumeMappings\": [\n {\n \"hostDestination\": \"/var/dest\",\n \"containerDestination\": \"/var/dest\",\n \"accessMode\": \"rw\"\n }\n ],\n \"ports\": [],\n \"routes\": [\n ],\n \"env\": [\n {\n \"key\": \"KEY1\",\n \"value\": \"value1\"\n },\n {\n \"key\": \"KEY2\",\n \"value\": \"value2\"\n }\n ],\n \"cmd\": [\n \t\"test\",\n \t\"--arg1\",\n \t\"--arg2\"\n ]\n}\n" }, "url": { - "raw": "{{host}}/api/v3/microservices", + "raw": "{{host}}/api/v1/microservices", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "microservices" ] } @@ -9153,13 +9153,13 @@ "raw": "{\n \"name\": \"name-without-catalog\",\n \"config\": \"string\",\n \"images\": [{\"containerImage\": \"hello-world\"\n,\"fogTypeId\": 1}, {\"containerImage\": \"hello-world\"\n,\"fogTypeId\": 2}]\n, \"registryId\": 1,\n \"application\": \"{{application-name}}\",\n \"iofogUuid\": \"{{node-id}}\",\n \"rootHostAccess\": true,\n \"logSize\": 0,\n \"volumeMappings\": [\n {\n \"hostDestination\": \"/var/dest\",\n \"containerDestination\": \"/var/dest\",\n \"accessMode\": \"rw\"\n }\n ],\n \"ports\": [\n {\n \"internal\": 2,\n \"external\": 2,\n \"publicMode\": false\n }\n ],\n \"routes\": [\n ],\n \"env\": [\n {\n \"key\": \"KEY1\",\n \"value\": \"value1\"\n },\n {\n \"key\": \"KEY2\",\n \"value\": \"value2\"\n }\n ],\n \"cmd\": [\n \t\"test\",\n \t\"--arg1\",\n \t\"--arg2\"\n ]\n}\n" }, "url": { - "raw": "{{host}}/api/v3/microservices", + "raw": "{{host}}/api/v1/microservices", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "microservices" ] } @@ -9203,13 +9203,13 @@ "raw": "{\n \"name\": \"route-name\",\n \"from\": \"{{ms-no-catalog-name}}\",\n \"to\": \"{{ms-name}}\",\n \"application\": \"{{application-name}}\"\n}\n" }, "url": { - "raw": "{{host}}/api/v3/routes", + "raw": "{{host}}/api/v1/routes", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "routes" ] } @@ -9249,13 +9249,13 @@ "raw": "{\n \"name\": \"route-name-updated\",\n \"from\": \"{{ms-no-catalog-name}}\",\n \"to\": \"{{ms-name}}\",\n \"application\": \"{{application-name}}\"\n}\n" }, "url": { - "raw": "{{host}}/api/v3/routes/{{application-name}}/{{route-name}}", + "raw": "{{host}}/api/v1/routes/{{application-name}}/{{route-name}}", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "routes", "{{application-name}}", "{{route-name}}" @@ -9295,13 +9295,13 @@ "raw": "" }, "url": { - "raw": "{{host}}/api/v3/routes/{{application-name}}/{{route-name}}", + "raw": "{{host}}/api/v1/routes/{{application-name}}/{{route-name}}", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "routes", "{{application-name}}", "{{route-name}}" @@ -9347,13 +9347,13 @@ } ], "url": { - "raw": "{{host}}/api/v3/microservices", + "raw": "{{host}}/api/v1/microservices", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "microservices" ] } @@ -9401,13 +9401,13 @@ } ], "url": { - "raw": "{{host}}/api/v3/microservices?application={{application-name}}", + "raw": "{{host}}/api/v1/microservices?application={{application-name}}", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "microservices" ], "query": [ @@ -9451,13 +9451,13 @@ } ], "url": { - "raw": "{{host}}/api/v3/microservices/{{ms-id}}", + "raw": "{{host}}/api/v1/microservices/{{ms-id}}", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "microservices", "{{ms-id}}" ] @@ -9496,13 +9496,13 @@ } ], "url": { - "raw": "{{host}}/api/v3/microservices/{{ms-no-catalog-id}}", + "raw": "{{host}}/api/v1/microservices/{{ms-no-catalog-id}}", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "microservices", "{{ms-no-catalog-id}}" ] @@ -9541,13 +9541,13 @@ "raw": "{\n \"images\": [{\"containerImage\": \"hello-world-updated\"\n,\"fogTypeId\": 1}, {\"containerImage\": \"hello-world-updated\"\n,\"fogTypeId\": 2}]\n, \"registryId\": 2,\n \"config\": \"string\",\n \"rebuild\": true,\n \"iofogUuid\": \"{{node-id}}\",\n \"rootHostAccess\": true,\n \"logSize\": 0,\n \"volumeMappings\": [\n {\n \"hostDestination\": \"/var/dest\",\n \"containerDestination\": \"/var/dest\",\n \"accessMode\": \"rw\"\n }\n ]\n}" }, "url": { - "raw": "{{host}}/api/v3/microservices/{{ms-no-catalog-id}}", + "raw": "{{host}}/api/v1/microservices/{{ms-no-catalog-id}}", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "microservices", "{{ms-no-catalog-id}}" ] @@ -9589,13 +9589,13 @@ "raw": "{\n \"name\": \"name3\",\n \"config\": \"string\",\n \"rebuild\": true,\n \"iofogUuid\": \"{{node-id}}\",\n \"rootHostAccess\": true,\n \"logSize\": 0,\n \"volumeMappings\": [\n {\n \"hostDestination\": \"/var/dest\",\n \"containerDestination\": \"/var/dest\",\n \"accessMode\": \"rw\"\n }\n ]\n}" }, "url": { - "raw": "{{host}}/api/v3/microservices/{{ms-no-catalog-id}}", + "raw": "{{host}}/api/v1/microservices/{{ms-no-catalog-id}}", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "microservices", "{{ms-no-catalog-id}}" ] @@ -9634,13 +9634,13 @@ } ], "url": { - "raw": "{{host}}/api/v3/microservices/{{ms-no-catalog-id}}", + "raw": "{{host}}/api/v1/microservices/{{ms-no-catalog-id}}", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "microservices", "{{ms-no-catalog-id}}" ] @@ -9679,13 +9679,13 @@ "raw": "{\n \"catalogItemId\": 14,\n \"config\": \"string\",\n \"rebuild\": true,\n \"iofogUuid\": \"{{node-id}}\",\n \"rootHostAccess\": true,\n \"logSize\": 0,\n \"volumeMappings\": [\n {\n \"hostDestination\": \"/var/dest\",\n \"containerDestination\": \"/var/dest\",\n \"accessMode\": \"rw\"\n }\n ]\n}" }, "url": { - "raw": "{{host}}/api/v3/microservices/{{ms-no-catalog-id}}", + "raw": "{{host}}/api/v1/microservices/{{ms-no-catalog-id}}", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "microservices", "{{ms-no-catalog-id}}" ] @@ -9724,13 +9724,13 @@ } ], "url": { - "raw": "{{host}}/api/v3/microservices/{{ms-no-catalog-id}}", + "raw": "{{host}}/api/v1/microservices/{{ms-no-catalog-id}}", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "microservices", "{{ms-no-catalog-id}}" ] @@ -9769,13 +9769,13 @@ "raw": "{\n \"images\": [{\"containerImage\": \"hello-world-updated\"\n,\"fogTypeId\": 1}, {\"containerImage\": \"hello-world-updated\"\n,\"fogTypeId\": 2}]\n, \"registryId\": 2,\n \"catalogItemId\": null,\n \"config\": \"string\",\n \"rebuild\": true,\n \"iofogUuid\": \"{{node-id}}\",\n \"rootHostAccess\": true,\n \"logSize\": 0,\n \"volumeMappings\": [\n {\n \"hostDestination\": \"/var/dest\",\n \"containerDestination\": \"/var/dest\",\n \"accessMode\": \"rw\"\n }\n ]\n}" }, "url": { - "raw": "{{host}}/api/v3/microservices/{{ms-no-catalog-id}}", + "raw": "{{host}}/api/v1/microservices/{{ms-no-catalog-id}}", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "microservices", "{{ms-no-catalog-id}}" ] @@ -9814,13 +9814,13 @@ } ], "url": { - "raw": "{{host}}/api/v3/microservices/{{ms-no-catalog-id}}", + "raw": "{{host}}/api/v1/microservices/{{ms-no-catalog-id}}", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "microservices", "{{ms-no-catalog-id}}" ] @@ -9865,13 +9865,13 @@ "raw": "{\n\"from\": \"{{ms-name}}\",\n \"to\": \"{{ms-name}}\",\n \"name\": \"my-route\",\n \"application\": \"{{application-name}}\"\n}" }, "url": { - "raw": "{{host}}/api/v3/routes", + "raw": "{{host}}/api/v1/routes", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "routes" ] } @@ -9909,13 +9909,13 @@ "raw": "" }, "url": { - "raw": "{{host}}/api/v3/routes/{{application-name}}/{{route-id}}", + "raw": "{{host}}/api/v1/routes/{{application-name}}/{{route-id}}", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "routes", "{{application-name}}", "{{route-id}}" @@ -9955,13 +9955,13 @@ "raw": "{\n \"internal\": 15,\n \"external\": 155,\n \"publicMode\": false\n}" }, "url": { - "raw": "{{host}}/api/v3/microservices/{{ms-id}}/port-mapping", + "raw": "{{host}}/api/v1/microservices/{{ms-id}}/port-mapping", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "microservices", "{{ms-id}}", "port-mapping" @@ -10001,13 +10001,13 @@ } ], "url": { - "raw": "{{host}}/api/v3/microservices/{{ms-id}}/port-mapping", + "raw": "{{host}}/api/v1/microservices/{{ms-id}}/port-mapping", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "microservices", "{{ms-id}}", "port-mapping" @@ -10047,13 +10047,13 @@ "raw": "" }, "url": { - "raw": "{{host}}/api/v3/microservices/{{ms-id}}/port-mapping/15", + "raw": "{{host}}/api/v1/microservices/{{ms-id}}/port-mapping/15", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "microservices", "{{ms-id}}", "port-mapping", @@ -10101,13 +10101,13 @@ "raw": " {\n \"hostDestination\": \"/var/dest7\",\n \"containerDestination\": \"/var/dest\",\n \"accessMode\": \"rw\"\n }" }, "url": { - "raw": "{{host}}/api/v3/microservices/{{ms-id}}/volume-mapping", + "raw": "{{host}}/api/v1/microservices/{{ms-id}}/volume-mapping", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "microservices", "{{ms-id}}", "volume-mapping" @@ -10142,13 +10142,13 @@ } ], "url": { - "raw": "{{host}}/api/v3/microservices/{{ms-id}}/volume-mapping", + "raw": "{{host}}/api/v1/microservices/{{ms-id}}/volume-mapping", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "microservices", "{{ms-id}}", "volume-mapping" @@ -10187,13 +10187,13 @@ "raw": "" }, "url": { - "raw": "{{host}}/api/v3/microservices/{{ms-id}}/volume-mapping/{{volume-id}}", + "raw": "{{host}}/api/v1/microservices/{{ms-id}}/volume-mapping/{{volume-id}}", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "microservices", "{{ms-id}}", "volume-mapping", @@ -10234,13 +10234,13 @@ "raw": "{\n\t\"withCleanup\": false\n}" }, "url": { - "raw": "{{host}}/api/v3/microservices/{{ms-id}}", + "raw": "{{host}}/api/v1/microservices/{{ms-id}}", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "microservices", "{{ms-id}}" ] @@ -10279,13 +10279,13 @@ "raw": "" }, "url": { - "raw": "{{host}}/api/v3/application/{{application-name}}", + "raw": "{{host}}/api/v1/application/{{application-name}}", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "application", "{{application-name}}" ] @@ -10325,13 +10325,13 @@ "raw": "" }, "url": { - "raw": "{{host}}/api/v3/catalog/microservices/{{item-id}}", + "raw": "{{host}}/api/v1/catalog/microservices/{{item-id}}", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "catalog", "microservices", "{{item-id}}" @@ -10372,13 +10372,13 @@ "raw": "" }, "url": { - "raw": "{{host}}/api/v3/iofog/{{system-node-id}}", + "raw": "{{host}}/api/v1/iofog/{{system-node-id}}", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "iofog", "{{system-node-id}}" ] @@ -10418,13 +10418,13 @@ "raw": "{\n\t\"type\": 1,\n\t\"key\":\"testtesttest\"\n}" }, "url": { - "raw": "{{host}}/api/v3/iofog/{{node-id}}", + "raw": "{{host}}/api/v1/iofog/{{node-id}}", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "iofog", "{{node-id}}" ] @@ -10462,13 +10462,13 @@ "raw": "" }, "url": { - "raw": "{{host}}/api/v3/user/profile", + "raw": "{{host}}/api/v1/user/profile", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "user", "profile" ] @@ -10532,13 +10532,13 @@ "raw": "{\n \"firstName\": \"John\",\n \"lastName\": \"Doe\",\n \"email\": \"user@domain.com\",\n \"password\": \"#Bugs4Fun\",\n \"subscriptionKey\": \"XXXX-XXXX-XXXX-XXXX\"\n}" }, "url": { - "raw": "{{host}}/api/v3/user/signup", + "raw": "{{host}}/api/v1/user/signup", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "user", "signup" ] @@ -10580,13 +10580,13 @@ "raw": "{\n \"email\": \"user@domain.com\",\n \"password\": \"#Bugs4Fun\"\n}" }, "url": { - "raw": "{{host}}/api/v3/user/login", + "raw": "{{host}}/api/v1/user/login", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "user", "login" ] @@ -10632,13 +10632,13 @@ "raw": "{\n \"name\": \"system node\",\n \"routerMode\": \"interior\",\n \"messagingPort\": 5672,\n \"edgeRouterPort\": 56722,\n \"interRouterPort\": 56721,\n \"host\": \"localhost\",\n \"isSystem\": true,\n \"location\": \"string\",\n \"latitude\": 0,\n \"longitude\": 0,\n \"description\": \"string\",\n \"dockerUrl\": \"string\",\n \"diskLimit\": 0,\n \"diskDirectory\": \"string\",\n \"memoryLimit\": 0,\n \"cpuLimit\": 0,\n \"logLimit\": 0,\n \"logDirectory\": \"string\",\n \"logFileCount\": 0,\n \"statusFrequency\": 0,\n \"changeFrequency\": 0,\n \"deviceScanFrequency\": 0,\n \"bluetoothEnabled\": false,\n \"watchdogEnabled\": true,\n \"abstractedHardwareEnabled\": false,\n \"fogType\": 1\n,\n \"host\": \"1.2.3.4\"\n}" }, "url": { - "raw": "{{host}}/api/v3/iofog", + "raw": "{{host}}/api/v1/iofog", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "iofog" ] } @@ -10683,13 +10683,13 @@ "raw": "{\n \"name\": \"string\",\n \"host\": \"1.2.3.4\",\n \"location\": \"string\",\n \"latitude\": 0,\n \"longitude\": 0,\n \"description\": \"string\",\n \"dockerUrl\": \"string\",\n \"diskLimit\": 0,\n \"diskDirectory\": \"string\",\n \"memoryLimit\": 0,\n \"cpuLimit\": 0,\n \"logLimit\": 0,\n \"logDirectory\": \"string\",\n \"logFileCount\": 0,\n \"statusFrequency\": 0,\n \"changeFrequency\": 0,\n \"deviceScanFrequency\": 0,\n \"bluetoothEnabled\": false,\n \"watchdogEnabled\": true,\n \"abstractedHardwareEnabled\": false,\n \"fogType\": 1\n,\n \"host\": \"1.2.3.4\"\n}" }, "url": { - "raw": "{{host}}/api/v3/iofog", + "raw": "{{host}}/api/v1/iofog", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "iofog" ] } @@ -10733,13 +10733,13 @@ "raw": "{\n \"name\": \"application-name\",\n \"description\": \"Description\",\n \"isActivated\": true\n}" }, "url": { - "raw": "{{host}}/api/v3/application", + "raw": "{{host}}/api/v1/application", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "application" ] } @@ -10783,13 +10783,13 @@ "raw": "{\n \"name\": \"string\",\n \"description\": \"string\",\n \"category\": \"string\",\n \"images\": [\n {\n \"containerImage\": \"x86 docker image name\",\n \"fogTypeId\": 1\n },\n {\n \"containerImage\": \"ARM docker image name\",\n \"fogTypeId\": 2\n }\n ],\n \"publisher\": \"string\",\n \"diskRequired\": 0,\n \"ramRequired\": 0,\n \"picture\": \"string\",\n \"isPublic\": true,\n \"registryId\": 1,\n \"inputType\": {\n \"infoType\": \"string\",\n \"infoFormat\": \"string\"\n },\n \"outputType\": {\n \"infoType\": \"string\",\n \"infoFormat\": \"string\"\n },\n \"configExample\": \"string\"\n}" }, "url": { - "raw": "{{host}}/api/v3/catalog/microservices", + "raw": "{{host}}/api/v1/catalog/microservices", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "catalog", "microservices" ] @@ -10834,13 +10834,13 @@ "raw": "{\n \"name\": \"name2\",\n \"config\": \"string\",\n \"catalogItemId\": {{item-id}},\n \"application\": \"{{application-name}}\",\n \"iofogUuid\": \"{{node-id}}\",\n \"rootHostAccess\": true,\n \"logSize\": 0,\n \"volumeMappings\": [\n {\n \"hostDestination\": \"/var/dest\",\n \"containerDestination\": \"/var/dest\",\n \"accessMode\": \"rw\"\n }\n ],\n \"ports\": [\n {\n \"internal\": 1,\n \"external\": 1,\n \"publicMode\": false\n }\n ],\n \"routes\": [\n ]\n}\n" }, "url": { - "raw": "{{host}}/api/v3/microservices", + "raw": "{{host}}/api/v1/microservices", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "microservices" ] } @@ -10878,13 +10878,13 @@ "raw": "" }, "url": { - "raw": "{{host}}/api/v3/microservices/{{ms-id}}/image-snapshot", + "raw": "{{host}}/api/v1/microservices/{{ms-id}}/image-snapshot", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "microservices", "{{ms-id}}", "image-snapshot" @@ -10924,13 +10924,13 @@ } ], "url": { - "raw": "{{host}}/api/v3/microservices/{{ms-id}}/image-snapshot", + "raw": "{{host}}/api/v1/microservices/{{ms-id}}/image-snapshot", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "microservices", "{{ms-id}}", "image-snapshot" @@ -10970,13 +10970,13 @@ "raw": "{\n \"enable\": true\n}" }, "url": { - "raw": "{{host}}/api/v3/microservices/{{ms-id}}/strace", + "raw": "{{host}}/api/v1/microservices/{{ms-id}}/strace", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "microservices", "{{ms-id}}", "strace" @@ -11016,13 +11016,13 @@ "raw": "{\n \"ftpHost\": \"string\",\n \"ftpPort\": 0,\n \"ftpUser\": \"string\",\n \"ftpPass\": \"string\",\n \"ftpDestDir\": \"string\"\n}" }, "url": { - "raw": "{{host}}/api/v3/microservices/{{ms-id}}/strace", + "raw": "{{host}}/api/v1/microservices/{{ms-id}}/strace", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "microservices", "{{ms-id}}", "strace" @@ -11063,13 +11063,13 @@ } ], "url": { - "raw": "{{host}}/api/v3/microservices/{{ms-id}}/strace?format=string", + "raw": "{{host}}/api/v1/microservices/{{ms-id}}/strace?format=string", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "microservices", "{{ms-id}}", "strace" @@ -11116,13 +11116,13 @@ "raw": "" }, "url": { - "raw": "{{host}}/api/v3/microservices/{{ms-id}}?withCleanUp=true", + "raw": "{{host}}/api/v1/microservices/{{ms-id}}?withCleanUp=true", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "microservices", "{{ms-id}}" ], @@ -11167,13 +11167,13 @@ "raw": "" }, "url": { - "raw": "{{host}}/api/v3/application/{{application-name}}", + "raw": "{{host}}/api/v1/application/{{application-name}}", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "application", "{{application-name}}" ] @@ -11213,13 +11213,13 @@ "raw": "" }, "url": { - "raw": "{{host}}/api/v3/catalog/microservices/{{item-id}}", + "raw": "{{host}}/api/v1/catalog/microservices/{{item-id}}", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "catalog", "microservices", "{{item-id}}" @@ -11260,13 +11260,13 @@ "raw": "{\n\t\"type\": 1,\n\t\"key\":\"testtesttest\"\n}" }, "url": { - "raw": "{{host}}/api/v3/iofog/{{node-id}}", + "raw": "{{host}}/api/v1/iofog/{{node-id}}", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "iofog", "{{node-id}}" ] @@ -11306,13 +11306,13 @@ "raw": "" }, "url": { - "raw": "{{host}}/api/v3/iofog/{{system-node-id}}", + "raw": "{{host}}/api/v1/iofog/{{system-node-id}}", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "iofog", "{{system-node-id}}" ] @@ -11350,13 +11350,13 @@ "raw": "" }, "url": { - "raw": "{{host}}/api/v3/user/profile", + "raw": "{{host}}/api/v1/user/profile", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "user", "profile" ] @@ -11420,13 +11420,13 @@ "raw": "{\n \"firstName\": \"John\",\n \"lastName\": \"Doe\",\n \"email\": \"user@domain.com\",\n \"password\": \"#Bugs4Fun\",\n \"subscriptionKey\": \"XXXX-XXXX-XXXX-XXXX\"\n}" }, "url": { - "raw": "{{host}}/api/v3/user/signup", + "raw": "{{host}}/api/v1/user/signup", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "user", "signup" ] @@ -11468,13 +11468,13 @@ "raw": "{\n \"email\": \"user@domain.com\",\n \"password\": \"#Bugs4Fun\"\n}" }, "url": { - "raw": "{{host}}/api/v3/user/login", + "raw": "{{host}}/api/v1/user/login", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "user", "login" ] @@ -11520,13 +11520,13 @@ "raw": "{\n \"name\": \"system node\",\n \"routerMode\": \"interior\",\n \"messagingPort\": 5672,\n \"edgeRouterPort\": 56722,\n \"interRouterPort\": 56721,\n \"host\": \"localhost\",\n \"isSystem\": true,\n \"location\": \"string\",\n \"latitude\": 0,\n \"longitude\": 0,\n \"description\": \"string\",\n \"dockerUrl\": \"string\",\n \"diskLimit\": 0,\n \"diskDirectory\": \"string\",\n \"memoryLimit\": 0,\n \"cpuLimit\": 0,\n \"logLimit\": 0,\n \"logDirectory\": \"string\",\n \"logFileCount\": 0,\n \"statusFrequency\": 0,\n \"changeFrequency\": 0,\n \"deviceScanFrequency\": 0,\n \"bluetoothEnabled\": false,\n \"watchdogEnabled\": true,\n \"abstractedHardwareEnabled\": false,\n \"fogType\": 1\n,\n \"host\": \"1.2.3.4\"\n}" }, "url": { - "raw": "{{host}}/api/v3/iofog", + "raw": "{{host}}/api/v1/iofog", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "iofog" ] } @@ -11571,13 +11571,13 @@ "raw": "{\n \"name\": \"string\",\n \"host\": \"1.2.3.4\",\n \"location\": \"string\",\n \"latitude\": 0,\n \"longitude\": 0,\n \"description\": \"string\",\n \"dockerUrl\": \"string\",\n \"diskLimit\": 0,\n \"diskDirectory\": \"string\",\n \"memoryLimit\": 0,\n \"cpuLimit\": 0,\n \"logLimit\": 0,\n \"logDirectory\": \"string\",\n \"logFileCount\": 0,\n \"statusFrequency\": 0,\n \"changeFrequency\": 0,\n \"deviceScanFrequency\": 0,\n \"bluetoothEnabled\": false,\n \"watchdogEnabled\": true,\n \"abstractedHardwareEnabled\": false,\n \"fogType\": 1\n,\n \"host\": \"1.2.3.4\"\n}" }, "url": { - "raw": "{{host}}/api/v3/iofog", + "raw": "{{host}}/api/v1/iofog", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "iofog" ] } @@ -11618,13 +11618,13 @@ } ], "url": { - "raw": "{{host}}/api/v3/iofog/{{node-id}}/provisioning-key", + "raw": "{{host}}/api/v1/iofog/{{node-id}}/provisioning-key", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "iofog", "{{node-id}}", "provisioning-key" @@ -11663,13 +11663,13 @@ } ], "url": { - "raw": "{{host}}/api/v3/iofog-list?filters[0][key]=uuid&filters[0][value]={{node-id}}&filters[0][condition]=equals", + "raw": "{{host}}/api/v1/iofog-list?filters[0][key]=uuid&filters[0][value]={{node-id}}&filters[0][condition]=equals", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "iofog-list" ], "query": [ @@ -11721,13 +11721,13 @@ "raw": "{\n \"name\": \"string\",\n \"isSystem\": false,\n \"location\": \"string\",\n \"latitude\": 0,\n \"longitude\": 0,\n \"description\": \"string\",\n \"dockerUrl\": \"string\",\n \"diskLimit\": 0,\n \"diskDirectory\": \"string\",\n \"memoryLimit\": 0,\n \"cpuLimit\": 0,\n \"logLimit\": 0,\n \"logDirectory\": \"string\",\n \"logFileCount\": 0,\n \"statusFrequency\": 0,\n \"changeFrequency\": 0,\n \"deviceScanFrequency\": 0,\n \"bluetoothEnabled\": false,\n \"watchdogEnabled\": true,\n \"abstractedHardwareEnabled\": false,\n \"fogType\": 1\n}" }, "url": { - "raw": "{{host}}/api/v3/iofog/{{node-id}}", + "raw": "{{host}}/api/v1/iofog/{{node-id}}", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "iofog", "{{node-id}}" ] @@ -11765,13 +11765,13 @@ } ], "url": { - "raw": "{{host}}/api/v3/iofog-list?system=true", + "raw": "{{host}}/api/v1/iofog-list?system=true", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "iofog-list" ], "query": [ @@ -11830,13 +11830,13 @@ } ], "url": { - "raw": "{{host}}/api/v3/iofog/{{node-id}}", + "raw": "{{host}}/api/v1/iofog/{{node-id}}", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "iofog", "{{node-id}}" ] @@ -11879,13 +11879,13 @@ "raw": "" }, "url": { - "raw": "{{host}}/api/v3/iofog/{{node-id}}/version/rollback", + "raw": "{{host}}/api/v1/iofog/{{node-id}}/version/rollback", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "iofog", "{{node-id}}", "version", @@ -11927,13 +11927,13 @@ "raw": "" }, "url": { - "raw": "{{host}}/api/v3/iofog/{{node-id}}/version/upgrade", + "raw": "{{host}}/api/v1/iofog/{{node-id}}/version/upgrade", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "iofog", "{{node-id}}", "version", @@ -11975,13 +11975,13 @@ "raw": "" }, "url": { - "raw": "{{host}}/api/v3/iofog/{{node-id}}/reboot", + "raw": "{{host}}/api/v1/iofog/{{node-id}}/reboot", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "iofog", "{{node-id}}", "reboot" @@ -12021,13 +12021,13 @@ "raw": "" }, "url": { - "raw": "{{host}}/api/v3/iofog/{{node-id}}/prune", + "raw": "{{host}}/api/v1/iofog/{{node-id}}/prune", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "iofog", "{{node-id}}", "prune" @@ -12063,13 +12063,13 @@ } ], "url": { - "raw": "{{host}}/api/v3/iofog/{{node-id}}/hal/hw", + "raw": "{{host}}/api/v1/iofog/{{node-id}}/hal/hw", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "iofog", "{{node-id}}", "hal", @@ -12106,13 +12106,13 @@ } ], "url": { - "raw": "{{host}}/api/v3/iofog/{{node-id}}/hal/usb", + "raw": "{{host}}/api/v1/iofog/{{node-id}}/hal/usb", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "iofog", "{{node-id}}", "hal", @@ -12154,13 +12154,13 @@ "raw": "{\n\t\"type\": 1,\n\t\"key\":\"testtesttest\"\n}" }, "url": { - "raw": "{{host}}/api/v3/iofog/{{system-node-id}}", + "raw": "{{host}}/api/v1/iofog/{{system-node-id}}", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "iofog", "{{system-node-id}}" ] @@ -12199,13 +12199,13 @@ "raw": "" }, "url": { - "raw": "{{host}}/api/v3/iofog/{{node-id}}", + "raw": "{{host}}/api/v1/iofog/{{node-id}}", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "iofog", "{{node-id}}" ] @@ -12243,13 +12243,13 @@ } ], "url": { - "raw": "{{host}}/api/v3/iofog-list?filters[0][key]=uuid&filters[0][value]={{node-id}}&filters[0][condition]=equals", + "raw": "{{host}}/api/v1/iofog-list?filters[0][key]=uuid&filters[0][value]={{node-id}}&filters[0][condition]=equals", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "iofog-list" ], "query": [ @@ -12300,13 +12300,13 @@ "raw": "" }, "url": { - "raw": "{{host}}/api/v3/user/profile", + "raw": "{{host}}/api/v1/user/profile", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "user", "profile" ] @@ -12370,13 +12370,13 @@ "raw": "{\n \"firstName\": \"John\",\n \"lastName\": \"Doe\",\n \"email\": \"user@domain.com\",\n \"password\": \"#Bugs4Fun\",\n \"subscriptionKey\": \"XXXX-XXXX-XXXX-XXXX\"\n}" }, "url": { - "raw": "{{host}}/api/v3/user/signup", + "raw": "{{host}}/api/v1/user/signup", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "user", "signup" ] @@ -12418,13 +12418,13 @@ "raw": "{\n \"email\": \"user@domain.com\",\n \"password\": \"#Bugs4Fun\"\n}" }, "url": { - "raw": "{{host}}/api/v3/user/login", + "raw": "{{host}}/api/v1/user/login", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "user", "login" ] @@ -12470,13 +12470,13 @@ "raw": "{\n \"url\": \"string\",\n \"isPublic\": true,\n \"username\": \"string\",\n \"password\": \"string\",\n \"email\": \"test@gmail.com\",\n \"requiresCert\": false,\n \"certificate\": \"string\"\n}" }, "url": { - "raw": "{{host}}/api/v3/registries", + "raw": "{{host}}/api/v1/registries", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "registries" ] } @@ -12514,13 +12514,13 @@ "raw": "{\n \"url\": \"string2\",\n \"isPublic\": true,\n \"username\": \"string3\",\n \"password\": \"string4\",\n \"email\": \"test2@gmail.com\",\n \"requiresCert\": true,\n \"certificate\": \"string6\"\n}" }, "url": { - "raw": "{{host}}/api/v3/registries/{{reg-id}}", + "raw": "{{host}}/api/v1/registries/{{reg-id}}", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "registries", "{{reg-id}}" ] @@ -12559,13 +12559,13 @@ } ], "url": { - "raw": "{{host}}/api/v3/registries", + "raw": "{{host}}/api/v1/registries", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "registries" ] } @@ -12603,13 +12603,13 @@ "raw": "" }, "url": { - "raw": "{{host}}/api/v3/registries/{{reg-id}}", + "raw": "{{host}}/api/v1/registries/{{reg-id}}", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "registries", "{{reg-id}}" ] @@ -12647,13 +12647,13 @@ "raw": "" }, "url": { - "raw": "{{host}}/api/v3/user/profile", + "raw": "{{host}}/api/v1/user/profile", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "user", "profile" ] @@ -12717,13 +12717,13 @@ "raw": "{\n \"firstName\": \"John\",\n \"lastName\": \"Doe\",\n \"email\": \"user@domain.com\",\n \"password\": \"#Bugs4Fun\",\n \"subscriptionKey\": \"XXXX-XXXX-XXXX-XXXX\"\n}" }, "url": { - "raw": "{{host}}/api/v3/user/signup", + "raw": "{{host}}/api/v1/user/signup", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "user", "signup" ] @@ -12765,13 +12765,13 @@ "raw": "{\n \"email\": \"user@domain.com\",\n \"password\": \"#Bugs4Fun\"\n}" }, "url": { - "raw": "{{host}}/api/v3/user/login", + "raw": "{{host}}/api/v1/user/login", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "user", "login" ] @@ -12817,13 +12817,13 @@ "raw": "{\n \"name\": \"system node\",\n \"routerMode\": \"interior\",\n \"messagingPort\": 5672,\n \"edgeRouterPort\": 56722,\n \"interRouterPort\": 56721,\n \"host\": \"localhost\",\n \"isSystem\": true,\n \"location\": \"string\",\n \"latitude\": 0,\n \"longitude\": 0,\n \"description\": \"string\",\n \"dockerUrl\": \"string\",\n \"diskLimit\": 0,\n \"diskDirectory\": \"string\",\n \"memoryLimit\": 0,\n \"cpuLimit\": 0,\n \"logLimit\": 0,\n \"logDirectory\": \"string\",\n \"logFileCount\": 0,\n \"statusFrequency\": 0,\n \"changeFrequency\": 0,\n \"deviceScanFrequency\": 0,\n \"bluetoothEnabled\": false,\n \"watchdogEnabled\": true,\n \"abstractedHardwareEnabled\": false,\n \"fogType\": 1\n,\n \"host\": \"1.2.3.4\"\n}" }, "url": { - "raw": "{{host}}/api/v3/iofog", + "raw": "{{host}}/api/v1/iofog", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "iofog" ] } @@ -12869,13 +12869,13 @@ "raw": "{\n \"name\": \"string\",\n \"host\": \"1.2.3.4\",\n \"location\": \"string\",\n \"latitude\": 0,\n \"longitude\": 0,\n \"description\": \"string\",\n \"dockerUrl\": \"string\",\n \"diskLimit\": 0,\n \"diskDirectory\": \"string\",\n \"memoryLimit\": 0,\n \"cpuLimit\": 0,\n \"logLimit\": 0,\n \"logDirectory\": \"string\",\n \"logFileCount\": 0,\n \"statusFrequency\": 0,\n \"changeFrequency\": 0,\n \"deviceScanFrequency\": 0,\n \"bluetoothEnabled\": false,\n \"watchdogEnabled\": true,\n \"abstractedHardwareEnabled\": false,\n \"fogType\": 1\n,\n \"host\": \"1.2.3.4\"\n}" }, "url": { - "raw": "{{host}}/api/v3/iofog", + "raw": "{{host}}/api/v1/iofog", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "iofog" ] } @@ -12916,13 +12916,13 @@ } ], "url": { - "raw": "{{host}}/api/v3/iofog/{{node-id}}/provisioning-key", + "raw": "{{host}}/api/v1/iofog/{{node-id}}/provisioning-key", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "iofog", "{{node-id}}", "provisioning-key" @@ -12963,13 +12963,13 @@ "raw": "{\n\t\"type\": 1,\n\t\"key\":\"{{provisioning-key}}\"\n}" }, "url": { - "raw": "{{host}}/api/v3/agent/provision", + "raw": "{{host}}/api/v1/agent/provision", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "agent", "provision" ] @@ -13018,13 +13018,13 @@ "raw": "{\n \"name\": \"com.orange.smart-door\",\n \"version\": \"0.0.1\",\n \"description\": \"Orange Smart Door\",\n \"display\": {\n \"name\": \"Smart Door\",\n \"icon\": \"help\",\n \"color\": \"#ff0000\"\n },\n \"interfaceProtocol\": \"https\",\n \"interface\": {\n \"endpoints\": [\n {\n \"name\": \"liveness\",\n \"url\": \"https://localhost:91121\",\n \"method\": \"GET\"\n }\n ]\n },\n \"orchestrationTags\": [\n \"orange\",\n \"smart-door\"\n ]\n}" }, "url": { - "raw": "{{host}}/api/v3/edgeResource", + "raw": "{{host}}/api/v1/edgeResource", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "edgeResource" ] } @@ -13063,13 +13063,13 @@ "raw": "{\n \"name\": \"com.orange.smart-door\",\n \"version\": \"0.0.2\",\n \"description\": \"Orange Smart Door\",\n \"display\": {\n \"name\": \"Smart Door\",\n \"icon\": \"help\",\n \"color\": \"#ff0000\"\n },\n \"interfaceProtocol\": \"https\",\n \"interface\": {\n \"endpoints\": [\n {\n \"name\": \"liveness\",\n \"url\": \"https://localhost:91121\",\n \"method\": \"GET\"\n }\n ]\n }\n}" }, "url": { - "raw": "{{host}}/api/v3/edgeResource/{{edge-resource-name}}/{{edge-resource-version}}", + "raw": "{{host}}/api/v1/edgeResource/{{edge-resource-name}}/{{edge-resource-version}}", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "edgeResource", "{{edge-resource-name}}", "{{edge-resource-version}}" @@ -13113,13 +13113,13 @@ "raw": "{\n \"name\": \"com.orange.smart-door2\",\n \"version\": \"0.0.1\",\n \"description\": \"Orange Smart Door\",\n \"display\": {\n \"name\": \"Smart Door\",\n \"icon\": \"help\",\n \"color\": \"#ff0000\"\n },\n \"interfaceProtocol\": \"https\",\n \"interface\": {\n \"endpoints\": [\n {\n \"name\": \"liveness\",\n \"url\": \"https://localhost:91121\",\n \"method\": \"GET\"\n },\n {\n \"name\": \"version\",\n \"url\": \"https://localhost:91121/version\",\n \"method\": \"GET\"\n }\n ]\n },\n \"orchestrationTags\": [\n \"orange\",\n \"smart-door\",\n \"smart-door-v0.0.1\"\n ]\n}" }, "url": { - "raw": "{{host}}/api/v3/edgeResource/{{edge-resource-name}}/{{edge-resource-version}}", + "raw": "{{host}}/api/v1/edgeResource/{{edge-resource-name}}/{{edge-resource-version}}", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "edgeResource", "{{edge-resource-name}}", "{{edge-resource-version}}" @@ -13164,13 +13164,13 @@ "raw": "{\n \"name\": \"com.orange.smart-door\"\n}" }, "url": { - "raw": "{{host}}/api/v3/edgeResource/{{edge-resource-name}}/{{edge-resource-version}}", + "raw": "{{host}}/api/v1/edgeResource/{{edge-resource-name}}/{{edge-resource-version}}", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "edgeResource", "{{edge-resource-name}}", "{{edge-resource-version}}" @@ -13209,13 +13209,13 @@ } ], "url": { - "raw": "{{host}}/api/v3/edgeResource/{{edge-resource-name}}/{{edge-resource-version}}", + "raw": "{{host}}/api/v1/edgeResource/{{edge-resource-name}}/{{edge-resource-version}}", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "edgeResource", "{{edge-resource-name}}", "{{edge-resource-version}}" @@ -13256,13 +13256,13 @@ "raw": "{\n \"uuid\": \"{{node-id}}\"\n}" }, "url": { - "raw": "{{host}}/api/v3/edgeResource/{{edge-resource-name}}/{{edge-resource-version}}/link", + "raw": "{{host}}/api/v1/edgeResource/{{edge-resource-name}}/{{edge-resource-version}}/link", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "edgeResource", "{{edge-resource-name}}", "{{edge-resource-version}}", @@ -13303,13 +13303,13 @@ } ], "url": { - "raw": "{{host}}/api/v3/agent/config/changes", + "raw": "{{host}}/api/v1/agent/config/changes", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "agent", "config", "changes" @@ -13356,13 +13356,13 @@ } ], "url": { - "raw": "{{host}}/api/v3/agent/edgeResources", + "raw": "{{host}}/api/v1/agent/edgeResources", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "agent", "edgeResources" ] @@ -13405,13 +13405,13 @@ } ], "url": { - "raw": "{{host}}/api/v3/iofog/{{node-id}}", + "raw": "{{host}}/api/v1/iofog/{{node-id}}", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "iofog", "{{node-id}}" ] @@ -13451,13 +13451,13 @@ "raw": "{\n \"uuid\": \"{{node-id}}\"\n}" }, "url": { - "raw": "{{host}}/api/v3/edgeResource/{{edge-resource-name}}/{{edge-resource-version}}/link", + "raw": "{{host}}/api/v1/edgeResource/{{edge-resource-name}}/{{edge-resource-version}}/link", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "edgeResource", "{{edge-resource-name}}", "{{edge-resource-version}}", @@ -13496,13 +13496,13 @@ } ], "url": { - "raw": "{{host}}/api/v3/iofog/{{node-id}}", + "raw": "{{host}}/api/v1/iofog/{{node-id}}", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "iofog", "{{node-id}}" ] @@ -13551,13 +13551,13 @@ "raw": "{\n \"name\": \"com.orange.smart-door\",\n \"version\": \"0.0.2\",\n \"description\": \"Orange Smart Door\",\n \"display\": {\n \"name\": \"Smart Door\",\n \"icon\": \"help\",\n \"color\": \"#ff0000\"\n },\n \"interfaceProtocol\": \"https\",\n \"interface\": {\n \"endpoints\": [\n {\n \"name\": \"liveness\",\n \"url\": \"https://localhost:91121\",\n \"method\": \"GET\"\n }\n ]\n }\n}" }, "url": { - "raw": "{{host}}/api/v3/edgeResource", + "raw": "{{host}}/api/v1/edgeResource", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "edgeResource" ] } @@ -13591,13 +13591,13 @@ } ], "url": { - "raw": "{{host}}/api/v3/edgeResources", + "raw": "{{host}}/api/v1/edgeResources", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "edgeResources" ] } @@ -13638,13 +13638,13 @@ } ], "url": { - "raw": "{{host}}/api/v3/edgeResource/{{edge-resource-name}}?=", + "raw": "{{host}}/api/v1/edgeResource/{{edge-resource-name}}?=", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "edgeResource", "{{edge-resource-name}}" ], @@ -13690,13 +13690,13 @@ "raw": "" }, "url": { - "raw": "{{host}}/api/v3/edgeResource/{{edge-resource-name}}/{{edge-resource-version-2}}", + "raw": "{{host}}/api/v1/edgeResource/{{edge-resource-name}}/{{edge-resource-version-2}}", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "edgeResource", "{{edge-resource-name}}", "{{edge-resource-version-2}}" @@ -13737,13 +13737,13 @@ "raw": "" }, "url": { - "raw": "{{host}}/api/v3/edgeResource/{{edge-resource-name}}/{{edge-resource-version}}", + "raw": "{{host}}/api/v1/edgeResource/{{edge-resource-name}}/{{edge-resource-version}}", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "edgeResource", "{{edge-resource-name}}", "{{edge-resource-version}}" @@ -13784,13 +13784,13 @@ "raw": "{\n\t\"type\": 1,\n\t\"key\":\"testtesttest\"\n}" }, "url": { - "raw": "{{host}}/api/v3/iofog/{{system-node-id}}", + "raw": "{{host}}/api/v1/iofog/{{system-node-id}}", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "iofog", "{{system-node-id}}" ] @@ -13829,13 +13829,13 @@ "raw": "" }, "url": { - "raw": "{{host}}/api/v3/iofog/{{node-id}}", + "raw": "{{host}}/api/v1/iofog/{{node-id}}", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "iofog", "{{node-id}}" ] @@ -13873,13 +13873,13 @@ "raw": "" }, "url": { - "raw": "{{host}}/api/v3/user/profile", + "raw": "{{host}}/api/v1/user/profile", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "user", "profile" ] @@ -13909,13 +13909,13 @@ "method": "HEAD", "header": [], "url": { - "raw": "{{host}}/api/v3/capabilities/edgeResources", + "raw": "{{host}}/api/v1/capabilities/edgeResources", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "capabilities", "edgeResources" ] @@ -13940,13 +13940,13 @@ "method": "HEAD", "header": [], "url": { - "raw": "{{host}}/api/v3/capabilities/applicationTemplates", + "raw": "{{host}}/api/v1/capabilities/applicationTemplates", "host": [ "{{host}}" ], "path": [ "api", - "v3", + "v1", "capabilities", "applicationTemplates" ] diff --git a/test/src/template/app.yml b/test/src/template/app.yml index 778dd9699..14d3fd98f 100755 --- a/test/src/template/app.yml +++ b/test/src/template/app.yml @@ -1,6 +1,6 @@ --- -apiVersion: iofog.org/v2 +apiVersion: datasance.com/v1 kind: Application metadata: name: edai-smartbuilding-rules-engine diff --git a/test/src/template/simple.yml b/test/src/template/simple.yml index 8b5dbe9d5..c009aab6f 100755 --- a/test/src/template/simple.yml +++ b/test/src/template/simple.yml @@ -1,6 +1,6 @@ --- -apiVersion: iofog.org/v2 +apiVersion: datasance.com/v1 kind: Application metadata: name: edai-smartbuilding-rules-engine From efd917a9b6e7871e170ec02a9bf579a83ab0f449 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emirhan=20Durmu=C5=9F?= Date: Sat, 3 Feb 2024 23:17:15 +0300 Subject: [PATCH 032/178] .nsprc execption edited --- .nsprc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.nsprc b/.nsprc index cf290f643..f49a2ac69 100644 --- a/.nsprc +++ b/.nsprc @@ -23,5 +23,14 @@ }, "1095024": { "notes": "" + }, + "1096366": { + "notes": "" + }, + "1095365": { + "notes": "" + }, + "1095367": { + "notes": "" } } \ No newline at end of file From 9efd708ef5b72bfa616329290e6af35279b98db9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emirhan=20Durmu=C5=9F?= Date: Sat, 3 Feb 2024 23:27:22 +0300 Subject: [PATCH 033/178] workflow tests removed --- .github/workflows/ci.yaml | 53 +-------------------------------------- 1 file changed, 1 insertion(+), 52 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index a5da53947..9a67cae34 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -58,59 +58,8 @@ jobs: npm i -g better-npm-audit npx better-npm-audit audit -p - Tests: - needs: Build - runs-on: ubuntu-20.04 - permissions: - actions: write - checks: write - contents: write - deployments: write - id-token: write - issues: write - discussions: write - packages: write - pages: write - pull-requests: write - repository-projects: write - security-events: write - statuses: write - strategy: - matrix: - platform: - - linux/amd64 - - linux/386 - - linux/arm/v6 - - linux/arm/v7 - - linux/arm64 - node: [ 16, 17, 16, 19,20, 21 ] - name: Node ${{ matrix.node }} Test - steps: - - uses: actions/checkout@v3 - - name: Setup Node ${{ matrix.node }} Test - uses: actions/setup-node@v3 - with: - node-version: ${{ matrix.node }} - - name: Cache Node Modules - uses: actions/cache@v3 - with: - path: | - node_modules - key: ${{ runner.os }}-controller-node_modules-${{ hashFiles('package-lock.json') }} - restore-keys: | - ${{ runner.os }}-controller-node_modules- - - run: npm install - - run: npm run test -- junit - - run: npm run postman_test - - name: Publish Test Results - uses: EnricoMi/publish-unit-test-result-action@v2 - if: always() - with: - files: | - *-results.xml - Publish: - needs: [Build, Tests] + needs: [Build] runs-on: ubuntu-20.04 permissions: actions: write From 06501825ac502556a63011839a7b24a47b5e59be Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emirhan=20Durmu=C5=9F?= Date: Sat, 3 Feb 2024 23:34:07 +0300 Subject: [PATCH 034/178] release version edited --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 0def6cf1d..fe9085f56 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@datasance/iofogcontroller", - "version": "3.0.4", + "version": "3.0.5", "description": "ioFog Controller project for Eclipse IoFog @ iofog.org \\nCopyright (c) 2023 Datasance Teknoloji A.S.", "main": "./src/main.js", "author": "Emirhan Durmus", From 8936b27fd23dd40a329b27b14ac04e03a7f4b897 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emirhan=20Durmu=C5=9F?= Date: Fri, 16 Feb 2024 17:25:50 +0300 Subject: [PATCH 035/178] ecn viewer package update test --- Dockerfile.dev | 12 ++++++++++++ package.json | 4 ++-- src/server.js | 4 ++-- src/services/controller-service.js | 2 +- 4 files changed, 17 insertions(+), 5 deletions(-) diff --git a/Dockerfile.dev b/Dockerfile.dev index 460e6c51f..74fd13f1e 100644 --- a/Dockerfile.dev +++ b/Dockerfile.dev @@ -1,6 +1,7 @@ FROM node:hydrogen-bookworm AS builder ARG PKG_VERSION +ARG GITHUB_TOKEN WORKDIR /tmp @@ -10,6 +11,11 @@ COPY package.json . COPY . . +# Set GitHub npm registry with authentication token +RUN echo "//npm.pkg.github.com/:_authToken=${GITHUB_TOKEN}" > ~/.npmrc + +RUN npm config set @datasance:registry https://npm.pkg.github.com/ + RUN npm i --build-from-source RUN npm version $PKG_VERSION --allow-same-version --no-git-tag-version @@ -31,6 +37,12 @@ RUN python3 -m ensurepip RUN pip3 install --no-cache --upgrade pip setuptools COPY --from=builder /tmp/datasance-iofogcontroller-*.tgz /tmp/iofog-controller.tgz +ARG GITHUB_TOKEN + +# Set GitHub npm registry with authentication token +RUN echo "//npm.pkg.github.com/:_authToken=${GITHUB_TOKEN}" > ~/.npmrc + +RUN npm config set @datasance:registry https://npm.pkg.github.com/ RUN npm i -g /tmp/iofog-controller.tgz && \ rm -rf /tmp/iofog-controller.tgz && \ diff --git a/package.json b/package.json index fe9085f56..c2319a1f8 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@datasance/iofogcontroller", - "version": "3.0.5", + "version": "3.0.6", "description": "ioFog Controller project for Eclipse IoFog @ iofog.org \\nCopyright (c) 2023 Datasance Teknoloji A.S.", "main": "./src/main.js", "author": "Emirhan Durmus", @@ -57,7 +57,7 @@ "iofog-controller": "src/main.js" }, "dependencies": { - "@iofog/ecn-viewer": "3.0.2", + "@datasance/ecn-viewer": "0.0.1", "axios": "1.0.0-alpha.1", "body-parser": "^1.20.1", "child_process": "1.0.2", diff --git a/src/server.js b/src/server.js index 6dce62643..b465e178e 100755 --- a/src/server.js +++ b/src/server.js @@ -18,7 +18,7 @@ const db = require('./data/models') const bodyParser = require('body-parser') const cookieParser = require('cookie-parser') const express = require('express') -const ecnViewer = process.env.ECN_VIEWER_PATH ? require(`${process.env.ECN_VIEWER_PATH}/package/index.js`) : require('@iofog/ecn-viewer') +const ecnViewer = process.env.ECN_VIEWER_PATH ? require(`${process.env.ECN_VIEWER_PATH}/package/index.js`) : require('@datasance/ecn-viewer') const fs = require('fs') const helmet = require('helmet') const cors = require('cors') @@ -198,7 +198,7 @@ const initState = async () => { }) } // Set up controller-config.js for ECN Viewer - const ecnViewerControllerConfigFilePath = path.join(__dirname, '..', 'node_modules', '@iofog', 'ecn-viewer', 'build', 'controller-config.js') + const ecnViewerControllerConfigFilePath = path.join(__dirname, '..', 'node_modules', '@datasance', 'ecn-viewer', 'build', 'controller-config.js') const ecnViewerControllerConfig = { port: apiPort, user: {} diff --git a/src/services/controller-service.js b/src/services/controller-service.js index 7796c210a..8b01bdf0b 100644 --- a/src/services/controller-service.js +++ b/src/services/controller-service.js @@ -57,7 +57,7 @@ const statusController = async function (isCLI) { 'uptimeSec': process.uptime(), versions: { controller: packageJson.version, - ecnViewer: packageJson.dependencies['@iofog/ecn-viewer'] + ecnViewer: packageJson.dependencies['@datasance/ecn-viewer'] } } } From 40e7411c9fbf6b3e9c8a36e0fcab92f8f3c76f41 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emirhan=20Durmu=C5=9F?= Date: Fri, 16 Feb 2024 17:57:07 +0300 Subject: [PATCH 036/178] workflow nprmc edit --- .github/workflows/ci.yaml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 9a67cae34..ee6b30f38 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -52,6 +52,12 @@ jobs: - uses: actions/setup-node@v3 with: node-version: 18 + - name: Replace values + shell: bash + env: + PAT: ${{ secrets.PAT }} + run: | + sed -i.back "s|PAT|${PAT}|g" .npmrc - run: npm install - run: npm run standard - run: | From 24d8a60d5bbb28b3942097a447aa2dd714202858 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emirhan=20Durmu=C5=9F?= Date: Fri, 16 Feb 2024 18:02:12 +0300 Subject: [PATCH 037/178] workflow edit --- .github/workflows/ci.yaml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index ee6b30f38..e8bb3afa4 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -58,6 +58,7 @@ jobs: PAT: ${{ secrets.PAT }} run: | sed -i.back "s|PAT|${PAT}|g" .npmrc + - run: npm config set @datasance:registry https://npm.pkg.github.com/ - run: npm install - run: npm run standard - run: | @@ -93,7 +94,7 @@ jobs: PAT: ${{ secrets.PAT }} run: | sed -i.back "s|PAT|${PAT}|g" .npmrc - + - run: npm config set @datasance:registry https://npm.pkg.github.com/ - run: npm install - name: npm version From 376ecc32ee744347781ccd784aedeaa7d806bb63 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emirhan=20Durmu=C5=9F?= Date: Fri, 16 Feb 2024 18:14:30 +0300 Subject: [PATCH 038/178] workflow and nsprc edit --- .github/workflows/ci.yaml | 4 ++++ .nsprc | 10 ++++++++++ 2 files changed, 14 insertions(+) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index e8bb3afa4..eb3c3dc7f 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -139,6 +139,10 @@ jobs: registry: "ghcr.io" username: ${{ github.actor }} password: ${{ secrets.PAT }} + - name: build -argument + shell: bash + run: | + echo "GITHUB_TOKEN=${{ secrets.PAT }}" >> "${GITHUB_OUTPUT}" - name: Build and Push to ghcr uses: docker/build-push-action@v3 diff --git a/.nsprc b/.nsprc index f49a2ac69..2a54564df 100644 --- a/.nsprc +++ b/.nsprc @@ -32,5 +32,15 @@ }, "1095367": { "notes": "" + }, + "1096460": { + "notes": "" + }, + "1096482": { + "notes": "" + }, + "1096483": { + "notes": "" } + } \ No newline at end of file From e54314efde19568418083d30f3df6473926c9fc2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emirhan=20Durmu=C5=9F?= Date: Fri, 16 Feb 2024 18:21:43 +0300 Subject: [PATCH 039/178] workflow docker build argument edited --- .github/workflows/ci.yaml | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index eb3c3dc7f..b640804d1 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -139,11 +139,7 @@ jobs: registry: "ghcr.io" username: ${{ github.actor }} password: ${{ secrets.PAT }} - - name: build -argument - shell: bash - run: | - echo "GITHUB_TOKEN=${{ secrets.PAT }}" >> "${GITHUB_OUTPUT}" - + - name: Build and Push to ghcr uses: docker/build-push-action@v3 id: build_push_ghcr @@ -151,6 +147,7 @@ jobs: file: Dockerfile.dev push: true outputs: type=image,name=target,annotation-index.org.opencontainers.image.description=Controller + build-args: GITHUB_TOKEN=${{ secrets.PAT }} tags: | ghcr.io/datasance/${{ env.IMAGE_NAME }}:${{ steps.tags.outputs.VERSION }} ghcr.io/datasance/${{ env.IMAGE_NAME }}:latest From 5dcf7b6330fcec6412a60ceafb03ecbf1d412000 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emirhan=20Durmu=C5=9F?= Date: Fri, 16 Feb 2024 20:26:54 +0300 Subject: [PATCH 040/178] dockerfile updated --- Dockerfile.dev | 1 + 1 file changed, 1 insertion(+) diff --git a/Dockerfile.dev b/Dockerfile.dev index 74fd13f1e..13f3e6130 100644 --- a/Dockerfile.dev +++ b/Dockerfile.dev @@ -39,6 +39,7 @@ RUN pip3 install --no-cache --upgrade pip setuptools COPY --from=builder /tmp/datasance-iofogcontroller-*.tgz /tmp/iofog-controller.tgz ARG GITHUB_TOKEN +COPY --from=builder /tmp/.npmrc . # Set GitHub npm registry with authentication token RUN echo "//npm.pkg.github.com/:_authToken=${GITHUB_TOKEN}" > ~/.npmrc From b75b31f449a2c43865063a7fc5f322d55e2c5193 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emirhan=20Durmu=C5=9F?= Date: Sat, 17 Feb 2024 00:20:29 +0300 Subject: [PATCH 041/178] dockerfile edited --- Dockerfile.dev | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Dockerfile.dev b/Dockerfile.dev index 13f3e6130..a2aebba04 100644 --- a/Dockerfile.dev +++ b/Dockerfile.dev @@ -37,13 +37,13 @@ RUN python3 -m ensurepip RUN pip3 install --no-cache --upgrade pip setuptools COPY --from=builder /tmp/datasance-iofogcontroller-*.tgz /tmp/iofog-controller.tgz -ARG GITHUB_TOKEN +#ARG GITHUB_TOKEN -COPY --from=builder /tmp/.npmrc . +#COPY --from=builder /tmp/.npmrc . # Set GitHub npm registry with authentication token -RUN echo "//npm.pkg.github.com/:_authToken=${GITHUB_TOKEN}" > ~/.npmrc +#RUN echo "//npm.pkg.github.com/:_authToken=${GITHUB_TOKEN}" > ~/.npmrc -RUN npm config set @datasance:registry https://npm.pkg.github.com/ +#RUN npm config set @datasance:registry https://npm.pkg.github.com/ RUN npm i -g /tmp/iofog-controller.tgz && \ rm -rf /tmp/iofog-controller.tgz && \ From 6d3274a45325b4f7bc0bd1d3d45b397cdf6f9fb2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emirhan=20Durmu=C5=9F?= Date: Sat, 17 Feb 2024 00:38:05 +0300 Subject: [PATCH 042/178] dockerfile edited --- Dockerfile.dev | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile.dev b/Dockerfile.dev index a2aebba04..861ebfa3f 100644 --- a/Dockerfile.dev +++ b/Dockerfile.dev @@ -12,7 +12,7 @@ COPY package.json . COPY . . # Set GitHub npm registry with authentication token -RUN echo "//npm.pkg.github.com/:_authToken=${GITHUB_TOKEN}" > ~/.npmrc +RUN sed -i.back "s|PAT|${GITHUB_TOKEN}|g" .npmrc RUN npm config set @datasance:registry https://npm.pkg.github.com/ From cfd8e25826cdd9ad97df24d4d5092f0376588bfa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emirhan=20Durmu=C5=9F?= Date: Sat, 17 Feb 2024 21:19:14 +0300 Subject: [PATCH 043/178] public port range edited --- src/config/default.json | 2 +- src/services/microservice-ports/default.js | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/config/default.json b/src/config/default.json index 51747dcc9..caa7c33c5 100644 --- a/src/config/default.json +++ b/src/config/default.json @@ -32,7 +32,7 @@ "DiagnosticDir": "diagnostic" }, "PublicPorts": { - "Range": "6000-7000", + "Range": "6001-7999", "ProxyBrokerUrl": "http://localhost:3000", "ProxyBrokerToken": "" }, diff --git a/src/services/microservice-ports/default.js b/src/services/microservice-ports/default.js index 9e877bc38..b511a60cc 100644 --- a/src/services/microservice-ports/default.js +++ b/src/services/microservice-ports/default.js @@ -55,9 +55,9 @@ function _createDefaultPublicPortRange () { const [startStr, endStr] = defaultPortRangeStr.split('-') let start = parseInt(startStr) let end = parseInt(endStr) - if (!start || Number.isNaN(start)) { start = 6000 } + if (!start || Number.isNaN(start)) { start = 6001 } if (!end || Number.isNaN(end) || end < start) { - end = start + 1000 + end = start + 1998 } const size = end - start const availablePorts = new Array(size) @@ -106,7 +106,7 @@ async function validatePortMapping (agent, mapping, availablePublicPortsByHost, } else { // Assign next available public port const currentPublicPorts = (await MicroservicePublicPortManager.findAll({ hostId: host.uuid }, transaction)).map(p => p.publicPort) - // Default range 6000 -> 7000 + // Default range 6001 -> 7999 availablePublicPortsByHost[host.uuid] = availablePublicPortsByHost[host.uuid] || _createDefaultPublicPortRange() availablePublicPortsByHost[host.uuid] = availablePublicPortsByHost[host.uuid].filter(port => !currentPublicPorts.includes(port)) if (availablePublicPortsByHost[host.uuid].length === 0) { From 8f1e8de5dd41fb8286a1d3c2428a3cc5283735da Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emirhan=20Durmu=C5=9F?= Date: Fri, 1 Mar 2024 15:32:49 +0300 Subject: [PATCH 044/178] mysql adapter created --- .dockerignore | 1 + .gitignore | 1 + package.json | 1 + src/data/providers/mysql.js | 41 +++++++++++++++++++++++++++++++++++++ 4 files changed, 44 insertions(+) create mode 100644 src/data/providers/mysql.js diff --git a/.dockerignore b/.dockerignore index 18dfe8d78..0e9dec078 100644 --- a/.dockerignore +++ b/.dockerignore @@ -9,6 +9,7 @@ node_modules *.pid /src/data/providers/* !/src/data/providers/sqlite.js +!/src/data/providers/mysql.js !/src/data/providers/database-*.js /src/config/*-config.json .DS_Store diff --git a/.gitignore b/.gitignore index 97d5e39fa..427fc02a9 100644 --- a/.gitignore +++ b/.gitignore @@ -9,6 +9,7 @@ node_modules *.pid /src/data/providers/* !/src/data/providers/sqlite.js +!/src/data/providers/mysql.js !/src/data/providers/database-*.js /src/config/*-config.json .DS_Store diff --git a/package.json b/package.json index c2319a1f8..d982c0529 100644 --- a/package.json +++ b/package.json @@ -80,6 +80,7 @@ "moment-timezone": "0.5.38", "morgan": "1.9.1", "multer": "1.4.5-lts.1", + "mysql": "2.18.1", "nconf": "0.12.0", "nodemailer": "6.7.3", "nodemailer-smtp-transport": "2.4.2", diff --git a/src/data/providers/mysql.js b/src/data/providers/mysql.js new file mode 100644 index 000000000..cede3bae3 --- /dev/null +++ b/src/data/providers/mysql.js @@ -0,0 +1,41 @@ +const Sequelize = require('sequelize') +const mysql = require('mysql') + +const config = require('../../config') +const DatabaseProvider = require('./database-provider') + +class MySqlDatabaseProvider extends DatabaseProvider { + constructor () { + super() + + const mysqlConfig = config.get('Database:Config', {}) + mysqlConfig.dialect = 'mysql' + mysqlConfig.host = process.env.DB_HOST || mysqlConfig.host + mysqlConfig.port = process.env.DB_PORT || mysqlConfig.port + mysqlConfig.user = process.env.DB_USERNAME || mysqlConfig.user + mysqlConfig.password = process.env.DB_PASSWORD || mysqlConfig.password + mysqlConfig.databaseName = process.env.DB_NAME || mysqlConfig.database + if (!mysqlConfig.database.endsWith('.sql')) { + mysqlConfig.database += '.sql' + } + if (config.use_env_variable) { + this.sequelize = new Sequelize(process.env[config.use_env_variable], mysqlConfig) + } else { + this.sequelize = new Sequelize(mysqlConfig) + } + this.connection = mysql.createConnection({ + host: mysqlConfig.host, + port: mysqlConfig.port, + user: mysqlConfig.user, + password: mysqlConfig.password, + database: mysqlConfig.databaseName + }) + this.connection.connect() + } + + async initDB () { + // Implement initialization logic here + } +} + +module.exports = MySqlDatabaseProvider From da26c538d758881eafe89b182ceac0d2903437d3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emirhan=20Durmu=C5=9F?= Date: Fri, 1 Mar 2024 17:39:37 +0300 Subject: [PATCH 045/178] configs and mysql adapter updated --- package.json | 2 +- src/config/development.json | 27 ++++++++++++++++++--------- src/config/production.json | 27 ++++++++++++++++++--------- src/data/providers/mysql.js | 17 +++++++++-------- src/data/providers/sqlite.js | 2 +- 5 files changed, 47 insertions(+), 28 deletions(-) diff --git a/package.json b/package.json index d982c0529..e09247a00 100644 --- a/package.json +++ b/package.json @@ -80,7 +80,7 @@ "moment-timezone": "0.5.38", "morgan": "1.9.1", "multer": "1.4.5-lts.1", - "mysql": "2.18.1", + "mysql2": "3.2.2", "nconf": "0.12.0", "nodemailer": "6.7.3", "nodemailer-smtp-transport": "2.4.2", diff --git a/src/config/development.json b/src/config/development.json index 08c72584d..253fdcbdb 100644 --- a/src/config/development.json +++ b/src/config/development.json @@ -41,15 +41,24 @@ "Database": { "Provider": "sqlite", "Config": { - "databaseName": "dev_database.sqlite", - "logging": false, - "transactionType": "IMMEDIATE", - "pool": { - "maxactive": 1, - "max": 1, - "min": 0, - "idle": 20000 + "sqlite": { + "databaseName": "dev_database.sqlite", + "logging": false, + "transactionType": "IMMEDIATE", + "pool": { + "maxactive": 1, + "max": 1, + "min": 0, + "idle": 20000 + } + }, + "mysql": { + "host": "", + "port": "", + "username": "", + "password": "", + "databaseName": "dev_database.sql" } } - } + } } \ No newline at end of file diff --git a/src/config/production.json b/src/config/production.json index 725d8abb2..4e6b967e2 100644 --- a/src/config/production.json +++ b/src/config/production.json @@ -29,15 +29,24 @@ "Database": { "Provider": "sqlite", "Config": { - "databaseName": "prod_database.sqlite", - "logging": false, - "transactionType": "IMMEDIATE", - "pool": { - "maxactive": 1, - "max": 1, - "min": 0, - "idle": 20000 + "sqlite": { + "databaseName": "prod_database.sqlite", + "logging": false, + "transactionType": "IMMEDIATE", + "pool": { + "maxactive": 1, + "max": 1, + "min": 0, + "idle": 20000 + } + }, + "mysql": { + "host": "", + "port": "", + "username": "", + "password": "", + "databaseName": "" } } - } + } } \ No newline at end of file diff --git a/src/data/providers/mysql.js b/src/data/providers/mysql.js index cede3bae3..aa50fe761 100644 --- a/src/data/providers/mysql.js +++ b/src/data/providers/mysql.js @@ -1,5 +1,5 @@ const Sequelize = require('sequelize') -const mysql = require('mysql') +const mysql = require('mysql2') const config = require('../../config') const DatabaseProvider = require('./database-provider') @@ -8,16 +8,17 @@ class MySqlDatabaseProvider extends DatabaseProvider { constructor () { super() - const mysqlConfig = config.get('Database:Config', {}) + const mysqlConfig = config.get('Database:Config:mysql', {}) mysqlConfig.dialect = 'mysql' mysqlConfig.host = process.env.DB_HOST || mysqlConfig.host mysqlConfig.port = process.env.DB_PORT || mysqlConfig.port - mysqlConfig.user = process.env.DB_USERNAME || mysqlConfig.user + mysqlConfig.username = process.env.DB_USERNAME || mysqlConfig.username mysqlConfig.password = process.env.DB_PASSWORD || mysqlConfig.password mysqlConfig.databaseName = process.env.DB_NAME || mysqlConfig.database - if (!mysqlConfig.database.endsWith('.sql')) { - mysqlConfig.database += '.sql' - } + if (!mysqlConfig.databaseName.endsWith('.sql')) { + mysqlConfig.databaseName += '.sql' + } + if (config.use_env_variable) { this.sequelize = new Sequelize(process.env[config.use_env_variable], mysqlConfig) } else { @@ -26,7 +27,7 @@ class MySqlDatabaseProvider extends DatabaseProvider { this.connection = mysql.createConnection({ host: mysqlConfig.host, port: mysqlConfig.port, - user: mysqlConfig.user, + user: mysqlConfig.username, password: mysqlConfig.password, database: mysqlConfig.databaseName }) @@ -34,7 +35,7 @@ class MySqlDatabaseProvider extends DatabaseProvider { } async initDB () { - // Implement initialization logic here + } } diff --git a/src/data/providers/sqlite.js b/src/data/providers/sqlite.js index a34da5ee3..0f65837a2 100644 --- a/src/data/providers/sqlite.js +++ b/src/data/providers/sqlite.js @@ -9,7 +9,7 @@ class SqliteDatabaseProvider extends DatabaseProvider { constructor () { super() - const sqliteConfig = config.get('Database:Config', {}) + const sqliteConfig = config.get('Database:Config:sqlite', {}) sqliteConfig.dialect = 'sqlite' sqliteConfig.databaseName = process.env.DB_NAME || sqliteConfig.databaseName if (!sqliteConfig.databaseName.endsWith('.sqlite')) { From b59131e1ad59a5d852da63d2f972680d6ca22f3a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emirhan=20Durmu=C5=9F?= Date: Fri, 1 Mar 2024 21:10:27 +0300 Subject: [PATCH 046/178] mysql adapter and sequalize model --- src/config/development.json | 2 +- .../20200123045032-fog-and-change-tracking.js | 17 +++++++++++------ src/data/providers/mysql.js | 7 ++----- 3 files changed, 14 insertions(+), 12 deletions(-) diff --git a/src/config/development.json b/src/config/development.json index 253fdcbdb..942e68199 100644 --- a/src/config/development.json +++ b/src/config/development.json @@ -57,7 +57,7 @@ "port": "", "username": "", "password": "", - "databaseName": "dev_database.sql" + "databaseName": "" } } } diff --git a/src/data/migrations/20200123045032-fog-and-change-tracking.js b/src/data/migrations/20200123045032-fog-and-change-tracking.js index 6d2854203..4f7f5451c 100644 --- a/src/data/migrations/20200123045032-fog-and-change-tracking.js +++ b/src/data/migrations/20200123045032-fog-and-change-tracking.js @@ -1,7 +1,7 @@ -'use strict' +'use strict'; module.exports = { - up: (queryInterface, Sequelize) => { + up: async (queryInterface, Sequelize) => { /* Add altering commands here. Return a promise to correctly handle asynchronicity. @@ -9,10 +9,15 @@ module.exports = { Example: return queryInterface.createTable('users', { id: Sequelize.INTEGER }); */ + await queryInterface.removeColumn('Fogs', 'docker_pruning_freq'); + await queryInterface.removeColumn('Fogs', 'available_disk_threshold'); + await queryInterface.removeColumn('Fogs', 'log_level'); + await queryInterface.removeColumn('ChangeTrackings', 'prune'); + return Promise.all([ queryInterface.addColumn('Fogs', 'docker_pruning_freq', { type: Sequelize.INTEGER, - defaultValue: 60, + defaultValue: 1, field: 'docker_pruning_freq' }), queryInterface.addColumn('Fogs', 'available_disk_threshold', { @@ -29,7 +34,7 @@ module.exports = { type: Sequelize.BOOLEAN, field: 'prune' }) - ]) + ]); }, down: (queryInterface, Sequelize) => { @@ -45,6 +50,6 @@ module.exports = { queryInterface.removeColumn('Fogs', 'available_disk_threshold'), queryInterface.removeColumn('Fogs', 'log_level'), queryInterface.removeColumn('ChangeTrackings', 'prune') - ]) + ]); } -} +}; diff --git a/src/data/providers/mysql.js b/src/data/providers/mysql.js index aa50fe761..ce575c6e0 100644 --- a/src/data/providers/mysql.js +++ b/src/data/providers/mysql.js @@ -15,14 +15,11 @@ class MySqlDatabaseProvider extends DatabaseProvider { mysqlConfig.username = process.env.DB_USERNAME || mysqlConfig.username mysqlConfig.password = process.env.DB_PASSWORD || mysqlConfig.password mysqlConfig.databaseName = process.env.DB_NAME || mysqlConfig.database - if (!mysqlConfig.databaseName.endsWith('.sql')) { - mysqlConfig.databaseName += '.sql' - } if (config.use_env_variable) { this.sequelize = new Sequelize(process.env[config.use_env_variable], mysqlConfig) } else { - this.sequelize = new Sequelize(mysqlConfig) + this.sequelize = new Sequelize(mysqlConfig.databaseName, mysqlConfig.username, mysqlConfig.password, mysqlConfig) } this.connection = mysql.createConnection({ host: mysqlConfig.host, @@ -35,7 +32,7 @@ class MySqlDatabaseProvider extends DatabaseProvider { } async initDB () { - + // Implement initialization logic here } } From 53dbf6fa1afdbb855f4f3b99d7215524999f0c56 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emirhan=20Durmu=C5=9F?= Date: Fri, 1 Mar 2024 23:14:09 +0300 Subject: [PATCH 047/178] mysql provider updated --- package.json | 1 - .../20200123045032-fog-and-change-tracking.js | 15 +++++---------- src/data/providers/mysql.js | 14 +++++--------- 3 files changed, 10 insertions(+), 20 deletions(-) diff --git a/package.json b/package.json index e09247a00..c2319a1f8 100644 --- a/package.json +++ b/package.json @@ -80,7 +80,6 @@ "moment-timezone": "0.5.38", "morgan": "1.9.1", "multer": "1.4.5-lts.1", - "mysql2": "3.2.2", "nconf": "0.12.0", "nodemailer": "6.7.3", "nodemailer-smtp-transport": "2.4.2", diff --git a/src/data/migrations/20200123045032-fog-and-change-tracking.js b/src/data/migrations/20200123045032-fog-and-change-tracking.js index 4f7f5451c..ecc9e793f 100644 --- a/src/data/migrations/20200123045032-fog-and-change-tracking.js +++ b/src/data/migrations/20200123045032-fog-and-change-tracking.js @@ -1,7 +1,7 @@ -'use strict'; +'use strict' module.exports = { - up: async (queryInterface, Sequelize) => { + up: (queryInterface, Sequelize) => { /* Add altering commands here. Return a promise to correctly handle asynchronicity. @@ -9,11 +9,6 @@ module.exports = { Example: return queryInterface.createTable('users', { id: Sequelize.INTEGER }); */ - await queryInterface.removeColumn('Fogs', 'docker_pruning_freq'); - await queryInterface.removeColumn('Fogs', 'available_disk_threshold'); - await queryInterface.removeColumn('Fogs', 'log_level'); - await queryInterface.removeColumn('ChangeTrackings', 'prune'); - return Promise.all([ queryInterface.addColumn('Fogs', 'docker_pruning_freq', { type: Sequelize.INTEGER, @@ -34,7 +29,7 @@ module.exports = { type: Sequelize.BOOLEAN, field: 'prune' }) - ]); + ]) }, down: (queryInterface, Sequelize) => { @@ -50,6 +45,6 @@ module.exports = { queryInterface.removeColumn('Fogs', 'available_disk_threshold'), queryInterface.removeColumn('Fogs', 'log_level'), queryInterface.removeColumn('ChangeTrackings', 'prune') - ]); + ]) } -}; +} \ No newline at end of file diff --git a/src/data/providers/mysql.js b/src/data/providers/mysql.js index ce575c6e0..f8b226276 100644 --- a/src/data/providers/mysql.js +++ b/src/data/providers/mysql.js @@ -1,5 +1,4 @@ const Sequelize = require('sequelize') -const mysql = require('mysql2') const config = require('../../config') const DatabaseProvider = require('./database-provider') @@ -21,14 +20,11 @@ class MySqlDatabaseProvider extends DatabaseProvider { } else { this.sequelize = new Sequelize(mysqlConfig.databaseName, mysqlConfig.username, mysqlConfig.password, mysqlConfig) } - this.connection = mysql.createConnection({ - host: mysqlConfig.host, - port: mysqlConfig.port, - user: mysqlConfig.username, - password: mysqlConfig.password, - database: mysqlConfig.databaseName - }) - this.connection.connect() + sequelize.authenticate().then(() => { + console.log('Connection has been established successfully.'); + }).catch((error) => { + console.error('Unable to connect to the database: ', error); + }); } async initDB () { From 4cd802fdbcb446fdbb43ea1b403af52537a81116 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emirhan=20Durmu=C5=9F?= Date: Fri, 1 Mar 2024 23:26:56 +0300 Subject: [PATCH 048/178] mysql provider updated --- .../20200123045032-fog-and-change-tracking.js | 2 +- src/data/providers/mysql.js | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/data/migrations/20200123045032-fog-and-change-tracking.js b/src/data/migrations/20200123045032-fog-and-change-tracking.js index ecc9e793f..a73b2e8e4 100644 --- a/src/data/migrations/20200123045032-fog-and-change-tracking.js +++ b/src/data/migrations/20200123045032-fog-and-change-tracking.js @@ -47,4 +47,4 @@ module.exports = { queryInterface.removeColumn('ChangeTrackings', 'prune') ]) } -} \ No newline at end of file +} diff --git a/src/data/providers/mysql.js b/src/data/providers/mysql.js index f8b226276..0326afc2e 100644 --- a/src/data/providers/mysql.js +++ b/src/data/providers/mysql.js @@ -20,11 +20,11 @@ class MySqlDatabaseProvider extends DatabaseProvider { } else { this.sequelize = new Sequelize(mysqlConfig.databaseName, mysqlConfig.username, mysqlConfig.password, mysqlConfig) } - sequelize.authenticate().then(() => { - console.log('Connection has been established successfully.'); - }).catch((error) => { - console.error('Unable to connect to the database: ', error); - }); + this.sequelize.authenticate().then(() => { + console.log('Connection has been established successfully.') + }).catch((error) => { + console.error('Unable to connect to the database: ', error) + }) } async initDB () { From 1f87e523ce36fdeedb0aef2ce6c000bbda566747 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emirhan=20Durmu=C5=9F?= Date: Fri, 1 Mar 2024 23:36:40 +0300 Subject: [PATCH 049/178] mysql2 added to package.json --- package.json | 1 + 1 file changed, 1 insertion(+) diff --git a/package.json b/package.json index c2319a1f8..e09247a00 100644 --- a/package.json +++ b/package.json @@ -80,6 +80,7 @@ "moment-timezone": "0.5.38", "morgan": "1.9.1", "multer": "1.4.5-lts.1", + "mysql2": "3.2.2", "nconf": "0.12.0", "nodemailer": "6.7.3", "nodemailer-smtp-transport": "2.4.2", From 102768f251ee310b489cb4811990e7ff5d356f88 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emirhan=20Durmu=C5=9F?= Date: Sat, 2 Mar 2024 01:52:38 +0300 Subject: [PATCH 050/178] provider updated --- src/data/providers/mysql.js | 45 ++++++++++++++++++------------------- 1 file changed, 22 insertions(+), 23 deletions(-) diff --git a/src/data/providers/mysql.js b/src/data/providers/mysql.js index 0326afc2e..30715a4fe 100644 --- a/src/data/providers/mysql.js +++ b/src/data/providers/mysql.js @@ -1,35 +1,34 @@ -const Sequelize = require('sequelize') +const Sequelize = require('sequelize'); -const config = require('../../config') -const DatabaseProvider = require('./database-provider') +const config = require('../../config'); +const DatabaseProvider = require('./database-provider'); class MySqlDatabaseProvider extends DatabaseProvider { constructor () { - super() + super(); - const mysqlConfig = config.get('Database:Config:mysql', {}) - mysqlConfig.dialect = 'mysql' - mysqlConfig.host = process.env.DB_HOST || mysqlConfig.host - mysqlConfig.port = process.env.DB_PORT || mysqlConfig.port - mysqlConfig.username = process.env.DB_USERNAME || mysqlConfig.username - mysqlConfig.password = process.env.DB_PASSWORD || mysqlConfig.password - mysqlConfig.databaseName = process.env.DB_NAME || mysqlConfig.database + const mysqlConfig = config.get('Database:Config:mysql', {}); + mysqlConfig.dialect = 'mysql'; + mysqlConfig.host = process.env.DB_HOST || mysqlConfig.host; + mysqlConfig.port = process.env.DB_PORT || mysqlConfig.port; + mysqlConfig.username = process.env.DB_USERNAME || mysqlConfig.username; + mysqlConfig.password = process.env.DB_PASSWORD || mysqlConfig.password; + mysqlConfig.databaseName = process.env.DB_NAME || mysqlConfig.database; - if (config.use_env_variable) { - this.sequelize = new Sequelize(process.env[config.use_env_variable], mysqlConfig) - } else { - this.sequelize = new Sequelize(mysqlConfig.databaseName, mysqlConfig.username, mysqlConfig.password, mysqlConfig) - } - this.sequelize.authenticate().then(() => { - console.log('Connection has been established successfully.') - }).catch((error) => { - console.error('Unable to connect to the database: ', error) - }) + this.sequelize = new Sequelize(mysqlConfig.databaseName, mysqlConfig.username, mysqlConfig.password, mysqlConfig); + + this.initDB(); // Call initDB method to start the database initialization } async initDB () { - // Implement initialization logic here + try { + await this.sequelize.authenticate(); + console.log('Connection has been established successfully.'); + // Implement further initialization logic here + } catch (error) { + console.error('Unable to connect to the database: ', error); + } } } -module.exports = MySqlDatabaseProvider +module.exports = MySqlDatabaseProvider; From 66cea4a31c8e5b462f3f436cf35d53643e28c09b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emirhan=20Durmu=C5=9F?= Date: Thu, 7 Mar 2024 23:29:10 +0300 Subject: [PATCH 051/178] migration notes and controlplane model --- docs/.swagger-codegen/VERSION | 2 +- docs/swagger.json | 19 + docs/swagger.yaml | 15 + logrotate.conf | 2 +- package-lock.json | 17550 ++++++++++++++++ src/config/development.json | 14 +- src/config/production.json | 16 +- src/controllers/control-plane-controller.js | 26 + src/data/managers/control-plane.js | 36 + .../20200123045032-fog-and-change-tracking.js | 2 +- .../20200213033350-create-config.js | 4 +- .../20200506004924-add-route-name.js | 4 +- .../20201001230303-add-tags-fogs.js | 4 +- .../20201028005645-create-edge-resources.js | 2 +- ...1204003312-create_application_templates.js | 2 +- ...211022010318-add-unique-constraint-msvc.js | 2 +- ...11022013326-add-unique-constraint-route.js | 2 +- src/data/models/application.js | 8 +- src/data/models/applicationTemplate.js | 8 +- src/data/models/catalogitem.js | 8 +- src/data/models/controlPlane.js | 66 + src/data/models/edgeResource.js | 9 +- src/data/models/fog.js | 9 +- src/data/models/fogaccesstoken.js | 8 +- src/data/models/kubeletaccesstoken.js | 8 +- src/data/models/microservice.js | 8 +- src/data/models/microserviceport.js | 8 +- src/data/models/registry.js | 9 +- src/data/models/user.js | 9 + src/data/providers/mysql.js | 35 +- src/data/providers/sqlite.js | 2 +- .../20240304180631-insert-control-plane.js | 19 + src/routes/controlPlane.js | 45 + src/schemas/controlPlane.js | 26 + src/services/control-plane.js | 1 + 35 files changed, 17907 insertions(+), 81 deletions(-) create mode 100644 package-lock.json create mode 100644 src/controllers/control-plane-controller.js create mode 100644 src/data/managers/control-plane.js create mode 100644 src/data/models/controlPlane.js create mode 100644 src/data/seeders/20240304180631-insert-control-plane.js create mode 100644 src/routes/controlPlane.js create mode 100644 src/schemas/controlPlane.js create mode 100644 src/services/control-plane.js diff --git a/docs/.swagger-codegen/VERSION b/docs/.swagger-codegen/VERSION index 5ccbb5bb7..2560437e4 100644 --- a/docs/.swagger-codegen/VERSION +++ b/docs/.swagger-codegen/VERSION @@ -1 +1 @@ -2.4.29 \ No newline at end of file +2.4.31 \ No newline at end of file diff --git a/docs/swagger.json b/docs/swagger.json index 11df5eaa8..29afc4b7d 100644 --- a/docs/swagger.json +++ b/docs/swagger.json @@ -7,6 +7,9 @@ "tags" : [ { "name" : "Controller", "description" : "Manage your controller" + }, { + "name" : "Control Plane", + "description" : "Manage your Control Plane" }, { "name" : "ioFog", "description" : "Manage your agents" @@ -45,6 +48,22 @@ "description" : "Manage your users" } ], "paths" : { + "/controlplane/profile" : { + "get" : { + "tags" : [ "ControlPlane" ], + "summary" : "Returns Control Plane Profile", + "operationId" : "getControlPlaneProfile", + "parameters" : [ ], + "responses" : { + "200" : { + "description" : "Control Plane Profile" + }, + "500" : { + "description" : "Internal Server Error" + } + } + } + }, "/status" : { "get" : { "tags" : [ "Controller" ], diff --git a/docs/swagger.yaml b/docs/swagger.yaml index c840cdcaa..cd13d6b03 100755 --- a/docs/swagger.yaml +++ b/docs/swagger.yaml @@ -3,6 +3,21 @@ info: version: 1.0.0 title: Datasance PoT-ioFog Controller paths: + /controlplane/profile: + get: + tags: + - ControlPlane + summary: Returns Control Plane Profile + operationId: getControlPlaneProfile + responses: + "200": + description: Control Plane Profile + content: + application/json: + schema: + $ref: "#/components/schemas/ControlPlaneProfileResponse" + "500": + description: Internal Server Error /status: get: tags: diff --git a/logrotate.conf b/logrotate.conf index b94c050dc..219c0f9ba 100644 --- a/logrotate.conf +++ b/logrotate.conf @@ -5,6 +5,6 @@ notifempty missingok postrotate - kill -HUP `cat /usr/local/lib/node_modules/iofogcontroller/src/iofog-controller.pid` + kill -HUP `cat /usr/local/lib/node_modules/@datasance/iofogcontroller/src/iofog-controller.pid` endscript } diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 000000000..8948b350b --- /dev/null +++ b/package-lock.json @@ -0,0 +1,17550 @@ +{ + "name": "@datasance/iofogcontroller", + "version": "3.0.6", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "@datasance/iofogcontroller", + "version": "3.0.6", + "hasInstallScript": true, + "license": "EPL-2.0", + "dependencies": { + "@datasance/ecn-viewer": "0.0.1", + "axios": "1.0.0-alpha.1", + "body-parser": "^1.20.1", + "child_process": "1.0.2", + "command-line-args": "5.0.2", + "command-line-usage": "5.0.5", + "concurrent-queue": "7.0.2", + "cookie-parser": "1.4.3", + "cors": "2.8.5", + "daemonize2": "0.4.2", + "ejs": "3.1.7", + "express": "4.17.3", + "formidable": "1.2.1", + "ftp": "0.3.10", + "helmet": "3.21.2", + "is-elevated": "3.0.0", + "js-yaml": "3.14.1", + "jsonschema": "1.2.5", + "minimatch": "3.1.2", + "moment": "2.29.4", + "moment-timezone": "0.5.38", + "morgan": "1.9.1", + "multer": "1.4.5-lts.1", + "mysql2": "3.2.2", + "nconf": "0.12.0", + "nodemailer": "6.7.3", + "nodemailer-smtp-transport": "2.4.2", + "os": "0.1.1", + "path": "0.12.7", + "pino": "6.6.1", + "pino-std-serializers": "2.5.0", + "portscanner": "2.2.0", + "qs": "6.10.3", + "request": "2.88.0", + "request-promise": "4.2.4", + "retry-as-promised": "3.1.0", + "semantic-release": "19.0.3", + "semver": "5.6.0", + "sequelize": "6.29.0", + "sqlite3": "^5.1.5", + "string-format": "2.0.0", + "swagger-ui-express": "^4.6.2", + "umzug": "2.2.0", + "underscore": "1.13.1", + "xss-clean": "0.1.1" + }, + "bin": { + "iofog-controller": "src/main.js" + }, + "devDependencies": { + "acorn": "7.1.1", + "bdd-lazy-var": "2.5.2", + "chai": "4.2.0", + "chai-as-promised": "7.1.1", + "chai-http": "4.2.1", + "eslint": "5.14.1", + "eslint-config-google": "0.12.0", + "mocha": "9.2.2", + "mocha-junit-reporter": "2.0.0", + "newman": "5.3.2", + "newman-reporter-junitfull": "1.1.1", + "nyc": "15.0.0", + "sequelize-cli": "5.5.0", + "sinon": "7.5.0", + "sinon-chai": "3.3.0", + "snyk": "^1.1064.0", + "standard": "12.0.1" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", + "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", + "dependencies": { + "@babel/highlight": "^7.23.4", + "chalk": "^2.4.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.5.tgz", + "integrity": "sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.0.tgz", + "integrity": "sha512-fQfkg0Gjkza3nf0c7/w6Xf34BW4YvzNfACRLmmb7XRLa6XHdR+K9AlJlxneFfWYf6uhOzuzZVTjF/8KfndZANw==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.23.5", + "@babel/generator": "^7.23.6", + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helpers": "^7.24.0", + "@babel/parser": "^7.24.0", + "@babel/template": "^7.24.0", + "@babel/traverse": "^7.24.0", + "@babel/types": "^7.24.0", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true + }, + "node_modules/@babel/core/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/@babel/core/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/@babel/core/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/@babel/generator": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.6.tgz", + "integrity": "sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.23.6", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz", + "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.23.5", + "@babel/helper-validator-option": "^7.23.5", + "browserslist": "^4.22.2", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/@babel/helper-compilation-targets/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/@babel/helper-compilation-targets/node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", + "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", + "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", + "dev": true, + "dependencies": { + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", + "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", + "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-simple-access": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-validator-identifier": "^7.22.20" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", + "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", + "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz", + "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.0.tgz", + "integrity": "sha512-ulDZdc0Aj5uLc5nETsa7EPx2L7rM0YJM8r7ck7U73AXi7qOV44IHHRAYZHY6iU1rr3C5N4NtTmMRUJP6kwCWeA==", + "dev": true, + "dependencies": { + "@babel/template": "^7.24.0", + "@babel/traverse": "^7.24.0", + "@babel/types": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", + "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", + "dependencies": { + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.0.tgz", + "integrity": "sha512-QuP/FxEAzMSjXygs8v4N9dvdXzEHN4W1oF3PxuWAtPo08UdM17u89RDMgjLn/mlc56iM0HlLmVkO/wgR+rDgHg==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/template": { + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.0.tgz", + "integrity": "sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.23.5", + "@babel/parser": "^7.24.0", + "@babel/types": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.0.tgz", + "integrity": "sha512-HfuJlI8qq3dEDmNU5ChzzpZRWq+oxCZQyMzIMEqLho+AQnhMnKQUzH6ydo3RBl/YjPCuk68Y6s0Gx0AeyULiWw==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.23.5", + "@babel/generator": "^7.23.6", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.24.0", + "@babel/types": "^7.24.0", + "debug": "^4.3.1", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse/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/@babel/traverse/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/@babel/types": { + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.0.tgz", + "integrity": "sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.23.4", + "@babel/helper-validator-identifier": "^7.22.20", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@colors/colors": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", + "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", + "optional": true, + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/@datasance/ecn-viewer": { + "version": "0.0.1", + "resolved": "https://npm.pkg.github.com/download/@datasance/ecn-viewer/0.0.1/e4d3b4942f496b6bcafa982865b9bb14e324eb06", + "integrity": "sha512-rrSn+AWwRDCyME5zLH444VtRNcm7umTKoDOKa/3xFKyFPi6QntZVLr7iI207NcmoU4ilNXPpdvOmLGk7ZSUCWA==", + "license": "EPL-2.0" + }, + "node_modules/@gar/promisify": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", + "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==", + "optional": true + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/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/@isaacs/cliui/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/@isaacs/cliui/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + }, + "node_modules/@isaacs/cliui/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "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/@isaacs/cliui/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/@isaacs/cliui/node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "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/@jridgewell/gen-mapping": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "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.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "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==", + "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/@npmcli/fs": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-1.1.1.tgz", + "integrity": "sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ==", + "optional": true, + "dependencies": { + "@gar/promisify": "^1.0.1", + "semver": "^7.3.5" + } + }, + "node_modules/@npmcli/fs/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==", + "optional": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@npmcli/fs/node_modules/semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "optional": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@npmcli/move-file": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.1.2.tgz", + "integrity": "sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==", + "deprecated": "This functionality has been moved to @npmcli/fs", + "optional": true, + "dependencies": { + "mkdirp": "^1.0.4", + "rimraf": "^3.0.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@npmcli/move-file/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "optional": true, + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@npmcli/move-file/node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "optional": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@octokit/auth-token": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-3.0.4.tgz", + "integrity": "sha512-TWFX7cZF2LXoCvdmJWY7XVPi74aSY0+FfBZNSXEXFkMpjcqsQwDSYVv5FhRFaI0V1ECnwbz4j59T/G+rXNWaIQ==", + "engines": { + "node": ">= 14" + } + }, + "node_modules/@octokit/core": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@octokit/core/-/core-4.2.4.tgz", + "integrity": "sha512-rYKilwgzQ7/imScn3M9/pFfUf4I1AZEH3KhyJmtPdE2zfaXAn2mFfUy4FbKewzc2We5y/LlKLj36fWJLKC2SIQ==", + "dependencies": { + "@octokit/auth-token": "^3.0.0", + "@octokit/graphql": "^5.0.0", + "@octokit/request": "^6.0.0", + "@octokit/request-error": "^3.0.0", + "@octokit/types": "^9.0.0", + "before-after-hook": "^2.2.0", + "universal-user-agent": "^6.0.0" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/@octokit/endpoint": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-7.0.6.tgz", + "integrity": "sha512-5L4fseVRUsDFGR00tMWD/Trdeeihn999rTMGRMC1G/Ldi1uWlWJzI98H4Iak5DB/RVvQuyMYKqSK/R6mbSOQyg==", + "dependencies": { + "@octokit/types": "^9.0.0", + "is-plain-object": "^5.0.0", + "universal-user-agent": "^6.0.0" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/@octokit/graphql": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-5.0.6.tgz", + "integrity": "sha512-Fxyxdy/JH0MnIB5h+UQ3yCoh1FG4kWXfFKkpWqjZHw/p+Kc8Y44Hu/kCgNBT6nU1shNumEchmW/sUO1JuQnPcw==", + "dependencies": { + "@octokit/request": "^6.0.0", + "@octokit/types": "^9.0.0", + "universal-user-agent": "^6.0.0" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/@octokit/openapi-types": { + "version": "18.1.1", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-18.1.1.tgz", + "integrity": "sha512-VRaeH8nCDtF5aXWnjPuEMIYf1itK/s3JYyJcWFJT8X9pSNnBtriDf7wlEWsGuhPLl4QIH4xM8fqTXDwJ3Mu6sw==" + }, + "node_modules/@octokit/plugin-paginate-rest": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-6.1.2.tgz", + "integrity": "sha512-qhrmtQeHU/IivxucOV1bbI/xZyC/iOBhclokv7Sut5vnejAIAEXVcGQeRpQlU39E0WwK9lNvJHphHri/DB6lbQ==", + "dependencies": { + "@octokit/tsconfig": "^1.0.2", + "@octokit/types": "^9.2.3" + }, + "engines": { + "node": ">= 14" + }, + "peerDependencies": { + "@octokit/core": ">=4" + } + }, + "node_modules/@octokit/plugin-retry": { + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/@octokit/plugin-retry/-/plugin-retry-4.1.6.tgz", + "integrity": "sha512-obkYzIgEC75r8+9Pnfiiqy3y/x1bc3QLE5B7qvv9wi9Kj0R5tGQFC6QMBg1154WQ9lAVypuQDGyp3hNpp15gQQ==", + "dependencies": { + "@octokit/types": "^9.0.0", + "bottleneck": "^2.15.3" + }, + "engines": { + "node": ">= 14" + }, + "peerDependencies": { + "@octokit/core": ">=3" + } + }, + "node_modules/@octokit/plugin-throttling": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/@octokit/plugin-throttling/-/plugin-throttling-5.2.3.tgz", + "integrity": "sha512-C9CFg9mrf6cugneKiaI841iG8DOv6P5XXkjmiNNut+swePxQ7RWEdAZRp5rJoE1hjsIqiYcKa/ZkOQ+ujPI39Q==", + "dependencies": { + "@octokit/types": "^9.0.0", + "bottleneck": "^2.15.3" + }, + "engines": { + "node": ">= 14" + }, + "peerDependencies": { + "@octokit/core": "^4.0.0" + } + }, + "node_modules/@octokit/request": { + "version": "6.2.8", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-6.2.8.tgz", + "integrity": "sha512-ow4+pkVQ+6XVVsekSYBzJC0VTVvh/FCTUUgTsboGq+DTeWdyIFV8WSCdo0RIxk6wSkBTHqIK1mYuY7nOBXOchw==", + "dependencies": { + "@octokit/endpoint": "^7.0.0", + "@octokit/request-error": "^3.0.0", + "@octokit/types": "^9.0.0", + "is-plain-object": "^5.0.0", + "node-fetch": "^2.6.7", + "universal-user-agent": "^6.0.0" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/@octokit/request-error": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-3.0.3.tgz", + "integrity": "sha512-crqw3V5Iy2uOU5Np+8M/YexTlT8zxCfI+qu+LxUB7SZpje4Qmx3mub5DfEKSO8Ylyk0aogi6TYdf6kxzh2BguQ==", + "dependencies": { + "@octokit/types": "^9.0.0", + "deprecation": "^2.0.0", + "once": "^1.4.0" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/@octokit/request-error/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/@octokit/tsconfig": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@octokit/tsconfig/-/tsconfig-1.0.2.tgz", + "integrity": "sha512-I0vDR0rdtP8p2lGMzvsJzbhdOWy405HcGovrspJ8RRibHnyRgggUSNO5AIox5LmqiwmatHKYsvj6VGFHkqS7lA==" + }, + "node_modules/@octokit/types": { + "version": "9.3.2", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-9.3.2.tgz", + "integrity": "sha512-D4iHGTdAnEEVsB8fl95m1hiz7D5YiRdQ9b/OEb3BYRVwbLsGHcRVPz+u+BgRLNk0Q0/4iZCBqDN96j2XNxfXrA==", + "dependencies": { + "@octokit/openapi-types": "^18.0.0" + } + }, + "node_modules/@one-ini/wasm": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@one-ini/wasm/-/wasm-0.1.1.tgz", + "integrity": "sha512-XuySG1E38YScSJoMlqovLru4KTUNSjgVTIjyh7qMX6aNN5HY5Ct5LhRJdxO79JtTzKfzV/bnWpz+zquYrISsvw==", + "dev": true + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@pnpm/config.env-replace": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@pnpm/config.env-replace/-/config.env-replace-1.1.0.tgz", + "integrity": "sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==", + "engines": { + "node": ">=12.22.0" + } + }, + "node_modules/@pnpm/network.ca-file": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@pnpm/network.ca-file/-/network.ca-file-1.0.2.tgz", + "integrity": "sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==", + "dependencies": { + "graceful-fs": "4.2.10" + }, + "engines": { + "node": ">=12.22.0" + } + }, + "node_modules/@pnpm/network.ca-file/node_modules/graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" + }, + "node_modules/@pnpm/npm-conf": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/@pnpm/npm-conf/-/npm-conf-2.2.2.tgz", + "integrity": "sha512-UA91GwWPhFExt3IizW6bOeY/pQ0BkuNwKjk9iQW9KqxluGCrg4VenZ0/L+2Y0+ZOtme72EVvg6v0zo3AMQRCeA==", + "dependencies": { + "@pnpm/config.env-replace": "^1.1.0", + "@pnpm/network.ca-file": "^1.0.1", + "config-chain": "^1.1.11" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@postman/form-data": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@postman/form-data/-/form-data-3.1.1.tgz", + "integrity": "sha512-vjh8Q2a8S6UCm/KKs31XFJqEEgmbjBmpPNVV2eVav6905wyFAwaUOBGA1NPBI4ERH9MMZc6w0umFgM6WbEPMdg==", + "dev": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@postman/tunnel-agent": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/@postman/tunnel-agent/-/tunnel-agent-0.6.3.tgz", + "integrity": "sha512-k57fzmAZ2PJGxfOA4SGR05ejorHbVAa/84Hxh/2nAztjNXc4ZjOm9NUIk6/Z6LCrBvJZqjRZbN8e/nROVUPVdg==", + "dev": true, + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@semantic-release/commit-analyzer": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/@semantic-release/commit-analyzer/-/commit-analyzer-9.0.2.tgz", + "integrity": "sha512-E+dr6L+xIHZkX4zNMe6Rnwg4YQrWNXK+rNsvwOPpdFppvZO1olE2fIgWhv89TkQErygevbjsZFSIxp+u6w2e5g==", + "dependencies": { + "conventional-changelog-angular": "^5.0.0", + "conventional-commits-filter": "^2.0.0", + "conventional-commits-parser": "^3.2.3", + "debug": "^4.0.0", + "import-from": "^4.0.0", + "lodash": "^4.17.4", + "micromatch": "^4.0.2" + }, + "engines": { + "node": ">=14.17" + }, + "peerDependencies": { + "semantic-release": ">=18.0.0-beta.1" + } + }, + "node_modules/@semantic-release/commit-analyzer/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/@semantic-release/commit-analyzer/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/@semantic-release/error": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@semantic-release/error/-/error-3.0.0.tgz", + "integrity": "sha512-5hiM4Un+tpl4cKw3lV4UgzJj+SmfNIDCLLw0TepzQxz9ZGV5ixnqkzIVF+3tp0ZHgcMKE+VNGHJjEeyFG2dcSw==", + "engines": { + "node": ">=14.17" + } + }, + "node_modules/@semantic-release/github": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@semantic-release/github/-/github-8.1.0.tgz", + "integrity": "sha512-erR9E5rpdsz0dW1I7785JtndQuMWN/iDcemcptf67tBNOmBUN0b2YNOgcjYUnBpgRpZ5ozfBHrK7Bz+2ets/Dg==", + "dependencies": { + "@octokit/core": "^4.2.1", + "@octokit/plugin-paginate-rest": "^6.1.2", + "@octokit/plugin-retry": "^4.1.3", + "@octokit/plugin-throttling": "^5.2.3", + "@semantic-release/error": "^3.0.0", + "aggregate-error": "^3.0.0", + "debug": "^4.0.0", + "dir-glob": "^3.0.0", + "fs-extra": "^11.0.0", + "globby": "^11.0.0", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.0", + "issue-parser": "^6.0.0", + "lodash": "^4.17.4", + "mime": "^3.0.0", + "p-filter": "^2.0.0", + "url-join": "^4.0.0" + }, + "engines": { + "node": ">=14.17" + }, + "peerDependencies": { + "semantic-release": ">=18.0.0-beta.1" + } + }, + "node_modules/@semantic-release/github/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/@semantic-release/github/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/@semantic-release/npm": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/@semantic-release/npm/-/npm-9.0.2.tgz", + "integrity": "sha512-zgsynF6McdzxPnFet+a4iO9HpAlARXOM5adz7VGVCvj0ne8wtL2ZOQoDV2wZPDmdEotDIbVeJjafhelZjs9j6g==", + "dependencies": { + "@semantic-release/error": "^3.0.0", + "aggregate-error": "^3.0.0", + "execa": "^5.0.0", + "fs-extra": "^11.0.0", + "lodash": "^4.17.15", + "nerf-dart": "^1.0.0", + "normalize-url": "^6.0.0", + "npm": "^8.3.0", + "rc": "^1.2.8", + "read-pkg": "^5.0.0", + "registry-auth-token": "^5.0.0", + "semver": "^7.1.2", + "tempy": "^1.0.0" + }, + "engines": { + "node": ">=16 || ^14.17" + }, + "peerDependencies": { + "semantic-release": ">=19.0.0" + } + }, + "node_modules/@semantic-release/npm/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==", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@semantic-release/npm/node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "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/@semantic-release/npm/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==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@semantic-release/npm/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==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@semantic-release/npm/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/@semantic-release/npm/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==", + "engines": { + "node": ">=6" + } + }, + "node_modules/@semantic-release/npm/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==", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@semantic-release/npm/node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@semantic-release/npm/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@semantic-release/npm/node_modules/semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@semantic-release/npm/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==", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@semantic-release/npm/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@semantic-release/npm/node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@semantic-release/release-notes-generator": { + "version": "10.0.3", + "resolved": "https://registry.npmjs.org/@semantic-release/release-notes-generator/-/release-notes-generator-10.0.3.tgz", + "integrity": "sha512-k4x4VhIKneOWoBGHkx0qZogNjCldLPRiAjnIpMnlUh6PtaWXp/T+C9U7/TaNDDtgDa5HMbHl4WlREdxHio6/3w==", + "dependencies": { + "conventional-changelog-angular": "^5.0.0", + "conventional-changelog-writer": "^5.0.0", + "conventional-commits-filter": "^2.0.0", + "conventional-commits-parser": "^3.2.3", + "debug": "^4.0.0", + "get-stream": "^6.0.0", + "import-from": "^4.0.0", + "into-stream": "^6.0.0", + "lodash": "^4.17.4", + "read-pkg-up": "^7.0.0" + }, + "engines": { + "node": ">=14.17" + }, + "peerDependencies": { + "semantic-release": ">=18.0.0-beta.1" + } + }, + "node_modules/@semantic-release/release-notes-generator/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/@semantic-release/release-notes-generator/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==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@semantic-release/release-notes-generator/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/@sentry-internal/tracing": { + "version": "7.105.0", + "resolved": "https://registry.npmjs.org/@sentry-internal/tracing/-/tracing-7.105.0.tgz", + "integrity": "sha512-b+AFYB7Bc9vmyxl2jbmuT4esX5G0oPfpz35A0sxFzmJIhvMg1YMDNio2c81BtKN+VSPORCnKMLhfk3kyKKvWMQ==", + "dev": true, + "dependencies": { + "@sentry/core": "7.105.0", + "@sentry/types": "7.105.0", + "@sentry/utils": "7.105.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@sentry/core": { + "version": "7.105.0", + "resolved": "https://registry.npmjs.org/@sentry/core/-/core-7.105.0.tgz", + "integrity": "sha512-5xsaTG6jZincTeJUmZomlv20mVRZUEF1U/g89lmrSOybyk2+opEnB1JeBn4ODwnvmSik8r2QLr6/RiYlaxRJCg==", + "dev": true, + "dependencies": { + "@sentry/types": "7.105.0", + "@sentry/utils": "7.105.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@sentry/node": { + "version": "7.105.0", + "resolved": "https://registry.npmjs.org/@sentry/node/-/node-7.105.0.tgz", + "integrity": "sha512-b0QwZ7vT4hcJi6LmNRh3dcaYpLtXnkYXkL0rfhMb8hN8sUx8zuOWFMI7j0cfAloVThUeJVwGyv9dERfzGS2r2w==", + "dev": true, + "dependencies": { + "@sentry-internal/tracing": "7.105.0", + "@sentry/core": "7.105.0", + "@sentry/types": "7.105.0", + "@sentry/utils": "7.105.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@sentry/types": { + "version": "7.105.0", + "resolved": "https://registry.npmjs.org/@sentry/types/-/types-7.105.0.tgz", + "integrity": "sha512-80o0KMVM+X2Ym9hoQxvJetkJJwkpCg7o6tHHFXI+Rp7fawc2iCMTa0IRQMUiSkFvntQLYIdDoNNuKdzz2PbQGA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@sentry/utils": { + "version": "7.105.0", + "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-7.105.0.tgz", + "integrity": "sha512-YVAV0c2KLM8+VZCicQ/E/P2+J9Vs0hGhrXwV7w6ZEAtvxrg4oF270toL1WRhvcaf8JO4J1v4V+LuU6Txs4uEeQ==", + "dev": true, + "dependencies": { + "@sentry/types": "7.105.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@sinonjs/commons": { + "version": "1.8.6", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.6.tgz", + "integrity": "sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==", + "dev": true, + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/formatio": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@sinonjs/formatio/-/formatio-3.2.2.tgz", + "integrity": "sha512-B8SEsgd8gArBLMD6zpRw3juQ2FVSsmdd7qlevyDqzS9WTCtvF55/gAL+h6gue8ZvPYcdiPdvueM/qm//9XzyTQ==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^1", + "@sinonjs/samsam": "^3.1.0" + } + }, + "node_modules/@sinonjs/samsam": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-3.3.3.tgz", + "integrity": "sha512-bKCMKZvWIjYD0BLGnNrxVuw4dkWCYsLqFOUWw8VgKF/+5Y+mE7LfHWPIYoDXowH+3a9LsWDMo0uAP8YDosPvHQ==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^1.3.0", + "array-from": "^2.1.1", + "lodash": "^4.17.15" + } + }, + "node_modules/@sinonjs/text-encoding": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.2.tgz", + "integrity": "sha512-sXXKG+uL9IrKqViTtao2Ws6dy0znu9sOaP1di/jKGW1M6VssO8vlpXCQcpZ+jisQ1tTFAC5Jo/EOzFbggBagFQ==", + "dev": true + }, + "node_modules/@tootallnate/once": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", + "optional": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@types/chai": { + "version": "4.3.12", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.12.tgz", + "integrity": "sha512-zNKDHG/1yxm8Il6uCCVsm+dRdEsJlFoDu73X17y09bId6UwoYww+vFBsAcRzl8knM1sab3Dp1VRikFQwDOtDDw==", + "dev": true + }, + "node_modules/@types/cookiejar": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@types/cookiejar/-/cookiejar-2.1.5.tgz", + "integrity": "sha512-he+DHOWReW0nghN24E1WUqM0efK4kI9oTqDm6XmK8ZPe2djZ90BSNdGnIyCLzCPw7/pogPlGbzI2wHGGmi4O/Q==", + "dev": true + }, + "node_modules/@types/debug": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", + "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", + "dependencies": { + "@types/ms": "*" + } + }, + "node_modules/@types/minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==" + }, + "node_modules/@types/ms": { + "version": "0.7.34", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz", + "integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==" + }, + "node_modules/@types/node": { + "version": "20.11.24", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.24.tgz", + "integrity": "sha512-Kza43ewS3xoLgCEpQrsT+xRo/EJej1y0kVYGiLFE1NEODXGzTfwiC6tXTLMQskn1X4/Rjlh0MQUvx9W+L9long==", + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@types/normalize-package-data": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz", + "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==" + }, + "node_modules/@types/parse-json": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", + "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==" + }, + "node_modules/@types/superagent": { + "version": "3.8.7", + "resolved": "https://registry.npmjs.org/@types/superagent/-/superagent-3.8.7.tgz", + "integrity": "sha512-9KhCkyXv268A2nZ1Wvu7rQWM+BmdYUVkycFeNnYrUL5Zwu7o8wPQ3wBfW59dDP+wuoxw0ww8YKgTNv8j/cgscA==", + "dev": true, + "dependencies": { + "@types/cookiejar": "*", + "@types/node": "*" + } + }, + "node_modules/@types/validator": { + "version": "13.11.9", + "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.11.9.tgz", + "integrity": "sha512-FCTsikRozryfayPuiI46QzH3fnrOoctTjvOYZkho9BTFLCOZ2rgZJHMOVgCOfttjPJcgOx52EpkY0CMfy87MIw==" + }, + "node_modules/@ungap/promise-all-settled": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz", + "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==", + "dev": true + }, + "node_modules/abbrev": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-2.0.0.tgz", + "integrity": "sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "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": "7.1.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.1.tgz", + "integrity": "sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "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/afterward": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/afterward/-/afterward-2.0.0.tgz", + "integrity": "sha512-7n9Vkbb8cmMRKKSfe5qgyqX4Yjdaty0QP/+GXYawZK8Vcq+8E5FCmbWbwfCoiBnDoAY/edKLNg2TwgGcwdA+3Q==", + "dependencies": { + "define-error": "~1.0.0" + } + }, + "node_modules/agent-base": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.0.tgz", + "integrity": "sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==", + "dependencies": { + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/agent-base/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/agent-base/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/agentkeepalive": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.5.0.tgz", + "integrity": "sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==", + "optional": true, + "dependencies": { + "humanize-ms": "^1.2.1" + }, + "engines": { + "node": ">= 8.0.0" + } + }, + "node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "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/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-escapes": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", + "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "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==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "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/ansicolors": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/ansicolors/-/ansicolors-0.3.2.tgz", + "integrity": "sha512-QXu7BPrP29VllRxH8GwB7x5iX5qWKAAMLqKQGWTeLWVlNHNOpVMJ91dsxQAIWXpjuW5wqvxu3Jd/nRjrJ+0pqg==" + }, + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==" + }, + "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/append-field": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/append-field/-/append-field-1.0.0.tgz", + "integrity": "sha512-klpgFSWLW1ZEs8svjfb7g4qWY0YS5imI82dTg+QahUvJ8YqAY0P10Uk8tTyh9ZGuYEZEMaeJYCF5BFuX552hsw==" + }, + "node_modules/append-transform": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-2.0.0.tgz", + "integrity": "sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==", + "dev": true, + "dependencies": { + "default-require-extensions": "^3.0.0" + }, + "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==", + "optional": true + }, + "node_modules/archy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", + "integrity": "sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==", + "dev": true + }, + "node_modules/are-we-there-yet": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz", + "integrity": "sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==", + "optional": true, + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "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==", + "optional": 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/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==", + "optional": true, + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/argv-formatter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/argv-formatter/-/argv-formatter-1.0.0.tgz", + "integrity": "sha512-F2+Hkm9xFaRg+GkaNnbwXNDV5O6pnCFEmqyhvfC/Ic5LbgOWjJh3L+mN/s91rxVL3znE7DYVpW0GJFT+4YBgWw==" + }, + "node_modules/argv-tools": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/argv-tools/-/argv-tools-0.1.2.tgz", + "integrity": "sha512-wxqoymY0BEu9NblZVQiOTOAiJUjPhaa/kbNMjC2h6bnrmUSgnxKgWJo3lzXvi3bHJRwXyqK/dHzMlZVRT89Cxg==", + "dependencies": { + "array-back": "^2.0.0", + "find-replace": "^2.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/array-back": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/array-back/-/array-back-2.0.0.tgz", + "integrity": "sha512-eJv4pLLufP3g5kcZry0j6WXpIbzYw9GUB4mVJZno9wfwiBxbizTnHCw3VJb07cBihbFX48Y7oSrW9y+gt4glyw==", + "dependencies": { + "typical": "^2.6.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", + "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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-from": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/array-from/-/array-from-2.1.1.tgz", + "integrity": "sha512-GQTc6Uupx1FCavi5mPzBvVT7nEOeWMmUA9P95wpfpW1XwMSKs+KaymD5C2Up7KAUKg/mYwbsUYzdZWcoajlNZg==", + "dev": true + }, + "node_modules/array-ify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz", + "integrity": "sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==" + }, + "node_modules/array-includes": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.7.tgz", + "integrity": "sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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/arraybuffer.prototype.slice": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", + "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.2.1", + "get-intrinsic": "^1.2.3", + "is-array-buffer": "^3.0.4", + "is-shared-array-buffer": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/asn1": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", + "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", + "dependencies": { + "safer-buffer": "~2.1.0" + } + }, + "node_modules/assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", + "engines": { + "node": ">=0.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/astral-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", + "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/async": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz", + "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==" + }, + "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/atomic-sleep": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/atomic-sleep/-/atomic-sleep-1.0.0.tgz", + "integrity": "sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dev": true, + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", + "engines": { + "node": "*" + } + }, + "node_modules/aws4": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz", + "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==" + }, + "node_modules/axios": { + "version": "1.0.0-alpha.1", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.0.0-alpha.1.tgz", + "integrity": "sha512-p+meG161943WT+K7sJYquHR46xxi/z0tk7vnSmEf/LrfEAyiP+0uTMMYk1OEo1IRF18oGRhnFxN1y8fLcXaTMw==", + "dependencies": { + "follow-redirects": "^1.15.0", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/babel-code-frame": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", + "integrity": "sha512-XqYMR2dfdGMW+hd0IUZ2PwK+fGeFkOxZJ0wY+JaQAHzt1Zx8LcvpiZD2NiGkEG8qx0CfkAOr5xt76d1e8vG90g==", + "dev": true, + "dependencies": { + "chalk": "^1.1.3", + "esutils": "^2.0.2", + "js-tokens": "^3.0.2" + } + }, + "node_modules/babel-code-frame/node_modules/ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/babel-code-frame/node_modules/chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", + "dev": true, + "dependencies": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/babel-code-frame/node_modules/js-tokens": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", + "integrity": "sha512-RjTcuD4xjtthQkaWH7dFlH85L+QaVtSoOyGdZ3g6HFhS9dFNDfLyqgm2NFe2X6cQpeFmt0452FJjFG5UameExg==", + "dev": true + }, + "node_modules/babel-code-frame/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==", + "dev": true, + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/babel-code-frame/node_modules/supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha512-ITKNuq2wKlW1fJg9sSW52eepoYgZBggvOAHC0u/CYu/qxQ9EVzThCgR69BnSXLHjy2f7SY5zaQ4yt7H9ZVxY2g==", + "dependencies": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.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/basic-auth": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", + "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", + "dependencies": { + "safe-buffer": "5.1.2" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/basic-auth/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/bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", + "dependencies": { + "tweetnacl": "^0.14.3" + } + }, + "node_modules/bdd-lazy-var": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/bdd-lazy-var/-/bdd-lazy-var-2.5.2.tgz", + "integrity": "sha512-EBFk8uOTALu8crLChd+KfhHwv+frhxqE235jcy6NY1G1weB0Gyr5H7u0zvUnr1yduzX6M1I/ERaVGdY1cd+6ZQ==", + "dev": true + }, + "node_modules/before-after-hook": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.3.tgz", + "integrity": "sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==" + }, + "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/bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "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/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/bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" + }, + "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/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/boolean": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/boolean/-/boolean-3.2.0.tgz", + "integrity": "sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==", + "dev": true + }, + "node_modules/bottleneck": { + "version": "2.19.5", + "resolved": "https://registry.npmjs.org/bottleneck/-/bottleneck-2.19.5.tgz", + "integrity": "sha512-VHiNCbI1lKdl44tGrhNfU3lup0Tj/ZBMJB5/2ZbNXRCPuRCO7ed2mgcK4r17y+KB2EfuYuRaVlwNbAeaWGSpbw==" + }, + "node_modules/bowser": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.11.0.tgz", + "integrity": "sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==" + }, + "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/brotli": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/brotli/-/brotli-1.3.3.tgz", + "integrity": "sha512-oTKjJdShmDuGW94SyyaoQvAjf30dZaHnjJ8uAF+u2/vGJkJbJPJAT1gDiOJP5v1Zb6f9KEyW/1HpuaWIXtGHPg==", + "dev": true, + "dependencies": { + "base64-js": "^1.1.2" + } + }, + "node_modules/browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", + "dev": true + }, + "node_modules/browserslist": { + "version": "4.23.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz", + "integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001587", + "electron-to-chromium": "^1.4.668", + "node-releases": "^2.0.14", + "update-browserslist-db": "^1.0.13" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "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-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "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/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/cacache": { + "version": "15.3.0", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.3.0.tgz", + "integrity": "sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==", + "optional": true, + "dependencies": { + "@npmcli/fs": "^1.0.0", + "@npmcli/move-file": "^1.0.1", + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "glob": "^7.1.4", + "infer-owner": "^1.0.4", + "lru-cache": "^6.0.0", + "minipass": "^3.1.1", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.2", + "mkdirp": "^1.0.3", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^8.0.1", + "tar": "^6.0.2", + "unique-filename": "^1.1.1" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/cacache/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==", + "optional": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/cacache/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "optional": true, + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/cacache/node_modules/p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "optional": true, + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cacache/node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "optional": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/caching-transform": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-4.0.0.tgz", + "integrity": "sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==", + "dev": true, + "dependencies": { + "hasha": "^5.0.0", + "make-dir": "^3.0.0", + "package-hash": "^4.0.0", + "write-file-atomic": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/call-bind": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/caller-path": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", + "integrity": "sha512-UJiE1otjXPF5/x+T3zTnSFiTOEmJoGTD9HmBoxnCUwho61a2eSNn/VwtwuIBDAo2SEOv1AJ7ARI5gCmohFLu/g==", + "dev": true, + "dependencies": { + "callsites": "^0.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/caller-path/node_modules/callsites": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz", + "integrity": "sha512-Zv4Dns9IbXXmPkgRRUjAaJQgfN4xX5p6+RQFhWUqscdvvK2xK/ZL8b3IXIJsj+4sD+f24NwnWy2BY8AJ82JB0A==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase-keys": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", + "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", + "dependencies": { + "camelcase": "^5.3.1", + "map-obj": "^4.0.0", + "quick-lru": "^4.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/camelize": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/camelize/-/camelize-1.0.0.tgz", + "integrity": "sha512-W2lPwkBkMZwFlPCXhIlYgxu+7gC/NUlCtdK652DAJ1JdgV0sTrvuPFshNPrFa1TY2JOkLhgdeEBplB4ezEa+xg==" + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001593", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001593.tgz", + "integrity": "sha512-UWM1zlo3cZfkpBysd7AS+z+v007q9G1+fLTUU42rQnY6t2axoogPW/xol6T7juU5EUoOhML4WgBIdG+9yYqAjQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "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/cardinal": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/cardinal/-/cardinal-2.1.1.tgz", + "integrity": "sha512-JSr5eOgoEymtYHBjNWyjrMqet9Am2miJhlfKNdqLp6zoeAh0KN5dRAcxlecj5mAJrmQomgiOBj35xHLrFjqBpw==", + "dependencies": { + "ansicolors": "~0.3.2", + "redeyed": "~2.1.0" + }, + "bin": { + "cdl": "bin/cdl.js" + } + }, + "node_modules/caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" + }, + "node_modules/chai": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.2.0.tgz", + "integrity": "sha512-XQU3bhBukrOsQCuwZndwGcCVQHyZi53fQ6Ys1Fym7E4olpIqqZZhhoFJoaKVvV17lWQoXYwgWN2nF5crA8J2jw==", + "dev": true, + "dependencies": { + "assertion-error": "^1.1.0", + "check-error": "^1.0.2", + "deep-eql": "^3.0.1", + "get-func-name": "^2.0.0", + "pathval": "^1.1.0", + "type-detect": "^4.0.5" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chai-as-promised": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/chai-as-promised/-/chai-as-promised-7.1.1.tgz", + "integrity": "sha512-azL6xMoi+uxu6z4rhWQ1jbdUhOMhis2PvscD/xjLqNMkv3BPPp2JyyuTHOrf9BOosGpNQ11v6BKv/g57RXbiaA==", + "dev": true, + "dependencies": { + "check-error": "^1.0.2" + }, + "peerDependencies": { + "chai": ">= 2.1.2 < 5" + } + }, + "node_modules/chai-http": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/chai-http/-/chai-http-4.2.1.tgz", + "integrity": "sha512-S2Ezy5uSVuOYleeXppfUKtTU/xbHCZyKkwjheNJ/76SGFTUPDpDkkpVdPNgC3sAO1Ap5J5LJ+/rXdLG8EGhCDA==", + "dev": true, + "dependencies": { + "@types/chai": "4", + "@types/superagent": "^3.8.3", + "cookiejar": "^2.1.1", + "is-ip": "^2.0.0", + "methods": "^1.1.2", + "qs": "^6.5.1", + "superagent": "^3.7.0" + }, + "engines": { + "node": ">=4" + } + }, + "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/chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "dev": true + }, + "node_modules/charenc": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", + "integrity": "sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/charset": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/charset/-/charset-1.0.1.tgz", + "integrity": "sha512-6dVyOOYjpfFcL1Y4qChrAoQLRHvj2ziyhcm0QJlhOcAhykL/k1kTUPbeo+87MNRTRdk2OIIsIXbuF3x2wi5EXg==", + "dev": true, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/check-error": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz", + "integrity": "sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==", + "dev": true, + "dependencies": { + "get-func-name": "^2.0.2" + }, + "engines": { + "node": "*" + } + }, + "node_modules/child_process": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/child_process/-/child_process-1.0.2.tgz", + "integrity": "sha512-Wmza/JzL0SiWz7kl6MhIKT5ceIlnFPJX+lwUGj7Clhy5MMldsSoJR0+uvRzOS5Kv45Mq7t1PoE8TsOA9bzvb6g==" + }, + "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/circular-json": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz", + "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==", + "deprecated": "CircularJSON is in maintenance only, flatted is its successor.", + "dev": true + }, + "node_modules/clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "engines": { + "node": ">=6" + } + }, + "node_modules/cli-color": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/cli-color/-/cli-color-1.4.0.tgz", + "integrity": "sha512-xu6RvQqqrWEo6MPR1eixqGPywhYBHRs653F9jfXB2Hx4jdM/3WxiNE1vppRmxtMIfl16SFYTpYlrnqH/HsK/2w==", + "dev": true, + "dependencies": { + "ansi-regex": "^2.1.1", + "d": "1", + "es5-ext": "^0.10.46", + "es6-iterator": "^2.0.3", + "memoizee": "^0.4.14", + "timers-ext": "^0.1.5" + } + }, + "node_modules/cli-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==", + "dev": true, + "dependencies": { + "restore-cursor": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cli-progress": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/cli-progress/-/cli-progress-3.10.0.tgz", + "integrity": "sha512-kLORQrhYCAtUPLZxqsAt2YJGOvRdt34+O6jl5cQGb7iF3dM55FQZlTR+rQyIK9JUcO9bBMwZsTlND+3dmFU2Cw==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cli-progress/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==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-progress/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-progress/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==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-progress/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==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-table3": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.1.tgz", + "integrity": "sha512-w0q/enDHhPLq44ovMGdQeeDLvwxwavsJX7oQGYt/LrBlYsyaxyDnp6z3QzFut/6kLLKnlcUVJLrpB7KBfgG/RA==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0" + }, + "engines": { + "node": "10.* || >= 12.*" + }, + "optionalDependencies": { + "colors": "1.4.0" + } + }, + "node_modules/cli-table3/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==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-table3/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-table3/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==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-table3/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==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-width": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz", + "integrity": "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==", + "dev": true + }, + "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/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/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/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/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==", + "optional": true, + "bin": { + "color-support": "bin.js" + } + }, + "node_modules/colors": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", + "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", + "dev": true, + "engines": { + "node": ">=0.1.90" + } + }, + "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/command-line-args": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-5.0.2.tgz", + "integrity": "sha512-/qPcbL8zpqg53x4rAaqMFlRV4opN3pbla7I7k9x8kyOBMQoGT6WltjN6sXZuxOXw6DgdK7Ad+ijYS5gjcr7vlA==", + "dependencies": { + "argv-tools": "^0.1.1", + "array-back": "^2.0.0", + "find-replace": "^2.0.1", + "lodash.camelcase": "^4.3.0", + "typical": "^2.6.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/command-line-usage": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-5.0.5.tgz", + "integrity": "sha512-d8NrGylA5oCXSbGoKz05FkehDAzSmIm4K03S5VDh4d5lZAtTWfc3D1RuETtuQCn8129nYfJfDdF7P/lwcz1BlA==", + "dependencies": { + "array-back": "^2.0.0", + "chalk": "^2.4.1", + "table-layout": "^0.4.3", + "typical": "^2.6.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", + "dev": true + }, + "node_modules/compare-func": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-2.0.0.tgz", + "integrity": "sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==", + "dependencies": { + "array-ify": "^1.0.0", + "dot-prop": "^5.1.0" + } + }, + "node_modules/component-emitter": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.1.tgz", + "integrity": "sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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/concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "engines": [ + "node >= 0.8" + ], + "dependencies": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "node_modules/concat-stream/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/concat-stream/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/concat-stream/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/concat-stream/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/concurrent-queue": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/concurrent-queue/-/concurrent-queue-7.0.2.tgz", + "integrity": "sha512-icXDqc0JBdcQ3ubXiXcqVhuFeRrec39zVD2X5z7FKwwj0pImnfLWtAhGyX4CcBDD+YoqLesClOeRss+pZnm6/Q==", + "dependencies": { + "afterward": "~2.0.0", + "define-error": "~1.0.0", + "eventuate": "~4.0.0", + "object-assign": "~4.0.1", + "on-error": "~2.1.0", + "once": "~1.3.2", + "promise-polyfill": "~2.1.0" + } + }, + "node_modules/config-chain": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", + "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", + "dependencies": { + "ini": "^1.3.4", + "proto-list": "~1.2.1" + } + }, + "node_modules/config-chain/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/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==", + "optional": true + }, + "node_modules/contains-path": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", + "integrity": "sha512-OKZnPGeMQy2RPaUIBPFFd71iNf4791H12MCRuVQDnzGRwCYNYmTDy5pdafo2SLAcEMKzTOQnLWG4QdcjeJUMEg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "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-security-policy-builder": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/content-security-policy-builder/-/content-security-policy-builder-2.1.0.tgz", + "integrity": "sha512-/MtLWhJVvJNkA9dVLAp6fg9LxD2gfI6R2Fi1hPmfjYXSahJJzcfvoeDOxSyp4NvxMuwWv3WMssE9o31DoULHrQ==", + "engines": { + "node": ">=4.0.0" + } + }, + "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/conventional-changelog-angular": { + "version": "5.0.13", + "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-5.0.13.tgz", + "integrity": "sha512-i/gipMxs7s8L/QeuavPF2hLnJgH6pEZAttySB6aiQLWcX3puWDL3ACVmvBhJGxnAy52Qc15ua26BufY6KpmrVA==", + "dependencies": { + "compare-func": "^2.0.0", + "q": "^1.5.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/conventional-changelog-writer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-5.0.1.tgz", + "integrity": "sha512-5WsuKUfxW7suLblAbFnxAcrvf6r+0b7GvNaWUwUIk0bXMnENP/PEieGKVUQrjPqwPT4o3EPAASBXiY6iHooLOQ==", + "dependencies": { + "conventional-commits-filter": "^2.0.7", + "dateformat": "^3.0.0", + "handlebars": "^4.7.7", + "json-stringify-safe": "^5.0.1", + "lodash": "^4.17.15", + "meow": "^8.0.0", + "semver": "^6.0.0", + "split": "^1.0.0", + "through2": "^4.0.0" + }, + "bin": { + "conventional-changelog-writer": "cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/conventional-changelog-writer/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/conventional-commits-filter": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-2.0.7.tgz", + "integrity": "sha512-ASS9SamOP4TbCClsRHxIHXRfcGCnIoQqkvAzCSbZzTFLfcTqJVugB0agRgsEELsqaeWgsXv513eS116wnlSSPA==", + "dependencies": { + "lodash.ismatch": "^4.4.0", + "modify-values": "^1.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/conventional-commits-parser": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-3.2.4.tgz", + "integrity": "sha512-nK7sAtfi+QXbxHCYfhpZsfRtaitZLIA6889kFIouLvz6repszQDgxBu7wf2WbU+Dco7sAnNCJYERCwt54WPC2Q==", + "dependencies": { + "is-text-path": "^1.0.1", + "JSONStream": "^1.0.4", + "lodash": "^4.17.15", + "meow": "^8.0.0", + "split2": "^3.0.0", + "through2": "^4.0.0" + }, + "bin": { + "conventional-commits-parser": "cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "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.3.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", + "integrity": "sha512-+IJOX0OqlHCszo2mBUq+SrEbCj6w7Kpffqx60zYbPTFaO4+yYgRjHwcZNpWvaTylDHaV7PPmBHzSecZiMhtPgw==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-parser": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.4.3.tgz", + "integrity": "sha512-EZyO2G+zVFsMjU8jDtxs2iLS1DmryYNjC0s4/IHtsS6pWPUJSr0kt0UPOctRZosebPHYekb7bNcIBt4YW0S9bg==", + "dependencies": { + "cookie": "0.3.1", + "cookie-signature": "1.0.6" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "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/cookiejar": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.4.tgz", + "integrity": "sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==", + "dev": true + }, + "node_modules/core-js": { + "version": "2.6.12", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz", + "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==", + "deprecated": "core-js@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js.", + "hasInstallScript": 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/cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/cosmiconfig": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", + "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dependencies": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "engines": { + "node": ">=4.8" + } + }, + "node_modules/crypt": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz", + "integrity": "sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/crypto-random-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", + "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/csv-parse": { + "version": "4.16.3", + "resolved": "https://registry.npmjs.org/csv-parse/-/csv-parse-4.16.3.tgz", + "integrity": "sha512-cO1I/zmz4w2dcKHVvpCr7JVRu8/FymG5OEpmvsZYlccYolPBLoVGKUHgNoc4ZGkFeFlWGEDmMyBM+TTqRdW/wg==", + "dev": true + }, + "node_modules/d": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.2.tgz", + "integrity": "sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw==", + "dev": true, + "dependencies": { + "es5-ext": "^0.10.64", + "type": "^2.7.2" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/daemonize2": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/daemonize2/-/daemonize2-0.4.2.tgz", + "integrity": "sha512-dzB3qdxvcJ2AWyESI8xv90qZ4wZt4P+lvQUT1sVKcrbEKSvBk/8zkDlZvMyaWmoKe7DXLGu00z59b7K9gkzbqQ==", + "engines": { + "node": ">0.8.x" + } + }, + "node_modules/dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", + "dependencies": { + "assert-plus": "^1.0.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/dasherize": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dasherize/-/dasherize-2.0.0.tgz", + "integrity": "sha512-APql/TZ6FdLEpf2z7/X2a2zyqK8juYtqaSVqxw9mYoQ64CXkfU15AeLh8pUszT8+fnYjgm6t0aIYpWKJbnLkuA==" + }, + "node_modules/dateformat": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz", + "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==", + "engines": { + "node": "*" + } + }, + "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/debug-log": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/debug-log/-/debug-log-1.0.1.tgz", + "integrity": "sha512-gV/pe1YIaKNgLYnd1g9VNW80tcb7oV5qvNUxG7NM8rbDpnl6RGunzlAtlGSb0wEs3nesu2vHNiX9TSsZ+Y+RjA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "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/decamelize-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.1.tgz", + "integrity": "sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==", + "dependencies": { + "decamelize": "^1.1.0", + "map-obj": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/decamelize-keys/node_modules/map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==", + "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==", + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/deep-eql": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", + "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", + "dev": true, + "dependencies": { + "type-detect": "^4.0.0" + }, + "engines": { + "node": ">=0.12" + } + }, + "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/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/default-require-extensions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-3.0.1.tgz", + "integrity": "sha512-eXTJmRbm2TIt9MgWTsOH1wEuhew6XGZcMeGKCtLedIg/NCsg1iBePXkceTdK4Fii7pzmN9tGsZhKzZ4h7O/fxw==", + "dev": true, + "dependencies": { + "strip-bom": "^4.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-error": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-error/-/define-error-1.0.0.tgz", + "integrity": "sha512-HLdUb9mNENZ/tjnZGlITfOnx7wSM7a6e+WEDyhKSrsN/g5dJUS6kepG6qJApRLAdjRofQ2W8R3yrtI6GeyGGVg==", + "dependencies": { + "capture-stack-trace": "~1.0.0" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dev": true, + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/deglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/deglob/-/deglob-2.1.1.tgz", + "integrity": "sha512-2kjwuGGonL7gWE1XU4Fv79+vVzpoQCl0V+boMwWtOQJV2AGDabCwez++nB1Nli/8BabAfZQ/UuHPlp6AymKdWw==", + "dev": true, + "dependencies": { + "find-root": "^1.0.0", + "glob": "^7.0.5", + "ignore": "^3.0.9", + "pkg-config": "^1.1.0", + "run-parallel": "^1.1.2", + "uniq": "^1.0.1" + } + }, + "node_modules/deglob/node_modules/ignore": { + "version": "3.3.10", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", + "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==", + "dev": true + }, + "node_modules/del": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/del/-/del-6.1.1.tgz", + "integrity": "sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg==", + "dependencies": { + "globby": "^11.0.1", + "graceful-fs": "^4.2.4", + "is-glob": "^4.0.1", + "is-path-cwd": "^2.2.0", + "is-path-inside": "^3.0.2", + "p-map": "^4.0.0", + "rimraf": "^3.0.2", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/del/node_modules/p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/del/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/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==", + "optional": true + }, + "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/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/deprecation": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz", + "integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==" + }, + "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/detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", + "dev": true + }, + "node_modules/diff": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", + "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", + "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/dns-prefetch-control": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/dns-prefetch-control/-/dns-prefetch-control-0.2.0.tgz", + "integrity": "sha512-hvSnros73+qyZXhHFjx2CMLwoj3Fe7eR9EJsFsqmcI1bB2OBWL/+0YzaEaKssCHnj/6crawNnUyw74Gm2EKe+Q==", + "engines": { + "node": ">=4.0.0" + } + }, + "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/dont-sniff-mimetype": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/dont-sniff-mimetype/-/dont-sniff-mimetype-1.1.0.tgz", + "integrity": "sha512-ZjI4zqTaxveH2/tTlzS1wFp+7ncxNZaIEWYg3lzZRHkKf5zPT/MnEG6WL0BhHMJUabkh8GeU5NL5j+rEUCb7Ug==", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/dot-prop": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", + "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", + "dependencies": { + "is-obj": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dottie": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/dottie/-/dottie-2.0.6.tgz", + "integrity": "sha512-iGCHkfUc5kFekGiqhe8B/mdaurD+lakO9txNnTvKtA6PISrw86LgqHvRzWYPyoE2Ph5aMIrCw9/uko6XHTKCwA==" + }, + "node_modules/duplexer2": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", + "integrity": "sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==", + "dependencies": { + "readable-stream": "^2.0.2" + } + }, + "node_modules/duplexer2/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/duplexer2/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/duplexer2/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/duplexer2/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/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/ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", + "dependencies": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "node_modules/ecc-jsbn/node_modules/jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==" + }, + "node_modules/editorconfig": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/editorconfig/-/editorconfig-1.0.4.tgz", + "integrity": "sha512-L9Qe08KWTlqYMVvMcTIvMAdl1cDUubzRNYL+WfA4bLDMHe4nemKkpmYzkznE1FwLKu0EEmy6obgQKzMJrg4x9Q==", + "dev": true, + "dependencies": { + "@one-ini/wasm": "0.1.1", + "commander": "^10.0.0", + "minimatch": "9.0.1", + "semver": "^7.5.3" + }, + "bin": { + "editorconfig": "bin/editorconfig" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/editorconfig/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/editorconfig/node_modules/commander": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", + "dev": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/editorconfig/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/editorconfig/node_modules/minimatch": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.1.tgz", + "integrity": "sha512-0jWhJpD/MdhPXwPuiRkCbfYfSKp2qnn2eOc279qI7f+osl/l+prKSrvhg157zSYvx/1nmgn2NqdT6k2Z7zSH9w==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/editorconfig/node_modules/semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "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/ejs": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.7.tgz", + "integrity": "sha512-BIar7R6abbUxDA3bfXrO4DSgwo8I+fB5/1zgujl3HLLjwd6+9iOnrT+t3grn2qbk9vOgBubXOFwX2m9axoFaGw==", + "dependencies": { + "jake": "^10.8.5" + }, + "bin": { + "ejs": "bin/cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.4.691", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.691.tgz", + "integrity": "sha512-vJ+/LmKja/St8Ofq4JGMFVZuwG7ECU6akjNSn2/g6nv8xbIBOWGlEs+WA8/3XaWkU0Nlyu0iFGgOxC4mpgFjgA==", + "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/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/encoding": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", + "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", + "optional": true, + "dependencies": { + "iconv-lite": "^0.6.2" + } + }, + "node_modules/encoding/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "optional": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "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/end-of-stream/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/env-ci": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/env-ci/-/env-ci-5.5.0.tgz", + "integrity": "sha512-o0JdWIbOLP+WJKIUt36hz1ImQQFuN92nhsfTkHHap+J8CiI8WgGpH/a9jEGHh4/TU5BUUGjlnKXNoDb57+ne+A==", + "dependencies": { + "execa": "^5.0.0", + "fromentries": "^1.3.2", + "java-properties": "^1.0.0" + }, + "engines": { + "node": ">=10.17" + } + }, + "node_modules/env-ci/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==", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/env-ci/node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "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/env-ci/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==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/env-ci/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==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/env-ci/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==", + "engines": { + "node": ">=6" + } + }, + "node_modules/env-ci/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==", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/env-ci/node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/env-ci/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/env-ci/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==", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/env-ci/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/env-ci/node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "optional": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/err-code": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", + "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", + "optional": true + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-abstract": { + "version": "1.22.5", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.5.tgz", + "integrity": "sha512-oW69R+4q2wG+Hc3KZePPZxOiisRIqfKBVo/HLx94QcJeWGU/8sZhCvc829rd1kS366vlJbzBfXf9yWwf0+Ko7w==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "arraybuffer.prototype.slice": "^1.0.3", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "es-set-tostringtag": "^2.0.3", + "es-to-primitive": "^1.2.1", + "function.prototype.name": "^1.1.6", + "get-intrinsic": "^1.2.4", + "get-symbol-description": "^1.0.2", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.0.3", + "has-symbols": "^1.0.3", + "hasown": "^2.0.1", + "internal-slot": "^1.0.7", + "is-array-buffer": "^3.0.4", + "is-callable": "^1.2.7", + "is-negative-zero": "^2.0.3", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.3", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.13", + "is-weakref": "^1.0.2", + "object-inspect": "^1.13.1", + "object-keys": "^1.1.1", + "object.assign": "^4.1.5", + "regexp.prototype.flags": "^1.5.2", + "safe-array-concat": "^1.1.0", + "safe-regex-test": "^1.0.3", + "string.prototype.trim": "^1.2.8", + "string.prototype.trimend": "^1.0.7", + "string.prototype.trimstart": "^1.0.7", + "typed-array-buffer": "^1.0.2", + "typed-array-byte-length": "^1.0.1", + "typed-array-byte-offset": "^1.0.2", + "typed-array-length": "^1.0.5", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "dependencies": { + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", + "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.4", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es5-ext": { + "version": "0.10.64", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.64.tgz", + "integrity": "sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.3", + "esniff": "^2.0.1", + "next-tick": "^1.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/es6-error": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", + "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", + "dev": true + }, + "node_modules/es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==", + "dev": true, + "dependencies": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, + "node_modules/es6-symbol": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.4.tgz", + "integrity": "sha512-U9bFFjX8tFiATgtkJ1zg25+KviIXpgRvRHS8sau3GfhVzThRQrOeksPeT0BWW2MNZs1OEWJ1DPXOQMn0KKRkvg==", + "dev": true, + "dependencies": { + "d": "^1.0.2", + "ext": "^1.7.0" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/es6-weak-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.3.tgz", + "integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==", + "dev": true, + "dependencies": { + "d": "1", + "es5-ext": "^0.10.46", + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.1" + } + }, + "node_modules/escalade": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", + "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", + "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/eslint": { + "version": "5.14.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-5.14.1.tgz", + "integrity": "sha512-CyUMbmsjxedx8B0mr79mNOqetvkbij/zrXnFeK2zc3pGRn3/tibjiNAv/3UxFEyfMDjh+ZqTrJrEGBFiGfD5Og==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "ajv": "^6.9.1", + "chalk": "^2.1.0", + "cross-spawn": "^6.0.5", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "eslint-scope": "^4.0.0", + "eslint-utils": "^1.3.1", + "eslint-visitor-keys": "^1.0.0", + "espree": "^5.0.1", + "esquery": "^1.0.1", + "esutils": "^2.0.2", + "file-entry-cache": "^5.0.1", + "functional-red-black-tree": "^1.0.1", + "glob": "^7.1.2", + "globals": "^11.7.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "inquirer": "^6.2.2", + "js-yaml": "^3.12.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.3.0", + "lodash": "^4.17.11", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.1", + "natural-compare": "^1.4.0", + "optionator": "^0.8.2", + "path-is-inside": "^1.0.2", + "progress": "^2.0.0", + "regexpp": "^2.0.1", + "semver": "^5.5.1", + "strip-ansi": "^4.0.0", + "strip-json-comments": "^2.0.1", + "table": "^5.2.3", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^6.14.0 || ^8.10.0 || >=9.10.0" + } + }, + "node_modules/eslint-config-google": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/eslint-config-google/-/eslint-config-google-0.12.0.tgz", + "integrity": "sha512-SHDM3nIRCJBACjf8c/H6FvCwRmKbphESNl3gJFBNbw4KYDLCONB3ABYLXDGF+iaVP9XSTND/Q5/PuGoFkp4xbg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + }, + "peerDependencies": { + "eslint": ">=5.4.0" + } + }, + "node_modules/eslint-config-standard": { + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-12.0.0.tgz", + "integrity": "sha512-COUz8FnXhqFitYj4DTqHzidjIL/t4mumGZto5c7DrBpvWoie+Sn3P4sLEzUGeYhRElWuFEf8K1S1EfvD1vixCQ==", + "dev": true, + "peerDependencies": { + "eslint": ">=5.0.0", + "eslint-plugin-import": ">=2.13.0", + "eslint-plugin-node": ">=7.0.0", + "eslint-plugin-promise": ">=4.0.0", + "eslint-plugin-standard": ">=4.0.0" + } + }, + "node_modules/eslint-config-standard-jsx": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/eslint-config-standard-jsx/-/eslint-config-standard-jsx-6.0.2.tgz", + "integrity": "sha512-D+YWAoXw+2GIdbMBRAzWwr1ZtvnSf4n4yL0gKGg7ShUOGXkSOLerI17K4F6LdQMJPNMoWYqepzQD/fKY+tXNSg==", + "dev": true, + "peerDependencies": { + "eslint": ">=5.0.0", + "eslint-plugin-react": ">=7.11.1" + } + }, + "node_modules/eslint-import-resolver-node": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", + "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", + "dev": true, + "dependencies": { + "debug": "^3.2.7", + "is-core-module": "^2.13.0", + "resolve": "^1.22.4" + } + }, + "node_modules/eslint-import-resolver-node/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/eslint-import-resolver-node/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==", + "dev": true + }, + "node_modules/eslint-module-utils": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.1.tgz", + "integrity": "sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==", + "dev": true, + "dependencies": { + "debug": "^3.2.7" + }, + "engines": { + "node": ">=4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "node_modules/eslint-module-utils/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/eslint-module-utils/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==", + "dev": true + }, + "node_modules/eslint-plugin-es": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-1.4.1.tgz", + "integrity": "sha512-5fa/gR2yR3NxQf+UXkeLeP8FBBl6tSgdrAz1+cF84v1FMM4twGwQoqTnn+QxFLcPOrF4pdKEJKDB/q9GoyJrCA==", + "dev": true, + "dependencies": { + "eslint-utils": "^1.4.2", + "regexpp": "^2.0.1" + }, + "engines": { + "node": ">=6.5.0" + }, + "peerDependencies": { + "eslint": ">=4.19.1" + } + }, + "node_modules/eslint-plugin-import": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.14.0.tgz", + "integrity": "sha512-FpuRtniD/AY6sXByma2Wr0TXvXJ4nA/2/04VPlfpmUDPOpOY264x+ILiwnrk/k4RINgDAyFZByxqPUbSQ5YE7g==", + "dev": true, + "dependencies": { + "contains-path": "^0.1.0", + "debug": "^2.6.8", + "doctrine": "1.5.0", + "eslint-import-resolver-node": "^0.3.1", + "eslint-module-utils": "^2.2.0", + "has": "^1.0.1", + "lodash": "^4.17.4", + "minimatch": "^3.0.3", + "read-pkg-up": "^2.0.0", + "resolve": "^1.6.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "2.x - 5.x" + } + }, + "node_modules/eslint-plugin-import/node_modules/doctrine": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", + "integrity": "sha512-lsGyRuYr4/PIB0txi+Fy2xOMI2dGaTguCaotzFGkVZuKR5usKfcRWIFKNM3QNrU7hh/+w2bwTW+ZeXPK5l8uVg==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2", + "isarray": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-import/node_modules/find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==", + "dev": true, + "dependencies": { + "locate-path": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-plugin-import/node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true + }, + "node_modules/eslint-plugin-import/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/eslint-plugin-import/node_modules/load-json-file": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", + "integrity": "sha512-3p6ZOGNbiX4CdvEd1VcE6yi78UrGNpjHO33noGwHCnT/o2fyllJDepsm8+mFFv/DvtwFHht5HIHSyOy5a+ChVQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-plugin-import/node_modules/locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==", + "dev": true, + "dependencies": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-plugin-import/node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/eslint-plugin-import/node_modules/p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "dependencies": { + "p-try": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-plugin-import/node_modules/p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==", + "dev": true, + "dependencies": { + "p-limit": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-plugin-import/node_modules/p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-plugin-import/node_modules/parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==", + "dev": true, + "dependencies": { + "error-ex": "^1.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-import/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-plugin-import/node_modules/path-type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", + "integrity": "sha512-dUnb5dXUf+kzhC/W/F4e5/SkluXIFf5VUHolW1Eg1irn1hGWjPGdsRcvYJ1nD6lhk8Ir7VM0bHJKsYTx8Jx9OQ==", + "dev": true, + "dependencies": { + "pify": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-plugin-import/node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-import/node_modules/read-pkg": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", + "integrity": "sha512-eFIBOPW7FGjzBuk3hdXEuNSiTZS/xEMlH49HxMyzb0hyPfu4EhVjT2DH32K1hSSmVq4sebAWnZuuY5auISUTGA==", + "dev": true, + "dependencies": { + "load-json-file": "^2.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-plugin-import/node_modules/read-pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", + "integrity": "sha512-1orxQfbWGUiTn9XsPlChs6rLie/AV9jwZTGmu2NZw/CUDJQchXJFYE0Fq5j7+n558T1JhDWLdhyd1Zj+wLY//w==", + "dev": true, + "dependencies": { + "find-up": "^2.0.0", + "read-pkg": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-plugin-import/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/eslint-plugin-node": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-7.0.1.tgz", + "integrity": "sha512-lfVw3TEqThwq0j2Ba/Ckn2ABdwmL5dkOgAux1rvOk6CO7A6yGyPI2+zIxN6FyNkp1X1X/BSvKOceD6mBWSj4Yw==", + "dev": true, + "dependencies": { + "eslint-plugin-es": "^1.3.1", + "eslint-utils": "^1.3.1", + "ignore": "^4.0.2", + "minimatch": "^3.0.4", + "resolve": "^1.8.1", + "semver": "^5.5.0" + }, + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "eslint": ">=4.19.1" + } + }, + "node_modules/eslint-plugin-promise": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-4.0.1.tgz", + "integrity": "sha512-Si16O0+Hqz1gDHsys6RtFRrW7cCTB6P7p3OJmKp3Y3dxpQE2qwOA7d3xnV+0mBmrPoi0RBnxlCKvqu70te6wjg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/eslint-plugin-react": { + "version": "7.11.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.11.1.tgz", + "integrity": "sha512-cVVyMadRyW7qsIUh3FHp3u6QHNhOgVrLQYdQEB1bPWBsgbNCHdFAeNMquBMCcZJu59eNthX053L70l7gRt4SCw==", + "dev": true, + "dependencies": { + "array-includes": "^3.0.3", + "doctrine": "^2.1.0", + "has": "^1.0.3", + "jsx-ast-utils": "^2.0.1", + "prop-types": "^15.6.2" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0" + } + }, + "node_modules/eslint-plugin-react/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-standard": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-standard/-/eslint-plugin-standard-4.0.2.tgz", + "integrity": "sha512-nKptN8l7jksXkwFk++PhJB3cCDTcXOEyhISIN86Ue2feJ1LFyY3PrY3/xT2keXlJSY5bpmbiTG0f885/YKAvTA==", + "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" + } + ], + "peerDependencies": { + "eslint": ">=5.0.0" + } + }, + "node_modules/eslint-scope": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", + "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", + "dev": true, + "dependencies": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/eslint-utils": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz", + "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^1.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint/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/eslint/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/esniff": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/esniff/-/esniff-2.0.1.tgz", + "integrity": "sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==", + "dev": true, + "dependencies": { + "d": "^1.0.1", + "es5-ext": "^0.10.62", + "event-emitter": "^0.3.5", + "type": "^2.7.2" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/espree": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-5.0.1.tgz", + "integrity": "sha512-qWAZcWh4XE/RwzLJejfcofscgMc9CamR6Tn1+XRXNzrvUSSbiAjGOI/fggztjIi7y9VLPqnICMIPiGyr8JaZ0A==", + "dev": true, + "dependencies": { + "acorn": "^6.0.7", + "acorn-jsx": "^5.0.0", + "eslint-visitor-keys": "^1.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/espree/node_modules/acorn": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", + "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "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/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "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", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/event-emitter": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", + "integrity": "sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==", + "dev": true, + "dependencies": { + "d": "1", + "es5-ext": "~0.10.14" + } + }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "dev": true + }, + "node_modules/eventuate": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/eventuate/-/eventuate-4.0.0.tgz", + "integrity": "sha512-SysKo5/rgqCaXlO4H4DE62JXCFtDpdm+boWOzaeaYph3Xejy04Cc4/E2HDPnOES0MFb643WgKRlx09W2iVAIBw==", + "dependencies": { + "define-error": "~1.0.0", + "object-assign": "~3.0.0", + "shallow-copy": "0.0.1" + } + }, + "node_modules/eventuate/node_modules/object-assign": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz", + "integrity": "sha512-jHP15vXVGeVh1HuaA2wY6lxk+whK/x4KBG88VXeRma7CCun7iGD5qPc4eYykQ9sdQvg8jkwFKsSxHln2ybW3xQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "dependencies": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/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/expect-ct": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/expect-ct/-/expect-ct-0.2.0.tgz", + "integrity": "sha512-6SK3MG/Bbhm8MsgyJAylg+ucIOU71/FzyFalcfu5nY19dH8y/z0tBJU0wrNBXD4B27EoQtqPF/9wqH0iYAd04g==", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/express": { + "version": "4.17.3", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.3.tgz", + "integrity": "sha512-yuSQpz5I+Ch7gFrPCk4/c+dIBKlQUxtgwqzph132bsT6qhuzss6I8cLJQz7B3rFblzd6wtcI0ZbGltH/C4LjUg==", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.19.2", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.4.2", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.1.2", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.9.7", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.17.2", + "serve-static": "1.14.2", + "setprototypeof": "1.2.0", + "statuses": "~1.5.0", + "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.19.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.2.tgz", + "integrity": "sha512-SAAwOxgoCKMGs9uUAUFHygfLAyaniaoun6I8mFY9pRAJL9+Kec34aU+oIjDhTycub1jozEfEwx1W1IuOYxVSFw==", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "1.8.1", + "iconv-lite": "0.4.24", + "on-finished": "~2.3.0", + "qs": "6.9.7", + "raw-body": "2.4.3", + "type-is": "~1.6.18" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/express/node_modules/cookie": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", + "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express/node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express/node_modules/http-errors": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", + "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express/node_modules/on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/express/node_modules/qs": { + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-IhMFgUmuNpyRfxA90umL7ByLlgRXu6tIfKPpF5TmcfRLlLCckfP/g3IQmju6jjpu+Hh8rA+2p6A27ZSPOOHdKw==", + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/express/node_modules/raw-body": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.3.tgz", + "integrity": "sha512-UlTNLIcu0uzb4D2f4WltY6cVjLi+/jEN4lgEUj3E04tpMDpUlkBo/eSn6zou9hum2VMNpCCUone0O0WeJim07g==", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "1.8.1", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/ext": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz", + "integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==", + "dev": true, + "dependencies": { + "type": "^2.7.2" + } + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "node_modules/external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "dev": true, + "dependencies": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", + "engines": [ + "node >=0.6.0" + ] + }, + "node_modules/faker": { + "version": "5.5.3", + "resolved": "https://registry.npmjs.org/faker/-/faker-5.5.3.tgz", + "integrity": "sha512-wLTv2a28wjUyWkbnX7u/ABZBkUkIF2fCd73V6P2oFqEGEktDfzWx4UxrSqtPRw0xPRAcjeAOIiJWqZm3pP4u3g==", + "dev": true + }, + "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==" + }, + "node_modules/fast-glob": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "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-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==" + }, + "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/fast-redact": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-redact/-/fast-redact-2.1.0.tgz", + "integrity": "sha512-0LkHpTLyadJavq9sRzzyqIoMZemWli77K2/MGOkafrR64B9ItrvZ9aT+jluvNDsv0YEHjSNhlMBtbokuoqii4A==", + "engines": { + "node": ">=6" + } + }, + "node_modules/fast-safe-stringify": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", + "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==" + }, + "node_modules/fastq": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/feature-policy": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/feature-policy/-/feature-policy-0.3.0.tgz", + "integrity": "sha512-ZtijOTFN7TzCujt1fnNhfWPFPSHeZkesff9AXZj+UEjYBynWNUIYpC87Ve4wHzyexQsImicLu7WsC2LHq7/xrQ==", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/figures": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "integrity": "sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA==", + "dependencies": { + "escape-string-regexp": "^1.0.5" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/file-entry-cache": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", + "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", + "dev": true, + "dependencies": { + "flat-cache": "^2.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/file-type": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz", + "integrity": "sha512-RLoqTXE8/vPmMuTI88DAzhMYC99I8BWv7zYP4A1puo5HIjEJ5EX48ighy4ZyKMG9EDXxBgW6e++cn7d1xuFghA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "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==" + }, + "node_modules/filelist": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", + "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", + "dependencies": { + "minimatch": "^5.0.1" + } + }, + "node_modules/filelist/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/filelist/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/filesize": { + "version": "8.0.7", + "resolved": "https://registry.npmjs.org/filesize/-/filesize-8.0.7.tgz", + "integrity": "sha512-pjmC+bkIF8XI7fWaH8KxHcZL3DPybs1roSKP4rKDvy20tAWwIObE4+JIseG2byfGKhud5ZnM4YSGKBz7Sh0ndQ==", + "dev": true, + "engines": { + "node": ">= 0.4.0" + } + }, + "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.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/find-cache-dir": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", + "dev": true, + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/avajs/find-cache-dir?sponsor=1" + } + }, + "node_modules/find-replace": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-2.0.1.tgz", + "integrity": "sha512-LzDo3Fpa30FLIBsh6DCDnMN1KW2g4QKkqKmejlImgWY67dDFPX/x9Kh/op/GK522DchQXEvDi/wD48HKW49XOQ==", + "dependencies": { + "array-back": "^2.0.0", + "test-value": "^3.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/find-root": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", + "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==", + "dev": true + }, + "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/find-versions": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/find-versions/-/find-versions-4.0.0.tgz", + "integrity": "sha512-wgpWy002tA+wgmO27buH/9KzyEOQnKsG/R0yrcjPT9BOFm0zRBVQbZ95nRGXWMywS8YR5knRbpohio0bcJABxQ==", + "dependencies": { + "semver-regex": "^3.1.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "dev": true, + "bin": { + "flat": "cli.js" + } + }, + "node_modules/flat-cache": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", + "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", + "dev": true, + "dependencies": { + "flatted": "^2.0.0", + "rimraf": "2.6.3", + "write": "1.0.3" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/flatstr": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/flatstr/-/flatstr-1.0.12.tgz", + "integrity": "sha512-4zPxDyhCyiN2wIAtSLI6gc82/EjqZc1onI4Mz/l0pWrAlsSfYH/2ZIcU+e3oA2wDwbzIWNKwa23F8rh6+DRWkw==" + }, + "node_modules/flatted": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", + "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", + "dev": true + }, + "node_modules/follow-redirects": { + "version": "1.15.5", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.5.tgz", + "integrity": "sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.3" + } + }, + "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/foreground-child/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/foreground-child/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/foreground-child/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/foreground-child/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/foreground-child/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/forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", + "engines": { + "node": "*" + } + }, + "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/formidable": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.2.1.tgz", + "integrity": "sha512-Fs9VRguL0gqGHkXS5GQiMCr1VhZBxz0JnJs4JmMp/2jL18Fmbzvv7vOFRU+U8TBkHEE/CX1qDXzJplVULgsLeg==", + "deprecated": "Please upgrade to latest, formidable@v2 or formidable@v3! Check these notes: https://bit.ly/2ZEqIau" + }, + "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/frameguard": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/frameguard/-/frameguard-3.1.0.tgz", + "integrity": "sha512-TxgSKM+7LTA6sidjOiSZK9wxY0ffMPY3Wta//MqwmX0nZuEHc8QrkV8Fh3ZhMJeiH+Uyh/tcaarImRy8u77O7g==", + "engines": { + "node": ">=4.0.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/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/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/fromentries": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/fromentries/-/fromentries-1.3.2.tgz", + "integrity": "sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==", + "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/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": "11.2.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", + "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "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.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "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/ftp": { + "version": "0.3.10", + "resolved": "https://registry.npmjs.org/ftp/-/ftp-0.3.10.tgz", + "integrity": "sha512-faFVML1aBx2UoDStmLwv2Wptt4vw5x03xxX172nhA5Y5HBshW5JweqQ2W4xL4dezQTG8inJsuYcpPHHU3X5OTQ==", + "dependencies": { + "readable-stream": "1.1.x", + "xregexp": "2.0.0" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/function.prototype.name": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", + "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "functions-have-names": "^1.2.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", + "dev": true + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gauge": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz", + "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==", + "optional": true, + "dependencies": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.3", + "console-control-strings": "^1.1.0", + "has-unicode": "^2.0.1", + "signal-exit": "^3.0.7", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.5" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/gauge/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==", + "optional": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/gauge/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==", + "optional": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/gauge/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==", + "optional": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/gauge/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==", + "optional": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/generate-function": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.3.1.tgz", + "integrity": "sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==", + "dependencies": { + "is-property": "^1.0.2" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "engines": { + "node": ">=6.9.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/get-func-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", + "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/get-stdin": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-6.0.0.tgz", + "integrity": "sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/get-symbol-description": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", + "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", + "dependencies": { + "assert-plus": "^1.0.0" + } + }, + "node_modules/git-log-parser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/git-log-parser/-/git-log-parser-1.2.0.tgz", + "integrity": "sha512-rnCVNfkTL8tdNryFuaY0fYiBWEBcgF748O6ZI61rslBvr2o7U65c2/6npCRqH40vuAhtgtDiqLTJjBVdrejCzA==", + "dependencies": { + "argv-formatter": "~1.0.0", + "spawn-error-forwarder": "~1.0.0", + "split2": "~1.0.0", + "stream-combiner2": "~1.1.1", + "through2": "~2.0.0", + "traverse": "~0.6.6" + } + }, + "node_modules/git-log-parser/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/git-log-parser/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/git-log-parser/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/git-log-parser/node_modules/split2": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-1.0.0.tgz", + "integrity": "sha512-NKywug4u4pX/AZBB1FCPzZ6/7O+Xhz1qMVbzTvvKvikjO99oPN87SkK08mEY9P63/5lWjK+wgOOgApnTg5r6qg==", + "dependencies": { + "through2": "~2.0.0" + } + }, + "node_modules/git-log-parser/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/git-log-parser/node_modules/through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "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": { + "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==", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/global-agent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-agent/-/global-agent-3.0.0.tgz", + "integrity": "sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q==", + "dev": true, + "dependencies": { + "boolean": "^3.0.1", + "es6-error": "^4.1.1", + "matcher": "^3.0.0", + "roarr": "^2.15.3", + "semver": "^7.3.2", + "serialize-error": "^7.0.1" + }, + "engines": { + "node": ">=10.0" + } + }, + "node_modules/global-agent/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/global-agent/node_modules/semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/globalthis": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", + "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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/globby/node_modules/ignore": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", + "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", + "engines": { + "node": ">= 4" + } + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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/growl": { + "version": "1.10.5", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", + "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", + "dev": true, + "engines": { + "node": ">=4.x" + } + }, + "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==", + "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/har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==", + "engines": { + "node": ">=4" + } + }, + "node_modules/har-validator": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", + "deprecated": "this library is no longer supported", + "dependencies": { + "ajv": "^6.12.3", + "har-schema": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/hard-rejection": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", + "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/has": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.4.tgz", + "integrity": "sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ==", + "dev": true, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==", + "dev": true, + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "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-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.3" + }, + "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==", + "optional": true + }, + "node_modules/hasha": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.2.tgz", + "integrity": "sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==", + "dev": true, + "dependencies": { + "is-stream": "^2.0.0", + "type-fest": "^0.8.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/hasha/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/hasown": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.1.tgz", + "integrity": "sha512-1/th4MHjnwncwXsIW6QMzlvYL9kG5e/CpVvLRZe4XPa8TOUNbCELqmvhDmnkNsAjwaG4+I8gJJL0JBvTTLO9qA==", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true, + "bin": { + "he": "bin/he" + } + }, + "node_modules/helmet": { + "version": "3.21.2", + "resolved": "https://registry.npmjs.org/helmet/-/helmet-3.21.2.tgz", + "integrity": "sha512-okUo+MeWgg00cKB8Csblu8EXgcIoDyb5ZS/3u0W4spCimeVuCUvVZ6Vj3O2VJ1Sxpyb8jCDvzu0L1KKT11pkIg==", + "dependencies": { + "depd": "2.0.0", + "dns-prefetch-control": "0.2.0", + "dont-sniff-mimetype": "1.1.0", + "expect-ct": "0.2.0", + "feature-policy": "0.3.0", + "frameguard": "3.1.0", + "helmet-crossdomain": "0.4.0", + "helmet-csp": "2.9.4", + "hide-powered-by": "1.1.0", + "hpkp": "2.0.0", + "hsts": "2.2.0", + "ienoopen": "1.1.0", + "nocache": "2.1.0", + "referrer-policy": "1.2.0", + "x-xss-protection": "1.3.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/helmet-crossdomain": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/helmet-crossdomain/-/helmet-crossdomain-0.4.0.tgz", + "integrity": "sha512-AB4DTykRw3HCOxovD1nPR16hllrVImeFp5VBV9/twj66lJ2nU75DP8FPL0/Jp4jj79JhTfG+pFI2MD02kWJ+fA==", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/helmet-csp": { + "version": "2.9.4", + "resolved": "https://registry.npmjs.org/helmet-csp/-/helmet-csp-2.9.4.tgz", + "integrity": "sha512-qUgGx8+yk7Xl8XFEGI4MFu1oNmulxhQVTlV8HP8tV3tpfslCs30OZz/9uQqsWPvDISiu/NwrrCowsZBhFADYqg==", + "dependencies": { + "bowser": "^2.7.0", + "camelize": "1.0.0", + "content-security-policy-builder": "2.1.0", + "dasherize": "2.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/hide-powered-by": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/hide-powered-by/-/hide-powered-by-1.1.0.tgz", + "integrity": "sha512-Io1zA2yOA1YJslkr+AJlWSf2yWFkKjvkcL9Ni1XSUqnGLr/qRQe2UI3Cn/J9MsJht7yEVCe0SscY1HgVMujbgg==", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/hook-std": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hook-std/-/hook-std-2.0.0.tgz", + "integrity": "sha512-zZ6T5WcuBMIUVh49iPQS9t977t7C0l7OtHrpeMb5uk48JdflRX0NSFvCekfYNmGQETnLq9W/isMyHl69kxGi8g==", + "engines": { + "node": ">=8" + } + }, + "node_modules/hosted-git-info": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", + "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/hosted-git-info/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/hpkp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hpkp/-/hpkp-2.0.0.tgz", + "integrity": "sha512-TaZpC6cO/k3DFsjfzz1LnOobbVSq+J+7WpJxrVtN4L+8+BPQj8iBDRB2Dx49613N+e7/+ZSQ9ra+xZm7Blf4wg==" + }, + "node_modules/hsts": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/hsts/-/hsts-2.2.0.tgz", + "integrity": "sha512-ToaTnQ2TbJkochoVcdXYm4HOCliNozlviNsg+X2XQLQvZNI/kCHR9rZxVYpJB3UPcHz80PgxRyWQ7PdU1r+VBQ==", + "dependencies": { + "depd": "2.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "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-cache-semantics": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", + "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", + "optional": 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/http-errors/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/http-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/http-proxy-agent/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/http-proxy-agent/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/http-reasons": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/http-reasons/-/http-reasons-0.1.0.tgz", + "integrity": "sha512-P6kYh0lKZ+y29T2Gqz+RlC9WBLhKe8kDmcJ+A+611jFfxdPsbMRQ5aNmFRM3lENqFkK+HTTL+tlQviAiv0AbLQ==", + "dev": true + }, + "node_modules/http-signature": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.3.6.tgz", + "integrity": "sha512-3adrsD6zqo4GsTqtO7FyrejHNv+NgiIfAfv68+jVlFmSr9OGy7zrxONceFRLKvnnZA5jbxQBX1u9PpB6Wi32Gw==", + "dev": true, + "dependencies": { + "assert-plus": "^1.0.0", + "jsprim": "^2.0.2", + "sshpk": "^1.14.1" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/httpntlm": { + "version": "1.7.7", + "resolved": "https://registry.npmjs.org/httpntlm/-/httpntlm-1.7.7.tgz", + "integrity": "sha512-Pv2Rvrz8H0qv1Dne5mAdZ9JegG1uc6Vu5lwLflIY6s8RKHdZQbW39L4dYswSgqMDT0pkJILUTKjeyU0VPNRZjA==", + "dev": true, + "dependencies": { + "httpreq": ">=0.4.22", + "underscore": "~1.12.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/httpntlm/node_modules/underscore": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.12.1.tgz", + "integrity": "sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw==", + "dev": true + }, + "node_modules/httpreq": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/httpreq/-/httpreq-1.1.1.tgz", + "integrity": "sha512-uhSZLPPD2VXXOSN8Cni3kIsoFHaU2pT/nySEU/fHr/ePbqHYr0jeiQRmUKLEirC09SFPsdMoA7LU7UXMd/w0Kw==", + "dev": true, + "engines": { + "node": ">= 6.15.1" + } + }, + "node_modules/https-proxy-agent": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.4.tgz", + "integrity": "sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg==", + "dependencies": { + "agent-base": "^7.0.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/https-proxy-agent/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/https-proxy-agent/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/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==", + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/humanize-ms": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", + "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", + "optional": true, + "dependencies": { + "ms": "^2.0.0" + } + }, + "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/ienoopen": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/ienoopen/-/ienoopen-1.1.0.tgz", + "integrity": "sha512-MFs36e/ca6ohEKtinTJ5VvAJ6oDRAYFdYXweUnGY9L9vcoqFOU4n2ZhmJ0C4z/cwGZ3YIQRSB3XZ1+ghZkY5NQ==", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "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==", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/import-from/-/import-from-4.0.0.tgz", + "integrity": "sha512-P9J71vT5nLlDeV8FHs5nNxaLbrpfAV5cF5srvbZfpwpcJoM/xZR3hiv+q+SAnuSmuGbXMWud063iIMx/V/EWZQ==", + "engines": { + "node": ">=12.2" + }, + "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==", + "devOptional": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/infer-owner": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", + "optional": true + }, + "node_modules/inflection": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/inflection/-/inflection-1.13.4.tgz", + "integrity": "sha512-6I/HUDeYFfuNCVS3td055BaXBwKYuzw7K3ExVMStBowKo9oOAMJIXIHvdyR3iboTCp1b+1i5DSkIZTcwIktuDw==", + "engines": [ + "node >= 0.4.0" + ] + }, + "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": "2.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", + "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", + "engines": { + "node": ">=10" + } + }, + "node_modules/inquirer": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.5.2.tgz", + "integrity": "sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ==", + "dev": true, + "dependencies": { + "ansi-escapes": "^3.2.0", + "chalk": "^2.4.2", + "cli-cursor": "^2.1.0", + "cli-width": "^2.0.0", + "external-editor": "^3.0.3", + "figures": "^2.0.0", + "lodash": "^4.17.12", + "mute-stream": "0.0.7", + "run-async": "^2.2.0", + "rxjs": "^6.4.0", + "string-width": "^2.1.0", + "strip-ansi": "^5.1.0", + "through": "^2.3.6" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/inquirer/node_modules/ansi-regex": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/inquirer/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/internal-slot": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", + "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0", + "hasown": "^2.0.0", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "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/ip-address": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", + "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==", + "optional": true, + "dependencies": { + "jsbn": "1.1.0", + "sprintf-js": "^1.1.3" + }, + "engines": { + "node": ">= 12" + } + }, + "node_modules/ip-address/node_modules/sprintf-js": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", + "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", + "optional": true + }, + "node_modules/ip-regex": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", + "integrity": "sha512-58yWmlHpp7VYfcdTwMTvwMmqx/Elfxjd9RXTDyMsbL7lLWmhMylLEqiYVLKuLzOZqVgiWXD9MfR62Vv89VRxkw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "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-admin": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-admin/-/is-admin-3.0.0.tgz", + "integrity": "sha512-wOa3CXFJAu8BZ2BDtG9xYOOrsq6oiSvc2jFPy4X/HINx5bmJUcW8e+apItVbU2E7GIfBVaFVO7Zit4oAWtTJcw==", + "dependencies": { + "execa": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", + "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" + }, + "node_modules/is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "dependencies": { + "has-bigints": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "dev": true + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "dependencies": { + "hasown": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-elevated": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-elevated/-/is-elevated-3.0.0.tgz", + "integrity": "sha512-wjcp6RkouU9jpg55zERl+BglvV5j4jx5c/EMvQ+d12j/+nIEenNWPu+qc0tCg3JkLodbKZMg1qhJzEwG4qjclg==", + "dependencies": { + "is-admin": "^3.0.0", + "is-root": "^2.1.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": "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==", + "devOptional": true, + "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-ip": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-ip/-/is-ip-2.0.0.tgz", + "integrity": "sha512-9MTn0dteHETtyUx8pxqMwg5hMBi3pvlyglJ+b79KOCca0po23337LbVV2Hl4xmMvfw++ljnO0/+5G6G+0Szh6g==", + "dev": true, + "dependencies": { + "ip-regex": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/is-lambda": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", + "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==", + "optional": true + }, + "node_modules/is-negative-zero": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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-number-like": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/is-number-like/-/is-number-like-1.0.8.tgz", + "integrity": "sha512-6rZi3ezCyFcn5L71ywzz2bS5b2Igl1En3eTlZlvKjpz1n3IZLAYMbKYAIQgFmEu0GENg92ziU/faEOA/aixjbA==", + "dependencies": { + "lodash.isfinite": "^3.3.2" + } + }, + "node_modules/is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-path-cwd": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", + "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", + "engines": { + "node": ">=6" + } + }, + "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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-plain-object": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-promise": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", + "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==", + "dev": true + }, + "node_modules/is-property": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", + "integrity": "sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g==" + }, + "node_modules/is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-resolvable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", + "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==", + "dev": true + }, + "node_modules/is-root": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-root/-/is-root-2.1.0.tgz", + "integrity": "sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", + "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-text-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-1.0.1.tgz", + "integrity": "sha512-xFuJpne9oFz5qDaodwmmG08e3CawH/2ZV8Qqza1Ko7Sk8POWbkRdwIoAWVhqvq0XeUzANEhKo2n0IXUGBm7A/w==", + "dependencies": { + "text-extensions": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", + "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", + "dev": true, + "dependencies": { + "which-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" + }, + "node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "dev": true, + "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/isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==" + }, + "node_modules/issue-parser": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/issue-parser/-/issue-parser-6.0.0.tgz", + "integrity": "sha512-zKa/Dxq2lGsBIXQ7CUZWTHfvxPC2ej0KfO7fIPqLlHB9J2hJ7rGhZ5rilhuufylr4RXYPzJUeFjKxz305OsNlA==", + "dependencies": { + "lodash.capitalize": "^4.2.1", + "lodash.escaperegexp": "^4.1.2", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.uniqby": "^4.7.0" + }, + "engines": { + "node": ">=10.13" + } + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-hook": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz", + "integrity": "sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ==", + "dev": true, + "dependencies": { + "append-transform": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", + "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", + "dev": true, + "dependencies": { + "@babel/core": "^7.7.5", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.0.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument/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/istanbul-lib-processinfo": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.3.tgz", + "integrity": "sha512-NkwHbo3E00oybX6NGJi6ar0B29vxyvNwoC7eJ4G4Yq28UfY758Hgn/heV8VRFhevPED4LXfFz0DQ8z/0kw9zMg==", + "dev": true, + "dependencies": { + "archy": "^1.0.0", + "cross-spawn": "^7.0.3", + "istanbul-lib-coverage": "^3.2.0", + "p-map": "^3.0.0", + "rimraf": "^3.0.0", + "uuid": "^8.3.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-processinfo/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/istanbul-lib-processinfo/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/istanbul-lib-processinfo/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/istanbul-lib-processinfo/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/istanbul-lib-processinfo/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/istanbul-lib-processinfo/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==", + "dev": true, + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/istanbul-lib-processinfo/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/istanbul-lib-report": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", + "dev": true, + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-report/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/istanbul-lib-report/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/istanbul-lib-report/node_modules/make-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "dev": true, + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/istanbul-lib-report/node_modules/semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-report/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/istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-source-maps/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/istanbul-lib-source-maps/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/istanbul-reports": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", + "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", + "dev": true, + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jackspeak": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", + "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", + "dev": true, + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/jake": { + "version": "10.8.7", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.7.tgz", + "integrity": "sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w==", + "dependencies": { + "async": "^3.2.3", + "chalk": "^4.0.2", + "filelist": "^1.0.4", + "minimatch": "^3.1.2" + }, + "bin": { + "jake": "bin/cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jake/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/jake/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/jake/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/jake/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/jake/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/jake/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/java-properties": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/java-properties/-/java-properties-1.0.2.tgz", + "integrity": "sha512-qjdpeo2yKlYTH7nFdK0vbZWuTCesk4o63v5iVOlhMQPfuIZQfW/HI35SjfhA+4qpg36rnFSvUK5b1m+ckIblQQ==", + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/js-beautify": { + "version": "1.15.1", + "resolved": "https://registry.npmjs.org/js-beautify/-/js-beautify-1.15.1.tgz", + "integrity": "sha512-ESjNzSlt/sWE8sciZH8kBF8BPlwXPwhR6pWKAw8bw4Bwj+iZcnKW6ONWUutJ7eObuBZQpiIb8S7OYspWrKt7rA==", + "dev": true, + "dependencies": { + "config-chain": "^1.1.13", + "editorconfig": "^1.0.4", + "glob": "^10.3.3", + "js-cookie": "^3.0.5", + "nopt": "^7.2.0" + }, + "bin": { + "css-beautify": "js/bin/css-beautify.js", + "html-beautify": "js/bin/html-beautify.js", + "js-beautify": "js/bin/js-beautify.js" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/js-beautify/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/js-beautify/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/js-beautify/node_modules/foreground-child": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", + "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/js-beautify/node_modules/glob": { + "version": "10.3.10", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", + "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", + "dev": true, + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.5", + "minimatch": "^9.0.1", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/js-beautify/node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/js-beautify/node_modules/minipass": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", + "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "dev": true, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/js-beautify/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/js-beautify/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/js-beautify/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/js-beautify/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/js-beautify/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/js-cookie": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-3.0.5.tgz", + "integrity": "sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==", + "dev": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/js-sha512": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/js-sha512/-/js-sha512-0.8.0.tgz", + "integrity": "sha512-PWsmefG6Jkodqt+ePTvBZCSMFgN7Clckjd0O7su3I0+BW2QWUTJNzjktHsztGLhncP2h8mcF9V9Y2Ha59pAViQ==", + "dev": true + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsbn": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz", + "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==", + "optional": true + }, + "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/json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==" + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" + }, + "node_modules/json-schema": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" + }, + "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==" + }, + "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/json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==" + }, + "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/jsonparse": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", + "engines": [ + "node >= 0.2.0" + ] + }, + "node_modules/jsonschema": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/jsonschema/-/jsonschema-1.2.5.tgz", + "integrity": "sha512-kVTF+08x25PQ0CjuVc0gRM9EUPb0Fe9Ln/utFOgcdxEIOHuU7ooBk/UPTd7t1M91pP35m0MU1T8M5P7vP1bRRw==", + "engines": { + "node": "*" + } + }, + "node_modules/JSONStream": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", + "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", + "dependencies": { + "jsonparse": "^1.2.0", + "through": ">=2.2.7 <3" + }, + "bin": { + "JSONStream": "bin.js" + }, + "engines": { + "node": "*" + } + }, + "node_modules/jsprim": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-2.0.2.tgz", + "integrity": "sha512-gqXddjPqQ6G40VdnI6T6yObEC+pDNvyP95wdQhkWkg7crHH3km5qP1FsOXEkzEQwnz6gz5qGTn1c2Y52wP3OyQ==", + "dev": true, + "engines": [ + "node >=0.6.0" + ], + "dependencies": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.4.0", + "verror": "1.10.0" + } + }, + "node_modules/jsx-ast-utils": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-2.4.1.tgz", + "integrity": "sha512-z1xSldJ6imESSzOjd3NNkieVJKRlKYSOtMG8SFyCj2FIrvSaSuli/WjpBkEzCBoR9bYYYFgqJw61Xhu7Lcgk+w==", + "dev": true, + "dependencies": { + "array-includes": "^3.1.1", + "object.assign": "^4.1.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/just-extend": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.2.1.tgz", + "integrity": "sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg==", + "dev": true + }, + "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/levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", + "dev": true, + "dependencies": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" + }, + "node_modules/liquid-json": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/liquid-json/-/liquid-json-0.3.1.tgz", + "integrity": "sha512-wUayTU8MS827Dam6MxgD72Ui+KOSF+u/eIqpatOtjnvgJ0+mnDq33uC2M7J0tPK+upe/DpUAuK4JUU89iBoNKQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==", + "dependencies": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/load-json-file/node_modules/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", + "dependencies": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/load-json-file/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/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": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "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.capitalize": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/lodash.capitalize/-/lodash.capitalize-4.2.1.tgz", + "integrity": "sha512-kZzYOKspf8XVX5AvmQF94gQW0lejFVgb80G85bU4ZWzoJ6C03PQg3coYAUpSTpQWelrZELd3XWgHzw4Ck5kaIw==" + }, + "node_modules/lodash.escaperegexp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz", + "integrity": "sha512-TM9YBvyC84ZxE3rgfefxUWiQKLilstD6k7PTGt6wfbtXF8ixIJLOL3VYyV/z+ZiPLsVxAsKAFVwWlWeb2Y8Yyw==" + }, + "node_modules/lodash.flattendeep": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", + "integrity": "sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==", + "dev": true + }, + "node_modules/lodash.isfinite": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/lodash.isfinite/-/lodash.isfinite-3.3.2.tgz", + "integrity": "sha512-7FGG40uhC8Mm633uKW1r58aElFlBlxCrg9JfSi3P6aYiWmfiWF0PgMd86ZUsxE5GwWPdHoS2+48bwTh2VPkIQA==" + }, + "node_modules/lodash.ismatch": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.ismatch/-/lodash.ismatch-4.4.0.tgz", + "integrity": "sha512-fPMfXjGQEV9Xsq/8MTSgUf255gawYRbjwMyDbcvDhXgV7enSZA0hynz6vMPnpAb5iONEzBHBPsT+0zes5Z301g==" + }, + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==" + }, + "node_modules/lodash.isstring": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", + "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==" + }, + "node_modules/lodash.padend": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/lodash.padend/-/lodash.padend-4.6.1.tgz", + "integrity": "sha512-sOQs2aqGpbl27tmCS1QNZA09Uqp01ZzWfDUoD+xzTii0E7dSQfRKcRetFwa+uXaxaqL+TKm7CgD2JdKP7aZBSw==" + }, + "node_modules/lodash.uniqby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.uniqby/-/lodash.uniqby-4.7.0.tgz", + "integrity": "sha512-e/zcLx6CSbmaEgFHCA7BnoQKyCtKMxnuWrJygbwPs/AIn+IMKl66L8/s+wBUn5LRw2pZx3bUHibiV1b6aTWIww==" + }, + "node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-symbols/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/log-symbols/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "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/log-symbols/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/log-symbols/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/log-symbols/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/log-symbols/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/lolex": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lolex/-/lolex-4.2.0.tgz", + "integrity": "sha512-gKO5uExCXvSm6zbF562EvM+rd1kQDnB9AZBbiQVzf1ZmdDpxUSvpnAaVOP83N/31mRK8Ml8/VE8DMvsAZQ+7wg==", + "dev": true + }, + "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/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dev": true, + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lru-cache": { + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-8.0.5.tgz", + "integrity": "sha512-MhWWlVnuab1RG5/zMRRcVGXZLCXrZTgfwMikgzCegsPnG62yDQo5JnqKkrK4jO5iKqDAZGItAqN5CtKBCBWRUA==", + "engines": { + "node": ">=16.14" + } + }, + "node_modules/lru-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/lru-queue/-/lru-queue-0.1.0.tgz", + "integrity": "sha512-BpdYkt9EvGl8OfWHDQPISVpcl5xZthb+XPsbELj5AQXxIC8IriDZIQYjBJPEm5rS420sjZ0TLEzRcq5KdBhYrQ==", + "dev": true, + "dependencies": { + "es5-ext": "~0.10.2" + } + }, + "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-fetch-happen": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-9.1.0.tgz", + "integrity": "sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg==", + "optional": true, + "dependencies": { + "agentkeepalive": "^4.1.3", + "cacache": "^15.2.0", + "http-cache-semantics": "^4.1.0", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^6.0.0", + "minipass": "^3.1.3", + "minipass-collect": "^1.0.2", + "minipass-fetch": "^1.3.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.2", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^6.0.0", + "ssri": "^8.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/make-fetch-happen/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==", + "optional": true, + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/make-fetch-happen/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "optional": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/make-fetch-happen/node_modules/http-proxy-agent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", + "optional": true, + "dependencies": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/make-fetch-happen/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==", + "optional": true, + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/make-fetch-happen/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==", + "optional": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/make-fetch-happen/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==", + "optional": true + }, + "node_modules/map-obj": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", + "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/marked": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/marked/-/marked-4.3.0.tgz", + "integrity": "sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==", + "bin": { + "marked": "bin/marked.js" + }, + "engines": { + "node": ">= 12" + } + }, + "node_modules/marked-terminal": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/marked-terminal/-/marked-terminal-5.2.0.tgz", + "integrity": "sha512-Piv6yNwAQXGFjZSaiNljyNFw7jKDdGrw70FSbtxEyldLsyeuV5ZHm/1wW++kWbrOF1VPnUgYOhB2oLL0ZpnekA==", + "dependencies": { + "ansi-escapes": "^6.2.0", + "cardinal": "^2.1.1", + "chalk": "^5.2.0", + "cli-table3": "^0.6.3", + "node-emoji": "^1.11.0", + "supports-hyperlinks": "^2.3.0" + }, + "engines": { + "node": ">=14.13.1 || >=16.0.0" + }, + "peerDependencies": { + "marked": "^1.0.0 || ^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0" + } + }, + "node_modules/marked-terminal/node_modules/ansi-escapes": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-6.2.0.tgz", + "integrity": "sha512-kzRaCqXnpzWs+3z5ABPQiVke+iq0KXkHo8xiWV4RPTi5Yli0l97BEQuhXV1s7+aSU/fu1kUuxgS4MsQ0fRuygw==", + "dependencies": { + "type-fest": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/marked-terminal/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/marked-terminal/node_modules/chalk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/marked-terminal/node_modules/cli-table3": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.3.tgz", + "integrity": "sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==", + "dependencies": { + "string-width": "^4.2.0" + }, + "engines": { + "node": "10.* || >= 12.*" + }, + "optionalDependencies": { + "@colors/colors": "1.5.0" + } + }, + "node_modules/marked-terminal/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/marked-terminal/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/marked-terminal/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/marked-terminal/node_modules/type-fest": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-3.13.1.tgz", + "integrity": "sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/matcher": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/matcher/-/matcher-3.0.0.tgz", + "integrity": "sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/matcher/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/md5": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/md5/-/md5-2.3.0.tgz", + "integrity": "sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==", + "dev": true, + "dependencies": { + "charenc": "0.0.2", + "crypt": "0.0.2", + "is-buffer": "~1.1.6" + } + }, + "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/memoizee": { + "version": "0.4.15", + "resolved": "https://registry.npmjs.org/memoizee/-/memoizee-0.4.15.tgz", + "integrity": "sha512-UBWmJpLZd5STPm7PMUlOw/TSy972M+z8gcyQ5veOnSDRREz/0bmpyTfKt3/51DhEBqCZQn1udM/5flcSPYhkdQ==", + "dev": true, + "dependencies": { + "d": "^1.0.1", + "es5-ext": "^0.10.53", + "es6-weak-map": "^2.0.3", + "event-emitter": "^0.3.5", + "is-promise": "^2.2.2", + "lru-queue": "^0.1.0", + "next-tick": "^1.1.0", + "timers-ext": "^0.1.7" + } + }, + "node_modules/meow": { + "version": "8.1.2", + "resolved": "https://registry.npmjs.org/meow/-/meow-8.1.2.tgz", + "integrity": "sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==", + "dependencies": { + "@types/minimist": "^1.2.0", + "camelcase-keys": "^6.2.2", + "decamelize-keys": "^1.1.0", + "hard-rejection": "^2.1.0", + "minimist-options": "4.1.0", + "normalize-package-data": "^3.0.0", + "read-pkg-up": "^7.0.1", + "redent": "^3.0.0", + "trim-newlines": "^3.0.0", + "type-fest": "^0.18.0", + "yargs-parser": "^20.2.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/meow/node_modules/type-fest": { + "version": "0.18.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", + "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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/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==" + }, + "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": "3.0.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", + "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "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-format": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mime-format/-/mime-format-2.0.1.tgz", + "integrity": "sha512-XxU3ngPbEnrYnNbIX+lYSaYg0M01v6p2ntd2YaFksTu0vayaw5OJvbdRyWs07EYRlLED5qadUZ+xo+XhOvFhwg==", + "dev": true, + "dependencies": { + "charset": "^1.0.0" + } + }, + "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-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "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/min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "engines": { + "node": ">=4" + } + }, + "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/minimist-options": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", + "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", + "dependencies": { + "arrify": "^1.0.1", + "is-plain-obj": "^1.1.0", + "kind-of": "^6.0.3" + }, + "engines": { + "node": ">= 6" + } + }, + "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/minipass-collect": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", + "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", + "optional": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minipass-fetch": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-1.4.1.tgz", + "integrity": "sha512-CGH1eblLq26Y15+Azk7ey4xh0J/XfJfrCox5LDJiKqI2Q2iwOLOKrlmIaODiSQS8d18jalF6y2K2ePUm0CmShw==", + "optional": true, + "dependencies": { + "minipass": "^3.1.0", + "minipass-sized": "^1.0.3", + "minizlib": "^2.0.0" + }, + "engines": { + "node": ">=8" + }, + "optionalDependencies": { + "encoding": "^0.1.12" + } + }, + "node_modules/minipass-flush": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", + "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", + "optional": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minipass-pipeline": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", + "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", + "optional": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-sized": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", + "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", + "optional": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "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/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "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/mocha": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-9.2.2.tgz", + "integrity": "sha512-L6XC3EdwT6YrIk0yXpavvLkn8h+EU+Y5UcCHKECyMbdUIxyMuZj4bX4U9e1nvnvUUvQVsV2VHQr5zLdcUkhW/g==", + "dev": true, + "dependencies": { + "@ungap/promise-all-settled": "1.1.2", + "ansi-colors": "4.1.1", + "browser-stdout": "1.3.1", + "chokidar": "3.5.3", + "debug": "4.3.3", + "diff": "5.0.0", + "escape-string-regexp": "4.0.0", + "find-up": "5.0.0", + "glob": "7.2.0", + "growl": "1.10.5", + "he": "1.2.0", + "js-yaml": "4.1.0", + "log-symbols": "4.1.0", + "minimatch": "4.2.1", + "ms": "2.1.3", + "nanoid": "3.3.1", + "serialize-javascript": "6.0.0", + "strip-json-comments": "3.1.1", + "supports-color": "8.1.1", + "which": "2.0.2", + "workerpool": "6.2.0", + "yargs": "16.2.0", + "yargs-parser": "20.2.4", + "yargs-unparser": "2.0.0" + }, + "bin": { + "_mocha": "bin/_mocha", + "mocha": "bin/mocha" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mochajs" + } + }, + "node_modules/mocha-junit-reporter": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mocha-junit-reporter/-/mocha-junit-reporter-2.0.0.tgz", + "integrity": "sha512-20HoWh2HEfhqmigfXOKUhZQyX23JImskc37ZOhIjBKoBEsb+4cAFRJpAVhFpnvsztLklW/gFVzsrobjLwmX4lA==", + "dev": true, + "dependencies": { + "debug": "^2.2.0", + "md5": "^2.1.0", + "mkdirp": "~0.5.1", + "strip-ansi": "^4.0.0", + "xml": "^1.0.0" + }, + "peerDependencies": { + "mocha": ">=2.2.5" + } + }, + "node_modules/mocha/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/mocha/node_modules/debug": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/mocha/node_modules/debug/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/mocha/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/mocha/node_modules/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/mocha/node_modules/glob/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/mocha/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/mocha/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/mocha/node_modules/minimatch": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-4.2.1.tgz", + "integrity": "sha512-9Uq1ChtSZO+Mxa/CL1eGizn2vRn3MlLgzhT0Iz8zaY8NdvxvB0d5QdPFmCKf7JKA9Lerx5vRrnwO03jsSfGG9g==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mocha/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==", + "dev": true + }, + "node_modules/mocha/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/mocha/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/mocha/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/modify-values": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/modify-values/-/modify-values-1.0.1.tgz", + "integrity": "sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/moment": { + "version": "2.29.4", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz", + "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==", + "engines": { + "node": "*" + } + }, + "node_modules/moment-timezone": { + "version": "0.5.38", + "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.38.tgz", + "integrity": "sha512-nMIrzGah4+oYZPflDvLZUgoVUO4fvAqHstvG3xAUnMolWncuAiLDWNnJZj6EwJGMGfb1ZcuTFE6GI3hNOVWI/Q==", + "dependencies": { + "moment": ">= 2.9.0" + }, + "engines": { + "node": "*" + } + }, + "node_modules/morgan": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.9.1.tgz", + "integrity": "sha512-HQStPIV4y3afTiCYVxirakhlCfGkI161c76kKFca7Fk1JusM//Qeo1ej2XaMniiNeaZklMVrh3vTtIzpzwbpmA==", + "dependencies": { + "basic-auth": "~2.0.0", + "debug": "2.6.9", + "depd": "~1.1.2", + "on-finished": "~2.3.0", + "on-headers": "~1.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/morgan/node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/morgan/node_modules/on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/multer": { + "version": "1.4.5-lts.1", + "resolved": "https://registry.npmjs.org/multer/-/multer-1.4.5-lts.1.tgz", + "integrity": "sha512-ywPWvcDMeH+z9gQq5qYHCCy+ethsk4goepZ45GLD63fOu0YcNecQxi64nDs3qluZB+murG3/D4dJ7+dGctcCQQ==", + "dependencies": { + "append-field": "^1.0.0", + "busboy": "^1.0.0", + "concat-stream": "^1.5.2", + "mkdirp": "^0.5.4", + "object-assign": "^4.1.1", + "type-is": "^1.6.4", + "xtend": "^4.0.0" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/multer/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/mute-stream": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", + "integrity": "sha512-r65nCZhrbXXb6dXOACihYApHw2Q6pV0M3V0PSxd74N0+D8nzAdEAITq2oAjA1jVnKI+tGvEBUpqiMh0+rW6zDQ==", + "dev": true + }, + "node_modules/mysql2": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.2.2.tgz", + "integrity": "sha512-h+MYStGolwzn9bNpnq3WtwQar6XVPZKbsMdkIbZ9xTH27BSMpzBdZiilALI9LP2MO1Ky1LlgcWPLRM/e6Eilqg==", + "dependencies": { + "denque": "^2.1.0", + "generate-function": "^2.3.1", + "iconv-lite": "^0.6.3", + "long": "^5.2.1", + "lru-cache": "^8.0.0", + "named-placeholders": "^1.1.3", + "seq-queue": "^0.0.5", + "sqlstring": "^2.3.2" + }, + "engines": { + "node": ">= 8.0" + } + }, + "node_modules/mysql2/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/named-placeholders": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/named-placeholders/-/named-placeholders-1.1.3.tgz", + "integrity": "sha512-eLoBxg6wE/rZkJPhU/xRX1WTpkFEwDJEN96oxFrTsqBdbT5ec295Q+CoHrL9IT0DipqKhmGcaZmwOt8OON5x1w==", + "dependencies": { + "lru-cache": "^7.14.1" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/named-placeholders/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "engines": { + "node": ">=12" + } + }, + "node_modules/nanoid": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.1.tgz", + "integrity": "sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==", + "dev": true, + "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==" + }, + "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/nconf": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/nconf/-/nconf-0.12.0.tgz", + "integrity": "sha512-T3fZPw3c7Dfrz8JBQEbEcZJ2s8f7cUMpKuyBtsGQe0b71pcXx6gNh4oti2xh5dxB+gO9ufNfISBlGvvWtfyMcA==", + "dependencies": { + "async": "^3.0.0", + "ini": "^2.0.0", + "secure-keys": "^1.0.0", + "yargs": "^16.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "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/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==" + }, + "node_modules/nerf-dart": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/nerf-dart/-/nerf-dart-1.0.0.tgz", + "integrity": "sha512-EZSPZB70jiVsivaBLYDCyntd5eH8NTSMOn3rB+HxwdmKThGELLdYv8qVIMWvZEFy9w8ZZpW9h9OB32l1rGtj7g==" + }, + "node_modules/newman": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/newman/-/newman-5.3.2.tgz", + "integrity": "sha512-cWy8pV0iwvMOZLTw3hkAHcwo2ZA0GKkXm8oUMn1Ltii3ZI2nKpnrg9QGdIT0hGHChRkX6prY5e3Aar7uykMGNg==", + "dev": true, + "dependencies": { + "async": "3.2.3", + "chardet": "1.4.0", + "cli-progress": "3.10.0", + "cli-table3": "0.6.1", + "colors": "1.4.0", + "commander": "7.2.0", + "csv-parse": "4.16.3", + "eventemitter3": "4.0.7", + "filesize": "8.0.7", + "lodash": "4.17.21", + "mkdirp": "1.0.4", + "postman-collection": "4.1.1", + "postman-collection-transformer": "4.1.6", + "postman-request": "2.88.1-postman.31", + "postman-runtime": "7.29.0", + "pretty-ms": "7.0.1", + "semver": "7.3.5", + "serialised-error": "1.1.3", + "tough-cookie": "3.0.1", + "word-wrap": "1.2.3", + "xmlbuilder": "15.1.1" + }, + "bin": { + "newman": "bin/newman.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/newman-reporter-junitfull": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/newman-reporter-junitfull/-/newman-reporter-junitfull-1.1.1.tgz", + "integrity": "sha512-ET5rU1qkeJ5yvFxcKQFkqGxWia50kdnufm1uzyeNYlUg6T+k07AvOS0mfp/Ejr0njnsiPfFLb9kC48F8pafq9A==", + "dev": true, + "dependencies": { + "lodash": "^4.17.10", + "moment": "^2.22.2", + "xmlbuilder": "^10.0.0" + }, + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "newman": ">=4" + } + }, + "node_modules/newman-reporter-junitfull/node_modules/xmlbuilder": { + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-10.1.1.tgz", + "integrity": "sha512-OyzrcFLL/nb6fMGHbiRDuPup9ljBycsdCypwuyg5AAHvyWzGfChJpCXMG88AGTIMFhGZ9RccFN1e6lhg3hkwKg==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/newman/node_modules/async": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.3.tgz", + "integrity": "sha512-spZRyzKL5l5BZQrr/6m/SqFdBN0q3OCI0f9rjfBzCMBIP4p75P620rR3gTmaksNOhmzgdxcaxdNfMy6anrbM0g==", + "dev": true + }, + "node_modules/newman/node_modules/chardet": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-1.4.0.tgz", + "integrity": "sha512-NpwMDdSIprbYx1CLnfbxEIarI0Z+s9MssEgggMNheGM+WD68yOhV7IEA/3r6tr0yTRgQD0HuZJDw32s99i6L+A==", + "dev": true + }, + "node_modules/newman/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/newman/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/newman/node_modules/semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/next-tick": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", + "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==", + "dev": true + }, + "node_modules/nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" + }, + "node_modules/nise": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/nise/-/nise-1.5.3.tgz", + "integrity": "sha512-Ymbac/94xeIrMf59REBPOv0thr+CJVFMhrlAkW/gjCIE58BGQdCj0x7KRCb3yz+Ga2Rz3E9XXSvUyyxqqhjQAQ==", + "dev": true, + "dependencies": { + "@sinonjs/formatio": "^3.2.1", + "@sinonjs/text-encoding": "^0.7.1", + "just-extend": "^4.0.2", + "lolex": "^5.0.1", + "path-to-regexp": "^1.7.0" + } + }, + "node_modules/nise/node_modules/lolex": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/lolex/-/lolex-5.1.2.tgz", + "integrity": "sha512-h4hmjAvHTmd+25JSwrtTIuwbKdwg5NzZVRMLn9saij4SZaepCrTCxPr35H/3bjwfMJtN+t3CX8672UIkglz28A==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^1.7.0" + } + }, + "node_modules/nise/node_modules/path-to-regexp": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", + "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", + "dev": true, + "dependencies": { + "isarray": "0.0.1" + } + }, + "node_modules/nocache": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/nocache/-/nocache-2.1.0.tgz", + "integrity": "sha512-0L9FvHG3nfnnmaEQPjT9xhfN4ISk0A8/2j4M37Np4mcDesJjHgEUfgPhdCyZuFI954tjokaIj/A3NdpFNdEh4Q==", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/node-abi": { + "version": "3.56.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.56.0.tgz", + "integrity": "sha512-fZjdhDOeRcaS+rcpve7XuwHBmktS1nS1gzgghwKUQQ8nTy2FdSDr6ZT8k6YhvlJeHmmQMYiT/IH9hfco5zeW2Q==", + "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.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/node-addon-api": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.0.tgz", + "integrity": "sha512-mNcltoe1R8o7STTegSOHdnJNN7s5EUvhoS7ShnTHDyOSd+8H+UdWODq6qSv67PjC8Zc5JRT8+oLAMCr0SIXw7g==", + "engines": { + "node": "^16 || ^18 || >= 20" + } + }, + "node_modules/node-emoji": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.11.0.tgz", + "integrity": "sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==", + "dependencies": { + "lodash": "^4.17.21" + } + }, + "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==", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-gyp": { + "version": "8.4.1", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-8.4.1.tgz", + "integrity": "sha512-olTJRgUtAb/hOXG0E93wZDs5YiJlgbXxTwQAFHyNlRsXQnYzUaF2aGgujZbw+hR8aF4ZG/rST57bWMWD16jr9w==", + "optional": true, + "dependencies": { + "env-paths": "^2.2.0", + "glob": "^7.1.4", + "graceful-fs": "^4.2.6", + "make-fetch-happen": "^9.1.0", + "nopt": "^5.0.0", + "npmlog": "^6.0.0", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.2", + "which": "^2.0.2" + }, + "bin": { + "node-gyp": "bin/node-gyp.js" + }, + "engines": { + "node": ">= 10.12.0" + } + }, + "node_modules/node-gyp/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==", + "optional": true + }, + "node_modules/node-gyp/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==", + "optional": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/node-gyp/node_modules/nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "optional": true, + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/node-gyp/node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "optional": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/node-gyp/node_modules/semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "optional": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/node-gyp/node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "optional": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/node-oauth1": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/node-oauth1/-/node-oauth1-1.3.0.tgz", + "integrity": "sha512-0yggixNfrA1KcBwvh/Hy2xAS1Wfs9dcg6TdFf2zN7gilcAigMdrtZ4ybrBSXBgLvGDw9V1p2MRnGBMq7XjTWLg==", + "dev": true + }, + "node_modules/node-preload": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/node-preload/-/node-preload-0.2.1.tgz", + "integrity": "sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==", + "dev": true, + "dependencies": { + "process-on-spawn": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/node-releases": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", + "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", + "dev": true + }, + "node_modules/nodemailer": { + "version": "6.7.3", + "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.7.3.tgz", + "integrity": "sha512-KUdDsspqx89sD4UUyUKzdlUOper3hRkDVkrKh/89G+d9WKsU5ox51NWS4tB1XR5dPUdR4SP0E3molyEfOvSa3g==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/nodemailer-fetch": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/nodemailer-fetch/-/nodemailer-fetch-1.3.0.tgz", + "integrity": "sha512-5P5+lR0+sWvk1UZGFoTida33dG0xAqk1Pv0t7cPlrJ09dLdZWh/kenxb0vOoUoNVOci4gmSYOnMHzvheSBeFag==" + }, + "node_modules/nodemailer-shared": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/nodemailer-shared/-/nodemailer-shared-1.0.4.tgz", + "integrity": "sha512-tfqdDPbj6L3PywhNqCa988bDxxnffo3Gw0DZkaYwOYVsnMZFgF7LoffS4FAFbiGb1M+mcNBPX/Vy9l0A95fJAg==", + "dependencies": { + "nodemailer-fetch": "1.3.0" + } + }, + "node_modules/nodemailer-smtp-transport": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/nodemailer-smtp-transport/-/nodemailer-smtp-transport-2.4.2.tgz", + "integrity": "sha512-VD3oQ5Xzgszg+2f0H3qAnXhciF6pZ9j2hHNaJqHEzh+caEs/cU1dDmCbpdN2bJxPYBeCilA2XshhtEnvxJgZGQ==", + "dependencies": { + "nodemailer-shared": "1.0.4", + "nodemailer-wellknown": "0.1.8", + "smtp-connection": "2.3.2" + } + }, + "node_modules/nodemailer-wellknown": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/nodemailer-wellknown/-/nodemailer-wellknown-0.1.8.tgz", + "integrity": "sha512-kxDRGWY6ZYtcKsCr4IMw5B9nST0EKK8Ay/JjgK96lBEdpt6nRl2ds5khTVv/BGLECbLIAzOsmIwP7KUt1C9frA==" + }, + "node_modules/nopt": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-7.2.0.tgz", + "integrity": "sha512-CVDtwCdhYIvnAzFoJ6NJ6dX3oga9/HyciQDnG1vQDjSLMeKLJ4A93ZqYKDrgYSr1FBY5/hMYC+2VCi24pgpkGA==", + "dev": true, + "dependencies": { + "abbrev": "^2.0.0" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/normalize-package-data": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", + "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", + "dependencies": { + "hosted-git-info": "^4.0.1", + "is-core-module": "^2.5.0", + "semver": "^7.3.4", + "validate-npm-package-license": "^3.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/normalize-package-data/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/normalize-package-data/node_modules/semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "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/normalize-url": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", + "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm": { + "version": "8.19.4", + "resolved": "https://registry.npmjs.org/npm/-/npm-8.19.4.tgz", + "integrity": "sha512-3HANl8i9DKnUA89P4KEgVNN28EjSeDCmvEqbzOAuxCFDzdBZzjUl99zgnGpOUumvW5lvJo2HKcjrsc+tfyv1Hw==", + "bundleDependencies": [ + "@isaacs/string-locale-compare", + "@npmcli/arborist", + "@npmcli/ci-detect", + "@npmcli/config", + "@npmcli/fs", + "@npmcli/map-workspaces", + "@npmcli/package-json", + "@npmcli/run-script", + "abbrev", + "archy", + "cacache", + "chalk", + "chownr", + "cli-columns", + "cli-table3", + "columnify", + "fastest-levenshtein", + "fs-minipass", + "glob", + "graceful-fs", + "hosted-git-info", + "ini", + "init-package-json", + "is-cidr", + "json-parse-even-better-errors", + "libnpmaccess", + "libnpmdiff", + "libnpmexec", + "libnpmfund", + "libnpmhook", + "libnpmorg", + "libnpmpack", + "libnpmpublish", + "libnpmsearch", + "libnpmteam", + "libnpmversion", + "make-fetch-happen", + "minimatch", + "minipass", + "minipass-pipeline", + "mkdirp", + "mkdirp-infer-owner", + "ms", + "node-gyp", + "nopt", + "npm-audit-report", + "npm-install-checks", + "npm-package-arg", + "npm-pick-manifest", + "npm-profile", + "npm-registry-fetch", + "npm-user-validate", + "npmlog", + "opener", + "p-map", + "pacote", + "parse-conflict-json", + "proc-log", + "qrcode-terminal", + "read", + "read-package-json", + "read-package-json-fast", + "readdir-scoped-modules", + "rimraf", + "semver", + "ssri", + "tar", + "text-table", + "tiny-relative-date", + "treeverse", + "validate-npm-package-name", + "which", + "write-file-atomic" + ], + "dependencies": { + "@isaacs/string-locale-compare": "^1.1.0", + "@npmcli/arborist": "^5.6.3", + "@npmcli/ci-detect": "^2.0.0", + "@npmcli/config": "^4.2.1", + "@npmcli/fs": "^2.1.0", + "@npmcli/map-workspaces": "^2.0.3", + "@npmcli/package-json": "^2.0.0", + "@npmcli/run-script": "^4.2.1", + "abbrev": "~1.1.1", + "archy": "~1.0.0", + "cacache": "^16.1.3", + "chalk": "^4.1.2", + "chownr": "^2.0.0", + "cli-columns": "^4.0.0", + "cli-table3": "^0.6.2", + "columnify": "^1.6.0", + "fastest-levenshtein": "^1.0.12", + "fs-minipass": "^2.1.0", + "glob": "^8.0.1", + "graceful-fs": "^4.2.10", + "hosted-git-info": "^5.2.1", + "ini": "^3.0.1", + "init-package-json": "^3.0.2", + "is-cidr": "^4.0.2", + "json-parse-even-better-errors": "^2.3.1", + "libnpmaccess": "^6.0.4", + "libnpmdiff": "^4.0.5", + "libnpmexec": "^4.0.14", + "libnpmfund": "^3.0.5", + "libnpmhook": "^8.0.4", + "libnpmorg": "^4.0.4", + "libnpmpack": "^4.1.3", + "libnpmpublish": "^6.0.5", + "libnpmsearch": "^5.0.4", + "libnpmteam": "^4.0.4", + "libnpmversion": "^3.0.7", + "make-fetch-happen": "^10.2.0", + "minimatch": "^5.1.0", + "minipass": "^3.1.6", + "minipass-pipeline": "^1.2.4", + "mkdirp": "^1.0.4", + "mkdirp-infer-owner": "^2.0.0", + "ms": "^2.1.2", + "node-gyp": "^9.1.0", + "nopt": "^6.0.0", + "npm-audit-report": "^3.0.0", + "npm-install-checks": "^5.0.0", + "npm-package-arg": "^9.1.0", + "npm-pick-manifest": "^7.0.2", + "npm-profile": "^6.2.0", + "npm-registry-fetch": "^13.3.1", + "npm-user-validate": "^1.0.1", + "npmlog": "^6.0.2", + "opener": "^1.5.2", + "p-map": "^4.0.0", + "pacote": "^13.6.2", + "parse-conflict-json": "^2.0.2", + "proc-log": "^2.0.1", + "qrcode-terminal": "^0.12.0", + "read": "~1.0.7", + "read-package-json": "^5.0.2", + "read-package-json-fast": "^2.0.3", + "readdir-scoped-modules": "^1.1.0", + "rimraf": "^3.0.2", + "semver": "^7.3.7", + "ssri": "^9.0.1", + "tar": "^6.1.11", + "text-table": "~0.2.0", + "tiny-relative-date": "^1.3.0", + "treeverse": "^2.0.0", + "validate-npm-package-name": "^4.0.0", + "which": "^2.0.2", + "write-file-atomic": "^4.0.1" + }, + "bin": { + "npm": "bin/npm-cli.js", + "npx": "bin/npx-cli.js" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.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/npm/node_modules/@colors/colors": { + "version": "1.5.0", + "inBundle": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/npm/node_modules/@gar/promisify": { + "version": "1.1.3", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/@isaacs/string-locale-compare": { + "version": "1.1.0", + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/@npmcli/arborist": { + "version": "5.6.3", + "inBundle": true, + "license": "ISC", + "dependencies": { + "@isaacs/string-locale-compare": "^1.1.0", + "@npmcli/installed-package-contents": "^1.0.7", + "@npmcli/map-workspaces": "^2.0.3", + "@npmcli/metavuln-calculator": "^3.0.1", + "@npmcli/move-file": "^2.0.0", + "@npmcli/name-from-folder": "^1.0.1", + "@npmcli/node-gyp": "^2.0.0", + "@npmcli/package-json": "^2.0.0", + "@npmcli/query": "^1.2.0", + "@npmcli/run-script": "^4.1.3", + "bin-links": "^3.0.3", + "cacache": "^16.1.3", + "common-ancestor-path": "^1.0.1", + "hosted-git-info": "^5.2.1", + "json-parse-even-better-errors": "^2.3.1", + "json-stringify-nice": "^1.1.4", + "minimatch": "^5.1.0", + "mkdirp": "^1.0.4", + "mkdirp-infer-owner": "^2.0.0", + "nopt": "^6.0.0", + "npm-install-checks": "^5.0.0", + "npm-package-arg": "^9.0.0", + "npm-pick-manifest": "^7.0.2", + "npm-registry-fetch": "^13.0.0", + "npmlog": "^6.0.2", + "pacote": "^13.6.1", + "parse-conflict-json": "^2.0.1", + "proc-log": "^2.0.0", + "promise-all-reject-late": "^1.0.0", + "promise-call-limit": "^1.0.1", + "read-package-json-fast": "^2.0.2", + "readdir-scoped-modules": "^1.1.0", + "rimraf": "^3.0.2", + "semver": "^7.3.7", + "ssri": "^9.0.0", + "treeverse": "^2.0.0", + "walk-up-path": "^1.0.0" + }, + "bin": { + "arborist": "bin/index.js" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/npm/node_modules/@npmcli/ci-detect": { + "version": "2.0.0", + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16" + } + }, + "node_modules/npm/node_modules/@npmcli/config": { + "version": "4.2.2", + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/map-workspaces": "^2.0.2", + "ini": "^3.0.0", + "mkdirp-infer-owner": "^2.0.0", + "nopt": "^6.0.0", + "proc-log": "^2.0.0", + "read-package-json-fast": "^2.0.3", + "semver": "^7.3.5", + "walk-up-path": "^1.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/npm/node_modules/@npmcli/disparity-colors": { + "version": "2.0.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "ansi-styles": "^4.3.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/npm/node_modules/@npmcli/fs": { + "version": "2.1.2", + "inBundle": true, + "license": "ISC", + "dependencies": { + "@gar/promisify": "^1.1.3", + "semver": "^7.3.5" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/npm/node_modules/@npmcli/git": { + "version": "3.0.2", + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/promise-spawn": "^3.0.0", + "lru-cache": "^7.4.4", + "mkdirp": "^1.0.4", + "npm-pick-manifest": "^7.0.0", + "proc-log": "^2.0.0", + "promise-inflight": "^1.0.1", + "promise-retry": "^2.0.1", + "semver": "^7.3.5", + "which": "^2.0.2" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/npm/node_modules/@npmcli/installed-package-contents": { + "version": "1.0.7", + "inBundle": true, + "license": "ISC", + "dependencies": { + "npm-bundled": "^1.1.1", + "npm-normalize-package-bin": "^1.0.1" + }, + "bin": { + "installed-package-contents": "index.js" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/npm/node_modules/@npmcli/installed-package-contents/node_modules/npm-bundled": { + "version": "1.1.2", + "inBundle": true, + "license": "ISC", + "dependencies": { + "npm-normalize-package-bin": "^1.0.1" + } + }, + "node_modules/npm/node_modules/@npmcli/map-workspaces": { + "version": "2.0.4", + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/name-from-folder": "^1.0.1", + "glob": "^8.0.1", + "minimatch": "^5.0.1", + "read-package-json-fast": "^2.0.3" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/npm/node_modules/@npmcli/metavuln-calculator": { + "version": "3.1.1", + "inBundle": true, + "license": "ISC", + "dependencies": { + "cacache": "^16.0.0", + "json-parse-even-better-errors": "^2.3.1", + "pacote": "^13.0.3", + "semver": "^7.3.5" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/npm/node_modules/@npmcli/move-file": { + "version": "2.0.1", + "inBundle": true, + "license": "MIT", + "dependencies": { + "mkdirp": "^1.0.4", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/npm/node_modules/@npmcli/name-from-folder": { + "version": "1.0.1", + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/@npmcli/node-gyp": { + "version": "2.0.0", + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/npm/node_modules/@npmcli/package-json": { + "version": "2.0.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "json-parse-even-better-errors": "^2.3.1" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/npm/node_modules/@npmcli/promise-spawn": { + "version": "3.0.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "infer-owner": "^1.0.4" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/npm/node_modules/@npmcli/query": { + "version": "1.2.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "npm-package-arg": "^9.1.0", + "postcss-selector-parser": "^6.0.10", + "semver": "^7.3.7" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/npm/node_modules/@npmcli/run-script": { + "version": "4.2.1", + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/node-gyp": "^2.0.0", + "@npmcli/promise-spawn": "^3.0.0", + "node-gyp": "^9.0.0", + "read-package-json-fast": "^2.0.3", + "which": "^2.0.2" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/npm/node_modules/@tootallnate/once": { + "version": "2.0.0", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/npm/node_modules/abbrev": { + "version": "1.1.1", + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/agent-base": { + "version": "6.0.2", + "inBundle": true, + "license": "MIT", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/npm/node_modules/agentkeepalive": { + "version": "4.2.1", + "inBundle": true, + "license": "MIT", + "dependencies": { + "debug": "^4.1.0", + "depd": "^1.1.2", + "humanize-ms": "^1.2.1" + }, + "engines": { + "node": ">= 8.0.0" + } + }, + "node_modules/npm/node_modules/aggregate-error": { + "version": "3.1.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/ansi-regex": { + "version": "5.0.1", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/ansi-styles": { + "version": "4.3.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/npm/node_modules/aproba": { + "version": "2.0.0", + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/archy": { + "version": "1.0.0", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/are-we-there-yet": { + "version": "3.0.1", + "inBundle": true, + "license": "ISC", + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/npm/node_modules/asap": { + "version": "2.0.6", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/balanced-match": { + "version": "1.0.2", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/bin-links": { + "version": "3.0.3", + "inBundle": true, + "license": "ISC", + "dependencies": { + "cmd-shim": "^5.0.0", + "mkdirp-infer-owner": "^2.0.0", + "npm-normalize-package-bin": "^2.0.0", + "read-cmd-shim": "^3.0.0", + "rimraf": "^3.0.0", + "write-file-atomic": "^4.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/npm/node_modules/bin-links/node_modules/npm-normalize-package-bin": { + "version": "2.0.0", + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/npm/node_modules/binary-extensions": { + "version": "2.2.0", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/brace-expansion": { + "version": "2.0.1", + "inBundle": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/npm/node_modules/builtins": { + "version": "5.0.1", + "inBundle": true, + "license": "MIT", + "dependencies": { + "semver": "^7.0.0" + } + }, + "node_modules/npm/node_modules/cacache": { + "version": "16.1.3", + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/fs": "^2.1.0", + "@npmcli/move-file": "^2.0.0", + "chownr": "^2.0.0", + "fs-minipass": "^2.1.0", + "glob": "^8.0.1", + "infer-owner": "^1.0.4", + "lru-cache": "^7.7.1", + "minipass": "^3.1.6", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "mkdirp": "^1.0.4", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^9.0.0", + "tar": "^6.1.11", + "unique-filename": "^2.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/npm/node_modules/chalk": { + "version": "4.1.2", + "inBundle": true, + "license": "MIT", + "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/npm/node_modules/chownr": { + "version": "2.0.0", + "inBundle": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/npm/node_modules/cidr-regex": { + "version": "3.1.1", + "inBundle": true, + "license": "BSD-2-Clause", + "dependencies": { + "ip-regex": "^4.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/npm/node_modules/clean-stack": { + "version": "2.2.0", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/npm/node_modules/cli-columns": { + "version": "4.0.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/npm/node_modules/cli-table3": { + "version": "0.6.2", + "inBundle": true, + "license": "MIT", + "dependencies": { + "string-width": "^4.2.0" + }, + "engines": { + "node": "10.* || >= 12.*" + }, + "optionalDependencies": { + "@colors/colors": "1.5.0" + } + }, + "node_modules/npm/node_modules/clone": { + "version": "1.0.4", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/npm/node_modules/cmd-shim": { + "version": "5.0.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "mkdirp-infer-owner": "^2.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/npm/node_modules/color-convert": { + "version": "2.0.1", + "inBundle": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/npm/node_modules/color-name": { + "version": "1.1.4", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/color-support": { + "version": "1.1.3", + "inBundle": true, + "license": "ISC", + "bin": { + "color-support": "bin.js" + } + }, + "node_modules/npm/node_modules/columnify": { + "version": "1.6.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "strip-ansi": "^6.0.1", + "wcwidth": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/npm/node_modules/common-ancestor-path": { + "version": "1.0.1", + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/concat-map": { + "version": "0.0.1", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/console-control-strings": { + "version": "1.1.0", + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/cssesc": { + "version": "3.0.0", + "inBundle": true, + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/npm/node_modules/debug": { + "version": "4.3.4", + "inBundle": true, + "license": "MIT", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/npm/node_modules/debug/node_modules/ms": { + "version": "2.1.2", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/debuglog": { + "version": "1.0.1", + "inBundle": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/npm/node_modules/defaults": { + "version": "1.0.3", + "inBundle": true, + "license": "MIT", + "dependencies": { + "clone": "^1.0.2" + } + }, + "node_modules/npm/node_modules/delegates": { + "version": "1.0.0", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/depd": { + "version": "1.1.2", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/npm/node_modules/dezalgo": { + "version": "1.0.4", + "inBundle": true, + "license": "ISC", + "dependencies": { + "asap": "^2.0.0", + "wrappy": "1" + } + }, + "node_modules/npm/node_modules/diff": { + "version": "5.1.0", + "inBundle": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/npm/node_modules/emoji-regex": { + "version": "8.0.0", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/encoding": { + "version": "0.1.13", + "inBundle": true, + "license": "MIT", + "optional": true, + "dependencies": { + "iconv-lite": "^0.6.2" + } + }, + "node_modules/npm/node_modules/env-paths": { + "version": "2.2.1", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/npm/node_modules/err-code": { + "version": "2.0.3", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/fastest-levenshtein": { + "version": "1.0.12", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/fs-minipass": { + "version": "2.1.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/npm/node_modules/fs.realpath": { + "version": "1.0.0", + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/function-bind": { + "version": "1.1.1", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/gauge": { + "version": "4.0.4", + "inBundle": true, + "license": "ISC", + "dependencies": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.3", + "console-control-strings": "^1.1.0", + "has-unicode": "^2.0.1", + "signal-exit": "^3.0.7", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.5" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/npm/node_modules/glob": { + "version": "8.0.3", + "inBundle": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/npm/node_modules/graceful-fs": { + "version": "4.2.10", + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/has": { + "version": "1.0.3", + "inBundle": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/npm/node_modules/has-flag": { + "version": "4.0.0", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/has-unicode": { + "version": "2.0.1", + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/hosted-git-info": { + "version": "5.2.1", + "inBundle": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^7.5.1" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/npm/node_modules/http-cache-semantics": { + "version": "4.1.1", + "inBundle": true, + "license": "BSD-2-Clause" + }, + "node_modules/npm/node_modules/http-proxy-agent": { + "version": "5.0.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/npm/node_modules/https-proxy-agent": { + "version": "5.0.1", + "inBundle": true, + "license": "MIT", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/npm/node_modules/humanize-ms": { + "version": "1.2.1", + "inBundle": true, + "license": "MIT", + "dependencies": { + "ms": "^2.0.0" + } + }, + "node_modules/npm/node_modules/iconv-lite": { + "version": "0.6.3", + "inBundle": true, + "license": "MIT", + "optional": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm/node_modules/ignore-walk": { + "version": "5.0.1", + "inBundle": true, + "license": "ISC", + "dependencies": { + "minimatch": "^5.0.1" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/npm/node_modules/imurmurhash": { + "version": "0.1.4", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/npm/node_modules/indent-string": { + "version": "4.0.0", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/infer-owner": { + "version": "1.0.4", + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/inflight": { + "version": "1.0.6", + "inBundle": true, + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/npm/node_modules/inherits": { + "version": "2.0.4", + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/ini": { + "version": "3.0.1", + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/npm/node_modules/init-package-json": { + "version": "3.0.2", + "inBundle": true, + "license": "ISC", + "dependencies": { + "npm-package-arg": "^9.0.1", + "promzard": "^0.3.0", + "read": "^1.0.7", + "read-package-json": "^5.0.0", + "semver": "^7.3.5", + "validate-npm-package-license": "^3.0.4", + "validate-npm-package-name": "^4.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/npm/node_modules/ip": { + "version": "2.0.0", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/ip-regex": { + "version": "4.3.0", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/is-cidr": { + "version": "4.0.2", + "inBundle": true, + "license": "BSD-2-Clause", + "dependencies": { + "cidr-regex": "^3.1.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/npm/node_modules/is-core-module": { + "version": "2.10.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/npm/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/is-lambda": { + "version": "1.0.1", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/isexe": { + "version": "2.0.0", + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/json-stringify-nice": { + "version": "1.1.4", + "inBundle": true, + "license": "ISC", + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/npm/node_modules/jsonparse": { + "version": "1.3.1", + "engines": [ + "node >= 0.2.0" + ], + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/just-diff": { + "version": "5.1.1", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/just-diff-apply": { + "version": "5.4.1", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/libnpmaccess": { + "version": "6.0.4", + "inBundle": true, + "license": "ISC", + "dependencies": { + "aproba": "^2.0.0", + "minipass": "^3.1.1", + "npm-package-arg": "^9.0.1", + "npm-registry-fetch": "^13.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/npm/node_modules/libnpmdiff": { + "version": "4.0.5", + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/disparity-colors": "^2.0.0", + "@npmcli/installed-package-contents": "^1.0.7", + "binary-extensions": "^2.2.0", + "diff": "^5.1.0", + "minimatch": "^5.0.1", + "npm-package-arg": "^9.0.1", + "pacote": "^13.6.1", + "tar": "^6.1.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/npm/node_modules/libnpmexec": { + "version": "4.0.14", + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/arborist": "^5.6.3", + "@npmcli/ci-detect": "^2.0.0", + "@npmcli/fs": "^2.1.1", + "@npmcli/run-script": "^4.2.0", + "chalk": "^4.1.0", + "mkdirp-infer-owner": "^2.0.0", + "npm-package-arg": "^9.0.1", + "npmlog": "^6.0.2", + "pacote": "^13.6.1", + "proc-log": "^2.0.0", + "read": "^1.0.7", + "read-package-json-fast": "^2.0.2", + "semver": "^7.3.7", + "walk-up-path": "^1.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/npm/node_modules/libnpmfund": { + "version": "3.0.5", + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/arborist": "^5.6.3" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/npm/node_modules/libnpmhook": { + "version": "8.0.4", + "inBundle": true, + "license": "ISC", + "dependencies": { + "aproba": "^2.0.0", + "npm-registry-fetch": "^13.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/npm/node_modules/libnpmorg": { + "version": "4.0.4", + "inBundle": true, + "license": "ISC", + "dependencies": { + "aproba": "^2.0.0", + "npm-registry-fetch": "^13.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/npm/node_modules/libnpmpack": { + "version": "4.1.3", + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/run-script": "^4.1.3", + "npm-package-arg": "^9.0.1", + "pacote": "^13.6.1" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/npm/node_modules/libnpmpublish": { + "version": "6.0.5", + "inBundle": true, + "license": "ISC", + "dependencies": { + "normalize-package-data": "^4.0.0", + "npm-package-arg": "^9.0.1", + "npm-registry-fetch": "^13.0.0", + "semver": "^7.3.7", + "ssri": "^9.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/npm/node_modules/libnpmsearch": { + "version": "5.0.4", + "inBundle": true, + "license": "ISC", + "dependencies": { + "npm-registry-fetch": "^13.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/npm/node_modules/libnpmteam": { + "version": "4.0.4", + "inBundle": true, + "license": "ISC", + "dependencies": { + "aproba": "^2.0.0", + "npm-registry-fetch": "^13.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/npm/node_modules/libnpmversion": { + "version": "3.0.7", + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/git": "^3.0.0", + "@npmcli/run-script": "^4.1.3", + "json-parse-even-better-errors": "^2.3.1", + "proc-log": "^2.0.0", + "semver": "^7.3.7" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/npm/node_modules/lru-cache": { + "version": "7.13.2", + "inBundle": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/npm/node_modules/make-fetch-happen": { + "version": "10.2.1", + "inBundle": true, + "license": "ISC", + "dependencies": { + "agentkeepalive": "^4.2.1", + "cacache": "^16.1.0", + "http-cache-semantics": "^4.1.0", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^7.7.1", + "minipass": "^3.1.6", + "minipass-collect": "^1.0.2", + "minipass-fetch": "^2.0.3", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.3", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^7.0.0", + "ssri": "^9.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/npm/node_modules/minimatch": { + "version": "5.1.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/npm/node_modules/minipass": { + "version": "3.3.4", + "inBundle": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/minipass-collect": { + "version": "1.0.2", + "inBundle": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/npm/node_modules/minipass-fetch": { + "version": "2.1.1", + "inBundle": true, + "license": "MIT", + "dependencies": { + "minipass": "^3.1.6", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + }, + "optionalDependencies": { + "encoding": "^0.1.13" + } + }, + "node_modules/npm/node_modules/minipass-flush": { + "version": "1.0.5", + "inBundle": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/npm/node_modules/minipass-json-stream": { + "version": "1.0.1", + "inBundle": true, + "license": "MIT", + "dependencies": { + "jsonparse": "^1.3.1", + "minipass": "^3.0.0" + } + }, + "node_modules/npm/node_modules/minipass-pipeline": { + "version": "1.2.4", + "inBundle": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/minipass-sized": { + "version": "1.0.3", + "inBundle": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/minizlib": { + "version": "2.1.2", + "inBundle": true, + "license": "MIT", + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/npm/node_modules/mkdirp": { + "version": "1.0.4", + "inBundle": true, + "license": "MIT", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/npm/node_modules/mkdirp-infer-owner": { + "version": "2.0.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "chownr": "^2.0.0", + "infer-owner": "^1.0.4", + "mkdirp": "^1.0.3" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/npm/node_modules/ms": { + "version": "2.1.3", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/mute-stream": { + "version": "0.0.8", + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/negotiator": { + "version": "0.6.3", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/npm/node_modules/node-gyp": { + "version": "9.1.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "env-paths": "^2.2.0", + "glob": "^7.1.4", + "graceful-fs": "^4.2.6", + "make-fetch-happen": "^10.0.3", + "nopt": "^5.0.0", + "npmlog": "^6.0.0", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.2", + "which": "^2.0.2" + }, + "bin": { + "node-gyp": "bin/node-gyp.js" + }, + "engines": { + "node": "^12.22 || ^14.13 || >=16" + } + }, + "node_modules/npm/node_modules/node-gyp/node_modules/brace-expansion": { + "version": "1.1.11", + "inBundle": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/npm/node_modules/node-gyp/node_modules/glob": { + "version": "7.2.3", + "inBundle": true, + "license": "ISC", + "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/npm/node_modules/node-gyp/node_modules/minimatch": { + "version": "3.1.2", + "inBundle": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/npm/node_modules/node-gyp/node_modules/nopt": { + "version": "5.0.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/npm/node_modules/nopt": { + "version": "6.0.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "abbrev": "^1.0.0" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/npm/node_modules/normalize-package-data": { + "version": "4.0.1", + "inBundle": true, + "license": "BSD-2-Clause", + "dependencies": { + "hosted-git-info": "^5.0.0", + "is-core-module": "^2.8.1", + "semver": "^7.3.5", + "validate-npm-package-license": "^3.0.4" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/npm/node_modules/npm-audit-report": { + "version": "3.0.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "chalk": "^4.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/npm/node_modules/npm-bundled": { + "version": "2.0.1", + "inBundle": true, + "license": "ISC", + "dependencies": { + "npm-normalize-package-bin": "^2.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/npm/node_modules/npm-bundled/node_modules/npm-normalize-package-bin": { + "version": "2.0.0", + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/npm/node_modules/npm-install-checks": { + "version": "5.0.0", + "inBundle": true, + "license": "BSD-2-Clause", + "dependencies": { + "semver": "^7.1.1" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/npm/node_modules/npm-normalize-package-bin": { + "version": "1.0.1", + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/npm-package-arg": { + "version": "9.1.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "hosted-git-info": "^5.0.0", + "proc-log": "^2.0.1", + "semver": "^7.3.5", + "validate-npm-package-name": "^4.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/npm/node_modules/npm-packlist": { + "version": "5.1.3", + "inBundle": true, + "license": "ISC", + "dependencies": { + "glob": "^8.0.1", + "ignore-walk": "^5.0.1", + "npm-bundled": "^2.0.0", + "npm-normalize-package-bin": "^2.0.0" + }, + "bin": { + "npm-packlist": "bin/index.js" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/npm/node_modules/npm-packlist/node_modules/npm-normalize-package-bin": { + "version": "2.0.0", + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/npm/node_modules/npm-pick-manifest": { + "version": "7.0.2", + "inBundle": true, + "license": "ISC", + "dependencies": { + "npm-install-checks": "^5.0.0", + "npm-normalize-package-bin": "^2.0.0", + "npm-package-arg": "^9.0.0", + "semver": "^7.3.5" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/npm/node_modules/npm-pick-manifest/node_modules/npm-normalize-package-bin": { + "version": "2.0.0", + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/npm/node_modules/npm-profile": { + "version": "6.2.1", + "inBundle": true, + "license": "ISC", + "dependencies": { + "npm-registry-fetch": "^13.0.1", + "proc-log": "^2.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/npm/node_modules/npm-registry-fetch": { + "version": "13.3.1", + "inBundle": true, + "license": "ISC", + "dependencies": { + "make-fetch-happen": "^10.0.6", + "minipass": "^3.1.6", + "minipass-fetch": "^2.0.3", + "minipass-json-stream": "^1.0.1", + "minizlib": "^2.1.2", + "npm-package-arg": "^9.0.1", + "proc-log": "^2.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/npm/node_modules/npm-user-validate": { + "version": "1.0.1", + "inBundle": true, + "license": "BSD-2-Clause" + }, + "node_modules/npm/node_modules/npmlog": { + "version": "6.0.2", + "inBundle": true, + "license": "ISC", + "dependencies": { + "are-we-there-yet": "^3.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^4.0.3", + "set-blocking": "^2.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/npm/node_modules/once": { + "version": "1.4.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/npm/node_modules/opener": { + "version": "1.5.2", + "inBundle": true, + "license": "(WTFPL OR MIT)", + "bin": { + "opener": "bin/opener-bin.js" + } + }, + "node_modules/npm/node_modules/p-map": { + "version": "4.0.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm/node_modules/pacote": { + "version": "13.6.2", + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/git": "^3.0.0", + "@npmcli/installed-package-contents": "^1.0.7", + "@npmcli/promise-spawn": "^3.0.0", + "@npmcli/run-script": "^4.1.0", + "cacache": "^16.0.0", + "chownr": "^2.0.0", + "fs-minipass": "^2.1.0", + "infer-owner": "^1.0.4", + "minipass": "^3.1.6", + "mkdirp": "^1.0.4", + "npm-package-arg": "^9.0.0", + "npm-packlist": "^5.1.0", + "npm-pick-manifest": "^7.0.0", + "npm-registry-fetch": "^13.0.1", + "proc-log": "^2.0.0", + "promise-retry": "^2.0.1", + "read-package-json": "^5.0.0", + "read-package-json-fast": "^2.0.3", + "rimraf": "^3.0.2", + "ssri": "^9.0.0", + "tar": "^6.1.11" + }, + "bin": { + "pacote": "lib/bin.js" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/npm/node_modules/parse-conflict-json": { + "version": "2.0.2", + "inBundle": true, + "license": "ISC", + "dependencies": { + "json-parse-even-better-errors": "^2.3.1", + "just-diff": "^5.0.1", + "just-diff-apply": "^5.2.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/npm/node_modules/path-is-absolute": { + "version": "1.0.1", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm/node_modules/postcss-selector-parser": { + "version": "6.0.10", + "inBundle": true, + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/npm/node_modules/proc-log": { + "version": "2.0.1", + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/npm/node_modules/promise-all-reject-late": { + "version": "1.0.1", + "inBundle": true, + "license": "ISC", + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/npm/node_modules/promise-call-limit": { + "version": "1.0.1", + "inBundle": true, + "license": "ISC", + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/npm/node_modules/promise-inflight": { + "version": "1.0.1", + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/promise-retry": { + "version": "2.0.1", + "inBundle": true, + "license": "MIT", + "dependencies": { + "err-code": "^2.0.2", + "retry": "^0.12.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/npm/node_modules/promzard": { + "version": "0.3.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "read": "1" + } + }, + "node_modules/npm/node_modules/qrcode-terminal": { + "version": "0.12.0", + "inBundle": true, + "bin": { + "qrcode-terminal": "bin/qrcode-terminal.js" + } + }, + "node_modules/npm/node_modules/read": { + "version": "1.0.7", + "inBundle": true, + "license": "ISC", + "dependencies": { + "mute-stream": "~0.0.4" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/npm/node_modules/read-cmd-shim": { + "version": "3.0.0", + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/npm/node_modules/read-package-json": { + "version": "5.0.2", + "inBundle": true, + "license": "ISC", + "dependencies": { + "glob": "^8.0.1", + "json-parse-even-better-errors": "^2.3.1", + "normalize-package-data": "^4.0.0", + "npm-normalize-package-bin": "^2.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/npm/node_modules/read-package-json-fast": { + "version": "2.0.3", + "inBundle": true, + "license": "ISC", + "dependencies": { + "json-parse-even-better-errors": "^2.3.0", + "npm-normalize-package-bin": "^1.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/npm/node_modules/read-package-json/node_modules/npm-normalize-package-bin": { + "version": "2.0.0", + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/npm/node_modules/readable-stream": { + "version": "3.6.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/npm/node_modules/readdir-scoped-modules": { + "version": "1.1.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "debuglog": "^1.0.1", + "dezalgo": "^1.0.0", + "graceful-fs": "^4.1.2", + "once": "^1.3.0" + } + }, + "node_modules/npm/node_modules/retry": { + "version": "0.12.0", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/npm/node_modules/rimraf": { + "version": "3.0.2", + "inBundle": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/npm/node_modules/rimraf/node_modules/brace-expansion": { + "version": "1.1.11", + "inBundle": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/npm/node_modules/rimraf/node_modules/glob": { + "version": "7.2.3", + "inBundle": true, + "license": "ISC", + "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/npm/node_modules/rimraf/node_modules/minimatch": { + "version": "3.1.2", + "inBundle": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/npm/node_modules/safe-buffer": { + "version": "5.2.1", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/safer-buffer": { + "version": "2.1.2", + "inBundle": true, + "license": "MIT", + "optional": true + }, + "node_modules/npm/node_modules/semver": { + "version": "7.3.7", + "inBundle": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/npm/node_modules/semver/node_modules/lru-cache": { + "version": "6.0.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/npm/node_modules/set-blocking": { + "version": "2.0.0", + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/signal-exit": { + "version": "3.0.7", + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/smart-buffer": { + "version": "4.2.0", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/npm/node_modules/socks": { + "version": "2.7.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "ip": "^2.0.0", + "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.13.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/npm/node_modules/socks-proxy-agent": { + "version": "7.0.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "agent-base": "^6.0.2", + "debug": "^4.3.3", + "socks": "^2.6.2" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/npm/node_modules/spdx-correct": { + "version": "3.1.1", + "inBundle": true, + "license": "Apache-2.0", + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/npm/node_modules/spdx-exceptions": { + "version": "2.3.0", + "inBundle": true, + "license": "CC-BY-3.0" + }, + "node_modules/npm/node_modules/spdx-expression-parse": { + "version": "3.0.1", + "inBundle": true, + "license": "MIT", + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/npm/node_modules/spdx-license-ids": { + "version": "3.0.11", + "inBundle": true, + "license": "CC0-1.0" + }, + "node_modules/npm/node_modules/ssri": { + "version": "9.0.1", + "inBundle": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.1.1" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/npm/node_modules/string_decoder": { + "version": "1.3.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/npm/node_modules/string-width": { + "version": "4.2.3", + "inBundle": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/strip-ansi": { + "version": "6.0.1", + "inBundle": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/supports-color": { + "version": "7.2.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/tar": { + "version": "6.1.11", + "inBundle": true, + "license": "ISC", + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^3.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/npm/node_modules/text-table": { + "version": "0.2.0", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/tiny-relative-date": { + "version": "1.3.0", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/treeverse": { + "version": "2.0.0", + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/npm/node_modules/unique-filename": { + "version": "2.0.1", + "inBundle": true, + "license": "ISC", + "dependencies": { + "unique-slug": "^3.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/npm/node_modules/unique-slug": { + "version": "3.0.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/npm/node_modules/util-deprecate": { + "version": "1.0.2", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/validate-npm-package-license": { + "version": "3.0.4", + "inBundle": true, + "license": "Apache-2.0", + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/npm/node_modules/validate-npm-package-name": { + "version": "4.0.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "builtins": "^5.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/npm/node_modules/walk-up-path": { + "version": "1.0.0", + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/wcwidth": { + "version": "1.0.1", + "inBundle": true, + "license": "MIT", + "dependencies": { + "defaults": "^1.0.3" + } + }, + "node_modules/npm/node_modules/which": { + "version": "2.0.2", + "inBundle": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/npm/node_modules/wide-align": { + "version": "1.1.5", + "inBundle": true, + "license": "ISC", + "dependencies": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } + }, + "node_modules/npm/node_modules/wrappy": { + "version": "1.0.2", + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/write-file-atomic": { + "version": "4.0.2", + "inBundle": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/npm/node_modules/yallist": { + "version": "4.0.0", + "inBundle": true, + "license": "ISC" + }, + "node_modules/npmlog": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz", + "integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==", + "optional": true, + "dependencies": { + "are-we-there-yet": "^3.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^4.0.3", + "set-blocking": "^2.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/nyc": { + "version": "15.0.0", + "resolved": "https://registry.npmjs.org/nyc/-/nyc-15.0.0.tgz", + "integrity": "sha512-qcLBlNCKMDVuKb7d1fpxjPR8sHeMVX0CHarXAVzrVWoFrigCkYR8xcrjfXSPi5HXM7EU78L6ywO7w1c5rZNCNg==", + "dev": true, + "dependencies": { + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "caching-transform": "^4.0.0", + "convert-source-map": "^1.7.0", + "decamelize": "^1.2.0", + "find-cache-dir": "^3.2.0", + "find-up": "^4.1.0", + "foreground-child": "^2.0.0", + "glob": "^7.1.6", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-hook": "^3.0.0", + "istanbul-lib-instrument": "^4.0.0", + "istanbul-lib-processinfo": "^2.0.2", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.0.0", + "js-yaml": "^3.13.1", + "make-dir": "^3.0.0", + "node-preload": "^0.2.0", + "p-map": "^3.0.0", + "process-on-spawn": "^1.0.0", + "resolve-from": "^5.0.0", + "rimraf": "^3.0.0", + "signal-exit": "^3.0.2", + "spawn-wrap": "^2.0.0", + "test-exclude": "^6.0.0", + "uuid": "^3.3.3", + "yargs": "^15.0.2" + }, + "bin": { + "nyc": "bin/nyc.js" + }, + "engines": { + "node": ">=8.9" + } + }, + "node_modules/nyc/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==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/nyc/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/nyc/node_modules/cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "node_modules/nyc/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/nyc/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/nyc/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nyc/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/nyc/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nyc/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/nyc/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nyc/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/nyc/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/nyc/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==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nyc/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==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nyc/node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nyc/node_modules/y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "dev": true + }, + "node_modules/nyc/node_modules/yargs": { + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "dev": true, + "dependencies": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nyc/node_modules/yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "dev": true, + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "engines": { + "node": "*" + } + }, + "node_modules/object-assign": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.0.1.tgz", + "integrity": "sha512-c6legOHWepAbWnp3j5SRUMpxCXBKI4rD7A5Osn9IzZ8w4O/KccXdW0lqdkQKbpk0eHGjNgKihgzY6WuEq99Tfw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-hash": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-1.3.1.tgz", + "integrity": "sha512-OSuu/pU4ENM9kmREg0BdNrUDIl1heYa4mBZacJc+vVWz4GtAwu7jO8s4AIt2aGRUTqxykpWzI3Oqnsm13tTMDA==", + "dev": true, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", + "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", + "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/on-error": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/on-error/-/on-error-2.1.0.tgz", + "integrity": "sha512-wpKXxCW2wXLI+9DB9DDBVuOCN9C5rjyaP4GWwqhgrSd2ys1Vyc9yGaPmC5HSOdQ30x9zCLozi9mHx3lm01E+LQ==" + }, + "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/on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", + "integrity": "sha512-6vaNInhu+CHxtONf3zw3vq4SP2DOQhjBvIa3rNcG0+P7eKWlYH6Peu7rHizSloRU2EwMz6GraLieis9Ac9+p1w==", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==", + "dev": true, + "dependencies": { + "mimic-fn": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "dev": true, + "dependencies": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/os": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/os/-/os-0.1.1.tgz", + "integrity": "sha512-jg06S2xr5De63mLjZVJDf3/k37tpjppr2LR7MUOsxv8XuUCVpCnvbCksXCBcB5gQqQf/K0+87WGTRlAj5q7r1A==" + }, + "node_modules/os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/p-each-series": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-2.2.0.tgz", + "integrity": "sha512-ycIL2+1V32th+8scbpTvyHNaHe02z0sjgh91XXjAk+ZeXoPN4Z46DVUnzdso0aX4KckKw0FNNFHdjZ2UsZvxiA==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-filter": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-filter/-/p-filter-2.1.0.tgz", + "integrity": "sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==", + "dependencies": { + "p-map": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-filter/node_modules/p-map": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", + "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", + "engines": { + "node": ">=6" + } + }, + "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/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/p-map": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", + "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", + "dev": true, + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-reduce": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-reduce/-/p-reduce-2.1.0.tgz", + "integrity": "sha512-2USApvnsutq8uoxZBGbbWM0JIYLiEMJ9RlaN7fAzVNb9OZN0SHjjTTfIcb667XynS5Y1VhwDJVDa72TnPzAYWw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/package-hash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-4.0.0.tgz", + "integrity": "sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.15", + "hasha": "^5.0.0", + "lodash.flattendeep": "^4.4.0", + "release-zalgo": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "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==", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parse-ms": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-2.1.0.tgz", + "integrity": "sha512-kHt7kzLoS9VBZfUsiKjv43mr91ea+U05EyKkEtqp7vNbHxmaVuEqN7XxeEVnGrMtYOAxGrDElSi96K7EgO1zCA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "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": { + "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/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==", + "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-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==", + "dev": true + }, + "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-scurry": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.1.tgz", + "integrity": "sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==", + "dev": true, + "dependencies": { + "lru-cache": "^9.1.1 || ^10.0.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.0.tgz", + "integrity": "sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==", + "dev": true, + "engines": { + "node": "14 || >=16.14" + } + }, + "node_modules/path-scurry/node_modules/minipass": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", + "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "dev": true, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "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/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/performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==" + }, + "node_modules/pg-connection-string": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.6.2.tgz", + "integrity": "sha512-ch6OwaeaPYcova4kKZ15sbJ2hKb/VP48ZD2gE7i1J+L4MspCtBMAx8nMgz7bksc7IojCIIWuEhHibSMFH8m8oA==" + }, + "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==", + "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/pino": { + "version": "6.6.1", + "resolved": "https://registry.npmjs.org/pino/-/pino-6.6.1.tgz", + "integrity": "sha512-DOgm7rn6ctBkBYemHXSLj7+j3o3U1q1FWBXbHcprur8mA93QcJSycEkEqhqKiFB9Mx/3Qld2FGr6+9yfQza0kA==", + "dependencies": { + "fast-redact": "^2.0.0", + "fast-safe-stringify": "^2.0.7", + "flatstr": "^1.0.12", + "pino-std-serializers": "^2.4.2", + "quick-format-unescaped": "^4.0.1", + "sonic-boom": "^1.0.2" + }, + "bin": { + "pino": "bin.js" + } + }, + "node_modules/pino-std-serializers": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-2.5.0.tgz", + "integrity": "sha512-wXqbqSrIhE58TdrxxlfLwU9eDhrzppQDvGhBEr1gYbzzM4KKo3Y63gSjiDXRKLVS2UOXdPNR2v+KnQgNrs+xUg==" + }, + "node_modules/pkg-conf": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/pkg-conf/-/pkg-conf-2.1.0.tgz", + "integrity": "sha512-C+VUP+8jis7EsQZIhDYmS5qlNtjv2yP4SNtjXK9AP1ZcTRlnSfuumaTnRfYZnYgUUYVIKqL0fRvmUGDV2fmp6g==", + "dependencies": { + "find-up": "^2.0.0", + "load-json-file": "^4.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pkg-conf/node_modules/find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==", + "dependencies": { + "locate-path": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pkg-conf/node_modules/locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==", + "dependencies": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pkg-conf/node_modules/p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dependencies": { + "p-try": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pkg-conf/node_modules/p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==", + "dependencies": { + "p-limit": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pkg-conf/node_modules/p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==", + "engines": { + "node": ">=4" + } + }, + "node_modules/pkg-conf/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/pkg-config": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pkg-config/-/pkg-config-1.1.1.tgz", + "integrity": "sha512-ft/WI9YK6FuTuw4Ql+QUaNXtm/ASQNqDUUsZEgFZKyFpW6amyP8Gx01xrRs8KdiNbbqXfYxkOXplpq1euWbOjw==", + "dev": true, + "dependencies": { + "debug-log": "^1.0.0", + "find-root": "^1.0.0", + "xtend": "^4.0.1" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pluralize": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-7.0.0.tgz", + "integrity": "sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/portscanner": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/portscanner/-/portscanner-2.2.0.tgz", + "integrity": "sha512-IFroCz/59Lqa2uBvzK3bKDbDDIEaAY8XJ1jFxcLWTqosrsc32//P4VuSB2vZXoHiHqOmx8B5L5hnKOxL/7FlPw==", + "dependencies": { + "async": "^2.6.0", + "is-number-like": "^1.0.3" + }, + "engines": { + "node": ">=0.4", + "npm": ">=1.0.0" + } + }, + "node_modules/portscanner/node_modules/async": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", + "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", + "dependencies": { + "lodash": "^4.17.14" + } + }, + "node_modules/possible-typed-array-names": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", + "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/postman-collection": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/postman-collection/-/postman-collection-4.1.1.tgz", + "integrity": "sha512-ODpJtlf8r99DMcTU7gFmi/yvQYckFzcuE6zL/fWnyrFT34ugdCBFlX+DN7M+AnP6lmR822fv5s60H4DnL4+fAg==", + "dev": true, + "dependencies": { + "faker": "5.5.3", + "file-type": "3.9.0", + "http-reasons": "0.1.0", + "iconv-lite": "0.6.3", + "liquid-json": "0.3.1", + "lodash": "4.17.21", + "mime-format": "2.0.1", + "mime-types": "2.1.34", + "postman-url-encoder": "3.0.5", + "semver": "7.3.5", + "uuid": "8.3.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/postman-collection-transformer": { + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/postman-collection-transformer/-/postman-collection-transformer-4.1.6.tgz", + "integrity": "sha512-xvdQb6sZoWcG9xZXUPSuxocjcd6WCZlINlGGiuHdSfxhgiwQhj9qhF0JRFbagZ8xB0+pYUairD5MiCENc6DEVA==", + "dev": true, + "dependencies": { + "commander": "8.3.0", + "inherits": "2.0.4", + "lodash": "4.17.21", + "semver": "7.3.5", + "strip-json-comments": "3.1.1" + }, + "bin": { + "postman-collection-transformer": "bin/transform-collection.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/postman-collection-transformer/node_modules/commander": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "dev": true, + "engines": { + "node": ">= 12" + } + }, + "node_modules/postman-collection-transformer/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/postman-collection-transformer/node_modules/semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/postman-collection-transformer/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/postman-collection/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postman-collection/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/postman-collection/node_modules/mime-db": { + "version": "1.51.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz", + "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/postman-collection/node_modules/mime-types": { + "version": "2.1.34", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz", + "integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==", + "dev": true, + "dependencies": { + "mime-db": "1.51.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/postman-collection/node_modules/semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/postman-collection/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==", + "dev": true, + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/postman-request": { + "version": "2.88.1-postman.31", + "resolved": "https://registry.npmjs.org/postman-request/-/postman-request-2.88.1-postman.31.tgz", + "integrity": "sha512-OJbYqP7ItxQ84yHyuNpDywCZB0HYbpHJisMQ9lb1cSL3N5H3Td6a2+3l/a74UMd3u82BiGC5yQyYmdOIETP/nQ==", + "dev": true, + "dependencies": { + "@postman/form-data": "~3.1.1", + "@postman/tunnel-agent": "^0.6.3", + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "brotli": "~1.3.2", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "har-validator": "~5.1.3", + "http-signature": "~1.3.1", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "stream-length": "^1.0.2", + "tough-cookie": "~2.5.0", + "uuid": "^3.3.2" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/postman-request/node_modules/qs": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", + "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", + "dev": true, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/postman-request/node_modules/tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dev": true, + "dependencies": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/postman-runtime": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/postman-runtime/-/postman-runtime-7.29.0.tgz", + "integrity": "sha512-eXxHREE/fUpohkGPRgBY1YccSGx9cyW3mtGiPyIE4zD5fYzasgBHqW6kbEND3Xrd3yf/uht/YI1H8O7J1+A1+w==", + "dev": true, + "dependencies": { + "async": "3.2.3", + "aws4": "1.11.0", + "handlebars": "4.7.7", + "httpntlm": "1.7.7", + "js-sha512": "0.8.0", + "lodash": "4.17.21", + "mime-types": "2.1.34", + "node-oauth1": "1.3.0", + "performance-now": "2.1.0", + "postman-collection": "4.1.1", + "postman-request": "2.88.1-postman.31", + "postman-sandbox": "4.0.6", + "postman-url-encoder": "3.0.5", + "serialised-error": "1.1.3", + "tough-cookie": "3.0.1", + "uuid": "8.3.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/postman-runtime/node_modules/async": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.3.tgz", + "integrity": "sha512-spZRyzKL5l5BZQrr/6m/SqFdBN0q3OCI0f9rjfBzCMBIP4p75P620rR3gTmaksNOhmzgdxcaxdNfMy6anrbM0g==", + "dev": true + }, + "node_modules/postman-runtime/node_modules/aws4": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", + "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==", + "dev": true + }, + "node_modules/postman-runtime/node_modules/mime-db": { + "version": "1.51.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz", + "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/postman-runtime/node_modules/mime-types": { + "version": "2.1.34", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz", + "integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==", + "dev": true, + "dependencies": { + "mime-db": "1.51.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/postman-runtime/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==", + "dev": true, + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/postman-sandbox": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/postman-sandbox/-/postman-sandbox-4.0.6.tgz", + "integrity": "sha512-PPRanSNEE4zy3kO7CeSBHmAfJnGdD9ecHY/Mjh26CQuZZarGkNO8c0U/n+xX3+5M1BRNc82UYq6YCtdsSDqcng==", + "dev": true, + "dependencies": { + "lodash": "4.17.21", + "teleport-javascript": "1.0.0", + "uvm": "2.0.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/postman-url-encoder": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/postman-url-encoder/-/postman-url-encoder-3.0.5.tgz", + "integrity": "sha512-jOrdVvzUXBC7C+9gkIkpDJ3HIxOHTIqjpQ4C1EMt1ZGeMvSEpbFCKq23DEfgsj46vMnDgyQf+1ZLp2Wm+bKSsA==", + "dev": true, + "dependencies": { + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/prebuild-install": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.2.tgz", + "integrity": "sha512-UnNke3IQb6sgarcZIDU3gbMeTp/9SSU1DAIkil7PrqG1vZlBtY5msYccSKSHDqa3hNg436IXK+SNImReuA1wEQ==", + "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/prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/pretty-ms": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-7.0.1.tgz", + "integrity": "sha512-973driJZvxiGOQ5ONsFhOF/DtzPMOMtgC11kCpUrPGMTgqp2q/1gwzCquocrN33is0VZ5GFHXZYMM9l6h67v2Q==", + "dev": true, + "dependencies": { + "parse-ms": "^2.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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/process-on-spawn": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/process-on-spawn/-/process-on-spawn-1.0.0.tgz", + "integrity": "sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg==", + "dev": true, + "dependencies": { + "fromentries": "^1.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "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/promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", + "optional": true + }, + "node_modules/promise-polyfill": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/promise-polyfill/-/promise-polyfill-2.1.4.tgz", + "integrity": "sha512-/DVUJXyaiYr7Pu0q2qPV/OtABpiukAHswJb9VV/tUVFsvC5iZUTyVPxfEr8cIVatGa5/Mxeli8QMyzAMBmoiYg==" + }, + "node_modules/promise-retry": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", + "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", + "optional": true, + "dependencies": { + "err-code": "^2.0.2", + "retry": "^0.12.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "dev": true, + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/prop-types/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/proto-list": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", + "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==" + }, + "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/psl": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==" + }, + "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/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==", + "engines": { + "node": ">=0.6.0", + "teleport": ">=0.2.0" + } + }, + "node_modules/qs": { + "version": "6.10.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", + "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==", + "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==", + "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/quick-format-unescaped": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz", + "integrity": "sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==" + }, + "node_modules/quick-lru": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", + "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", + "engines": { + "node": ">=8" + } + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "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==", + "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/rc/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/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "dev": true + }, + "node_modules/read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "dependencies": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "dependencies": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg-up/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg-up/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg-up/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg-up/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg/node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==" + }, + "node_modules/read-pkg/node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/read-pkg/node_modules/type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "engines": { + "node": ">=8" + } + }, + "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/redent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", + "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", + "dependencies": { + "indent-string": "^4.0.0", + "strip-indent": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/redeyed": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/redeyed/-/redeyed-2.1.1.tgz", + "integrity": "sha512-FNpGGo1DycYAdnrKFxCMmKYgo/mILAqtRYbkdQD8Ep/Hk2PQ5+aEAEx+IU713RTDmuBaH0c8P5ZozurNu5ObRQ==", + "dependencies": { + "esprima": "~4.0.0" + } + }, + "node_modules/reduce-flatten": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-1.0.1.tgz", + "integrity": "sha512-j5WfFJfc9CoXv/WbwVLHq74i/hdTUpy+iNC534LxczMRP67vJeK3V9JOdnL0N1cIRbn9mYhE2yVjvvKXDxvNXQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/referrer-policy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/referrer-policy/-/referrer-policy-1.2.0.tgz", + "integrity": "sha512-LgQJIuS6nAy1Jd88DCQRemyE3mS+ispwlqMk3b0yjZ257fI1v9c+/p6SD5gP5FGyXUIgrNOAfmyioHwZtYv2VA==", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", + "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.6", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "set-function-name": "^2.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regexpp": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", + "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", + "dev": true, + "engines": { + "node": ">=6.5.0" + } + }, + "node_modules/registry-auth-token": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-5.0.2.tgz", + "integrity": "sha512-o/3ikDxtXaA59BmZuZrJZDJv8NMDGSj+6j6XaeBmHw8eY1i1qd9+6H+LjVvQXx3HN6aRCGa1cUdJ9RaJZUugnQ==", + "dependencies": { + "@pnpm/npm-conf": "^2.1.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/release-zalgo": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", + "integrity": "sha512-gUAyHVHPPC5wdqX/LG4LWtRYtgjxyX78oanFNTMMyFEfOqdC54s3eE82imuWKbOeqYht2CrNf64Qb8vgmmtZGA==", + "dev": true, + "dependencies": { + "es6-error": "^4.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/request": { + "version": "2.88.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", + "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", + "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", + "dependencies": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.0", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.4.3", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/request-promise": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/request-promise/-/request-promise-4.2.4.tgz", + "integrity": "sha512-8wgMrvE546PzbR5WbYxUQogUnUDfM0S7QIFZMID+J73vdFARkFy+HElj4T+MWYhpXwlLp0EQ8Zoj8xUA0he4Vg==", + "deprecated": "request-promise has been deprecated because it extends the now deprecated request package, see https://github.com/request/request/issues/3142", + "dependencies": { + "bluebird": "^3.5.0", + "request-promise-core": "1.1.2", + "stealthy-require": "^1.1.1", + "tough-cookie": "^2.3.3" + }, + "engines": { + "node": ">=0.10.0" + }, + "peerDependencies": { + "request": "^2.34" + } + }, + "node_modules/request-promise-core": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.2.tgz", + "integrity": "sha512-UHYyq1MO8GsefGEt7EprS8UrXsm1TxEvFUX1IMTuSLU2Rh7fTIdFtl8xD7JiEYiWU2dl+NYAjCTksTehQUxPag==", + "dependencies": { + "lodash": "^4.17.11" + }, + "engines": { + "node": ">=0.10.0" + }, + "peerDependencies": { + "request": "^2.34" + } + }, + "node_modules/request-promise/node_modules/tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dependencies": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/request/node_modules/form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 0.12" + } + }, + "node_modules/request/node_modules/http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==", + "dependencies": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + }, + "engines": { + "node": ">=0.8", + "npm": ">=1.3.7" + } + }, + "node_modules/request/node_modules/jsprim": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", + "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", + "dependencies": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.4.0", + "verror": "1.10.0" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/request/node_modules/punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==" + }, + "node_modules/request/node_modules/qs": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", + "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/request/node_modules/tough-cookie": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", + "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", + "dependencies": { + "psl": "^1.1.24", + "punycode": "^1.4.1" + }, + "engines": { + "node": ">=0.8" + } + }, + "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/require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true + }, + "node_modules/require-uncached": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", + "integrity": "sha512-Xct+41K3twrbBHdxAgMoOS+cNcoqIjfM2/VxBF4LL2hVph7YsF8VSKyQ3BDFZwEVbok9yeDl2le/qo0S77WG2w==", + "dev": true, + "dependencies": { + "caller-path": "^0.1.0", + "resolve-from": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-uncached/node_modules/resolve-from": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz", + "integrity": "sha512-kT10v4dhrlLNcnO084hEjvXCI1wUG9qZLoz2RogxqDQQYy7IxjI/iMUkOtQTNEh6rzHxvdQWHsJyel1pKOVCxg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "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-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "engines": { + "node": ">=4" + } + }, + "node_modules/restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==", + "dev": true, + "dependencies": { + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", + "optional": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/retry-as-promised": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/retry-as-promised/-/retry-as-promised-3.1.0.tgz", + "integrity": "sha512-g6T9rr5G4AfRVJZcnCbbmpcTDw8NJSnmVrvrJ9Pm9OWAzigocIcFp4+ItwHGJIr0wx0YzwlCJOvvEKQrZhzPOw==", + "dependencies": { + "any-promise": "^1.3.0" + } + }, + "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/rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/roarr": { + "version": "2.15.4", + "resolved": "https://registry.npmjs.org/roarr/-/roarr-2.15.4.tgz", + "integrity": "sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A==", + "dev": true, + "dependencies": { + "boolean": "^3.0.1", + "detect-node": "^2.0.4", + "globalthis": "^1.0.1", + "json-stringify-safe": "^5.0.1", + "semver-compare": "^1.0.0", + "sprintf-js": "^1.1.2" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/roarr/node_modules/sprintf-js": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", + "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", + "dev": true + }, + "node_modules/run-async": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", + "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", + "dev": true, + "engines": { + "node": ">=0.12.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/rxjs": { + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "dev": true, + "dependencies": { + "tslib": "^1.9.0" + }, + "engines": { + "npm": ">=2.0.0" + } + }, + "node_modules/safe-array-concat": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.0.tgz", + "integrity": "sha512-ZdQ0Jeb9Ofti4hbt5lX3T2JcAamT9hfzYU1MNB+z/jaEbB6wfFfPIR/zEORmZqobkCCJhSjodobH6WHNmJ97dg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "get-intrinsic": "^1.2.2", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-array-concat/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safe-regex-test": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", + "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-regex": "^1.1.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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/secure-keys": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/secure-keys/-/secure-keys-1.0.0.tgz", + "integrity": "sha512-nZi59hW3Sl5P3+wOO89eHBAAGwmCPd2aE1+dLZV5MO+ItQctIvAqihzaAXIQhvtH4KJPxM080HsnqltR2y8cWg==" + }, + "node_modules/semantic-release": { + "version": "19.0.3", + "resolved": "https://registry.npmjs.org/semantic-release/-/semantic-release-19.0.3.tgz", + "integrity": "sha512-HaFbydST1cDKZHuFZxB8DTrBLJVK/AnDExpK0s3EqLIAAUAHUgnd+VSJCUtTYQKkAkauL8G9CucODrVCc7BuAA==", + "dependencies": { + "@semantic-release/commit-analyzer": "^9.0.2", + "@semantic-release/error": "^3.0.0", + "@semantic-release/github": "^8.0.0", + "@semantic-release/npm": "^9.0.0", + "@semantic-release/release-notes-generator": "^10.0.0", + "aggregate-error": "^3.0.0", + "cosmiconfig": "^7.0.0", + "debug": "^4.0.0", + "env-ci": "^5.0.0", + "execa": "^5.0.0", + "figures": "^3.0.0", + "find-versions": "^4.0.0", + "get-stream": "^6.0.0", + "git-log-parser": "^1.2.0", + "hook-std": "^2.0.0", + "hosted-git-info": "^4.0.0", + "lodash": "^4.17.21", + "marked": "^4.0.10", + "marked-terminal": "^5.0.0", + "micromatch": "^4.0.2", + "p-each-series": "^2.1.0", + "p-reduce": "^2.0.0", + "read-pkg-up": "^7.0.0", + "resolve-from": "^5.0.0", + "semver": "^7.3.2", + "semver-diff": "^3.1.1", + "signale": "^1.2.1", + "yargs": "^16.2.0" + }, + "bin": { + "semantic-release": "bin/semantic-release.js" + }, + "engines": { + "node": ">=16 || ^14.17" + } + }, + "node_modules/semantic-release/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==", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/semantic-release/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/semantic-release/node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "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/semantic-release/node_modules/figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "dependencies": { + "escape-string-regexp": "^1.0.5" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/semantic-release/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==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/semantic-release/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==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/semantic-release/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/semantic-release/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==", + "engines": { + "node": ">=6" + } + }, + "node_modules/semantic-release/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/semantic-release/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==", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/semantic-release/node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/semantic-release/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/semantic-release/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/semantic-release/node_modules/semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semantic-release/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==", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/semantic-release/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/semantic-release/node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/semver": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", + "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/semver-compare": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", + "integrity": "sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==", + "dev": true + }, + "node_modules/semver-diff": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz", + "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==", + "dependencies": { + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/semver-diff/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/semver-regex": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/semver-regex/-/semver-regex-3.1.4.tgz", + "integrity": "sha512-6IiqeZNgq01qGf0TId0t3NvKzSvUsjcpdEO3AQNeIjR6A2+ckTnQlDpl4qu1bjRv0RzN3FP9hzFmws3lKqRWkA==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/send": { + "version": "0.17.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.2.tgz", + "integrity": "sha512-UJYB6wFSJE3G00nEivR5rgWp8c2xXvJ3OPWPhmuteU0IKj8nKbG3DrjiOmLwpnHGYWAVwA69zmTm++YG0Hmwww==", + "dependencies": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "1.8.1", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "~2.3.0", + "range-parser": "~1.2.1", + "statuses": "~1.5.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/send/node_modules/destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha512-3NdhDuEXnfun/z7x9GOElY49LoqVHoGScmOKwmxhsS8N5Y+Z8KyPPDnaSzqWgYt/ji4mqwfTS34Htrk0zPIXVg==" + }, + "node_modules/send/node_modules/http-errors": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", + "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/send/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/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/send/node_modules/on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/seq-queue": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/seq-queue/-/seq-queue-0.0.5.tgz", + "integrity": "sha512-hr3Wtp/GZIc/6DAGPDcV4/9WoZhjrkXsi5B/07QgX8tsdc6ilr7BFM6PM6rbdAX1kFSDYeZGLipIZZKyQP0O5Q==" + }, + "node_modules/sequelize": { + "version": "6.29.0", + "resolved": "https://registry.npmjs.org/sequelize/-/sequelize-6.29.0.tgz", + "integrity": "sha512-m8Wi90rs3NZP9coXE52c7PL4Q078nwYZXqt1IxPvgki7nOFn0p/F0eKsYDBXCPw9G8/BCEa6zZNk0DQUAT4ypA==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/sequelize" + } + ], + "dependencies": { + "@types/debug": "^4.1.7", + "@types/validator": "^13.7.1", + "debug": "^4.3.3", + "dottie": "^2.0.2", + "inflection": "^1.13.2", + "lodash": "^4.17.21", + "moment": "^2.29.1", + "moment-timezone": "^0.5.35", + "pg-connection-string": "^2.5.0", + "retry-as-promised": "^7.0.3", + "semver": "^7.3.5", + "sequelize-pool": "^7.1.0", + "toposort-class": "^1.0.1", + "uuid": "^8.3.2", + "validator": "^13.7.0", + "wkx": "^0.5.0" + }, + "engines": { + "node": ">=10.0.0" + }, + "peerDependenciesMeta": { + "ibm_db": { + "optional": true + }, + "mariadb": { + "optional": true + }, + "mysql2": { + "optional": true + }, + "oracledb": { + "optional": true + }, + "pg": { + "optional": true + }, + "pg-hstore": { + "optional": true + }, + "snowflake-sdk": { + "optional": true + }, + "sqlite3": { + "optional": true + }, + "tedious": { + "optional": true + } + } + }, + "node_modules/sequelize-cli": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/sequelize-cli/-/sequelize-cli-5.5.0.tgz", + "integrity": "sha512-twVQ02alCpr2XvxNmpi32C48WZs6xHTH1OFTfTS5Meg3BVqOM8ghiZoml4FITFjlD8sAJSQjlAHTwqTbuolA6Q==", + "dev": true, + "dependencies": { + "bluebird": "^3.5.3", + "cli-color": "^1.4.0", + "fs-extra": "^7.0.1", + "js-beautify": "^1.8.8", + "lodash": "^4.17.5", + "resolve": "^1.5.0", + "umzug": "^2.1.0", + "yargs": "^13.1.0" + }, + "bin": { + "sequelize": "lib/sequelize" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/sequelize-cli/node_modules/ansi-regex": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/sequelize-cli/node_modules/cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "dev": true, + "dependencies": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + } + }, + "node_modules/sequelize-cli/node_modules/emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "node_modules/sequelize-cli/node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/sequelize-cli/node_modules/fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/sequelize-cli/node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/sequelize-cli/node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/sequelize-cli/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/sequelize-cli/node_modules/p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/sequelize-cli/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/sequelize-cli/node_modules/string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "dependencies": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/sequelize-cli/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/sequelize-cli/node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/sequelize-cli/node_modules/wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/sequelize-cli/node_modules/y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "dev": true + }, + "node_modules/sequelize-cli/node_modules/yargs": { + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", + "dev": true, + "dependencies": { + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.2" + } + }, + "node_modules/sequelize-cli/node_modules/yargs-parser": { + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", + "dev": true, + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + }, + "node_modules/sequelize-pool": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/sequelize-pool/-/sequelize-pool-7.1.0.tgz", + "integrity": "sha512-G9c0qlIWQSK29pR/5U2JF5dDQeqqHRragoyahj/Nx4KOOQ3CPPfzxnfqFPCSB7x5UgjOgnZ61nSxz+fjDpRlJg==", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/sequelize/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/sequelize/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/sequelize/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/sequelize/node_modules/retry-as-promised": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/retry-as-promised/-/retry-as-promised-7.0.4.tgz", + "integrity": "sha512-XgmCoxKWkDofwH8WddD0w85ZfqYz+ZHlr5yo+3YUCfycWawU56T5ckWXsScsj5B8tqUcIG67DxXByo3VUgiAdA==" + }, + "node_modules/sequelize/node_modules/semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/sequelize/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/serialised-error": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/serialised-error/-/serialised-error-1.1.3.tgz", + "integrity": "sha512-vybp3GItaR1ZtO2nxZZo8eOo7fnVaNtP3XE2vJKgzkKR2bagCkdJ1EpYYhEMd3qu/80DwQk9KjsNSxE3fXWq0g==", + "dev": true, + "dependencies": { + "object-hash": "^1.1.2", + "stack-trace": "0.0.9", + "uuid": "^3.0.0" + } + }, + "node_modules/serialize-error": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-7.0.1.tgz", + "integrity": "sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==", + "dev": true, + "dependencies": { + "type-fest": "^0.13.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/serialize-error/node_modules/type-fest": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", + "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/serialize-javascript": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", + "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", + "dev": true, + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/serve-static": { + "version": "1.14.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.2.tgz", + "integrity": "sha512-+TMNA9AFxUEGuC0z2mevogSnn9MXKb4fa7ngeRMJaaGv8vTwnIEkKi+QGvPt33HSnf8pRS+WGM0EbMtCJLKMBQ==", + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.17.2" + }, + "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==", + "devOptional": true + }, + "node_modules/set-function-length": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.1.tgz", + "integrity": "sha512-j4t6ccc+VsKwYHso+kElc5neZpjtq9EnRICFZtWyBsLojhmeF/ZBd/elqm22WJh/BziDe/SBiOeAt0m2mfLD0g==", + "dependencies": { + "define-data-property": "^1.1.2", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.3", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "dev": true, + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, + "node_modules/shallow-copy": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/shallow-copy/-/shallow-copy-0.0.1.tgz", + "integrity": "sha512-b6i4ZpVuUxB9h5gfCxPiusKYkqTMOjEbBs4wMaFbkfia4yFv92UKZ6Df8WXcKbn08JNL/abvg3FnMAOfakDvUw==" + }, + "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.6", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" + }, + "engines": { + "node": ">= 0.4" + }, + "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/signale": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/signale/-/signale-1.4.0.tgz", + "integrity": "sha512-iuh+gPf28RkltuJC7W5MRi6XAjTDCAPC/prJUpQoG4vIP3MJZ+GTydVnodXA7pwvTKb2cA0m9OFZW/cdWy/I/w==", + "dependencies": { + "chalk": "^2.3.2", + "figures": "^2.0.0", + "pkg-conf": "^2.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "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/sinon": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-7.5.0.tgz", + "integrity": "sha512-AoD0oJWerp0/rY9czP/D6hDTTUYGpObhZjMpd7Cl/A6+j0xBE+ayL/ldfggkBXUs0IkvIiM1ljM8+WkOc5k78Q==", + "deprecated": "16.1.1", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^1.4.0", + "@sinonjs/formatio": "^3.2.1", + "@sinonjs/samsam": "^3.3.3", + "diff": "^3.5.0", + "lolex": "^4.2.0", + "nise": "^1.5.2", + "supports-color": "^5.5.0" + } + }, + "node_modules/sinon-chai": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/sinon-chai/-/sinon-chai-3.3.0.tgz", + "integrity": "sha512-r2JhDY7gbbmh5z3Q62pNbrjxZdOAjpsqW/8yxAZRSqLZqowmfGZPGUZPFf3UX36NLis0cv8VEM5IJh9HgkSOAA==", + "dev": true, + "peerDependencies": { + "chai": "^4.0.0", + "sinon": ">=4.0.0 <8.0.0" + } + }, + "node_modules/sinon/node_modules/diff": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/slice-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", + "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.0", + "astral-regex": "^1.0.0", + "is-fullwidth-code-point": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "optional": true, + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/smtp-connection": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/smtp-connection/-/smtp-connection-2.3.2.tgz", + "integrity": "sha512-ORefDrSgddCYkJE7oH3jB6WRv2Z7laZLCMRYD4GFFB8oaZw/hnil7exDBP4yBYs3OgschOuvVdCauUQAblTWvQ==", + "dependencies": { + "nodemailer-shared": "1.0.4" + } + }, + "node_modules/snyk": { + "version": "1.1281.0", + "resolved": "https://registry.npmjs.org/snyk/-/snyk-1.1281.0.tgz", + "integrity": "sha512-I+oVDXOF+nFTpFnRkP985x6xMlXzGzojHsC3F4YeT+NPfsn5mfmnx0NVY4tSXBoENqWGYzBw3M2adeLcbamx4Q==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "@sentry/node": "^7.36.0", + "global-agent": "^3.0.0" + }, + "bin": { + "snyk": "bin/snyk" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/socks": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.1.tgz", + "integrity": "sha512-B6w7tkwNid7ToxjZ08rQMT8M9BJAf8DKx8Ft4NivzH0zBUfd6jldGcisJn/RLgxcX3FPNDdNQCUEMMT79b+oCQ==", + "optional": true, + "dependencies": { + "ip-address": "^9.0.5", + "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks-proxy-agent": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-6.2.1.tgz", + "integrity": "sha512-a6KW9G+6B3nWZ1yB8G7pJwL3ggLy1uTzKAgCb7ttblwqdz9fMGJUuTy3uFzEP48FAs9FLILlmzDlE2JJhVQaXQ==", + "optional": true, + "dependencies": { + "agent-base": "^6.0.2", + "debug": "^4.3.3", + "socks": "^2.6.2" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/socks-proxy-agent/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==", + "optional": true, + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/socks-proxy-agent/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "optional": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/socks-proxy-agent/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==", + "optional": true + }, + "node_modules/sonic-boom": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-1.4.1.tgz", + "integrity": "sha512-LRHh/A8tpW7ru89lrlkU4AszXt1dbwSjVWguGrmlxE7tawVmDBlI1PILMkXAxJTwqhgsEeTHzj36D5CmHgQmNg==", + "dependencies": { + "atomic-sleep": "^1.0.0", + "flatstr": "^1.0.12" + } + }, + "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==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/spawn-error-forwarder": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/spawn-error-forwarder/-/spawn-error-forwarder-1.0.0.tgz", + "integrity": "sha512-gRjMgK5uFjbCvdibeGJuy3I5OYz6VLoVdsOJdA6wV0WlfQVLFueoqMxwwYD9RODdgb6oUIvlRlsyFSiQkMKu0g==" + }, + "node_modules/spawn-wrap": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-2.0.0.tgz", + "integrity": "sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==", + "dev": true, + "dependencies": { + "foreground-child": "^2.0.0", + "is-windows": "^1.0.2", + "make-dir": "^3.0.0", + "rimraf": "^3.0.0", + "signal-exit": "^3.0.2", + "which": "^2.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/spawn-wrap/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/spawn-wrap/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/spdx-correct": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", + "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==" + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.17", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.17.tgz", + "integrity": "sha512-sh8PWc/ftMqAAdFiBu6Fy6JUOYjqDJBJvIhpfDMyHrr0Rbp5liZqd4TjtQ/RgfLjKFZb+LMx5hpml5qOWy0qvg==" + }, + "node_modules/split": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", + "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==", + "dependencies": { + "through": "2" + }, + "engines": { + "node": "*" + } + }, + "node_modules/split2": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz", + "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==", + "dependencies": { + "readable-stream": "^3.0.0" + } + }, + "node_modules/split2/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/split2/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/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" + }, + "node_modules/sqlite3": { + "version": "5.1.7", + "resolved": "https://registry.npmjs.org/sqlite3/-/sqlite3-5.1.7.tgz", + "integrity": "sha512-GGIyOiFaG+TUra3JIfkI/zGP8yZYLPQ0pl1bH+ODjiX57sPhrLU5sQJn1y9bDKZUFYkX1crlrPfSYt0BKKdkog==", + "hasInstallScript": true, + "dependencies": { + "bindings": "^1.5.0", + "node-addon-api": "^7.0.0", + "prebuild-install": "^7.1.1", + "tar": "^6.1.11" + }, + "optionalDependencies": { + "node-gyp": "8.x" + }, + "peerDependencies": { + "node-gyp": "8.x" + }, + "peerDependenciesMeta": { + "node-gyp": { + "optional": true + } + } + }, + "node_modules/sqlstring": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.3.tgz", + "integrity": "sha512-qC9iz2FlN7DQl3+wjwn3802RTyjCx7sDvfQEXchwa6CWOx07/WVfh91gBmQ9fahw8snwGEWU3xGzOt4tFyHLxg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/sshpk": { + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.18.0.tgz", + "integrity": "sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==", + "dependencies": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + }, + "bin": { + "sshpk-conv": "bin/sshpk-conv", + "sshpk-sign": "bin/sshpk-sign", + "sshpk-verify": "bin/sshpk-verify" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sshpk/node_modules/jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==" + }, + "node_modules/ssri": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz", + "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==", + "optional": true, + "dependencies": { + "minipass": "^3.1.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/stack-trace": { + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.9.tgz", + "integrity": "sha512-vjUc6sfgtgY0dxCdnc40mK6Oftjo9+2K8H/NG81TMhgL392FtiPA9tn9RLyTxXmTLPJPjF3VyzFp6bsWFLisMQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/standard": { + "version": "12.0.1", + "resolved": "https://registry.npmjs.org/standard/-/standard-12.0.1.tgz", + "integrity": "sha512-UqdHjh87OG2gUrNCSM4QRLF5n9h3TFPwrCNyVlkqu31Hej0L/rc8hzKqVvkb2W3x0WMq7PzZdkLfEcBhVOR6lg==", + "dev": true, + "dependencies": { + "eslint": "~5.4.0", + "eslint-config-standard": "12.0.0", + "eslint-config-standard-jsx": "6.0.2", + "eslint-plugin-import": "~2.14.0", + "eslint-plugin-node": "~7.0.1", + "eslint-plugin-promise": "~4.0.0", + "eslint-plugin-react": "~7.11.1", + "eslint-plugin-standard": "~4.0.0", + "standard-engine": "~9.0.0" + }, + "bin": { + "standard": "bin/cmd.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/standard-engine": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/standard-engine/-/standard-engine-9.0.0.tgz", + "integrity": "sha512-ZfNfCWZ2Xq67VNvKMPiVMKHnMdvxYzvZkf1AH8/cw2NLDBm5LRsxMqvEJpsjLI/dUosZ3Z1d6JlHDp5rAvvk2w==", + "dev": true, + "dependencies": { + "deglob": "^2.1.0", + "get-stdin": "^6.0.0", + "minimist": "^1.1.0", + "pkg-conf": "^2.0.0" + } + }, + "node_modules/standard/node_modules/acorn": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", + "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/standard/node_modules/chardet": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz", + "integrity": "sha512-j/Toj7f1z98Hh2cYo2BVr85EpIRWqUi7rtRSGxh/cqUjqrnJe9l9UE7IUGd2vQ2p+kSHLkSzObQPZPLUC6TQwg==", + "dev": true + }, + "node_modules/standard/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/standard/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/standard/node_modules/eslint": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-5.4.0.tgz", + "integrity": "sha512-UIpL91XGex3qtL6qwyCQJar2j3osKxK9e3ano3OcGEIRM4oWIpCkDg9x95AXEC2wMs7PnxzOkPZ2gq+tsMS9yg==", + "dev": true, + "dependencies": { + "ajv": "^6.5.0", + "babel-code-frame": "^6.26.0", + "chalk": "^2.1.0", + "cross-spawn": "^6.0.5", + "debug": "^3.1.0", + "doctrine": "^2.1.0", + "eslint-scope": "^4.0.0", + "eslint-utils": "^1.3.1", + "eslint-visitor-keys": "^1.0.0", + "espree": "^4.0.0", + "esquery": "^1.0.1", + "esutils": "^2.0.2", + "file-entry-cache": "^2.0.0", + "functional-red-black-tree": "^1.0.1", + "glob": "^7.1.2", + "globals": "^11.7.0", + "ignore": "^4.0.2", + "imurmurhash": "^0.1.4", + "inquirer": "^5.2.0", + "is-resolvable": "^1.1.0", + "js-yaml": "^3.11.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.3.0", + "lodash": "^4.17.5", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.1", + "natural-compare": "^1.4.0", + "optionator": "^0.8.2", + "path-is-inside": "^1.0.2", + "pluralize": "^7.0.0", + "progress": "^2.0.0", + "regexpp": "^2.0.0", + "require-uncached": "^1.0.3", + "semver": "^5.5.0", + "strip-ansi": "^4.0.0", + "strip-json-comments": "^2.0.1", + "table": "^4.0.3", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^6.14.0 || ^8.10.0 || >=9.10.0" + } + }, + "node_modules/standard/node_modules/espree": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-4.1.0.tgz", + "integrity": "sha512-I5BycZW6FCVIub93TeVY1s7vjhP9CY6cXCznIRfiig7nRviKZYdRnj/sHEWC6A7WE9RDWOFq9+7OsWSYz8qv2w==", + "dev": true, + "dependencies": { + "acorn": "^6.0.2", + "acorn-jsx": "^5.0.0", + "eslint-visitor-keys": "^1.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/standard/node_modules/external-editor": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz", + "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==", + "dev": true, + "dependencies": { + "chardet": "^0.4.0", + "iconv-lite": "^0.4.17", + "tmp": "^0.0.33" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/standard/node_modules/file-entry-cache": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz", + "integrity": "sha512-uXP/zGzxxFvFfcZGgBIwotm+Tdc55ddPAzF7iHshP4YGaXMww7rSF9peD9D1sui5ebONg5UobsZv+FfgEpGv/w==", + "dev": true, + "dependencies": { + "flat-cache": "^1.2.1", + "object-assign": "^4.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/standard/node_modules/flat-cache": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.4.tgz", + "integrity": "sha512-VwyB3Lkgacfik2vhqR4uv2rvebqmDvFu4jlN/C1RzWoJEo8I7z4Q404oiqYCkq41mni8EzQnm95emU9seckwtg==", + "dev": true, + "dependencies": { + "circular-json": "^0.3.1", + "graceful-fs": "^4.1.2", + "rimraf": "~2.6.2", + "write": "^0.2.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/standard/node_modules/inquirer": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-5.2.0.tgz", + "integrity": "sha512-E9BmnJbAKLPGonz0HeWHtbKf+EeSP93paWO3ZYoUpq/aowXvYGjjCSuashhXPpzbArIjBbji39THkxTz9ZeEUQ==", + "dev": true, + "dependencies": { + "ansi-escapes": "^3.0.0", + "chalk": "^2.0.0", + "cli-cursor": "^2.1.0", + "cli-width": "^2.0.0", + "external-editor": "^2.1.0", + "figures": "^2.0.0", + "lodash": "^4.3.0", + "mute-stream": "0.0.7", + "run-async": "^2.2.0", + "rxjs": "^5.5.2", + "string-width": "^2.1.0", + "strip-ansi": "^4.0.0", + "through": "^2.3.6" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/standard/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==", + "dev": true + }, + "node_modules/standard/node_modules/rxjs": { + "version": "5.5.12", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.5.12.tgz", + "integrity": "sha512-xx2itnL5sBbqeeiVgNPVuQQ1nC8Jp2WfNJhXWHmElW9YmrpS9UVnNzhP3EH3HFqexO5Tlp8GhYY+WEcqcVMvGw==", + "dev": true, + "dependencies": { + "symbol-observable": "1.0.1" + }, + "engines": { + "npm": ">=2.0.0" + } + }, + "node_modules/standard/node_modules/slice-ansi": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-1.0.0.tgz", + "integrity": "sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==", + "dev": true, + "dependencies": { + "is-fullwidth-code-point": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/standard/node_modules/table": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/table/-/table-4.0.3.tgz", + "integrity": "sha512-S7rnFITmBH1EnyKcvxBh1LjYeQMmnZtCXSEbHcH6S0NoKit24ZuFO/T1vDcLdYsLQkM188PVVhQmzKIuThNkKg==", + "dev": true, + "dependencies": { + "ajv": "^6.0.1", + "ajv-keywords": "^3.0.0", + "chalk": "^2.1.0", + "lodash": "^4.17.4", + "slice-ansi": "1.0.0", + "string-width": "^2.1.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/standard/node_modules/write": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz", + "integrity": "sha512-CJ17OoULEKXpA5pef3qLj5AxTJ6mSt7g84he2WIskKwqFO4T97d5V7Tadl0DYDk7qyUOQD5WlUlOMChaYrhxeA==", + "dev": true, + "dependencies": { + "mkdirp": "^0.5.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/stealthy-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", + "integrity": "sha512-ZnWpYnYugiOVEY5GkcuJK1io5V8QmNYChG62gSit9pQVGErXtrKuPC55ITaVSukmMta5qpMU7vqLt2Lnni4f/g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stream-combiner2": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.1.1.tgz", + "integrity": "sha512-3PnJbYgS56AeWgtKF5jtJRT6uFJe56Z0Hc5Ngg/6sI6rIt8iiMBTa9cvdyFfpMQjaVHr8dusbNeFGIIonxOvKw==", + "dependencies": { + "duplexer2": "~0.1.0", + "readable-stream": "^2.0.2" + } + }, + "node_modules/stream-combiner2/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-combiner2/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-combiner2/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/stream-combiner2/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/stream-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/stream-length/-/stream-length-1.0.2.tgz", + "integrity": "sha512-aI+qKFiwoDV4rsXiS7WRoCt+v2RX1nUj17+KJC5r2gfh5xoSJIfP6Y3Do/HtvesFcTSWthIuJ3l1cvKQY/+nZg==", + "dev": true, + "dependencies": { + "bluebird": "^2.6.2" + } + }, + "node_modules/stream-length/node_modules/bluebird": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-2.11.0.tgz", + "integrity": "sha512-UfFSr22dmHPQqPP9XWHRhq+gWnHCYguQGkXQlbyPtW5qTnhFWA8/iXg765tH0cAjy7l/zPJ1aBTO0g5XgA7kvQ==", + "dev": true + }, + "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-format": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/string-format/-/string-format-2.0.0.tgz", + "integrity": "sha512-bbEs3scLeYNXLecRRuk6uJxdXUSj6le/8rNPHChIJTn2V79aXVTR1EH2OH5zLKKoz0V02fOUKZZcw01pLUShZA==" + }, + "node_modules/string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "devOptional": true, + "dependencies": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/string-width-cjs": { + "name": "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==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/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==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/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==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz", + "integrity": "sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz", + "integrity": "sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz", + "integrity": "sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "devOptional": true, + "dependencies": { + "ansi-regex": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs/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==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi/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==", + "devOptional": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "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-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==", + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "dependencies": { + "min-indent": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "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/superagent": { + "version": "3.8.3", + "resolved": "https://registry.npmjs.org/superagent/-/superagent-3.8.3.tgz", + "integrity": "sha512-GLQtLMCoEIK4eDv6OGtkOoSMt3D+oq0y3dsxMuYuDvaNUvuT8eFBuLmfR0iYYzHC1e8hpzC6ZsxbuP6DIalMFA==", + "deprecated": "Please upgrade to v7.0.2+ of superagent. We have fixed numerous issues with streams, form-data, attach(), filesystem errors not bubbling up (ENOENT on attach()), and all tests are now passing. See the releases tab for more information at .", + "dev": true, + "dependencies": { + "component-emitter": "^1.2.0", + "cookiejar": "^2.1.0", + "debug": "^3.1.0", + "extend": "^3.0.0", + "form-data": "^2.3.1", + "formidable": "^1.2.0", + "methods": "^1.1.1", + "mime": "^1.4.1", + "qs": "^6.5.1", + "readable-stream": "^2.3.5" + }, + "engines": { + "node": ">= 4.0" + } + }, + "node_modules/superagent/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/superagent/node_modules/form-data": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", + "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", + "dev": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 0.12" + } + }, + "node_modules/superagent/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/superagent/node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/superagent/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==", + "dev": true + }, + "node_modules/superagent/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/superagent/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/superagent/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/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-hyperlinks": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz", + "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==", + "dependencies": { + "has-flag": "^4.0.0", + "supports-color": "^7.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-hyperlinks/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/supports-hyperlinks/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/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/swagger-ui-dist": { + "version": "5.11.9", + "resolved": "https://registry.npmjs.org/swagger-ui-dist/-/swagger-ui-dist-5.11.9.tgz", + "integrity": "sha512-e1x1x92wwjBWTjM+P9aH6qRurjFol/y5eCN0U2pK/nrS5mKxZuTsZUqdYya1W+JMom8fbw6/X8Ymp99lHRjBfw==" + }, + "node_modules/swagger-ui-express": { + "version": "4.6.3", + "resolved": "https://registry.npmjs.org/swagger-ui-express/-/swagger-ui-express-4.6.3.tgz", + "integrity": "sha512-CDje4PndhTD2HkgyKH3pab+LKspDeB/NhPN2OF1j+piYIamQqBYwAXWESOT1Yju2xFg51bRW9sUng2WxDjzArw==", + "dependencies": { + "swagger-ui-dist": ">=4.11.0" + }, + "engines": { + "node": ">= v0.10.32" + }, + "peerDependencies": { + "express": ">=4.0.0 || >=5.0.0-beta" + } + }, + "node_modules/symbol-observable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.0.1.tgz", + "integrity": "sha512-Kb3PrPYz4HanVF1LVGuAdW6LoVgIwjUYJGzFe7NDrBLCN4lsV/5J0MFurV+ygS4bRVwrCEt2c7MQ1R2a72oJDw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/table": { + "version": "5.4.6", + "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", + "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", + "dev": true, + "dependencies": { + "ajv": "^6.10.2", + "lodash": "^4.17.14", + "slice-ansi": "^2.1.0", + "string-width": "^3.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/table-layout": { + "version": "0.4.5", + "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-0.4.5.tgz", + "integrity": "sha512-zTvf0mcggrGeTe/2jJ6ECkJHAQPIYEwDoqsiqBjI24mvRmQbInK5jq33fyypaCBxX08hMkfmdOqj6haT33EqWw==", + "dependencies": { + "array-back": "^2.0.0", + "deep-extend": "~0.6.0", + "lodash.padend": "^4.6.1", + "typical": "^2.6.1", + "wordwrapjs": "^3.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/table/node_modules/ansi-regex": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/table/node_modules/emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "node_modules/table/node_modules/string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "dependencies": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/table/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tar": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.0.tgz", + "integrity": "sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ==", + "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==", + "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==" + }, + "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/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/tar/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/tar/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/teleport-javascript": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/teleport-javascript/-/teleport-javascript-1.0.0.tgz", + "integrity": "sha512-j1llvWVFyEn/6XIFDfX5LAU43DXe0GCt3NfXDwJ8XpRRMkS+i50SAkonAONBy+vxwPFBd50MFU8a2uj8R/ccLg==", + "dev": true + }, + "node_modules/temp-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz", + "integrity": "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/tempy": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tempy/-/tempy-1.0.1.tgz", + "integrity": "sha512-biM9brNqxSc04Ee71hzFbryD11nX7VPhQQY32AdDmjFvodsRFz/3ufeoTZ6uYkRFfGo188tENcASNs3vTdsM0w==", + "dependencies": { + "del": "^6.0.0", + "is-stream": "^2.0.0", + "temp-dir": "^2.0.0", + "type-fest": "^0.16.0", + "unique-string": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/tempy/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==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/tempy/node_modules/type-fest": { + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.16.0.tgz", + "integrity": "sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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/test-value": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/test-value/-/test-value-3.0.0.tgz", + "integrity": "sha512-sVACdAWcZkSU9x7AOmJo5TqE+GyNJknHaHsMrR6ZnhjVlVN9Yx6FjHrsKZ3BjIpPCT68zYesPWkakrNupwfOTQ==", + "dependencies": { + "array-back": "^2.0.0", + "typical": "^2.6.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/text-extensions": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-1.9.0.tgz", + "integrity": "sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==", + "engines": { + "node": ">=0.10" + } + }, + "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/through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==" + }, + "node_modules/through2": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", + "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", + "dependencies": { + "readable-stream": "3" + } + }, + "node_modules/through2/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/through2/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/timers-ext": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/timers-ext/-/timers-ext-0.1.7.tgz", + "integrity": "sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ==", + "dev": true, + "dependencies": { + "es5-ext": "~0.10.46", + "next-tick": "1" + } + }, + "node_modules/tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "dependencies": { + "os-tmpdir": "~1.0.2" + }, + "engines": { + "node": ">=0.6.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==", + "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/toposort-class": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toposort-class/-/toposort-class-1.0.1.tgz", + "integrity": "sha512-OsLcGGbYF3rMjPUf8oKktyvCiUxSbqMMS39m33MAjLTC1DVIH6x3WSt63/M77ihI09+Sdfk1AXvfhCEeUmC7mg==" + }, + "node_modules/tough-cookie": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-3.0.1.tgz", + "integrity": "sha512-yQyJ0u4pZsv9D4clxO69OEjLWYw+jbgspjTue4lTQZLfV0c5l1VmK2y1JK8E9ahdpltPOaAThPcp5nKPUgSnsg==", + "dev": true, + "dependencies": { + "ip-regex": "^2.1.0", + "psl": "^1.1.28", + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, + "node_modules/traverse": { + "version": "0.6.8", + "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.6.8.tgz", + "integrity": "sha512-aXJDbk6SnumuaZSANd21XAo15ucCDE38H4fkqiGsc3MhCK+wOlZvLP9cB/TvpHT0mOyWgC4Z8EwRlzqYSUzdsA==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/trim-newlines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", + "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "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/tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==" + }, + "node_modules/type": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/type/-/type-2.7.2.tgz", + "integrity": "sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==", + "dev": true + }, + "node_modules/type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", + "dev": true, + "dependencies": { + "prelude-ls": "~1.1.2" + }, + "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", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "engines": { + "node": ">=8" + } + }, + "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/typed-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", + "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", + "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz", + "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.5.tgz", + "integrity": "sha512-yMi0PlwuznKHxKmcpoOdeLwxBoVPkqZxd7q2FgMkmD3bNwvF5VW0+UlUQ1k1vmktTu4Yu13Q0RIxEP8+B+wloA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" + }, + "node_modules/typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "dev": true, + "dependencies": { + "is-typedarray": "^1.0.0" + } + }, + "node_modules/typical": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/typical/-/typical-2.6.1.tgz", + "integrity": "sha512-ofhi8kjIje6npGozTip9Fr8iecmYfEbS06i0JnIg+rh51KakryWF4+jX8lLKZVhy6N+ID45WYSFCxPOdTWCzNg==" + }, + "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==", + "optional": true, + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/umzug": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/umzug/-/umzug-2.2.0.tgz", + "integrity": "sha512-xZLW76ax70pND9bx3wqwb8zqkFGzZIK8dIHD9WdNy/CrNfjWcwQgQkGCuUqcuwEBvUm+g07z+qWvY+pxDmMEEw==", + "dependencies": { + "babel-runtime": "^6.23.0", + "bluebird": "^3.5.3" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/underscore": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.1.tgz", + "integrity": "sha512-hzSoAVtJF+3ZtiFX0VgfFPHEDRm7Y/QPjGyNo4TVdnDTdft3tr8hEkD25a1jC+TjTuE7tkHGKkhwCgs9dgBB2g==" + }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" + }, + "node_modules/uniq": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", + "integrity": "sha512-Gw+zz50YNKPDKXs+9d+aKAjVwpjNwqzvNpLigIruT4HA9lMZNdMqs9x07kKHB/L9WRzqp4+DlTU5s4wG2esdoA==", + "dev": true + }, + "node_modules/unique-filename": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", + "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", + "optional": true, + "dependencies": { + "unique-slug": "^2.0.0" + } + }, + "node_modules/unique-slug": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", + "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", + "optional": true, + "dependencies": { + "imurmurhash": "^0.1.4" + } + }, + "node_modules/unique-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", + "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", + "dependencies": { + "crypto-random-string": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/universal-user-agent": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.1.tgz", + "integrity": "sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ==" + }, + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "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/update-browserslist-db": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", + "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/url-join": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.1.tgz", + "integrity": "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==" + }, + "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-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "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/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": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "bin": { + "uuid": "bin/uuid" + } + }, + "node_modules/uvm": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/uvm/-/uvm-2.0.2.tgz", + "integrity": "sha512-Ra+aPiS5GXAbwXmyNExqdS42sTqmmx4XWEDF8uJlsTfOkKf9Rd9xNgav1Yckv4HfVEZg4iOFODWHFYuJ+9Fzfg==", + "dev": true, + "dependencies": { + "flatted": "3.1.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/uvm/node_modules/flatted": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.1.1.tgz", + "integrity": "sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA==", + "dev": true + }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/validator": { + "version": "13.11.0", + "resolved": "https://registry.npmjs.org/validator/-/validator-13.11.0.tgz", + "integrity": "sha512-Ii+sehpSfZy+At5nPdnyMhx78fEoPDkR2XW/zimHEL3MyGJQOCQ7WeP20jPYRz7ZCpcKLB21NxuXHF3bxjStBQ==", + "engines": { + "node": ">= 0.10" + } + }, + "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/verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", + "engines": [ + "node >=0.6.0" + ], + "dependencies": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "node_modules/verror/node_modules/core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==" + }, + "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/which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "dependencies": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-module": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", + "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==", + "dev": true + }, + "node_modules/which-typed-array": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.14.tgz", + "integrity": "sha512-VnXFiIW8yNn9kIHN88xvZ4yOWchftKDsRJ8fEPacX/wl1lOvBrhsJ/OeJCXq7B0AaijRuqgzSKalJoPk+D8MPg==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.6", + "call-bind": "^1.0.5", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "optional": true, + "dependencies": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } + }, + "node_modules/wkx": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/wkx/-/wkx-0.5.0.tgz", + "integrity": "sha512-Xng/d4Ichh8uN4l0FToV/258EjMGU9MGcA0HV2d9B/ZpZB3lqQm7nkOdZdm5GhKtLLhAE7PiVQwN4eN+2YJJUg==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true, + "engines": { + "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==" + }, + "node_modules/wordwrapjs": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-3.0.0.tgz", + "integrity": "sha512-mO8XtqyPvykVCsrwj5MlOVWvSnCdT+C+QVbm6blradR7JExAhbkZ7hZ9A+9NUtwzSqrlUo9a67ws0EiILrvRpw==", + "dependencies": { + "reduce-flatten": "^1.0.1", + "typical": "^2.6.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/workerpool": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.0.tgz", + "integrity": "sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A==", + "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/wrap-ansi-cjs": { + "name": "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/wrap-ansi-cjs/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==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/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/wrap-ansi-cjs/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/wrap-ansi-cjs/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/wrap-ansi-cjs/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/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==", + "dev": true, + "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-cjs/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==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "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/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/wrap-ansi/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/wrap-ansi/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/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": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", + "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", + "dev": true, + "dependencies": { + "mkdirp": "^0.5.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "node_modules/x-xss-protection": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/x-xss-protection/-/x-xss-protection-1.3.0.tgz", + "integrity": "sha512-kpyBI9TlVipZO4diReZMAHWtS0MMa/7Kgx8hwG/EuZLiA6sg4Ah/4TRdASHhRRN3boobzcYgFRUFSgHRge6Qhg==", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/xml": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/xml/-/xml-1.0.1.tgz", + "integrity": "sha512-huCv9IH9Tcf95zuYCsQraZtWnJvBtLVE0QHMOs8bWyZAFZNDcYjsPq1nEx8jKA9y+Beo9v+7OBPRisQTjinQMw==", + "dev": true + }, + "node_modules/xmlbuilder": { + "version": "15.1.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-15.1.1.tgz", + "integrity": "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==", + "dev": true, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/xregexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-2.0.0.tgz", + "integrity": "sha512-xl/50/Cf32VsGq/1R8jJE5ajH1yMCQkpmoS10QbFZWl2Oor4H0Me64Pu2yxvsRWK3m6soJbmGfzSR7BYmDcWAA==", + "engines": { + "node": "*" + } + }, + "node_modules/xss-clean": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/xss-clean/-/xss-clean-0.1.1.tgz", + "integrity": "sha512-On99yydxoAEkHpraR7Wjg9cD6UmKfbtH2HXO1it2djid32osHL7Qr8bIu+dGYoOeKzf3ZszLfz1gwR/D7whZ2A==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "dependencies": { + "xss-filters": "1.2.6" + } + }, + "node_modules/xss-filters": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/xss-filters/-/xss-filters-1.2.6.tgz", + "integrity": "sha512-uqgwZRpVJCDfHsRX9lDrkPyCitQYzPklmLSbajJncATZKAUd1tF1x9y2VyPNFMv8SsSWed80xorSS5qGpw3WiA==" + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "engines": { + "node": ">=0.4" + } + }, + "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/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "engines": { + "node": ">= 6" + } + }, + "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.4", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", + "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-unparser": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", + "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", + "dev": true, + "dependencies": { + "camelcase": "^6.0.0", + "decamelize": "^4.0.0", + "flat": "^5.0.2", + "is-plain-obj": "^2.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-unparser/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/yargs-unparser/node_modules/decamelize": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", + "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/yargs-unparser/node_modules/is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "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/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" + } + } + } +} diff --git a/src/config/development.json b/src/config/development.json index 942e68199..8b7dca9e4 100644 --- a/src/config/development.json +++ b/src/config/development.json @@ -60,5 +60,17 @@ "databaseName": "" } } - } + }, + "ControlPlane": { + "Auth_Manager": "Keycloak", + "Realm": { + "url": "", + "realm-key": "" + }, + "Config": { + "namespace": "", + "orgName": "", + "entitlementID": "" + } + } } \ No newline at end of file diff --git a/src/config/production.json b/src/config/production.json index 4e6b967e2..038d3490d 100644 --- a/src/config/production.json +++ b/src/config/production.json @@ -48,5 +48,17 @@ "databaseName": "" } } - } -} \ No newline at end of file + }, + "ControlPlane": { + "Auth_Manager": "Keycloak", + "Realm": { + "url": "", + "realm-key": "" + }, + "Config": { + "namespace": "", + "orgName": "", + "entitlementID": "" + } + } +} diff --git a/src/controllers/control-plane-controller.js b/src/controllers/control-plane-controller.js new file mode 100644 index 000000000..073031f91 --- /dev/null +++ b/src/controllers/control-plane-controller.js @@ -0,0 +1,26 @@ +/* + * ******************************************************************************* + * * Copyright (c) 2023 Datasance Teknoloji A.S. + * * + * * This program and the accompanying materials are made available under the + * * terms of the Eclipse Public License v. 2.0 which is available at + * * http://www.eclipse.org/legal/epl-2.0 + * * + * * SPDX-License-Identifier: EPL-2.0 + * ******************************************************************************* + * + */ + +const AuthDecorator = require('../decorators/authorization-decorator') + +const getControlPlaneProfileEndPoint = async function (req, controlPlane) { + return { + namespace: controlPlane.namespace, + OrgName: controlPlane.OrgName, + entitlementId: controlPlane.entitlementId + } +} + +module.exports = { + getControlPlaneProfileEndPoint: AuthDecorator.checkAuthToken(getControlPlaneProfileEndPoint) +} diff --git a/src/data/managers/control-plane.js b/src/data/managers/control-plane.js new file mode 100644 index 000000000..554a3a58e --- /dev/null +++ b/src/data/managers/control-plane.js @@ -0,0 +1,36 @@ +/* + * ******************************************************************************* + * * Copyright (c) 2023 Datasance Teknoloji A.S. + * * + * * This program and the accompanying materials are made available under the + * * terms of the Eclipse Public License v. 2.0 which is available at + * * http://www.eclipse.org/legal/epl-2.0 + * * + * * SPDX-License-Identifier: EPL-2.0 + * ******************************************************************************* + * + */ + +const BaseManager = require('./base-manager') +const models = require('../models') +const ControlPlane = models.ControlPlane + +class ControlPlaneManager extends BaseManager { + getEntity () { + return ControlPlane + } + + // no transaction required here, used by cli decorator + findByUuid (uuid) { + return ControlPlane.findOne({ where: { uuid } }) + } + + updateDetails (controlPlane, updateObject, transaction) { + return this.update({ + id: controlPlane.uuid + }, updateObject, transaction) + } +} + +const instance = new ControlPlaneManager() +module.exports = instance diff --git a/src/data/migrations/20200123045032-fog-and-change-tracking.js b/src/data/migrations/20200123045032-fog-and-change-tracking.js index a73b2e8e4..0c38b5745 100644 --- a/src/data/migrations/20200123045032-fog-and-change-tracking.js +++ b/src/data/migrations/20200123045032-fog-and-change-tracking.js @@ -1,5 +1,5 @@ 'use strict' - +//deleted module.exports = { up: (queryInterface, Sequelize) => { /* diff --git a/src/data/migrations/20200213033350-create-config.js b/src/data/migrations/20200213033350-create-config.js index 76988e5b7..c3c4282a0 100644 --- a/src/data/migrations/20200213033350-create-config.js +++ b/src/data/migrations/20200213033350-create-config.js @@ -1,4 +1,5 @@ 'use strict' + module.exports = { up: (queryInterface, Sequelize) => { return queryInterface.createTable('Config', { @@ -8,10 +9,9 @@ module.exports = { autoIncrement: true, allowNull: false, field: 'id' - }, key: { - type: Sequelize.TEXT, + type: Sequelize.STRING(255), field: 'key', unique: true, allowNull: false diff --git a/src/data/migrations/20200506004924-add-route-name.js b/src/data/migrations/20200506004924-add-route-name.js index b02ba2d83..91d5e2de9 100644 --- a/src/data/migrations/20200506004924-add-route-name.js +++ b/src/data/migrations/20200506004924-add-route-name.js @@ -1,9 +1,9 @@ 'use strict' - +//deleted module.exports = { up: (queryInterface, Sequelize) => { return queryInterface.addColumn('Routings', 'name', { - type: Sequelize.TEXT, + type: Sequelize.STRING(255), allowNull: false, defaultValue: 'route' }).then(() => queryInterface.addIndex('Routings', ['name'], { diff --git a/src/data/migrations/20201001230303-add-tags-fogs.js b/src/data/migrations/20201001230303-add-tags-fogs.js index 6b435c431..54a13d3ef 100644 --- a/src/data/migrations/20201001230303-add-tags-fogs.js +++ b/src/data/migrations/20201001230303-add-tags-fogs.js @@ -11,7 +11,7 @@ module.exports = { field: 'id' }, value: { - type: Sequelize.TEXT, + type: Sequelize.STRING(255), field: 'value', unique: true, allowNull: false @@ -32,7 +32,7 @@ module.exports = { onDelete: 'cascade' }, FogUuid: { - type: Sequelize.TEXT, + type: Sequelize.STRING(255), field: 'fog_uuid', references: { model: 'Fogs', key: 'uuid' }, onDelete: 'cascade' diff --git a/src/data/migrations/20201028005645-create-edge-resources.js b/src/data/migrations/20201028005645-create-edge-resources.js index e03b5f07c..5a98af753 100644 --- a/src/data/migrations/20201028005645-create-edge-resources.js +++ b/src/data/migrations/20201028005645-create-edge-resources.js @@ -45,7 +45,7 @@ module.exports = { onDelete: 'cascade' }, FogUuid: { - type: Sequelize.TEXT, + type: Sequelize.STRING(255), field: 'fog_uuid', references: { model: 'Fogs', key: 'uuid' }, onDelete: 'cascade' diff --git a/src/data/migrations/20201204003312-create_application_templates.js b/src/data/migrations/20201204003312-create_application_templates.js index 02f513767..dfd2dde85 100644 --- a/src/data/migrations/20201204003312-create_application_templates.js +++ b/src/data/migrations/20201204003312-create_application_templates.js @@ -10,7 +10,7 @@ module.exports = { allowNull: false }, name: { - type: Sequelize.TEXT, + type: Sequelize.STRING(255), field: 'name', defaultValue: 'new-application-template', unique: true diff --git a/src/data/migrations/20211022010318-add-unique-constraint-msvc.js b/src/data/migrations/20211022010318-add-unique-constraint-msvc.js index b0aff579f..3e5b504aa 100644 --- a/src/data/migrations/20211022010318-add-unique-constraint-msvc.js +++ b/src/data/migrations/20211022010318-add-unique-constraint-msvc.js @@ -1,5 +1,5 @@ 'use strict' - +//deleted module.exports = { up: (queryInterface, Sequelize) => { /* diff --git a/src/data/migrations/20211022013326-add-unique-constraint-route.js b/src/data/migrations/20211022013326-add-unique-constraint-route.js index 4c5259834..2761f083a 100644 --- a/src/data/migrations/20211022013326-add-unique-constraint-route.js +++ b/src/data/migrations/20211022013326-add-unique-constraint-route.js @@ -1,5 +1,5 @@ 'use strict' - +// deleted module.exports = { up: (queryInterface, Sequelize) => { /* diff --git a/src/data/models/application.js b/src/data/models/application.js index 1de86d5b9..3444f44bc 100644 --- a/src/data/models/application.js +++ b/src/data/models/application.js @@ -36,12 +36,12 @@ module.exports = (sequelize, DataTypes) => { underscored: true }) Application.associate = function (models) { - Application.belongsTo(models.User, { + Application.belongsTo(models.ControlPlane, { foreignKey: { - name: 'userId', - field: 'user_id' + name: 'controlPlaneUuid', + field: 'controlPlane_uuid' }, - as: 'user', + as: 'controlPlane', onDelete: 'cascade' }) diff --git a/src/data/models/applicationTemplate.js b/src/data/models/applicationTemplate.js index db9e1172c..5f19bebe7 100644 --- a/src/data/models/applicationTemplate.js +++ b/src/data/models/applicationTemplate.js @@ -35,12 +35,12 @@ module.exports = (sequelize, DataTypes) => { underscored: true }) ApplicationTemplate.associate = function (models) { - ApplicationTemplate.belongsTo(models.User, { + ApplicationTemplate.belongsTo(models.ControlPlane, { foreignKey: { - name: 'userId', - field: 'user_id' + name: 'controlPlaneUuid', + field: 'controlPlane_uuid' }, - as: 'user', + as: 'controlPlane', onDelete: 'cascade' }) ApplicationTemplate.hasMany(models.ApplicationTemplateVariable, { diff --git a/src/data/models/catalogitem.js b/src/data/models/catalogitem.js index 661b78b74..8c7da3a88 100644 --- a/src/data/models/catalogitem.js +++ b/src/data/models/catalogitem.js @@ -76,12 +76,12 @@ module.exports = (sequelize, DataTypes) => { defaultValue: 1 }) - CatalogItem.belongsTo(models.User, { + CatalogItem.belongsTo(models.ControlPlane, { foreignKey: { - name: 'userId', - field: 'user_id' + name: 'controlPlaneUuid', + field: 'controlPlane_uuid' }, - as: 'user', + as: 'controlPlane', onDelete: 'cascade' }) diff --git a/src/data/models/controlPlane.js b/src/data/models/controlPlane.js new file mode 100644 index 000000000..254665d1b --- /dev/null +++ b/src/data/models/controlPlane.js @@ -0,0 +1,66 @@ +'use strict' +module.exports = (sequelize, DataTypes) => { + const ControlPlane = sequelize.define('ControlPlane', { + uuid: { + type: DataTypes.STRING(32), + primaryKey: true, + allowNull: false, + field: 'uuid' + }, + namespace: { + /* eslint-disable new-cap */ + type: DataTypes.STRING(100), + field: 'namespace', + defaultValue: '' + }, + orgName: { + /* eslint-disable new-cap */ + type: DataTypes.STRING(100), + field: 'orgn_name', + defaultValue: '' + }, + entitlementId: { + /* eslint-disable new-cap */ + type: DataTypes.STRING(100), + field: 'entitlement_id' + } + }, { + tableName: 'ControlPlane', + timestamps: false, + underscored: true + }) + ControlPlane.associate = function (models) { + ControlPlane.hasMany(models.User, { + foreignKey: { + name: 'controlPlaneUuid', + field: 'controlPlane_uuid' + }, + as: 'user' + }) + + ControlPlane.hasMany(models.Application, { + foreignKey: { + name: 'controlPlaneUuid', + field: 'controlPlane_uuid' + }, + as: 'application' + }) + + ControlPlane.hasMany(models.Fog, { + foreignKey: { + name: 'controlPlaneUuid', + field: 'controlPlane_uuid' + }, + as: 'fog' + }) + + ControlPlane.hasMany(models.Microservice, { + foreignKey: { + name: 'controlPlaneUuid', + field: 'controlPlane_uuid' + }, + as: 'microservice' + }) + } + return ControlPlane +} diff --git a/src/data/models/edgeResource.js b/src/data/models/edgeResource.js index d0e96afdb..d19bcbb3c 100644 --- a/src/data/models/edgeResource.js +++ b/src/data/models/edgeResource.js @@ -28,13 +28,12 @@ module.exports = (sequelize, DataTypes) => { EdgeResource.belongsToMany(models.Fog, { through: 'AgentEdgeResources', as: 'agents' }) EdgeResource.belongsToMany(models.Tags, { as: 'orchestrationTags', through: 'EdgeResourceOrchestrationTags' }) - EdgeResource.belongsTo(models.User, { + EdgeResource.belongsTo(models.ControlPlane, { foreignKey: { - name: 'userId', - field: 'user_id' + name: 'controlPlaneUuid', + field: 'controlPlane_uuid' }, - as: 'user', - defaultValue: 0, + as: 'controlPlane', onDelete: 'cascade' }) } diff --git a/src/data/models/fog.js b/src/data/models/fog.js index 22e80ab1d..353943559 100644 --- a/src/data/models/fog.js +++ b/src/data/models/fog.js @@ -324,13 +324,12 @@ module.exports = (sequelize, DataTypes) => { defaultValue: 0 }) - Fog.belongsTo(models.User, { + Fog.belongsTo(models.ControlPlane, { foreignKey: { - name: 'userId', - field: 'user_id' + name: 'controlPlaneUuid', + field: 'controlPlane_uuid' }, - as: 'user', - defaultValue: 0, + as: 'controlPlane', onDelete: 'cascade' }) diff --git a/src/data/models/fogaccesstoken.js b/src/data/models/fogaccesstoken.js index a2a4e1b81..842f66852 100644 --- a/src/data/models/fogaccesstoken.js +++ b/src/data/models/fogaccesstoken.js @@ -28,12 +28,12 @@ module.exports = (sequelize, DataTypes) => { underscored: true }) FogAccessToken.associate = function (models) { - FogAccessToken.belongsTo(models.User, { + FogAccessToken.belongsTo(models.ControlPlane, { foreignKey: { - name: 'userId', - field: 'user_id' + name: 'controlPlaneUuid', + field: 'controlPlane_uuid' }, - as: 'user', + as: 'controlPlane', onDelete: 'cascade' }) diff --git a/src/data/models/kubeletaccesstoken.js b/src/data/models/kubeletaccesstoken.js index 1355fe0bd..0122cc7d8 100644 --- a/src/data/models/kubeletaccesstoken.js +++ b/src/data/models/kubeletaccesstoken.js @@ -28,12 +28,12 @@ module.exports = (sequelize, DataTypes) => { underscored: true }) KubeletAccessToken.associate = function (models) { - KubeletAccessToken.belongsTo(models.User, { + KubeletAccessToken.belongsTo(models.ControlPlane, { foreignKey: { - name: 'userId', - field: 'user_id' + name: 'controlPlaneUuid', + field: 'controlPlane_uuid' }, - as: 'user', + as: 'controlPlane', onDelete: 'cascade' }) } diff --git a/src/data/models/microservice.js b/src/data/models/microservice.js index cd25823db..0af8ace15 100644 --- a/src/data/models/microservice.js +++ b/src/data/models/microservice.js @@ -108,12 +108,12 @@ module.exports = (sequelize, DataTypes) => { onDelete: 'cascade' }) - Microservice.belongsTo(models.User, { + Microservice.belongsTo(models.ControlPlane, { foreignKey: { - name: 'userId', - field: 'user_id' + name: 'controlPlaneUuid', + field: 'controlPlane_uuid' }, - as: 'user', + as: 'controlPlane', onDelete: 'cascade' }) diff --git a/src/data/models/microserviceport.js b/src/data/models/microserviceport.js index b9b2a7bdf..c9c24ab7d 100644 --- a/src/data/models/microserviceport.js +++ b/src/data/models/microserviceport.js @@ -43,12 +43,12 @@ module.exports = (sequelize, DataTypes) => { onDelete: 'cascade' }) - MicroservicePort.belongsTo(models.User, { + MicroservicePort.belongsTo(models.ControlPlane, { foreignKey: { - name: 'userId', - field: 'user_id' + name: 'controlPlaneUuid', + field: 'controlPlane_uuid' }, - as: 'user', + as: 'controlPlane', onDelete: 'cascade' }) diff --git a/src/data/models/registry.js b/src/data/models/registry.js index 3840ecd54..48c85a034 100644 --- a/src/data/models/registry.js +++ b/src/data/models/registry.js @@ -46,12 +46,13 @@ module.exports = (sequelize, DataTypes) => { underscored: true }) Registry.associate = function (models) { - Registry.belongsTo(models.User, { + Registry.belongsTo(models.ControlPlane, { foreignKey: { - name: 'userId', - field: 'user_id' + name: 'controlPlaneUuid', + field: 'controlPlane_uuid' }, - as: 'user' + as: 'controlPlane', + onDelete: 'cascade' }) } return Registry diff --git a/src/data/models/user.js b/src/data/models/user.js index acd0a827f..d8a9e16ec 100644 --- a/src/data/models/user.js +++ b/src/data/models/user.js @@ -80,6 +80,15 @@ module.exports = (sequelize, DataTypes) => { }, as: 'microservice' }) + + User.belongsTo(models.ControlPlane, { + foreignKey: { + name: 'controlPlaneUuid', + field: 'controlPlane_uuid' + }, + as: 'controlPlane', + onDelete: 'cascade' + }) } return User } diff --git a/src/data/providers/mysql.js b/src/data/providers/mysql.js index 30715a4fe..935e25125 100644 --- a/src/data/providers/mysql.js +++ b/src/data/providers/mysql.js @@ -1,34 +1,25 @@ -const Sequelize = require('sequelize'); +const Sequelize = require('sequelize') -const config = require('../../config'); -const DatabaseProvider = require('./database-provider'); +const config = require('../../config') +const DatabaseProvider = require('./database-provider') class MySqlDatabaseProvider extends DatabaseProvider { constructor () { - super(); + super() - const mysqlConfig = config.get('Database:Config:mysql', {}); - mysqlConfig.dialect = 'mysql'; - mysqlConfig.host = process.env.DB_HOST || mysqlConfig.host; - mysqlConfig.port = process.env.DB_PORT || mysqlConfig.port; - mysqlConfig.username = process.env.DB_USERNAME || mysqlConfig.username; - mysqlConfig.password = process.env.DB_PASSWORD || mysqlConfig.password; - mysqlConfig.databaseName = process.env.DB_NAME || mysqlConfig.database; + const mysqlConfig = config.get('Database:Config:mysql', {}) + mysqlConfig.dialect = 'mysql' + mysqlConfig.host = process.env.DB_HOST || mysqlConfig.host + mysqlConfig.port = process.env.DB_PORT || mysqlConfig.port + mysqlConfig.username = process.env.DB_USERNAME || mysqlConfig.username + mysqlConfig.password = process.env.DB_PASSWORD || mysqlConfig.password + mysqlConfig.databaseName = process.env.DB_NAME || mysqlConfig.database - this.sequelize = new Sequelize(mysqlConfig.databaseName, mysqlConfig.username, mysqlConfig.password, mysqlConfig); - - this.initDB(); // Call initDB method to start the database initialization + this.sequelize = new Sequelize(mysqlConfig.databaseName, mysqlConfig.username, mysqlConfig.password, mysqlConfig) } async initDB () { - try { - await this.sequelize.authenticate(); - console.log('Connection has been established successfully.'); - // Implement further initialization logic here - } catch (error) { - console.error('Unable to connect to the database: ', error); - } } } -module.exports = MySqlDatabaseProvider; +module.exports = MySqlDatabaseProvider diff --git a/src/data/providers/sqlite.js b/src/data/providers/sqlite.js index 0f65837a2..1d0e5cb04 100644 --- a/src/data/providers/sqlite.js +++ b/src/data/providers/sqlite.js @@ -3,7 +3,7 @@ const fs = require('fs') const Sequelize = require('sequelize') const config = require('../../config') -const DatabaseProvider = require(`./database-provider`) +const DatabaseProvider = require('./database-provider') class SqliteDatabaseProvider extends DatabaseProvider { constructor () { diff --git a/src/data/seeders/20240304180631-insert-control-plane.js b/src/data/seeders/20240304180631-insert-control-plane.js new file mode 100644 index 000000000..cd015ea18 --- /dev/null +++ b/src/data/seeders/20240304180631-insert-control-plane.js @@ -0,0 +1,19 @@ +const config = require('../../config') + +const ControlPlaneConfig = config.get('ControlPlane:Config', {}) + +module.exports = { + up: (queryInterface, Sequelize) => { + return queryInterface.Insert('ControlPlane', [ + { + namespace: ControlPlaneConfig.namespace, + orgName: ControlPlaneConfig.orgName, + entitlementId: ControlPlaneConfig.entitlementID + } + ]) + }, + + down: (queryInterface, Sequelize) => { + return queryInterface.Delete('ControlPlane', null, {}) + } +} diff --git a/src/routes/controlPlane.js b/src/routes/controlPlane.js new file mode 100644 index 000000000..37750b99c --- /dev/null +++ b/src/routes/controlPlane.js @@ -0,0 +1,45 @@ +/* + * ******************************************************************************* + * * Copyright (c) 2023 Datasance Teknoloji A.S. + * * + * * This program and the accompanying materials are made available under the + * * terms of the Eclipse Public License v. 2.0 which is available at + * * http://www.eclipse.org/legal/epl-2.0 + * * + * * SPDX-License-Identifier: EPL-2.0 + * ******************************************************************************* + * + */ +const constants = require('../helpers/constants') +const ControlPlaneController = require('../controllers/control-plane-controller') +const ResponseDecorator = require('../decorators/response-decorator') +const Errors = require('../helpers/errors') +const logger = require('../logger') + +module.exports = [ + { + method: 'get', + path: '/api/v1/controlplane/profile', + middleware: async (req, res) => { + logger.apiReq(req) + + const successCode = constants.HTTP_CODE_SUCCESS + const errorCodes = [ + { + code: constants.HTTP_CODE_UNAUTHORIZED, + errors: [Errors.AuthenticationError] + } + ] + + const getControlPlaneProfileEndPoint = ResponseDecorator.handleErrors(ControlPlaneController.getControlPlaneProfileEndPoint, successCode, errorCodes) + const responseObject = await getControlPlaneProfileEndPoint(req) + + res + .status(responseObject.code) + .send(responseObject.body) + + logger.apiRes({ req: req, res: responseObject }) + } + } + +] diff --git a/src/schemas/controlPlane.js b/src/schemas/controlPlane.js new file mode 100644 index 000000000..79b659a93 --- /dev/null +++ b/src/schemas/controlPlane.js @@ -0,0 +1,26 @@ +/* + * ******************************************************************************* + * * Copyright (c) 2023 Datasance Teknoloji A.S. + * * + * * This program and the accompanying materials are made available under the + * * terms of the Eclipse Public License v. 2.0 which is available at + * * http://www.eclipse.org/legal/epl-2.0 + * * + * * SPDX-License-Identifier: EPL-2.0 + * ******************************************************************************* + * + */ + +const details = { + id: '/profile', + type: 'object', + properties: { + }, + required: [], + additionalProperties: true +} + +module.exports = { + mainSchemas: [details], + innerSchemas: [] +} diff --git a/src/services/control-plane.js b/src/services/control-plane.js new file mode 100644 index 000000000..ab0c01417 --- /dev/null +++ b/src/services/control-plane.js @@ -0,0 +1 @@ +// \ No newline at end of file From 3763b6c7d4b622586fd36c350a4ffd4984c3a8a7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emirhan=20Durmu=C5=9F?= Date: Sat, 9 Mar 2024 17:17:51 +0300 Subject: [PATCH 052/178] condif data model associated with controlplane, timestamps for controlplane and user --- src/data/models/config.js | 9 ++++++++- src/data/models/controlPlane.js | 2 +- src/data/models/user.js | 2 +- 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/src/data/models/config.js b/src/data/models/config.js index 8935d9227..0ae57a117 100644 --- a/src/data/models/config.js +++ b/src/data/models/config.js @@ -31,7 +31,14 @@ module.exports = (sequelize, DataTypes) => { ] }) Config.associate = function (models) { - + Config.belongsTo(models.ControlPlane, { + foreignKey: { + name: 'controlPlaneUuid', + field: 'controlPlane_uuid' + }, + as: 'controlPlane', + onDelete: 'cascade' + }) } return Config } diff --git a/src/data/models/controlPlane.js b/src/data/models/controlPlane.js index 254665d1b..7a3710d89 100644 --- a/src/data/models/controlPlane.js +++ b/src/data/models/controlPlane.js @@ -26,7 +26,7 @@ module.exports = (sequelize, DataTypes) => { } }, { tableName: 'ControlPlane', - timestamps: false, + timestamps: true, underscored: true }) ControlPlane.associate = function (models) { diff --git a/src/data/models/user.js b/src/data/models/user.js index d8a9e16ec..3b1a30e6f 100644 --- a/src/data/models/user.js +++ b/src/data/models/user.js @@ -48,7 +48,7 @@ module.exports = (sequelize, DataTypes) => { } }, { tableName: 'Users', - timestamps: false, + timestamps: true, underscored: true }) User.associate = function (models) { From 2c1d42325317410c3727e7743ee46d1cbb0aaece Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emirhan=20Durmu=C5=9F?= Date: Sun, 10 Mar 2024 01:02:41 +0300 Subject: [PATCH 053/178] commit --- Dockerfile.dev | 2 +- src/data/migrations/20180930155645-create-user.js | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/Dockerfile.dev b/Dockerfile.dev index 861ebfa3f..93120cfd2 100644 --- a/Dockerfile.dev +++ b/Dockerfile.dev @@ -48,7 +48,7 @@ COPY --from=builder /tmp/datasance-iofogcontroller-*.tgz /tmp/iofog-controller.t RUN npm i -g /tmp/iofog-controller.tgz && \ rm -rf /tmp/iofog-controller.tgz && \ iofog-controller config dev-mode --on -# RUN sudo rm -rf /usr/local/lib/node_modules/iofogcontroller/src/data/sqlite_files +# RUN sudo rm -rf /usr/local/lib/node_modules/@datasance/iofogcontroller/src/data/sqlite_files LABEL org.opencontainers.image.description controller LABEL org.opencontainers.image.source=https://github.com/datasance/controller LABEL org.opencontainers.image.licenses=EPL2.0 diff --git a/src/data/migrations/20180930155645-create-user.js b/src/data/migrations/20180930155645-create-user.js index d1d119d5c..8d931c0ca 100644 --- a/src/data/migrations/20180930155645-create-user.js +++ b/src/data/migrations/20180930155645-create-user.js @@ -47,6 +47,12 @@ module.exports = { type: Sequelize.STRING(100), field: 'subscriptionKey', defaultValue: '' + }, + controlPlaneUuid: { + type: Sequelize.STRING(32), + field: 'controlPlane_uuid', + references: { model: 'ControlPlane', key: 'uuid' }, + onDelete: 'cascade' } }) }, From 3f56ab60471c43878345f070bae76b21219fdf4b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emirhan=20Durmu=C5=9F?= Date: Mon, 18 Mar 2024 00:15:05 +0300 Subject: [PATCH 054/178] keycloak connect adapter added, user removed from controller --- docs/swagger.json | 278 ----------- docs/swagger.yaml | 371 --------------- scripts/cli-tests.js | 80 +--- src/cli/application.js | 7 - src/cli/catalog.js | 7 - src/cli/config.js | 29 +- src/cli/controller.js | 9 - src/cli/iofog.js | 8 - src/cli/microservice.js | 7 - src/cli/registry.js | 7 - src/cli/user.js | 195 -------- src/config/constants.js | 3 - src/config/default.json | 4 - src/config/development.json | 18 +- src/config/keycloak.js | 48 ++ src/config/keycloak.json | 14 + src/config/production.json | 18 +- src/controllers/catalog-controller.js | 3 +- src/controllers/control-plane-controller.js | 26 -- src/controllers/controller.js | 5 - src/controllers/kubelet-controller.js | 120 ----- src/controllers/user-controller.js | 76 +-- src/data/managers/access-token-manager.js | 36 -- src/data/managers/control-plane.js | 36 -- .../managers/email-activation-code-manager.js | 65 --- .../managers/kubelet-access-token-manager.js | 25 - src/data/managers/microservice-manager.js | 9 - .../scheduler-access-token-manager.js | 25 - src/data/managers/user-manager.js | 91 ---- .../migrations/20180930155645-create-user.js | 62 --- .../migrations/20180930164635-create-flow.js | 12 - .../20180930173823-create-registry.js | 6 - .../20180930184436-create-catalog-item.js | 6 - ...0930204039-create-email-activation-code.js | 37 -- .../migrations/20180930225403-create-fog.js | 6 - .../20180930230219-create-fog-access-token.js | 6 - .../20181001062956-create-microservice.js | 6 - ...20181001070828-create-microservice-port.js | 6 - .../20181003104606-create-access-token.js | 37 -- ...microservice-rename-updatedBy-to-userId.js | 11 - ...service-port-rename-updatedBy-to-userId.js | 11 - .../20181109132723-flow-remove-updatedBy.js | 14 - ...90222135632-create-kubelet-access-token.js | 37 -- ...227154512-create-scheduler-access-token.js | 37 -- .../20200123163412-create-router.js | 12 - .../20200202113124-create-public-ports.js | 6 - .../20200213033350-create-config.js | 6 - .../20201028005645-create-edge-resources.js | 8 +- ...1204003312-create_application_templates.js | 6 - .../20221021132000-create-proxy-ports.js | 6 - src/data/models/accesstoken.js | 40 -- src/data/models/application.js | 9 - src/data/models/applicationTemplate.js | 8 - src/data/models/catalogitem.js | 9 - src/data/models/config.js | 10 - src/data/models/controlPlane.js | 66 --- src/data/models/edgeResource.js | 9 - src/data/models/emailactivationcode.js | 41 -- src/data/models/fog.js | 9 - src/data/models/fogaccesstoken.js | 9 - src/data/models/index.js | 4 - src/data/models/kubeletaccesstoken.js | 41 -- src/data/models/microservice.js | 9 - src/data/models/microserviceport.js | 9 - src/data/models/registry.js | 10 - src/data/models/scheduleraccesstoken.js | 41 -- src/data/models/user.js | 94 ---- .../20240304180631-insert-control-plane.js | 19 - src/decorators/authorization-decorator.js | 29 -- src/decorators/cli-decorator.js | 69 --- src/helpers/errors.js | 10 - src/helpers/template-helper.js | 12 +- src/routes/catalog.js | 60 +-- src/routes/controlPlane.js | 45 -- src/routes/controller.js | 18 - src/routes/kubelet.js | 434 ------------------ src/routes/user.js | 234 ---------- src/schemas/config.js | 39 +- src/schemas/user.js | 123 +---- src/server.js | 13 +- src/services/access-token-service.js | 29 -- src/services/agent-service.js | 3 - src/services/application-service.js | 29 +- src/services/application-template-service.js | 31 +- src/services/catalog-service.js | 37 +- src/services/control-plane.js | 1 - src/services/controller-service.js | 9 - src/services/diagnostic-service.js | 22 +- src/services/edge-resource-service.js | 26 +- src/services/email-activation-code-service.js | 64 --- src/services/iofog-service.js | 80 +--- src/services/kubelet-access-token-service.js | 48 -- src/services/kubelet-service.js | 432 ----------------- src/services/microservice-ports/default.js | 73 +-- src/services/microservice-ports/proxy.js | 4 +- src/services/microservices-service.js | 92 ++-- src/services/registry-service.js | 30 +- src/services/router-service.js | 32 +- src/services/routing-service.js | 2 +- .../scheduler-access-token-service.js | 48 -- src/services/user-service.js | 397 ++-------------- 101 files changed, 371 insertions(+), 4599 deletions(-) delete mode 100644 src/cli/user.js create mode 100644 src/config/keycloak.js create mode 100644 src/config/keycloak.json delete mode 100644 src/controllers/control-plane-controller.js delete mode 100644 src/controllers/kubelet-controller.js delete mode 100644 src/data/managers/access-token-manager.js delete mode 100644 src/data/managers/control-plane.js delete mode 100644 src/data/managers/email-activation-code-manager.js delete mode 100644 src/data/managers/kubelet-access-token-manager.js delete mode 100644 src/data/managers/scheduler-access-token-manager.js delete mode 100644 src/data/managers/user-manager.js delete mode 100644 src/data/migrations/20180930155645-create-user.js delete mode 100644 src/data/migrations/20180930204039-create-email-activation-code.js delete mode 100644 src/data/migrations/20181003104606-create-access-token.js delete mode 100644 src/data/migrations/20181109132609-microservice-rename-updatedBy-to-userId.js delete mode 100644 src/data/migrations/20181109132704-microservice-port-rename-updatedBy-to-userId.js delete mode 100644 src/data/migrations/20181109132723-flow-remove-updatedBy.js delete mode 100644 src/data/migrations/20190222135632-create-kubelet-access-token.js delete mode 100644 src/data/migrations/20190227154512-create-scheduler-access-token.js delete mode 100644 src/data/models/accesstoken.js delete mode 100644 src/data/models/controlPlane.js delete mode 100644 src/data/models/emailactivationcode.js delete mode 100644 src/data/models/kubeletaccesstoken.js delete mode 100644 src/data/models/scheduleraccesstoken.js delete mode 100644 src/data/models/user.js delete mode 100644 src/data/seeders/20240304180631-insert-control-plane.js delete mode 100644 src/decorators/cli-decorator.js delete mode 100644 src/routes/controlPlane.js delete mode 100644 src/routes/kubelet.js delete mode 100644 src/services/access-token-service.js delete mode 100644 src/services/control-plane.js delete mode 100644 src/services/email-activation-code-service.js delete mode 100644 src/services/kubelet-access-token-service.js delete mode 100644 src/services/kubelet-service.js delete mode 100644 src/services/scheduler-access-token-service.js diff --git a/docs/swagger.json b/docs/swagger.json index 29afc4b7d..7442ffbb3 100644 --- a/docs/swagger.json +++ b/docs/swagger.json @@ -7,9 +7,6 @@ "tags" : [ { "name" : "Controller", "description" : "Manage your controller" - }, { - "name" : "Control Plane", - "description" : "Manage your Control Plane" }, { "name" : "ioFog", "description" : "Manage your agents" @@ -48,22 +45,6 @@ "description" : "Manage your users" } ], "paths" : { - "/controlplane/profile" : { - "get" : { - "tags" : [ "ControlPlane" ], - "summary" : "Returns Control Plane Profile", - "operationId" : "getControlPlaneProfile", - "parameters" : [ ], - "responses" : { - "200" : { - "description" : "Control Plane Profile" - }, - "500" : { - "description" : "Internal Server Error" - } - } - } - }, "/status" : { "get" : { "tags" : [ "Controller" ], @@ -80,22 +61,6 @@ } } }, - "/email-activation" : { - "get" : { - "tags" : [ "Controller" ], - "summary" : "Returns email activation status", - "operationId" : "getEmailActivationStatus", - "parameters" : [ ], - "responses" : { - "200" : { - "description" : "Email activation status" - }, - "500" : { - "description" : "Internal Server Error" - } - } - } - }, "/fog-types" : { "get" : { "tags" : [ "Controller" ], @@ -3058,249 +3023,6 @@ } } }, - "/user/logout" : { - "post" : { - "tags" : [ "User" ], - "summary" : "Logout", - "operationId" : "logout", - "parameters" : [ { - "name" : "Authorization", - "in" : "header", - "description" : "User token", - "required" : true - } ], - "responses" : { - "204" : { - "description" : "Success" - }, - "401" : { - "description" : "Not Authorized" - }, - "500" : { - "description" : "Internal Server Error" - } - } - } - }, - "/user/signup" : { - "post" : { - "tags" : [ "User" ], - "summary" : "Signup", - "operationId" : "signup", - "parameters" : [ ], - "responses" : { - "201" : { - "description" : "Success", - "headers" : { - "X-Timestamp" : { - "description" : "FogController server timestamp" - } - } - }, - "400" : { - "description" : "Bad Request" - }, - "500" : { - "description" : "Internal Server Error" - } - } - } - }, - "/user/signup/resend-activation" : { - "get" : { - "tags" : [ "User" ], - "summary" : "Resend activation email", - "operationId" : "resendActivationEmail", - "parameters" : [ { - "name" : "email", - "in" : "query", - "required" : true - } ], - "responses" : { - "204" : { - "description" : "Success", - "headers" : { - "X-Timestamp" : { - "description" : "FogController server timestamp" - } - } - }, - "400" : { - "description" : "Bad Request" - }, - "500" : { - "description" : "Internal Server Error" - } - } - } - }, - "/user/activate" : { - "post" : { - "tags" : [ "User" ], - "summary" : "Activate account", - "operationId" : "activateAccount", - "parameters" : [ ], - "responses" : { - "303" : { - "description" : "Redirect to login page", - "headers" : { - "X-Timestamp" : { - "description" : "FogController server timestamp" - }, - "Location" : { - "description" : "Login page url" - } - } - }, - "404" : { - "description" : "Not Found" - }, - "500" : { - "description" : "Internal Server Error" - } - } - } - }, - "/user/profile" : { - "get" : { - "tags" : [ "User" ], - "summary" : "Get current user profile data", - "operationId" : "getUserProfile", - "parameters" : [ { - "name" : "Authorization", - "in" : "header", - "description" : "User token", - "required" : true - } ], - "responses" : { - "200" : { - "description" : "Success", - "headers" : { - "X-Timestamp" : { - "description" : "FogController server timestamp" - } - } - }, - "401" : { - "description" : "Not Authorized" - }, - "500" : { - "description" : "Internal Server Error" - } - } - }, - "delete" : { - "tags" : [ "User" ], - "summary" : "Delete account", - "operationId" : "deleteAccount", - "parameters" : [ { - "name" : "Authorization", - "in" : "header", - "description" : "User Token", - "required" : true - } ], - "responses" : { - "204" : { - "description" : "Success", - "headers" : { - "X-Timestamp" : { - "description" : "FogController server timestamp" - } - } - }, - "401" : { - "description" : "Not Authorized" - }, - "500" : { - "description" : "Internal Server Error" - } - } - }, - "patch" : { - "tags" : [ "User" ], - "summary" : "Update user profile", - "operationId" : "updateUserProfile", - "parameters" : [ { - "name" : "Authorization", - "in" : "header", - "description" : "User Token", - "required" : true - } ], - "responses" : { - "200" : { - "description" : "Updated user profile", - "headers" : { - "X-Timestamp" : { - "description" : "FogController server timestamp" - } - } - }, - "400" : { - "description" : "Bad Request" - }, - "401" : { - "description" : "Not Authorized" - }, - "500" : { - "description" : "Internal Server Error" - } - } - } - }, - "/user/password" : { - "delete" : { - "tags" : [ "User" ], - "summary" : "Reset password", - "operationId" : "resetPassword", - "parameters" : [ ], - "responses" : { - "204" : { - "description" : "Success", - "headers" : { - "X-Timestamp" : { - "description" : "FogController server timestamp" - } - } - }, - "404" : { - "description" : "Not Found" - }, - "500" : { - "description" : "Internal Server Error" - } - } - }, - "patch" : { - "tags" : [ "User" ], - "summary" : "change password", - "operationId" : "changePassword", - "parameters" : [ { - "name" : "Authorization", - "in" : "header", - "description" : "User Token", - "required" : true - } ], - "responses" : { - "204" : { - "description" : "Success", - "headers" : { - "X-Timestamp" : { - "description" : "FogController server timestamp" - } - } - }, - "400" : { - "description" : "Bad Request" - }, - "401" : { - "description" : "Not Authorized" - }, - "500" : { - "description" : "Internal Server Error" - } - } - } - }, "/routes" : { "get" : { "tags" : [ "Routing" ], diff --git a/docs/swagger.yaml b/docs/swagger.yaml index cd13d6b03..eea611c12 100755 --- a/docs/swagger.yaml +++ b/docs/swagger.yaml @@ -3,21 +3,6 @@ info: version: 1.0.0 title: Datasance PoT-ioFog Controller paths: - /controlplane/profile: - get: - tags: - - ControlPlane - summary: Returns Control Plane Profile - operationId: getControlPlaneProfile - responses: - "200": - description: Control Plane Profile - content: - application/json: - schema: - $ref: "#/components/schemas/ControlPlaneProfileResponse" - "500": - description: Internal Server Error /status: get: tags: @@ -33,21 +18,6 @@ paths: $ref: "#/components/schemas/ServiceStatusResponse" "500": description: Internal Server Error - /email-activation: - get: - tags: - - Controller - summary: Returns email activation status - operationId: getEmailActivationStatus - responses: - "200": - description: Email activation status - content: - application/json: - schema: - $ref: "#/components/schemas/EmailActivationStatusResponse" - "500": - description: Internal Server Error /fog-types: get: tags: @@ -2744,237 +2714,6 @@ paths: description: bad request "401": description: incorrect credentials - /user/logout: - post: - tags: - - User - summary: Logout - operationId: logout - security: - - userToken: [] - responses: - "204": - description: Success - "401": - description: Not Authorized - "500": - description: Internal Server Error - /user/signup: - post: - tags: - - User - summary: Signup - operationId: signup - requestBody: - content: - application/json: - schema: - $ref: "#/components/schemas/SignupRequest" - description: new user data - required: true - responses: - "201": - description: Success - headers: - X-Timestamp: - description: FogController server timestamp - schema: - type: number - content: - application/json: - schema: - $ref: "#/components/schemas/SignupSuccessResponse" - "400": - description: Bad Request - "500": - description: Internal Server Error - /user/signup/resend-activation: - get: - tags: - - User - summary: Resend activation email - operationId: resendActivationEmail - parameters: - - in: query - name: email - required: true - schema: - type: string - responses: - "204": - description: Success - headers: - X-Timestamp: - description: FogController server timestamp - schema: - type: number - "400": - description: Bad Request - "500": - description: Internal Server Error - /user/activate: - post: - tags: - - User - summary: Activate account - operationId: activateAccount - requestBody: - content: - application/json: - schema: - $ref: "#/components/schemas/UserActivateRequest" - description: activation code - required: true - responses: - "303": - description: Redirect to login page - headers: - X-Timestamp: - description: FogController server timestamp - schema: - type: number - Location: - description: Login page url - schema: - type: string - "404": - description: Not Found - "500": - description: Internal Server Error - /user/profile: - get: - tags: - - User - summary: Get current user profile data - operationId: getUserProfile - security: - - userToken: [] - responses: - "200": - description: Success - headers: - X-Timestamp: - description: FogController server timestamp - schema: - type: number - content: - application/json: - schema: - $ref: "#/components/schemas/UserProfileDetailsResponse" - "401": - description: Not Authorized - "500": - description: Internal Server Error - patch: - tags: - - User - summary: Update user profile - operationId: updateUserProfile - security: - - userToken: [] - requestBody: - content: - application/json: - schema: - $ref: "#/components/schemas/UserProfileUpdatesRequest" - description: Updated profile data - required: true - responses: - "200": - description: Updated user profile - headers: - X-Timestamp: - description: FogController server timestamp - schema: - type: number - content: - application/json: - schema: - $ref: "#/components/schemas/UserProfileDetailsResponse" - "400": - description: Bad Request - "401": - description: Not Authorized - "500": - description: Internal Server Error - delete: - tags: - - User - summary: Delete account - operationId: deleteAccount - security: - - userToken: [] - requestBody: - content: - application/json: - schema: - $ref: "#/components/schemas/DeleteParameters" - description: parameters for delete - responses: - "204": - description: Success - headers: - X-Timestamp: - description: FogController server timestamp - schema: - type: number - "401": - description: Not Authorized - "500": - description: Internal Server Error - /user/password: - patch: - tags: - - User - summary: change password - operationId: changePassword - security: - - userToken: [] - requestBody: - content: - application/json: - schema: - $ref: "#/components/schemas/PasswordChangeRequest" - description: current and new password - required: true - responses: - "204": - description: Success - headers: - X-Timestamp: - description: FogController server timestamp - schema: - type: number - "400": - description: Bad Request - "401": - description: Not Authorized - "500": - description: Internal Server Error - delete: - tags: - - User - summary: Reset password - operationId: resetPassword - requestBody: - content: - application/json: - schema: - $ref: "#/components/schemas/PasswordResetRequest" - description: email - required: true - responses: - "204": - description: Success - headers: - X-Timestamp: - description: FogController server timestamp - schema: - type: number - "404": - description: Not Found - "500": - description: Internal Server Error /routes: get: tags: @@ -3698,8 +3437,6 @@ components: type: string isActivated: type: boolean - userId: - type: number microservices: type: array items: @@ -3828,8 +3565,6 @@ components: type: string description: type: string - userId: - type: number application: type: object properties: @@ -3862,11 +3597,6 @@ components: example: ok timestamp: type: number - EmailActivationStatusResponse: - type: object - properties: - isEmailActivationEnabled: - type: boolean IOFogTypesResponse: type: object properties: @@ -4018,8 +3748,6 @@ components: type: number fogTypeId: type: number - userId: - type: number routerMode: type: string enum: @@ -4592,8 +4320,6 @@ components: type: string userEmail: type: string - userId: - type: string RegistryBody: type: object properties: @@ -4896,103 +4622,6 @@ components: properties: accessToken: type: string - SignupSuccessResponse: - type: object - required: - - userId - - firstName - - lastName - - email - - subscriptionKey - - emailActivated - properties: - userId: - type: number - firstName: - type: string - lastName: - type: string - email: - type: string - subscriptionKey: - type: string - emailActivated: - type: boolean - UserProfileDetailsResponse: - type: object - required: - - firstName - - lastName - - email - - subscriptionKey - properties: - firstName: - type: string - lastName: - type: string - email: - type: string - subscriptionKey: - type: string - UserProfileUpdatesRequest: - type: object - properties: - firstName: - type: string - lastName: - type: string - subscriptionKey: - type: string - UserActivateRequest: - type: object - required: - - activationCode - properties: - activationCode: - type: string - PasswordResetRequest: - type: object - required: - - email - properties: - email: - type: string - PasswordChangeRequest: - type: object - required: - - oldPassword - - newPassword - properties: - oldPassword: - type: string - newPassword: - type: string - DeleteParameters: - type: object - required: - - force - properties: - force: - type: boolean - SignupRequest: - type: object - required: - - firstName - - lastName - - email - - password - - subscriptionKey - properties: - firstName: - type: string - lastName: - type: string - email: - type: string - password: - type: string - subscriptionKey: - type: string VersionCommandResponse: type: object required: diff --git a/scripts/cli-tests.js b/scripts/cli-tests.js index 4db238617..a9866bb4e 100644 --- a/scripts/cli-tests.js +++ b/scripts/cli-tests.js @@ -34,12 +34,8 @@ let testsCounter = 0 let testsFailed = 0 const controllerStatusFields = ['status', 'timestamp'] -const controllerEmailActivationFields = ['isEmailActivationEnabled'] const controllerFogTypesFields = ['fogTypes'] -const userCreateFields = ['id'] -const userAccessTokenFields = ['accessToken'] - const ioFogCreateFields = ['uuid'] const ioFogListFields = ['fogs'] const ioFogProvisioningFields = ['key', 'expirationTime'] @@ -84,24 +80,10 @@ function testControllerSection () { console.log('\n=============================\nStarting controller section..') responseHasFields(testCommand('controller status'), controllerStatusFields) - responseHasFields(testCommand('controller email-activation'), controllerEmailActivationFields) responseHasFields(testCommand('controller fog-types'), controllerFogTypesFields) hasSomeResponse(testCommand('controller version')) } -function testUserSection () { - console.log('\n=============================\nStarting user section..') - - responseHasFields(testCommand('user add -f John -l Doe -e user@domain.com -p \'#Bugs4Fun\''), userCreateFields) - responseEquals(testCommand('user update -f John2 -l Doe2 -e user@domain.com -p \'#Bugs4Fun34\''), - 'User updated successfully.') - responseIsArray(testCommand('user list')) - responseHasFields(testCommand('user generate-token -e user@domain.com'), userAccessTokenFields) - responseEquals(testCommand('user suspend -e user@domain.com'), 'User suspended successfully.') - responseEquals(testCommand('user activate -e user@domain.com'), 'User activated successfully.') - responseEquals(testCommand('user remove -e user@domain.com'), 'User removed successfully.') -} - function testConfigSection () { console.log('\n=============================\nStarting config section..') @@ -124,18 +106,14 @@ function testTunnelSection () { function testIoFogSection () { console.log('\n=============================\nStarting iofog section..') - const userCreateResponse = responseHasFields(executeCommand('user add -f John -l Doe -e fogUser@domain.com' + - ' -p \'#Bugs4Fun\''), userCreateFields) - const userId = userCreateResponse.id - try { const ioFogCreateResponse = responseHasFields(testCommand('iofog add -n ioFog1 -l testLocation -t 55 -g 65' + ' -d testDescription -D testDockerUrl -M 55 -T testDiskDirectoryString -m 65 -c 24 -G 1 -Y testLogDirectory ' + - ' -s 25 -F 27 -Q 26 -B -W -A -y 1 -u ' + userId), ioFogCreateFields) + ' -s 25 -F 27 -Q 26 -B -W -A -y 1 -u '), ioFogCreateFields) const ioFogUuid = ioFogCreateResponse.uuid responseEquals(testCommand('iofog update -i ' + ioFogUuid + ' -n ioFog1 -l testLocation -t 55 -g 65 ' + '-d testDescription -D testDockerUrl -M 55 -T testDiskDirectoryString -m 65 -c 24 -G 1 -Y testLogDirectory ' + - ' -s 25 -F 27 -Q 26 -B -W -A -y 1 -L INFO -p 65 -k 95 -u ' + userId), 'ioFog node has been updated successfully.') + ' -s 25 -F 27 -Q 26 -B -W -A -y 1 -L INFO -p 65 -k 95 -u '), 'ioFog node has been updated successfully.') responseHasFields(testCommand('iofog list'), ioFogListFields) responseHasFields(testCommand('iofog info -i ' + ioFogUuid), ioFogCreateFields) responseHasFields(testCommand('iofog provisioning-key -i ' + ioFogUuid), ioFogProvisioningFields) @@ -145,7 +123,7 @@ function testIoFogSection () { 'ioFog version command has been set successfully') hasSomeResponse(testCommand('iofog hal-hw -i ' + ioFogUuid)) hasSomeResponse(testCommand('iofog hal-usb -i ' + ioFogUuid)) - responseEquals(testCommand('iofog remove -i ' + ioFogUuid + ' -u ' + userId), 'ioFog node has been removed successfully') + responseEquals(testCommand('iofog remove -i ' + ioFogUuid + ' -u '), 'ioFog node has been removed successfully') executeCommand('user remove -e fogUser@domain.com') } catch (exception) { executeCommand('user remove -e fogUser@domain.com') @@ -155,18 +133,15 @@ function testIoFogSection () { function testCatalogSection () { console.log('\n=============================\nStarting catalog section..') - const userCreateResponse = responseHasFields(executeCommand('user add -f John -l Doe -e catalogUser@domain.com' + - ' -p \'#Bugs4Fun\''), userCreateFields) - const userId = userCreateResponse.id const registryCreateResponse = responseHasFields(executeCommand('registry add -U testRegistryUri -b -l testUserName' + - ' -p testPassword -e testEmail@gmail.com -u ' + userId), registryCreateFields) + ' -p testPassword -e testEmail@gmail.com -u '), registryCreateFields) const registryId = registryCreateResponse.id try { const catalogCreateResponse = responseHasFields(testCommand('catalog add -n testCatalogItem1 -d testDescription' + ' -c testCategory -x testIntelImage -a testArmImage -p testPublisher -s 15 -r 15 -t testPicture -g ' + registryId + ' -I testInputType -F testInputFormat -O testOutputType -T testOutputFormat ' + - '-X \'{}\' -u ' + userId), catalogCreateFields) + '-X \'{}\' -u '), catalogCreateFields) const catalogId = catalogCreateResponse.id responseEquals(testCommand('catalog update -i ' + catalogId + ' -n testCatalogItem2 -d testDescription' + ' -c testCategory -x testIntelImage -a testArmImage -p testPublisher -s 15 -r 15 -t testPicture -g ' + @@ -186,19 +161,15 @@ function testCatalogSection () { function testApplicationSection () { console.log('\n=============================\nStarting application section..') - const userCreateResponse = responseHasFields(executeCommand('user add -f John -l Doe -e applicationUser@domain.com' + - ' -p \'#Bugs4Fun\''), userCreateFields) - const userId = userCreateResponse.id - try { const applicationCreateResponse = responseHasFields(testCommand('application add -n test-application-1 -d testDescription' + - ' -a -u ' + userId), applicationCreateFields) + ' -a -u '), applicationCreateFields) const name = applicationCreateResponse.name - responseEquals(testCommand('application update -n ' + name + ' -d testDescription -a' + ' -u ' + userId), + responseEquals(testCommand('application update -n ' + name + ' -d testDescription -a' + ' -u '), 'Application updated successfully.') responseHasFields(testCommand('application list'), applicationListFields) responseHasFields(testCommand('application info -n ' + name), applicationCreateFields) - responseEquals(testCommand('application remove -n ' + name + ' -u ' + userId), 'Application removed successfully.') + responseEquals(testCommand('application remove -n ' + name + ' -u '), 'Application removed successfully.') executeCommand('user remove -e applicationUser@domain.com') } catch (exception) { executeCommand('user remove -e applicationUser@domain.com') @@ -208,33 +179,29 @@ function testApplicationSection () { function testMicroserviceSection () { console.log('\n=============================\nStarting microservice section..') - const userCreateResponse = responseHasFields(executeCommand('user add -f John -l Doe -e microserviceUser@domain.com' + - ' -p \'#Bugs4Fun\''), userCreateFields) - const userId = userCreateResponse.id - const registryCreateResponse = responseHasFields(executeCommand('registry add -U testRegistryUri -b -l testUserName' + - ' -p testPassword -e testEmail@gmail.com -u ' + userId), registryCreateFields) + ' -p testPassword -e testEmail@gmail.com -u '), registryCreateFields) const registryId = registryCreateResponse.id const catalogCreateResponse = responseHasFields(executeCommand('catalog add -n testCatalogItem1 -d testDescription' + ' -c testCategory -x testIntelImage -a testArmImage -p testPublisher -s 15 -r 15 -t testPicture -g ' + registryId + ' -I testInputType -F testInputFormat -O testOutputType -T testOutputFormat ' + - '-X \'{}\' -u ' + userId), catalogCreateFields) + '-X \'{}\' -u '), catalogCreateFields) const catalogId = catalogCreateResponse.id const applicationCreateResponse = responseHasFields(executeCommand('application add -n test-application1 -d testDescription' + - ' -a -u ' + userId), applicationCreateFields) + ' -a -u '), applicationCreateFields) const applicationId = applicationCreateResponse.name const ioFogCreateResponse = responseHasFields(executeCommand('iofog add -n ioFog2 -l testLocation -t 55 -g 65 ' + '-d testDescription -D testDockerUrl -M 55 -T testDiskDirectoryString -m 65 -c 24 -G 1 -Y testLogDirectory ' + - ' -s 25 -F 27 -Q 26 -B -W -A -y 1 -u ' + userId), ioFogCreateFields) + ' -s 25 -F 27 -Q 26 -B -W -A -y 1 -u '), ioFogCreateFields) const ioFogUuid = ioFogCreateResponse.uuid try { const microserviceCreateResponse = responseHasFields(testCommand('microservice add -n microservice-name-1' + ' -c ' + catalogId + ' -F ' + applicationId + ' -I ' + ioFogUuid + ' -g \'{}\' -v /host_src:/container_src:rw -l 15 -R' + - ' -p 80:8080:false -u ' + userId), microserviceCreateFields) + ' -p 80:8080:false -u '), microserviceCreateFields) const microserviceUuid = microserviceCreateResponse.uuid responseEquals(testCommand('microservice update -i ' + microserviceUuid + ' -n microservice-name-2' + ' -I ' + ioFogUuid + ' -g \'{}\' -v /host_src:/container_src:rw -l 15 -R -w'), @@ -274,13 +241,9 @@ function testMicroserviceSection () { function testRegistrySection () { console.log('\n=============================\nStarting registry section..') - const userCreateResponse = responseHasFields(executeCommand('user add -f John -l Doe -e registryUser@domain.com' + - ' -p \'#Bugs4Fun\''), userCreateFields) - try { - const userId = userCreateResponse.id const registryCreateResponse = responseHasFields(testCommand('registry add -U testRegistryUri -b -l testUserName' + - ' -p testPassword -e testEmail@gmail.com -u ' + userId), registryCreateFields) + ' -p testPassword -e testEmail@gmail.com -u '), registryCreateFields) const registryId = registryCreateResponse.id responseEquals(testCommand('registry update -i ' + registryId + ' -U testRegistryUri -b -l testUserName' + ' -p testPassword -e testEmail@gmail.com'), 'Registry has been updated successfully.') @@ -295,32 +258,28 @@ function testRegistrySection () { function testDiagnosticsSection () { console.log('\n=============================\nStarting diagnostics section..') - const userCreateResponse = responseHasFields(executeCommand('user add -f John -l Doe -e diagnosticsUser@domain.com' + - ' -p \'#Bugs4Fun\''), userCreateFields) - const userId = userCreateResponse.id - const registryCreateResponse = responseHasFields(executeCommand('registry add -U testRegistryUri -b -l testUserName' + - ' -p testPassword -e testEmail@gmail.com -u ' + userId), registryCreateFields) + ' -p testPassword -e testEmail@gmail.com -u '), registryCreateFields) const registryId = registryCreateResponse.id const catalogCreateResponse = responseHasFields(executeCommand('catalog add -n testCatalogItem1 -d testDescription' + ' -c testCategory -x testIntelImage -a testArmImage -p testPublisher -s 15 -r 15 -t testPicture -g ' + registryId + ' -I testInputType -F testInputFormat -O testOutputType -T testOutputFormat ' + - '-X \'{}\' -u ' + userId), catalogCreateFields) + '-X \'{}\' -u '), catalogCreateFields) const catalogId = catalogCreateResponse.id const applicationCreateResponse = responseHasFields(executeCommand('application add -n test-application1 -d testDescription' + - ' -a -u ' + userId), applicationCreateFields) + ' -a -u '), applicationCreateFields) const applicationId = applicationCreateResponse.name const ioFogCreateResponse = responseHasFields(executeCommand('iofog add -n ioFog3 -l testLocation -t 55 -g 65' + ' -d testDescription -D testDockerUrl -M 55 -T testDiskDirectoryString -m 65 -c 24 -G 1 -Y testLogDirectory ' + - ' -s 25 -F 27 -Q 26 -B -W -A -y 1 -u ' + userId), ioFogCreateFields) + ' -s 25 -F 27 -Q 26 -B -W -A -y 1 -u '), ioFogCreateFields) const ioFogUuid = ioFogCreateResponse.uuid const microserviceCreateResponse = responseHasFields(executeCommand('microservice add -n microservice-name-1' + ' -c ' + catalogId + ' -F ' + applicationId + ' -I ' + ioFogUuid + ' -g \'{}\' -v /host_src:/container_src:rw -l 15 -R' + - ' -p 80:8080:false -u ' + userId), microserviceCreateFields) + ' -p 80:8080:false -u '), microserviceCreateFields) const microserviceUuid = microserviceCreateResponse.uuid try { @@ -421,7 +380,6 @@ async function cliTest () { await seedTestData() testControllerSection() - testUserSection() testConfigSection() testTunnelSection() testIoFogSection() diff --git a/src/cli/application.js b/src/cli/application.js index ef50cfd41..6dc99594a 100644 --- a/src/cli/application.js +++ b/src/cli/application.js @@ -71,13 +71,6 @@ class Application extends BaseCLIHandler { type: Boolean, description: 'Deactivate application', group: [constants.CMD_UPDATE, constants.CMD_ADD] - }, - { - name: 'user-id', - alias: 'u', - type: CliDataTypes.Integer, - description: 'User\'s id', - group: [constants.CMD_ADD, constants.CMD_UPDATE, constants.CMD_REMOVE] } ] this.commands = { diff --git a/src/cli/catalog.js b/src/cli/catalog.js index 33a3e1908..a9a5a60db 100644 --- a/src/cli/catalog.js +++ b/src/cli/catalog.js @@ -192,13 +192,6 @@ class Catalog extends BaseCLIHandler { type: String, description: 'Catalog item config example', group: [constants.CMD_UPDATE, constants.CMD_ADD] - }, - { - name: 'user-id', - alias: 'u', - type: CliDataTypes.Integer, - description: 'User\'s id', - group: [constants.CMD_ADD] } ] this.commands = { diff --git a/src/cli/config.js b/src/cli/config.js index f0f813fed..438dd55f0 100644 --- a/src/cli/config.js +++ b/src/cli/config.js @@ -121,13 +121,6 @@ class Config extends BaseCLIHandler { type: Boolean, description: 'Disable', group: [constants.CMD_DEV_MODE, constants.CMD_EMAIL_ACTIVATION] - }, - { - name: 'kubelet', - alias: 't', - type: String, - description: 'iofog-kubelet url', - group: constants.CMD_ADD } ] this.commands = { @@ -156,9 +149,6 @@ class Config extends BaseCLIHandler { case constants.CMD_DEV_MODE: await _executeCase(configCommand, constants.CMD_DEV_MODE, _changeDevModeState) break - case constants.CMD_EMAIL_ACTIVATION: - await _executeCase(configCommand, constants.CMD_EMAIL_ACTIVATION, _changeEmailActivationState) - break case constants.CMD_HELP: default: return this.help([], true, false) @@ -256,11 +246,6 @@ const _addConfigOption = async function (options) { config.set('Service:LogsFileCount', options.logFileCount) onSuccess() }) - - await updateConfig(options.kubelet, 'kubelet', 'Kubelet:Uri', (onSuccess) => { - config.set('Kubelet:Uri', options.kubelet) - onSuccess() - }) } const updateConfig = async function (newConfigValue, cliConfigName, configName, fn) { @@ -283,16 +268,10 @@ const _listConfigOptions = function () { 'SSL key directory': config.get('Server:SslKey'), 'SSL certificate directory': config.get('Server:SslCert'), 'Intermediate key directory': config.get('Server:IntermediateCert'), - 'Home url': config.get('Email:HomeUrl'), - 'Email activation': config.get('Email:ActivationEnabled'), - 'Email address': config.get('Email:Address'), - 'Email password': config.get('Email:Password'), - 'Email service': config.get('Email:Service'), 'Log files directory': config.get('Service:LogsDirectory'), 'Log files size': config.get('Service:LogsFileSize'), 'Log files count': config.get('Service:LogsFileCount'), - 'Dev mode': config.get('Server:DevMode'), - 'Kubelet Url': config.get('Kubelet:Uri') + 'Dev mode': config.get('Server:DevMode') } const result = Object.keys(configuration) @@ -308,10 +287,4 @@ const _changeDevModeState = async function (options) { logger.cliRes('Dev mode state updated successfully.') } -const _changeEmailActivationState = function (options) { - const enableEmailActivation = AppHelper.validateBooleanCliOptions(options.on, options.off) - config.set('Email:ActivationEnabled', enableEmailActivation) - logger.cliRes('Email activation state updated successfully.') -} - module.exports = new Config() diff --git a/src/cli/controller.js b/src/cli/controller.js index ab650c4c8..dc3327cb6 100644 --- a/src/cli/controller.js +++ b/src/cli/controller.js @@ -50,9 +50,6 @@ class Controller extends BaseCLIHandler { case constants.CMD_STATUS: await _executeCase(controllerCommand, constants.CMD_STATUS, _getStatus, false) break - case constants.CMD_EMAIL_ACTIVATION: - await _executeCase(controllerCommand, constants.CMD_EMAIL_ACTIVATION, _emailActivation, false) - break case constants.CMD_FOG_TYPES: await _executeCase(controllerCommand, constants.CMD_FOG_TYPES, _getFogTypes, false) break @@ -89,12 +86,6 @@ const _getStatus = async function () { logger.cliRes(JSON.stringify(response, null, 2)) } -const _emailActivation = async function () { - logger.cliReq('controller email-activation') - const response = await ControllerService.emailActivation(true) - logger.cliRes(JSON.stringify(response, null, 2)) -} - const _getFogTypes = async function () { logger.cliReq('controller fog-types') const response = await ControllerService.getFogTypes(true) diff --git a/src/cli/iofog.js b/src/cli/iofog.js index 163f6d27b..26790ad46 100644 --- a/src/cli/iofog.js +++ b/src/cli/iofog.js @@ -248,13 +248,6 @@ class IOFog extends BaseCLIHandler { description: 'ioFog version command ', group: [constants.CMD_VERSION] }, - { - name: 'user-id', - alias: 'u', - type: CliDataTypes.Integer, - description: 'User\'s id', - group: [constants.CMD_ADD, constants.CMD_UPDATE, constants.CMD_REMOVE] - }, { name: 'log-level', alias: 'L', @@ -507,7 +500,6 @@ function _createFogObject (cliData) { abstractedHardwareEnabled: AppHelper.validateBooleanCliOptions(cliData.absHwEnable, cliData.absHwDisable), fogType: cliData.fogType, - userId: cliData.userId, dockerPruningFrequency: cliData.dockerPruningFrequency, availableDiskThreshold: cliData.availableDiskThreshold, logLevel: cliData.logLevel, diff --git a/src/cli/microservice.js b/src/cli/microservice.js index 270371041..2f0e3baa4 100644 --- a/src/cli/microservice.js +++ b/src/cli/microservice.js @@ -266,13 +266,6 @@ class Microservice extends BaseCLIHandler { description: 'Delete microservice with cleanup', group: [constants.CMD_REMOVE] }, - { - name: 'user-id', - alias: 'u', - type: CliDataTypes.Integer, - description: 'User\'s id', - group: [constants.CMD_ADD] - }, { name: 'mapping-id', alias: 'm', diff --git a/src/cli/registry.js b/src/cli/registry.js index 0be436f1a..00791fe2a 100644 --- a/src/cli/registry.js +++ b/src/cli/registry.js @@ -86,13 +86,6 @@ class Registry extends BaseCLIHandler { description: 'Email address', group: [constants.CMD_ADD, constants.CMD_UPDATE] }, - { - name: 'user-id', - alias: 'u', - type: CliDataTypes.Integer, - description: 'User\'s id', - group: [constants.CMD_ADD] - }, { name: 'item-id', alias: 'i', diff --git a/src/cli/user.js b/src/cli/user.js deleted file mode 100644 index fdd0ad6e3..000000000 --- a/src/cli/user.js +++ /dev/null @@ -1,195 +0,0 @@ -/* - * ******************************************************************************* - * * Copyright (c) 2023 Datasance Teknoloji A.S. - * * - * * This program and the accompanying materials are made available under the - * * terms of the Eclipse Public License v. 2.0 which is available at - * * http://www.eclipse.org/legal/epl-2.0 - * * - * * SPDX-License-Identifier: EPL-2.0 - * ******************************************************************************* - * - */ - -const BaseCLIHandler = require('./base-cli-handler') -const constants = require('../helpers/constants') -const UserService = require('../services/user-service') -const logger = require('../logger') -const AppHelper = require('../helpers/app-helper') -const AuthDecorator = require('../decorators/cli-decorator') -const Validator = require('../schemas') - -class User extends BaseCLIHandler { - constructor () { - super() - - this.name = constants.CMD_USER - this.commandDefinitions = [ - { - name: 'command', - defaultOption: true, - description: 'add, remove, update, list, generate-token', - group: constants.CMD - }, - { - name: 'first-name', - alias: 'f', - type: String, - description: 'User\'s first name', - group: [constants.CMD_ADD, constants.CMD_UPDATE] - }, - { - name: 'last-name', - alias: 'l', - type: String, - description: 'User\'s last name', - group: [constants.CMD_ADD, constants.CMD_UPDATE] - }, - { - name: 'email', - alias: 'e', - type: String, - description: 'User\'s email address', - group: [constants.CMD_ADD, constants.CMD_GENERATE_TOKEN, constants.CMD_REMOVE, - constants.CMD_UPDATE, constants.CMD_ACTIVATE, constants.CMD_SUSPEND] - }, - { - name: 'password', - alias: 'p', - type: String, - description: 'User\'s password', - group: [constants.CMD_ADD, constants.CMD_UPDATE] - }, - { - name: 'subscriptionKey', - alias: 's', - type: String, - description: 'User\'s subscriptionKey', - group: [constants.CMD_ADD, constants.CMD_UPDATE] - }, - { - name: 'force', - alias: 'F', - type: Boolean, - description: 'User\'s force delete', - group: [constants.CMD_REMOVE] - } - ] - this.commands = { - [constants.CMD_ADD]: 'Add a new user.', - [constants.CMD_UPDATE]: 'Update existing user.', - [constants.CMD_REMOVE]: 'Delete a user.', - [constants.CMD_LIST]: 'List all users.', - [constants.CMD_GENERATE_TOKEN]: 'Generate token for a user.', - [constants.CMD_ACTIVATE]: 'Activate a user.', - [constants.CMD_SUSPEND]: 'Suspend a user.' - } - } - - async run (args) { - try { - const userCommand = this.parseCommandLineArgs(this.commandDefinitions, { argv: args.argv, partial: false }) - - const command = userCommand.command.command - - this.validateParameters(command, this.commandDefinitions, args.argv) - - switch (command) { - case constants.CMD_ADD: - await _executeCase(userCommand, constants.CMD_ADD, _createUser, false) - break - case constants.CMD_UPDATE: - await _executeCase(userCommand, constants.CMD_UPDATE, _updateUserDetails, true) - break - case constants.CMD_REMOVE: - await _executeCase(userCommand, constants.CMD_REMOVE, _deleteUser, true) - break - case constants.CMD_LIST: - await _executeCase(userCommand, constants.CMD_LIST, _getAllUsers, false) - break - case constants.CMD_GENERATE_TOKEN: - await _executeCase(userCommand, constants.CMD_GENERATE_TOKEN, _generateToken, true) - break - case constants.CMD_ACTIVATE: - await _executeCase(userCommand, constants.CMD_ACTIVATE, _activateUser, true) - break - case constants.CMD_SUSPEND: - await _executeCase(userCommand, constants.CMD_SUSPEND, _suspendUser, true) - break - case constants.CMD_HELP: - default: - return this.help([]) - } - } catch (error) { - this.handleCLIError(error, args.argv) - } - } -} - -const _executeCase = async function (userCommand, commandName, f, isUserRequired) { - try { - const item = userCommand[commandName] - - if (isUserRequired) { - const decoratedFunction = AuthDecorator.prepareUserByEmail(f) - await decoratedFunction(item) - } else { - await f(item) - } - } catch (error) { - logger.error(error.message) - } -} - -const _createUser = async function (user) { - logger.cliReq('user add', { args: user }) - await Validator.validate(user, Validator.schemas.signUp) - - user.password = AppHelper.encryptText(user.password, user.email) - - const response = await UserService.signUp(user, true) - logger.cliRes(JSON.stringify({ - id: response.userId - }), null, 2) -} - -const _updateUserDetails = async function (userDetails, user) { - logger.cliReq('user update', { args: userDetails }) - await UserService.updateUserDetails(user, userDetails, true) - logger.cliRes('User updated successfully.') -} - -const _deleteUser = async function (obj, user) { - logger.cliReq('user remove', { args: { user: user.dataValues, force: obj.force } }) - await UserService.deleteUser(obj.force, user, true) - logger.cliRes('User removed successfully.') -} - -const _getAllUsers = async function () { - logger.cliReq('user list') - const users = await UserService.list(true) - logger.cliRes(JSON.stringify(users, null, 2)) -} - -const _generateToken = async function (emailObj, user) { - logger.cliReq('user generate-token', { args: user.dataValues }) - const response = await UserService.login(user, true) - logger.cliRes(JSON.stringify(response, null, 2)) -} - -const _activateUser = async function (emailObj, user) { - const codeData = { - userId: user.id - } - logger.cliReq('user activate', { args: codeData }) - await UserService.activateUser(codeData, true) - logger.cliRes('User activated successfully.') -} - -const _suspendUser = async function (emailObj, user) { - logger.cliReq('user suspend', { args: user.dataValues }) - await UserService.suspendUser(user, true) - logger.cliRes('User suspended successfully.') -} - -module.exports = new User() diff --git a/src/config/constants.js b/src/config/constants.js index ce524edf5..4f1c01926 100644 --- a/src/config/constants.js +++ b/src/config/constants.js @@ -26,10 +26,7 @@ module.exports = { 'Service:LogsFileCount': 10, 'Settings:DefaultJobIntervalSeconds': 120, - 'Settings:UserTokenExpirationIntervalSeconds': 3600, 'Settings:FogTokenExpirationIntervalSeconds': 3600, - 'Settings:KubeletTokenExpirationIntervalSeconds': 3600, - 'Settings:SchedulerTokenExpirationIntervalSeconds': 3600, 'Settings:FogStatusUpdateIntervalSeconds': 30, 'Settings:FogStatusUpdateTolerance': 3, diff --git a/src/config/default.json b/src/config/default.json index caa7c33c5..ae08bdbc6 100644 --- a/src/config/default.json +++ b/src/config/default.json @@ -5,9 +5,6 @@ "Viewer": { "Port": 80 }, - "Kubelet": { - "Uri": "http://localhost:1234" - }, "Server": { "Port": 51121, "DevMode": false @@ -23,7 +20,6 @@ }, "Settings": { "DefaultJobIntervalSeconds": 120, - "UserTokenExpirationIntervalSeconds": 3600, "FogTokenExpirationIntervalSeconds": 3600, "FogStatusUpdateIntervalSeconds": 30, "FogStatusUpdateTolerance": 3 diff --git a/src/config/development.json b/src/config/development.json index 8b7dca9e4..3182f2d41 100644 --- a/src/config/development.json +++ b/src/config/development.json @@ -5,9 +5,6 @@ "Viewer": { "Port": 80 }, - "Kubelet": { - "Uri": "http://localhost:1234" - }, "Server": { "Port": 51121, "DevMode": true @@ -22,7 +19,6 @@ "LogsFileCount": 10 }, "Settings": { - "UserTokenExpirationIntervalSeconds": 360000, "FogTokenExpirationIntervalSeconds": 3600000, "FogStatusUpdateIntervalSeconds": 30, "FogStatusUpdateTolerance": 3 @@ -60,17 +56,5 @@ "databaseName": "" } } - }, - "ControlPlane": { - "Auth_Manager": "Keycloak", - "Realm": { - "url": "", - "realm-key": "" - }, - "Config": { - "namespace": "", - "orgName": "", - "entitlementID": "" - } - } + } } \ No newline at end of file diff --git a/src/config/keycloak.js b/src/config/keycloak.js new file mode 100644 index 000000000..d1dc8ca27 --- /dev/null +++ b/src/config/keycloak.js @@ -0,0 +1,48 @@ +const session = require('express-session') +const Keycloak = require('keycloak-connect') + +const keycloakConfig = { + realm: process.env.KC_REALM, + 'realm-public-key': process.env.KC_REALM_KEY, + 'auth-server-url': `${process.env.KC_URL}`, + 'ssl-required': process.env.KC_SSL_REQ, + resource: process.env.KC_CLIENT, + 'bearer-only': true, + 'verify-token-audience': true, + credentials: { + secret: process.env.KC_CLIENT_SECRET + }, + 'use-resource-role-mappings': true, + 'confidential-port': 0 +} + +let keycloak +let memoryStore + +function initKeycloak () { + if (keycloak) { + return keycloak + } else { + memoryStore = new session.MemoryStore() + keycloak = new Keycloak({ store: memoryStore }, keycloakConfig) + return keycloak + } +} + +function getKeycloak () { + if (keycloak) { + return keycloak + } +} + +function getMemoryStore () { + if (memoryStore) { + return memoryStore + } +} + +module.exports = { + initKeycloak, + getMemoryStore, + getKeycloak +} diff --git a/src/config/keycloak.json b/src/config/keycloak.json new file mode 100644 index 000000000..cfc7f6b33 --- /dev/null +++ b/src/config/keycloak.json @@ -0,0 +1,14 @@ +{ + "realm": "datasance", + "realm-public-key": "", + "auth-server-url": "", + "ssl-required": "", + "resource": "pot-controller", + "bearer-only":true, + "verify-token-audience": true, + "credentials": { + "secret": "" + }, + "use-resource-role-mappings": true, + "confidential-port": 0 +} \ No newline at end of file diff --git a/src/config/production.json b/src/config/production.json index 038d3490d..3f78f2ec9 100644 --- a/src/config/production.json +++ b/src/config/production.json @@ -18,7 +18,6 @@ "LogsFileCount": 10 }, "Settings": { - "UserTokenExpirationIntervalSeconds": 3600, "FogTokenExpirationIntervalSeconds": 3600, "FogStatusUpdateIntervalSeconds": 30, "FogStatusUpdateTolerance": 3 @@ -48,17 +47,6 @@ "databaseName": "" } } - }, - "ControlPlane": { - "Auth_Manager": "Keycloak", - "Realm": { - "url": "", - "realm-key": "" - }, - "Config": { - "namespace": "", - "orgName": "", - "entitlementID": "" - } - } -} + } +} + diff --git a/src/controllers/catalog-controller.js b/src/controllers/catalog-controller.js index fdfd144d8..5902d55d9 100644 --- a/src/controllers/catalog-controller.js +++ b/src/controllers/catalog-controller.js @@ -14,7 +14,8 @@ const CatalogService = require('../services/catalog-service') const AuthDecorator = require('./../decorators/authorization-decorator') -const createCatalogItemEndPoint = async function (req, user) { +const createCatalogItemEndPoint = async function (req) { + const user = req.kauth.grant.access_token.content return CatalogService.createCatalogItemEndPoint(req.body, user) } diff --git a/src/controllers/control-plane-controller.js b/src/controllers/control-plane-controller.js deleted file mode 100644 index 073031f91..000000000 --- a/src/controllers/control-plane-controller.js +++ /dev/null @@ -1,26 +0,0 @@ -/* - * ******************************************************************************* - * * Copyright (c) 2023 Datasance Teknoloji A.S. - * * - * * This program and the accompanying materials are made available under the - * * terms of the Eclipse Public License v. 2.0 which is available at - * * http://www.eclipse.org/legal/epl-2.0 - * * - * * SPDX-License-Identifier: EPL-2.0 - * ******************************************************************************* - * - */ - -const AuthDecorator = require('../decorators/authorization-decorator') - -const getControlPlaneProfileEndPoint = async function (req, controlPlane) { - return { - namespace: controlPlane.namespace, - OrgName: controlPlane.OrgName, - entitlementId: controlPlane.entitlementId - } -} - -module.exports = { - getControlPlaneProfileEndPoint: AuthDecorator.checkAuthToken(getControlPlaneProfileEndPoint) -} diff --git a/src/controllers/controller.js b/src/controllers/controller.js index 84cc5f3ff..abd4650e4 100644 --- a/src/controllers/controller.js +++ b/src/controllers/controller.js @@ -17,16 +17,11 @@ const statusControllerEndPoint = async function (req) { return ControllerService.statusController(false) } -const emailActivationEndPoint = async function (req) { - return ControllerService.emailActivation(false) -} - const fogTypesEndPoint = async function (req) { return ControllerService.getFogTypes(false) } module.exports = { statusControllerEndPoint: statusControllerEndPoint, - emailActivationEndPoint: emailActivationEndPoint, fogTypesEndPoint: fogTypesEndPoint } diff --git a/src/controllers/kubelet-controller.js b/src/controllers/kubelet-controller.js deleted file mode 100644 index f76dc892d..000000000 --- a/src/controllers/kubelet-controller.js +++ /dev/null @@ -1,120 +0,0 @@ -/* - * ******************************************************************************* - * * Copyright (c) 2023 Datasance Teknoloji A.S. - * * - * * This program and the accompanying materials are made available under the - * * terms of the Eclipse Public License v. 2.0 which is available at - * * http://www.eclipse.org/legal/epl-2.0 - * * - * * SPDX-License-Identifier: EPL-2.0 - * ******************************************************************************* - * - */ - -const KubeletService = require('../services/kubelet-service') -const AuthDecorator = require('../decorators/authorization-decorator') - -const kubeletCreatePodEndPoint = async function (req, user) { - const createPodData = req.body - const fogNodeUuid = req.query.nodeName - - return KubeletService.kubeletCreatePod(createPodData, fogNodeUuid, user) -} - -const kubeletUpdatePodEndPoint = async function (req, user) { - const uploadPodData = req.body - const fogNodeUuid = req.query.nodeName - - return KubeletService.kubeletUpdatePod(uploadPodData, fogNodeUuid, user) -} - -const kubeletDeletePodEndPoint = async function (req, user) { - const fogNodeUuid = req.query.nodeName - const podData = req.body - - return KubeletService.kubeletDeletePod(podData, fogNodeUuid, user) -} - -const kubeletGetPodEndPoint = async function (req, user) { - const namespace = req.query.namespace - const name = req.query.name - const fogNodeUuid = req.query.nodeName - - return KubeletService.kubeletGetPod(namespace, name, fogNodeUuid, user) -} - -const kubeletGetContainerLogsEndPoint = async function (req, user) { - const namespace = req.query.namespace - const podName = req.query.podName - const containerName = req.query.containerName - const tail = req.query.tail - const fogNodeUuid = req.query.nodeName - - return KubeletService.kubeletGetContainerLogs(namespace, podName, containerName, tail, fogNodeUuid) -} - -const kubeletGetPodStatusEndPoint = async function (req, user) { - const namespace = req.query.namespace - const name = req.query.name - const fogNodeUuid = req.query.nodeName - - return KubeletService.kubeletGetPodStatus(namespace, name, fogNodeUuid, user) -} - -const kubeletGetPodsEndPoint = async function (req, user) { - const fogNodeUuid = req.query.nodeName - - return KubeletService.kubeletGetPods(fogNodeUuid, user) -} - -const kubeletGetCapacityEndPoint = async function (req, user) { - const fogNodeUuid = req.query.nodeName - - return KubeletService.kubeletGetCapacity(fogNodeUuid, user) -} - -const kubeletGetAllocatableEndPoint = async function (req, user) { - const fogNodeUuid = req.query.nodeName - - return KubeletService.kubeletGetAllocatable(fogNodeUuid, user) -} - -const kubeletGetNodeConditionsEndPoint = async function (req, user) { - const fogNodeUuid = req.query.nodeName - - return KubeletService.kubeletGetNodeConditions(fogNodeUuid, user) -} - -const kubeletGetNodeAddressesEndPoint = async function (req, user) { - const fogNodeUuid = req.query.nodeName - - return KubeletService.kubeletGetNodeAddresses(fogNodeUuid, user) -} - -const kubeletGetVkTokenEndPoint = async function (req, user) { - const userId = user.id - - return KubeletService.kubeletGetVkToken(userId) -} - -const kubeletGetSchedulerTokenEndPoint = async function (req, user) { - const userId = user.id - - return KubeletService.kubeletGetSchedulerToken(userId) -} - -module.exports = { - kubeletCreatePodEndPoint: AuthDecorator.checkAuthToken(kubeletCreatePodEndPoint), - kubeletUpdatePodEndPoint: AuthDecorator.checkAuthToken(kubeletUpdatePodEndPoint), - kubeletDeletePodEndPoint: AuthDecorator.checkAuthToken(kubeletDeletePodEndPoint), - kubeletGetPodEndPoint: AuthDecorator.checkAuthToken(kubeletGetPodEndPoint), - kubeletGetContainerLogsEndPoint: AuthDecorator.checkAuthToken(kubeletGetContainerLogsEndPoint), - kubeletGetPodStatusEndPoint: AuthDecorator.checkAuthToken(kubeletGetPodStatusEndPoint), - kubeletGetPodsEndPoint: AuthDecorator.checkAuthToken(kubeletGetPodsEndPoint), - kubeletGetCapacityEndPoint: AuthDecorator.checkAuthToken(kubeletGetCapacityEndPoint), - kubeletGetAllocatableEndPoint: AuthDecorator.checkAuthToken(kubeletGetAllocatableEndPoint), - kubeletGetNodeConditionsEndPoint: AuthDecorator.checkAuthToken(kubeletGetNodeConditionsEndPoint), - kubeletGetNodeAddressesEndPoint: AuthDecorator.checkAuthToken(kubeletGetNodeAddressesEndPoint), - kubeletGetVkTokenEndPoint: AuthDecorator.checkAuthToken(kubeletGetVkTokenEndPoint), - kubeletGetSchedulerTokenEndPoint: AuthDecorator.checkAuthToken(kubeletGetSchedulerTokenEndPoint) -} diff --git a/src/controllers/user-controller.js b/src/controllers/user-controller.js index de0db5059..9011a41a8 100644 --- a/src/controllers/user-controller.js +++ b/src/controllers/user-controller.js @@ -12,27 +12,8 @@ */ const UserService = require('../services/user-service') -const AuthDecorator = require('../decorators/authorization-decorator') -const AppHelper = require('../helpers/app-helper') - const Validator = require('../schemas') -const userSignupEndPoint = async function (req) { - const user = req.body - - await Validator.validate(user, Validator.schemas.signUp) - - const encryptedPassword = AppHelper.encryptText(user.password, user.email) - const newUser = { - firstName: user.firstName, - lastName: user.lastName, - email: user.email, - password: encryptedPassword, - subscriptionKey: user.subscriptionKey - } - return UserService.signUp(newUser, false) -} - const userLoginEndPoint = async function (req) { const user = req.body @@ -46,61 +27,6 @@ const userLoginEndPoint = async function (req) { return UserService.login(credentials, false) } -const resendActivationEndPoint = async function (req) { - const emailData = req.query - return UserService.resendActivation(emailData, false) -} - -const activateUserAccountEndPoint = async function (req) { - const codeData = req.body - - await UserService.activateUser(codeData, false) -} - -const userLogoutEndPoint = async function (req, user) { - return UserService.logout(user, false) -} - -const getUserProfileEndPoint = async function (req, user) { - return { - firstName: user.firstName, - lastName: user.lastName, - email: user.email, - subscriptionKey: user.subscriptionKey - } -} - -const updateUserProfileEndPoint = async function (req, user) { - const profileData = req.body - return UserService.updateUserDetails(user, profileData, false) -} - -const deleteUserProfileEndPoint = async function (req, user) { - return UserService.deleteUser(req.body.force, user, false) -} - -const updateUserPasswordEndPoint = async function (req, user) { - const passwordUpdates = req.body - - await Validator.validate(passwordUpdates, Validator.schemas.updatePassword) - - return UserService.updateUserPassword(passwordUpdates, user, false) -} - -const resetUserPasswordEndPoint = async function (req) { - const emailObj = req.body - return UserService.resetUserPassword(emailObj, false) -} - module.exports = { - userSignupEndPoint: userSignupEndPoint, - userLoginEndPoint: userLoginEndPoint, - resendActivationEndPoint: resendActivationEndPoint, - activateUserAccountEndPoint: activateUserAccountEndPoint, - userLogoutEndPoint: AuthDecorator.checkAuthToken(userLogoutEndPoint), - getUserProfileEndPoint: AuthDecorator.checkAuthToken(getUserProfileEndPoint), - updateUserProfileEndPoint: AuthDecorator.checkAuthToken(updateUserProfileEndPoint), - deleteUserProfileEndPoint: AuthDecorator.checkAuthToken(deleteUserProfileEndPoint), - updateUserPasswordEndPoint: AuthDecorator.checkAuthToken(updateUserPasswordEndPoint), - resetUserPasswordEndPoint: resetUserPasswordEndPoint + userLoginEndPoint: userLoginEndPoint } diff --git a/src/data/managers/access-token-manager.js b/src/data/managers/access-token-manager.js deleted file mode 100644 index 54c1b9be7..000000000 --- a/src/data/managers/access-token-manager.js +++ /dev/null @@ -1,36 +0,0 @@ -/* - * ******************************************************************************* - * * Copyright (c) 2023 Datasance Teknoloji A.S. - * * - * * This program and the accompanying materials are made available under the - * * terms of the Eclipse Public License v. 2.0 which is available at - * * http://www.eclipse.org/legal/epl-2.0 - * * - * * SPDX-License-Identifier: EPL-2.0 - * ******************************************************************************* - * - */ - -const BaseManager = require('./base-manager') -const models = require('../models') -const AccessToken = models.AccessToken - -class AccessTokenManager extends BaseManager { - getEntity () { - return AccessToken - } - - // no transaction required here, used by auth decorator - updateExpirationTime (id, newTime) { - return AccessToken.update({ - expirationTime: newTime - }, { - where: { - id: id - } - }) - } -} - -const instance = new AccessTokenManager() -module.exports = instance diff --git a/src/data/managers/control-plane.js b/src/data/managers/control-plane.js deleted file mode 100644 index 554a3a58e..000000000 --- a/src/data/managers/control-plane.js +++ /dev/null @@ -1,36 +0,0 @@ -/* - * ******************************************************************************* - * * Copyright (c) 2023 Datasance Teknoloji A.S. - * * - * * This program and the accompanying materials are made available under the - * * terms of the Eclipse Public License v. 2.0 which is available at - * * http://www.eclipse.org/legal/epl-2.0 - * * - * * SPDX-License-Identifier: EPL-2.0 - * ******************************************************************************* - * - */ - -const BaseManager = require('./base-manager') -const models = require('../models') -const ControlPlane = models.ControlPlane - -class ControlPlaneManager extends BaseManager { - getEntity () { - return ControlPlane - } - - // no transaction required here, used by cli decorator - findByUuid (uuid) { - return ControlPlane.findOne({ where: { uuid } }) - } - - updateDetails (controlPlane, updateObject, transaction) { - return this.update({ - id: controlPlane.uuid - }, updateObject, transaction) - } -} - -const instance = new ControlPlaneManager() -module.exports = instance diff --git a/src/data/managers/email-activation-code-manager.js b/src/data/managers/email-activation-code-manager.js deleted file mode 100644 index 48e60762b..000000000 --- a/src/data/managers/email-activation-code-manager.js +++ /dev/null @@ -1,65 +0,0 @@ -/* - * ******************************************************************************* - * * Copyright (c) 2023 Datasance Teknoloji A.S. - * * - * * This program and the accompanying materials are made available under the - * * terms of the Eclipse Public License v. 2.0 which is available at - * * http://www.eclipse.org/legal/epl-2.0 - * * - * * SPDX-License-Identifier: EPL-2.0 - * ******************************************************************************* - * - */ - -const models = require('../models') -const EmailActivationCode = models.EmailActivationCode -const BaseManager = require('./base-manager') -const AppHelper = require('../../helpers/app-helper') -const Sequelize = require('sequelize') -const Op = Sequelize.Op - -class EmailActivationCodeManager extends BaseManager { - getEntity () { - return EmailActivationCode - } - - async getByActivationCode (activationCode, transaction) { - AppHelper.checkTransaction(transaction) - - return EmailActivationCode.findOne({ - where: { - activationCode: activationCode - } - }, { - transaction: transaction - }) - }; - - async createActivationCode (userId, activationCode, expirationTime, transaction) { - AppHelper.checkTransaction(transaction) - - return EmailActivationCode.create({ - userId: userId, - activationCode: activationCode, - expirationTime: expirationTime - }, { - transaction: transaction - }) - }; - - async verifyActivationCode (activationCode, transaction) { - return EmailActivationCode.findOne({ - where: { - activationCode: activationCode, - expirationTime: { - [Op.gt]: new Date().getTime() - } - } - }, { - transaction: transaction - }) - } -} - -const instance = new EmailActivationCodeManager() -module.exports = instance diff --git a/src/data/managers/kubelet-access-token-manager.js b/src/data/managers/kubelet-access-token-manager.js deleted file mode 100644 index b44a554cb..000000000 --- a/src/data/managers/kubelet-access-token-manager.js +++ /dev/null @@ -1,25 +0,0 @@ -/* - * ******************************************************************************* - * * Copyright (c) 2023 Datasance Teknoloji A.S. - * * - * * This program and the accompanying materials are made available under the - * * terms of the Eclipse Public License v. 2.0 which is available at - * * http://www.eclipse.org/legal/epl-2.0 - * * - * * SPDX-License-Identifier: EPL-2.0 - * ******************************************************************************* - * - */ - -const BaseManager = require('./base-manager') -const models = require('../models') -const KubeletAccessToken = models.KubeletAccessToken - -class KubeletAccessTokenManager extends BaseManager { - getEntity () { - return KubeletAccessToken - } -} - -const instance = new KubeletAccessTokenManager() -module.exports = instance diff --git a/src/data/managers/microservice-manager.js b/src/data/managers/microservice-manager.js index b50dcf9e0..1c8b1465c 100644 --- a/src/data/managers/microservice-manager.js +++ b/src/data/managers/microservice-manager.js @@ -24,7 +24,6 @@ const CatalogItem = models.CatalogItem const CatalogItemImage = models.CatalogItemImage const Fog = models.Fog const Application = models.Application -const User = models.User const Routing = models.Routing const Registry = models.Registry const MicroserviceStatus = models.MicroserviceStatus @@ -347,14 +346,6 @@ class MicroserviceManager extends BaseManager { model: Application, as: 'application', required: true, - include: [ - { - model: User, - as: 'user', - required: true, - attributes: ['id'] - } - ], attributes: ['id'] } ], diff --git a/src/data/managers/scheduler-access-token-manager.js b/src/data/managers/scheduler-access-token-manager.js deleted file mode 100644 index 7e51c945c..000000000 --- a/src/data/managers/scheduler-access-token-manager.js +++ /dev/null @@ -1,25 +0,0 @@ -/* - * ******************************************************************************* - * * Copyright (c) 2023 Datasance Teknoloji A.S. - * * - * * This program and the accompanying materials are made available under the - * * terms of the Eclipse Public License v. 2.0 which is available at - * * http://www.eclipse.org/legal/epl-2.0 - * * - * * SPDX-License-Identifier: EPL-2.0 - * ******************************************************************************* - * - */ - -const BaseManager = require('./base-manager') -const models = require('../models') -const SchedulerAccessToken = models.SchedulerAccessToken - -class SchedulerAccessTokenManager extends BaseManager { - getEntity () { - return SchedulerAccessToken - } -} - -const instance = new SchedulerAccessTokenManager() -module.exports = instance diff --git a/src/data/managers/user-manager.js b/src/data/managers/user-manager.js deleted file mode 100644 index 78d2b5f6e..000000000 --- a/src/data/managers/user-manager.js +++ /dev/null @@ -1,91 +0,0 @@ -/* - * ******************************************************************************* - * * Copyright (c) 2023 Datasance Teknoloji A.S. - * * - * * This program and the accompanying materials are made available under the - * * terms of the Eclipse Public License v. 2.0 which is available at - * * http://www.eclipse.org/legal/epl-2.0 - * * - * * SPDX-License-Identifier: EPL-2.0 - * ******************************************************************************* - * - */ - -const BaseManager = require('./base-manager') -const models = require('../models') -const User = models.User -const AccessToken = models.AccessToken -const AppHelper = require('../../helpers/app-helper') - -class UserManager extends BaseManager { - getEntity () { - return User - } - - findByAccessToken (token, transaction) { - AppHelper.checkTransaction(transaction) - - return User.findOne({ - include: [{ - model: AccessToken, - as: 'accessToken', - where: { - token: token - } - }] - }, { - transaction: transaction - }) - } - - findByEmail (email) { - return User.findOne({ - where: { - email: email - } - }) - } - - // no transaction required here, used by auth decorator - checkAuthentication (token) { - return User.findOne({ - include: [{ - model: AccessToken, - as: 'accessToken', - where: { - token: token - } - }] - }) - } - - // no transaction required here, used by cli decorator - findById (id) { - return User.findOne({ where: { id: id } }) - } - - updateDetails (user, updateObject, transaction) { - return this.update({ - id: user.id - }, updateObject, transaction) - } - - updatePassword (userId, newPassword, transaction) { - return this.update({ - id: userId - }, { - password: newPassword - }, transaction) - } - - updateTempPassword (userId, tempPassword, transaction) { - return this.update({ - id: userId - }, { - tempPassword: tempPassword - }, transaction) - } -} - -const instance = new UserManager() -module.exports = instance diff --git a/src/data/migrations/20180930155645-create-user.js b/src/data/migrations/20180930155645-create-user.js deleted file mode 100644 index 8d931c0ca..000000000 --- a/src/data/migrations/20180930155645-create-user.js +++ /dev/null @@ -1,62 +0,0 @@ -'use strict' -module.exports = { - up: (queryInterface, Sequelize) => { - return queryInterface.createTable('Users', { - id: { - allowNull: false, - autoIncrement: true, - primaryKey: true, - type: Sequelize.INTEGER, - field: 'id' - }, - firstName: { - /* eslint-disable new-cap */ - type: Sequelize.STRING(100), - field: 'first_name', - defaultValue: '' - }, - lastName: { - /* eslint-disable new-cap */ - type: Sequelize.STRING(100), - field: 'last_name', - defaultValue: '' - }, - email: { - /* eslint-disable new-cap */ - type: Sequelize.STRING(100), - field: 'email', - defaultValue: '' - }, - password: { - /* eslint-disable new-cap */ - type: Sequelize.STRING(100), - field: 'password' - }, - tempPassword: { - /* eslint-disable new-cap */ - type: Sequelize.STRING(100), - field: 'temp_password' - }, - emailActivated: { - type: Sequelize.BOOLEAN, - field: 'email_activated', - defaultValue: false - }, - subscriptionKey: { - /* eslint-disable new-cap */ - type: Sequelize.STRING(100), - field: 'subscriptionKey', - defaultValue: '' - }, - controlPlaneUuid: { - type: Sequelize.STRING(32), - field: 'controlPlane_uuid', - references: { model: 'ControlPlane', key: 'uuid' }, - onDelete: 'cascade' - } - }) - }, - down: (queryInterface, Sequelize) => { - return queryInterface.dropTable('Users') - } -} diff --git a/src/data/migrations/20180930164635-create-flow.js b/src/data/migrations/20180930164635-create-flow.js index acdaaf6e2..e159ebb40 100644 --- a/src/data/migrations/20180930164635-create-flow.js +++ b/src/data/migrations/20180930164635-create-flow.js @@ -34,18 +34,6 @@ module.exports = { allowNull: false, type: Sequelize.DATE, field: 'updated_at' - }, - userId: { - type: Sequelize.INTEGER, - field: 'user_id', - references: { model: 'Users', key: 'id' }, - onDelete: 'cascade' - }, - updatedBy: { - type: Sequelize.INTEGER, - field: 'updated_by', - references: { model: 'Users', key: 'id' }, - onDelete: 'set null' } }) }, diff --git a/src/data/migrations/20180930173823-create-registry.js b/src/data/migrations/20180930173823-create-registry.js index 9e8fe7cf7..a6cfd9e41 100644 --- a/src/data/migrations/20180930173823-create-registry.js +++ b/src/data/migrations/20180930173823-create-registry.js @@ -40,12 +40,6 @@ module.exports = { userEmail: { type: Sequelize.TEXT, field: 'user_email' - }, - userId: { - type: Sequelize.INTEGER, - field: 'user_id', - references: { model: 'Users', key: 'id' }, - onDelete: 'cascade' } }) }, diff --git a/src/data/migrations/20180930184436-create-catalog-item.js b/src/data/migrations/20180930184436-create-catalog-item.js index cb7624b99..934fd85f3 100644 --- a/src/data/migrations/20180930184436-create-catalog-item.js +++ b/src/data/migrations/20180930184436-create-catalog-item.js @@ -61,12 +61,6 @@ module.exports = { field: 'is_public', defaultValue: false }, - userId: { - type: Sequelize.INTEGER, - field: 'user_id', - references: { model: 'Users', key: 'id' }, - onDelete: 'cascade' - }, registryId: { type: Sequelize.INTEGER, field: 'registry_id', diff --git a/src/data/migrations/20180930204039-create-email-activation-code.js b/src/data/migrations/20180930204039-create-email-activation-code.js deleted file mode 100644 index 8516ef13b..000000000 --- a/src/data/migrations/20180930204039-create-email-activation-code.js +++ /dev/null @@ -1,37 +0,0 @@ -'use strict' - -const { convertToInt } = require('../../helpers/app-helper') - -module.exports = { - up: (queryInterface, Sequelize) => { - return queryInterface.createTable('EmailActivationCodes', { - id: { - type: Sequelize.INTEGER, - primaryKey: true, - autoIncrement: true, - allowNull: false, - field: 'id' - }, - activationCode: { - type: Sequelize.TEXT, - field: 'activation_code' - }, - expirationTime: { - type: Sequelize.BIGINT, - get () { - return convertToInt(this.getDataValue('expirationTime')) - }, - field: 'expiration_time' - }, - userId: { - type: Sequelize.INTEGER, - field: 'user_id', - references: { model: 'Users', key: 'id' }, - onDelete: 'cascade' - } - }) - }, - down: (queryInterface, Sequelize) => { - return queryInterface.dropTable('EmailActivationCodes') - } -} diff --git a/src/data/migrations/20180930225403-create-fog.js b/src/data/migrations/20180930225403-create-fog.js index 1015056f8..cb97959e7 100644 --- a/src/data/migrations/20180930225403-create-fog.js +++ b/src/data/migrations/20180930225403-create-fog.js @@ -257,12 +257,6 @@ module.exports = { type: Sequelize.DATE, field: 'updated_at' }, - userId: { - type: Sequelize.INTEGER, - field: 'user_id', - references: { model: 'Users', key: 'id' }, - onDelete: 'cascade' - }, fogTypeId: { type: Sequelize.INTEGER, field: 'fog_type_id', diff --git a/src/data/migrations/20180930230219-create-fog-access-token.js b/src/data/migrations/20180930230219-create-fog-access-token.js index 269768d74..dba652e2d 100644 --- a/src/data/migrations/20180930230219-create-fog-access-token.js +++ b/src/data/migrations/20180930230219-create-fog-access-token.js @@ -28,12 +28,6 @@ module.exports = { field: 'iofog_uuid', references: { model: 'Fogs', key: 'uuid' }, onDelete: 'cascade' - }, - userId: { - type: Sequelize.INTEGER, - field: 'user_id', - references: { model: 'Users', key: 'id' }, - onDelete: 'cascade' } }) }, diff --git a/src/data/migrations/20181001062956-create-microservice.js b/src/data/migrations/20181001062956-create-microservice.js index 7e64e19e7..adb1c8238 100644 --- a/src/data/migrations/20181001062956-create-microservice.js +++ b/src/data/migrations/20181001062956-create-microservice.js @@ -73,12 +73,6 @@ module.exports = { references: { model: 'Fogs', key: 'uuid' }, onDelete: 'set null' }, - updatedBy: { - type: Sequelize.INTEGER, - field: 'updated_by', - references: { model: 'Users', key: 'id' }, - onDelete: 'set null' - }, catalogItemId: { type: Sequelize.INTEGER, field: 'catalog_item_id', diff --git a/src/data/migrations/20181001070828-create-microservice-port.js b/src/data/migrations/20181001070828-create-microservice-port.js index 69190d27b..c8c65dabd 100644 --- a/src/data/migrations/20181001070828-create-microservice-port.js +++ b/src/data/migrations/20181001070828-create-microservice-port.js @@ -36,12 +36,6 @@ module.exports = { field: 'microservice_uuid', references: { model: 'Microservices', key: 'uuid' }, onDelete: 'cascade' - }, - updatedBy: { - type: Sequelize.INTEGER, - field: 'updated_by', - references: { model: 'Users', key: 'id' }, - onDelete: 'cascade' } }) }, diff --git a/src/data/migrations/20181003104606-create-access-token.js b/src/data/migrations/20181003104606-create-access-token.js deleted file mode 100644 index 1decdeba5..000000000 --- a/src/data/migrations/20181003104606-create-access-token.js +++ /dev/null @@ -1,37 +0,0 @@ -'use strict' - -const { convertToInt } = require('../../helpers/app-helper') - -module.exports = { - up: (queryInterface, Sequelize) => { - return queryInterface.createTable('AccessTokens', { - id: { - type: Sequelize.INTEGER, - primaryKey: true, - autoIncrement: true, - allowNull: false, - field: 'id' - }, - token: { - type: Sequelize.STRING, - field: 'token' - }, - expirationTime: { - type: Sequelize.BIGINT, - get () { - return convertToInt(this.getDataValue('expirationTime')) - }, - field: 'expiration_time' - }, - userId: { - type: Sequelize.INTEGER, - field: 'user_id', - references: { model: 'Users', key: 'id' }, - onDelete: 'cascade' - } - }) - }, - down: (queryInterface, Sequelize) => { - return queryInterface.dropTable('AccessTokens') - } -} diff --git a/src/data/migrations/20181109132609-microservice-rename-updatedBy-to-userId.js b/src/data/migrations/20181109132609-microservice-rename-updatedBy-to-userId.js deleted file mode 100644 index daa76ad5a..000000000 --- a/src/data/migrations/20181109132609-microservice-rename-updatedBy-to-userId.js +++ /dev/null @@ -1,11 +0,0 @@ -'use strict' - -module.exports = { - up: (queryInterface, Sequelize) => { - return queryInterface.renameColumn('Microservices', 'updated_by', 'user_id') - }, - - down: (queryInterface, Sequelize) => { - return queryInterface.renameColumn('Microservices', 'user_id', 'updated_by') - } -} diff --git a/src/data/migrations/20181109132704-microservice-port-rename-updatedBy-to-userId.js b/src/data/migrations/20181109132704-microservice-port-rename-updatedBy-to-userId.js deleted file mode 100644 index f033334fe..000000000 --- a/src/data/migrations/20181109132704-microservice-port-rename-updatedBy-to-userId.js +++ /dev/null @@ -1,11 +0,0 @@ -'use strict' - -module.exports = { - up: (queryInterface, Sequelize) => { - return queryInterface.renameColumn('MicroservicePorts', 'updated_by', 'user_id') - }, - - down: (queryInterface, Sequelize) => { - return queryInterface.renameColumn('MicroservicePorts', 'user_id', 'updated_by') - } -} diff --git a/src/data/migrations/20181109132723-flow-remove-updatedBy.js b/src/data/migrations/20181109132723-flow-remove-updatedBy.js deleted file mode 100644 index b51994b45..000000000 --- a/src/data/migrations/20181109132723-flow-remove-updatedBy.js +++ /dev/null @@ -1,14 +0,0 @@ -'use strict' - -module.exports = { - up: (queryInterface, Sequelize) => { - return queryInterface.removeColumn('Flows', 'updated_by') - }, - - down: (queryInterface, Sequelize) => { - return queryInterface.addColumn('Flows', - 'updated_by', - Sequelize.INTEGER - ) - } -} diff --git a/src/data/migrations/20190222135632-create-kubelet-access-token.js b/src/data/migrations/20190222135632-create-kubelet-access-token.js deleted file mode 100644 index cf62a9332..000000000 --- a/src/data/migrations/20190222135632-create-kubelet-access-token.js +++ /dev/null @@ -1,37 +0,0 @@ -'use strict' - -const { convertToInt } = require('../../helpers/app-helper') - -module.exports = { - up: (queryInterface, Sequelize) => { - return queryInterface.createTable('KubeletAccessTokens', { - id: { - type: Sequelize.INTEGER, - primaryKey: true, - autoIncrement: true, - allowNull: false, - field: 'id' - }, - expirationTime: { - type: Sequelize.BIGINT, - get () { - return convertToInt(this.getDataValue('expirationTime')) - }, - field: 'expiration_time' - }, - token: { - type: Sequelize.TEXT, - field: 'token' - }, - userId: { - type: Sequelize.INTEGER, - field: 'user_id', - references: { model: 'Users', key: 'id' }, - onDelete: 'cascade' - } - }) - }, - down: (queryInterface, Sequelize) => { - return queryInterface.dropTable('KubeletAccessTokens') - } -} diff --git a/src/data/migrations/20190227154512-create-scheduler-access-token.js b/src/data/migrations/20190227154512-create-scheduler-access-token.js deleted file mode 100644 index ebe7e2c8b..000000000 --- a/src/data/migrations/20190227154512-create-scheduler-access-token.js +++ /dev/null @@ -1,37 +0,0 @@ -'use strict' - -const { convertToInt } = require('../../helpers/app-helper') - -module.exports = { - up: (queryInterface, Sequelize) => { - return queryInterface.createTable('SchedulerAccessTokens', { - id: { - type: Sequelize.INTEGER, - primaryKey: true, - autoIncrement: true, - allowNull: false, - field: 'id' - }, - expirationTime: { - type: Sequelize.BIGINT, - get () { - return convertToInt(this.getDataValue('expirationTime')) - }, - field: 'expiration_time' - }, - token: { - type: Sequelize.TEXT, - field: 'token' - }, - userId: { - type: Sequelize.INTEGER, - field: 'user_id', - references: { model: 'Users', key: 'id' }, - onDelete: 'cascade' - } - }) - }, - down: (queryInterface, Sequelize) => { - return queryInterface.dropTable('SchedulerAccessTokens') - } -} diff --git a/src/data/migrations/20200123163412-create-router.js b/src/data/migrations/20200123163412-create-router.js index 0c8cc2cba..267655178 100644 --- a/src/data/migrations/20200123163412-create-router.js +++ b/src/data/migrations/20200123163412-create-router.js @@ -49,12 +49,6 @@ module.exports = { type: Sequelize.DATE, allowNull: false, field: 'updated_at' - }, - updatedBy: { - type: Sequelize.INTEGER, - field: 'updated_by', - references: { model: 'Users', key: 'id' }, - onDelete: 'set null' } }) @@ -87,12 +81,6 @@ module.exports = { type: Sequelize.DATE, allowNull: false, field: 'updated_at' - }, - updatedBy: { - type: Sequelize.INTEGER, - field: 'updated_by', - references: { model: 'Users', key: 'id' }, - onDelete: 'set null' } }) }, diff --git a/src/data/migrations/20200202113124-create-public-ports.js b/src/data/migrations/20200202113124-create-public-ports.js index 837850a5c..89a51de95 100644 --- a/src/data/migrations/20200202113124-create-public-ports.js +++ b/src/data/migrations/20200202113124-create-public-ports.js @@ -56,12 +56,6 @@ module.exports = { type: Sequelize.DATE, allowNull: false, field: 'updated_at' - }, - updatedBy: { - type: Sequelize.INTEGER, - field: 'updated_by', - references: { model: 'Users', key: 'id' }, - onDelete: 'set null' } }) }, diff --git a/src/data/migrations/20200213033350-create-config.js b/src/data/migrations/20200213033350-create-config.js index c3c4282a0..e23337929 100644 --- a/src/data/migrations/20200213033350-create-config.js +++ b/src/data/migrations/20200213033350-create-config.js @@ -30,12 +30,6 @@ module.exports = { type: Sequelize.DATE, allowNull: false, field: 'updated_at' - }, - updatedBy: { - type: Sequelize.INTEGER, - field: 'updated_by', - references: { model: 'Users', key: 'id' }, - onDelete: 'set null' } }).then(() => queryInterface.addIndex('Config', ['key'], { indicesType: 'UNIQUE' })) }, diff --git a/src/data/migrations/20201028005645-create-edge-resources.js b/src/data/migrations/20201028005645-create-edge-resources.js index 5a98af753..63c02dc46 100644 --- a/src/data/migrations/20201028005645-create-edge-resources.js +++ b/src/data/migrations/20201028005645-create-edge-resources.js @@ -22,13 +22,7 @@ module.exports = { displayIcon: { type: Sequelize.TEXT, field: 'display_icon' }, displayColor: { type: Sequelize.TEXT, field: 'display_color' }, interfaceProtocol: { type: Sequelize.TEXT, field: 'interface_protocol' }, - interfaceId: { type: Sequelize.INTEGER, field: 'interface_id' }, - userId: { - type: Sequelize.INTEGER, - field: 'user_id', - references: { model: 'Users', key: 'id' }, - onDelete: 'cascade' - } + interfaceId: { type: Sequelize.INTEGER, field: 'interface_id' } }) await queryInterface.createTable('AgentEdgeResources', { id: { diff --git a/src/data/migrations/20201204003312-create_application_templates.js b/src/data/migrations/20201204003312-create_application_templates.js index dfd2dde85..d8550c43c 100644 --- a/src/data/migrations/20201204003312-create_application_templates.js +++ b/src/data/migrations/20201204003312-create_application_templates.js @@ -39,12 +39,6 @@ module.exports = { allowNull: false, type: Sequelize.DATE, field: 'updated_at' - }, - userId: { - type: Sequelize.INTEGER, - field: 'user_id', - references: { model: 'Users', key: 'id' }, - onDelete: 'cascade' } }) await queryInterface.createTable('ApplicationTemplateVariables', { diff --git a/src/data/migrations/20221021132000-create-proxy-ports.js b/src/data/migrations/20221021132000-create-proxy-ports.js index 8893f1f32..5788e7665 100644 --- a/src/data/migrations/20221021132000-create-proxy-ports.js +++ b/src/data/migrations/20221021132000-create-proxy-ports.js @@ -43,12 +43,6 @@ module.exports = { type: Sequelize.DATE, allowNull: false, field: 'updated_at' - }, - updatedBy: { - type: Sequelize.INTEGER, - field: 'updated_by', - references: { model: 'Users', key: 'id' }, - onDelete: 'set null' } }) }, diff --git a/src/data/models/accesstoken.js b/src/data/models/accesstoken.js deleted file mode 100644 index acfb81fd4..000000000 --- a/src/data/models/accesstoken.js +++ /dev/null @@ -1,40 +0,0 @@ -'use strict' - -const { convertToInt } = require('../../helpers/app-helper') - -module.exports = (sequelize, DataTypes) => { - const AccessToken = sequelize.define('AccessToken', { - id: { - type: DataTypes.INTEGER, - primaryKey: true, - autoIncrement: true, - allowNull: false, - field: 'id' - }, - token: { - type: DataTypes.STRING, - field: 'token' - }, - expirationTime: { - type: DataTypes.BIGINT, - get () { - return convertToInt(this.getDataValue('expirationTime')) - }, - field: 'expiration_time' - } - }, { - tableName: 'AccessTokens', - timestamps: false, - underscored: true - }) - AccessToken.associate = function (models) { - AccessToken.belongsTo(models.User, { - foreignKey: { - name: 'userId', - field: 'user_id' - }, - as: 'user' - }) - } - return AccessToken -} diff --git a/src/data/models/application.js b/src/data/models/application.js index 3444f44bc..e1fc5504b 100644 --- a/src/data/models/application.js +++ b/src/data/models/application.js @@ -36,15 +36,6 @@ module.exports = (sequelize, DataTypes) => { underscored: true }) Application.associate = function (models) { - Application.belongsTo(models.ControlPlane, { - foreignKey: { - name: 'controlPlaneUuid', - field: 'controlPlane_uuid' - }, - as: 'controlPlane', - onDelete: 'cascade' - }) - Application.hasMany(models.Microservice, { foreignKey: { name: 'applicationId', diff --git a/src/data/models/applicationTemplate.js b/src/data/models/applicationTemplate.js index 5f19bebe7..6cb8b8fe0 100644 --- a/src/data/models/applicationTemplate.js +++ b/src/data/models/applicationTemplate.js @@ -35,14 +35,6 @@ module.exports = (sequelize, DataTypes) => { underscored: true }) ApplicationTemplate.associate = function (models) { - ApplicationTemplate.belongsTo(models.ControlPlane, { - foreignKey: { - name: 'controlPlaneUuid', - field: 'controlPlane_uuid' - }, - as: 'controlPlane', - onDelete: 'cascade' - }) ApplicationTemplate.hasMany(models.ApplicationTemplateVariable, { foreignKey: { name: 'applicationTemplateId', diff --git a/src/data/models/catalogitem.js b/src/data/models/catalogitem.js index 8c7da3a88..d4fd4c563 100644 --- a/src/data/models/catalogitem.js +++ b/src/data/models/catalogitem.js @@ -76,15 +76,6 @@ module.exports = (sequelize, DataTypes) => { defaultValue: 1 }) - CatalogItem.belongsTo(models.ControlPlane, { - foreignKey: { - name: 'controlPlaneUuid', - field: 'controlPlane_uuid' - }, - as: 'controlPlane', - onDelete: 'cascade' - }) - CatalogItem.hasMany(models.CatalogItemImage, { foreignKey: 'catalog_item_id', as: 'images' diff --git a/src/data/models/config.js b/src/data/models/config.js index 0ae57a117..3419a2acb 100644 --- a/src/data/models/config.js +++ b/src/data/models/config.js @@ -30,15 +30,5 @@ module.exports = (sequelize, DataTypes) => { } ] }) - Config.associate = function (models) { - Config.belongsTo(models.ControlPlane, { - foreignKey: { - name: 'controlPlaneUuid', - field: 'controlPlane_uuid' - }, - as: 'controlPlane', - onDelete: 'cascade' - }) - } return Config } diff --git a/src/data/models/controlPlane.js b/src/data/models/controlPlane.js deleted file mode 100644 index 7a3710d89..000000000 --- a/src/data/models/controlPlane.js +++ /dev/null @@ -1,66 +0,0 @@ -'use strict' -module.exports = (sequelize, DataTypes) => { - const ControlPlane = sequelize.define('ControlPlane', { - uuid: { - type: DataTypes.STRING(32), - primaryKey: true, - allowNull: false, - field: 'uuid' - }, - namespace: { - /* eslint-disable new-cap */ - type: DataTypes.STRING(100), - field: 'namespace', - defaultValue: '' - }, - orgName: { - /* eslint-disable new-cap */ - type: DataTypes.STRING(100), - field: 'orgn_name', - defaultValue: '' - }, - entitlementId: { - /* eslint-disable new-cap */ - type: DataTypes.STRING(100), - field: 'entitlement_id' - } - }, { - tableName: 'ControlPlane', - timestamps: true, - underscored: true - }) - ControlPlane.associate = function (models) { - ControlPlane.hasMany(models.User, { - foreignKey: { - name: 'controlPlaneUuid', - field: 'controlPlane_uuid' - }, - as: 'user' - }) - - ControlPlane.hasMany(models.Application, { - foreignKey: { - name: 'controlPlaneUuid', - field: 'controlPlane_uuid' - }, - as: 'application' - }) - - ControlPlane.hasMany(models.Fog, { - foreignKey: { - name: 'controlPlaneUuid', - field: 'controlPlane_uuid' - }, - as: 'fog' - }) - - ControlPlane.hasMany(models.Microservice, { - foreignKey: { - name: 'controlPlaneUuid', - field: 'controlPlane_uuid' - }, - as: 'microservice' - }) - } - return ControlPlane -} diff --git a/src/data/models/edgeResource.js b/src/data/models/edgeResource.js index d19bcbb3c..63e1bcb02 100644 --- a/src/data/models/edgeResource.js +++ b/src/data/models/edgeResource.js @@ -27,15 +27,6 @@ module.exports = (sequelize, DataTypes) => { EdgeResource.associate = function (models) { EdgeResource.belongsToMany(models.Fog, { through: 'AgentEdgeResources', as: 'agents' }) EdgeResource.belongsToMany(models.Tags, { as: 'orchestrationTags', through: 'EdgeResourceOrchestrationTags' }) - - EdgeResource.belongsTo(models.ControlPlane, { - foreignKey: { - name: 'controlPlaneUuid', - field: 'controlPlane_uuid' - }, - as: 'controlPlane', - onDelete: 'cascade' - }) } return EdgeResource } diff --git a/src/data/models/emailactivationcode.js b/src/data/models/emailactivationcode.js deleted file mode 100644 index 917180a7a..000000000 --- a/src/data/models/emailactivationcode.js +++ /dev/null @@ -1,41 +0,0 @@ -'use strict' - -const { convertToInt } = require('../../helpers/app-helper') - -module.exports = (sequelize, DataTypes) => { - const EmailActivationCode = sequelize.define('EmailActivationCode', { - id: { - type: DataTypes.INTEGER, - primaryKey: true, - autoIncrement: true, - allowNull: false, - field: 'id' - }, - activationCode: { - type: DataTypes.TEXT, - field: 'activation_code' - }, - expirationTime: { - type: DataTypes.BIGINT, - get () { - return convertToInt(this.getDataValue('expirationTime')) - }, - field: 'expiration_time' - } - }, { - tableName: 'EmailActivationCodes', - timestamps: false, - underscored: true - }) - EmailActivationCode.associate = function (models) { - EmailActivationCode.belongsTo(models.User, { - foreignKey: { - name: 'userId', - field: 'user_id' - }, - as: 'user', - onDelete: 'cascade' - }) - } - return EmailActivationCode -} diff --git a/src/data/models/fog.js b/src/data/models/fog.js index 353943559..b3e131eb1 100644 --- a/src/data/models/fog.js +++ b/src/data/models/fog.js @@ -324,15 +324,6 @@ module.exports = (sequelize, DataTypes) => { defaultValue: 0 }) - Fog.belongsTo(models.ControlPlane, { - foreignKey: { - name: 'controlPlaneUuid', - field: 'controlPlane_uuid' - }, - as: 'controlPlane', - onDelete: 'cascade' - }) - Fog.hasOne(models.FogAccessToken, { foreignKey: 'iofog_uuid', as: 'accessToken' diff --git a/src/data/models/fogaccesstoken.js b/src/data/models/fogaccesstoken.js index 842f66852..9eeb29437 100644 --- a/src/data/models/fogaccesstoken.js +++ b/src/data/models/fogaccesstoken.js @@ -28,15 +28,6 @@ module.exports = (sequelize, DataTypes) => { underscored: true }) FogAccessToken.associate = function (models) { - FogAccessToken.belongsTo(models.ControlPlane, { - foreignKey: { - name: 'controlPlaneUuid', - field: 'controlPlane_uuid' - }, - as: 'controlPlane', - onDelete: 'cascade' - }) - FogAccessToken.belongsTo(models.Fog, { foreignKey: { name: 'iofogUuid', diff --git a/src/data/models/index.js b/src/data/models/index.js index d502edc34..9c74bfd34 100644 --- a/src/data/models/index.js +++ b/src/data/models/index.js @@ -45,16 +45,12 @@ const configureImage = async (db, name, fogTypes, images) => { db.initDB = async (isStart) => { await databaseProvider.initDB(isStart) - const migrationUmzug = databaseProvider.createUmzug(path.resolve(__dirname, '../migrations')) - await migrationUmzug.up() - await databaseProvider.createUmzug(path.resolve(__dirname, '../seeders')).up() if (isStart) { // Configure system images const fogTypes = await db.FogType.findAll({}) await configureImage(db, constants.ROUTER_CATALOG_NAME, fogTypes, config.get('SystemImages:Router', {})) await configureImage(db, constants.PROXY_CATALOG_NAME, fogTypes, config.get('SystemImages:Proxy', {})) - await configureImage(db, constants.PORT_ROUTER_CATALOG_NAME, fogTypes, config.get('SystemImages:PortRouter', {})) } } diff --git a/src/data/models/kubeletaccesstoken.js b/src/data/models/kubeletaccesstoken.js deleted file mode 100644 index 0122cc7d8..000000000 --- a/src/data/models/kubeletaccesstoken.js +++ /dev/null @@ -1,41 +0,0 @@ -'use strict' - -const { convertToInt } = require('../../helpers/app-helper') - -module.exports = (sequelize, DataTypes) => { - const KubeletAccessToken = sequelize.define('KubeletAccessToken', { - id: { - type: DataTypes.INTEGER, - primaryKey: true, - autoIncrement: true, - allowNull: false, - field: 'id' - }, - expirationTime: { - type: DataTypes.BIGINT, - get () { - return convertToInt(this.getDataValue('expirationTime')) - }, - field: 'expiration_time' - }, - token: { - type: DataTypes.TEXT, - field: 'token' - } - }, { - tableName: 'KubeletAccessTokens', - timestamps: false, - underscored: true - }) - KubeletAccessToken.associate = function (models) { - KubeletAccessToken.belongsTo(models.ControlPlane, { - foreignKey: { - name: 'controlPlaneUuid', - field: 'controlPlane_uuid' - }, - as: 'controlPlane', - onDelete: 'cascade' - }) - } - return KubeletAccessToken -} diff --git a/src/data/models/microservice.js b/src/data/models/microservice.js index 0af8ace15..e3548c1e8 100644 --- a/src/data/models/microservice.js +++ b/src/data/models/microservice.js @@ -108,15 +108,6 @@ module.exports = (sequelize, DataTypes) => { onDelete: 'cascade' }) - Microservice.belongsTo(models.ControlPlane, { - foreignKey: { - name: 'controlPlaneUuid', - field: 'controlPlane_uuid' - }, - as: 'controlPlane', - onDelete: 'cascade' - }) - Microservice.hasMany(models.CatalogItemImage, { foreignKey: 'microservice_uuid', as: 'images' diff --git a/src/data/models/microserviceport.js b/src/data/models/microserviceport.js index c9c24ab7d..405532fed 100644 --- a/src/data/models/microserviceport.js +++ b/src/data/models/microserviceport.js @@ -43,15 +43,6 @@ module.exports = (sequelize, DataTypes) => { onDelete: 'cascade' }) - MicroservicePort.belongsTo(models.ControlPlane, { - foreignKey: { - name: 'controlPlaneUuid', - field: 'controlPlane_uuid' - }, - as: 'controlPlane', - onDelete: 'cascade' - }) - MicroservicePort.hasOne(models.MicroservicePublicPort, { foreignKey: 'port_id', as: 'publicPort' diff --git a/src/data/models/registry.js b/src/data/models/registry.js index 48c85a034..15295fbaf 100644 --- a/src/data/models/registry.js +++ b/src/data/models/registry.js @@ -45,15 +45,5 @@ module.exports = (sequelize, DataTypes) => { timestamps: false, underscored: true }) - Registry.associate = function (models) { - Registry.belongsTo(models.ControlPlane, { - foreignKey: { - name: 'controlPlaneUuid', - field: 'controlPlane_uuid' - }, - as: 'controlPlane', - onDelete: 'cascade' - }) - } return Registry } diff --git a/src/data/models/scheduleraccesstoken.js b/src/data/models/scheduleraccesstoken.js deleted file mode 100644 index 40ca28dc7..000000000 --- a/src/data/models/scheduleraccesstoken.js +++ /dev/null @@ -1,41 +0,0 @@ -'use strict' - -const { convertToInt } = require('../../helpers/app-helper') - -module.exports = (sequelize, DataTypes) => { - const SchedulerAccessToken = sequelize.define('SchedulerAccessToken', { - id: { - type: DataTypes.INTEGER, - primaryKey: true, - autoIncrement: true, - allowNull: false, - field: 'id' - }, - expirationTime: { - type: DataTypes.BIGINT, - get () { - return convertToInt(this.getDataValue('expirationTime')) - }, - field: 'expiration_time' - }, - token: { - type: DataTypes.TEXT, - field: 'token' - } - }, { - tableName: 'SchedulerAccessTokens', - timestamps: false, - underscored: true - }) - SchedulerAccessToken.associate = function (models) { - SchedulerAccessToken.belongsTo(models.User, { - foreignKey: { - name: 'userId', - field: 'user_id' - }, - as: 'user', - onDelete: 'cascade' - }) - } - return SchedulerAccessToken -} diff --git a/src/data/models/user.js b/src/data/models/user.js deleted file mode 100644 index 3b1a30e6f..000000000 --- a/src/data/models/user.js +++ /dev/null @@ -1,94 +0,0 @@ -'use strict' -module.exports = (sequelize, DataTypes) => { - const User = sequelize.define('User', { - id: { - allowNull: false, - autoIncrement: true, - primaryKey: true, - type: DataTypes.INTEGER, - field: 'id' - }, - firstName: { - /* eslint-disable new-cap */ - type: DataTypes.STRING(100), - field: 'first_name', - defaultValue: '' - }, - lastName: { - /* eslint-disable new-cap */ - type: DataTypes.STRING(100), - field: 'last_name', - defaultValue: '' - }, - email: { - /* eslint-disable new-cap */ - type: DataTypes.STRING(100), - field: 'email', - defaultValue: '' - }, - password: { - /* eslint-disable new-cap */ - type: DataTypes.STRING(100), - field: 'password' - }, - tempPassword: { - /* eslint-disable new-cap */ - type: DataTypes.STRING(100), - field: 'temp_password' - }, - emailActivated: { - type: DataTypes.BOOLEAN, - field: 'email_activated', - defaultValue: false - }, - subscriptionKey: { - type: DataTypes.STRING(100), - field: 'subscriptionKey', - defaultValue: '' - } - }, { - tableName: 'Users', - timestamps: true, - underscored: true - }) - User.associate = function (models) { - User.hasOne(models.AccessToken, { - foreignKey: 'user_id', - as: 'accessToken' - }) - - User.hasMany(models.Application, { - foreignKey: { - name: 'userId', - field: 'user_id' - }, - as: 'application' - }) - - User.hasMany(models.Fog, { - foreignKey: { - name: 'userId', - field: 'user_id' - }, - as: 'fog' - }) - - User.hasMany(models.Microservice, { - foreignKey: { - name: 'userId', - field: 'user_id' - }, - as: 'microservice' - }) - - User.belongsTo(models.ControlPlane, { - foreignKey: { - name: 'controlPlaneUuid', - field: 'controlPlane_uuid' - }, - as: 'controlPlane', - onDelete: 'cascade' - }) - } - return User -} diff --git a/src/data/seeders/20240304180631-insert-control-plane.js b/src/data/seeders/20240304180631-insert-control-plane.js deleted file mode 100644 index cd015ea18..000000000 --- a/src/data/seeders/20240304180631-insert-control-plane.js +++ /dev/null @@ -1,19 +0,0 @@ -const config = require('../../config') - -const ControlPlaneConfig = config.get('ControlPlane:Config', {}) - -module.exports = { - up: (queryInterface, Sequelize) => { - return queryInterface.Insert('ControlPlane', [ - { - namespace: ControlPlaneConfig.namespace, - orgName: ControlPlaneConfig.orgName, - entitlementId: ControlPlaneConfig.entitlementID - } - ]) - }, - - down: (queryInterface, Sequelize) => { - return queryInterface.Delete('ControlPlane', null, {}) - } -} diff --git a/src/decorators/authorization-decorator.js b/src/decorators/authorization-decorator.js index 56699125a..eb409964d 100644 --- a/src/decorators/authorization-decorator.js +++ b/src/decorators/authorization-decorator.js @@ -12,40 +12,11 @@ */ const logger = require('../logger') const config = require('../config') -const UserManager = require('../data/managers/user-manager') -const AccessTokenManager = require('../data/managers/access-token-manager') const FogManager = require('../data/managers/iofog-manager') const FogAccessTokenManager = require('../data/managers/iofog-access-token-manager') const Errors = require('../helpers/errors') const { isTest } = require('../helpers/app-helper') -function checkAuthToken (f) { - return async function (...fArgs) { - if (isTest()) { - return f.apply(this, fArgs) - } - - const req = fArgs[0] - const token = req.headers.authorization - - const user = await UserManager.checkAuthentication(token) - - if (!user) { - logger.error('token ' + token + ' incorrect') - throw new Errors.AuthenticationError('authorization failed') - } - if (Date.now() > user.accessToken.expirationTime) { - logger.error('token ' + token + ' expired') - throw new Errors.AuthenticationError('token expired') - } - - fArgs.push(user) - AccessTokenManager.updateExpirationTime(user.accessToken.id, user.accessToken.expirationTime + - config.get('Settings:UserTokenExpirationIntervalSeconds') * 1000) - return f.apply(this, fArgs) - } -} - function checkFogToken (f) { return async function (...fArgs) { if (isTest()) { diff --git a/src/decorators/cli-decorator.js b/src/decorators/cli-decorator.js deleted file mode 100644 index f7e5f8954..000000000 --- a/src/decorators/cli-decorator.js +++ /dev/null @@ -1,69 +0,0 @@ -/* - * ******************************************************************************* - * * Copyright (c) 2023 Datasance Teknoloji A.S. - * * - * * This program and the accompanying materials are made available under the - * * terms of the Eclipse Public License v. 2.0 which is available at - * * http://www.eclipse.org/legal/epl-2.0 - * * - * * SPDX-License-Identifier: EPL-2.0 - * ******************************************************************************* - * - */ - -const logger = require('../logger') -const UserManager = require('../data/managers/user-manager') -const Errors = require('../helpers/errors') -const { isTest } = require('../helpers/app-helper') - -function prepareUserById (f) { - return async function (...args) { - if (isTest()) { - return f.apply(this, args) - } - - const fArgs = Array.prototype.slice.call(args) - const obj = fArgs[0] - const userId = obj.userId - - const user = await UserManager.findById(userId) - if (!user) { - throw new Errors.AuthenticationError('user id does not exist') - } - - delete obj.userId - fArgs.push(user) - - return f.apply(this, fArgs) - } -} - -function prepareUserByEmail (f) { - return async function (...args) { - if (isTest()) { - return f.apply(this, args) - } - - const fArgs = Array.prototype.slice.call(args) - const obj = fArgs[0] - const email = obj.email - - const user = await UserManager.findByEmail(email) - - if (!user) { - logger.error('user email ' + email + ' incorrect') - throw new Errors.AuthenticationError('user email does not exist') - } - - delete obj.email - fArgs.push(user) - - return f.apply(this, fArgs) - } -} - -module.exports = { - prepareUserById: prepareUserById, - prepareUserByEmail: prepareUserByEmail - -} diff --git a/src/helpers/errors.js b/src/helpers/errors.js index 27f06a011..cb57e675c 100644 --- a/src/helpers/errors.js +++ b/src/helpers/errors.js @@ -78,15 +78,6 @@ class FtpError extends Error { } } -class EmailActivationSetupError extends Error { - constructor () { - const message = 'Email activation is not configured on Controller' - super(message) - this.message = message - this.name = 'EmailActivationSetupError' - } -} - class InvalidArgumentError extends Error { constructor (message) { super(message) @@ -120,7 +111,6 @@ module.exports = { ModelNotFoundError: ModelNotFoundError, DuplicatePropertyError: DuplicatePropertyError, FtpError: FtpError, - EmailActivationSetupError: EmailActivationSetupError, InvalidArgumentError: InvalidArgumentError, InvalidArgumentTypeError: InvalidArgumentTypeError, CLIArgsNotProvidedError: CLIArgsNotProvidedError diff --git a/src/helpers/template-helper.js b/src/helpers/template-helper.js index b11750bec..543297a59 100755 --- a/src/helpers/template-helper.js +++ b/src/helpers/template-helper.js @@ -10,7 +10,7 @@ * * Author: Franck Roudet */ -const UserManager = require('../data/managers/user-manager') + const ApplicationManager = require('../data/managers/application-manager.js') // Using manager instead of service to avoid dependency loop const FogService = require('../services/iofog-service') const MicroservicesService = require('../services/microservices-service') @@ -60,7 +60,7 @@ async function findApplicationHandler (name) { return this.context.environments._applicationsByName[name] } - const result = await ApplicationManager.findOnePopulated({ name, userId: user.id }, { exclude: ['created_at', 'updated_at'] }, { fakeTransaction: true }) // TODO: Get a proper DB transaction + const result = await ApplicationManager.findOnePopulated({ exclude: ['created_at', 'updated_at'] }, { fakeTransaction: true }) // TODO: Get a proper DB transaction if (result) { result.microservices = (await MicroservicesService.listMicroservicesEndPoint({ applicationName: name }, user, false)).microservices if (this.context.environments._applicationsByName) { @@ -169,15 +169,7 @@ const rvaluesVarSubstition = async (subjects, templateContext, user) => { const substitutionMiddleware = async (req, res, next) => { if (['POST', 'PUT', 'PATCH'].indexOf(req.method) > -1) { - const token = req.headers.authorization let user - if (token) { - try { - user = await UserManager.checkAuthentication(token) - } catch (e) { - // Nothing to do, suppose the token has no permission to access. The is the case of agent - } - } let tmplContext = { self: req.body, // Private context diff --git a/src/routes/catalog.js b/src/routes/catalog.js index e7275a860..f5b3bdaf4 100644 --- a/src/routes/catalog.js +++ b/src/routes/catalog.js @@ -15,35 +15,39 @@ const CatalogController = require('../controllers/catalog-controller') const ResponseDecorator = require('../decorators/response-decorator') const Errors = require('../helpers/errors') const logger = require('../logger') +const keycloak = require('../config/keycloak') module.exports = [ { method: 'get', path: '/api/v1/catalog/microservices', - middleware: async (req, res) => { - logger.apiReq(req) - - const successCode = constants.HTTP_CODE_SUCCESS - const errorCodes = [ - { - code: constants.HTTP_CODE_UNAUTHORIZED, - errors: [Errors.AuthenticationError] - } - ] - - const listCatalogItemsEndPoint = ResponseDecorator.handleErrors( - CatalogController.listCatalogItemsEndPoint, - successCode, - errorCodes - ) - const responseObject = await listCatalogItemsEndPoint(req) - - res - .status(responseObject.code) - .send(responseObject.body) - - logger.apiRes({ req: req, res: responseObject }) - } + middleware: [ + keycloak.protect(['Admin', 'SRE', 'Developer', 'Viewer']), + async (req, res) => { + logger.apiReq(req) + + const successCode = constants.HTTP_CODE_SUCCESS + const errorCodes = [ + { + code: constants.HTTP_CODE_UNAUTHORIZED, + errors: [Errors.AuthenticationError] + } + ] + + const listCatalogItemsEndPoint = ResponseDecorator.handleErrors( + CatalogController.listCatalogItemsEndPoint, + successCode, + errorCodes + ) + const responseObject = await listCatalogItemsEndPoint(req) + + res + .status(responseObject.code) + .send(responseObject.body) + + logger.apiRes({ req, res: responseObject }) + } + ] }, { method: 'post', @@ -79,7 +83,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, res: responseObject }) + logger.apiRes({ req, res: responseObject }) } }, { @@ -111,7 +115,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, res: responseObject }) + logger.apiRes({ req, res: responseObject }) } }, { @@ -152,7 +156,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, res: responseObject }) + logger.apiRes({ req, res: responseObject }) } }, { @@ -184,7 +188,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, res: responseObject }) + logger.apiRes({ req, res: responseObject }) } } ] diff --git a/src/routes/controlPlane.js b/src/routes/controlPlane.js deleted file mode 100644 index 37750b99c..000000000 --- a/src/routes/controlPlane.js +++ /dev/null @@ -1,45 +0,0 @@ -/* - * ******************************************************************************* - * * Copyright (c) 2023 Datasance Teknoloji A.S. - * * - * * This program and the accompanying materials are made available under the - * * terms of the Eclipse Public License v. 2.0 which is available at - * * http://www.eclipse.org/legal/epl-2.0 - * * - * * SPDX-License-Identifier: EPL-2.0 - * ******************************************************************************* - * - */ -const constants = require('../helpers/constants') -const ControlPlaneController = require('../controllers/control-plane-controller') -const ResponseDecorator = require('../decorators/response-decorator') -const Errors = require('../helpers/errors') -const logger = require('../logger') - -module.exports = [ - { - method: 'get', - path: '/api/v1/controlplane/profile', - middleware: async (req, res) => { - logger.apiReq(req) - - const successCode = constants.HTTP_CODE_SUCCESS - const errorCodes = [ - { - code: constants.HTTP_CODE_UNAUTHORIZED, - errors: [Errors.AuthenticationError] - } - ] - - const getControlPlaneProfileEndPoint = ResponseDecorator.handleErrors(ControlPlaneController.getControlPlaneProfileEndPoint, successCode, errorCodes) - const responseObject = await getControlPlaneProfileEndPoint(req) - - res - .status(responseObject.code) - .send(responseObject.body) - - logger.apiRes({ req: req, res: responseObject }) - } - } - -] diff --git a/src/routes/controller.js b/src/routes/controller.js index 6dd20d300..5ccc2f6fb 100644 --- a/src/routes/controller.js +++ b/src/routes/controller.js @@ -34,24 +34,6 @@ module.exports = [ logger.apiRes({ req: req, res: responseObject }) } }, - { - method: 'get', - path: '/api/v1/email-activation', - middleware: async (req, res) => { - logger.apiReq(req) - - const successCode = constants.HTTP_CODE_SUCCESS - const errorCodes = [] - const emailActivationEndPoint = ResponseDecorator.handleErrors(Controller.emailActivationEndPoint, successCode, errorCodes) - const responseObject = await emailActivationEndPoint(req) - - res - .status(responseObject.code) - .send(responseObject.body) - - logger.apiRes({ req: req, res: responseObject }) - } - }, { method: 'get', path: '/api/v1/fog-types/', diff --git a/src/routes/kubelet.js b/src/routes/kubelet.js deleted file mode 100644 index 54e7a5bcf..000000000 --- a/src/routes/kubelet.js +++ /dev/null @@ -1,434 +0,0 @@ -/* - * ******************************************************************************* - * * Copyright (c) 2023 Datasance Teknoloji A.S. - * * - * * This program and the accompanying materials are made available under the - * * terms of the Eclipse Public License v. 2.0 which is available at - * * http://www.eclipse.org/legal/epl-2.0 - * * - * * SPDX-License-Identifier: EPL-2.0 - * ******************************************************************************* - * - */ - -const constants = require('../helpers/constants') -const Errors = require('../helpers/errors') -const KubeletController = require('../controllers/kubelet-controller') -const logger = require('../logger') -const ResponseDecorator = require('../decorators/response-decorator') - -module.exports = [ - { - method: 'post', - path: '/api/v1/k8s/createPod', - middleware: async (req, res) => { - logger.apiReq(req) - - const successCode = constants.HTTP_CODE_SUCCESS - const errorCodes = [ - { - code: constants.HTTP_CODE_BAD_REQUEST, - errors: [Errors.ValidationError] - }, - { - code: constants.HTTP_CODE_UNAUTHORIZED, - errors: [Errors.AuthenticationError] - }, - { - code: constants.HTTP_CODE_NOT_FOUND, - errors: [Errors.NotFoundError] - } - ] - - const kubeletCreatePodEndPoint = ResponseDecorator - .handleErrors(KubeletController.kubeletCreatePodEndPoint, successCode, errorCodes) - const responseObject = await kubeletCreatePodEndPoint(req) - - res - .status(responseObject.code) - .send(responseObject.body) - - logger.apiRes({ req: req, res: responseObject }) - } - }, - { - method: 'put', - path: '/api/v1/k8s/updatePod', - middleware: async (req, res) => { - logger.apiReq(req) - - const successCode = constants.HTTP_CODE_SUCCESS - const errorCodes = [ - { - code: constants.HTTP_CODE_BAD_REQUEST, - errors: [Errors.ValidationError] - }, - { - code: constants.HTTP_CODE_UNAUTHORIZED, - errors: [Errors.AuthenticationError] - }, - { - code: constants.HTTP_CODE_NOT_FOUND, - errors: [Errors.NotFoundError] - } - ] - - const kubeletUpdatePodEndPoint = ResponseDecorator - .handleErrors(KubeletController.kubeletUpdatePodEndPoint, successCode, errorCodes) - const responseObject = await kubeletUpdatePodEndPoint(req) - - res - .status(responseObject.code) - .send(responseObject.body) - - logger.apiRes({ req: req, res: responseObject }) - } - }, - { - method: 'delete', - path: '/api/v1/k8s/deletePod', - middleware: async (req, res) => { - logger.apiReq(req) - - const successCode = constants.HTTP_CODE_SUCCESS - const errorCodes = [ - { - code: constants.HTTP_CODE_BAD_REQUEST, - errors: [Errors.ValidationError] - }, - { - code: constants.HTTP_CODE_UNAUTHORIZED, - errors: [Errors.AuthenticationError] - }, - { - code: constants.HTTP_CODE_NOT_FOUND, - errors: [Errors.NotFoundError] - } - ] - - const kubeletDeletePodEndPoint = ResponseDecorator - .handleErrors(KubeletController.kubeletDeletePodEndPoint, successCode, errorCodes) - const responseObject = await kubeletDeletePodEndPoint(req) - - res - .status(responseObject.code) - .send(responseObject.body) - - logger.apiRes({ req: req, res: responseObject }) - } - }, - { - method: 'get', - path: '/api/v1/k8s/getPod', - middleware: async (req, res) => { - logger.apiReq(req) - - const successCode = constants.HTTP_CODE_SUCCESS - const errorCodes = [ - { - code: constants.HTTP_CODE_BAD_REQUEST, - errors: [Errors.ValidationError] - }, - { - code: constants.HTTP_CODE_UNAUTHORIZED, - errors: [Errors.AuthenticationError] - }, - { - code: constants.HTTP_CODE_NOT_FOUND, - errors: [Errors.NotFoundError] - } - ] - - const kubeletGetPodEndPoint = ResponseDecorator - .handleErrors(KubeletController.kubeletGetPodEndPoint, successCode, errorCodes) - const responseObject = await kubeletGetPodEndPoint(req) - - res - .status(responseObject.code) - .send(responseObject.body) - - logger.apiRes({ req: req, res: responseObject }) - } - }, - { - method: 'get', - path: '/api/v1/k8s/getContainerLogs', - middleware: async (req, res) => { - logger.apiReq(req) - - const successCode = constants.HTTP_CODE_SUCCESS - const errorCodes = [ - { - code: constants.HTTP_CODE_BAD_REQUEST, - errors: [Errors.ValidationError] - }, - { - code: constants.HTTP_CODE_UNAUTHORIZED, - errors: [Errors.AuthenticationError] - }, - { - code: constants.HTTP_CODE_NOT_FOUND, - errors: [Errors.NotFoundError] - } - ] - - const kubeletGetContainerLogsEndPoint = ResponseDecorator - .handleErrors(KubeletController.kubeletGetContainerLogsEndPoint, successCode, errorCodes) - const responseObject = await kubeletGetContainerLogsEndPoint(req) - - res - .status(responseObject.code) - .send(responseObject.body) - - logger.apiRes({ req: req, res: responseObject }) - } - }, - { - method: 'get', - path: '/api/v1/k8s/getPodStatus', - middleware: async (req, res) => { - logger.apiReq(req) - - const successCode = constants.HTTP_CODE_SUCCESS - const errorCodes = [ - { - code: constants.HTTP_CODE_BAD_REQUEST, - errors: [Errors.ValidationError] - }, - { - code: constants.HTTP_CODE_UNAUTHORIZED, - errors: [Errors.AuthenticationError] - }, - { - code: constants.HTTP_CODE_NOT_FOUND, - errors: [Errors.NotFoundError] - } - ] - - const kubeletGetPodStatusEndPoint = ResponseDecorator - .handleErrors(KubeletController.kubeletGetPodStatusEndPoint, successCode, errorCodes) - const responseObject = await kubeletGetPodStatusEndPoint(req) - - res - .status(responseObject.code) - .send(responseObject.body) - - logger.apiRes({ req: req, res: responseObject }) - } - }, - { - method: 'get', - path: '/api/v1/k8s/getPods', - middleware: async (req, res) => { - logger.apiReq(req) - - const successCode = constants.HTTP_CODE_SUCCESS - const errorCodes = [ - { - code: constants.HTTP_CODE_BAD_REQUEST, - errors: [Errors.ValidationError] - }, - { - code: constants.HTTP_CODE_UNAUTHORIZED, - errors: [Errors.AuthenticationError] - }, - { - code: constants.HTTP_CODE_NOT_FOUND, - errors: [Errors.NotFoundError] - } - ] - - const kubeletGetPodsEndPoint = ResponseDecorator - .handleErrors(KubeletController.kubeletGetPodsEndPoint, successCode, errorCodes) - const responseObject = await kubeletGetPodsEndPoint(req) - - res - .status(responseObject.code) - .send(responseObject.body) - - logger.apiRes({ req: req, res: responseObject }) - } - }, - { - method: 'get', - path: '/api/v1/k8s/capacity', - middleware: async (req, res) => { - logger.apiReq(req) - - const successCode = constants.HTTP_CODE_SUCCESS - const errorCodes = [ - { - code: constants.HTTP_CODE_BAD_REQUEST, - errors: [Errors.ValidationError] - }, - { - code: constants.HTTP_CODE_UNAUTHORIZED, - errors: [Errors.AuthenticationError] - }, - { - code: constants.HTTP_CODE_NOT_FOUND, - errors: [Errors.NotFoundError] - } - ] - - const kubeletGetCapacityEndPoint = ResponseDecorator - .handleErrors(KubeletController.kubeletGetCapacityEndPoint, successCode, errorCodes) - const responseObject = await kubeletGetCapacityEndPoint(req) - - res - .status(responseObject.code) - .send(responseObject.body) - - logger.apiRes({ req: req, res: responseObject }) - } - }, - { - method: 'get', - path: '/api/v1/k8s/allocatable', - middleware: async (req, res) => { - logger.apiReq(req) - - const successCode = constants.HTTP_CODE_SUCCESS - const errorCodes = [ - { - code: constants.HTTP_CODE_BAD_REQUEST, - errors: [Errors.ValidationError] - }, - { - code: constants.HTTP_CODE_UNAUTHORIZED, - errors: [Errors.AuthenticationError] - }, - { - code: constants.HTTP_CODE_NOT_FOUND, - errors: [Errors.NotFoundError] - } - ] - - const kubeletGetAllocatableEndPoint = ResponseDecorator - .handleErrors(KubeletController.kubeletGetAllocatableEndPoint, successCode, errorCodes) - const responseObject = await kubeletGetAllocatableEndPoint(req) - - res - .status(responseObject.code) - .send(responseObject.body) - - logger.apiRes({ req: req, res: responseObject }) - } - }, - { - method: 'get', - path: '/api/v1/k8s/nodeConditions', - middleware: async (req, res) => { - logger.apiReq(req) - - const successCode = constants.HTTP_CODE_SUCCESS - const errorCodes = [ - { - code: constants.HTTP_CODE_BAD_REQUEST, - errors: [Errors.ValidationError] - }, - { - code: constants.HTTP_CODE_UNAUTHORIZED, - errors: [Errors.AuthenticationError] - }, - { - code: constants.HTTP_CODE_NOT_FOUND, - errors: [Errors.NotFoundError] - } - ] - - const kubeletGetNodeConditionsEndPoint = ResponseDecorator - .handleErrors(KubeletController.kubeletGetNodeConditionsEndPoint, successCode, errorCodes) - const responseObject = await kubeletGetNodeConditionsEndPoint(req) - - res - .status(responseObject.code) - .send(responseObject.body) - - logger.apiRes({ req: req, res: responseObject }) - } - }, - { - method: 'get', - path: '/api/v1/k8s/nodeAddresses', - middleware: async (req, res) => { - logger.apiReq(req) - - const successCode = constants.HTTP_CODE_SUCCESS - const errorCodes = [ - { - code: constants.HTTP_CODE_BAD_REQUEST, - errors: [Errors.ValidationError] - }, - { - code: constants.HTTP_CODE_UNAUTHORIZED, - errors: [Errors.AuthenticationError] - }, - { - code: constants.HTTP_CODE_NOT_FOUND, - errors: [Errors.NotFoundError] - } - ] - - const kubeletGetNodeAddressesEndPoint = ResponseDecorator - .handleErrors(KubeletController.kubeletGetNodeAddressesEndPoint, successCode, errorCodes) - const responseObject = await kubeletGetNodeAddressesEndPoint(req) - - res - .status(responseObject.code) - .send(responseObject.body) - - logger.apiRes({ req: req, res: responseObject }) - } - }, - { - method: 'get', - path: '/api/v1/k8s/vk-token', - middleware: async (req, res) => { - logger.apiReq(req) - - const successCode = constants.HTTP_CODE_SUCCESS - const errorCodes = [ - { - code: constants.HTTP_CODE_NOT_FOUND, - errors: [Errors.AuthenticationError] - } - ] - - const kubeletGetVkTokenEndPoint = ResponseDecorator - .handleErrors(KubeletController.kubeletGetVkTokenEndPoint, successCode, errorCodes) - const responseObject = await kubeletGetVkTokenEndPoint() - - res - .status(responseObject.code) - .send(responseObject.body) - - logger.apiRes({ req: req, res: responseObject }) - } - }, - { - method: 'get', - path: '/api/v1/k8s/scheduler-token', - middleware: async (req, res) => { - logger.apiReq(req) - - const successCode = constants.HTTP_CODE_SUCCESS - const errorCodes = [ - { - code: constants.HTTP_CODE_NOT_FOUND, - errors: [Errors.AuthenticationError] - } - ] - - const kubeletGetSchedulerTokenEndPoint = ResponseDecorator - .handleErrors(KubeletController.kubeletGetSchedulerTokenEndPoint, successCode, errorCodes) - const responseObject = await kubeletGetSchedulerTokenEndPoint() - - res - .status(responseObject.code) - .send(responseObject.body) - - logger.apiRes({ req: req, res: responseObject }) - } - } -] diff --git a/src/routes/user.js b/src/routes/user.js index 9ad3945df..df98f9317 100644 --- a/src/routes/user.js +++ b/src/routes/user.js @@ -16,7 +16,6 @@ const UserController = require('../controllers/user-controller') const ResponseDecorator = require('../decorators/response-decorator') const Errors = require('../helpers/errors') -const Config = require('../config') const logger = require('../logger') module.exports = [ @@ -48,238 +47,5 @@ module.exports = [ logger.apiRes('POST /api/v1/user/login', { args: { statusCode: responseObject.code } }) // don't use req and responseObject as args, because they have password and token } - }, - { - method: 'post', - path: '/api/v1/user/logout', - middleware: async (req, res) => { - logger.apiReq(req) - - const successCode = constants.HTTP_CODE_NO_CONTENT - const errorCodes = [ - { - code: constants.HTTP_CODE_UNAUTHORIZED, - errors: [Errors.AuthenticationError] - } - ] - - const userLogoutEndPoint = ResponseDecorator.handleErrors(UserController.userLogoutEndPoint, successCode, errorCodes) - const responseObject = await userLogoutEndPoint(req) - - res - .status(responseObject.code) - .send() - } - }, - { - method: 'post', - path: '/api/v1/user/signup', - middleware: async (req, res) => { - logger.apiReq('POST /api/v1/user/signup') // don't use req as arg, because password not encrypted - - const successCode = constants.HTTP_CODE_CREATED - const errorCodes = [ - { - code: constants.HTTP_CODE_BAD_REQUEST, - errors: [Errors.ValidationError] - } - ] - - const userSignupEndPoint = ResponseDecorator.handleErrors(UserController.userSignupEndPoint, successCode, errorCodes) - const responseObject = await userSignupEndPoint(req) - - res - .status(responseObject.code) - .send(responseObject.body) - - logger.apiRes({ req: req, res: responseObject }) - } - }, - { - method: 'get', - path: '/api/v1/user/signup/resend-activation', - middleware: async (req, res) => { - logger.apiReq(req) - - const successCode = constants.HTTP_CODE_NO_CONTENT - const errorCodes = [ - { - code: constants.HTTP_CODE_BAD_REQUEST, - errors: [Errors.ValidationError] - } - ] - - const resendActivationEndPoint = ResponseDecorator.handleErrors(UserController.resendActivationEndPoint, - successCode, errorCodes) - const responseObject = await resendActivationEndPoint(req) - - res - .status(responseObject.code) - .send(responseObject.body) - - logger.apiRes({ req: req, res: responseObject }) - } - }, - { - method: 'post', - path: '/api/v1/user/activate', - middleware: async (req, res) => { - logger.apiReq(req) - - const successCode = constants.HTTP_CODE_SEE_OTHER - const errorCodes = [ - { - code: constants.HTTP_CODE_NOT_FOUND, - errors: [Errors.NotFoundError] - } - ] - - const activateUserEndPoint = ResponseDecorator.handleErrors(UserController.activateUserAccountEndPoint, - successCode, errorCodes) - const responseObject = await activateUserEndPoint(req) - - // redirect to login page - if (responseObject.code === successCode) { - res.setHeader('Location', Config.get('Email:HomeUrl')) - } - - res - .status(responseObject.code) - .send(responseObject.body) - - logger.apiRes({ req: req, res: responseObject }) - } - }, - { - method: 'get', - path: '/api/v1/user/profile', - middleware: async (req, res) => { - logger.apiReq(req) - - const successCode = constants.HTTP_CODE_SUCCESS - const errorCodes = [ - { - code: constants.HTTP_CODE_UNAUTHORIZED, - errors: [Errors.AuthenticationError] - } - ] - - const getUserProfileEndPoint = ResponseDecorator.handleErrors(UserController.getUserProfileEndPoint, successCode, errorCodes) - const responseObject = await getUserProfileEndPoint(req) - - res - .status(responseObject.code) - .send(responseObject.body) - - logger.apiRes({ req: req, res: responseObject }) - } - }, - { - method: 'patch', - path: '/api/v1/user/profile', - middleware: async (req, res) => { - logger.apiReq(req) - - const successCode = constants.HTTP_CODE_SUCCESS - const errorCodes = [ - { - code: constants.HTTP_CODE_UNAUTHORIZED, - errors: [Errors.AuthenticationError] - }, - { - code: constants.HTTP_CODE_BAD_REQUEST, - errors: [Errors.ValidationError] - } - ] - - const updateUserProfileEndPoint = ResponseDecorator.handleErrors(UserController.updateUserProfileEndPoint, - successCode, errorCodes) - const responseObject = await updateUserProfileEndPoint(req) - - res - .status(responseObject.code) - .send(responseObject.body) - - logger.apiRes({ req: req, res: responseObject }) - } - }, - { - method: 'delete', - path: '/api/v1/user/profile', - middleware: async (req, res) => { - logger.apiReq(req) - - const successCode = constants.HTTP_CODE_NO_CONTENT - const errorCodes = [ - { - code: constants.HTTP_CODE_UNAUTHORIZED, - errors: [Errors.AuthenticationError] - } - ] - - const deleteUserProfileEndPoint = ResponseDecorator.handleErrors(UserController.deleteUserProfileEndPoint, - successCode, errorCodes) - const responseObject = await deleteUserProfileEndPoint(req) - - res - .status(responseObject.code) - .send(responseObject.body) - - logger.apiRes({ req: req, res: responseObject }) - } - }, - { - method: 'patch', - path: '/api/v1/user/password', - middleware: async (req, res) => { - logger.apiReq('PATCH /api/v1/user/password') // don't use req as arg, because password not encrypted - - const successCode = constants.HTTP_CODE_NO_CONTENT - const errorCodes = [ - { - code: constants.HTTP_CODE_UNAUTHORIZED, - errors: [Errors.AuthenticationError] - }, - { - code: constants.HTTP_CODE_BAD_REQUEST, - errors: [Errors.ValidationError] - } - ] - - const updateUserPasswordEndPoint = ResponseDecorator.handleErrors(UserController.updateUserPasswordEndPoint, - successCode, errorCodes) - const responseObject = await updateUserPasswordEndPoint(req) - - res - .status(responseObject.code) - .send(responseObject.body) - - logger.apiRes({ req: req, res: responseObject }) - } - }, - { - method: 'delete', - path: '/api/v1/user/password', - middleware: async (req, res) => { - logger.apiReq(req) - - const successCode = constants.HTTP_CODE_NO_CONTENT - const errorCodes = [ - { - code: constants.HTTP_CODE_NOT_FOUND, - errors: [Errors.NotFoundError] - } - ] - - const resetUserPasswordEndPoint = ResponseDecorator.handleErrors(UserController.resetUserPasswordEndPoint, - successCode, errorCodes) - const responseObject = await resetUserPasswordEndPoint(req) - - res - .status(responseObject.code) - .send(responseObject.body) - - logger.apiRes({ req: req, res: responseObject }) - } } ] diff --git a/src/schemas/config.js b/src/schemas/config.js index f83a89b99..c03b779ae 100644 --- a/src/schemas/config.js +++ b/src/schemas/config.js @@ -12,34 +12,27 @@ */ const configUpdate = { - 'id': '/configUpdate', - 'type': 'object', - 'properties': { - 'port': { 'type': 'integer', 'minimum': 0, 'maximum': 65535 }, - 'sslCert': { 'type': 'string' }, - 'sslKey': { 'type': 'string' }, - 'intermediateCert': { 'type': 'string' }, - 'emailActivationOn': { 'type': 'boolean' }, - 'emailActivationOff': { 'type': 'boolean' }, - 'homeUrl': { 'type': 'string' }, - 'emailAddress': { 'type': 'string' }, - 'emailPassword': { 'type': 'string', 'minLength': 1 }, - 'emailService': { 'type': 'string' }, - 'logDir': { 'type': 'string' }, - 'logSize': { 'type': 'integer' }, - 'kubelet': { 'type': 'string' } + id: '/configUpdate', + type: 'object', + properties: { + port: { type: 'integer', minimum: 0, maximum: 65535 }, + sslCert: { type: 'string' }, + sslKey: { type: 'string' }, + intermediateCert: { type: 'string' }, + logDir: { type: 'string' }, + logSize: { type: 'integer' } } } const configElement = { - 'id': '/configElement', - 'type': 'object', - 'properties': { - 'key': { 'type': 'string', 'minLength': 1 }, - 'value': { 'type': 'string' } + id: '/configElement', + type: 'object', + properties: { + key: { type: 'string', minLength: 1 }, + value: { type: 'string' } }, - 'required': ['key', 'value'], - 'additionalProperties': true + required: ['key', 'value'], + additionalProperties: true } module.exports = { diff --git a/src/schemas/user.js b/src/schemas/user.js index d65fe9d58..eae5bd6db 100644 --- a/src/schemas/user.js +++ b/src/schemas/user.js @@ -11,125 +11,22 @@ * */ -const signUp = { - 'id': '/signUp', - 'type': 'object', - 'properties': { - 'firstName': { 'type': 'string', 'minLength': 3 }, - 'lastName': { 'type': 'string', 'minLength': 3 }, - 'email': { - 'type': 'string', - 'pattern': '^(([^<>()\\[\\]\\\\.,;:\\s@"]+(\\.[^<>()\\[\\]\\\\.,;:\\s@"]+)*)|(".+"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}' + - '\\.[0-9]{1,3}\\.[0-9]{1,3}])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$' - }, - 'password': { 'type': 'string', 'minLength': 8 }, - 'subscriptionKey': { 'type': 'string', 'minLength': 15 } - }, - 'required': ['email', 'password', 'firstName', 'lastName'], - 'additionalProperties': true -} - const login = { - 'id': '/login', - 'type': 'object', - 'properties': { - 'email': { - 'type': 'string', - 'pattern': '^(([^<>()\\[\\]\\\\.,;:\\s@"]+(\\.[^<>()\\[\\]\\\\.,;:\\s@"]+)*)|(".+"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}' + + id: '/login', + type: 'object', + properties: { + email: { + type: 'string', + pattern: '^(([^<>()\\[\\]\\\\.,;:\\s@"]+(\\.[^<>()\\[\\]\\\\.,;:\\s@"]+)*)|(".+"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}' + '\\.[0-9]{1,3}\\.[0-9]{1,3}])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$' }, - 'password': { 'type': 'string' } - }, - 'required': ['email', 'password'], - 'additionalProperties': true -} - -const resendActivation = { - 'id': '/resendActivation', - 'type': 'object', - 'properties': { - 'email': { - 'type': 'string', - 'pattern': '^(([^<>()\\[\\]\\\\.,;:\\s@"]+(\\.[^<>()\\[\\]\\\\.,;:\\s@"]+)*)|(".+"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}' + - '\\.[0-9]{1,3}\\.[0-9]{1,3}])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$' - } - }, - 'required': ['email'], - 'additionalProperties': true -} - -const activateUser = { - 'id': '/activateUser', - 'type': 'object', - 'properties': { - 'activationCode': { 'type': 'string' } - }, - 'required': ['activationCode'], - 'additionalProperties': true -} - -const activateUserCLI = { - 'id': '/activateUserCLI', - 'type': 'object', - 'properties': { - 'email': { 'type': 'string' } - }, - 'required': ['email'], - 'additionalProperties': true -} - -const updateUserProfile = { - 'id': '/updateUserProfile', - 'type': 'object', - 'properties': { - 'firstName': { 'type': 'string', 'minLength': 3 }, - 'lastName': { 'type': 'string', 'minLength': 3 }, - 'subscriptionKey': { 'type': 'string', 'minLength': 15 } - }, - 'required': [], - 'additionalProperties': true -} - -const updateUserProfileCLI = { - 'id': '/updateUserProfileCLI', - 'type': 'object', - 'properties': { - 'firstName': { 'type': 'string', 'minLength': 3 }, - 'lastName': { 'type': 'string', 'minLength': 3 }, - 'password': { 'type': 'string', 'minLength': 8 }, - 'subscriptionKey': { 'type': 'string', 'minLength': 15 } - }, - 'required': [], - 'additionalProperties': true -} - -const updatePassword = { - 'id': '/updatePassword', - 'type': 'object', - 'properties': { - 'oldPassword': { 'type': 'string' }, - 'newPassword': { 'type': 'string', 'minLength': 8 } - }, - 'required': ['oldPassword', 'newPassword'], - 'additionalProperties': true -} - -const resetUserPassword = { - 'id': '/resetUserPassword', - 'type': 'object', - 'properties': { - 'email': { - 'type': 'string', - 'pattern': '^(([^<>()\\[\\]\\\\.,;:\\s@"]+(\\.[^<>()\\[\\]\\\\.,;:\\s@"]+)*)|(".+"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}' + - '\\.[0-9]{1,3}\\.[0-9]{1,3}])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$' - } + password: { type: 'string' } }, - 'required': ['email'], - 'additionalProperties': true + required: ['email', 'password'], + additionalProperties: true } module.exports = { - mainSchemas: [signUp, login, resendActivation, activateUser, activateUserCLI, updateUserProfile, - updateUserProfileCLI, updatePassword, resetUserPassword], + mainSchemas: [login], innerSchemas: [] } diff --git a/src/server.js b/src/server.js index b465e178e..2be52d2af 100755 --- a/src/server.js +++ b/src/server.js @@ -34,6 +34,9 @@ const multerMemStorage = multer.memoryStorage() const uploadFile = (fileName) => multer({ storage: multerMemStorage }).single(fileName) +const keycloak = require('./config/keycloak.js').initKeycloak() +const session = require('express-session') +const memoryStore = require('./config/keycloak.js').getMemoryStore() const viewerApp = express() @@ -46,7 +49,13 @@ app.use(xss()) // express logs // app.use(morgan('combined')); - +app.use(session({ + secret: 'pot-controller', + resave: false, + saveUninitialized: true, + store: memoryStore +})) +app.use(keycloak.middleware()) app.use(bodyParser.urlencoded({ extended: true })) @@ -75,7 +84,7 @@ app.use((req, res, next) => { global.appRoot = path.resolve(__dirname) const registerRoute = (route) => { - const middlewares = [route.middleware] + const middlewares = [keycloak.middleware(), route.middleware] if (route.supportSubstitution) { middlewares.unshift(substitutionMiddleware) } diff --git a/src/services/access-token-service.js b/src/services/access-token-service.js deleted file mode 100644 index 822bfdceb..000000000 --- a/src/services/access-token-service.js +++ /dev/null @@ -1,29 +0,0 @@ -/* - * ******************************************************************************* - * * Copyright (c) 2023 Datasance Teknoloji A.S. - * * - * * This program and the accompanying materials are made available under the - * * terms of the Eclipse Public License v. 2.0 which is available at - * * http://www.eclipse.org/legal/epl-2.0 - * * - * * SPDX-License-Identifier: EPL-2.0 - * ******************************************************************************* - * - */ - -const AccessTokenManager = require('../data/managers/access-token-manager') - -const createAccessToken = async function (accessToken, transaction) { - return AccessTokenManager.create(accessToken, transaction) -} - -const removeAccessTokenByUserId = async function (userId, transaction) { - return AccessTokenManager.delete({ - userId: userId - }, transaction) -} - -module.exports = { - createAccessToken: createAccessToken, - removeAccessTokenByUserId: removeAccessTokenByUserId -} diff --git a/src/services/agent-service.js b/src/services/agent-service.js index dbfb6ecab..c33bd4303 100644 --- a/src/services/agent-service.js +++ b/src/services/agent-service.js @@ -369,9 +369,6 @@ const getAgentRegistries = async function (fog, transaction) { const registries = await RegistryManager.findAll({ [Op.or]: [ - { - userId: fog.userId - }, { isPublic: true } diff --git a/src/services/application-service.js b/src/services/application-service.js index 098472e18..a823588f4 100644 --- a/src/services/application-service.js +++ b/src/services/application-service.js @@ -56,14 +56,13 @@ const createApplicationEndPoint = async function (applicationData, user, isCLI, } await Validator.validate(applicationData, Validator.schemas.applicationCreate) - await _checkForDuplicateName(applicationData.name, null, user.id, transaction) + await _checkForDuplicateName(applicationData.name, null, transaction) const applicationToCreate = { name: applicationData.name, description: applicationData.description, isActivated: !!applicationData.isActivated, - isSystem: !!applicationData.isSystem, - userId: user.id + isSystem: !!applicationData.isSystem } const applicationDataCreate = AppHelper.deleteUndefinedFields(applicationToCreate) @@ -96,8 +95,7 @@ const createApplicationEndPoint = async function (applicationData, user, isCLI, const deleteApplicationEndPoint = async function (conditions, user, isCLI, transaction) { const whereObj = { - ...conditions, - userId: user.id + ...conditions } const where = AppHelper.deleteUndefinedFields(whereObj) @@ -110,13 +108,13 @@ const deleteApplicationEndPoint = async function (conditions, user, isCLI, trans const patchApplicationEndPoint = async function (applicationData, conditions, user, isCLI, transaction) { await Validator.validate(applicationData, Validator.schemas.applicationPatch) - const oldApplication = await ApplicationManager.findOne({ ...conditions, userId: user.id }, transaction) + const oldApplication = await ApplicationManager.findOne({ ...conditions }, transaction) if (!oldApplication) { throw new Errors.NotFoundError(ErrorMessages.INVALID_FLOW_ID) } if (applicationData.name) { - await _checkForDuplicateName(applicationData.name, oldApplication.id, user.id || oldApplication.userId, transaction) + await _checkForDuplicateName(applicationData.name, oldApplication.id, transaction) } const application = { @@ -130,7 +128,7 @@ const patchApplicationEndPoint = async function (applicationData, conditions, us const where = isCLI ? { id: oldApplication.id } - : { id: oldApplication.id, userId: user.id } + : { id: oldApplication.id } await ApplicationManager.update(where, updateApplicationData, transaction) if (oldApplication.isActivated !== applicationData.isActivated) { @@ -167,13 +165,13 @@ const updateApplicationEndPoint = async function (applicationData, name, user, i await Validator.validate(applicationData, Validator.schemas.applicationUpdate) - const oldApplication = await ApplicationManager.findOne({ name, userId: user.id }, transaction) + const oldApplication = await ApplicationManager.findOne({ name }, transaction) if (!oldApplication) { throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.INVALID_FLOW_ID, name)) } if (applicationData.name) { - await _checkForDuplicateName(applicationData.name, oldApplication.id, user.id || oldApplication.userId, transaction) + await _checkForDuplicateName(applicationData.name, oldApplication.id, transaction) } const application = { @@ -186,7 +184,7 @@ const updateApplicationEndPoint = async function (applicationData, name, user, i const updateApplicationData = AppHelper.deleteUndefinedFields(application) const where = isCLI ? { id: oldApplication.id } - : { id: oldApplication.id, userId: user.id } + : { id: oldApplication.id } await ApplicationManager.update(where, updateApplicationData, transaction) if (applicationData.microservices) { @@ -274,7 +272,6 @@ const _updateMicroservices = async function (application, microservices, user, i const getUserApplicationsEndPoint = async function (user, isCLI, transaction) { const application = { - userId: user.id, isSystem: false } @@ -306,7 +303,7 @@ async function _buildApplicationObject (application, transaction) { async function getApplication (conditions, user, isCLI, transaction) { const where = isCLI ? { ...conditions } - : { ...conditions, userId: user.id } + : { ...conditions } const attributes = { exclude: ['created_at', 'updated_at'] } const applicationRaw = await ApplicationManager.findOnePopulated(where, attributes, transaction) @@ -322,11 +319,11 @@ const getApplicationEndPoint = async function (conditions, user, isCLI, transact return application } -const _checkForDuplicateName = async function (name, applicationId, userId, transaction) { +const _checkForDuplicateName = async function (name, applicationId, transaction) { if (name) { const where = applicationId - ? { name: name, userId: userId, id: { [Op.ne]: applicationId } } - : { name: name, userId: userId } + ? { name: name, id: { [Op.ne]: applicationId } } + : { name: name } const result = await ApplicationManager.findOne(where, transaction) if (result) { diff --git a/src/services/application-template-service.js b/src/services/application-template-service.js index 8f00742fb..8fa309cb2 100644 --- a/src/services/application-template-service.js +++ b/src/services/application-template-service.js @@ -31,13 +31,12 @@ const createApplicationTemplateEndPoint = async function (applicationTemplateDat // Remove name before storing delete applicationTemplateData.application.name - await _checkForDuplicateName(applicationTemplateData.name, null, user.id, transaction) + await _checkForDuplicateName(applicationTemplateData.name, null, transaction) const applicationTemplateToCreate = { name: applicationTemplateData.name, description: applicationTemplateData.description, - applicationJSON: JSON.stringify(applicationTemplateData.application), - userId: user.id + applicationJSON: JSON.stringify(applicationTemplateData.application) } const applicationTemplateDataCreate = AppHelper.deleteUndefinedFields(applicationTemplateToCreate) @@ -64,8 +63,7 @@ const createApplicationTemplateEndPoint = async function (applicationTemplateDat const deleteApplicationTemplateEndPoint = async function (conditions, user, isCLI, transaction) { const whereObj = { - ...conditions, - userId: user.id + ...conditions } const where = AppHelper.deleteUndefinedFields(whereObj) @@ -75,13 +73,13 @@ const deleteApplicationTemplateEndPoint = async function (conditions, user, isCL const patchApplicationTemplateEndPoint = async function (applicationTemplateData, conditions, user, isCLI, transaction) { await Validator.validate(applicationTemplateData, Validator.schemas.applicationTemplatePatch) - const oldApplicationTemplate = await ApplicationTemplateManager.findOne({ ...conditions, userId: user.id }, transaction) + const oldApplicationTemplate = await ApplicationTemplateManager.findOne({ ...conditions }, transaction) if (!oldApplicationTemplate) { throw new Errors.NotFoundError(ErrorMessages.INVALID_FLOW_ID) } if (applicationTemplateData.name) { - await _checkForDuplicateName(applicationTemplateData.name, oldApplicationTemplate.id, user.id || oldApplicationTemplate.userId, transaction) + await _checkForDuplicateName(applicationTemplateData.name, oldApplicationTemplate.id, transaction) } const applicationTemplate = { @@ -93,7 +91,7 @@ const patchApplicationTemplateEndPoint = async function (applicationTemplateData const where = isCLI ? { id: oldApplicationTemplate.id } - : { id: oldApplicationTemplate.id, userId: user.id } + : { id: oldApplicationTemplate.id } await ApplicationTemplateManager.update(where, updateApplicationTemplateData, transaction) } @@ -104,13 +102,13 @@ const updateApplicationTemplateEndPoint = async function (applicationTemplateDat // Remove name before storing delete applicationTemplateData.application.name - const oldApplicationTemplate = await ApplicationTemplateManager.findOne({ name, userId: user.id }, transaction) + const oldApplicationTemplate = await ApplicationTemplateManager.findOne({ name }, transaction) if (!oldApplicationTemplate) { return createApplicationTemplateEndPoint({ ...applicationTemplateData, name }, user, isCLI, transaction) } if (applicationTemplateData.name) { - await _checkForDuplicateName(applicationTemplateData.name, oldApplicationTemplate.id, user.id || oldApplicationTemplate.userId, transaction) + await _checkForDuplicateName(applicationTemplateData.name, oldApplicationTemplate.id, transaction) } const applicationTemplateDBModel = { @@ -122,7 +120,7 @@ const updateApplicationTemplateEndPoint = async function (applicationTemplateDat const updateApplicationTemplateData = AppHelper.deleteUndefinedFields(applicationTemplateDBModel) const where = isCLI ? { id: oldApplicationTemplate.id } - : { id: oldApplicationTemplate.id, userId: user.id } + : { id: oldApplicationTemplate.id } await ApplicationTemplateManager.update(where, updateApplicationTemplateData, transaction) if (applicationTemplateData.variables) { @@ -157,7 +155,6 @@ const _updateVariables = async function (applicationTemplateId, variables, user, const getUserApplicationTemplatesEndPoint = async function (user, isCLI, transaction) { const application = { - userId: user.id } const attributes = { exclude: ['created_at', 'updated_at'] } @@ -193,7 +190,7 @@ const getAllApplicationTemplatesEndPoint = async function (isCLI, transaction) { async function getApplicationTemplate (conditions, user, isCLI, transaction) { const where = isCLI ? { ...conditions } - : { ...conditions, userId: user.id } + : { ...conditions } const attributes = { exclude: ['created_at', 'updated_at'] } const application = await ApplicationTemplateManager.findOnePopulated(where, attributes, transaction) @@ -210,7 +207,7 @@ const getApplicationTemplateEndPoint = async function (name, user, isCLI, transa const getApplicationDataFromTemplate = async function (deploymentData, user, isCLI, transaction) { await Validator.validate(deploymentData, Validator.schemas.applicationTemplateDeploy) - const applicationTemplateDBObject = await ApplicationTemplateManager.findOnePopulated({ name: deploymentData.name, userId: user.id }, transaction) + const applicationTemplateDBObject = await ApplicationTemplateManager.findOnePopulated({ name: deploymentData.name }, transaction) if (!applicationTemplateDBObject) { throw new Errors.NotFoundError(ErrorMessages.INVALID_APPLICATION_TEMPLATE_NAME, deploymentData.name) } @@ -251,11 +248,11 @@ const getApplicationDataFromTemplate = async function (deploymentData, user, isC return newApplication } -const _checkForDuplicateName = async function (name, applicationId, userId, transaction) { +const _checkForDuplicateName = async function (name, applicationId, transaction) { if (name) { const where = applicationId - ? { name: name, userId: userId, id: { [Op.ne]: applicationId } } - : { name: name, userId: userId } + ? { name: name, id: { [Op.ne]: applicationId } } + : { name: name } const result = await ApplicationTemplateManager.findOne(where, transaction) if (result) { diff --git a/src/services/catalog-service.js b/src/services/catalog-service.js index b5920387d..baaf027eb 100644 --- a/src/services/catalog-service.js +++ b/src/services/catalog-service.js @@ -28,7 +28,7 @@ const MicroseriveStates = require('../enums/microservice-state') const createCatalogItemEndPoint = async function (data, user, transaction) { await Validator.validate(data, Validator.schemas.catalogItemCreate) - await _checkForDuplicateName(data.name, { userId: user.id }, transaction) + await _checkForDuplicateName(data.name, transaction) await _checkForRestrictedPublisher(data.publisher) const catalogItem = await _createCatalogItem(data, user, transaction) await _createCatalogImages(data, catalogItem, transaction) @@ -48,8 +48,7 @@ const updateCatalogItemEndPoint = async function (id, data, user, isCLI, transac id: id } : { - id: id, - userId: user.id + id: id } data.id = id @@ -62,13 +61,12 @@ const listCatalogItemsEndPoint = async function (user, isCLI, transaction) { const where = isCLI ? {} : { - [Op.or]: [{ userId: user.id }, { userId: null }], [Op.or]: [{ category: { [Op.ne]: 'SYSTEM' } }, { category: null }] } const attributes = isCLI ? {} - : { exclude: ['userId'] } + : {} const catalogItems = await CatalogItemManager.findAllWithDependencies(where, attributes, transaction) return { @@ -81,13 +79,12 @@ async function getCatalogItem (id, user, isCLI, transaction) { ? { id: id } : { id: id, - [Op.or]: [{ userId: user.id }, { userId: null }], [Op.or]: [{ category: { [Op.ne]: 'SYSTEM' } }, { category: null }] } const attributes = isCLI ? {} - : { exclude: ['userId'] } + : {} const item = await CatalogItemManager.findOneWithDependencies(where, attributes, transaction) if (!item) { @@ -106,7 +103,6 @@ const deleteCatalogItemEndPoint = async function (id, user, isCLI, transaction) id: id } : { - userId: user.id, id: id } @@ -128,8 +124,7 @@ async function getNetworkCatalogItem (transaction) { name: 'Networking Tool', category: 'SYSTEM', publisher: 'Eclipse ioFog', - registry_id: 1, - user_id: null + registry_id: 1 }, transaction) } @@ -138,8 +133,7 @@ async function getRouterCatalogItem (transaction) { name: DBConstants.ROUTER_CATALOG_NAME, category: 'SYSTEM', publisher: 'Eclipse ioFog', - registry_id: 1, - user_id: null + registry_id: 1 }, transaction) } @@ -148,8 +142,7 @@ async function getProxyCatalogItem (transaction) { name: DBConstants.PROXY_CATALOG_NAME, category: 'SYSTEM', publisher: 'Eclipse ioFog', - registry_id: 1, - user_id: null + registry_id: 1 }, transaction) } @@ -158,8 +151,7 @@ async function getPortRouterCatalogItem (transaction) { name: DBConstants.PORT_ROUTER_CATALOG_NAME, category: 'SYSTEM', publisher: 'Eclipse ioFog', - registry_id: 1, - user_id: null + registry_id: 1 }, transaction) } @@ -168,8 +160,7 @@ async function getBluetoothCatalogItem (transaction) { name: 'RESTBlue', category: 'SYSTEM', publisher: 'Eclipse ioFog', - registry_id: 1, - user_id: null + registry_id: 1 }, transaction) } @@ -178,16 +169,15 @@ async function getHalCatalogItem (transaction) { name: 'HAL', category: 'SYSTEM', publisher: 'Eclipse ioFog', - registry_id: 1, - user_id: null + registry_id: 1 }, transaction) } const _checkForDuplicateName = async function (name, item, transaction) { if (name) { const where = item.id - ? { [Op.or]: [{ userId: item.userId }, { userId: null }], name: name, id: { [Op.ne]: item.id } } - : { [Op.or]: [{ userId: item.userId }, { userId: null }], name: name } + ? { [Op.or]: name: name, id: { [Op.ne]: item.id } } + : { [Op.or]: name: name } const result = await CatalogItemManager.findOne(where, transaction) if (result) { @@ -221,8 +211,7 @@ const _createCatalogItem = async function (data, user, transaction) { ramRequired: data.ramRequired, picture: data.picture, isPublic: data.isPublic, - registryId: data.registryId, - userId: user.id + registryId: data.registryId } catalogItem = AppHelper.deleteUndefinedFields(catalogItem) diff --git a/src/services/control-plane.js b/src/services/control-plane.js deleted file mode 100644 index ab0c01417..000000000 --- a/src/services/control-plane.js +++ /dev/null @@ -1 +0,0 @@ -// \ No newline at end of file diff --git a/src/services/controller-service.js b/src/services/controller-service.js index 8b01bdf0b..79fa63aeb 100644 --- a/src/services/controller-service.js +++ b/src/services/controller-service.js @@ -12,7 +12,6 @@ */ const ioFogTypesManager = require('../data/managers/iofog-type-manager') -const Config = require('../config') const TransactionDecorator = require('../decorators/transaction-decorator') const packageJson = require('../../package') const AppHelper = require('../helpers/app-helper') @@ -35,13 +34,6 @@ const getFogTypes = async function (isCLI, transaction) { } } -const emailActivation = async function (isCLI) { - const emailActivation = await Config.get('Email:ActivationEnabled', false) - return { - isEmailActivationEnabled: emailActivation - } -} - const statusController = async function (isCLI) { let status @@ -68,7 +60,6 @@ const getVersion = async function (isCLI) { module.exports = { getFogTypes: TransactionDecorator.generateTransaction(getFogTypes), - emailActivation: emailActivation, statusController: statusController, getVersion: getVersion } diff --git a/src/services/diagnostic-service.js b/src/services/diagnostic-service.js index f16506720..3c5139128 100644 --- a/src/services/diagnostic-service.js +++ b/src/services/diagnostic-service.js @@ -47,7 +47,7 @@ const getMicroserviceStraceData = async function (uuid, data, user, isCLI, trans const microserviceWhere = isCLI ? { uuid: uuid } - : { uuid: uuid, userId: user.id } + : { uuid: uuid } const microservice = await MicroserviceManager.findOne(microserviceWhere, transaction) if (!microservice) { throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.INVALID_MICROSERVICE_UUID, uuid)) @@ -80,7 +80,7 @@ const postMicroserviceStraceDatatoFtp = async function (uuid, data, user, isCLI, const microserviceWhere = isCLI ? { uuid: uuid } - : { uuid: uuid, userId: user.id } + : { uuid: uuid } const microservice = await MicroserviceManager.findOne(microserviceWhere, transaction) if (!microservice) { throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.INVALID_MICROSERVICE_UUID, uuid)) @@ -103,12 +103,11 @@ const postMicroserviceStraceDatatoFtp = async function (uuid, data, user, isCLI, const postMicroserviceImageSnapshotCreate = async function (microserviceUuid, user, isCLI, transaction) { const where = isCLI ? { - uuid: microserviceUuid - } + uuid: microserviceUuid + } : { - uuid: microserviceUuid, - userId: user.id - } + uuid: microserviceUuid + } const microservice = await MicroserviceManager.findOneWithDependencies(where, {}, transaction) @@ -130,12 +129,11 @@ const postMicroserviceImageSnapshotCreate = async function (microserviceUuid, us const getMicroserviceImageSnapshot = async function (microserviceUuid, user, isCLI, transaction) { const where = isCLI ? { - uuid: microserviceUuid - } + uuid: microserviceUuid + } : { - uuid: microserviceUuid, - userId: user.id - } + uuid: microserviceUuid + } const microservice = await MicroserviceManager.findOneWithDependencies(where, {}, transaction) if (!microservice) { throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.INVALID_MICROSERVICE_UUID, microserviceUuid)) diff --git a/src/services/edge-resource-service.js b/src/services/edge-resource-service.js index a7b3a6537..ba231b567 100644 --- a/src/services/edge-resource-service.js +++ b/src/services/edge-resource-service.js @@ -24,13 +24,13 @@ const Validator = require('../schemas') const ChangeTrackingService = require('./change-tracking-service') async function listEdgeResources (user, transaction) { - const edgeResources = await EdgeResourceManager.findAllWithOrchestrationTags({ userId: user.id }, transaction) + const edgeResources = await EdgeResourceManager.findAllWithOrchestrationTags(transaction) return edgeResources.map(buildGetObject) } async function getEdgeResource ({ name, version }, user, transaction) { if (version) { - const resource = await EdgeResourceManager.findOneWithOrchestrationTags({ name, version, userId: user.id }, transaction) + const resource = await EdgeResourceManager.findOneWithOrchestrationTags({ name, version }, transaction) if (!resource) { throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.NOT_FOUND_RESOURCE_NAME_VERSION, name, version)) } @@ -39,7 +39,7 @@ async function getEdgeResource ({ name, version }, user, transaction) { const result = { ...resource.toJSON(), interface: (intrface || { toJSON: () => {} }).toJSON() } return buildGetObject(result) } else { - const resources = await EdgeResourceManager.findAllWithOrchestrationTags({ name, userId: user.id }, transaction) + const resources = await EdgeResourceManager.findAllWithOrchestrationTags({ name }, transaction) if (!resources.length) { return [] } @@ -158,12 +158,11 @@ async function _updateOrchestrationTags (tagArray, edgeResourceModel, transactio async function createEdgeResource (edgeResourceData, user, transaction) { await Validator.validate(edgeResourceData, Validator.schemas.edgeResourceCreate) const { name, description, version, orchestrationTags, interfaceProtocol, display, custom } = edgeResourceData - const existingResource = await EdgeResourceManager.findOne({ name, version, userId: user.id }, transaction) + const existingResource = await EdgeResourceManager.findOne({ name, version }, transaction) if (existingResource) { throw new Errors.ValidationError(AppHelper.formatMessage(ErrorMessages.DUPLICATE_RESOURCE_NAME_VERSION, name, version)) } const resourceData = { - userId: user.id, name, description, orchestrationTags, @@ -195,7 +194,7 @@ async function createEdgeResource (edgeResourceData, user, transaction) { async function updateEdgeResourceEndpoint (edgeResourceData, { name: oldName, version }, user, transaction) { await Validator.validate(edgeResourceData, Validator.schemas.edgeResourceUpdate) - const oldData = await EdgeResourceManager.findOne({ name: oldName, version, userId: user.id }, transaction) + const oldData = await EdgeResourceManager.findOne({ name: oldName, version }, transaction) if (!oldData) { if (!edgeResourceData.name) { edgeResourceData.name = oldName @@ -210,7 +209,6 @@ async function updateEdgeResourceEndpoint (edgeResourceData, { name: oldName, ve } const { name, description, orchestrationTags, interfaceProtocol, display, custom } = edgeResourceData const newData = { - userId: user.id, name, description, orchestrationTags, @@ -227,7 +225,7 @@ async function updateEdgeResourceEndpoint (edgeResourceData, { name: oldName, ve AppHelper.deleteUndefinedFields(newData) if (newData.name && newData.name !== oldData.name) { const newVersion = newData.version ? newData.version : version - const existingResource = await EdgeResourceManager.findOne({ name, version: newVersion, userId: user.id }, transaction) + const existingResource = await EdgeResourceManager.findOne({ name, version: newVersion }, transaction) if (existingResource) { throw new Errors.DuplicatePropertyError(AppHelper.formatMessage(ErrorMessages.DUPLICATE_RESOURCE_NAME_VERSION, name, newVersion)) } @@ -247,7 +245,7 @@ async function updateEdgeResourceEndpoint (edgeResourceData, { name: oldName, ve } async function deleteEdgeResource ({ name, version }, user, transaction) { - const resource = await EdgeResourceManager.findOne({ name, version, userId: user.id }, transaction) + const resource = await EdgeResourceManager.findOne({ name, version }, transaction) if (!resource) { throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.NOT_FOUND_RESOURCE_NAME_VERSION, name, version)) } @@ -257,15 +255,15 @@ async function deleteEdgeResource ({ name, version }, user, transaction) { await agent.removeTags(tags) await ChangeTrackingService.update(agent.uuid, ChangeTrackingService.events.edgeResources, transaction) } - await EdgeResourceManager.delete({ name, version, userId: user.id }, transaction) + await EdgeResourceManager.delete({ name, version }, transaction) } async function linkEdgeResource ({ name, version }, uuid, user, transaction) { - const resource = await EdgeResourceManager.findOne({ name, version, userId: user.id }, transaction) + const resource = await EdgeResourceManager.findOne({ name, version }, transaction) if (!resource) { throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.NOT_FOUND_RESOURCE_NAME_VERSION, name, version)) } - const agent = await FogManager.findOne({ uuid, userId: user.id }, transaction) + const agent = await FogManager.findOne({ uuid }, transaction) if (!agent) { throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.NOT_FOUND_AGENT_NAME, uuid)) } @@ -277,11 +275,11 @@ async function linkEdgeResource ({ name, version }, uuid, user, transaction) { } async function unlinkEdgeResource ({ name, version }, uuid, user, transaction) { - const resource = await EdgeResourceManager.findOne({ name, version, userId: user.id }, transaction) + const resource = await EdgeResourceManager.findOne({ name, version }, transaction) if (!resource) { throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.NOT_FOUND_RESOURCE_NAME_VERSION, name, version)) } - const agent = await FogManager.findOne({ uuid, userId: user.id }, transaction) + const agent = await FogManager.findOne({ uuid }, transaction) if (!agent) { throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.NOT_FOUND_AGENT_NAME, uuid)) } diff --git a/src/services/email-activation-code-service.js b/src/services/email-activation-code-service.js deleted file mode 100644 index d395a0d55..000000000 --- a/src/services/email-activation-code-service.js +++ /dev/null @@ -1,64 +0,0 @@ -/* - * ******************************************************************************* - * * Copyright (c) 2023 Datasance Teknoloji A.S. - * * - * * This program and the accompanying materials are made available under the - * * terms of the Eclipse Public License v. 2.0 which is available at - * * http://www.eclipse.org/legal/epl-2.0 - * * - * * SPDX-License-Identifier: EPL-2.0 - * ******************************************************************************* - * - */ - -const EmailActivationCodeManager = require('../data/managers/email-activation-code-manager') -const AppHelper = require('../helpers/app-helper') -const ErrorMessages = require('../helpers/error-messages') - -const generateActivationCode = async function (transaction) { - while (true) { - const newActivationCode = AppHelper.generateRandomString(16) - const exists = await EmailActivationCodeManager.getByActivationCode(newActivationCode, transaction) - if (!exists) { - const activationCodeExpiryTime = new Date().getTime() + ((60 * 60 * 24 * 3) * 1000) - return { - activationCode: newActivationCode, - expirationTime: activationCodeExpiryTime - } - } - } -} - -const saveActivationCode = async function (userId, activationCodeData, transaction) { - const activationCode = activationCodeData.activationCode - const expirationTime = activationCodeData.expirationTime - - try { - const code = await EmailActivationCodeManager.createActivationCode(userId, activationCode, expirationTime, transaction) - return code - } catch (errMsg) { - throw new Error(ErrorMessages.UNABLE_TO_CREATE_ACTIVATION_CODE) - } -} - -const verifyActivationCode = async function (activationCode, transaction) { - try { - const value = await EmailActivationCodeManager.verifyActivationCode(activationCode, transaction) - return value - } catch (errMsg) { - throw new Error(ErrorMessages.UNABLE_TO_GET_ACTIVATION_CODE) - } -} - -const deleteActivationCode = async function (activationCode, transaction) { - return EmailActivationCodeManager.delete({ - activationCode: activationCode - }, transaction) -} - -module.exports = { - generateActivationCode: generateActivationCode, - saveActivationCode: saveActivationCode, - verifyActivationCode: verifyActivationCode, - deleteActivationCode: deleteActivationCode -} diff --git a/src/services/iofog-service.js b/src/services/iofog-service.js index 74024e42b..06b1fce95 100644 --- a/src/services/iofog-service.js +++ b/src/services/iofog-service.js @@ -11,8 +11,6 @@ * */ -const request = require('request-promise') - const TransactionDecorator = require('../decorators/transaction-decorator') const AppHelper = require('../helpers/app-helper') const FogManager = require('../data/managers/iofog-manager') @@ -29,7 +27,6 @@ const MicroserviceManager = require('../data/managers/microservice-manager') const TagsManager = require('../data/managers/tags-manager') const MicroserviceService = require('./microservices-service') const EdgeResourceService = require('./edge-resource-service') -const config = require('../config') const RouterManager = require('../data/managers/router-manager') const MicroserviceExtraHostManager = require('../data/managers/microservice-extra-host-manager') const RouterConnectionManager = require('../data/managers/router-connection-manager') @@ -68,7 +65,6 @@ async function createFogEndPoint (fogData, user, isCLI, transaction) { dockerPruningFrequency: fogData.dockerPruningFrequency, availableDiskThreshold: fogData.availableDiskThreshold, isSystem: fogData.isSystem, - userId: user.id, host: fogData.host, routerId: null, timeZone: fogData.timeZone @@ -91,11 +87,6 @@ async function createFogEndPoint (fogData, user, isCLI, transaction) { throw new Errors.ValidationError(AppHelper.formatMessage(ErrorMessages.DUPLICATE_NAME, createFogData.name)) } - // Remove user if system fog - if (fogData.isSystem) { - fogData.userId = 0 - } - let defaultRouter, upstreamRouters if (fogData.routerMode === 'none') { const networkRouter = await RouterService.getNetworkRouter(fogData.networkRouter) @@ -118,7 +109,7 @@ async function createFogEndPoint (fogData, user, isCLI, transaction) { throw new Errors.ValidationError(ErrorMessages.HOST_IS_REQUIRED) } - await RouterService.createRouterForFog(fogData, fog.uuid, user.id, upstreamRouters) + await RouterService.createRouterForFog(fogData, fog.uuid, upstreamRouters) } const res = { @@ -137,10 +128,6 @@ async function createFogEndPoint (fogData, user, isCLI, transaction) { await ChangeTrackingService.update(createFogData.uuid, ChangeTrackingService.events.microserviceCommon, transaction) - try { - await informKubelet(fog.uuid, 'POST') - } catch (e) {} - return res } @@ -203,24 +190,14 @@ async function updateFogEndPoint (fogData, user, isCLI, transaction) { await _setTags(oldFog, fogData.tags, transaction) // If using REST API and not system fog. You must be the fog's user to access it - if (!oldFog.isSystem && !isCLI && oldFog.userId !== user.id) { + if (!oldFog.isSystem && !isCLI) { throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.INVALID_IOFOG_UUID, fogData.uuid)) } - // Set userId if moving fog from system to classic or from classic to system - if (!oldFog.isSystem && updateFogData.isSystem) { - updateFogData.userId = 0 - if (await FogManager.findOne({ isSystem: true }, transaction)) { - throw new Errors.ValidationError(AppHelper.formatMessage(ErrorMessages.DUPLICATE_SYSTEM_FOG)) - } - } else if (updateFogData.isSystem === false) { - updateFogData.userId = user.id - } - if (updateFogData.name) { const conflictQuery = isCLI ? { name: updateFogData.name, uuid: { [Op.not]: fogData.uuid } } - : { name: updateFogData.name, uuid: { [Op.not]: fogData.uuid }, userId: user.id } + : { name: updateFogData.name, uuid: { [Op.not]: fogData.uuid } } const conflict = await FogManager.findOne(conflictQuery, transaction) if (conflict) { throw new Errors.ValidationError(AppHelper.formatMessage(ErrorMessages.DUPLICATE_NAME, updateFogData.name)) @@ -252,19 +229,19 @@ async function updateFogEndPoint (fogData, user, isCLI, transaction) { // Only delete previous router if there is a network router if (router) { // New router mode is none, delete existing router - await _deleteFogRouter(fogData, user.id, transaction) + await _deleteFogRouter(fogData, transaction) } } else { const defaultRouter = await RouterManager.findOne({ isDefault: true }, transaction) const upstreamRouters = await RouterService.validateAndReturnUpstreamRouters(upstreamRoutersIofogUuid, oldFog.isSystem, defaultRouter) if (!router) { // Router does not exist yet - networkRouter = await RouterService.createRouterForFog(fogData, oldFog.uuid, user.id, upstreamRouters) + networkRouter = await RouterService.createRouterForFog(fogData, oldFog.uuid, upstreamRouters) } else { // Update existing router networkRouter = await RouterService.updateRouter(router, { messagingPort, interRouterPort, edgeRouterPort, isEdge: routerMode === 'edge', host - }, upstreamRouters, user.id) + }, upstreamRouters) await ChangeTrackingService.update(fogData.uuid, ChangeTrackingService.events.routerChanged, transaction) } } @@ -333,7 +310,7 @@ async function _updateProxyRouters (fogId, router, transaction) { } } -async function _deleteFogRouter (fogData, userId, transaction) { +async function _deleteFogRouter (fogData, transaction) { const router = await RouterManager.findOne({ iofogUuid: fogData.uuid }, transaction) const defaultRouter = await RouterManager.findOne({ isDefault: true }, transaction) @@ -359,7 +336,7 @@ async function _deleteFogRouter (fogData, userId, transaction) { } // Update router config - await RouterService.updateConfig(router.id, userId, transaction) + await RouterService.updateConfig(router.id, transaction) // Set routerChanged flag await ChangeTrackingService.update(router.iofogUuid, ChangeTrackingService.events.routerChanged, transaction) } @@ -393,17 +370,13 @@ async function deleteFogEndPoint (fogData, user, isCLI, transaction) { } // If using REST API and not system fog. You must be the fog's user to access it - if (!fog.isSystem && !isCLI && fog.userId !== user.id) { + if (!fog.isSystem && !isCLI) { throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.INVALID_IOFOG_UUID, fogData.uuid)) } - await _deleteFogRouter(fogData, user.id, transaction) + await _deleteFogRouter(fogData, transaction) await _processDeleteCommand(fog, transaction) - - try { - await informKubelet(fog.uuid, 'DELETE') - } catch (e) {} } function _getRouterUuid (router, defaultRouter) { @@ -472,7 +445,7 @@ function _mapTags (fog) { async function getFog (fogData, user, isCLI, transaction) { await Validator.validate(fogData, Validator.schemas.iofogGet) - const queryFogData = fogData.uuid ? { uuid: fogData.uuid } : { name: fogData.name, userId: user.id } + const queryFogData = fogData.uuid ? { uuid: fogData.uuid } : { name: fogData.name } const fog = await FogManager.findOneWithTags(queryFogData, transaction) if (!fog) { @@ -480,7 +453,7 @@ async function getFog (fogData, user, isCLI, transaction) { } // If using REST API and not system fog. You must be the fog's user to access it - if (!fog.isSystem && !isCLI && fog.userId !== user.id) { + if (!fog.isSystem && !isCLI) { throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.INVALID_IOFOG_UUID, fogData.uuid)) } @@ -499,7 +472,7 @@ async function getFogListEndPoint (filters, user, isCLI, isSystem, transaction) throw new Errors.AuthenticationError('Unauthorized') } - const queryFogData = isSystem ? { isSystem } : (isCLI ? {} : { userId: user.id, isSystem: false }) + const queryFogData = isSystem ? { isSystem } : (isCLI ? {} : { isSystem: false }) let fogs = await FogManager.findAllWithTags(queryFogData, transaction) fogs = _filterFogs(fogs, filters) @@ -529,7 +502,7 @@ async function generateProvisioningKeyEndPoint (fogData, user, isCLI, transactio } // If using REST API and not system fog. You must be the fog's user to access it - if (!fog.isSystem && !isCLI && fog.userId !== user.id) { + if (!fog.isSystem && !isCLI) { throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.INVALID_IOFOG_UUID, fogData.uuid)) } @@ -557,7 +530,7 @@ async function setFogVersionCommandEndPoint (fogVersionData, user, isCLI, transa } // If using REST API and not system fog. You must be the fog's user to access it - if (!fog.isSystem && !isCLI && fog.userId !== user.id) { + if (!fog.isSystem && !isCLI) { throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.INVALID_IOFOG_UUID, queryFogData.uuid)) } @@ -584,7 +557,7 @@ async function setFogRebootCommandEndPoint (fogData, user, isCLI, transaction) { } // If using REST API and not system fog. You must be the fog's user to access it - if (!fog.isSystem && !isCLI && fog.userId !== user.id) { + if (!fog.isSystem && !isCLI) { throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.INVALID_IOFOG_UUID, fogData.uuid)) } @@ -602,7 +575,7 @@ async function getHalHardwareInfoEndPoint (uuidObj, user, isCLI, transaction) { } // If using REST API and not system fog. You must be the fog's user to access it - if (!fog.isSystem && !isCLI && fog.userId !== user.id) { + if (!fog.isSystem && !isCLI) { throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.INVALID_IOFOG_UUID, uuidObj.uuid)) } @@ -622,7 +595,7 @@ async function getHalUsbInfoEndPoint (uuidObj, user, isCLI, transaction) { } // If using REST API and not system fog. You must be the fog's user to access it - if (!fog.isSystem && !isCLI && fog.userId !== user.id) { + if (!fog.isSystem && !isCLI) { throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.INVALID_IOFOG_UUID, uuidObj.uuid)) } @@ -678,7 +651,6 @@ async function _createHalMicroserviceForFog (fogData, oldFog, user, transaction) iofogUuid: fogData.uuid, rootHostAccess: true, logSize: Constants.MICROSERVICE_DEFAULT_LOG_SIZE, - userId: oldFog ? oldFog.userId : user.id, configLastUpdated: Date.now() } @@ -706,7 +678,6 @@ async function _createBluetoothMicroserviceForFog (fogData, oldFog, user, transa iofogUuid: fogData.uuid, rootHostAccess: true, logSize: Constants.MICROSERVICE_DEFAULT_LOG_SIZE, - userId: oldFog ? oldFog.userId : user.id, configLastUpdated: Date.now() } @@ -723,19 +694,6 @@ async function _deleteBluetoothMicroserviceByFog (fogData, transaction) { await MicroserviceManager.delete(deleteBluetoothMicroserviceData, transaction) } -const informKubelet = function (iofogUuid, method) { - const kubeletUri = config.get('Kubelet:Uri') - const options = { - uri: kubeletUri + '/node', - qs: { - uuid: iofogUuid - }, - method: method - } - - return request(options) -} - async function setFogPruneCommandEndPoint (fogData, user, isCLI, transaction) { await Validator.validate(fogData, Validator.schemas.iofogPrune) @@ -747,7 +705,7 @@ async function setFogPruneCommandEndPoint (fogData, user, isCLI, transaction) { } // If using REST API and not system fog. You must be the fog's user to access it - if (!fog.isSystem && !isCLI && fog.userId !== user.id) { + if (!fog.isSystem && !isCLI) { throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.INVALID_IOFOG_UUID, fogData.uuid)) } diff --git a/src/services/kubelet-access-token-service.js b/src/services/kubelet-access-token-service.js deleted file mode 100644 index 0ccc5c379..000000000 --- a/src/services/kubelet-access-token-service.js +++ /dev/null @@ -1,48 +0,0 @@ -/* - * ******************************************************************************* - * * Copyright (c) 2023 Datasance Teknoloji A.S. - * * - * * This program and the accompanying materials are made available under the - * * terms of the Eclipse Public License v. 2.0 which is available at - * * http://www.eclipse.org/legal/epl-2.0 - * * - * * SPDX-License-Identifier: EPL-2.0 - * ******************************************************************************* - * - */ - -const AppHelper = require('../helpers/app-helper') -const KubeletAccessTokenManager = require('../data/managers/kubelet-access-token-manager') - -const Config = require('../config') - -const generateAccessToken = async function (transaction) { - while (true) { - const newAccessToken = AppHelper.generateAccessToken() - const exists = await KubeletAccessTokenManager.findOne({ - token: newAccessToken - }, transaction) - if (!exists) { - const accessTokenExpiryTime = Date.now() + Config.get('Settings:KubeletTokenExpirationIntervalSeconds') * 9999999 - return { - token: newAccessToken, - expirationTime: accessTokenExpiryTime - } - } - } -} - -async function updateAccessToken (userId, newAccessToken, transaction) { - return KubeletAccessTokenManager.updateOrCreate({ - userId: userId - }, { - userId: userId, - token: newAccessToken.token, - expirationTime: newAccessToken.expirationTime - }, transaction) -} - -module.exports = { - generateAccessToken, - updateAccessToken -} diff --git a/src/services/kubelet-service.js b/src/services/kubelet-service.js deleted file mode 100644 index c5afd3072..000000000 --- a/src/services/kubelet-service.js +++ /dev/null @@ -1,432 +0,0 @@ -/* - * ******************************************************************************* - * * Copyright (c) 2023 Datasance Teknoloji A.S. - * * - * * This program and the accompanying materials are made available under the - * * terms of the Eclipse Public License v. 2.0 which is available at - * * http://www.eclipse.org/legal/epl-2.0 - * * - * * SPDX-License-Identifier: EPL-2.0 - * ******************************************************************************* - * - */ - -const moment = require('moment') - -const AppHelper = require('../helpers/app-helper') -const ErrorMessages = require('../helpers/error-messages') -const Errors = require('../helpers/errors') -const ApplicationService = require('./application-service') -const FogManager = require('../data/managers/iofog-manager') -const IOFogService = require('./iofog-service') -const KubeletAccessTokenService = require('./kubelet-access-token-service') -const logger = require('../logger') -const MicroservicesService = require('./microservices-service') -const MicroserviceStatusManager = require('../data/managers/microservice-status-manager') -// const SchedulerAccessTokenService = require('./scheduler-access-token-service') -const TransactionDecorator = require('../decorators/transaction-decorator') - -const NODE_CAPACITY = 100 - -const processPodPayload = function (createPodData, fogNodeUuid) { - const msMetadata = JSON.parse(createPodData.metadata.annotations.microservices) - const applicationDescription = { - metadata: createPodData, - node: fogNodeUuid - } - - const applicationData = { - name: createPodData.metadata.name, - isActivated: true, - description: Buffer.from(JSON.stringify(applicationDescription)).toString('base64') - } - - const microservices = microservicesTopologicalOrder(msMetadata) - - return { - applicationData, - microservices - } -} - -const kubeletCreatePod = async function (createPodData, fogNodeUuid, user, transaction) { - const podPayload = processPodPayload(createPodData, fogNodeUuid) - const { applicationData, microservices } = podPayload - - const applications = await ApplicationService.getAllApplicationsEndPoint(false, transaction) - let application = applications.applications.find((application) => application.name === applicationData.name) - if (!application) { - application = await ApplicationService.createApplicationEndPoint(applicationData, user, false, transaction) - } - - const existingMicroservices = await MicroservicesService.listMicroservicesEndPoint(application.id, user, false, transaction) - - const microservicesIds = [] - for (const ms of microservices) { - const name = `${applicationData.name}-${ms.name}` - const existingMicroservice = existingMicroservices.microservices.find((it) => it.name === name) - if (existingMicroservice) { - microservicesIds.push(existingMicroservice.uuid) - continue - } - - ms.routes = ms.routes || [] - ms.routes = ms.routes.map((route) => { - if (!route.startsWith('@')) { - return route - } - const routeId = route.substr(1) * 1 - const idx = microservices.findIndex((it) => it.originalIndex === routeId) - return microservicesIds[idx] - }) - - const microserviceData = { - name: name, - config: ms.config, - catalogItemId: ms['catalog-item-id'], - applicationId: application.id, - iofogUuid: fogNodeUuid, - rootHostAccess: ms['host-access'], - volumeMappings: ms['volume-mappings'] || [], - ports: ms.ports || [], - routes: ms.routes || [] - } - if (ms.env && ms.env.length > 0) { - microserviceData.env = ms.env - } - if (ms.cmd && ms.cmd.length > 0) { - microserviceData.cmd = ms.cmd - } - - const microservice = await MicroservicesService.createMicroserviceEndPoint(microserviceData, user, false, transaction) - microservicesIds.push(microservice.uuid) - } -} - -const kubeletUpdatePod = async function (uploadPodData, fogNodeUuid, user, transaction) { - // Not supported yet. - // const podPayload = processPodPayload(uploadPodData, fogNodeUuid) - // const { applicationData, microservices } = podPayload - - // const applications = await ApplicationService.getAllApplicationsEndPoint(false, transaction) - // const application = applications.applications.find((application) => application.name === applicationData.name) - // if (!application) { - // throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.INVALID_FLOW_ID, applicationData.name)) - // } - - // const existingMicroservices = await MicroservicesService.listMicroservicesEndPoint(application.id, user, false, transaction) - // const msDup = [].concat(microservices) - // const toDelete = [] - // existingMicroservices.forEach((ms) => { - // const name = `${applicationData.name}-${ms.name}` - // const idx = msDup.findIndex((it) => it.name === name) - - // if (!idx) { - // toDelete.push(ms) - // } else { - // toUpdate.push(msDup[idx]) - // msDup = msDup.splice(idx, 1) - // } - // }) - - // msDup.map((ms) => { - // const name = `${applicationData.name}-${ms.name}` - - // const microserviceData = { - // name: name, - // config: ms.config, - // catalogItemId: ms['catalog-item-id'], - // applicationId: application.id, - // iofogUuid: fogNodeUuid, - // rootHostAccess: ms['host-access'], - // volumeMappings: ms['volume-mappings'] || [], - // ports: ms.ports || [], - // routes: ms.routes || [] - // } - // if (ms.env && ms.env.length > 0) { - // microserviceData.env = ms.env - // } - // if (ms.cmd && ms.cmd.length > 0) { - // microserviceData.cmd = ms.cmd - // } - - // return microserviceData - // }) -} - -const kubeletDeletePod = async function (podData, fogNodeUuid, user, transaction) { - const applicationName = podData.metadata.name - - const applications = await ApplicationService.getAllApplicationsEndPoint(false, transaction) - const application = applications.applications.find((application) => application.name === applicationName) - if (!application) { - throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.INVALID_IOFOG_UUID, fogNodeUuid)) - } - - const existingMicroservices = await MicroservicesService.listMicroservicesEndPoint(application.id, user, false, transaction) - existingMicroservices.microservices.forEach(async (ms) => { - await MicroservicesService.deleteMicroserviceEndPoint(ms.uuid, { withCleanup: true }, user, false, transaction) - }) - - await ApplicationService.deleteApplicationEndPoint(application.id, user, false, transaction) -} - -const kubeletGetPod = async function (namespace, name, fogNodeUuid, user, transaction) { - const application = await ApplicationService.getApplicationByName(name, user, false, transaction) - - return JSON.parse(Buffer.from(application.description, 'base64').toString('utf8')).metadata -} - -const kubeletGetContainerLogs = async function (namespace, podName, containerName, tail, fogNodeUuid, user, transaction) { - // Not supported yet -} - -const kubeletGetPodStatus = async function (namespace, name, fogNodeUuid, user, transaction) { - const fog = await FogManager.findOne({ uuid: fogNodeUuid }, transaction) - const changeFrequency = (fog && fog.changeFrequency) || 60 - - const application = await ApplicationService.getApplicationByName(name, user, false, transaction) - const microservices = await MicroservicesService.listMicroservicesEndPoint(application.id, user, false, transaction) - const pod = JSON.parse(Buffer.from(application.description, 'base64').toString('utf8')).metadata - - for (const ms of microservices.microservices) { - const status = await MicroserviceStatusManager.findOne({ microserviceUuid: ms.uuid }, transaction) - ms.status = status.dataValues - ms.status.alive = moment().diff(moment(ms.status.updated_at), 'seconds') <= (changeFrequency * 2) - } - - const phase = microservices.microservices.every((ms) => ms.status.status === 'RUNNING') ? 'Running' : 'Pending' - const alive = microservices.microservices.every((ms) => ms.status.alive) - const status = { - phase: phase, - startTime: (alive && phase === 'Running') ? moment(microservices.microservices[0].startTime).utc().toISOString() : null, - conditions: [ - { - Type: 'PodInitialized', - Status: 'True' - }, - { - Type: 'PodReady', - Status: (alive && phase === 'Running') ? 'True' : 'False' - }, - { - Type: 'PodScheduled', - Status: 'True' - } - ], - containerStatuses: [] - } - - status.containerStatuses = pod.spec.containers.map((c) => { - const microservice = microservices.microservices.find((ms) => ms.name === `${name}-${c.name}`) - - const containerState = {} - if (microservice.status.status === 'RUNNING') { - containerState.running = { startedAt: moment(microservice.status.startTime).utc().toISOString() } - } else { - containerState.waiting = { reason: microservice.status.status } - } - - return { - name: c.name, - imageID: microservice.uuid, - ready: alive && microservice.status.status === 'RUNNING', - restartCount: 0, - state: containerState, - containerId: microservice.status.containerId - } - }) - - return status -} - -const kubeletGetPods = async function (fogNodeUuid, user, transaction) { - const applications = await ApplicationService.getAllApplicationsEndPoint(false, transaction) - const pods = applications.applications - .reduce((prev, application) => { - try { - const podsInfo = JSON.parse(Buffer.from(application.description, 'base64').toString('utf8')) - if (podsInfo.node === fogNodeUuid) { - prev = prev.concat(podsInfo.metadata) - } - } catch (err) { - logger.error(err) - } - - return prev - }, []) - - return pods -} - -const kubeletGetCapacity = async function (fogNodeUuid, user, transaction) { - const node = await IOFogService.getFogEndPoint({ uuid: fogNodeUuid }, user, false, transaction) - - return { - cpu: node.cpuLimit, - memory: `${(node.memoryLimit).toFixed(0)}Mi`, - pods: `${NODE_CAPACITY}` - } -} - -const kubeletGetAllocatable = async function (fogNodeUuid, user, transaction) { - const node = await IOFogService.getFogEndPoint({ uuid: fogNodeUuid }, user, false, transaction) - - const pods = await kubeletGetPods(fogNodeUuid, user, transaction) - const allocatablePods = NODE_CAPACITY - (pods || []).length - - return { - cpu: node.cpuLimit - node.cpuUsage, - memory: `${(node.memoryLimit - node.memoryUsage).toFixed(0)}Mi`, - pods: allocatablePods < 0 ? 0 : allocatablePods - } -} - -const kubeletGetNodeConditions = async function (fogNodeUuid, user, transaction) { - const node = await IOFogService.getFogEndPoint({ uuid: fogNodeUuid }, user, false, transaction) - const now = moment().utc().toISOString() - const lastStatusTime = node.lastStatusTime ? moment(node.lastStatusTime).utc().toISOString() : null - return [ - { - type: 'Ready', - status: node.daemonStatus === 'RUNNING' ? 'True' : 'False', - lastHeartbeatTime: lastStatusTime, - lastTransitionTime: now, - reason: '', - message: node.daemonStatus - }, - { - type: 'OutOfDisk', - status: node.diskUsage >= node.diskLimit ? 'True' : 'False', - lastHeartbeatTime: lastStatusTime, - lastTransitionTime: now, - reason: '', - message: `Usage: ${node.diskUsage}, Limit: ${node.diskLimit}` - }, - { - type: 'MemoryPressure', - status: (node.memoryUsage / node.memoryLimit) >= 0.9 ? 'True' : 'False', - lastHeartbeatTime: lastStatusTime, - lastTransitionTime: now, - reason: '', - message: `Usage: ${node.memoryUsage}, Limit: ${node.memoryLimit}` - }, - { - type: 'DiskPressure', - status: (node.diskUsage / node.diskLimit) >= 0.9 ? 'True' : 'False', - lastHeartbeatTime: lastStatusTime, - lastTransitionTime: now, - reason: '', - message: `Usage: ${node.diskUsage}, Limit: ${node.diskLimit}` - }, - { - type: 'NetworkUnavailable', - status: 'False', - lastHeartbeatTime: lastStatusTime, - lastTransitionTime: now, - reason: '', - message: '' - } - ] -} - -const kubeletGetNodeAddresses = async function (fogNodeUuid, user, transaction) { - const node = await IOFogService.getFogEndPoint({ uuid: fogNodeUuid }, user, false, transaction) - return [ - { - type: 'InternalIP', - address: node.ipAddress ? node.ipAddress : '0.0.0.0' - }, - { - type: 'ExternalIP', - address: node.ipAddressExternal ? node.ipAddressExternal : '0.0.0.0' - } - ] -} - -const kubeletGetVkToken = async function (userId, transaction) { - const newAccessToken = await KubeletAccessTokenService.generateAccessToken(transaction) - await KubeletAccessTokenService.updateAccessToken(userId, newAccessToken, transaction) - - return { - userId: userId, - token: newAccessToken.token - } -} - -const kubeletGetSchedulerToken = async function (transaction) { - // Not implemented yet. - userId is undefined - // const newAccessToken = await SchedulerAccessTokenService.generateAccessToken(transaction) - // await SchedulerAccessTokenService.updateAccessToken(userId, newAccessToken, transaction) - - // return { - // userId: userId, - // token: newAccessToken.token - // } -} - -const microservicesTopologicalOrder = function (msMetadata) { - const microservices = [] - const graph = [] - msMetadata.forEach((ms, i) => { - graph[i] = { - edges: [] - } - - if (!ms.routes) { - return - } - - ms.routes.forEach((route) => { - if (route.startsWith('@')) { - graph[i].edges.push(route.substr(1)) - } - }) - }) - - const stack = msMetadata.reduce((prev, ms, i) => { - if (graph[i].edges.length === 0) { - return prev.concat(i) - } - - return prev - }, []) - - while (stack.length > 0) { - const n = stack.pop() - microservices.push(n) - graph.forEach((node, i) => { - if (!node.edges.length) { - return - } - - node.edges = node.edges.filter((e) => `${e}` !== `${n}`) - if (!node.edges.length) { - stack.push(i) - } - }) - } - - const hasCircuit = !!graph.filter((node) => !!node.edges.length).length - if (hasCircuit) { - throw new Error('Circular dependency!!!') - } - - return microservices.map((idx) => Object.assign({ originalIndex: idx }, msMetadata[idx])) -} - -module.exports = { - kubeletCreatePod: TransactionDecorator.generateTransaction(kubeletCreatePod), - kubeletUpdatePod: TransactionDecorator.generateTransaction(kubeletUpdatePod), - kubeletDeletePod: TransactionDecorator.generateTransaction(kubeletDeletePod), - kubeletGetPod: TransactionDecorator.generateTransaction(kubeletGetPod), - kubeletGetContainerLogs: TransactionDecorator.generateTransaction(kubeletGetContainerLogs), - kubeletGetPodStatus: TransactionDecorator.generateTransaction(kubeletGetPodStatus), - kubeletGetPods: TransactionDecorator.generateTransaction(kubeletGetPods), - kubeletGetCapacity: TransactionDecorator.generateTransaction(kubeletGetCapacity), - kubeletGetAllocatable: TransactionDecorator.generateTransaction(kubeletGetAllocatable), - kubeletGetNodeConditions: TransactionDecorator.generateTransaction(kubeletGetNodeConditions), - kubeletGetNodeAddresses: TransactionDecorator.generateTransaction(kubeletGetNodeAddresses), - kubeletGetVkToken: TransactionDecorator.generateTransaction(kubeletGetVkToken), - kubeletGetSchedulerToken: TransactionDecorator.generateTransaction(kubeletGetSchedulerToken) -} diff --git a/src/services/microservice-ports/default.js b/src/services/microservice-ports/default.js index b511a60cc..8ca6ac690 100644 --- a/src/services/microservice-ports/default.js +++ b/src/services/microservice-ports/default.js @@ -255,13 +255,12 @@ async function _createOrUpdateProxyMicroservice (mapping, networkRouter, hostUui name: 'Proxy', config: JSON.stringify({ mappings: [mapping], - networkRouter: networkRouter + networkRouter }), catalogItemId: proxyCatalogId, iofogUuid: hostUuid, rootHostAccess: true, - registryId: 1, - userId: user.id + registryId: 1 } const res = await MicroserviceManager.create(proxyMicroserviceData, transaction) await ChangeTrackingService.update(hostUuid, ChangeTrackingService.events.microserviceCommon, transaction) @@ -284,13 +283,15 @@ async function _createPublicPortMapping (microservice, portMappingData, user, tr const localMapping = `amqp:${queueName}=>${isTcp ? 'tcp' : 'http'}:${portMappingData.external}` const remoteMapping = `${isTcp ? 'tcp' : 'http'}:${portMappingData.publicPort}=>amqp:${queueName}` - const localProxy = !portMappingData.public.disabled ? await _createOrUpdateProxyMicroservice( - localMapping, - localNetworkRouter, - microservice.iofogUuid, - proxyCatalog.id, - user, - transaction) : null + const localProxy = !portMappingData.public.disabled + ? await _createOrUpdateProxyMicroservice( + localMapping, + localNetworkRouter, + microservice.iofogUuid, + proxyCatalog.id, + user, + transaction) + : null let remoteProxy if (portMappingData.publicHost) { @@ -300,13 +301,15 @@ async function _createPublicPortMapping (microservice, portMappingData, user, tr port: hostRouter.messagingPort } - remoteProxy = !portMappingData.public.disabled ? await _createOrUpdateProxyMicroservice( - remoteMapping, - remoteNetworkRouter, - portMappingData.publicHost.uuid, - proxyCatalog.id, - user, - transaction) : null + remoteProxy = !portMappingData.public.disabled + ? await _createOrUpdateProxyMicroservice( + remoteMapping, + remoteNetworkRouter, + portMappingData.publicHost.uuid, + proxyCatalog.id, + user, + transaction) + : null } const mappingData = { @@ -315,7 +318,6 @@ async function _createPublicPortMapping (microservice, portMappingData, user, tr portInternal: portMappingData.internal, portExternal: portMappingData.external, isUdp, - userId: microservice.userId, microserviceUuid: microservice.uuid } const port = await MicroservicePortManager.create(mappingData, transaction) @@ -391,7 +393,6 @@ async function _createSimplePortMapping (microservice, portMappingData, user, tr isProxy: false, portInternal: portMappingData.internal, portExternal: portMappingData.external, - userId: microservice.userId, isUdp: portMappingData.protocol.toLowerCase() === 'udp', microserviceUuid: microservice.uuid } @@ -451,7 +452,7 @@ async function buildPublicPortMapping (pm, mapping, transaction) { enabled: !!publicPortMapping.localProxyId } mapping.public.router = { - port: port, + port, host: hostFog.isSystem ? DEFAULT_ROUTER_NAME : hostFog.uuid } } @@ -472,20 +473,20 @@ async function switchOnUpdateFlagsForMicroservicesForPortMapping (microservice, async function listPortMappings (microserviceUuid, user, isCLI, transaction) { const where = isCLI ? { uuid: microserviceUuid } - : { uuid: microserviceUuid, userId: user.id } + : { uuid: microserviceUuid } const microservice = await MicroserviceManager.findOne(where, transaction) if (!microservice) { throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.INVALID_MICROSERVICE_UUID, microserviceUuid)) } - const portsPairs = await MicroservicePortManager.findAll({ microserviceUuid: microserviceUuid }, transaction) + const portsPairs = await MicroservicePortManager.findAll({ microserviceUuid }, transaction) return _buildPortsList(portsPairs, transaction) } async function deletePortMapping (microserviceUuid, internalPort, user, isCLI, transaction) { const where = isCLI ? { uuid: microserviceUuid } - : { uuid: microserviceUuid, userId: user.id } + : { uuid: microserviceUuid } const microservice = await MicroserviceManager.findOne(where, transaction) if (!microservice) { @@ -515,7 +516,7 @@ async function deletePortMappings (microservice, user, transaction) { } async function getPortMappings (microserviceUuid, transaction) { - return MicroservicePortManager.findAll({ microserviceUuid: microserviceUuid }, transaction) + return MicroservicePortManager.findAll({ microserviceUuid }, transaction) } function listAllPublicPorts (user, transaction) { @@ -523,16 +524,16 @@ function listAllPublicPorts (user, transaction) { } module.exports = { - validatePublicPortAppHostTemplate: validatePublicPortAppHostTemplate, - validatePortMappings: validatePortMappings, - validatePortMapping: validatePortMapping, - movePublicPortsToNewFog: movePublicPortsToNewFog, - switchOnUpdateFlagsForMicroservicesForPortMapping: switchOnUpdateFlagsForMicroservicesForPortMapping, - createPortMapping: createPortMapping, - buildPublicPortMapping: buildPublicPortMapping, - listPortMappings: listPortMappings, - deletePortMapping: deletePortMapping, - deletePortMappings: deletePortMappings, - getPortMappings: getPortMappings, - listAllPublicPorts: listAllPublicPorts + validatePublicPortAppHostTemplate, + validatePortMappings, + validatePortMapping, + movePublicPortsToNewFog, + switchOnUpdateFlagsForMicroservicesForPortMapping, + createPortMapping, + buildPublicPortMapping, + listPortMappings, + deletePortMapping, + deletePortMappings, + getPortMappings, + listAllPublicPorts } diff --git a/src/services/microservice-ports/proxy.js b/src/services/microservice-ports/proxy.js index 76e3342be..0a7e2dab2 100644 --- a/src/services/microservice-ports/proxy.js +++ b/src/services/microservice-ports/proxy.js @@ -52,8 +52,7 @@ async function _createOrUpdatePortRouterMicroservice (existingProxy, localPort, catalogItemId: portRouterCatalogId, iofogUuid: hostUuid, rootHostAccess: true, - registryId: 1, - userId: user.id + registryId: 1 } const res = await MicroserviceManager.create(proxyMicroserviceData, transaction) await ChangeTrackingService.update(hostUuid, ChangeTrackingService.events.microserviceCommon, transaction) @@ -92,7 +91,6 @@ async function createProxyPortMapping (microservice, portMappingData, user, tran portInternal: portMappingData.internal, portExternal: portMappingData.external, isUdp: protocol === 'udp', - userId: microservice.userId, microserviceUuid: microservice.uuid } const port = await MicroservicePortManager.create(mappingData, transaction) diff --git a/src/services/microservices-service.js b/src/services/microservices-service.js index f8bb4a579..ec65e00d8 100644 --- a/src/services/microservices-service.js +++ b/src/services/microservices-service.js @@ -48,9 +48,7 @@ async function listMicroservicesEndPoint (opt, user, isCLI, transaction) { } const where = application ? { applicationId: application.id, delete: false } : { delete: false, applicationId: { [Op.ne]: null } } - if (!isCLI) { - where.userId = user.id - } + const microservices = await MicroserviceManager.findAllExcludeFields(where, transaction) const res = await Promise.all(microservices.map(async (microservice) => { @@ -64,7 +62,7 @@ async function listMicroservicesEndPoint (opt, user, isCLI, transaction) { async function getMicroserviceEndPoint (microserviceUuid, user, isCLI, transaction) { if (!isCLI) { - await _validateMicroserviceOnGet(user.id, microserviceUuid, transaction) + await _validateMicroserviceOnGet(microserviceUuid, transaction) } const microservice = await MicroserviceManager.findOneExcludeFields({ @@ -113,11 +111,11 @@ async function _validateLocalAppHostTemplate (extraHost, templateArgs, msvc, tra return extraHost } -async function _validateAppHostTemplate (extraHost, templateArgs, userId, transaction) { +async function _validateAppHostTemplate (extraHost, templateArgs, transaction) { if (templateArgs.length < 4) { throw new Errors.ValidationError(AppHelper.formatMessage(ErrorMessages.INVALID_HOST_TEMPLATE, templateArgs.join('.'))) } - const application = await ApplicationManager.findOne({ name: templateArgs[1], userId }, transaction) + const application = await ApplicationManager.findOne({ name: templateArgs[1] }, transaction) if (!application) { throw new Errors.ValidationError(AppHelper.formatMessage(ErrorMessages.NOT_FOUND_HOST_TEMPLATE, templateArgs[1])) } @@ -136,13 +134,13 @@ async function _validateAppHostTemplate (extraHost, templateArgs, userId, transa throw new Errors.ValidationError(AppHelper.formatMessage(ErrorMessages.INVALID_HOST_TEMPLATE, templateArgs.join('.'))) } -async function _validateAgentHostTemplate (extraHost, templateArgs, userId, transaction) { +async function _validateAgentHostTemplate (extraHost, templateArgs, transaction) { if (templateArgs.length !== 2) { throw new Errors.ValidationError(AppHelper.formatMessage(ErrorMessages.INVALID_HOST_TEMPLATE, templateArgs.join('.'))) } extraHost.templateType = 'Agents' - const fog = await FogManager.findOne({ name: templateArgs[1], userId }, transaction) + const fog = await FogManager.findOne({ name: templateArgs[1] }, transaction) if (!fog) { throw new Errors.ValidationError(AppHelper.formatMessage(ErrorMessages.NOT_FOUND_HOST_TEMPLATE, templateArgs[1])) } @@ -166,9 +164,9 @@ async function _validateExtraHost (extraHostData, user, transaction) { const templateArgs = template.split('.') extraHost.templateType = templateArgs[0] if (templateArgs[0] === 'Apps') { - return _validateAppHostTemplate(extraHost, templateArgs, user.id, transaction) + return _validateAppHostTemplate(extraHost, templateArgs, transaction) } else if (templateArgs[0] === 'Agents') { - return _validateAgentHostTemplate(extraHost, templateArgs, user.id, transaction) + return _validateAgentHostTemplate(extraHost, templateArgs, transaction) } throw new Errors.ValidationError(AppHelper.formatMessage(ErrorMessages.INVALID_HOST_TEMPLATE, template)) } @@ -202,9 +200,6 @@ async function _findFog (microserviceData, user, isCLI, transaction) { if (microserviceData.iofogUuid) { fogConditions.uuid = microserviceData.iofogUuid } else { - if (!isCLI) { - fogConditions.userId = user.id - } fogConditions.name = microserviceData.agentName } return FogManager.findOne(fogConditions, transaction) @@ -356,12 +351,11 @@ async function updateMicroserviceEndPoint (microserviceUuid, microserviceData, u let needStatusReset = false const query = isCLI ? { - uuid: microserviceUuid - } + uuid: microserviceUuid + } : { - uuid: microserviceUuid, - userId: user.id - } + uuid: microserviceUuid + } // validate extraHosts const extraHosts = microserviceData.extraHosts ? await _validateExtraHosts(microserviceData, user, transaction) : null @@ -461,8 +455,7 @@ async function updateMicroserviceEndPoint (microserviceUuid, microserviceData, u } if (microserviceDataUpdate.name) { - const userId = isCLI ? microservice.userId : user.id - await _checkForDuplicateName(microserviceDataUpdate.name, { id: microserviceUuid }, userId, microservice.applicationId || microservice.application, transaction) + await _checkForDuplicateName(microserviceDataUpdate.name, { id: microserviceUuid }, microservice.applicationId || microservice.application, transaction) } // validate fog node @@ -571,12 +564,11 @@ const _checkIfMicroserviceImagesAreEqual = (microserviceDataUpdateImages, catalo async function deleteMicroserviceEndPoint (microserviceUuid, microserviceData, user, isCLI, transaction) { const where = isCLI ? { - uuid: microserviceUuid - } + uuid: microserviceUuid + } : { - uuid: microserviceUuid, - userId: user.id - } + uuid: microserviceUuid + } const microservice = await MicroserviceManager.findOneWithStatusAndCategory(where, transaction) if (!microservice) { @@ -640,7 +632,7 @@ async function createPortMappingEndPoint (microserviceUuid, portMappingData, use const where = isCLI ? { uuid: microserviceUuid } - : { uuid: microserviceUuid, userId: user.id } + : { uuid: microserviceUuid } const microservice = await MicroserviceManager.findOne(where, transaction) if (!microservice) { @@ -673,7 +665,6 @@ async function _createEnv (microservice, envData, user, transaction) { const msEnvData = { key: envData.key, value: envData.value, - userId: microservice.userId, microserviceUuid: microservice.uuid } @@ -720,7 +711,7 @@ async function createVolumeMappingEndPoint (microserviceUuid, volumeMappingData, const where = isCLI ? { uuid: microserviceUuid } - : { uuid: microserviceUuid, userId: user.id } + : { uuid: microserviceUuid } const microservice = await MicroserviceManager.findOne(where, transaction) if (!microservice) { @@ -755,7 +746,7 @@ async function createVolumeMappingEndPoint (microserviceUuid, volumeMappingData, async function deleteVolumeMappingEndPoint (microserviceUuid, volumeMappingUuid, user, isCLI, transaction) { const where = isCLI ? { uuid: microserviceUuid } - : { uuid: microserviceUuid, userId: user.id } + : { uuid: microserviceUuid } const microservice = await MicroserviceManager.findOne(where, transaction) if (!microservice) { @@ -776,7 +767,7 @@ async function deleteVolumeMappingEndPoint (microserviceUuid, volumeMappingUuid, async function listVolumeMappingsEndPoint (microserviceUuid, user, isCLI, transaction) { const where = isCLI ? { uuid: microserviceUuid } - : { uuid: microserviceUuid, userId: user.id } + : { uuid: microserviceUuid } const microservice = await MicroserviceManager.findOne(where, transaction) if (!microservice) { throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.INVALID_MICROSERVICE_UUID, microserviceUuid)) @@ -809,8 +800,7 @@ async function _createMicroservice (microserviceData, user, isCLI, transaction) iofogUuid: microserviceData.iofogUuid, rootHostAccess: microserviceData.rootHostAccess, registryId: microserviceData.registryId || 1, - logSize: (microserviceData.logSize || constants.MICROSERVICE_DEFAULT_LOG_SIZE) * 1, - userId: user.id + logSize: (microserviceData.logSize || constants.MICROSERVICE_DEFAULT_LOG_SIZE) * 1 } newMicroservice = AppHelper.deleteUndefinedFields(newMicroservice) @@ -826,7 +816,7 @@ async function _createMicroservice (microserviceData, user, isCLI, transaction) const application = await _validateApplication(microserviceData.application, user, isCLI, transaction) newMicroservice.applicationId = application.id - await _checkForDuplicateName(newMicroservice.name, {}, user.id, newMicroservice.applicationId, transaction) + await _checkForDuplicateName(newMicroservice.name, {}, newMicroservice.applicationId, transaction) // validate fog node if (newMicroservice.iofogUuid) { @@ -847,14 +837,14 @@ async function _validateApplication (name, user, isCLI, transaction) { // Force name conversion to string for PG const where = isCLI ? { name: name.toString() } - : { name: name.toString(), userId: user.id } + : { name: name.toString() } const application = await ApplicationManager.findOne(where, transaction) if (!application) { // Try with id const where = isCLI ? { id: name } - : { id: name, userId: user.id } + : { id: name } const application = await ApplicationManager.findOne(where, transaction) if (!application) { @@ -979,22 +969,20 @@ async function _updateChangeTracking (configUpdated, fogNodeUuid, transaction) { } } -async function _checkForDuplicateName (name, item, userId, applicationId, transaction) { +async function _checkForDuplicateName (name, item, applicationId, transaction) { if (name) { const where = item.id ? { - name: name, - uuid: { [Op.ne]: item.id }, - delete: false, - userId: userId, - applicationId - } + name: name, + uuid: { [Op.ne]: item.id }, + delete: false, + applicationId + } : { - name: name, - userId: userId, - applicationId, - delete: false - } + name: name, + applicationId, + delete: false + } const result = await MicroserviceManager.findOne(where, transaction) if (result) { @@ -1003,9 +991,8 @@ async function _checkForDuplicateName (name, item, userId, applicationId, transa } } -async function _validateMicroserviceOnGet (userId, microserviceUuid, transaction) { +async function _validateMicroserviceOnGet (microserviceUuid, transaction) { const where = { - '$application.user.id$': userId, 'uuid': microserviceUuid } const microservice = await MicroserviceManager.findMicroserviceOnGet(where, transaction) @@ -1037,15 +1024,12 @@ async function _getLogicalRoutesByMicroservice (microserviceUuid, transaction) { } async function deleteMicroserviceWithRoutesAndPortMappings (microservice, transaction) { - const user = { - id: microservice.userId - } const routes = await _getLogicalRoutesByMicroservice(microservice.uuid, transaction) for (const route of routes) { - await RoutingService.deleteRouting(route.application.name, route.name, user, false, transaction) + await RoutingService.deleteRouting(route.application.name, route.name, false, transaction) } - await MicroservicePortService.deletePortMappings(microservice, user, transaction) + await MicroservicePortService.deletePortMappings(microservice, transaction) await MicroserviceManager.delete({ uuid: microservice.uuid diff --git a/src/services/registry-service.js b/src/services/registry-service.js index 912075c42..5025c0b70 100644 --- a/src/services/registry-service.js +++ b/src/services/registry-service.js @@ -35,8 +35,7 @@ const createRegistry = async function (registry, user, transaction) { isPublic: registry.isPublic, userEmail: registry.email, requiresCert: registry.requiresCert, - certificate: registry.certificate, - userId: user.id + certificate: registry.certificate } registryCreate = AppHelper.deleteUndefinedFields(registryCreate) @@ -54,16 +53,13 @@ const findRegistries = async function (user, isCLI, transaction) { const queryRegistry = isCLI ? {} : { - [Op.or]: + [Op.or]: [ - { - userId: user.id - }, { isPublic: true } ] - } + } const registries = await RegistryManager.findAllWithAttributes(queryRegistry, { exclude: ['password'] }, transaction) return { @@ -75,14 +71,11 @@ const deleteRegistry = async function (registryData, user, isCLI, transaction) { await Validator.validate(registryData, Validator.schemas.registryDelete) const queryData = isCLI ? { id: registryData.id } - : { id: registryData.id, userId: user.id } + : { id: registryData.id } const registry = await RegistryManager.findOne(queryData, transaction) if (!registry) { throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.INVALID_REGISTRY_ID, registryData.id)) } - if (isCLI) { - user = { id: registry.userId } - } await RegistryManager.delete(queryData, transaction) await _updateChangeTracking(user, transaction) } @@ -116,24 +109,19 @@ const updateRegistry = async function (registry, registryId, user, isCLI, transa const where = isCLI ? { - id: registryId - } + id: registryId + } : { - id: registryId, - userId: user.id - } + id: registryId + } await RegistryManager.update(where, registryUpdate, transaction) - if (isCLI) { - user = { id: existingRegistry.userId } - } - await _updateChangeTracking(user, transaction) } const _updateChangeTracking = async function (user, transaction) { - const fogs = await FogManager.findAll({ userId: user.id }, transaction) + const fogs = await FogManager.findAll(transaction) for (const fog of fogs) { await ChangeTrackingService.update(fog.uuid, ChangeTrackingService.events.registries, transaction) } diff --git a/src/services/router-service.js b/src/services/router-service.js index fc332bfc0..8c8dbdc52 100644 --- a/src/services/router-service.js +++ b/src/services/router-service.js @@ -51,7 +51,7 @@ async function validateAndReturnUpstreamRouters (upstreamRouterIds, isSystemFog, return upstreamRouters } -async function createRouterForFog (fogData, uuid, userId, upstreamRouters, transaction) { +async function createRouterForFog (fogData, uuid, upstreamRouters, transaction) { const isEdge = fogData.routerMode === 'edge' const messagingPort = fogData.messagingPort || 5672 // Is default router if we are on a system fog and no other default router already exists @@ -75,17 +75,17 @@ async function createRouterForFog (fogData, uuid, userId, upstreamRouters, trans microserviceConfig.connectors = (microserviceConfig.connectors || []).concat(_getRouterConnectorConfig(isEdge, upstreamRouter)) } - const routerMicroservice = await _createRouterMicroservice(isEdge, uuid, userId, microserviceConfig, transaction) - await _createRouterPorts(routerMicroservice.uuid, messagingPort, userId, transaction) + const routerMicroservice = await _createRouterMicroservice(isEdge, uuid, microserviceConfig, transaction) + await _createRouterPorts(routerMicroservice.uuid, messagingPort, transaction) if (!isEdge) { - await _createRouterPorts(routerMicroservice.uuid, fogData.edgeRouterPort, userId, transaction) - await _createRouterPorts(routerMicroservice.uuid, fogData.interRouterPort, userId, transaction) + await _createRouterPorts(routerMicroservice.uuid, fogData.edgeRouterPort, transaction) + await _createRouterPorts(routerMicroservice.uuid, fogData.interRouterPort, transaction) } return router } -async function updateRouter (oldRouter, newRouterData, upstreamRouters, userId, transaction) { +async function updateRouter (oldRouter, newRouterData, upstreamRouters, transaction) { const routerCatalog = await CatalogService.getRouterCatalogItem(transaction) const routerMicroservice = await MicroserviceManager.findOne({ catalogItemId: routerCatalog.id, @@ -107,8 +107,8 @@ async function updateRouter (oldRouter, newRouterData, upstreamRouters, userId, } else if (!newRouterData.isEdge && oldRouter.isEdge) { // Moving from edge to internal // Nothing specific to update - await _createRouterPorts(routerMicroservice.uuid, newRouterData.edgeRouterPort, userId, transaction) - await _createRouterPorts(routerMicroservice.uuid, newRouterData.interRouterPort, userId, transaction) + await _createRouterPorts(routerMicroservice.uuid, newRouterData.edgeRouterPort, transaction) + await _createRouterPorts(routerMicroservice.uuid, newRouterData.interRouterPort, transaction) } newRouterData.messagingPort = newRouterData.messagingPort || 5672 await RouterManager.update({ id: oldRouter.id }, newRouterData, transaction) @@ -135,7 +135,7 @@ async function updateRouter (oldRouter, newRouterData, upstreamRouters, userId, } // Update config if needed - await updateConfig(oldRouter.id, userId, transaction) + await updateConfig(oldRouter.id, transaction) await ChangeTrackingService.update(oldRouter.iofogUuid, ChangeTrackingService.events.routerChanged, transaction) await ChangeTrackingService.update(oldRouter.iofogUuid, ChangeTrackingService.events.microserviceList, transaction) await ChangeTrackingService.update(oldRouter.iofogUuid, ChangeTrackingService.events.microserviceConfig, transaction) @@ -153,7 +153,7 @@ async function _deleteRouterPorts (routerMicroserviceUuid, port, transaction) { await MicroservicePortManager.delete({ microserviceUuid: routerMicroserviceUuid, portInternal: port }, transaction) } -async function updateConfig (routerID, userId, transaction) { +async function updateConfig (routerID, transaction) { const router = await RouterManager.findOne({ id: routerID }, transaction) if (!router) { throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.INVALID_ROUTER, routerID)) @@ -179,10 +179,10 @@ async function updateConfig (routerID, userId, transaction) { if (_listenersChanged(JSON.parse(routerMicroservice.config || '{}').listeners, microserviceConfig.listeners)) { MicroservicePortManager.delete({ microserviceUuid: routerMicroservice.uuid }, transaction) - await _createRouterPorts(routerMicroservice.uuid, router.messagingPort, userId, transaction) + await _createRouterPorts(routerMicroservice.uuid, router.messagingPort, transaction) if (!router.isEdge) { - await _createRouterPorts(routerMicroservice.uuid, router.edgeRouterPort, userId, transaction) - await _createRouterPorts(routerMicroservice.uuid, router.interRouterPort, userId, transaction) + await _createRouterPorts(routerMicroservice.uuid, router.edgeRouterPort, transaction) + await _createRouterPorts(routerMicroservice.uuid, router.interRouterPort, transaction) } await MicroserviceManager.update({ uuid: routerMicroservice.uuid }, { rebuild: true }, transaction) await ChangeTrackingService.update(router.iofogUuid, ChangeTrackingService.events.microserviceList, transaction) @@ -206,19 +206,18 @@ function _listenersChanged (currentListeners, newListeners) { return false } -function _createRouterPorts (routerMicroserviceUuid, port, userId, transaction) { +function _createRouterPorts (routerMicroserviceUuid, port, transaction) { const mappingData = { isPublic: false, portInternal: port, portExternal: port, - userId: userId, microserviceUuid: routerMicroserviceUuid } return MicroservicePortManager.create(mappingData, transaction) } -async function _createRouterMicroservice (isEdge, uuid, userId, microserviceConfig, transaction) { +async function _createRouterMicroservice (isEdge, uuid, microserviceConfig, transaction) { const routerCatalog = await CatalogService.getRouterCatalogItem(transaction) const routerMicroserviceData = { uuid: AppHelper.generateRandomString(32), @@ -228,7 +227,6 @@ async function _createRouterMicroservice (isEdge, uuid, userId, microserviceConf iofogUuid: uuid, rootHostAccess: false, logSize: constants.MICROSERVICE_DEFAULT_LOG_SIZE, - userId, configLastUpdated: Date.now() } return MicroserviceManager.create(routerMicroserviceData, transaction) diff --git a/src/services/routing-service.js b/src/services/routing-service.js index 96bbd69fa..b3737ba90 100644 --- a/src/services/routing-service.js +++ b/src/services/routing-service.js @@ -70,7 +70,7 @@ async function _validateRouteMsvc (routingData, user, isCLI, transaction) { } return { sourceMicroservice, destMicroservice } } else { - const applicationWhere = isCLI ? { name: routingData.application } : { name: routingData.application, userId: user.id } + const applicationWhere = isCLI ? { name: routingData.application } : { name: routingData.application } const application = await ApplicationManager.findOne(applicationWhere, transaction) if (!application) { throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.INVALID_FLOW_ID, routingData.application)) diff --git a/src/services/scheduler-access-token-service.js b/src/services/scheduler-access-token-service.js deleted file mode 100644 index d40fb2f0f..000000000 --- a/src/services/scheduler-access-token-service.js +++ /dev/null @@ -1,48 +0,0 @@ -/* - * ******************************************************************************* - * * Copyright (c) 2023 Datasance Teknoloji A.S. - * * - * * This program and the accompanying materials are made available under the - * * terms of the Eclipse Public License v. 2.0 which is available at - * * http://www.eclipse.org/legal/epl-2.0 - * * - * * SPDX-License-Identifier: EPL-2.0 - * ******************************************************************************* - * - */ - -const AppHelper = require('../helpers/app-helper') -const SchedulerAccessTokenManager = require('../data/managers/scheduler-access-token-manager') - -const Config = require('../config') - -const generateAccessToken = async function (transaction) { - while (true) { - const newAccessToken = AppHelper.generateAccessToken() - const exists = await SchedulerAccessTokenManager.findOne({ - token: newAccessToken - }, transaction) - if (!exists) { - const accessTokenExpiryTime = Date.now() + Config.get('Settings:SchedulerTokenExpirationIntervalSeconds') * 99999 - return { - token: newAccessToken, - expirationTime: accessTokenExpiryTime - } - } - } -} - -async function updateAccessToken (userId, newAccessToken, transaction) { - return SchedulerAccessTokenManager.updateOrCreate({ - userId: userId - }, { - userId: userId, - token: newAccessToken.token, - expirationTime: newAccessToken.expirationTime - }, transaction) -} - -module.exports = { - generateAccessToken, - updateAccessToken -} diff --git a/src/services/user-service.js b/src/services/user-service.js index f500ea9a0..42dd2b082 100644 --- a/src/services/user-service.js +++ b/src/services/user-service.js @@ -11,387 +11,46 @@ * */ -const nodemailer = require('nodemailer') -const smtpTransport = require('nodemailer-smtp-transport') -const UserManager = require('../data/managers/user-manager') -const AppHelper = require('../helpers/app-helper') const Errors = require('../helpers/errors') -const ErrorMessages = require('../helpers/error-messages') -const Config = require('../config') -const ioFogManager = require('../data/managers/iofog-manager') -const FogStates = require('../enums/fog-state') -const emailActivationTemplate = require('../views/email-activation-temp') -const emailRecoveryTemplate = require('../views/email-temp') -const emailResetTemplate = require('../views/reset-password-temp') -const EmailActivationCodeService = require('./email-activation-code-service') -const AccessTokenService = require('./access-token-service') - const TransactionDecorator = require('../decorators/transaction-decorator') -const Validator = require('../schemas') - -const signUp = async function (user, isCLI, transaction) { - const isEmailActivationEnabled = Config.get('Email:ActivationEnabled') - - if (isEmailActivationEnabled) { - const newUser = await _handleCreateUser(user, isEmailActivationEnabled, transaction) - - const activationCodeData = await EmailActivationCodeService.generateActivationCode(transaction) - await EmailActivationCodeService.saveActivationCode(newUser.id, activationCodeData, transaction) - - const emailData = await _getEmailData() - const transporter = await _userEmailSender(emailData) - await _notifyUserAboutActivationCode(user.email, Config.get('Email:HomeUrl'), emailData, activationCodeData, transporter) - return newUser - } else { - return _handleCreateUser(user, isEmailActivationEnabled, transaction) - } -} +const axios = require('axios') +const qs = require('qs') const login = async function (credentials, isCLI, transaction) { - const user = await UserManager.findOne({ - email: credentials.email - }, transaction) - if (!user) { - throw new Errors.InvalidCredentialsError() - } - - const pass = AppHelper.decryptText(user.password, user.email) - if (isCLI) { - credentials.password = AppHelper.decryptText(credentials.password, credentials.email) - } - - const validPassword = credentials.password === pass || credentials.password === user.tempPassword - if (!validPassword) { - throw new Errors.InvalidCredentialsError() - } - - _verifyEmailActivation(user.emailActivated) - - const accessToken = await _generateAccessToken(transaction) - accessToken.userId = user.id - - await AccessTokenService.createAccessToken(accessToken, transaction) - - return { - accessToken: accessToken.token - } -} - -const resendActivation = async function (emailObj, isCLI, transaction) { - await Validator.validate(emailObj, Validator.schemas.resendActivation) - - const user = await UserManager.findOne({ - email: emailObj.email - }, transaction) - if (!user) { - throw new Errors.ValidationError(ErrorMessages.INVALID_USER_EMAIL) - } - - const activationCodeData = await EmailActivationCodeService.generateActivationCode(transaction) - await EmailActivationCodeService.saveActivationCode(user.id, activationCodeData, transaction) - - const emailData = await _getEmailData() - const transporter = await _userEmailSender(emailData) - await _notifyUserAboutActivationCode(user.email, Config.get('Email:HomeUrl'), emailData, activationCodeData, transporter) -} - -const activateUser = async function (codeData, isCLI, transaction) { - const updatedObj = { - emailActivated: true - } - - if (isCLI) { - const user = await UserManager.findOne({ - id: codeData.userId - }, transaction) - - if (user.emailActivated === true) { - throw new Error(ErrorMessages.USER_ALREADY_ACTIVATED) - } - - await _updateUser(codeData.userId, updatedObj, transaction) - } else { - await Validator.validate(codeData, Validator.schemas.activateUser) - - const activationCode = await EmailActivationCodeService.verifyActivationCode(codeData.activationCode, transaction) - if (!activationCode) { - throw new Errors.NotFoundError(ErrorMessages.ACTIVATION_CODE_NOT_FOUND) - } - - await _updateUser(activationCode.userId, updatedObj, transaction) - - await EmailActivationCodeService.deleteActivationCode(codeData.activationCode, transaction) - } -} - -const logout = async function (user, isCLI, transaction) { - return AccessTokenService.removeAccessTokenByUserId(user.id, transaction) -} - -const updateUserDetails = async function (user, profileData, isCLI, transaction) { - if (isCLI) { - await Validator.validate(profileData, Validator.schemas.updateUserProfileCLI) - } else { - await Validator.validate(profileData, Validator.schemas.updateUserProfile) - } - - const password = (profileData.password) ? AppHelper.encryptText(profileData.password, user.email) : undefined - - let updateObject = isCLI - ? { - firstName: profileData.firstName, - lastName: profileData.lastName, - password: password, - subscriptionKey: profileData.subscriptionKey - } - : { - firstName: profileData.firstName, - lastName: profileData.lastName, - subscriptionKey: profileData.subscriptionKey - } - - updateObject = AppHelper.deleteUndefinedFields(updateObject) - - await UserManager.updateDetails(user, updateObject, transaction) - - return { - firstName: updateObject.firstName, - lastName: updateObject.lastName, - email: user.email, - subscriptionKey: profileData.subscriptionKey - } -} - -const deleteUser = async function (force, user, isCLI, transaction) { - if (!force) { - const ioFogArray = await ioFogManager.findAll({ - userId: user.id - }, transaction) - - if (ioFogArray) { - for (const ioFog of ioFogArray) { - if (ioFog.daemonStatus === FogStates.RUNNING) { - throw new Errors.ValidationError(ErrorMessages.NEEDED_FORCE_DELETE_USER) - } - } - } - } - - await UserManager.delete({ - id: user.id - }, transaction) -} - -const updateUserPassword = async function (passwordUpdates, user, isCLI, transaction) { - const pass = AppHelper.decryptText(user.password, user.email) - - if (pass !== passwordUpdates.oldPassword && user.tempPassword !== passwordUpdates.oldPassword) { - throw new Errors.ValidationError(ErrorMessages.INVALID_OLD_PASSWORD) - } - const newPass = AppHelper.encryptText(passwordUpdates.newPassword, user.email) - - await UserManager.updatePassword(user.id, newPass, transaction) - await AccessTokenService.removeAccessTokenByUserId(user.id, transaction) - - try { - const emailData = await _getEmailData() - const transporter = await _userEmailSender(emailData) - - await _notifyUserAboutPasswordChange(user, emailData, transporter) - } catch (e) { - console.error(e) - } -} - -const resetUserPassword = async function (emailObj, isCLI, transaction) { - await Validator.validate(emailObj, Validator.schemas.resetUserPassword) - - const user = await UserManager.findOne({ - email: emailObj.email - }, transaction) - if (!user) { - throw new Errors.NotFoundError(ErrorMessages.ACCOUNT_NOT_FOUND) - } - - const tempPass = AppHelper.generateRandomString(2) + 'uL7' - const tempDbPass = AppHelper.encryptText(tempPass, user.email) - await UserManager.updateTempPassword(user.id, tempDbPass, transaction) - - const emailData = await _getEmailData() - const transporter = await _userEmailSender(emailData) - await _notifyUserAboutPasswordReset(user, Config.get('Email:HomeUrl'), emailData, tempPass, transporter) -} - -const list = async function (isCLI, transaction) { - return UserManager.findAllWithAttributes({}, { exclude: ['password'] }, transaction) -} - -const suspendUser = async function (user, isCLI, transaction) { - if (user.emailActivated === false) { - throw new Error(ErrorMessages.USER_NOT_ACTIVATED_YET) - } - - const updatedObj = { - emailActivated: false - } - - await AccessTokenService.removeAccessTokenByUserId(user.id, transaction) - - return _updateUser(user.id, updatedObj, transaction) -} - -async function _updateUser (userId, updatedUser, transaction) { try { - return UserManager.update({ - id: userId - }, updatedUser, transaction) - } catch (errMsg) { - throw new Error(ErrorMessages.USER_NOT_UPDATED) - } -} - -async function _generateAccessToken (transaction) { - while (true) { - const newAccessToken = AppHelper.generateAccessToken() - const exists = await UserManager.findByAccessToken(newAccessToken, transaction) - if (!exists) { - const tokenExpiryTime = new Date().getTime() + (Config.get('Settings:UserTokenExpirationIntervalSeconds') * 1000) - - return { - token: newAccessToken, - expirationTime: tokenExpiryTime - } + const data = qs.stringify({ + grant_type: 'password', + username: credentials.email, + password: credentials.password, + client_id: process.env.KC_CLIENT, + client_secret: process.env.KC_CLIENT_SECRET + }) + + const config = { + method: 'post', + maxBodyLength: Infinity, + url: `${process.env.KC_URL}/realms/${process.env.KC_REALM}/protocol/openid-connect/token`, + headers: { + 'Cache-Control': 'no-cache', + 'Content-Type': 'application/x-www-form-urlencoded' + }, + data: data } - } -} - -function _verifyEmailActivation (emailActivated) { - const isEmailActivationEnabled = Config.get('Email:ActivationEnabled') - if (isEmailActivationEnabled && !emailActivated) { - throw new Error(ErrorMessages.EMAIL_NOT_ACTIVATED) - } -} -async function _userEmailSender (emailData) { - let transporter - if (emailData.service) { - transporter = nodemailer.createTransport(smtpTransport({ - service: emailData.service, - auth: { - user: emailData.email, - pass: emailData.password - } - })) - } else { - transporter = nodemailer.createTransport(smtpTransport({ - host: emailData.host, - port: emailData.port, - auth: { - user: emailData.email, - pass: emailData.password - } - })) - } - - return transporter -} - -async function _handleCreateUser (user, isEmailActivationEnabled, transaction) { - const existingUser = await UserManager.findOne({ - email: user.email - }, transaction) - - if (existingUser) { - throw new Errors.ValidationError('Registration failed: There is already an account associated with your email address. ' + - 'Please try logging in instead.') - } - - const newUser = await _createNewUser(user, isEmailActivationEnabled, transaction) - return { - userId: newUser.id, - firstName: newUser.firstName, - lastName: newUser.lastName, - email: newUser.email, - subscriptionKey: newUser.subscriptionKey, - emailActivated: user.emailActivated - } -} - -async function _createNewUser (user, isEmailActivationEnabled, transaction) { - user.emailActivated = !isEmailActivationEnabled - return UserManager.create(user, transaction) -} - -async function _notifyUserAboutActivationCode (email, url, emailSenderData, activationCodeData, transporter) { - const mailOptions = { - from: '"IOFOG" <' + emailSenderData.email + '>', - to: email, - subject: 'Activate Your Account', - html: emailActivationTemplate.p1 + url + emailActivationTemplate.p2 + activationCodeData.activationCode + - emailActivationTemplate.p3 + url + emailActivationTemplate.p4 + activationCodeData.activationCode + - emailActivationTemplate.p5 + url + emailActivationTemplate.p6 + activationCodeData.activationCode + emailActivationTemplate.p7 - } - - await _sendEmail(transporter, mailOptions) -} - -async function _notifyUserAboutPasswordChange (user, emailSenderData, transporter) { - const mailOptions = { - from: '"IOFOG" <' + emailSenderData.email + '>', - to: user.email, - subject: 'Password Change Notification', - html: emailRecoveryTemplate.p1 + user.firstName + ' ' + user.lastName + emailRecoveryTemplate.p2 - } - - await _sendEmail(transporter, mailOptions) -} - -async function _notifyUserAboutPasswordReset (user, url, emailSenderData, tempPass, transporter) { - const mailOptions = { - from: '"IOFOG" <' + emailSenderData.email + '>', - to: user.email, - subject: 'Password Reset Request', - html: emailResetTemplate.p1 + user.firstName + ' ' + user.lastName + emailResetTemplate.p2 + tempPass + emailResetTemplate.p3 + - url + emailResetTemplate.p4 - } - - await _sendEmail(transporter, mailOptions) -} - -async function _sendEmail (transporter, mailOptions) { - try { - await transporter.sendMail(mailOptions) - } catch (errMsg) { - throw new Error(ErrorMessages.EMAIL_SENDER_NOT_CONFIGURED) - } -} - -async function _getEmailData () { - try { - const email = Config.get('Email:Address') - const password = AppHelper.decryptText(Config.get('Email:Password'), Config.get('Email:Address')) - const service = Config.get('Email:Service') + // Make a POST request to Keycloak token endpoint + const response = await axios.request(config) + // Extract the access token from the response + const accessToken = response.data.access_token return { - email: email, - password: password, - service: service + accessToken: accessToken } - } catch (errMsg) { - throw new Errors.EmailActivationSetupError() + } catch (error) { + console.error('Error during login:', error) + throw new Errors.InvalidCredentialsError() } } module.exports = { - signUp: TransactionDecorator.generateTransaction(signUp), - login: TransactionDecorator.generateTransaction(login), - resendActivation: TransactionDecorator.generateTransaction(resendActivation), - activateUser: TransactionDecorator.generateTransaction(activateUser), - logout: TransactionDecorator.generateTransaction(logout), - updateUserDetails: TransactionDecorator.generateTransaction(updateUserDetails), - deleteUser: TransactionDecorator.generateTransaction(deleteUser), - updateUserPassword: TransactionDecorator.generateTransaction(updateUserPassword), - resetUserPassword: TransactionDecorator.generateTransaction(resetUserPassword), - list: TransactionDecorator.generateTransaction(list), - suspendUser: TransactionDecorator.generateTransaction(suspendUser) + login: TransactionDecorator.generateTransaction(login) } From 1b124d0c6bafe50b1a9d74ca40c1067a7b1ad688 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emirhan=20Durmu=C5=9F?= Date: Mon, 18 Mar 2024 00:49:59 +0300 Subject: [PATCH 055/178] authdecorator removed --- src/cli/application.js | 10 +--------- src/cli/catalog.js | 9 +-------- src/cli/controller.js | 9 +-------- src/cli/diagnostics.js | 9 +-------- src/cli/index.js | 1 - src/cli/iofog.js | 9 +-------- src/cli/microservice.js | 9 +-------- src/cli/registry.js | 9 +-------- src/cli/tunnel.js | 9 +-------- 9 files changed, 8 insertions(+), 66 deletions(-) diff --git a/src/cli/application.js b/src/cli/application.js index 6dc99594a..db8ae7901 100644 --- a/src/cli/application.js +++ b/src/cli/application.js @@ -13,12 +13,10 @@ const BaseCLIHandler = require('./base-cli-handler') const constants = require('../helpers/constants') -const AuthDecorator = require('../decorators/cli-decorator') const ApplicationService = require('../services/application-service') const AppHelper = require('../helpers/app-helper') const logger = require('../logger') const fs = require('fs') -const CliDataTypes = require('./cli-data-types') const JSON_SCHEMA = AppHelper.stringifyCliJsonSchema({ name: 'string', @@ -131,13 +129,7 @@ class Application extends BaseCLIHandler { const _executeCase = async function (applicationCommand, commandName, f, isUserRequired) { try { const item = applicationCommand[commandName] - - if (isUserRequired) { - const decoratedFunction = AuthDecorator.prepareUserById(f) - await decoratedFunction(item) - } else { - await f(item) - } + await f(item) } catch (error) { logger.error(error.message) } diff --git a/src/cli/catalog.js b/src/cli/catalog.js index a9a5a60db..c4df259ec 100644 --- a/src/cli/catalog.js +++ b/src/cli/catalog.js @@ -17,7 +17,6 @@ const logger = require('../logger') const CatalogItemService = require('../services/catalog-service') const fs = require('fs') const AppHelper = require('../helpers/app-helper') -const AuthDecorator = require('../decorators/cli-decorator') const Errors = require('../helpers/errors') const ErrorMessages = require('../helpers/error-messages') const CliDataTypes = require('./cli-data-types') @@ -252,13 +251,7 @@ class Catalog extends BaseCLIHandler { const _executeCase = async function (catalogCommand, commandName, f, isUserRequired) { try { const item = catalogCommand[commandName] - - if (isUserRequired) { - const decoratedFunction = AuthDecorator.prepareUserById(f) - await decoratedFunction(item) - } else { - await f(item) - } + await f(item) } catch (error) { logger.error(error.message) } diff --git a/src/cli/controller.js b/src/cli/controller.js index dc3327cb6..c02fece71 100644 --- a/src/cli/controller.js +++ b/src/cli/controller.js @@ -15,7 +15,6 @@ const BaseCLIHandler = require('./base-cli-handler') const constants = require('../helpers/constants') const ControllerService = require('../services/controller-service') const logger = require('../logger') -const AuthDecorator = require('../decorators/cli-decorator') class Controller extends BaseCLIHandler { constructor () { @@ -69,13 +68,7 @@ class Controller extends BaseCLIHandler { const _executeCase = async function (userCommand, commandName, f, isUserRequired) { try { const item = userCommand[commandName] - - if (isUserRequired) { - const decoratedFunction = AuthDecorator.prepareUserByEmail(f) - await decoratedFunction(item) - } else { - await f(item) - } + await f(item) } catch (error) { logger.error(error.message) } diff --git a/src/cli/diagnostics.js b/src/cli/diagnostics.js index 586ee838f..ab716cb4b 100644 --- a/src/cli/diagnostics.js +++ b/src/cli/diagnostics.js @@ -16,7 +16,6 @@ const constants = require('../helpers/constants') const logger = require('../logger') const DiagnosticService = require('../services/diagnostic-service') const AppHelper = require('../helpers/app-helper') -const AuthDecorator = require('../decorators/cli-decorator') const CliDataTypes = require('./cli-data-types') class Diagnostics extends BaseCLIHandler { @@ -141,13 +140,7 @@ class Diagnostics extends BaseCLIHandler { const _executeCase = async function (diagnosticCommand, commandName, f, isUserRequired) { try { const item = diagnosticCommand[commandName] - - if (isUserRequired) { - const decoratedFunction = AuthDecorator.prepareUserById(f) - await decoratedFunction(item) - } else { - await f(item) - } + await f(item) } catch (error) { logger.error(error.message) } diff --git a/src/cli/index.js b/src/cli/index.js index 8b8aba684..1e1847e7a 100644 --- a/src/cli/index.js +++ b/src/cli/index.js @@ -13,7 +13,6 @@ const BaseCLIHandler = require('./base-cli-handler') const Start = require('./start') -const User = require('./user') const Config = require('./config') const Tunnel = require('./tunnel') const IOFog = require('./iofog') diff --git a/src/cli/iofog.js b/src/cli/iofog.js index 26790ad46..8ac4d0081 100644 --- a/src/cli/iofog.js +++ b/src/cli/iofog.js @@ -15,7 +15,6 @@ const BaseCLIHandler = require('./base-cli-handler') const constants = require('../helpers/constants') const logger = require('../logger') const fs = require('fs') -const CliDecorator = require('../decorators/cli-decorator') const AppHelper = require('../helpers/app-helper') const FogService = require('../services/iofog-service') const CliDataTypes = require('./cli-data-types') @@ -358,13 +357,7 @@ class IOFog extends BaseCLIHandler { async function _executeCase (commands, commandName, f, isUserRequired) { try { const obj = commands[commandName] - - if (isUserRequired) { - const decoratedFunction = CliDecorator.prepareUserById(f) - await decoratedFunction(obj) - } else { - await f(obj) - } + await f(obj) } catch (error) { logger.error(error.message) } diff --git a/src/cli/microservice.js b/src/cli/microservice.js index 2f0e3baa4..cce7264f5 100644 --- a/src/cli/microservice.js +++ b/src/cli/microservice.js @@ -18,7 +18,6 @@ const logger = require('../logger') const MicroserviceService = require('../services/microservices-service') const fs = require('fs') const AppHelper = require('../helpers/app-helper') -const CliDecorator = require('../decorators/cli-decorator') const CliDataTypes = require('./cli-data-types') const JSON_SCHEMA_ADD = AppHelper.stringifyCliJsonSchema( @@ -433,13 +432,7 @@ class Microservice extends BaseCLIHandler { async function _executeCase (commands, commandName, f, isUserRequired) { try { const obj = commands[commandName] - - if (isUserRequired) { - const decoratedFunction = CliDecorator.prepareUserById(f) - await decoratedFunction(obj) - } else { - await f(obj) - } + await f(obj) } catch (error) { logger.error(error.message) } diff --git a/src/cli/registry.js b/src/cli/registry.js index 00791fe2a..4afae2bf2 100644 --- a/src/cli/registry.js +++ b/src/cli/registry.js @@ -14,7 +14,6 @@ const BaseCLIHandler = require('./base-cli-handler') const constants = require('../helpers/constants') const logger = require('../logger') -const CliDecorator = require('../decorators/cli-decorator') const RegistryService = require('../services/registry-service') const AppHelper = require('../helpers/app-helper') const CliDataTypes = require('./cli-data-types') @@ -172,13 +171,7 @@ async function _updateRegistry (obj) { async function _executeCase (commands, commandName, f, isUserRequired) { try { const obj = commands[commandName] - - if (isUserRequired) { - const decoratedFunction = CliDecorator.prepareUserById(f) - await decoratedFunction(obj) - } else { - await f(obj) - } + await f(obj) } catch (error) { logger.error(error.message) } diff --git a/src/cli/tunnel.js b/src/cli/tunnel.js index 5592e5364..287b391ec 100644 --- a/src/cli/tunnel.js +++ b/src/cli/tunnel.js @@ -16,7 +16,6 @@ const constants = require('../helpers/constants') const fs = require('fs') const logger = require('../logger') const TunnelService = require('../services/tunnel-service') -const CliDecorator = require('../decorators/cli-decorator') const Errors = require('../helpers/errors') const ErrorMessages = require('../helpers/error-messages') const CliDataTypes = require('./cli-data-types') @@ -147,13 +146,7 @@ async function _tunnelList () { async function _executeCase (commands, commandName, f, isUserRequired) { try { const obj = commands[commandName] - - if (isUserRequired) { - const decoratedFunction = CliDecorator.prepareUserById(f) - await decoratedFunction(obj) - } else { - await f(obj) - } + await f(obj) } catch (error) { logger.error(error.message) } From fb672f0eff93bc1c916260dbf459a9fb9989c942 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emirhan=20Durmu=C5=9F?= Date: Mon, 18 Mar 2024 01:08:48 +0300 Subject: [PATCH 056/178] indentations fixied --- src/cli/index.js | 2 -- src/decorators/authorization-decorator.js | 1 - src/services/catalog-service.js | 4 +-- src/services/diagnostic-service.js | 16 +++++------ src/services/microservices-service.js | 34 +++++++++++------------ src/services/registry-service.js | 12 ++++---- 6 files changed, 33 insertions(+), 36 deletions(-) diff --git a/src/cli/index.js b/src/cli/index.js index 1e1847e7a..56961ddb9 100644 --- a/src/cli/index.js +++ b/src/cli/index.js @@ -64,8 +64,6 @@ class Cli extends BaseCLIHandler { return case constants.CMD_CONTROLLER: return Controller.run({ argv }) - case constants.CMD_USER: - return User.run({ argv }) case constants.CMD_CONFIG: return Config.run({ argv }) case constants.CMD_TUNNEL: diff --git a/src/decorators/authorization-decorator.js b/src/decorators/authorization-decorator.js index eb409964d..9883feddc 100644 --- a/src/decorators/authorization-decorator.js +++ b/src/decorators/authorization-decorator.js @@ -50,6 +50,5 @@ function checkFogToken (f) { } module.exports = { - checkAuthToken: checkAuthToken, checkFogToken: checkFogToken } diff --git a/src/services/catalog-service.js b/src/services/catalog-service.js index baaf027eb..9b7a07a77 100644 --- a/src/services/catalog-service.js +++ b/src/services/catalog-service.js @@ -176,8 +176,8 @@ async function getHalCatalogItem (transaction) { const _checkForDuplicateName = async function (name, item, transaction) { if (name) { const where = item.id - ? { [Op.or]: name: name, id: { [Op.ne]: item.id } } - : { [Op.or]: name: name } + ? { name: name, id: { [Op.ne]: item.id } } + : { name: name } const result = await CatalogItemManager.findOne(where, transaction) if (result) { diff --git a/src/services/diagnostic-service.js b/src/services/diagnostic-service.js index 3c5139128..0b8502a12 100644 --- a/src/services/diagnostic-service.js +++ b/src/services/diagnostic-service.js @@ -103,11 +103,11 @@ const postMicroserviceStraceDatatoFtp = async function (uuid, data, user, isCLI, const postMicroserviceImageSnapshotCreate = async function (microserviceUuid, user, isCLI, transaction) { const where = isCLI ? { - uuid: microserviceUuid - } + uuid: microserviceUuid + } : { - uuid: microserviceUuid - } + uuid: microserviceUuid + } const microservice = await MicroserviceManager.findOneWithDependencies(where, {}, transaction) @@ -129,11 +129,11 @@ const postMicroserviceImageSnapshotCreate = async function (microserviceUuid, us const getMicroserviceImageSnapshot = async function (microserviceUuid, user, isCLI, transaction) { const where = isCLI ? { - uuid: microserviceUuid - } + uuid: microserviceUuid + } : { - uuid: microserviceUuid - } + uuid: microserviceUuid + } const microservice = await MicroserviceManager.findOneWithDependencies(where, {}, transaction) if (!microservice) { throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.INVALID_MICROSERVICE_UUID, microserviceUuid)) diff --git a/src/services/microservices-service.js b/src/services/microservices-service.js index ec65e00d8..4c90f7185 100644 --- a/src/services/microservices-service.js +++ b/src/services/microservices-service.js @@ -351,11 +351,11 @@ async function updateMicroserviceEndPoint (microserviceUuid, microserviceData, u let needStatusReset = false const query = isCLI ? { - uuid: microserviceUuid - } + uuid: microserviceUuid + } : { - uuid: microserviceUuid - } + uuid: microserviceUuid + } // validate extraHosts const extraHosts = microserviceData.extraHosts ? await _validateExtraHosts(microserviceData, user, transaction) : null @@ -564,11 +564,11 @@ const _checkIfMicroserviceImagesAreEqual = (microserviceDataUpdateImages, catalo async function deleteMicroserviceEndPoint (microserviceUuid, microserviceData, user, isCLI, transaction) { const where = isCLI ? { - uuid: microserviceUuid - } + uuid: microserviceUuid + } : { - uuid: microserviceUuid - } + uuid: microserviceUuid + } const microservice = await MicroserviceManager.findOneWithStatusAndCategory(where, transaction) if (!microservice) { @@ -973,16 +973,16 @@ async function _checkForDuplicateName (name, item, applicationId, transaction) { if (name) { const where = item.id ? { - name: name, - uuid: { [Op.ne]: item.id }, - delete: false, - applicationId - } + name: name, + uuid: { [Op.ne]: item.id }, + delete: false, + applicationId + } : { - name: name, - applicationId, - delete: false - } + name: name, + applicationId, + delete: false + } const result = await MicroserviceManager.findOne(where, transaction) if (result) { diff --git a/src/services/registry-service.js b/src/services/registry-service.js index 5025c0b70..b5220cb99 100644 --- a/src/services/registry-service.js +++ b/src/services/registry-service.js @@ -53,13 +53,13 @@ const findRegistries = async function (user, isCLI, transaction) { const queryRegistry = isCLI ? {} : { - [Op.or]: + [Op.or]: [ { isPublic: true } ] - } + } const registries = await RegistryManager.findAllWithAttributes(queryRegistry, { exclude: ['password'] }, transaction) return { @@ -109,11 +109,11 @@ const updateRegistry = async function (registry, registryId, user, isCLI, transa const where = isCLI ? { - id: registryId - } + id: registryId + } : { - id: registryId - } + id: registryId + } await RegistryManager.update(where, registryUpdate, transaction) From c33a68e90372a02e788d3f7b17854973fa880cbd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emirhan=20Durmu=C5=9F?= Date: Mon, 18 Mar 2024 12:30:27 +0300 Subject: [PATCH 057/178] builtin auth decorator for users removed --- docs/swagger.yaml | 4 +-- package.json | 2 ++ src/controllers/application-controller.js | 23 +++++++------ .../application-template-controller.js | 17 +++++----- src/controllers/catalog-controller.js | 11 +++---- src/controllers/config-controller.js | 7 ++-- src/controllers/diagnostic-controller.js | 11 +++---- src/controllers/edge-resource-controller.js | 17 +++++----- src/controllers/iofog-controller.js | 22 ++++++------- src/controllers/microservices-controller.js | 33 +++++++++---------- src/controllers/registry-controller.js | 8 ++--- src/controllers/router-controller.js | 5 ++- src/controllers/routing-controller.js | 11 +++---- src/controllers/tunnel-controller.js | 4 +-- src/services/user-service.js | 2 +- 15 files changed, 85 insertions(+), 92 deletions(-) diff --git a/docs/swagger.yaml b/docs/swagger.yaml index eea611c12..81dcc1117 100755 --- a/docs/swagger.yaml +++ b/docs/swagger.yaml @@ -3191,11 +3191,11 @@ servers: components: securitySchemes: userToken: - type: apiKey + type: Bearer in: header name: Authorization agentToken: - type: apiKey + type: Bearer in: header name: Authorization requestBodies: diff --git a/package.json b/package.json index e09247a00..91b5e755e 100644 --- a/package.json +++ b/package.json @@ -69,12 +69,14 @@ "daemonize2": "0.4.2", "ejs": "3.1.7", "express": "4.17.3", + "express-session": "1.18.0", "formidable": "1.2.1", "ftp": "0.3.10", "helmet": "3.21.2", "is-elevated": "3.0.0", "js-yaml": "3.14.1", "jsonschema": "1.2.5", + "keycloak-connect": "24.0.1" , "minimatch": "3.1.2", "moment": "2.29.4", "moment-timezone": "0.5.38", diff --git a/src/controllers/application-controller.js b/src/controllers/application-controller.js index 6f16bf308..da06cfe8b 100644 --- a/src/controllers/application-controller.js +++ b/src/controllers/application-controller.js @@ -11,7 +11,6 @@ * */ -const AuthDecorator = require('./../decorators/authorization-decorator') const ApplicationService = require('../services/application-service') const YAMLParserService = require('../services/yaml-parser-service') const errors = require('../helpers/errors') @@ -101,15 +100,15 @@ const getApplicationByIdEndPoint = async function (req, user) { } module.exports = { - createApplicationEndPoint: AuthDecorator.checkAuthToken(createApplicationEndPoint), - createApplicationYAMLEndPoint: AuthDecorator.checkAuthToken(createApplicationYAMLEndPoint), - getApplicationsByUserEndPoint: AuthDecorator.checkAuthToken(getApplicationsByUserEndPoint), - getApplicationEndPoint: AuthDecorator.checkAuthToken(getApplicationEndPoint), - getApplicationByIdEndPoint: AuthDecorator.checkAuthToken(getApplicationByIdEndPoint), - updateApplicationEndPoint: AuthDecorator.checkAuthToken(updateApplicationEndPoint), - updateApplicationYAMLEndPoint: AuthDecorator.checkAuthToken(updateApplicationYAMLEndPoint), - patchApplicationEndPoint: AuthDecorator.checkAuthToken(patchApplicationEndPoint), - patchApplicationByIdEndPoint: AuthDecorator.checkAuthToken(patchApplicationByIdEndPoint), - deleteApplicationEndPoint: AuthDecorator.checkAuthToken(deleteApplicationEndPoint), - deleteApplicationByIdEndPoint: AuthDecorator.checkAuthToken(deleteApplicationByIdEndPoint) + createApplicationEndPoint: (createApplicationEndPoint), + createApplicationYAMLEndPoint: (createApplicationYAMLEndPoint), + getApplicationsByUserEndPoint: (getApplicationsByUserEndPoint), + getApplicationEndPoint: (getApplicationEndPoint), + getApplicationByIdEndPoint: (getApplicationByIdEndPoint), + updateApplicationEndPoint: (updateApplicationEndPoint), + updateApplicationYAMLEndPoint: (updateApplicationYAMLEndPoint), + patchApplicationEndPoint: (patchApplicationEndPoint), + patchApplicationByIdEndPoint: (patchApplicationByIdEndPoint), + deleteApplicationEndPoint: (deleteApplicationEndPoint), + deleteApplicationByIdEndPoint: (deleteApplicationByIdEndPoint) } diff --git a/src/controllers/application-template-controller.js b/src/controllers/application-template-controller.js index 9ebea7122..7a9e85d0a 100644 --- a/src/controllers/application-template-controller.js +++ b/src/controllers/application-template-controller.js @@ -11,7 +11,6 @@ * */ -const AuthDecorator = require('./../decorators/authorization-decorator') const ApplicationTemplateService = require('../services/application-template-service') const YAMLParserService = require('../services/yaml-parser-service') const errors = require('../helpers/errors') @@ -78,12 +77,12 @@ const deleteApplicationTemplateEndPoint = async function (req, user) { } module.exports = { - createApplicationTemplateEndPoint: AuthDecorator.checkAuthToken(createApplicationTemplateEndPoint), - getApplicationTemplatesByUserEndPoint: AuthDecorator.checkAuthToken(getApplicationTemplatesByUserEndPoint), - getApplicationTemplateEndPoint: AuthDecorator.checkAuthToken(getApplicationTemplateEndPoint), - updateApplicationTemplateEndPoint: AuthDecorator.checkAuthToken(updateApplicationTemplateEndPoint), - updateApplicationTemplateYAMLEndPoint: AuthDecorator.checkAuthToken(updateApplicationTemplateYAMLEndPoint), - patchApplicationTemplateEndPoint: AuthDecorator.checkAuthToken(patchApplicationTemplateEndPoint), - deleteApplicationTemplateEndPoint: AuthDecorator.checkAuthToken(deleteApplicationTemplateEndPoint), - createApplicationTemplateYAMLEndPoint: AuthDecorator.checkAuthToken(createApplicationTemplateYAMLEndPoint) + createApplicationTemplateEndPoint: (createApplicationTemplateEndPoint), + getApplicationTemplatesByUserEndPoint: (getApplicationTemplatesByUserEndPoint), + getApplicationTemplateEndPoint: (getApplicationTemplateEndPoint), + updateApplicationTemplateEndPoint: (updateApplicationTemplateEndPoint), + updateApplicationTemplateYAMLEndPoint: (updateApplicationTemplateYAMLEndPoint), + patchApplicationTemplateEndPoint: (patchApplicationTemplateEndPoint), + deleteApplicationTemplateEndPoint: (deleteApplicationTemplateEndPoint), + createApplicationTemplateYAMLEndPoint: (createApplicationTemplateYAMLEndPoint) } diff --git a/src/controllers/catalog-controller.js b/src/controllers/catalog-controller.js index 5902d55d9..1559e7935 100644 --- a/src/controllers/catalog-controller.js +++ b/src/controllers/catalog-controller.js @@ -12,7 +12,6 @@ */ const CatalogService = require('../services/catalog-service') -const AuthDecorator = require('./../decorators/authorization-decorator') const createCatalogItemEndPoint = async function (req) { const user = req.kauth.grant.access_token.content @@ -36,9 +35,9 @@ const updateCatalogItemEndPoint = async function (req, user) { } module.exports = { - createCatalogItemEndPoint: AuthDecorator.checkAuthToken(createCatalogItemEndPoint), - listCatalogItemsEndPoint: AuthDecorator.checkAuthToken(listCatalogItemsEndPoint), - listCatalogItemEndPoint: AuthDecorator.checkAuthToken(listCatalogItemEndPoint), - deleteCatalogItemEndPoint: AuthDecorator.checkAuthToken(deleteCatalogItemEndPoint), - updateCatalogItemEndPoint: AuthDecorator.checkAuthToken(updateCatalogItemEndPoint) + createCatalogItemEndPoint: (createCatalogItemEndPoint), + listCatalogItemsEndPoint: (listCatalogItemsEndPoint), + listCatalogItemEndPoint: (listCatalogItemEndPoint), + deleteCatalogItemEndPoint: (deleteCatalogItemEndPoint), + updateCatalogItemEndPoint: (updateCatalogItemEndPoint) } diff --git a/src/controllers/config-controller.js b/src/controllers/config-controller.js index c6846baf4..0b57a14fc 100644 --- a/src/controllers/config-controller.js +++ b/src/controllers/config-controller.js @@ -11,7 +11,6 @@ * */ -const AuthDecorator = require('./../decorators/authorization-decorator') const ConfigService = require('../services/config-service') const upsertConfigElementEndpoint = async function (req, user) { @@ -29,7 +28,7 @@ const getConfigEndpoint = async function (req, user) { } module.exports = { - upsertConfigElementEndpoint: AuthDecorator.checkAuthToken(upsertConfigElementEndpoint), - listConfigEndpoint: AuthDecorator.checkAuthToken(listConfigEndpoint), - getConfigEndpoint: AuthDecorator.checkAuthToken(getConfigEndpoint) + upsertConfigElementEndpoint: (upsertConfigElementEndpoint), + listConfigEndpoint: (listConfigEndpoint), + getConfigEndpoint: (getConfigEndpoint) } diff --git a/src/controllers/diagnostic-controller.js b/src/controllers/diagnostic-controller.js index d7ae6e199..640ae6642 100644 --- a/src/controllers/diagnostic-controller.js +++ b/src/controllers/diagnostic-controller.js @@ -12,7 +12,6 @@ */ const DiagnosticService = require('../services/diagnostic-service') -const AuthDecorator = require('./../decorators/authorization-decorator') const changeMicroserviceStraceStateEndPoint = async function (req, user) { return DiagnosticService.changeMicroserviceStraceState(req.params.uuid, req.body, user, false) @@ -35,9 +34,9 @@ const getMicroserviceImageSnapshotEndPoint = async function (req, user) { } module.exports = { - changeMicroserviceStraceStateEndPoint: AuthDecorator.checkAuthToken(changeMicroserviceStraceStateEndPoint), - getMicroserviceStraceDataEndPoint: AuthDecorator.checkAuthToken(getMicroserviceStraceDataEndPoint), - postMicroserviceStraceDataToFtpEndPoint: AuthDecorator.checkAuthToken(postMicroserviceStraceDataToFtpEndPoint), - createMicroserviceImageSnapshotEndPoint: AuthDecorator.checkAuthToken(createMicroserviceImageSnapshotEndPoint), - getMicroserviceImageSnapshotEndPoint: AuthDecorator.checkAuthToken(getMicroserviceImageSnapshotEndPoint) + changeMicroserviceStraceStateEndPoint: (changeMicroserviceStraceStateEndPoint), + getMicroserviceStraceDataEndPoint: (getMicroserviceStraceDataEndPoint), + postMicroserviceStraceDataToFtpEndPoint: (postMicroserviceStraceDataToFtpEndPoint), + createMicroserviceImageSnapshotEndPoint: (createMicroserviceImageSnapshotEndPoint), + getMicroserviceImageSnapshotEndPoint: (getMicroserviceImageSnapshotEndPoint) } diff --git a/src/controllers/edge-resource-controller.js b/src/controllers/edge-resource-controller.js index 9cd0dccdd..f6ca86473 100644 --- a/src/controllers/edge-resource-controller.js +++ b/src/controllers/edge-resource-controller.js @@ -11,7 +11,6 @@ * */ -const AuthDecorator = require('./../decorators/authorization-decorator') const EdgeResourceService = require('../services/edge-resource-service') const createEdgeResourceEndpoint = async function (req, user) { @@ -63,12 +62,12 @@ const unlinkEdgeResourceEndpoint = async function (req, user) { } module.exports = { - createEdgeResourceEndpoint: AuthDecorator.checkAuthToken(createEdgeResourceEndpoint), - updateEdgeResourceEndpoint: AuthDecorator.checkAuthToken(updateEdgeResourceEndpoint), - listEdgeResourcesEndpoint: AuthDecorator.checkAuthToken(listEdgeResourcesEndpoint), - getEdgeResourceEndpoint: AuthDecorator.checkAuthToken(getEdgeResourceEndpoint), - deleteEdgeResourceEndpoint: AuthDecorator.checkAuthToken(deleteEdgeResourceEndpoint), - linkEdgeResourceEndpoint: AuthDecorator.checkAuthToken(linkEdgeResourceEndpoint), - unlinkEdgeResourceEndpoint: AuthDecorator.checkAuthToken(unlinkEdgeResourceEndpoint), - getEdgeResourceAllVersionsEndpoint: AuthDecorator.checkAuthToken(getEdgeResourceAllVersionsEndpoint) + createEdgeResourceEndpoint: (createEdgeResourceEndpoint), + updateEdgeResourceEndpoint: (updateEdgeResourceEndpoint), + listEdgeResourcesEndpoint: (listEdgeResourcesEndpoint), + getEdgeResourceEndpoint: (getEdgeResourceEndpoint), + deleteEdgeResourceEndpoint: (deleteEdgeResourceEndpoint), + linkEdgeResourceEndpoint: (linkEdgeResourceEndpoint), + unlinkEdgeResourceEndpoint: (unlinkEdgeResourceEndpoint), + getEdgeResourceAllVersionsEndpoint: (getEdgeResourceAllVersionsEndpoint) } diff --git a/src/controllers/iofog-controller.js b/src/controllers/iofog-controller.js index 00e540fce..817c7eff3 100644 --- a/src/controllers/iofog-controller.js +++ b/src/controllers/iofog-controller.js @@ -95,15 +95,15 @@ async function setFogPruneCommandEndPoint (req, user) { } module.exports = { - createFogEndPoint: AuthDecorator.checkAuthToken(createFogEndPoint), - updateFogEndPoint: AuthDecorator.checkAuthToken(updateFogEndPoint), - deleteFogEndPoint: AuthDecorator.checkAuthToken(deleteFogEndPoint), - getFogEndPoint: AuthDecorator.checkAuthToken(getFogEndPoint), - getFogListEndPoint: AuthDecorator.checkAuthToken(getFogListEndPoint), - generateProvisioningKeyEndPoint: AuthDecorator.checkAuthToken(generateProvisionKeyEndPoint), - setFogVersionCommandEndPoint: AuthDecorator.checkAuthToken(setFogVersionCommandEndPoint), - setFogRebootCommandEndPoint: AuthDecorator.checkAuthToken(setFogRebootCommandEndPoint), - getHalHardwareInfoEndPoint: AuthDecorator.checkAuthToken(getHalHardwareInfoEndPoint), - getHalUsbInfoEndPoint: AuthDecorator.checkAuthToken(getHalUsbInfoEndPoint), - setFogPruneCommandEndPoint: AuthDecorator.checkAuthToken(setFogPruneCommandEndPoint) + createFogEndPoint: (createFogEndPoint), + updateFogEndPoint: (updateFogEndPoint), + deleteFogEndPoint: (deleteFogEndPoint), + getFogEndPoint: (getFogEndPoint), + getFogListEndPoint: (getFogListEndPoint), + generateProvisioningKeyEndPoint: (generateProvisionKeyEndPoint), + setFogVersionCommandEndPoint: (setFogVersionCommandEndPoint), + setFogRebootCommandEndPoint: (setFogRebootCommandEndPoint), + getHalHardwareInfoEndPoint: (getHalHardwareInfoEndPoint), + getHalUsbInfoEndPoint: (getHalUsbInfoEndPoint), + setFogPruneCommandEndPoint: (setFogPruneCommandEndPoint) } diff --git a/src/controllers/microservices-controller.js b/src/controllers/microservices-controller.js index 32fe33e40..f2ff25531 100644 --- a/src/controllers/microservices-controller.js +++ b/src/controllers/microservices-controller.js @@ -11,7 +11,6 @@ * */ -const AuthDecorator = require('./../decorators/authorization-decorator') const MicroservicesService = require('../services/microservices-service') const YAMLParserService = require('../services/yaml-parser-service') const { rvaluesVarSubstition } = require('../helpers/template-helper') @@ -121,20 +120,20 @@ const listAllPublicPortsEndPoint = async function (req, user) { } module.exports = { - createMicroserviceOnFogEndPoint: AuthDecorator.checkAuthToken(createMicroserviceOnFogEndPoint), - getMicroserviceEndPoint: AuthDecorator.checkAuthToken(getMicroserviceEndPoint), - updateMicroserviceEndPoint: AuthDecorator.checkAuthToken(updateMicroserviceEndPoint), - deleteMicroserviceEndPoint: AuthDecorator.checkAuthToken(deleteMicroserviceEndPoint), - getMicroservicesByApplicationEndPoint: AuthDecorator.checkAuthToken(getMicroservicesByApplicationEndPoint), - createMicroserviceRouteEndPoint: AuthDecorator.checkAuthToken(createMicroserviceRouteEndPoint), - deleteMicroserviceRouteEndPoint: AuthDecorator.checkAuthToken(deleteMicroserviceRouteEndPoint), - createMicroservicePortMappingEndPoint: AuthDecorator.checkAuthToken(createMicroservicePortMappingEndPoint), - deleteMicroservicePortMappingEndPoint: AuthDecorator.checkAuthToken(deleteMicroservicePortMappingEndPoint), - getMicroservicePortMappingListEndPoint: AuthDecorator.checkAuthToken(listMicroservicePortMappingsEndPoint), - createMicroserviceVolumeMappingEndPoint: AuthDecorator.checkAuthToken(createMicroserviceVolumeMappingEndPoint), - listMicroserviceVolumeMappingsEndPoint: AuthDecorator.checkAuthToken(listMicroserviceVolumeMappingsEndPoint), - deleteMicroserviceVolumeMappingEndPoint: AuthDecorator.checkAuthToken(deleteMicroserviceVolumeMappingEndPoint), - listAllPublicPortsEndPoint: AuthDecorator.checkAuthToken(listAllPublicPortsEndPoint), - createMicroserviceYAMLEndPoint: AuthDecorator.checkAuthToken(createMicroserviceYAMLEndPoint), - updateMicroserviceYAMLEndPoint: AuthDecorator.checkAuthToken(updateMicroserviceYAMLEndPoint) + createMicroserviceOnFogEndPoint: (createMicroserviceOnFogEndPoint), + getMicroserviceEndPoint: (getMicroserviceEndPoint), + updateMicroserviceEndPoint: (updateMicroserviceEndPoint), + deleteMicroserviceEndPoint: (deleteMicroserviceEndPoint), + getMicroservicesByApplicationEndPoint: (getMicroservicesByApplicationEndPoint), + createMicroserviceRouteEndPoint: (createMicroserviceRouteEndPoint), + deleteMicroserviceRouteEndPoint: (deleteMicroserviceRouteEndPoint), + createMicroservicePortMappingEndPoint: (createMicroservicePortMappingEndPoint), + deleteMicroservicePortMappingEndPoint: (deleteMicroservicePortMappingEndPoint), + getMicroservicePortMappingListEndPoint: (listMicroservicePortMappingsEndPoint), + createMicroserviceVolumeMappingEndPoint: (createMicroserviceVolumeMappingEndPoint), + listMicroserviceVolumeMappingsEndPoint: (listMicroserviceVolumeMappingsEndPoint), + deleteMicroserviceVolumeMappingEndPoint: (deleteMicroserviceVolumeMappingEndPoint), + listAllPublicPortsEndPoint: (listAllPublicPortsEndPoint), + createMicroserviceYAMLEndPoint: (createMicroserviceYAMLEndPoint), + updateMicroserviceYAMLEndPoint: (updateMicroserviceYAMLEndPoint) } diff --git a/src/controllers/registry-controller.js b/src/controllers/registry-controller.js index 7c05aabb7..0317873e3 100644 --- a/src/controllers/registry-controller.js +++ b/src/controllers/registry-controller.js @@ -37,8 +37,8 @@ const updateRegistryEndPoint = async function (req, user) { } module.exports = { - createRegistryEndPoint: AuthDecorator.checkAuthToken(createRegistryEndPoint), - getRegistriesEndPoint: AuthDecorator.checkAuthToken(getRegistriesEndPoint), - deleteRegistryEndPoint: AuthDecorator.checkAuthToken(deleteRegistryEndPoint), - updateRegistryEndPoint: AuthDecorator.checkAuthToken(updateRegistryEndPoint) + createRegistryEndPoint: (createRegistryEndPoint), + getRegistriesEndPoint: (getRegistriesEndPoint), + deleteRegistryEndPoint: (deleteRegistryEndPoint), + updateRegistryEndPoint: (updateRegistryEndPoint) } diff --git a/src/controllers/router-controller.js b/src/controllers/router-controller.js index 0d61f536e..7c3734145 100644 --- a/src/controllers/router-controller.js +++ b/src/controllers/router-controller.js @@ -11,7 +11,6 @@ * */ -const AuthDecorator = require('./../decorators/authorization-decorator') const RouterService = require('../services/router-service') const upsertDefaultRouter = async function (req) { @@ -24,6 +23,6 @@ const getRouterEndPoint = async function () { } module.exports = { - upsertDefaultRouter: AuthDecorator.checkAuthToken(upsertDefaultRouter), - getRouterEndPoint: AuthDecorator.checkAuthToken(getRouterEndPoint) + upsertDefaultRouter: (upsertDefaultRouter), + getRouterEndPoint: (getRouterEndPoint) } diff --git a/src/controllers/routing-controller.js b/src/controllers/routing-controller.js index b151924f8..01b5f8ec8 100644 --- a/src/controllers/routing-controller.js +++ b/src/controllers/routing-controller.js @@ -11,7 +11,6 @@ * */ -const AuthDecorator = require('./../decorators/authorization-decorator') const RoutingService = require('../services/routing-service') const createRoutingEndpoint = async function (req, user) { @@ -43,9 +42,9 @@ const deleteRoutingEndpoint = async function (req, user) { } module.exports = { - deleteRoutingEndpoint: AuthDecorator.checkAuthToken(deleteRoutingEndpoint), - updateRoutingEndpoint: AuthDecorator.checkAuthToken(updateRoutingEndpoint), - createRoutingEndpoint: AuthDecorator.checkAuthToken(createRoutingEndpoint), - getRoutingEndPoint: AuthDecorator.checkAuthToken(getRoutingEndPoint), - getRoutingsEndPoint: AuthDecorator.checkAuthToken(getRoutingsEndPoint) + deleteRoutingEndpoint: (deleteRoutingEndpoint), + updateRoutingEndpoint: (updateRoutingEndpoint), + createRoutingEndpoint: (createRoutingEndpoint), + getRoutingEndPoint: (getRoutingEndPoint), + getRoutingsEndPoint: (getRoutingsEndPoint) } diff --git a/src/controllers/tunnel-controller.js b/src/controllers/tunnel-controller.js index fc4da747a..396fe5b49 100644 --- a/src/controllers/tunnel-controller.js +++ b/src/controllers/tunnel-controller.js @@ -42,6 +42,6 @@ const getTunnelEndPoint = async function (req, user) { } module.exports = { - manageTunnelEndPoint: AuthDecorator.checkAuthToken(manageTunnelEndPoint), - getTunnelEndPoint: AuthDecorator.checkAuthToken(getTunnelEndPoint) + manageTunnelEndPoint: (manageTunnelEndPoint), + getTunnelEndPoint: (getTunnelEndPoint) } diff --git a/src/services/user-service.js b/src/services/user-service.js index 42dd2b082..94aaae0b5 100644 --- a/src/services/user-service.js +++ b/src/services/user-service.js @@ -29,7 +29,7 @@ const login = async function (credentials, isCLI, transaction) { const config = { method: 'post', maxBodyLength: Infinity, - url: `${process.env.KC_URL}/realms/${process.env.KC_REALM}/protocol/openid-connect/token`, + url: `${process.env.KC_URL}realms/${process.env.KC_REALM}/protocol/openid-connect/token`, headers: { 'Cache-Control': 'no-cache', 'Content-Type': 'application/x-www-form-urlencoded' From e637ebb8843c9dd9f2af37f0c557b815a49b9f7b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emirhan=20Durmu=C5=9F?= Date: Mon, 18 Mar 2024 12:41:01 +0300 Subject: [PATCH 058/178] removed missing builtin auth decorator --- src/controllers/iofog-controller.js | 1 - src/controllers/registry-controller.js | 1 - src/controllers/tunnel-controller.js | 1 - 3 files changed, 3 deletions(-) diff --git a/src/controllers/iofog-controller.js b/src/controllers/iofog-controller.js index 817c7eff3..2a6c793c7 100644 --- a/src/controllers/iofog-controller.js +++ b/src/controllers/iofog-controller.js @@ -11,7 +11,6 @@ * */ -const AuthDecorator = require('../decorators/authorization-decorator') const FogService = require('../services/iofog-service') const qs = require('qs') diff --git a/src/controllers/registry-controller.js b/src/controllers/registry-controller.js index 0317873e3..906db93cf 100644 --- a/src/controllers/registry-controller.js +++ b/src/controllers/registry-controller.js @@ -11,7 +11,6 @@ * */ -const AuthDecorator = require('../decorators/authorization-decorator') const RegistryService = require('../services/registry-service') const createRegistryEndPoint = async function (req, user) { diff --git a/src/controllers/tunnel-controller.js b/src/controllers/tunnel-controller.js index 396fe5b49..7bc0ac9be 100644 --- a/src/controllers/tunnel-controller.js +++ b/src/controllers/tunnel-controller.js @@ -11,7 +11,6 @@ * */ -const AuthDecorator = require('../decorators/authorization-decorator') const TunnelService = require('../services/tunnel-service') const Errors = require('../helpers/errors') const ErrorMessages = require('../helpers/error-messages') From de5c600302062c2a264be75d808d8c9adbece63f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emirhan=20Durmu=C5=9F?= Date: Mon, 18 Mar 2024 13:21:45 +0300 Subject: [PATCH 059/178] axios ssl self signed issue fixed --- package.json | 1 + src/routes/catalog.js | 2 +- src/services/user-service.js | 8 +++++++- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 91b5e755e..a98aa80a9 100644 --- a/package.json +++ b/package.json @@ -73,6 +73,7 @@ "formidable": "1.2.1", "ftp": "0.3.10", "helmet": "3.21.2", + "https": "1.0.0", "is-elevated": "3.0.0", "js-yaml": "3.14.1", "jsonschema": "1.2.5", diff --git a/src/routes/catalog.js b/src/routes/catalog.js index f5b3bdaf4..945864312 100644 --- a/src/routes/catalog.js +++ b/src/routes/catalog.js @@ -15,7 +15,7 @@ const CatalogController = require('../controllers/catalog-controller') const ResponseDecorator = require('../decorators/response-decorator') const Errors = require('../helpers/errors') const logger = require('../logger') -const keycloak = require('../config/keycloak') +const keycloak = require('../config/keycloak.js').getKeycloak() module.exports = [ { diff --git a/src/services/user-service.js b/src/services/user-service.js index 94aaae0b5..2e9f4f4dc 100644 --- a/src/services/user-service.js +++ b/src/services/user-service.js @@ -15,6 +15,7 @@ const Errors = require('../helpers/errors') const TransactionDecorator = require('../decorators/transaction-decorator') const axios = require('axios') const qs = require('qs') +const https = require('https') const login = async function (credentials, isCLI, transaction) { try { @@ -26,6 +27,10 @@ const login = async function (credentials, isCLI, transaction) { client_secret: process.env.KC_CLIENT_SECRET }) + const agent = new https.Agent({ + rejectUnauthorized: false // Ignore SSL certificate errors + }) + const config = { method: 'post', maxBodyLength: Infinity, @@ -34,7 +39,8 @@ const login = async function (credentials, isCLI, transaction) { 'Cache-Control': 'no-cache', 'Content-Type': 'application/x-www-form-urlencoded' }, - data: data + data: data, + httpsAgent: agent } // Make a POST request to Keycloak token endpoint From c75c93b21562f1cb789b3900a9319373fbd980ad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emirhan=20Durmu=C5=9F?= Date: Mon, 18 Mar 2024 17:27:08 +0300 Subject: [PATCH 060/178] listCatalogItemsEndPoint edited for keycloak test --- src/controllers/catalog-controller.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/controllers/catalog-controller.js b/src/controllers/catalog-controller.js index 1559e7935..e5c38e7a4 100644 --- a/src/controllers/catalog-controller.js +++ b/src/controllers/catalog-controller.js @@ -18,8 +18,9 @@ const createCatalogItemEndPoint = async function (req) { return CatalogService.createCatalogItemEndPoint(req.body, user) } -const listCatalogItemsEndPoint = async function (req, user) { - return CatalogService.listCatalogItemsEndPoint(user, false) +const listCatalogItemsEndPoint = async function (req) { + const user = req.kauth.grant.access_token.content + return CatalogService.listCatalogItemsEndPoint(req.body, user) } const listCatalogItemEndPoint = async function (req, user) { From 7f3e78c15c8b1cc2fe68fdb9996865903c1f1a8f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emirhan=20Durmu=C5=9F?= Date: Mon, 18 Mar 2024 18:40:00 +0300 Subject: [PATCH 061/178] keycloak protect added to server.js --- src/controllers/catalog-controller.js | 8 ++--- src/routes/catalog.js | 52 +++++++++++++-------------- src/server.js | 2 +- 3 files changed, 28 insertions(+), 34 deletions(-) diff --git a/src/controllers/catalog-controller.js b/src/controllers/catalog-controller.js index e5c38e7a4..afed875af 100644 --- a/src/controllers/catalog-controller.js +++ b/src/controllers/catalog-controller.js @@ -13,14 +13,12 @@ const CatalogService = require('../services/catalog-service') -const createCatalogItemEndPoint = async function (req) { - const user = req.kauth.grant.access_token.content +const createCatalogItemEndPoint = async function (req, user) { return CatalogService.createCatalogItemEndPoint(req.body, user) } -const listCatalogItemsEndPoint = async function (req) { - const user = req.kauth.grant.access_token.content - return CatalogService.listCatalogItemsEndPoint(req.body, user) +const listCatalogItemsEndPoint = async function (req, user) { + return CatalogService.listCatalogItemsEndPoint(user, false) } const listCatalogItemEndPoint = async function (req, user) { diff --git a/src/routes/catalog.js b/src/routes/catalog.js index 945864312..c547edcd9 100644 --- a/src/routes/catalog.js +++ b/src/routes/catalog.js @@ -15,39 +15,35 @@ const CatalogController = require('../controllers/catalog-controller') const ResponseDecorator = require('../decorators/response-decorator') const Errors = require('../helpers/errors') const logger = require('../logger') -const keycloak = require('../config/keycloak.js').getKeycloak() module.exports = [ { method: 'get', path: '/api/v1/catalog/microservices', - middleware: [ - keycloak.protect(['Admin', 'SRE', 'Developer', 'Viewer']), - async (req, res) => { - logger.apiReq(req) - - const successCode = constants.HTTP_CODE_SUCCESS - const errorCodes = [ - { - code: constants.HTTP_CODE_UNAUTHORIZED, - errors: [Errors.AuthenticationError] - } - ] - - const listCatalogItemsEndPoint = ResponseDecorator.handleErrors( - CatalogController.listCatalogItemsEndPoint, - successCode, - errorCodes - ) - const responseObject = await listCatalogItemsEndPoint(req) - - res - .status(responseObject.code) - .send(responseObject.body) - - logger.apiRes({ req, res: responseObject }) - } - ] + middleware: async (req, res) => { + logger.apiReq(req) + + const successCode = constants.HTTP_CODE_SUCCESS + const errorCodes = [ + { + code: constants.HTTP_CODE_UNAUTHORIZED, + errors: [Errors.AuthenticationError] + } + ] + + const listCatalogItemsEndPoint = ResponseDecorator.handleErrors( + CatalogController.listCatalogItemsEndPoint, + successCode, + errorCodes + ) + const responseObject = await listCatalogItemsEndPoint(req) + + res + .status(responseObject.code) + .send(responseObject.body) + + logger.apiRes({ req: req, res: responseObject }) + } }, { method: 'post', diff --git a/src/server.js b/src/server.js index 2be52d2af..eb04c6e10 100755 --- a/src/server.js +++ b/src/server.js @@ -84,7 +84,7 @@ app.use((req, res, next) => { global.appRoot = path.resolve(__dirname) const registerRoute = (route) => { - const middlewares = [keycloak.middleware(), route.middleware] + const middlewares = [keycloak.middleware(), keycloak.protect('SRE'), route.middleware] if (route.supportSubstitution) { middlewares.unshift(substitutionMiddleware) } From ea9c538038054be09645a0c47503968824c48e45 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emirhan=20Durmu=C5=9F?= Date: Mon, 18 Mar 2024 19:18:55 +0300 Subject: [PATCH 062/178] test keycloak.protect --- src/routes/catalog.js | 15 ++++++++++----- src/server.js | 2 +- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/src/routes/catalog.js b/src/routes/catalog.js index c547edcd9..583b5a82f 100644 --- a/src/routes/catalog.js +++ b/src/routes/catalog.js @@ -15,6 +15,7 @@ const CatalogController = require('../controllers/catalog-controller') const ResponseDecorator = require('../decorators/response-decorator') const Errors = require('../helpers/errors') const logger = require('../logger') +const keycloak = require('../config/keycloak.js').initKeycloak() module.exports = [ { @@ -36,13 +37,17 @@ module.exports = [ successCode, errorCodes ) - const responseObject = await listCatalogItemsEndPoint(req) - res - .status(responseObject.code) - .send(responseObject.body) + // Add keycloak.protect() middleware to protect the route + await keycloak.protect('SRE')(req, res, async () => { + const responseObject = await listCatalogItemsEndPoint(req) + + res + .status(responseObject.code) + .send(responseObject.body) - logger.apiRes({ req: req, res: responseObject }) + logger.apiRes({ req: req, res: responseObject }) + }) } }, { diff --git a/src/server.js b/src/server.js index eb04c6e10..92dcac4be 100755 --- a/src/server.js +++ b/src/server.js @@ -84,7 +84,7 @@ app.use((req, res, next) => { global.appRoot = path.resolve(__dirname) const registerRoute = (route) => { - const middlewares = [keycloak.middleware(), keycloak.protect('SRE'), route.middleware] + const middlewares = [route.middleware] if (route.supportSubstitution) { middlewares.unshift(substitutionMiddleware) } From be8baf5786ac107cbf5b7b8770f614f4f49c69b3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emirhan=20Durmu=C5=9F?= Date: Tue, 19 Mar 2024 17:56:02 +0300 Subject: [PATCH 063/178] keycloak protection added to all endpoints, old migration and seeder files removed, nonused components deleted, swagger files updated, user profile endpoint created --- .github/PULL_REQUEST_TEMPLATE.md | 15 - azure-pipelines.yml | 227 ---- azure-templates/test.yml | 39 - docs/swagger.json | 1156 ++++------------- docs/swagger.yaml | 493 +------ package-lock.json | 631 ++++++++- scripts/cli-tests.js | 1 - src/cli/config.js | 65 +- src/cli/controller.js | 3 +- src/config/constants.js | 3 - src/config/default.json | 4 - src/config/development.json | 6 +- src/config/production.json | 3 - src/config/test.json | 3 - src/controllers/user-controller.js | 7 +- .../migrations/20180930164635-create-flow.js | 43 - .../20180930173823-create-registry.js | 49 - .../20180930184436-create-catalog-item.js | 77 -- .../20180930184703-create-fog-type.js | 47 - ...0180930184921-create-catalog-item-image.js | 33 - ...30194506-create-catalog-item-input-type.js | 31 - ...0195746-create-catalog-item-output-type.js | 31 - .../migrations/20180930225403-create-fog.js | 271 ---- .../20180930225846-create-change-tracking.js | 67 - .../20180930230219-create-fog-access-token.js | 37 - ...20180930230626-create-fog-provision-key.js | 38 - ...180930231241-create-fog-version-command.js | 27 - .../20180930231536-create-hw-info.js | 38 - .../20180930232242-create-usb-info.js | 38 - .../20180930232508-create-tunnel.js | 53 - .../20181001062956-create-microservice.js | 100 -- ...20181001070828-create-microservice-port.js | 45 - ...181001071315-create-microservice-status.js | 57 - .../20181001071628-create-connector.js | 51 - .../20181001071858-create-connector-port.js | 69 - ...0181001073429-create-strace-diagnostics.js | 32 - .../20181003102815-create-volume-mapping.js | 35 - .../20181022110529-create-routing.js | 64 - ...2114905-create-microservice-public-mode.js | 47 - ...4923-drop-need-update-col-microservices.js | 14 - ...croservice-status-add-missing-time-cols.js | 18 - ...81102163657-microservice-add-col-remove.js | 14 - ...king-container-to-microservice-renaming.js | 17 - .../20181113094807-add-missing-constraints.js | 133 -- .../20190117110458-create-tracking-event.js | 44 - ...0190226111416-add-system-metrics-to-fog.js | 50 - ...190305142715-add-security-status-fields.js | 44 - .../20190409055710-add-microservices-env.js | 31 - .../20190410055710-add-microservices-arg.js | 27 - .../20190704043715-agent-external-ip.js | 37 - ...tem images to be linked to microservice.js | 16 - .../20190916030304-connector-health.js | 15 - .../20190916030532-connector-port-deletion.js | 15 - .../20200123000302-system-fog-and-flow.js | 39 - .../20200123045032-fog-and-change-tracking.js | 50 - .../20200123163412-create-router.js | 91 -- ...123205245-router-port-host-agent-config.js | 18 - .../20200124040224-router-changed-flag.js | 29 - .../20200202113124-create-public-ports.js | 65 - .../20200213033350-create-config.js | 39 - ...0200220210224-change-tracking-timestamp.js | 15 - .../20200316011904-microservice-extra-host.js | 52 - .../migrations/20200316032240-add-fog-host.js | 27 - .../20200323050813-fog-update-messagespeed.js | 22 - .../20200420020250-remove-connector.js | 136 -- .../20200423201804-add-volume-mapping-type.js | 13 - .../20200506004924-add-route-name.js | 17 - .../migrations/20200512044934-rename-flow.js | 11 - ...200512214530-add-application-to-routing.js | 25 - ...200901053246-add-percentage-msvc-status.js | 14 - .../20201001230303-add-tags-fogs.js | 46 - .../20201028005645-create-edge-resources.js | 113 -- ...003849-create-edge-resources-agent-flag.js | 15 - ...203011708-microservice-status-error-msg.js | 14 - ...1204003312-create_application_templates.js | 87 -- ...0104191500-add_custom_to_edge_resources.js | 22 - .../20210118012712-add_is_udp_to_port.js | 21 - ...11019214923-add-schemes-to-public-ports.js | 22 - ...0211020014715-add-index-to-public-ports.js | 17 - ...211022010318-add-unique-constraint-msvc.js | 30 - ...11022013326-add-unique-constraint-route.js | 30 - ...220405053419-add-time-zone-agent-config.js | 27 - .../20220409021708-drop-table-tracking.js | 25 - .../20221021102712-add_is_proxy_to_port.js | 21 - .../20221021132000-create-proxy-ports.js | 52 - ...021152712-add_admin_port_to_proxy_ports.js | 21 - ...0221031162712-add_tokens_to_proxy_ports.js | 21 - ...51246-add_port_uuid_to_proxy_ports copy.js | 27 - .../seeders/20180928110125-insert-registry.js | 34 - .../20180928111532-insert-catalog-item.js | 168 --- .../20180928112152-insert-iofog-type.js | 50 - ...0180928121334-insert-catalog-item-image.js | 132 -- ...90130112616-insert-logging-catalog-item.js | 42 - ...1441-insert-json-generator-catalog-item.js | 38 - .../20190218103641-adding-default-configs.js | 80 -- ...200122200231-insert-router-catalog-item.js | 87 -- ...200313163114-update-router-catalog-item.js | 58 - ...9163114-insert-port-router-catalog-item.js | 57 - src/{config => }/keycloak.json | 0 src/routes/application.js | 115 +- src/routes/applicationTemplate.js | 113 +- src/routes/capabilities.js | 13 +- src/routes/catalog.js | 59 +- src/routes/config.js | 48 +- src/routes/diagnostics.js | 136 +- src/routes/edgeResource.js | 127 +- src/routes/flow.js | 76 +- src/routes/iofog.js | 170 ++- src/routes/microservices.js | 282 ++-- src/routes/registries.js | 63 +- src/routes/router.js | 41 +- src/routes/routing.js | 115 +- src/routes/tunnel.js | 41 +- src/routes/user.js | 34 +- src/services/user-service.js | 38 +- src/views/email-activation-temp.js | 140 -- src/views/email-temp.js | 76 -- src/views/reset-password-temp.js | 126 -- 118 files changed, 1887 insertions(+), 6457 deletions(-) delete mode 100644 .github/PULL_REQUEST_TEMPLATE.md delete mode 100755 azure-pipelines.yml delete mode 100644 azure-templates/test.yml delete mode 100644 src/data/migrations/20180930164635-create-flow.js delete mode 100644 src/data/migrations/20180930173823-create-registry.js delete mode 100644 src/data/migrations/20180930184436-create-catalog-item.js delete mode 100644 src/data/migrations/20180930184703-create-fog-type.js delete mode 100644 src/data/migrations/20180930184921-create-catalog-item-image.js delete mode 100644 src/data/migrations/20180930194506-create-catalog-item-input-type.js delete mode 100644 src/data/migrations/20180930195746-create-catalog-item-output-type.js delete mode 100644 src/data/migrations/20180930225403-create-fog.js delete mode 100644 src/data/migrations/20180930225846-create-change-tracking.js delete mode 100644 src/data/migrations/20180930230219-create-fog-access-token.js delete mode 100644 src/data/migrations/20180930230626-create-fog-provision-key.js delete mode 100644 src/data/migrations/20180930231241-create-fog-version-command.js delete mode 100644 src/data/migrations/20180930231536-create-hw-info.js delete mode 100644 src/data/migrations/20180930232242-create-usb-info.js delete mode 100644 src/data/migrations/20180930232508-create-tunnel.js delete mode 100644 src/data/migrations/20181001062956-create-microservice.js delete mode 100644 src/data/migrations/20181001070828-create-microservice-port.js delete mode 100644 src/data/migrations/20181001071315-create-microservice-status.js delete mode 100644 src/data/migrations/20181001071628-create-connector.js delete mode 100644 src/data/migrations/20181001071858-create-connector-port.js delete mode 100644 src/data/migrations/20181001073429-create-strace-diagnostics.js delete mode 100644 src/data/migrations/20181003102815-create-volume-mapping.js delete mode 100644 src/data/migrations/20181022110529-create-routing.js delete mode 100644 src/data/migrations/20181022114905-create-microservice-public-mode.js delete mode 100644 src/data/migrations/20181031094923-drop-need-update-col-microservices.js delete mode 100644 src/data/migrations/20181102105758-microservice-status-add-missing-time-cols.js delete mode 100644 src/data/migrations/20181102163657-microservice-add-col-remove.js delete mode 100644 src/data/migrations/20181105120036-change-tracking-container-to-microservice-renaming.js delete mode 100644 src/data/migrations/20181113094807-add-missing-constraints.js delete mode 100644 src/data/migrations/20190117110458-create-tracking-event.js delete mode 100644 src/data/migrations/20190226111416-add-system-metrics-to-fog.js delete mode 100644 src/data/migrations/20190305142715-add-security-status-fields.js delete mode 100644 src/data/migrations/20190409055710-add-microservices-env.js delete mode 100644 src/data/migrations/20190410055710-add-microservices-arg.js delete mode 100644 src/data/migrations/20190704043715-agent-external-ip.js delete mode 100644 src/data/migrations/20190830071324-update catalog item images to be linked to microservice.js delete mode 100644 src/data/migrations/20190916030304-connector-health.js delete mode 100644 src/data/migrations/20190916030532-connector-port-deletion.js delete mode 100644 src/data/migrations/20200123000302-system-fog-and-flow.js delete mode 100644 src/data/migrations/20200123045032-fog-and-change-tracking.js delete mode 100644 src/data/migrations/20200123163412-create-router.js delete mode 100644 src/data/migrations/20200123205245-router-port-host-agent-config.js delete mode 100644 src/data/migrations/20200124040224-router-changed-flag.js delete mode 100644 src/data/migrations/20200202113124-create-public-ports.js delete mode 100644 src/data/migrations/20200213033350-create-config.js delete mode 100644 src/data/migrations/20200220210224-change-tracking-timestamp.js delete mode 100644 src/data/migrations/20200316011904-microservice-extra-host.js delete mode 100644 src/data/migrations/20200316032240-add-fog-host.js delete mode 100644 src/data/migrations/20200323050813-fog-update-messagespeed.js delete mode 100644 src/data/migrations/20200420020250-remove-connector.js delete mode 100644 src/data/migrations/20200423201804-add-volume-mapping-type.js delete mode 100644 src/data/migrations/20200506004924-add-route-name.js delete mode 100644 src/data/migrations/20200512044934-rename-flow.js delete mode 100644 src/data/migrations/20200512214530-add-application-to-routing.js delete mode 100644 src/data/migrations/20200901053246-add-percentage-msvc-status.js delete mode 100644 src/data/migrations/20201001230303-add-tags-fogs.js delete mode 100644 src/data/migrations/20201028005645-create-edge-resources.js delete mode 100644 src/data/migrations/20201105003849-create-edge-resources-agent-flag.js delete mode 100644 src/data/migrations/20201203011708-microservice-status-error-msg.js delete mode 100644 src/data/migrations/20201204003312-create_application_templates.js delete mode 100644 src/data/migrations/20210104191500-add_custom_to_edge_resources.js delete mode 100644 src/data/migrations/20210118012712-add_is_udp_to_port.js delete mode 100644 src/data/migrations/20211019214923-add-schemes-to-public-ports.js delete mode 100644 src/data/migrations/20211020014715-add-index-to-public-ports.js delete mode 100644 src/data/migrations/20211022010318-add-unique-constraint-msvc.js delete mode 100644 src/data/migrations/20211022013326-add-unique-constraint-route.js delete mode 100644 src/data/migrations/20220405053419-add-time-zone-agent-config.js delete mode 100644 src/data/migrations/20220409021708-drop-table-tracking.js delete mode 100644 src/data/migrations/20221021102712-add_is_proxy_to_port.js delete mode 100644 src/data/migrations/20221021132000-create-proxy-ports.js delete mode 100644 src/data/migrations/20221021152712-add_admin_port_to_proxy_ports.js delete mode 100644 src/data/migrations/20221031162712-add_tokens_to_proxy_ports.js delete mode 100644 src/data/migrations/20221110151246-add_port_uuid_to_proxy_ports copy.js delete mode 100644 src/data/seeders/20180928110125-insert-registry.js delete mode 100644 src/data/seeders/20180928111532-insert-catalog-item.js delete mode 100644 src/data/seeders/20180928112152-insert-iofog-type.js delete mode 100644 src/data/seeders/20180928121334-insert-catalog-item-image.js delete mode 100644 src/data/seeders/20190130112616-insert-logging-catalog-item.js delete mode 100644 src/data/seeders/20190131111441-insert-json-generator-catalog-item.js delete mode 100644 src/data/seeders/20190218103641-adding-default-configs.js delete mode 100644 src/data/seeders/20200122200231-insert-router-catalog-item.js delete mode 100644 src/data/seeders/20200313163114-update-router-catalog-item.js delete mode 100644 src/data/seeders/20221019163114-insert-port-router-catalog-item.js rename src/{config => }/keycloak.json (100%) delete mode 100644 src/views/email-activation-temp.js delete mode 100644 src/views/email-temp.js delete mode 100644 src/views/reset-password-temp.js diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md deleted file mode 100644 index 34f6374f1..000000000 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ /dev/null @@ -1,15 +0,0 @@ - - -- Does the iofog.org or README.md documentation need to change? - - [ ] Yes - - [ ] No - -### Description - diff --git a/azure-pipelines.yml b/azure-pipelines.yml deleted file mode 100755 index a674ef6ab..000000000 --- a/azure-pipelines.yml +++ /dev/null @@ -1,227 +0,0 @@ -trigger: - tags: - include: - - v* - branches: - include: - - develop - - release* - paths: - exclude: - - README.md - - CHANGELOG.md - - LICENSE - -variables: - group: 'pipelines' - repository: 'focal-freedom-236620/controller' - ref: $(Build.SourceBranch) - imageTag: - buildTag: $(Build.BuildId) - branchTag: $(Build.SourceBranchName) - releaseCandidate: 'rc' - -stages: -- stage: Preflight - jobs: - - job: Build - pool: - vmImage: 'Ubuntu-20.04' - - steps: - - task: NodeTool@0 - inputs: - versionSource: 'spec' - versionSpec: '18.x' - displayName: 'Install Node.js' - - - script: | - npm -v - node -v - npm install - displayName: 'npm install and build' - - - script: | - npm run standard - displayName: 'Standardjs report' - - - script: | - npm i -g better-npm-audit - npx better-npm-audit audit -p - displayName: Check for vulnerabilities - - # npx better-npm-audit audit -p - # To be removed once new version of ncof is released - - - # - script: | - # npm run snyk -- --project-name=ControllerCI - # displayName: 'Snyk monitor' - # env: - # SNYK_TOKEN: $(snykToken) -- stage: Test - jobs: - - template: azure-templates/test.yml - parameters: - nodeVersion: '16' - - template: azure-templates/test.yml - parameters: - nodeVersion: '17' - - template: azure-templates/test.yml - parameters: - nodeVersion: '18' - - template: azure-templates/test.yml - parameters: - nodeVersion: '19' -- stage: Publish - jobs: - # - job: Platform - # dependsOn: Controller - # pool: server - # variables: - # commit: b-$(buildTag) - - # steps: - # - task: InvokeRESTAPI@1 - # displayName: 'trigger platform job' - # inputs: - # connectionType: 'connectedServiceName' - # serviceConnection: 'Pipelines' - # method: 'POST' - # urlSuffix: '/edgeworx/_apis/build/builds?api-version=5.0' - # body: "{\"Parameters\":\"{\\\"images.controller\\\": \\\"gcr.io/$(repository):$(commit)\\\"}\", \"Definition\":{\"id\":\"5\"}}" - # waitForCompletion: 'false' - - job: Controller - pool: - vmImage: 'Ubuntu-20.04' - steps: - - task: NodeTool@0 - inputs: - versionSpec: '18.x' - displayName: 'Install Node.js' - - - script: | - npm install - displayName: 'npm install' - - - script: | - npm pack - ls iofog-iofogcontroller-*.tgz - displayName: 'npm pack for release artefact' - - - script: | - if [[ $(ref) == refs/tags* ]]; then - TAG=$(echo $(ref) | sed "s|refs/tags/v||g") - echo "##vso[task.setvariable variable=imageTag]$TAG" - else - LATESTTAG=$(git tag | tail -1) - LATESTVERS=${LATESTTAG#?} - if [ -z "$LATESTVERS" ]; then LATESTVERS=0.0.0; fi - echo "##vso[task.setvariable variable=imageTag]$LATESTVERS-b$(buildTag)" - fi - echo $(imageTag) - displayName: 'Set image tag' - - - script: | - echo "gcr.io/$(repository):$(imageTag)" > GCR_DOCKER_IMAGE - displayName: 'Save Docker image name and tag to GCR_DOCKER_IMAGE into artifacts' - - - task: CopyFiles@2 - inputs: - SourceFolder: $(System.DefaultWorkingDirectory) - TargetFolder: $(Build.ArtifactStagingDirectory) - Contents: | - standardjs.out - *.tgz - GCR_DOCKER_IMAGE - OverWrite: true - displayName: 'artefacts to publish' - - - script: | - rm -fr iofog-iofogcontroller-*.tgz - git checkout package-lock.json - git config --global user.email "info@edgeworx.io" - git config --global user.name "Azure DevOps" - - PACKAGE_VERSION=$(cat package.json | grep version | head -1 | awk -F: '{ print $2 }' | sed 's/[\",]//g' | tr -d '[[:space:]]') - if [[ $(ref) == refs/tags* ]]; then - npm --no-git-tag-version version $PACKAGE_VERSION - else - npm --no-git-tag-version version $PACKAGE_VERSION-b$(buildTag) - fi - echo "##vso[task.setvariable variable=pkg_version]$PACKAGE_VERSION" - displayName: 'npm version' - - - script: | - npm pack - displayName: 'npm pack with version containing build number' - - - bash: | - echo 'checking pack file exists..' - tar=$(ls iofog-iofogcontroller-*.tgz) - echo $tar - echo "##vso[task.setvariable variable=controller_tar]$tar" - displayName: 'setting vars' - name: setvarStep - - - task: Docker@2 - displayName: 'build docker' - inputs: - containerRegistry: 'Edgeworx GCP' - repository: $(repository) - command: 'build' - Dockerfile: "Dockerfile.dev" - arguments: --build-arg PKG_VERSION=$(pkg_version) - tags: | - $(imageTag) - $(branchTag) - latest - condition: or(and(succeeded(), startsWith(variables['build.sourceBranch'], 'refs/heads/release/')), and(succeeded(), eq(variables['build.sourceBranch'], 'refs/heads/develop')), and(succeeded(), startsWith(variables['build.sourceBranch'], 'refs/tags/'))) - - - task: Docker@2 - displayName: 'push docker' - inputs: - containerRegistry: 'Edgeworx GCP' - repository: $(repository) - command: 'push' - Dockerfile: "Dockerfile.dev" - tags: | - $(imageTag) - $(branchTag) - latest - condition: or(and(succeeded(), startsWith(variables['build.sourceBranch'], 'refs/heads/release/')), and(succeeded(), eq(variables['build.sourceBranch'], 'refs/heads/develop')), and(succeeded(), startsWith(variables['build.sourceBranch'], 'refs/tags/'))) - - - task: PublishBuildArtifacts@1 - inputs: - PathtoPublish: '$(Build.ArtifactStagingDirectory)' - ArtifactName: 'controller' - - - task: DownloadSecureFile@1 - inputs: - secureFile: 'package_cloud' - displayName: 'download package cloud token file' - - - task: UseRubyVersion@0 - inputs: - versionSpec: '3.1.4' - addToPath: true - displayName: 'install rubygem to be used to install package_cloud cli' - - - script: | - gem install package_cloud - package_cloud -h - echo "config file..." - ls $(Agent.TempDirectory)/package_cloud - displayName: 'install package_cloud cli' - - - script: | - echo $(controller_tar) - package_cloud push iofog/iofog-controller-snapshots/node/1 $(controller_tar) --config=$(Agent.TempDirectory)/package_cloud - displayName: 'push to package cloud' - - script: | - package_cloud yank iofog/iofog-controller-snapshots/node/1 iofog-iofogcontroller-0.0.0-dev.tgz --config=$(Agent.TempDirectory)/package_cloud - npm --no-git-tag-version version 0.0.0-dev --allow-downgrade - npm pack - package_cloud push iofog/iofog-controller-snapshots/node/1 iofog-iofogcontroller-0.0.0-dev.tgz --config=$(Agent.TempDirectory)/package_cloud - displayName: 'push develop package to package cloud' - condition: and(succeeded(), eq(variables['build.sourceBranch'], 'refs/heads/develop')) diff --git a/azure-templates/test.yml b/azure-templates/test.yml deleted file mode 100644 index 8df410dea..000000000 --- a/azure-templates/test.yml +++ /dev/null @@ -1,39 +0,0 @@ -parameters: - nodeVersion: '' -jobs: -- job: ${{ format('Node_{0}', parameters.nodeVersion) }} - pool: - vmImage: 'Ubuntu-20.04' - steps: - - task: NodeTool@0 - inputs: - versionSpec: ${{ format('{0}.x', parameters.nodeVersion) }} - displayName: 'Install Node.js' - - script: | - npm i - displayName: Install dependencies - - - script: | - npm run test -- junit - displayName: 'unit tests' - - - script: | - npm run postman_test - displayName: 'integration tests' - # Publish Test Results - # Publish test results to Azure Pipelines - - script: | - ls -l - displayName: 'list files (looking for test results)' - - task: PublishTestResults@2 - inputs: - testResultsFormat: 'JUnit' # Options: JUnit, NUnit, VSTest, xUnit, cTest - testResultsFiles: '*-results.xml' - searchFolder: '$(System.DefaultWorkingDirectory)' # Optional - #mergeTestResults: false # Optional - #failTaskOnFailedTests: false # Optional - #testRunTitle: # Optional - buildPlatform: ${{ format('Node_{0}', parameters.nodeVersion) }} # Optional - testRunTitle: ${{ format('Node_{0}', parameters.nodeVersion) }} # Optional - #buildConfiguration: # Optional - #publishRunAttachments: true # Optional \ No newline at end of file diff --git a/docs/swagger.json b/docs/swagger.json index 7442ffbb3..7a8c89f01 100644 --- a/docs/swagger.json +++ b/docs/swagger.json @@ -87,11 +87,9 @@ "tags" : [ "ioFog" ], "summary" : "Returns list of ioFog nodes", "operationId" : "getIOFogNodes", - "parameters" : [ { - "name" : "Authorization", - "in" : "header", - "description" : "User token", - "required" : true + "parameters" : [ ], + "security" : [ { + "userToken" : [ ] } ], "responses" : { "200" : { @@ -119,11 +117,9 @@ "tags" : [ "ioFog" ], "summary" : "Creates a new ioFog node", "operationId" : "createIOFogNode", - "parameters" : [ { - "name" : "Authorization", - "in" : "header", - "description" : "User token", - "required" : true + "parameters" : [ ], + "security" : [ { + "userToken" : [ ] } ], "responses" : { "201" : { @@ -156,11 +152,9 @@ "in" : "path", "description" : "ioFog node id", "required" : true - }, { - "name" : "Authorization", - "in" : "header", - "description" : "User token", - "required" : true + } ], + "security" : [ { + "userToken" : [ ] } ], "responses" : { "200" : { @@ -191,11 +185,9 @@ "in" : "path", "description" : "ioFog node id", "required" : true - }, { - "name" : "Authorization", - "in" : "header", - "description" : "User token", - "required" : true + } ], + "security" : [ { + "userToken" : [ ] } ], "responses" : { "202" : { @@ -226,11 +218,9 @@ "in" : "path", "description" : "ioFog node id", "required" : true - }, { - "name" : "Authorization", - "in" : "header", - "description" : "User token", - "required" : true + } ], + "security" : [ { + "userToken" : [ ] } ], "responses" : { "204" : { @@ -266,11 +256,9 @@ "in" : "path", "description" : "ioFog node id", "required" : true - }, { - "name" : "Authorization", - "in" : "header", - "description" : "User token", - "required" : true + } ], + "security" : [ { + "userToken" : [ ] } ], "responses" : { "201" : { @@ -299,11 +287,6 @@ "summary" : "Set change version command", "operationId" : "setVersionCommand", "parameters" : [ { - "name" : "Authorization", - "in" : "header", - "description" : "User token", - "required" : true - }, { "name" : "uuid", "in" : "path", "description" : "ioFog node id", @@ -314,6 +297,9 @@ "description" : "change version command", "required" : true } ], + "security" : [ { + "userToken" : [ ] + } ], "responses" : { "204" : { "description" : "Success", @@ -344,16 +330,14 @@ "summary" : "remote reboot fog agent", "operationId" : "setRebootCommand", "parameters" : [ { - "name" : "Authorization", - "in" : "header", - "description" : "User Token", - "required" : true - }, { "name" : "uuid", "in" : "path", "description" : "ioFog node id", "required" : true } ], + "security" : [ { + "userToken" : [ ] + } ], "responses" : { "204" : { "description" : "Success", @@ -378,16 +362,14 @@ "summary" : "prune reboot fog agent", "operationId" : "setPruneCommand", "parameters" : [ { - "name" : "Authorization", - "in" : "header", - "description" : "User Token", - "required" : true - }, { "name" : "uuid", "in" : "path", "description" : "ioFog node id", "required" : true } ], + "security" : [ { + "userToken" : [ ] + } ], "responses" : { "204" : { "description" : "Success", @@ -416,11 +398,9 @@ "in" : "path", "description" : "ioFog node id", "required" : true - }, { - "name" : "Authorization", - "in" : "header", - "description" : "User token", - "required" : true + } ], + "security" : [ { + "userToken" : [ ] } ], "responses" : { "200" : { @@ -453,11 +433,9 @@ "in" : "path", "description" : "ioFog node id", "required" : true - }, { - "name" : "Authorization", - "in" : "header", - "description" : "User token", - "required" : true + } ], + "security" : [ { + "userToken" : [ ] } ], "responses" : { "200" : { @@ -485,11 +463,9 @@ "tags" : [ "Application" ], "summary" : "Lists all applications", "operationId" : "listApplication", - "parameters" : [ { - "name" : "Authorization", - "in" : "header", - "description" : "User Token", - "required" : true + "parameters" : [ ], + "security" : [ { + "userToken" : [ ] } ], "responses" : { "200" : { @@ -510,34 +486,6 @@ "description" : "Internal Server Error" } } - }, - "post" : { - "tags" : [ "Application" ], - "summary" : "Creates an application", - "operationId" : "createApplication", - "parameters" : [ { - "name" : "Authorization", - "in" : "header", - "description" : "User Token", - "required" : true - } ], - "deprecated" : true, - "responses" : { - "200" : { - "description" : "Success", - "headers" : { - "X-Timestamp" : { - "description" : "FogController server timestamp" - } - } - }, - "400" : { - "description" : "Bad Request" - }, - "500" : { - "description" : "Internal Server Error" - } - } } }, "/application/yaml" : { @@ -545,11 +493,9 @@ "tags" : [ "Application" ], "summary" : "Creates an application using a YAML file", "operationId" : "createApplicationYAML", - "parameters" : [ { - "name" : "Authorization", - "in" : "header", - "description" : "User Token", - "required" : true + "parameters" : [ ], + "security" : [ { + "userToken" : [ ] } ], "responses" : { "200" : { @@ -575,54 +521,16 @@ "summary" : "Gets an application details", "operationId" : "getApplication", "parameters" : [ { - "name" : "Authorization", - "in" : "header", - "description" : "User Token", - "required" : true - }, { "name" : "name", "in" : "path", "description" : "Application name", "required" : true } ], - "responses" : { - "200" : { - "description" : "Success", - "headers" : { - "X-Timestamp" : { - "description" : "FogController server timestamp" - } - } - }, - "400" : { - "description" : "Bad Request" - }, - "404" : { - "description" : "Not Found" - }, - "500" : { - "description" : "Internal Server Error" - } - } - }, - "put" : { - "tags" : [ "Application" ], - "summary" : "Updates an application", - "operationId" : "updateApplication", - "parameters" : [ { - "name" : "Authorization", - "in" : "header", - "description" : "User Token", - "required" : true - }, { - "name" : "name", - "in" : "path", - "description" : "Application name", - "required" : true + "security" : [ { + "userToken" : [ ] } ], - "deprecated" : true, "responses" : { - "204" : { + "200" : { "description" : "Success", "headers" : { "X-Timestamp" : { @@ -646,16 +554,14 @@ "summary" : "Deletes an application", "operationId" : "deleteApplication", "parameters" : [ { - "name" : "Authorization", - "in" : "header", - "description" : "User Token", - "required" : true - }, { "name" : "name", "in" : "path", "description" : "Application name", "required" : true } ], + "security" : [ { + "userToken" : [ ] + } ], "responses" : { "204" : { "description" : "Success", @@ -681,16 +587,14 @@ "summary" : "Updates an application metadata", "operationId" : "patchApplication", "parameters" : [ { - "name" : "Authorization", - "in" : "header", - "description" : "User Token", - "required" : true - }, { "name" : "name", "in" : "path", "description" : "Application name", "required" : true } ], + "security" : [ { + "userToken" : [ ] + } ], "responses" : { "204" : { "description" : "Success", @@ -718,16 +622,14 @@ "summary" : "Updates an application using a YAML file", "operationId" : "updateApplicationYAML", "parameters" : [ { - "name" : "Authorization", - "in" : "header", - "description" : "User Token", - "required" : true - }, { "name" : "name", "in" : "path", "description" : "Application name", "required" : true } ], + "security" : [ { + "userToken" : [ ] + } ], "responses" : { "204" : { "description" : "Success", @@ -754,11 +656,9 @@ "tags" : [ "Application Template" ], "summary" : "Lists all application templates", "operationId" : "listApplicationTemplates", - "parameters" : [ { - "name" : "Authorization", - "in" : "header", - "description" : "User Token", - "required" : true + "parameters" : [ ], + "security" : [ { + "userToken" : [ ] } ], "responses" : { "200" : { @@ -781,46 +681,14 @@ } } }, - "/applicationTemplate" : { - "post" : { - "tags" : [ "Application Template" ], - "summary" : "Creates an application template", - "operationId" : "createApplicationTemplate", - "parameters" : [ { - "name" : "Authorization", - "in" : "header", - "description" : "User Token", - "required" : true - } ], - "deprecated" : true, - "responses" : { - "200" : { - "description" : "Success", - "headers" : { - "X-Timestamp" : { - "description" : "FogController server timestamp" - } - } - }, - "400" : { - "description" : "Bad Request" - }, - "500" : { - "description" : "Internal Server Error" - } - } - } - }, "/applicationTemplate/yaml" : { "post" : { "tags" : [ "Application Template" ], "summary" : "Creates an application template using a YAML file", "operationId" : "createApplicationTemplateYAML", - "parameters" : [ { - "name" : "Authorization", - "in" : "header", - "description" : "User Token", - "required" : true + "parameters" : [ ], + "security" : [ { + "userToken" : [ ] } ], "responses" : { "200" : { @@ -846,16 +714,14 @@ "summary" : "Gets an application template", "operationId" : "getApplicationTemplate", "parameters" : [ { - "name" : "Authorization", - "in" : "header", - "description" : "User Token", - "required" : true - }, { "name" : "name", "in" : "path", "description" : "Application template name", "required" : true } ], + "security" : [ { + "userToken" : [ ] + } ], "responses" : { "200" : { "description" : "Success", @@ -876,54 +742,19 @@ } } }, - "put" : { - "tags" : [ "Application Template" ], - "summary" : "Updates or creates an application template", - "operationId" : "updateOrCreateApplicationTemplate", - "parameters" : [ { - "name" : "Authorization", - "in" : "header", - "description" : "User Token", - "required" : true - }, { - "name" : "name", - "in" : "path", - "description" : "Application template name", - "required" : true - } ], - "deprecated" : true, - "responses" : { - "200" : { - "description" : "Success", - "headers" : { - "X-Timestamp" : { - "description" : "FogController server timestamp" - } - } - }, - "400" : { - "description" : "Bad Request" - }, - "500" : { - "description" : "Internal Server Error" - } - } - }, "delete" : { "tags" : [ "Application Template" ], "summary" : "Deletes an application template", "operationId" : "deleteApplicationTemplate", "parameters" : [ { - "name" : "Authorization", - "in" : "header", - "description" : "User Token", - "required" : true - }, { "name" : "name", "in" : "path", "description" : "Application template name", "required" : true } ], + "security" : [ { + "userToken" : [ ] + } ], "responses" : { "200" : { "description" : "Success", @@ -949,16 +780,14 @@ "summary" : "Patches an application template", "operationId" : "patchApplicationTemplate", "parameters" : [ { - "name" : "Authorization", - "in" : "header", - "description" : "User Token", - "required" : true - }, { "name" : "name", "in" : "path", "description" : "Application template name", "required" : true } ], + "security" : [ { + "userToken" : [ ] + } ], "responses" : { "204" : { "description" : "Success", @@ -986,16 +815,14 @@ "summary" : "Updates or creates an application template", "operationId" : "updateOrCreateApplicationTemplateFromYaml", "parameters" : [ { - "name" : "Authorization", - "in" : "header", - "description" : "User Token", - "required" : true - }, { "name" : "name", "in" : "path", "description" : "Application template name", "required" : true } ], + "security" : [ { + "userToken" : [ ] + } ], "responses" : { "200" : { "description" : "Success", @@ -1076,11 +903,9 @@ "tags" : [ "Agent" ], "summary" : "Get an ioFog node configuration", "operationId" : "getIOFogNodeConfig", - "parameters" : [ { - "name" : "Authorization", - "in" : "header", - "description" : "Agent Token", - "required" : true + "parameters" : [ ], + "security" : [ { + "agentToken" : [ ] } ], "responses" : { "200" : { @@ -1103,11 +928,9 @@ "tags" : [ "Agent" ], "summary" : "Updates an ioFog node configuration", "operationId" : "updateIOFogNodeConfig", - "parameters" : [ { - "name" : "Authorization", - "in" : "header", - "description" : "Agent Token", - "required" : true + "parameters" : [ ], + "security" : [ { + "agentToken" : [ ] } ], "responses" : { "204" : { @@ -1135,11 +958,9 @@ "tags" : [ "Agent" ], "summary" : "Gets ioFog node changes", "operationId" : "getIOFogNodeChanges", - "parameters" : [ { - "name" : "Authorization", - "in" : "header", - "description" : "Agent Token", - "required" : true + "parameters" : [ ], + "security" : [ { + "agentToken" : [ ] } ], "responses" : { "200" : { @@ -1165,11 +986,9 @@ "tags" : [ "Agent" ], "summary" : "Resets ioFog node changes list", "operationId" : "resetIOFogNodeChanges", - "parameters" : [ { - "name" : "Authorization", - "in" : "header", - "description" : "Agent Token", - "required" : true + "parameters" : [ ], + "security" : [ { + "agentToken" : [ ] } ], "responses" : { "200" : { @@ -1197,11 +1016,9 @@ "tags" : [ "Agent" ], "summary" : "Posts agent status to ioFog node", "operationId" : "postAgentStatus", - "parameters" : [ { - "name" : "Authorization", - "in" : "header", - "description" : "Agent Token", - "required" : true + "parameters" : [ ], + "security" : [ { + "agentToken" : [ ] } ], "responses" : { "204" : { @@ -1229,11 +1046,9 @@ "tags" : [ "Agent" ], "summary" : "Gets microservices running on an ioFog node", "operationId" : "getAgentMicroservicesList", - "parameters" : [ { - "name" : "Authorization", - "in" : "header", - "description" : "Agent Token", - "required" : true + "parameters" : [ ], + "security" : [ { + "agentToken" : [ ] } ], "responses" : { "200" : { @@ -1263,11 +1078,9 @@ "in" : "path", "description" : "Microservice UUID", "required" : true - }, { - "name" : "Authorization", - "in" : "header", - "description" : "Agent Token", - "required" : true + } ], + "security" : [ { + "agentToken" : [ ] } ], "responses" : { "200" : { @@ -1295,11 +1108,9 @@ "tags" : [ "Agent" ], "summary" : "Gets list of Docker registries", "operationId" : "getRegistriesList", - "parameters" : [ { - "name" : "Authorization", - "in" : "header", - "description" : "Agent Token", - "required" : true + "parameters" : [ ], + "security" : [ { + "agentToken" : [ ] } ], "responses" : { "200" : { @@ -1324,11 +1135,9 @@ "tags" : [ "Agent" ], "summary" : "Get an ioFog node tunnel configuration", "operationId" : "getIOFogNodeTunnelConfig", - "parameters" : [ { - "name" : "Authorization", - "in" : "header", - "description" : "Agent Token", - "required" : true + "parameters" : [ ], + "security" : [ { + "agentToken" : [ ] } ], "responses" : { "200" : { @@ -1356,11 +1165,9 @@ "tags" : [ "Agent" ], "summary" : "Get an ioFog node strace info", "operationId" : "getIOFogNodeStraceInfo", - "parameters" : [ { - "name" : "Authorization", - "in" : "header", - "description" : "Agent Token", - "required" : true + "parameters" : [ ], + "security" : [ { + "agentToken" : [ ] } ], "responses" : { "200" : { @@ -1386,11 +1193,9 @@ "tags" : [ "Agent" ], "summary" : "Posts agent strace to ioFog node", "operationId" : "postIOFogNodeStraceBuffer", - "parameters" : [ { - "name" : "Authorization", - "in" : "header", - "description" : "Agent Token", - "required" : true + "parameters" : [ ], + "security" : [ { + "agentToken" : [ ] } ], "responses" : { "204" : { @@ -1421,11 +1226,9 @@ "tags" : [ "Agent" ], "summary" : "Get change version command", "operationId" : "getChangeVersion", - "parameters" : [ { - "name" : "Authorization", - "in" : "header", - "description" : "Agent Token", - "required" : true + "parameters" : [ ], + "security" : [ { + "agentToken" : [ ] } ], "responses" : { "200" : { @@ -1453,11 +1256,9 @@ "tags" : [ "Agent" ], "summary" : "Updates HAL hardware info", "operationId" : "putHalHardwareInfo", - "parameters" : [ { - "name" : "Authorization", - "in" : "header", - "description" : "Agent Token", - "required" : true + "parameters" : [ ], + "security" : [ { + "agentToken" : [ ] } ], "responses" : { "204" : { @@ -1485,11 +1286,9 @@ "tags" : [ "ioFog" ], "summary" : "Retrieves HAL USB info", "operationId" : "getAgentHalUsbInfo", - "parameters" : [ { - "name" : "Authorization", - "in" : "header", - "description" : "User token", - "required" : true + "parameters" : [ ], + "security" : [ { + "userToken" : [ ] } ], "responses" : { "200" : { @@ -1515,11 +1314,9 @@ "tags" : [ "Agent" ], "summary" : "Updates HAL USB info", "operationId" : "putHalUsbInfo", - "parameters" : [ { - "name" : "Authorization", - "in" : "header", - "description" : "Agent Token", - "required" : true + "parameters" : [ ], + "security" : [ { + "agentToken" : [ ] } ], "responses" : { "204" : { @@ -1547,11 +1344,9 @@ "tags" : [ "Agent" ], "summary" : "Deletes an ioFog node", "operationId" : "deleteAgentNode", - "parameters" : [ { - "name" : "Authorization", - "in" : "header", - "description" : "Agent token", - "required" : true + "parameters" : [ ], + "security" : [ { + "agentToken" : [ ] } ], "responses" : { "204" : { @@ -1576,11 +1371,9 @@ "tags" : [ "Agent" ], "summary" : "Get image snapshot info", "operationId" : "getImageSnapshot", - "parameters" : [ { - "name" : "Authorization", - "in" : "header", - "description" : "Agent Token", - "required" : true + "parameters" : [ ], + "security" : [ { + "agentToken" : [ ] } ], "responses" : { "200" : { @@ -1606,11 +1399,9 @@ "tags" : [ "Agent" ], "summary" : "Put image snapshot info on controller", "operationId" : "putImageSnapshot", - "parameters" : [ { - "name" : "Authorization", - "in" : "header", - "description" : "Agent Token", - "required" : true + "parameters" : [ ], + "security" : [ { + "agentToken" : [ ] } ], "responses" : { "204" : { @@ -1638,11 +1429,9 @@ "tags" : [ "Agent" ], "summary" : "Post tracking info", "operationId" : "postTracking", - "parameters" : [ { - "name" : "Authorization", - "in" : "header", - "description" : "Agent Token", - "required" : true + "parameters" : [ ], + "security" : [ { + "agentToken" : [ ] } ], "responses" : { "204" : { @@ -1662,11 +1451,9 @@ "tags" : [ "Catalog" ], "summary" : "Gets microservices catalog", "operationId" : "getMicroservicesCatalog", - "parameters" : [ { - "name" : "Authorization", - "in" : "header", - "description" : "User Token", - "required" : true + "parameters" : [ ], + "security" : [ { + "userToken" : [ ] } ], "responses" : { "200" : { @@ -1689,11 +1476,9 @@ "tags" : [ "Catalog" ], "summary" : "Creates a new microservice catalog item", "operationId" : "createMicroserviceCatalogItem", - "parameters" : [ { - "name" : "Authorization", - "in" : "header", - "description" : "User Token", - "required" : true + "parameters" : [ ], + "security" : [ { + "userToken" : [ ] } ], "responses" : { "201" : { @@ -1725,16 +1510,14 @@ "summary" : "Gets microservice catalog item info", "operationId" : "getMicroserviceCatalogItem", "parameters" : [ { - "name" : "Authorization", - "in" : "header", - "description" : "User Token", - "required" : true - }, { "name" : "id", "in" : "path", "description" : "Catalog Item Id", "required" : true } ], + "security" : [ { + "userToken" : [ ] + } ], "responses" : { "200" : { "description" : "Catalog Item Info", @@ -1760,16 +1543,14 @@ "summary" : "Deletes a microservice catalog item", "operationId" : "deleteMicroserviceCatalogItem", "parameters" : [ { - "name" : "Authorization", - "in" : "header", - "description" : "User Token", - "required" : true - }, { "name" : "id", "in" : "path", "description" : "Catalog Item Id", "required" : true } ], + "security" : [ { + "userToken" : [ ] + } ], "responses" : { "204" : { "description" : "Success", @@ -1795,16 +1576,14 @@ "summary" : "Updates a microservice catalog item", "operationId" : "updateMicroserviceCatalogItem", "parameters" : [ { - "name" : "Authorization", - "in" : "header", - "description" : "User Token", - "required" : true - }, { "name" : "id", "in" : "path", "description" : "Catalog Item Id", "required" : true } ], + "security" : [ { + "userToken" : [ ] + } ], "responses" : { "204" : { "description" : "Success", @@ -1832,191 +1611,12 @@ } } }, - "/flow" : { + "/microservices" : { "get" : { - "tags" : [ "Flow" ], - "summary" : "Gets list of flows", - "operationId" : "getFlowsList", + "tags" : [ "Microservices" ], + "summary" : "Gets list of microservices", + "operationId" : "getMicroservicesList", "parameters" : [ { - "name" : "Authorization", - "in" : "header", - "description" : "User Token", - "required" : true - } ], - "deprecated" : true, - "responses" : { - "200" : { - "description" : "Success", - "headers" : { - "X-Timestamp" : { - "description" : "FogController server timestamp" - } - } - }, - "401" : { - "description" : "Not Authorized" - }, - "500" : { - "description" : "Internal Server Error" - } - } - }, - "post" : { - "tags" : [ "Flow" ], - "summary" : "Creates a new flow", - "operationId" : "createFlow", - "parameters" : [ { - "name" : "Authorization", - "in" : "header", - "description" : "User Token", - "required" : true - } ], - "deprecated" : true, - "responses" : { - "201" : { - "description" : "Created", - "headers" : { - "X-Timestamp" : { - "description" : "FogController server timestamp" - } - } - }, - "400" : { - "description" : "Bad Request" - }, - "401" : { - "description" : "Not Authorized" - }, - "500" : { - "description" : "Internal Server Error" - } - } - } - }, - "/flow/{id}" : { - "get" : { - "tags" : [ "Flow" ], - "summary" : "Gets flow info", - "operationId" : "getFlowInfo", - "parameters" : [ { - "name" : "Authorization", - "in" : "header", - "description" : "User Token", - "required" : true - }, { - "name" : "id", - "in" : "path", - "description" : "Flow Id", - "required" : true - } ], - "deprecated" : true, - "responses" : { - "200" : { - "description" : "Success", - "headers" : { - "X-Timestamp" : { - "description" : "FogController server timestamp" - } - } - }, - "401" : { - "description" : "Not Authorized" - }, - "404" : { - "description" : "Invalid Flow Id" - }, - "500" : { - "description" : "Internal Server Error" - } - } - }, - "delete" : { - "tags" : [ "Flow" ], - "summary" : "Deletes a flow", - "operationId" : "deleteFlow", - "parameters" : [ { - "name" : "Authorization", - "in" : "header", - "description" : "User Token", - "required" : true - }, { - "name" : "id", - "in" : "path", - "description" : "Flow Id", - "required" : true - } ], - "deprecated" : true, - "responses" : { - "204" : { - "description" : "Success", - "headers" : { - "X-Timestamp" : { - "description" : "FogController server timestamp" - } - } - }, - "401" : { - "description" : "Not Authorized" - }, - "404" : { - "description" : "Invalid Flow Id" - }, - "500" : { - "description" : "Internal Server Error" - } - } - }, - "patch" : { - "tags" : [ "Flow" ], - "summary" : "Updates a flow", - "operationId" : "updateFlow", - "parameters" : [ { - "name" : "Authorization", - "in" : "header", - "description" : "User Token", - "required" : true - }, { - "name" : "id", - "in" : "path", - "description" : "Flow Id", - "required" : true - } ], - "deprecated" : true, - "responses" : { - "204" : { - "description" : "Success", - "headers" : { - "X-Timestamp" : { - "description" : "FogController server timestamp" - } - } - }, - "400" : { - "description" : "Bad Request" - }, - "401" : { - "description" : "Not Authorized" - }, - "404" : { - "description" : "Invalid Flow Id" - }, - "500" : { - "description" : "Internal Server Error" - } - } - } - }, - "/microservices" : { - "get" : { - "tags" : [ "Microservices" ], - "summary" : "Gets list of microservices", - "operationId" : "getMicroservicesList", - "parameters" : [ { - "name" : "Authorization", - "in" : "header", - "description" : "User Token", - "required" : true - }, { "name" : "flowId", "in" : "query", "description" : "Flow Id", @@ -2027,6 +1627,9 @@ "description" : "Application name", "required" : false } ], + "security" : [ { + "userToken" : [ ] + } ], "responses" : { "200" : { "description" : "Success", @@ -2043,40 +1646,6 @@ "description" : "Internal Server Error" } } - }, - "post" : { - "tags" : [ "Microservices" ], - "summary" : "Creates a new microservice on an ioFog node", - "operationId" : "createMicroservice", - "parameters" : [ { - "name" : "Authorization", - "in" : "header", - "description" : "User Token", - "required" : true - } ], - "deprecated" : true, - "responses" : { - "201" : { - "description" : "Created", - "headers" : { - "X-Timestamp" : { - "description" : "FogController server timestamp" - } - } - }, - "400" : { - "description" : "Bad Request" - }, - "401" : { - "description" : "Not Authorized" - }, - "409" : { - "description" : "Duplicate Name" - }, - "500" : { - "description" : "Internal Server Error" - } - } } }, "/microservices/yaml" : { @@ -2084,11 +1653,9 @@ "tags" : [ "Microservices" ], "summary" : "Creates a new microservice in an Application", "operationId" : "createMicroserviceYAML", - "parameters" : [ { - "name" : "Authorization", - "in" : "header", - "description" : "User Token", - "required" : true + "parameters" : [ ], + "security" : [ { + "userToken" : [ ] } ], "responses" : { "201" : { @@ -2120,16 +1687,14 @@ "summary" : "Gets a microservice info", "operationId" : "getMicroserviceInfo", "parameters" : [ { - "name" : "Authorization", - "in" : "header", - "description" : "User Token", - "required" : true - }, { "name" : "uuid", "in" : "path", "description" : "Microservice Uuid", "required" : true } ], + "security" : [ { + "userToken" : [ ] + } ], "responses" : { "200" : { "description" : "Success", @@ -2155,55 +1720,14 @@ "summary" : "Deletes a microservice", "operationId" : "deleteMicroservice", "parameters" : [ { - "name" : "Authorization", - "in" : "header", - "description" : "User Token", - "required" : true - }, { "name" : "uuid", "in" : "path", "description" : "Microservice Uuid", "required" : true } ], - "responses" : { - "204" : { - "description" : "Success", - "headers" : { - "X-Timestamp" : { - "description" : "FogController server timestamp" - } - } - }, - "400" : { - "description" : "Bad Request" - }, - "401" : { - "description" : "Not Authorized" - }, - "404" : { - "description" : "Not Found" - }, - "500" : { - "description" : "Internal Server Error" - } - } - }, - "patch" : { - "tags" : [ "Microservices" ], - "summary" : "Updates a microservice", - "operationId" : "updateMicroservice", - "parameters" : [ { - "name" : "Authorization", - "in" : "header", - "description" : "User Token", - "required" : true - }, { - "name" : "uuid", - "in" : "path", - "description" : "Microservice Uuid", - "required" : true + "security" : [ { + "userToken" : [ ] } ], - "deprecated" : true, "responses" : { "204" : { "description" : "Success", @@ -2222,9 +1746,6 @@ "404" : { "description" : "Not Found" }, - "409" : { - "description" : "Duplicate Name" - }, "500" : { "description" : "Internal Server Error" } @@ -2237,16 +1758,14 @@ "summary" : "Updates a microservice", "operationId" : "updateMicroserviceYAML", "parameters" : [ { - "name" : "Authorization", - "in" : "header", - "description" : "User Token", - "required" : true - }, { "name" : "uuid", "in" : "path", "description" : "Microservice Uuid", "required" : true } ], + "security" : [ { + "userToken" : [ ] + } ], "responses" : { "204" : { "description" : "Success", @@ -2274,112 +1793,20 @@ } } }, - "/microservices/{uuid}/routes/{receiverUuid}" : { - "post" : { - "tags" : [ "Microservices" ], - "summary" : "Creates a route from microservice to receiver", - "operationId" : "createMicroserviceRoute", - "parameters" : [ { - "name" : "Authorization", - "in" : "header", - "description" : "User Token", - "required" : true - }, { - "name" : "uuid", - "in" : "path", - "description" : "Microservice Uuid", - "required" : true - }, { - "name" : "receiverUuid", - "in" : "path", - "description" : "Receiver Microservice Uuid", - "required" : true - } ], - "deprecated" : true, - "responses" : { - "204" : { - "description" : "Created", - "headers" : { - "X-Timestamp" : { - "description" : "FogController server timestamp" - } - } - }, - "400" : { - "description" : "Not Valid" - }, - "401" : { - "description" : "Not Authorized" - }, - "404" : { - "description" : "Not Found" - }, - "500" : { - "description" : "Internal Server Error" - } - } - }, - "delete" : { - "tags" : [ "Microservices" ], - "summary" : "Deletes a route microservice", - "operationId" : "deleteMicroserviceRoute", - "parameters" : [ { - "name" : "Authorization", - "in" : "header", - "description" : "User Token", - "required" : true - }, { - "name" : "uuid", - "in" : "path", - "description" : "Microservice Uuid", - "required" : true - }, { - "name" : "receiverUuid", - "in" : "path", - "description" : "Receiver Microservice Uuid", - "required" : true - } ], - "deprecated" : true, - "responses" : { - "204" : { - "description" : "Success", - "headers" : { - "X-Timestamp" : { - "description" : "FogController server timestamp" - } - } - }, - "400" : { - "description" : "Not Valid" - }, - "401" : { - "description" : "Not Authorized" - }, - "404" : { - "description" : "Not Found" - }, - "500" : { - "description" : "Internal Server Error" - } - } - } - }, "/microservices/{uuid}/port-mapping" : { "get" : { "tags" : [ "Microservices" ], "summary" : "Get a port mapping list for microservice", "operationId" : "getMicroservicePortMapping", "parameters" : [ { - "name" : "Authorization", - "in" : "header", - "description" : "User Token", - "required" : true - }, { "name" : "uuid", "in" : "path", "description" : "Microservice Uuid", "required" : true } ], + "security" : [ { + "userToken" : [ ] + } ], "responses" : { "200" : { "description" : "Created", @@ -2405,16 +1832,14 @@ "summary" : "Creates a port mapping for microservice", "operationId" : "createMicroservicePortMapping", "parameters" : [ { - "name" : "Authorization", - "in" : "header", - "description" : "User Token", - "required" : true - }, { "name" : "uuid", "in" : "path", "description" : "Microservice Uuid", "required" : true } ], + "security" : [ { + "userToken" : [ ] + } ], "responses" : { "201" : { "description" : "Created", @@ -2445,11 +1870,6 @@ "summary" : "Deletes a port mapping for microservice", "operationId" : "deleteMicroservicePortMapping", "parameters" : [ { - "name" : "Authorization", - "in" : "header", - "description" : "User Token", - "required" : true - }, { "name" : "uuid", "in" : "path", "description" : "Microservice Uuid", @@ -2460,6 +1880,9 @@ "description" : "Internal Port", "required" : true } ], + "security" : [ { + "userToken" : [ ] + } ], "responses" : { "204" : { "description" : "Success", @@ -2487,16 +1910,14 @@ "summary" : "Get a volume mapping list for microservice", "operationId" : "getMicroserviceVolumeMapping", "parameters" : [ { - "name" : "Authorization", - "in" : "header", - "description" : "User Token", - "required" : true - }, { "name" : "uuid", "in" : "path", "description" : "Microservice Uuid", "required" : true } ], + "security" : [ { + "userToken" : [ ] + } ], "responses" : { "200" : { "description" : "Success", @@ -2522,16 +1943,14 @@ "summary" : "Creates a volume mapping for microservice", "operationId" : "createMicroserviceVolumeMapping", "parameters" : [ { - "name" : "Authorization", - "in" : "header", - "description" : "User Token", - "required" : true - }, { "name" : "uuid", "in" : "path", "description" : "Microservice Uuid", "required" : true } ], + "security" : [ { + "userToken" : [ ] + } ], "responses" : { "201" : { "description" : "Created", @@ -2562,11 +1981,6 @@ "summary" : "Deletes a volume mapping for microservice", "operationId" : "deleteMicroserviceVolumeMapping", "parameters" : [ { - "name" : "Authorization", - "in" : "header", - "description" : "User Token", - "required" : true - }, { "name" : "uuid", "in" : "path", "description" : "Microservice Uuid", @@ -2577,6 +1991,9 @@ "description" : "Volume id", "required" : true } ], + "security" : [ { + "userToken" : [ ] + } ], "responses" : { "204" : { "description" : "Success", @@ -2607,16 +2024,14 @@ "summary" : "Download image snapshot", "operationId" : "downloadImageSnapshot", "parameters" : [ { - "name" : "Authorization", - "in" : "header", - "description" : "User Token", - "required" : true - }, { "name" : "uuid", "in" : "path", "description" : "Microservice UUID", "required" : true } ], + "security" : [ { + "userToken" : [ ] + } ], "responses" : { "200" : { "description" : "Success", @@ -2642,16 +2057,14 @@ "summary" : "Send request to create image snapshot", "operationId" : "createImageSnapshot", "parameters" : [ { - "name" : "Authorization", - "in" : "header", - "description" : "User Token", - "required" : true - }, { "name" : "uuid", "in" : "path", "description" : "Microservice UUID", "required" : true } ], + "security" : [ { + "userToken" : [ ] + } ], "responses" : { "201" : { "description" : "Created", @@ -2679,11 +2092,6 @@ "summary" : "Gets Strace Data for Microservice", "operationId" : "getMicroserviceStrace", "parameters" : [ { - "name" : "Authorization", - "in" : "header", - "description" : "User Token", - "required" : true - }, { "name" : "uuid", "in" : "path", "description" : "Microservice UUID", @@ -2693,6 +2101,9 @@ "in" : "query", "required" : true } ], + "security" : [ { + "userToken" : [ ] + } ], "responses" : { "200" : { "description" : "Success", @@ -2722,11 +2133,9 @@ "in" : "path", "description" : "Microservice UUID", "required" : true - }, { - "name" : "Authorization", - "in" : "header", - "description" : "User Token", - "required" : true + } ], + "security" : [ { + "userToken" : [ ] } ], "responses" : { "204" : { @@ -2756,16 +2165,14 @@ "summary" : "Enables Microservice Strace Option", "operationId" : "enableMicroserviceStrace", "parameters" : [ { - "name" : "Authorization", - "in" : "header", - "description" : "User Token", - "required" : true - }, { "name" : "uuid", "in" : "path", "description" : "Microservice UUID", "required" : true } ], + "security" : [ { + "userToken" : [ ] + } ], "responses" : { "204" : { "description" : "Success", @@ -2800,11 +2207,9 @@ "in" : "path", "description" : "ioFog node id", "required" : true - }, { - "name" : "Authorization", - "in" : "header", - "description" : "User token", - "required" : true + } ], + "security" : [ { + "userToken" : [ ] } ], "responses" : { "200" : { @@ -2835,11 +2240,9 @@ "in" : "path", "description" : "ioFog node id", "required" : true - }, { - "name" : "Authorization", - "in" : "header", - "description" : "User Token", - "required" : true + } ], + "security" : [ { + "userToken" : [ ] } ], "responses" : { "204" : { @@ -2870,11 +2273,9 @@ "tags" : [ "Registries" ], "summary" : "Gets list of registries", "operationId" : "getRegistryList", - "parameters" : [ { - "name" : "Authorization", - "in" : "header", - "description" : "User token", - "required" : true + "parameters" : [ ], + "security" : [ { + "userToken" : [ ] } ], "responses" : { "200" : { @@ -2897,11 +2298,9 @@ "tags" : [ "Registries" ], "summary" : "Creates new registry", "operationId" : "createRegistry", - "parameters" : [ { - "name" : "Authorization", - "in" : "header", - "description" : "User Token", - "required" : true + "parameters" : [ ], + "security" : [ { + "userToken" : [ ] } ], "responses" : { "201" : { @@ -2934,11 +2333,9 @@ "in" : "path", "description" : "Registry id", "required" : true - }, { - "name" : "Authorization", - "in" : "header", - "description" : "User token", - "required" : true + } ], + "security" : [ { + "userToken" : [ ] } ], "responses" : { "204" : { @@ -2969,11 +2366,9 @@ "in" : "path", "description" : "Registry id", "required" : true - }, { - "name" : "Authorization", - "in" : "header", - "description" : "User token", - "required" : true + } ], + "security" : [ { + "userToken" : [ ] } ], "responses" : { "204" : { @@ -3023,16 +2418,41 @@ } } }, + "/user/profile" : { + "get" : { + "tags" : [ "User" ], + "summary" : "Get current user profile data", + "operationId" : "getUserProfile", + "parameters" : [ ], + "security" : [ { + "userToken" : [ ] + } ], + "responses" : { + "200" : { + "description" : "Success", + "headers" : { + "X-Timestamp" : { + "description" : "FogController server timestamp" + } + } + }, + "401" : { + "description" : "Not Authorized" + }, + "500" : { + "description" : "Internal Server Error" + } + } + } + }, "/routes" : { "get" : { "tags" : [ "Routing" ], "summary" : "Get routes", "operationId" : "getRoutes", - "parameters" : [ { - "name" : "Authorization", - "in" : "header", - "description" : "User Token", - "required" : true + "parameters" : [ ], + "security" : [ { + "userToken" : [ ] } ], "responses" : { "200" : { @@ -3055,11 +2475,9 @@ "tags" : [ "Routing" ], "summary" : "Creates a new route", "operationId" : "createRoute", - "parameters" : [ { - "name" : "Authorization", - "in" : "header", - "description" : "User Token", - "required" : true + "parameters" : [ ], + "security" : [ { + "userToken" : [ ] } ], "responses" : { "201" : { @@ -3091,16 +2509,14 @@ "summary" : "Gets a route info", "operationId" : "getRoute", "parameters" : [ { - "name" : "Authorization", - "in" : "header", - "description" : "User Token", - "required" : true - }, { "name" : "name", "in" : "path", "description" : "Route name", "required" : true } ], + "security" : [ { + "userToken" : [ ] + } ], "responses" : { "200" : { "description" : "Route Info", @@ -3126,16 +2542,14 @@ "summary" : "Deletes a route", "operationId" : "deleteRoute", "parameters" : [ { - "name" : "Authorization", - "in" : "header", - "description" : "User Token", - "required" : true - }, { "name" : "name", "in" : "path", "description" : "Route name", "required" : true } ], + "security" : [ { + "userToken" : [ ] + } ], "responses" : { "204" : { "description" : "Success", @@ -3161,16 +2575,14 @@ "summary" : "Updates a route", "operationId" : "updateRoute", "parameters" : [ { - "name" : "Authorization", - "in" : "header", - "description" : "User Token", - "required" : true - }, { "name" : "name", "in" : "path", "description" : "Route name", "required" : true } ], + "security" : [ { + "userToken" : [ ] + } ], "responses" : { "204" : { "description" : "Success", @@ -3203,11 +2615,9 @@ "tags" : [ "Edge Resource" ], "summary" : "Get Edge Resources", "operationId" : "getEdgeResources", - "parameters" : [ { - "name" : "Authorization", - "in" : "header", - "description" : "User Token", - "required" : true + "parameters" : [ ], + "security" : [ { + "userToken" : [ ] } ], "responses" : { "200" : { @@ -3233,11 +2643,6 @@ "summary" : "Get Specific Edge Resource", "operationId" : "getEdgeResourceDetail", "parameters" : [ { - "name" : "Authorization", - "in" : "header", - "description" : "User Token", - "required" : true - }, { "name" : "name", "in" : "path", "description" : "Edge Resource name", @@ -3248,6 +2653,9 @@ "description" : "Edge Resource version", "required" : true } ], + "security" : [ { + "userToken" : [ ] + } ], "responses" : { "200" : { "description" : "Success", @@ -3270,11 +2678,6 @@ "summary" : "Update/Create Specific Edge Resource", "operationId" : "putEdgeResource", "parameters" : [ { - "name" : "Authorization", - "in" : "header", - "description" : "User Token", - "required" : true - }, { "name" : "name", "in" : "path", "description" : "Edge Resource name", @@ -3285,6 +2688,9 @@ "description" : "Edge Resource version", "required" : true } ], + "security" : [ { + "userToken" : [ ] + } ], "responses" : { "200" : { "description" : "Success", @@ -3307,11 +2713,6 @@ "summary" : "Deletes an Edge Resource", "operationId" : "deleteEdgeResource", "parameters" : [ { - "name" : "Authorization", - "in" : "header", - "description" : "User Token", - "required" : true - }, { "name" : "name", "in" : "path", "description" : "Edge Resource name", @@ -3322,6 +2723,9 @@ "description" : "Edge Resource version", "required" : true } ], + "security" : [ { + "userToken" : [ ] + } ], "responses" : { "204" : { "description" : "Success", @@ -3349,16 +2753,14 @@ "summary" : "Get Specific Edge Resource versions", "operationId" : "getEdgeResourceVersions", "parameters" : [ { - "name" : "Authorization", - "in" : "header", - "description" : "User Token", - "required" : true - }, { "name" : "name", "in" : "path", "description" : "Edge Resource name", "required" : true } ], + "security" : [ { + "userToken" : [ ] + } ], "responses" : { "200" : { "description" : "Success", @@ -3382,11 +2784,9 @@ "tags" : [ "Edge Resource" ], "summary" : "Create Specific Edge Resource", "operationId" : "postEdgeResource", - "parameters" : [ { - "name" : "Authorization", - "in" : "header", - "description" : "User Token", - "required" : true + "parameters" : [ ], + "security" : [ { + "userToken" : [ ] } ], "responses" : { "200" : { @@ -3412,11 +2812,6 @@ "summary" : "Attach Edge Resource to Agent", "operationId" : "postEdgeResourceLink", "parameters" : [ { - "name" : "Authorization", - "in" : "header", - "description" : "User Token", - "required" : true - }, { "name" : "name", "in" : "path", "description" : "Edge Resource Name", @@ -3427,6 +2822,9 @@ "description" : "Edge Resource Version", "required" : true } ], + "security" : [ { + "userToken" : [ ] + } ], "responses" : { "204" : { "description" : "Success", @@ -3452,11 +2850,6 @@ "summary" : "Detach Edge Resource from Agent", "operationId" : "deleteEdgeResourceLink", "parameters" : [ { - "name" : "Authorization", - "in" : "header", - "description" : "User Token", - "required" : true - }, { "name" : "name", "in" : "path", "description" : "Edge Resource Name", @@ -3467,6 +2860,9 @@ "description" : "Edge Resource Version", "required" : true } ], + "security" : [ { + "userToken" : [ ] + } ], "responses" : { "204" : { "description" : "Success", diff --git a/docs/swagger.yaml b/docs/swagger.yaml index 81dcc1117..88a0f083d 100755 --- a/docs/swagger.yaml +++ b/docs/swagger.yaml @@ -1,4 +1,4 @@ -openapi: "3.0.0" +openapi : "3.0.0" info: version: 1.0.0 title: Datasance PoT-ioFog Controller @@ -409,38 +409,6 @@ paths: description: Not Found "500": description: Internal Server Error - post: - tags: - - Application - summary: Creates an application - operationId: createApplication - deprecated: true - security: - - userToken: [] - requestBody: - content: - application/json: - schema: - oneOf: - - $ref: "#/components/schemas/ApplicationCreateRequest" - - $ref: "#/components/schemas/ApplicationCreateFromTemplateRequest" - required: true - responses: - "200": - description: Success - headers: - X-Timestamp: - description: FogController server timestamp - schema: - type: number - content: - application/json: - schema: - $ref: "#/components/schemas/ApplicationCreateResponse" - "400": - description: Bad Request - "500": - description: Internal Server Error /application/yaml: post: tags: @@ -475,43 +443,7 @@ paths: description: Bad Request "500": description: Internal Server Error - "/application/{name}": - put: - tags: - - Application - summary: Updates an application - deprecated: true - operationId: updateApplication - parameters: - - in: path - name: name - description: Application name - required: true - schema: - type: string - security: - - userToken: [] - requestBody: - content: - application/json: - schema: - $ref: "#/components/schemas/ApplicationCreateRequest" - required: true - responses: - "204": - description: Success - headers: - X-Timestamp: - description: FogController server timestamp - schema: - type: number - "400": - description: Bad Request - "404": - description: Not Found - "500": - description: Internal Server Error patch: tags: - Application @@ -678,33 +610,6 @@ paths: description: Not Found "500": description: Internal Server Error - /applicationTemplate: - post: - tags: - - Application Template - summary: Creates an application template - operationId: createApplicationTemplate - deprecated: true - security: - - userToken: [] - requestBody: - $ref: "#/components/requestBodies/ApplicationTemplateCreateRequest" - responses: - "200": - description: Success - headers: - X-Timestamp: - description: FogController server timestamp - schema: - type: number - content: - application/json: - schema: - $ref: "#/components/schemas/ApplicationTemplateCreateResponse" - "400": - description: Bad Request - "500": - description: Internal Server Error /applicationTemplate/yaml: post: tags: @@ -740,39 +645,6 @@ paths: "500": description: Internal Server Error "/applicationTemplate/{name}": - put: - tags: - - Application Template - summary: Updates or creates an application template - operationId: updateOrCreateApplicationTemplate - deprecated: true - parameters: - - in: path - name: name - description: Application template name - required: true - schema: - type: string - security: - - userToken: [] - requestBody: - $ref: "#/components/requestBodies/ApplicationTemplateCreateRequest" - responses: - "200": - description: Success - headers: - X-Timestamp: - description: FogController server timestamp - schema: - type: number - content: - application/json: - schema: - $ref: "#/components/schemas/ApplicationTemplateCreateResponse" - "400": - description: Bad Request - "500": - description: Internal Server Error patch: tags: - Application Template @@ -1599,158 +1471,6 @@ paths: description: Invalid Catalog Item Id "500": description: Internal Server Error - /flow: - get: - tags: - - Flow - summary: Gets list of flows - deprecated: true - operationId: getFlowsList - security: - - userToken: [] - responses: - "200": - description: Success - headers: - X-Timestamp: - description: FogController server timestamp - schema: - type: number - content: - application/json: - schema: - $ref: "#/components/schemas/GetFlowsResponse" - "401": - description: Not Authorized - "500": - description: Internal Server Error - post: - tags: - - Flow - summary: Creates a new flow - deprecated: true - operationId: createFlow - security: - - userToken: [] - requestBody: - $ref: "#/components/requestBodies/NewFlowRequest" - responses: - "201": - description: Created - headers: - X-Timestamp: - description: FogController server timestamp - schema: - type: number - content: - application/json: - schema: - type: object - properties: - id: - type: string - "400": - description: Bad Request - "401": - description: Not Authorized - "500": - description: Internal Server Error - "/flow/{id}": - get: - tags: - - Flow - summary: Gets flow info - operationId: getFlowInfo - deprecated: true - parameters: - - in: path - name: id - description: Flow Id - required: true - schema: - type: string - security: - - userToken: [] - responses: - "200": - description: Success - headers: - X-Timestamp: - description: FogController server timestamp - schema: - type: number - content: - application/json: - schema: - $ref: "#/components/schemas/FlowInfoResponse" - "401": - description: Not Authorized - "404": - description: Invalid Flow Id - "500": - description: Internal Server Error - patch: - tags: - - Flow - summary: Updates a flow - operationId: updateFlow - deprecated: true - parameters: - - in: path - name: id - description: Flow Id - required: true - schema: - type: string - security: - - userToken: [] - requestBody: - $ref: "#/components/requestBodies/NewFlowRequest" - responses: - "204": - description: Success - headers: - X-Timestamp: - description: FogController server timestamp - schema: - type: number - "400": - description: Bad Request - "401": - description: Not Authorized - "404": - description: Invalid Flow Id - "500": - description: Internal Server Error - delete: - tags: - - Flow - summary: Deletes a flow - operationId: deleteFlow - deprecated: true - parameters: - - in: path - name: id - description: Flow Id - required: true - schema: - type: string - security: - - userToken: [] - responses: - "204": - description: Success - headers: - X-Timestamp: - description: FogController server timestamp - schema: - type: number - "401": - description: Not Authorized - "404": - description: Invalid Flow Id - "500": - description: Internal Server Error /microservices: get: tags: @@ -1789,44 +1509,6 @@ paths: description: Not Authorized "500": description: Internal Server Error - post: - tags: - - Microservices - summary: Creates a new microservice on an ioFog node - operationId: createMicroservice - deprecated: true - security: - - userToken: [] - requestBody: - content: - application/json: - schema: - $ref: "#/components/schemas/NewMicroserviceRequest" - description: New Microservice Info - required: true - responses: - "201": - description: Created - headers: - X-Timestamp: - description: FogController server timestamp - schema: - type: number - content: - application/json: - schema: - type: object - properties: - uuid: - type: string - "400": - description: Bad Request - "401": - description: Not Authorized - "409": - description: Duplicate Name - "500": - description: Internal Server Error /microservices/yaml: post: tags: @@ -1901,46 +1583,6 @@ paths: description: Not Found "500": description: Internal Server Error - patch: - tags: - - Microservices - summary: Updates a microservice - deprecated: true - operationId: updateMicroservice - parameters: - - in: path - name: uuid - description: Microservice Uuid - required: true - schema: - type: string - security: - - userToken: [] - requestBody: - content: - application/json: - schema: - $ref: "#/components/schemas/UpdateMicroserviceRequest" - description: Microservice Info - required: true - responses: - "204": - description: Success - headers: - X-Timestamp: - description: FogController server timestamp - schema: - type: number - "400": - description: Bad Request - "401": - description: Not Authorized - "404": - description: Not Found - "409": - description: Duplicate Name - "500": - description: Internal Server Error delete: tags: - Microservices @@ -2014,82 +1656,6 @@ paths: description: Duplicate Name "500": description: Internal Server Error - - "/microservices/{uuid}/routes/{receiverUuid}": - post: - tags: - - Microservices - summary: Creates a route from microservice to receiver - operationId: createMicroserviceRoute - deprecated: true - parameters: - - in: path - name: uuid - description: Microservice Uuid - required: true - schema: - type: string - - in: path - name: receiverUuid - description: Receiver Microservice Uuid - required: true - schema: - type: string - security: - - userToken: [] - responses: - "204": - description: Created - headers: - X-Timestamp: - description: FogController server timestamp - schema: - type: number - "400": - description: Not Valid - "401": - description: Not Authorized - "404": - description: Not Found - "500": - description: Internal Server Error - delete: - tags: - - Microservices - summary: Deletes a route microservice - operationId: deleteMicroserviceRoute - deprecated: true - parameters: - - in: path - name: uuid - description: Microservice Uuid - required: true - schema: - type: string - - in: path - name: receiverUuid - description: Receiver Microservice Uuid - required: true - schema: - type: string - security: - - userToken: [] - responses: - "204": - description: Success - headers: - X-Timestamp: - description: FogController server timestamp - schema: - type: number - "400": - description: Not Valid - "401": - description: Not Authorized - "404": - description: Not Found - "500": - description: Internal Server Error "/microservices/{uuid}/port-mapping": post: tags: @@ -2714,6 +2280,30 @@ paths: description: bad request "401": description: incorrect credentials + /user/profile: + get: + tags: + - User + summary: Get current user profile data + operationId: getUserProfile + security: + - userToken: [] + responses: + "200": + description: Success + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + content: + application/json: + schema: + $ref: "#/components/schemas/UserProfileDetailsResponse" + "401": + description: Not Authorized + "500": + description: Internal Server Error /routes: get: tags: @@ -3191,11 +2781,11 @@ servers: components: securitySchemes: userToken: - type: Bearer - in: header - name: Authorization + type: http + scheme: bearer + bearerFormat: JWT agentToken: - type: Bearer + type: apiKey in: header name: Authorization requestBodies: @@ -4622,6 +4212,31 @@ components: properties: accessToken: type: string + UserProfileDetailsResponse: + type: object + properties: + userinfo: + type: array + items: + properties: + sub: + type: string + SubscriptionKey: + type: string + email_verified: + type: string + name: + type: string + preferred_username: + type: string + locale: + type: string + given_name: + type: string + family_name: + type: string + email: + type: string VersionCommandResponse: type: object required: diff --git a/package-lock.json b/package-lock.json index 8948b350b..b012a4d5f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -22,12 +22,15 @@ "daemonize2": "0.4.2", "ejs": "3.1.7", "express": "4.17.3", + "express-session": "1.18.0", "formidable": "1.2.1", "ftp": "0.3.10", "helmet": "3.21.2", + "https": "1.0.0", "is-elevated": "3.0.0", "js-yaml": "3.14.1", "jsonschema": "1.2.5", + "keycloak-connect": "24.0.1", "minimatch": "3.1.2", "moment": "2.29.4", "moment-timezone": "0.5.38", @@ -1489,6 +1492,12 @@ "integrity": "sha512-sXXKG+uL9IrKqViTtao2Ws6dy0znu9sOaP1di/jKGW1M6VssO8vlpXCQcpZ+jisQ1tTFAC5Jo/EOzFbggBagFQ==", "dev": true }, + "node_modules/@testim/chrome-version": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@testim/chrome-version/-/chrome-version-1.1.4.tgz", + "integrity": "sha512-kIhULpw9TrGYnHp/8VfdcneIcxKnLixmADtukQRtJUmsVlMg0niMkwV0xZmi8hqa57xqilIHjWFA0GKvEjVU5g==", + "optional": true + }, "node_modules/@tootallnate/once": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", @@ -1498,6 +1507,12 @@ "node": ">= 6" } }, + "node_modules/@tootallnate/quickjs-emscripten": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz", + "integrity": "sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==", + "optional": true + }, "node_modules/@types/chai": { "version": "4.3.12", "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.12.tgz", @@ -1561,6 +1576,15 @@ "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.11.9.tgz", "integrity": "sha512-FCTsikRozryfayPuiI46QzH3fnrOoctTjvOYZkho9BTFLCOZ2rgZJHMOVgCOfttjPJcgOx52EpkY0CMfy87MIw==" }, + "node_modules/@types/yauzl": { + "version": "2.10.3", + "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz", + "integrity": "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==", + "optional": true, + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@ungap/promise-all-settled": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz", @@ -1956,6 +1980,17 @@ "safer-buffer": "~2.1.0" } }, + "node_modules/asn1.js": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", + "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", + "dependencies": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "safer-buffer": "^2.1.0" + } + }, "node_modules/assert-plus": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", @@ -1973,6 +2008,24 @@ "node": "*" } }, + "node_modules/ast-types": { + "version": "0.13.4", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz", + "integrity": "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==", + "optional": true, + "dependencies": { + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/ast-types/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "optional": true + }, "node_modules/astral-regex": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", @@ -2150,6 +2203,15 @@ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, + "node_modules/basic-ftp": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.0.5.tgz", + "integrity": "sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg==", + "optional": true, + "engines": { + "node": ">=10.0.0" + } + }, "node_modules/bcrypt-pbkdf": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", @@ -2222,6 +2284,11 @@ "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" }, + "node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + }, "node_modules/body-parser": { "version": "1.20.2", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", @@ -2295,6 +2362,11 @@ "node": ">=8" } }, + "node_modules/brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==" + }, "node_modules/brotli": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/brotli/-/brotli-1.3.3.tgz", @@ -2365,6 +2437,15 @@ "ieee754": "^1.1.13" } }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "optional": true, + "engines": { + "node": "*" + } + }, "node_modules/buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", @@ -2747,6 +2828,39 @@ "node": ">=10" } }, + "node_modules/chromedriver": { + "version": "122.0.6", + "resolved": "https://registry.npmjs.org/chromedriver/-/chromedriver-122.0.6.tgz", + "integrity": "sha512-Q0r+QlUtiJWMQ5HdYaFa0CtBmLFq3n5JWfmq9mOC00UMBvWxku09gUkvBt457QnYfTM/XHqY/HTFOxHvATnTmA==", + "hasInstallScript": true, + "optional": true, + "dependencies": { + "@testim/chrome-version": "^1.1.4", + "axios": "^1.6.7", + "compare-versions": "^6.1.0", + "extract-zip": "^2.0.1", + "proxy-agent": "^6.4.0", + "proxy-from-env": "^1.1.0", + "tcp-port-used": "^1.0.2" + }, + "bin": { + "chromedriver": "bin/chromedriver" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/chromedriver/node_modules/axios": { + "version": "1.6.8", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.8.tgz", + "integrity": "sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ==", + "optional": true, + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, "node_modules/circular-json": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz", @@ -3054,6 +3168,12 @@ "dot-prop": "^5.1.0" } }, + "node_modules/compare-versions": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-6.1.0.tgz", + "integrity": "sha512-LNZQXhqUvqUTotpZ00qLSaify3b4VFD588aRr8MKFw4CMUr98ytzCW5wDH5qx/DEY5kCDXcbcRuCqL0szEf2tg==", + "optional": true + }, "node_modules/component-emitter": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.1.tgz", @@ -3408,6 +3528,15 @@ "resolved": "https://registry.npmjs.org/dasherize/-/dasherize-2.0.0.tgz", "integrity": "sha512-APql/TZ6FdLEpf2z7/X2a2zyqK8juYtqaSVqxw9mYoQ64CXkfU15AeLh8pUszT8+fnYjgm6t0aIYpWKJbnLkuA==" }, + "node_modules/data-uri-to-buffer": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-6.0.2.tgz", + "integrity": "sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==", + "optional": true, + "engines": { + "node": ">= 14" + } + }, "node_modules/dateformat": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz", @@ -3502,7 +3631,7 @@ "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 + "devOptional": true }, "node_modules/default-require-extensions": { "version": "3.0.1", @@ -3560,6 +3689,20 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/degenerator": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-5.0.1.tgz", + "integrity": "sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==", + "optional": true, + "dependencies": { + "ast-types": "^0.13.4", + "escodegen": "^2.1.0", + "esprima": "^4.0.1" + }, + "engines": { + "node": ">= 14" + } + }, "node_modules/deglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/deglob/-/deglob-2.1.1.tgz", @@ -3914,6 +4057,20 @@ "integrity": "sha512-vJ+/LmKja/St8Ofq4JGMFVZuwG7ECU6akjNSn2/g6nv8xbIBOWGlEs+WA8/3XaWkU0Nlyu0iFGgOxC4mpgFjgA==", "dev": true }, + "node_modules/elliptic": { + "version": "6.5.5", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.5.tgz", + "integrity": "sha512-7EjbcmUm17NQFu4Pmgmq2olYMj8nwMnpcddByChSUjArp8F5DQWcIcpriwO4ZToLNAJig0yiyjswfyGNje/ixw==", + "dependencies": { + "bn.js": "^4.11.9", + "brorand": "^1.1.0", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.1", + "inherits": "^2.0.4", + "minimalistic-assert": "^1.0.1", + "minimalistic-crypto-utils": "^1.0.1" + } + }, "node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -4315,6 +4472,36 @@ "node": ">=0.8.0" } }, + "node_modules/escodegen": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", + "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", + "optional": true, + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=6.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "node_modules/escodegen/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "optional": true, + "engines": { + "node": ">=4.0" + } + }, "node_modules/eslint": { "version": "5.14.1", "resolved": "https://registry.npmjs.org/eslint/-/eslint-5.14.1.tgz", @@ -4934,7 +5121,7 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, + "devOptional": true, "engines": { "node": ">=0.10.0" } @@ -5054,6 +5241,37 @@ "node": ">= 0.10.0" } }, + "node_modules/express-session": { + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/express-session/-/express-session-1.18.0.tgz", + "integrity": "sha512-m93QLWr0ju+rOwApSsyso838LQwgfs44QtOP/WBiwtAgPIo/SAh1a5c6nn2BR6mFNZehTpqKDESzP+fRHVbxwQ==", + "dependencies": { + "cookie": "0.6.0", + "cookie-signature": "1.0.7", + "debug": "2.6.9", + "depd": "~2.0.0", + "on-headers": "~1.0.2", + "parseurl": "~1.3.3", + "safe-buffer": "5.2.1", + "uid-safe": "~2.1.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/express-session/node_modules/cookie": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express-session/node_modules/cookie-signature": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.7.tgz", + "integrity": "sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA==" + }, "node_modules/express/node_modules/body-parser": { "version": "1.19.2", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.2.tgz", @@ -5169,6 +5387,64 @@ "node": ">=4" } }, + "node_modules/extract-zip": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", + "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", + "optional": true, + "dependencies": { + "debug": "^4.1.1", + "get-stream": "^5.1.0", + "yauzl": "^2.10.0" + }, + "bin": { + "extract-zip": "cli.js" + }, + "engines": { + "node": ">= 10.17.0" + }, + "optionalDependencies": { + "@types/yauzl": "^2.9.1" + } + }, + "node_modules/extract-zip/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "optional": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/extract-zip/node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "optional": true, + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/extract-zip/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==", + "optional": true + }, "node_modules/extsprintf": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", @@ -5235,6 +5511,15 @@ "reusify": "^1.0.4" } }, + "node_modules/fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", + "optional": true, + "dependencies": { + "pend": "~1.2.0" + } + }, "node_modules/feature-policy": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/feature-policy/-/feature-policy-0.3.0.tgz", @@ -5455,9 +5740,9 @@ "dev": true }, "node_modules/follow-redirects": { - "version": "1.15.5", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.5.tgz", - "integrity": "sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw==", + "version": "1.15.6", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", + "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", "funding": [ { "type": "individual", @@ -5927,6 +6212,44 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/get-uri": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-6.0.3.tgz", + "integrity": "sha512-BzUrJBS9EcUb4cFol8r4W3v1cPsSyajLSthNkz5BxbpDcHN5tIrM10E2eNvfnvBn3DaT3DUgx0OpsBKkaOpanw==", + "optional": true, + "dependencies": { + "basic-ftp": "^5.0.2", + "data-uri-to-buffer": "^6.0.2", + "debug": "^4.3.4", + "fs-extra": "^11.2.0" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/get-uri/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "optional": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/get-uri/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==", + "optional": true + }, "node_modules/getpass": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", @@ -6293,6 +6616,15 @@ "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", "optional": true }, + "node_modules/hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "dependencies": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, "node_modules/hasha": { "version": "5.2.2", "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.2.tgz", @@ -6396,6 +6728,16 @@ "node": ">=4.0.0" } }, + "node_modules/hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==", + "dependencies": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, "node_modules/hook-std": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/hook-std/-/hook-std-2.0.0.tgz", @@ -6558,6 +6900,11 @@ "node": ">= 6.15.1" } }, + "node_modules/https": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https/-/https-1.0.0.tgz", + "integrity": "sha512-4EC57ddXrkaF0x83Oj8sM6SLQHAWXw90Skqu2M4AEWENZ3F02dFJE/GARA8igO79tcgYqGrD7ae4f5L3um2lgg==" + }, "node_modules/https-proxy-agent": { "version": "7.0.4", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.4.tgz", @@ -7238,6 +7585,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/is-url": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/is-url/-/is-url-1.2.4.tgz", + "integrity": "sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==", + "optional": true + }, "node_modules/is-weakref": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", @@ -7259,6 +7612,29 @@ "node": ">=0.10.0" } }, + "node_modules/is2": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/is2/-/is2-2.0.9.tgz", + "integrity": "sha512-rZkHeBn9Zzq52sd9IUIV3a5mfwBY+o2HePMh0wkGBM4z4qjvy2GwVxQ6nNXSfw6MmVP6gf1QIlWjiOavhM3x5g==", + "optional": true, + "dependencies": { + "deep-is": "^0.1.3", + "ip-regex": "^4.1.0", + "is-url": "^1.2.4" + }, + "engines": { + "node": ">=v0.10.0" + } + }, + "node_modules/is2/node_modules/ip-regex": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-4.3.0.tgz", + "integrity": "sha512-B9ZWJxHHOHUhUjCPrMpLD4xEq35bUTClHM1S6CBU5ixQnkZmwipwgc96vAd7AAGM9TGHvJR+Uss+/Ak6UphK+Q==", + "optional": true, + "engines": { + "node": ">=8" + } + }, "node_modules/isarray": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", @@ -8000,6 +8376,30 @@ "integrity": "sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg==", "dev": true }, + "node_modules/jwk-to-pem": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/jwk-to-pem/-/jwk-to-pem-2.0.5.tgz", + "integrity": "sha512-L90jwellhO8jRKYwbssU9ifaMVqajzj3fpRjDKcsDzrslU9syRbFqfkXtT4B89HYAap+xsxNcxgBSB09ig+a7A==", + "dependencies": { + "asn1.js": "^5.3.0", + "elliptic": "^6.5.4", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/keycloak-connect": { + "version": "24.0.1", + "resolved": "https://registry.npmjs.org/keycloak-connect/-/keycloak-connect-24.0.1.tgz", + "integrity": "sha512-DlXI6fPR+t58pKVECxvOua5S/rws0CU3yz2juxKQor4b8PKoY0sN/QZ2vxBGPHmvMKtH8VodmPJA2k/VoiD5uw==", + "dependencies": { + "jwk-to-pem": "^2.0.0" + }, + "engines": { + "node": ">=14" + }, + "optionalDependencies": { + "chromedriver": "latest" + } + }, "node_modules/kind-of": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", @@ -8721,6 +9121,16 @@ "node": ">=4" } }, + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" + }, + "node_modules/minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==" + }, "node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -9270,6 +9680,15 @@ "resolved": "https://registry.npmjs.org/nerf-dart/-/nerf-dart-1.0.0.tgz", "integrity": "sha512-EZSPZB70jiVsivaBLYDCyntd5eH8NTSMOn3rB+HxwdmKThGELLdYv8qVIMWvZEFy9w8ZZpW9h9OB32l1rGtj7g==" }, + "node_modules/netmask": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz", + "integrity": "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==", + "optional": true, + "engines": { + "node": ">= 0.4.0" + } + }, "node_modules/newman": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/newman/-/newman-5.3.2.tgz", @@ -12620,6 +13039,75 @@ "node": ">=6" } }, + "node_modules/pac-proxy-agent": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-7.0.1.tgz", + "integrity": "sha512-ASV8yU4LLKBAjqIPMbrgtaKIvxQri/yh2OpI+S6hVa9JRkUI3Y3NPFbfngDtY7oFtSMD3w31Xns89mDa3Feo5A==", + "optional": true, + "dependencies": { + "@tootallnate/quickjs-emscripten": "^0.23.0", + "agent-base": "^7.0.2", + "debug": "^4.3.4", + "get-uri": "^6.0.1", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.2", + "pac-resolver": "^7.0.0", + "socks-proxy-agent": "^8.0.2" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/pac-proxy-agent/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "optional": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/pac-proxy-agent/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==", + "optional": true + }, + "node_modules/pac-proxy-agent/node_modules/socks-proxy-agent": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.2.tgz", + "integrity": "sha512-8zuqoLv1aP/66PHF5TqwJ7Czm3Yv32urJQHrVyhD7mmA6d61Zv8cIXQYPTWwmg6qlupnPvs/QKDmfa4P/qct2g==", + "optional": true, + "dependencies": { + "agent-base": "^7.0.2", + "debug": "^4.3.4", + "socks": "^2.7.1" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/pac-resolver": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-7.0.1.tgz", + "integrity": "sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==", + "optional": true, + "dependencies": { + "degenerator": "^5.0.0", + "netmask": "^2.0.2" + }, + "engines": { + "node": ">= 14" + } + }, "node_modules/package-hash": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-4.0.0.tgz", @@ -12780,6 +13268,12 @@ "node": "*" } }, + "node_modules/pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", + "optional": true + }, "node_modules/performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", @@ -13478,6 +13972,71 @@ "node": ">= 0.10" } }, + "node_modules/proxy-agent": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.4.0.tgz", + "integrity": "sha512-u0piLU+nCOHMgGjRbimiXmA9kM/L9EHh3zL81xCdp7m+Y2pHIsnmbdDoEDoAz5geaonNR6q6+yOPQs6n4T6sBQ==", + "optional": true, + "dependencies": { + "agent-base": "^7.0.2", + "debug": "^4.3.4", + "http-proxy-agent": "^7.0.1", + "https-proxy-agent": "^7.0.3", + "lru-cache": "^7.14.1", + "pac-proxy-agent": "^7.0.1", + "proxy-from-env": "^1.1.0", + "socks-proxy-agent": "^8.0.2" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/proxy-agent/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "optional": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/proxy-agent/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "optional": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/proxy-agent/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==", + "optional": true + }, + "node_modules/proxy-agent/node_modules/socks-proxy-agent": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.2.tgz", + "integrity": "sha512-8zuqoLv1aP/66PHF5TqwJ7Czm3Yv32urJQHrVyhD7mmA6d61Zv8cIXQYPTWwmg6qlupnPvs/QKDmfa4P/qct2g==", + "optional": true, + "dependencies": { + "agent-base": "^7.0.2", + "debug": "^4.3.4", + "socks": "^2.7.1" + }, + "engines": { + "node": ">= 14" + } + }, "node_modules/proxy-from-env": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", @@ -13560,6 +14119,14 @@ "node": ">=8" } }, + "node_modules/random-bytes": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/random-bytes/-/random-bytes-1.0.0.tgz", + "integrity": "sha512-iv7LhNVO047HzYR3InF6pUcUsPQiHTM1Qal51DcGSuZFBil1aBBWG5eHPNek7bvILMaYJ/8RU1e8w1AMdHmLQQ==", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/randombytes": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", @@ -16396,6 +16963,39 @@ "node": ">=10" } }, + "node_modules/tcp-port-used": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/tcp-port-used/-/tcp-port-used-1.0.2.tgz", + "integrity": "sha512-l7ar8lLUD3XS1V2lfoJlCBaeoaWo/2xfYt81hM7VlvR4RrMVFqfmzfhLVk40hAb368uitje5gPtBRL1m/DGvLA==", + "optional": true, + "dependencies": { + "debug": "4.3.1", + "is2": "^2.0.6" + } + }, + "node_modules/tcp-port-used/node_modules/debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "optional": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/tcp-port-used/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==", + "optional": true + }, "node_modules/teleport-javascript": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/teleport-javascript/-/teleport-javascript-1.0.0.tgz", @@ -16790,6 +17390,17 @@ "node": ">=0.8.0" } }, + "node_modules/uid-safe": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/uid-safe/-/uid-safe-2.1.5.tgz", + "integrity": "sha512-KPHm4VL5dDXKz01UuEd88Df+KzynaohSL9fBh096KWAxSKZQDI2uBrVqtvRM4rwrIrRRKsdLNML/lnaaVSRioA==", + "dependencies": { + "random-bytes": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/umzug": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/umzug/-/umzug-2.2.0.tgz", @@ -17534,6 +18145,16 @@ "node": ">=8" } }, + "node_modules/yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", + "optional": true, + "dependencies": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + }, "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", diff --git a/scripts/cli-tests.js b/scripts/cli-tests.js index a9866bb4e..7f8f1148a 100644 --- a/scripts/cli-tests.js +++ b/scripts/cli-tests.js @@ -92,7 +92,6 @@ function testConfigSection () { // " -h testHomeUrl -a testEmailAddress -w testEmailPassword -s testEmailService -d testLogDir -z 555")); hasSomeResponse(testCommand('config list')) responseEquals(testCommand('config dev-mode -o'), 'Dev mode state updated successfully.') - responseEquals(testCommand('config email-activation -f'), 'Email activation state updated successfully.') } function testTunnelSection () { diff --git a/src/cli/config.js b/src/cli/config.js index 438dd55f0..748acf367 100644 --- a/src/cli/config.js +++ b/src/cli/config.js @@ -59,34 +59,6 @@ class Config extends BaseCLIHandler { description: 'Path to SSL intermediate certificate file', group: constants.CMD_ADD }, - { - name: 'home-url', - alias: 'h', - type: String, - description: 'Home page url for email activation links', - group: constants.CMD_ADD - }, - { - name: 'email-address', - alias: 'a', - type: String, - description: 'Email address to send activations from', - group: constants.CMD_ADD - }, - { - name: 'email-password', - alias: 'w', - type: String, - description: 'Email password to send activations from', - group: constants.CMD_ADD - }, - { - name: 'email-service', - alias: 's', - type: String, - description: 'Email service to send activations', - group: constants.CMD_ADD - }, { name: 'log-dir', alias: 'd', @@ -107,27 +79,12 @@ class Config extends BaseCLIHandler { type: CliDataTypes.Integer, description: 'Log files count', group: constants.CMD_ADD - }, - { - name: 'on', - alias: 'o', - type: Boolean, - description: 'Enable', - group: [constants.CMD_DEV_MODE, constants.CMD_EMAIL_ACTIVATION] - }, - { - name: 'off', - alias: 'f', - type: Boolean, - description: 'Disable', - group: [constants.CMD_DEV_MODE, constants.CMD_EMAIL_ACTIVATION] } ] this.commands = { [constants.CMD_ADD]: 'Add a new config value.', [constants.CMD_LIST]: 'Display current config.', - [constants.CMD_DEV_MODE]: 'Dev mode config.', - [constants.CMD_EMAIL_ACTIVATION]: 'Email activation config.' + [constants.CMD_DEV_MODE]: 'Dev mode config.' } } @@ -212,26 +169,6 @@ const _addConfigOption = async function (options) { onSuccess() }) - await updateConfig(options.homeUrl, 'home-url', 'Email:HomeUrl', (onSuccess) => { - config.set('Email:HomeUrl', options.homeUrl) - onSuccess() - }) - - await updateConfig(options.emailAddress, 'email-address', 'Email:Address', (onSuccess) => { - config.set('Email:Address', options.emailAddress) - onSuccess() - }) - - if (options.emailPassword) { - config.set('Email:Password', AppHelper.encryptText(options.emailPassword, config.get('Email:Address'))) - logger.cliRes('Config option email-password has been updated.') - } - - await updateConfig(options.emailService, 'email-service', 'Email:Service', (onSuccess) => { - config.set('Email:Service', options.emailService) - onSuccess() - }) - await updateConfig(options.logDir, 'log-dir', 'Service:LogsDirectory', (onSuccess) => { config.set('Service:LogsDirectory', options.logDir) onSuccess() diff --git a/src/cli/controller.js b/src/cli/controller.js index c02fece71..d5f98d4f6 100644 --- a/src/cli/controller.js +++ b/src/cli/controller.js @@ -25,13 +25,12 @@ class Controller extends BaseCLIHandler { { name: 'command', defaultOption: true, - description: 'status, email-activation, fog-types, version', + description: 'status, fog-types, version', group: constants.CMD } ] this.commands = { [constants.CMD_STATUS]: 'Display iofog-controller service status.', - [constants.CMD_EMAIL_ACTIVATION]: 'Is email activation.', [constants.CMD_FOG_TYPES]: 'List all Fog-types.', [constants.CMD_VERSION]: 'Display iofog-controller service version.' } diff --git a/src/config/constants.js b/src/config/constants.js index 4f1c01926..0d3d3ae8c 100644 --- a/src/config/constants.js +++ b/src/config/constants.js @@ -18,9 +18,6 @@ module.exports = { 'Server:Port': 51121, 'Server:DevMode': false, - 'Email:ActivationEnabled': false, - 'Email:HomeUrl': 'https://datasance.com', - 'Service:LogsDirectory': '/var/log/iofog-controller', 'Service:LogsFileSize': 10485760, 'Service:LogsFileCount': 10, diff --git a/src/config/default.json b/src/config/default.json index ae08bdbc6..e76bd75b4 100644 --- a/src/config/default.json +++ b/src/config/default.json @@ -9,10 +9,6 @@ "Port": 51121, "DevMode": false }, - "Email": { - "ActivationEnabled": false, - "HomeUrl": "https://google.com" - }, "Service": { "LogsDirectory": "/var/log/iofog-controller", "LogsFileSize": 10485760, diff --git a/src/config/development.json b/src/config/development.json index 3182f2d41..0fb8ec1a5 100644 --- a/src/config/development.json +++ b/src/config/development.json @@ -9,17 +9,13 @@ "Port": 51121, "DevMode": true }, - "Email": { - "ActivationEnabled": false, - "HomeUrl": "https://google.com" - }, "Service": { "LogsDirectory": "/var/log/iofog-controller", "LogsFileSize": 10485760, "LogsFileCount": 10 }, "Settings": { - "FogTokenExpirationIntervalSeconds": 3600000, + "FogTokenExpirationIntervalSeconds": 3600, "FogStatusUpdateIntervalSeconds": 30, "FogStatusUpdateTolerance": 3 }, diff --git a/src/config/production.json b/src/config/production.json index 3f78f2ec9..e8deb45f3 100644 --- a/src/config/production.json +++ b/src/config/production.json @@ -9,9 +9,6 @@ "Port": 51121, "DevMode": true }, - "Email": { - "ActivationEnabled": false - }, "Service": { "LogsDirectory": "/var/log/iofog-controller", "LogsFileSize": 10485760, diff --git a/src/config/test.json b/src/config/test.json index d372cd118..048637511 100644 --- a/src/config/test.json +++ b/src/config/test.json @@ -2,9 +2,6 @@ "Server": { "DevMode": true }, - "Email": { - "ActivationEnabled": false - }, "Database": { "Provider": "sqlite", "Config": { diff --git a/src/controllers/user-controller.js b/src/controllers/user-controller.js index 9011a41a8..4ab3fceb9 100644 --- a/src/controllers/user-controller.js +++ b/src/controllers/user-controller.js @@ -27,6 +27,11 @@ const userLoginEndPoint = async function (req) { return UserService.login(credentials, false) } +const getUserProfileEndPoint = async function (req) { + return UserService.profile(req, false) +} + module.exports = { - userLoginEndPoint: userLoginEndPoint + userLoginEndPoint: userLoginEndPoint, + getUserProfileEndPoint: getUserProfileEndPoint } diff --git a/src/data/migrations/20180930164635-create-flow.js b/src/data/migrations/20180930164635-create-flow.js deleted file mode 100644 index e159ebb40..000000000 --- a/src/data/migrations/20180930164635-create-flow.js +++ /dev/null @@ -1,43 +0,0 @@ -'use strict' -module.exports = { - up: (queryInterface, Sequelize) => { - return queryInterface.createTable('Flows', { - id: { - type: Sequelize.INTEGER, - primaryKey: true, - autoIncrement: true, - allowNull: false, - field: 'id' - - }, - name: { - type: Sequelize.TEXT, - field: 'name', - defaultValue: 'New Application' - }, - description: { - type: Sequelize.TEXT, - field: 'description', - defaultValue: '' - }, - isActivated: { - type: Sequelize.BOOLEAN, - field: 'is_activated', - defaultValue: false - }, - createdAt: { - allowNull: false, - type: Sequelize.DATE, - field: 'created_at' - }, - updatedAt: { - allowNull: false, - type: Sequelize.DATE, - field: 'updated_at' - } - }) - }, - down: (queryInterface, Sequelize) => { - return queryInterface.dropTable('Flows') - } -} diff --git a/src/data/migrations/20180930173823-create-registry.js b/src/data/migrations/20180930173823-create-registry.js deleted file mode 100644 index a6cfd9e41..000000000 --- a/src/data/migrations/20180930173823-create-registry.js +++ /dev/null @@ -1,49 +0,0 @@ -'use strict' -module.exports = { - up: (queryInterface, Sequelize) => { - return queryInterface.createTable('Registries', { - id: { - type: Sequelize.INTEGER, - primaryKey: true, - autoIncrement: true, - allowNull: false, - field: 'id' - }, - url: { - type: Sequelize.TEXT, - field: 'url' - }, - isPublic: { - type: Sequelize.BOOLEAN, - field: 'is_public' - }, - secure: { - type: Sequelize.BOOLEAN, - field: 'secure' - }, - certificate: { - type: Sequelize.TEXT, - field: 'certificate' - }, - requiresCert: { - type: Sequelize.BOOLEAN, - field: 'requires_cert' - }, - username: { - type: Sequelize.TEXT, - field: 'user_name' - }, - password: { - type: Sequelize.TEXT, - field: 'password' - }, - userEmail: { - type: Sequelize.TEXT, - field: 'user_email' - } - }) - }, - down: (queryInterface, Sequelize) => { - return queryInterface.dropTable('Registries') - } -} diff --git a/src/data/migrations/20180930184436-create-catalog-item.js b/src/data/migrations/20180930184436-create-catalog-item.js deleted file mode 100644 index 934fd85f3..000000000 --- a/src/data/migrations/20180930184436-create-catalog-item.js +++ /dev/null @@ -1,77 +0,0 @@ -'use strict' - -const { convertToInt } = require('../../helpers/app-helper') - -module.exports = { - up: (queryInterface, Sequelize) => { - return queryInterface.createTable('CatalogItems', { - id: { - type: Sequelize.INTEGER, - primaryKey: true, - autoIncrement: true, - allowNull: false, - field: 'id' - }, - name: { - type: Sequelize.TEXT, - field: 'name', - defaultValue: 'New Catalog Item' - }, - description: { - type: Sequelize.TEXT, - field: 'description', - defaultValue: '' - }, - category: { - type: Sequelize.TEXT, - field: 'category' - }, - configExample: { - type: Sequelize.TEXT, - field: 'config_example', - defaultValue: '{}' - }, - publisher: { - type: Sequelize.TEXT, - field: 'publisher' - }, - diskRequired: { - type: Sequelize.BIGINT, - get () { - return convertToInt(this.getDataValue('diskRequired')) - }, - field: 'disk_required', - defaultValue: 0 - }, - ramRequired: { - type: Sequelize.BIGINT, - get () { - return convertToInt(this.getDataValue('ramRequired')) - }, - field: 'ram_required', - defaultValue: 0 - }, - picture: { - type: Sequelize.TEXT, - field: 'picture', - defaultValue: 'images/shared/default.png' - }, - isPublic: { - type: Sequelize.BOOLEAN, - field: 'is_public', - defaultValue: false - }, - registryId: { - type: Sequelize.INTEGER, - field: 'registry_id', - as: 'registryId', - references: { model: 'Registries', key: 'id' }, - onDelete: 'set null', - defaultValue: 1 - } - }) - }, - down: (queryInterface, Sequelize) => { - return queryInterface.dropTable('CatalogItems') - } -} diff --git a/src/data/migrations/20180930184703-create-fog-type.js b/src/data/migrations/20180930184703-create-fog-type.js deleted file mode 100644 index 8a9607648..000000000 --- a/src/data/migrations/20180930184703-create-fog-type.js +++ /dev/null @@ -1,47 +0,0 @@ -'use strict' -module.exports = { - up: (queryInterface, Sequelize) => { - return queryInterface.createTable('FogTypes', { - id: { - type: Sequelize.INTEGER, - primaryKey: true, - autoIncrement: true, - allowNull: false, - field: 'id' - }, - name: { - type: Sequelize.TEXT, - field: 'name' - }, - image: { - type: Sequelize.TEXT, - field: 'image' - }, - description: { - type: Sequelize.TEXT, - field: 'description' - }, - networkCatalogItemId: { - type: Sequelize.INTEGER, - field: 'network_catalog_item_id', - references: { model: 'CatalogItems', key: 'id' }, - onDelete: 'cascade' - }, - halCatalogItemId: { - type: Sequelize.INTEGER, - field: 'hal_catalog_item_id', - references: { model: 'CatalogItems', key: 'id' }, - onDelete: 'cascade' - }, - bluetoothCatalogItemId: { - type: Sequelize.INTEGER, - field: 'bluetooth_catalog_item_id', - references: { model: 'CatalogItems', key: 'id' }, - onDelete: 'cascade' - } - }) - }, - down: (queryInterface, Sequelize) => { - return queryInterface.dropTable('FogTypes') - } -} diff --git a/src/data/migrations/20180930184921-create-catalog-item-image.js b/src/data/migrations/20180930184921-create-catalog-item-image.js deleted file mode 100644 index b69109136..000000000 --- a/src/data/migrations/20180930184921-create-catalog-item-image.js +++ /dev/null @@ -1,33 +0,0 @@ -'use strict' -module.exports = { - up: (queryInterface, Sequelize) => { - return queryInterface.createTable('CatalogItemImages', { - id: { - type: Sequelize.INTEGER, - primaryKey: true, - autoIncrement: true, - allowNull: false, - field: 'id' - }, - containerImage: { - type: Sequelize.TEXT, - field: 'container_image' - }, - catalogItemId: { - type: Sequelize.INTEGER, - field: 'catalog_item_id', - references: { model: 'CatalogItems', key: 'id' }, - onDelete: 'cascade' - }, - fogTypeId: { - type: Sequelize.INTEGER, - field: 'fog_type_id', - references: { model: 'FogTypes', key: 'id' }, - onDelete: 'cascade' - } - }) - }, - down: (queryInterface, Sequelize) => { - return queryInterface.dropTable('CatalogItemImages') - } -} diff --git a/src/data/migrations/20180930194506-create-catalog-item-input-type.js b/src/data/migrations/20180930194506-create-catalog-item-input-type.js deleted file mode 100644 index 0606561b2..000000000 --- a/src/data/migrations/20180930194506-create-catalog-item-input-type.js +++ /dev/null @@ -1,31 +0,0 @@ -'use strict' -module.exports = { - up: (queryInterface, Sequelize) => { - return queryInterface.createTable('CatalogItemInputTypes', { - id: { - type: Sequelize.INTEGER, - primaryKey: true, - autoIncrement: true, - allowNull: false, - field: 'id' - }, - infoType: { - type: Sequelize.TEXT, - field: 'info_type' - }, - infoFormat: { - type: Sequelize.TEXT, - field: 'info_format' - }, - catalogItemId: { - type: Sequelize.INTEGER, - field: 'catalog_item_id', - references: { model: 'CatalogItems', key: 'id' }, - onDelete: 'cascade' - } - }) - }, - down: (queryInterface, Sequelize) => { - return queryInterface.dropTable('CatalogItemInputTypes') - } -} diff --git a/src/data/migrations/20180930195746-create-catalog-item-output-type.js b/src/data/migrations/20180930195746-create-catalog-item-output-type.js deleted file mode 100644 index 5b1a8d0ee..000000000 --- a/src/data/migrations/20180930195746-create-catalog-item-output-type.js +++ /dev/null @@ -1,31 +0,0 @@ -'use strict' -module.exports = { - up: (queryInterface, Sequelize) => { - return queryInterface.createTable('CatalogItemOutputTypes', { - id: { - type: Sequelize.INTEGER, - primaryKey: true, - autoIncrement: true, - allowNull: false, - field: 'id' - }, - infoType: { - type: Sequelize.TEXT, - field: 'info_type' - }, - infoFormat: { - type: Sequelize.TEXT, - field: 'info_format' - }, - catalogItemId: { - type: Sequelize.INTEGER, - field: 'catalog_item_id', - references: { model: 'CatalogItems', key: 'id' }, - onDelete: 'cascade' - } - }) - }, - down: (queryInterface, Sequelize) => { - return queryInterface.dropTable('CatalogItemOutputTypes') - } -} diff --git a/src/data/migrations/20180930225403-create-fog.js b/src/data/migrations/20180930225403-create-fog.js deleted file mode 100644 index cb97959e7..000000000 --- a/src/data/migrations/20180930225403-create-fog.js +++ /dev/null @@ -1,271 +0,0 @@ -'use strict' - -const { convertToInt } = require('../../helpers/app-helper') - -module.exports = { - up: (queryInterface, Sequelize) => { - return queryInterface.createTable('Fogs', { - uuid: { - type: Sequelize.STRING(32), - primaryKey: true, - allowNull: false, - field: 'uuid' - }, - name: { - type: Sequelize.TEXT, - defaultValue: 'Unnamed ioFog 1', - field: 'name' - }, - location: { - type: Sequelize.TEXT, - field: 'location' - }, - gpsMode: { - type: Sequelize.TEXT, - field: 'gps_mode' - }, - latitude: { - type: Sequelize.FLOAT, - field: 'latitude' - }, - longitude: { - type: Sequelize.FLOAT, - field: 'longitude' - }, - description: { - type: Sequelize.TEXT, - field: 'description' - }, - lastactive: { - type: Sequelize.BIGINT, - get () { - return convertToInt(this.getDataValue('lastactive')) - }, - field: 'last_active' - }, - daemonStatus: { - type: Sequelize.TEXT, - defaultValue: 'UNKNOWN', - field: 'daemon_status' - }, - daemonOperatingDuration: { - type: Sequelize.BIGINT, - get () { - return convertToInt(this.getDataValue('daemonOperatingDuration')) - }, - defaultValue: 0, - field: 'daemon_operating_duration' - }, - daemonLastStart: { - type: Sequelize.BIGINT, - get () { - return convertToInt(this.getDataValue('daemonLastStart')) - }, - field: 'daemon_last_start' - }, - memoryUsage: { - type: Sequelize.FLOAT, - defaultValue: 0.000, - field: 'memory_usage' - }, - diskUsage: { - type: Sequelize.FLOAT, - defaultValue: 0.000, - field: 'disk_usage' - }, - cpuUsage: { - type: Sequelize.FLOAT, - defaultValue: 0.00, - field: 'cpu_usage' - }, - memoryViolation: { - type: Sequelize.TEXT, - field: 'memory_violation' - }, - diskViolation: { - type: Sequelize.TEXT, - field: 'disk_violation' - }, - cpuViolation: { - type: Sequelize.TEXT, - field: 'cpu_violation' - }, - catalogItemStatus: { - type: Sequelize.TEXT, - field: 'catalog_item_status' - }, - repositoryCount: { - type: Sequelize.BIGINT, - get () { - return convertToInt(this.getDataValue('repositoryCount')) - }, - field: 'repository_count' - }, - repositoryStatus: { - type: Sequelize.TEXT, - field: 'repository_status' - }, - systemTime: { - type: Sequelize.BIGINT, - get () { - return convertToInt(this.getDataValue('systemTime')) - }, - field: 'system_time' - }, - lastStatusTime: { - type: Sequelize.BIGINT, - get () { - return convertToInt(this.getDataValue('lastStatusTime')) - }, - field: 'last_status_time' - }, - ipAddress: { - type: Sequelize.TEXT, - defaultValue: '0.0.0.0', - field: 'ip_address' - }, - processedMessages: { - type: Sequelize.BIGINT, - get () { - return convertToInt(this.getDataValue('processedMessages')) - }, - defaultValue: 0, - field: 'processed_messages' - }, - catalogItemMessageCounts: { - type: Sequelize.TEXT, - field: 'catalog_item_message_counts' - }, - messageSpeed: { - type: Sequelize.BIGINT, - get () { - return convertToInt(this.getDataValue('messageSpeed')) - }, - field: 'message_speed' - }, - lastCommandTime: { - type: Sequelize.BIGINT, - get () { - return convertToInt(this.getDataValue('lastCommandTime')) - }, - field: 'last_command_time' - }, - networkInterface: { - type: Sequelize.TEXT, - defaultValue: 'eth0', - field: 'network_interface' - }, - dockerUrl: { - type: Sequelize.TEXT, - defaultValue: 'unix:///var/run/docker.sock', - field: 'docker_url' - }, - diskLimit: { - type: Sequelize.FLOAT, - defaultValue: 50, - field: 'disk_limit' - }, - diskDirectory: { - type: Sequelize.TEXT, - defaultValue: '/var/lib/iofog/', - field: 'disk_directory' - }, - memoryLimit: { - type: Sequelize.FLOAT, - defaultValue: 4096, - field: 'memory_limit' - }, - cpuLimit: { - type: Sequelize.FLOAT, - defaultValue: 80, - field: 'cpu_limit' - }, - logLimit: { - type: Sequelize.FLOAT, - defaultValue: 10, - field: 'log_limit' - }, - logDirectory: { - type: Sequelize.TEXT, - defaultValue: '/var/log/iofog/', - field: 'log_directory' - }, - bluetoothEnabled: { - type: Sequelize.BOOLEAN, - defaultValue: false, - field: 'bluetooth' - }, - abstractedHardwareEnabled: { - type: Sequelize.BOOLEAN, - defaultValue: false, - field: 'hal' - }, - logFileCount: { - type: Sequelize.BIGINT, - get () { - return convertToInt(this.getDataValue('logFileCount')) - }, - defaultValue: 10, - field: 'log_file_count' - }, - version: { - type: Sequelize.TEXT, - field: 'version' - }, - isReadyToUpgrade: { - type: Sequelize.BOOLEAN, - defaultValue: true, - field: 'is_ready_to_upgrade' - }, - isReadyToRollback: { - type: Sequelize.BOOLEAN, - defaultValue: false, - field: 'is_ready_to_rollback' - }, - statusFrequency: { - type: Sequelize.INTEGER, - defaultValue: 10, - field: 'status_frequency' - }, - changeFrequency: { - type: Sequelize.INTEGER, - defaultValue: 20, - field: 'change_frequency' - }, - deviceScanFrequency: { - type: Sequelize.INTEGER, - defaultValue: 20, - field: 'device_scan_frequency' - }, - tunnel: { - type: Sequelize.TEXT, - defaultValue: '', - field: 'tunnel' - }, - watchdogEnabled: { - type: Sequelize.BOOLEAN, - defaultValue: true, - field: 'isolated_docker_container' - }, - createdAt: { - allowNull: false, - type: Sequelize.DATE, - field: 'created_at' - }, - updatedAt: { - allowNull: false, - type: Sequelize.DATE, - field: 'updated_at' - }, - fogTypeId: { - type: Sequelize.INTEGER, - field: 'fog_type_id', - references: { model: 'FogTypes', key: 'id' }, - onDelete: 'set null' - } - }) - }, - down: (queryInterface, Sequelize) => { - return queryInterface.dropTable('Fogs') - } -} diff --git a/src/data/migrations/20180930225846-create-change-tracking.js b/src/data/migrations/20180930225846-create-change-tracking.js deleted file mode 100644 index 052254c93..000000000 --- a/src/data/migrations/20180930225846-create-change-tracking.js +++ /dev/null @@ -1,67 +0,0 @@ -'use strict' -module.exports = { - up: (queryInterface, Sequelize) => { - return queryInterface.createTable('ChangeTrackings', { - id: { - type: Sequelize.INTEGER, - primaryKey: true, - autoIncrement: true, - allowNull: false, - field: 'id' - }, - containerConfig: { - type: Sequelize.BOOLEAN, - field: 'container_config' - }, - reboot: { - type: Sequelize.BOOLEAN, - field: 'reboot' - }, - deletenode: { - type: Sequelize.BOOLEAN, - field: 'deletenode' - }, - version: { - type: Sequelize.BOOLEAN, - field: 'version' - }, - containerList: { - type: Sequelize.BOOLEAN, - field: 'container_list' - }, - config: { - type: Sequelize.BOOLEAN, - field: 'config' - }, - routing: { - type: Sequelize.BOOLEAN, - field: 'routing' - }, - registries: { - type: Sequelize.BOOLEAN, - field: 'registries' - }, - tunnel: { - type: Sequelize.BOOLEAN, - field: 'tunnel' - }, - diagnostics: { - type: Sequelize.BOOLEAN, - field: 'diagnostics' - }, - isImageSnapshot: { - type: Sequelize.BOOLEAN, - field: 'image_snapshot' - }, - iofogUuid: { - type: Sequelize.STRING(32), - field: 'iofog_uuid', - references: { model: 'Fogs', key: 'uuid' }, - onDelete: 'cascade' - } - }) - }, - down: (queryInterface, Sequelize) => { - return queryInterface.dropTable('ChangeTrackings') - } -} diff --git a/src/data/migrations/20180930230219-create-fog-access-token.js b/src/data/migrations/20180930230219-create-fog-access-token.js deleted file mode 100644 index dba652e2d..000000000 --- a/src/data/migrations/20180930230219-create-fog-access-token.js +++ /dev/null @@ -1,37 +0,0 @@ -'use strict' - -const { convertToInt } = require('../../helpers/app-helper') - -module.exports = { - up: (queryInterface, Sequelize) => { - return queryInterface.createTable('FogAccessTokens', { - id: { - type: Sequelize.INTEGER, - primaryKey: true, - autoIncrement: true, - allowNull: false, - field: 'id' - }, - expirationTime: { - type: Sequelize.BIGINT, - get () { - return convertToInt(this.getDataValue('expirationTime')) - }, - field: 'expiration_time' - }, - token: { - type: Sequelize.TEXT, - field: 'token' - }, - iofogUuid: { - type: Sequelize.STRING(32), - field: 'iofog_uuid', - references: { model: 'Fogs', key: 'uuid' }, - onDelete: 'cascade' - } - }) - }, - down: (queryInterface, Sequelize) => { - return queryInterface.dropTable('FogAccessTokens') - } -} diff --git a/src/data/migrations/20180930230626-create-fog-provision-key.js b/src/data/migrations/20180930230626-create-fog-provision-key.js deleted file mode 100644 index 56efd0cfc..000000000 --- a/src/data/migrations/20180930230626-create-fog-provision-key.js +++ /dev/null @@ -1,38 +0,0 @@ -'use strict' - -const { convertToInt } = require('../../helpers/app-helper') - -module.exports = { - up: (queryInterface, Sequelize) => { - return queryInterface.createTable('FogProvisionKeys', { - id: { - type: Sequelize.INTEGER, - primaryKey: true, - autoIncrement: true, - allowNull: false, - field: 'id' - }, - provisionKey: { - /* eslint-disable new-cap */ - type: Sequelize.STRING(100), - field: 'provisioning_string' - }, - expirationTime: { - type: Sequelize.BIGINT, - get () { - return convertToInt(this.getDataValue('expirationTime')) - }, - field: 'expiration_time' - }, - iofogUuid: { - type: Sequelize.STRING(32), - field: 'iofog_uuid', - references: { model: 'Fogs', key: 'uuid' }, - onDelete: 'cascade' - } - }) - }, - down: (queryInterface, Sequelize) => { - return queryInterface.dropTable('FogProvisionKeys') - } -} diff --git a/src/data/migrations/20180930231241-create-fog-version-command.js b/src/data/migrations/20180930231241-create-fog-version-command.js deleted file mode 100644 index 0b39564fc..000000000 --- a/src/data/migrations/20180930231241-create-fog-version-command.js +++ /dev/null @@ -1,27 +0,0 @@ -'use strict' -module.exports = { - up: (queryInterface, Sequelize) => { - return queryInterface.createTable('FogVersionCommands', { - id: { - type: Sequelize.INTEGER, - primaryKey: true, - autoIncrement: true, - field: 'id' - }, - versionCommand: { - /* eslint-disable new-cap */ - type: Sequelize.STRING(100), - field: 'version_command' - }, - iofogUuid: { - type: Sequelize.STRING(32), - field: 'iofog_uuid', - references: { model: 'Fogs', key: 'uuid' }, - onDelete: 'cascade' - } - }) - }, - down: (queryInterface, Sequelize) => { - return queryInterface.dropTable('FogVersionCommands') - } -} diff --git a/src/data/migrations/20180930231536-create-hw-info.js b/src/data/migrations/20180930231536-create-hw-info.js deleted file mode 100644 index ed863f076..000000000 --- a/src/data/migrations/20180930231536-create-hw-info.js +++ /dev/null @@ -1,38 +0,0 @@ -'use strict' -module.exports = { - up: (queryInterface, Sequelize) => { - return queryInterface.createTable('HWInfos', { - id: { - type: Sequelize.INTEGER, - primaryKey: true, - autoIncrement: true, - allowNull: false, - field: 'id' - }, - info: { - type: Sequelize.TEXT, - defaultValue: ' ', - field: 'info' - }, - createdAt: { - allowNull: false, - type: Sequelize.DATE, - field: 'created_at' - }, - updatedAt: { - allowNull: false, - type: Sequelize.DATE, - field: 'updated_at' - }, - iofogUuid: { - type: Sequelize.STRING(32), - field: 'iofog_uuid', - references: { model: 'Fogs', key: 'uuid' }, - onDelete: 'cascade' - } - }) - }, - down: (queryInterface, Sequelize) => { - return queryInterface.dropTable('HWInfos') - } -} diff --git a/src/data/migrations/20180930232242-create-usb-info.js b/src/data/migrations/20180930232242-create-usb-info.js deleted file mode 100644 index 354e6fb2d..000000000 --- a/src/data/migrations/20180930232242-create-usb-info.js +++ /dev/null @@ -1,38 +0,0 @@ -'use strict' -module.exports = { - up: (queryInterface, Sequelize) => { - return queryInterface.createTable('USBInfos', { - id: { - type: Sequelize.INTEGER, - primaryKey: true, - autoIncrement: true, - allowNull: false, - field: 'id' - }, - info: { - type: Sequelize.TEXT, - defaultValue: ' ', - field: 'info' - }, - createdAt: { - allowNull: false, - type: Sequelize.DATE, - field: 'created_at' - }, - updatedAt: { - allowNull: false, - type: Sequelize.DATE, - field: 'updated_at' - }, - iofogUuid: { - type: Sequelize.STRING(32), - field: 'iofog_uuid', - references: { model: 'Fogs', key: 'uuid' }, - onDelete: 'cascade' - } - }) - }, - down: (queryInterface, Sequelize) => { - return queryInterface.dropTable('USBInfos') - } -} diff --git a/src/data/migrations/20180930232508-create-tunnel.js b/src/data/migrations/20180930232508-create-tunnel.js deleted file mode 100644 index eda029e25..000000000 --- a/src/data/migrations/20180930232508-create-tunnel.js +++ /dev/null @@ -1,53 +0,0 @@ -'use strict' -module.exports = { - up: (queryInterface, Sequelize) => { - return queryInterface.createTable('Tunnels', { - id: { - type: Sequelize.INTEGER, - primaryKey: true, - autoIncrement: true, - allowNull: false, - field: 'id' - }, - username: { - type: Sequelize.TEXT, - field: 'username' - }, - password: { - type: Sequelize.TEXT, - field: 'password' - }, - host: { - type: Sequelize.TEXT, - field: 'host' - }, - rport: { - type: Sequelize.INTEGER, - field: 'remote_port' - }, - lport: { - type: Sequelize.INTEGER, - defaultValue: 22, - field: 'local_port' - }, - rsakey: { - type: Sequelize.TEXT, - field: 'rsa_key' - }, - closed: { - type: Sequelize.BOOLEAN, - defaultValue: false, - field: 'closed' - }, - iofogUuid: { - type: Sequelize.STRING(32), - field: 'iofog_uuid', - references: { model: 'Fogs', key: 'uuid' }, - onDelete: 'cascade' - } - }) - }, - down: (queryInterface, Sequelize) => { - return queryInterface.dropTable('Tunnels') - } -} diff --git a/src/data/migrations/20181001062956-create-microservice.js b/src/data/migrations/20181001062956-create-microservice.js deleted file mode 100644 index adb1c8238..000000000 --- a/src/data/migrations/20181001062956-create-microservice.js +++ /dev/null @@ -1,100 +0,0 @@ -'use strict' - -const { convertToInt } = require('../../helpers/app-helper') - -module.exports = { - up: (queryInterface, Sequelize) => { - return queryInterface.createTable('Microservices', { - uuid: { - type: Sequelize.STRING(32), - primaryKey: true, - allowNull: false, - field: 'uuid' - }, - config: { - type: Sequelize.TEXT, - field: 'config' - }, - name: { - type: Sequelize.TEXT, - field: 'name' - }, - configLastUpdated: { - type: Sequelize.BIGINT, - get () { - return convertToInt(this.getDataValue('configLastUpdated')) - }, - field: 'config_last_updated' - }, - isNetwork: { - type: Sequelize.BOOLEAN, - field: 'is_network' - }, - needUpdate: { - type: Sequelize.BOOLEAN, - field: 'need_update' - }, - rebuild: { - type: Sequelize.BOOLEAN, - field: 'rebuild' - }, - rootHostAccess: { - type: Sequelize.BOOLEAN, - field: 'root_host_access' - }, - logSize: { - type: Sequelize.BIGINT, - get () { - return convertToInt(this.getDataValue('logSize')) - }, - field: 'log_size' - }, - imageSnapshot: { - type: Sequelize.TEXT, - field: 'image_snapshot' - }, - deleteWithCleanup: { - type: Sequelize.BOOLEAN, - field: 'delete_with_cleanup' - }, - createdAt: { - allowNull: false, - type: Sequelize.DATE, - field: 'created_at' - }, - updatedAt: { - allowNull: false, - type: Sequelize.DATE, - field: 'updated_at' - }, - iofogUuid: { - type: Sequelize.STRING(32), - field: 'iofog_uuid', - references: { model: 'Fogs', key: 'uuid' }, - onDelete: 'set null' - }, - catalogItemId: { - type: Sequelize.INTEGER, - field: 'catalog_item_id', - references: { model: 'CatalogItems', key: 'id' }, - onDelete: 'cascade' - }, - registryId: { - type: Sequelize.INTEGER, - field: 'registry_id', - references: { model: 'Registries', key: 'id' }, - onDelete: 'cascade', - defaultValue: 1 - }, - flowId: { - type: Sequelize.INTEGER, - field: 'flow_id', - references: { model: 'Flows', key: 'id' }, - onDelete: 'cascade' - } - }) - }, - down: (queryInterface, Sequelize) => { - return queryInterface.dropTable('Microservices') - } -} diff --git a/src/data/migrations/20181001070828-create-microservice-port.js b/src/data/migrations/20181001070828-create-microservice-port.js deleted file mode 100644 index c8c65dabd..000000000 --- a/src/data/migrations/20181001070828-create-microservice-port.js +++ /dev/null @@ -1,45 +0,0 @@ -'use strict' -module.exports = { - up: (queryInterface, Sequelize) => { - return queryInterface.createTable('MicroservicePorts', { - id: { - type: Sequelize.INTEGER, - primaryKey: true, - autoIncrement: true, - allowNull: false, - field: 'id' - }, - portInternal: { - type: Sequelize.INTEGER, - field: 'port_internal' - }, - portExternal: { - type: Sequelize.INTEGER, - field: 'port_external' - }, - isPublic: { - type: Sequelize.BOOLEAN, - field: 'is_public' - }, - createdAt: { - allowNull: false, - type: Sequelize.DATE, - field: 'created_at' - }, - updatedAt: { - allowNull: false, - type: Sequelize.DATE, - field: 'updated_at' - }, - microserviceUuid: { - type: Sequelize.STRING(32), - field: 'microservice_uuid', - references: { model: 'Microservices', key: 'uuid' }, - onDelete: 'cascade' - } - }) - }, - down: (queryInterface, Sequelize) => { - return queryInterface.dropTable('MicroservicePorts') - } -} diff --git a/src/data/migrations/20181001071315-create-microservice-status.js b/src/data/migrations/20181001071315-create-microservice-status.js deleted file mode 100644 index 22be3cde8..000000000 --- a/src/data/migrations/20181001071315-create-microservice-status.js +++ /dev/null @@ -1,57 +0,0 @@ -'use strict' - -const { convertToInt } = require('../../helpers/app-helper') - -module.exports = { - up: (queryInterface, Sequelize) => { - return queryInterface.createTable('MicroserviceStatuses', { - id: { - type: Sequelize.INTEGER, - primaryKey: true, - autoIncrement: true, - allowNull: false, - field: 'id' - }, - status: { - type: Sequelize.TEXT, - field: 'status' - }, - cpuUsage: { - type: Sequelize.FLOAT, - defaultValue: 0.000, - field: 'cpu_usage' - }, - memoryUsage: { - type: Sequelize.BIGINT, - get () { - return convertToInt(this.getDataValue('memoryUsage')) - }, - defaultValue: 0, - field: 'memory_usage' - }, - containerId: { - type: Sequelize.TEXT, - field: 'container_id' - }, - createdAt: { - allowNull: false, - type: Sequelize.DATE, - field: 'created_at' - }, - updatedAt: { - allowNull: false, - type: Sequelize.DATE, - field: 'updated_at' - }, - microserviceUuid: { - type: Sequelize.STRING(32), - field: 'microservice_uuid', - references: { model: 'Microservices', key: 'uuid' }, - onDelete: 'cascade' - } - }) - }, - down: (queryInterface, Sequelize) => { - return queryInterface.dropTable('MicroserviceStatuses') - } -} diff --git a/src/data/migrations/20181001071628-create-connector.js b/src/data/migrations/20181001071628-create-connector.js deleted file mode 100644 index 3815516d4..000000000 --- a/src/data/migrations/20181001071628-create-connector.js +++ /dev/null @@ -1,51 +0,0 @@ -'use strict' -module.exports = { - up: (queryInterface, Sequelize) => { - return queryInterface.createTable('Connectors', { - id: { - type: Sequelize.INTEGER, - primaryKey: true, - autoIncrement: true, - allowNull: false, - field: 'id' - }, - name: { - type: Sequelize.TEXT, - field: 'name' - }, - domain: { - type: Sequelize.TEXT, - field: 'domain' - }, - publicIp: { - type: Sequelize.TEXT, - field: 'public_ip' - }, - cert: { - type: Sequelize.TEXT, - field: 'cert' - }, - selfSignedCerts: { - type: Sequelize.BOOLEAN, - field: 'self_signed_certs' - }, - devMode: { - type: Sequelize.BOOLEAN, - field: 'dev_mode' - }, - createdAt: { - allowNull: false, - type: Sequelize.DATE, - field: 'created_at' - }, - updatedAt: { - allowNull: false, - type: Sequelize.DATE, - field: 'updated_at' - } - }) - }, - down: (queryInterface, Sequelize) => { - return queryInterface.dropTable('Connectors') - } -} diff --git a/src/data/migrations/20181001071858-create-connector-port.js b/src/data/migrations/20181001071858-create-connector-port.js deleted file mode 100644 index a3c847bc8..000000000 --- a/src/data/migrations/20181001071858-create-connector-port.js +++ /dev/null @@ -1,69 +0,0 @@ -'use strict' -module.exports = { - up: (queryInterface, Sequelize) => { - return queryInterface.createTable('ConnectorPorts', { - id: { - type: Sequelize.INTEGER, - primaryKey: true, - autoIncrement: true, - allowNull: false, - field: 'id' - }, - port1: { - type: Sequelize.INTEGER, - field: 'port1' - }, - port2: { - type: Sequelize.INTEGER, - field: 'port2' - }, - maxConnectionsPort1: { - type: Sequelize.INTEGER, - field: 'max_connections_port1' - }, - maxConnectionsPort2: { - type: Sequelize.INTEGER, - field: 'max_connection_port2' - }, - passcodePort1: { - type: Sequelize.TEXT, - field: 'passcode_port1' - }, - passcodePort2: { - type: Sequelize.TEXT, - field: 'passcode_port2' - }, - heartBeatAbsenceThresholdPort1: { - type: Sequelize.INTEGER, - field: 'heartbeat_absence_threshold_port1' - }, - heartBeatAbsenceThresholdPort2: { - type: Sequelize.INTEGER, - field: 'heartbeat_absence_threshold_port2' - }, - mappingId: { - type: Sequelize.TEXT, - field: 'mapping_id' - }, - createdAt: { - allowNull: false, - type: Sequelize.DATE, - field: 'created_at' - }, - updatedAt: { - allowNull: false, - type: Sequelize.DATE, - field: 'updated_at' - }, - connectorId: { - type: Sequelize.INTEGER, - field: 'connector_id', - references: { model: 'Connectors', key: 'id' }, - onDelete: 'cascade' - } - }) - }, - down: (queryInterface, Sequelize) => { - return queryInterface.dropTable('ConnectorPorts') - } -} diff --git a/src/data/migrations/20181001073429-create-strace-diagnostics.js b/src/data/migrations/20181001073429-create-strace-diagnostics.js deleted file mode 100644 index 9683f253e..000000000 --- a/src/data/migrations/20181001073429-create-strace-diagnostics.js +++ /dev/null @@ -1,32 +0,0 @@ -'use strict' -module.exports = { - up: (queryInterface, Sequelize) => { - return queryInterface.createTable('StraceDiagnostics', { - id: { - type: Sequelize.INTEGER, - primaryKey: true, - autoIncrement: true, - allowNull: false, - field: 'id' - }, - straceRun: { - type: Sequelize.BOOLEAN, - field: 'strace_run' - }, - buffer: { - type: Sequelize.TEXT, - field: 'buffer', - defaultValue: '' - }, - microserviceUuid: { - type: Sequelize.STRING(32), - field: 'microservice_uuid', - references: { model: 'Microservices', key: 'uuid' }, - onDelete: 'cascade' - } - }) - }, - down: (queryInterface, Sequelize) => { - return queryInterface.dropTable('StraceDiagnostics') - } -} diff --git a/src/data/migrations/20181003102815-create-volume-mapping.js b/src/data/migrations/20181003102815-create-volume-mapping.js deleted file mode 100644 index 2d66e698f..000000000 --- a/src/data/migrations/20181003102815-create-volume-mapping.js +++ /dev/null @@ -1,35 +0,0 @@ -'use strict' -module.exports = { - up: (queryInterface, Sequelize) => { - return queryInterface.createTable('VolumeMappings', { - id: { - type: Sequelize.INTEGER, - primaryKey: true, - autoIncrement: true, - allowNull: false, - field: 'uuid' - }, - hostDestination: { - type: Sequelize.TEXT, - field: 'host_destination' - }, - containerDestination: { - type: Sequelize.TEXT, - field: 'container_destination' - }, - accessMode: { - type: Sequelize.TEXT, - field: 'access_mode' - }, - microserviceUuid: { - type: Sequelize.STRING(32), - field: 'microservice_uuid', - references: { model: 'Microservices', key: 'uuid' }, - onDelete: 'cascade' - } - }) - }, - down: (queryInterface, Sequelize) => { - return queryInterface.dropTable('VolumeMappings') - } -} diff --git a/src/data/migrations/20181022110529-create-routing.js b/src/data/migrations/20181022110529-create-routing.js deleted file mode 100644 index 0c78a27f9..000000000 --- a/src/data/migrations/20181022110529-create-routing.js +++ /dev/null @@ -1,64 +0,0 @@ -'use strict' -module.exports = { - up: (queryInterface, Sequelize) => { - return queryInterface.createTable('Routings', { - id: { - type: Sequelize.INTEGER, - primaryKey: true, - autoIncrement: true, - allowNull: false, - field: 'id' - }, - isNetworkConnection: { - type: Sequelize.BOOLEAN, - defaultValue: false, - field: 'is_network_connection' - }, - sourceMicroserviceUuid: { - type: Sequelize.STRING(32), - field: 'source_microservice_uuid', - references: { model: 'Microservices', key: 'uuid' }, - onDelete: 'cascade' - }, - destMicroserviceUuid: { - type: Sequelize.STRING(32), - field: 'dest_microservice_uuid', - references: { model: 'Microservices', key: 'uuid' }, - onDelete: 'cascade' - }, - sourceNetworkMicroserviceUuid: { - type: Sequelize.STRING(32), - field: 'source_network_microservice_uuid', - references: { model: 'Microservices', key: 'uuid' }, - onDelete: 'set null' - }, - destNetworkMicroserviceUuid: { - type: Sequelize.STRING(32), - field: 'dest_network_microservice_uuid', - references: { model: 'Microservices', key: 'uuid' }, - onDelete: 'set null' - }, - sourceIofogUuid: { - type: Sequelize.STRING(32), - field: 'source_iofog_uuid', - references: { model: 'Fogs', key: 'uuid' }, - onDelete: 'set null' - }, - destIofogUuid: { - type: Sequelize.STRING(32), - field: 'dest_iofog_uuid', - references: { model: 'Fogs', key: 'uuid' }, - onDelete: 'set null' - }, - connectorPortId: { - type: Sequelize.INTEGER, - field: 'connector_port_id', - references: { model: 'ConnectorPorts', key: 'id' }, - onDelete: 'set null' - } - }) - }, - down: (queryInterface, Sequelize) => { - return queryInterface.dropTable('Routings') - } -} diff --git a/src/data/migrations/20181022114905-create-microservice-public-mode.js b/src/data/migrations/20181022114905-create-microservice-public-mode.js deleted file mode 100644 index 2ee2f95d4..000000000 --- a/src/data/migrations/20181022114905-create-microservice-public-mode.js +++ /dev/null @@ -1,47 +0,0 @@ -'use strict' -module.exports = { - up: (queryInterface, Sequelize) => { - return queryInterface.createTable('MicroservicePublicModes', { - id: { - type: Sequelize.INTEGER, - primaryKey: true, - autoIncrement: true, - allowNull: false, - field: 'id' - }, - microserviceUuid: { - type: Sequelize.STRING(32), - field: 'microservice_uuid', - references: { model: 'Microservices', key: 'uuid' }, - onDelete: 'cascade' - }, - networkMicroserviceUuid: { - type: Sequelize.STRING(32), - field: 'network_microservice_uuid', - references: { model: 'Microservices', key: 'uuid' }, - onDelete: 'set null' - }, - iofogUuid: { - type: Sequelize.STRING(32), - field: 'iofog_uuid', - references: { model: 'Fogs', key: 'uuid' }, - onDelete: 'set null' - }, - microservicePortId: { - type: Sequelize.INTEGER, - field: 'microservice_port_id', - references: { model: 'MicroservicePorts', key: 'id' }, - onDelete: 'set null' - }, - connectorPortId: { - type: Sequelize.INTEGER, - field: 'connector_port_id', - references: { model: 'ConnectorPorts', key: 'id' }, - onDelete: 'set null' - } - }) - }, - down: (queryInterface, Sequelize) => { - return queryInterface.dropTable('MicroservicePublicModes') - } -} diff --git a/src/data/migrations/20181031094923-drop-need-update-col-microservices.js b/src/data/migrations/20181031094923-drop-need-update-col-microservices.js deleted file mode 100644 index 5c14f7ab0..000000000 --- a/src/data/migrations/20181031094923-drop-need-update-col-microservices.js +++ /dev/null @@ -1,14 +0,0 @@ -'use strict' - -module.exports = { - up: (queryInterface, Sequelize) => { - return queryInterface.removeColumn('Microservices', 'need_update') - }, - - down: (queryInterface, Sequelize) => { - return queryInterface.addColumn('Microservices', - 'need_update', - Sequelize.BOOLEAN - ) - } -} diff --git a/src/data/migrations/20181102105758-microservice-status-add-missing-time-cols.js b/src/data/migrations/20181102105758-microservice-status-add-missing-time-cols.js deleted file mode 100644 index 2973c2f9b..000000000 --- a/src/data/migrations/20181102105758-microservice-status-add-missing-time-cols.js +++ /dev/null @@ -1,18 +0,0 @@ -'use strict' - -module.exports = { - up: (queryInterface, Sequelize) => { - return queryInterface.addColumn('MicroserviceStatuses', - 'operating_duration', - Sequelize.BIGINT - ) - .then(() => queryInterface.addColumn('MicroserviceStatuses', - 'start_time', - Sequelize.BIGINT)) - }, - - down: (queryInterface, Sequelize) => { - return queryInterface.removeColumn('MicroserviceStatuses', 'operating_duration') - .then(() => queryInterface.removeColumn('MicroserviceStatuses', 'start_time')) - } -} diff --git a/src/data/migrations/20181102163657-microservice-add-col-remove.js b/src/data/migrations/20181102163657-microservice-add-col-remove.js deleted file mode 100644 index 4bf5679e8..000000000 --- a/src/data/migrations/20181102163657-microservice-add-col-remove.js +++ /dev/null @@ -1,14 +0,0 @@ -'use strict' - -module.exports = { - up: (queryInterface, Sequelize) => { - return queryInterface.addColumn('Microservices', - 'delete', - Sequelize.BOOLEAN - ) - }, - - down: (queryInterface, Sequelize) => { - return queryInterface.removeColumn('Microservices', 'delete') - } -} diff --git a/src/data/migrations/20181105120036-change-tracking-container-to-microservice-renaming.js b/src/data/migrations/20181105120036-change-tracking-container-to-microservice-renaming.js deleted file mode 100644 index 285a4caf8..000000000 --- a/src/data/migrations/20181105120036-change-tracking-container-to-microservice-renaming.js +++ /dev/null @@ -1,17 +0,0 @@ -'use strict' - -module.exports = { - up: (queryInterface, Sequelize) => { - return queryInterface.renameColumn('ChangeTrackings', 'container_config', 'microservice_config') - .then(() => { - return queryInterface.renameColumn('ChangeTrackings', 'container_list', 'microservice_list') - }) - }, - - down: (queryInterface, Sequelize) => { - return queryInterface.renameColumn('ChangeTrackings', 'microservice_config', 'container_config') - .then(() => { - return queryInterface.renameColumn('ChangeTrackings', 'microservice_list', 'container_list') - }) - } -} diff --git a/src/data/migrations/20181113094807-add-missing-constraints.js b/src/data/migrations/20181113094807-add-missing-constraints.js deleted file mode 100644 index 36e06acb9..000000000 --- a/src/data/migrations/20181113094807-add-missing-constraints.js +++ /dev/null @@ -1,133 +0,0 @@ -'use strict' - -module.exports = { - up: (queryInterface, Sequelize) => { - return queryInterface.addConstraint('Flows', { - fields: ['user_id'], - type: 'foreign key', - name: 'flows_users_fkey_constraint', - references: { - table: 'Users', - field: 'id' - }, - onDelete: 'cascade' - }) - .then(() => { - return queryInterface.addConstraint('Microservices', { - fields: ['user_id'], - type: 'foreign key', - name: 'mscv_users_fkey_constraint', - references: { - table: 'Users', - field: 'id' - }, - onDelete: 'cascade' - }) - .then(() => { - return queryInterface.addConstraint('Microservices', { - fields: ['iofog_uuid'], - type: 'foreign key', - name: 'msvc_fogs_fkey_constraint', - references: { - table: 'Fogs', - field: 'uuid' - }, - onDelete: 'cascade' - }) - }) - .then(() => { - return queryInterface.addConstraint('Microservices', { - fields: ['catalog_item_id'], - type: 'foreign key', - name: 'msvc_catalogItems_fkey_constraint', - references: { - table: 'CatalogItems', - field: 'id' - }, - onDelete: 'cascade' - }) - }) - .then(() => { - return queryInterface.addConstraint('Microservices', { - fields: ['registry_id'], - type: 'foreign key', - name: 'msvc_registries_fkey_constraint', - references: { - table: 'Registries', - field: 'id' - }, - onDelete: 'cascade' - }) - }) - .then(() => { - return queryInterface.addConstraint('Microservices', { - fields: ['flow_id'], - type: 'foreign key', - name: 'msvc_flows_fkey_constraint', - references: { - table: 'Flows', - field: 'id' - }, - onDelete: 'cascade' - }) - }) - .then(() => { - return queryInterface.addConstraint('ChangeTrackings', { - fields: ['iofog_uuid'], - type: 'foreign key', - name: 'changetracking_fogs_fkey_constraint', - references: { - table: 'Fogs', - field: 'uuid' - }, - onDelete: 'cascade' - }) - }) - }) - .then(() => { - return queryInterface.addConstraint('MicroservicePorts', { - fields: ['user_id'], - type: 'foreign key', - name: 'msvcports_users_fkey_constraint', - references: { - table: 'Users', - field: 'id' - }, - onDelete: 'cascade' - }) - }) - .then(() => { - return queryInterface.addConstraint('MicroservicePorts', { - fields: ['microservice_uuid'], - type: 'foreign key', - name: 'mcsvcports_msvc_fkey_constraint', - references: { - table: 'Microservices', - field: 'uuid' - }, - onDelete: 'cascade' - }) - }) - }, - - down: - (queryInterface, Sequelize) => { - // for SQLite - return queryInterface.renameColumn('Flows', 'user_id', 'user_id1') - .then(() => { - return queryInterface.renameColumn('Flows', 'user_id1', 'user_id') - }).then(() => { - return queryInterface.renameColumn('Microservices', 'user_id', 'user_id1') - }).then(() => { - return queryInterface.renameColumn('Microservices', 'user_id1', 'user_id') - }).then(() => { - return queryInterface.renameColumn('ChangeTrackings', 'iofog_uuid', 'iofog_uuid1') - }).then(() => { - return queryInterface.renameColumn('ChangeTrackings', 'iofog_uuid1', 'iofog_uuid') - }).then(() => { - return queryInterface.renameColumn('MicroservicePorts', 'user_id', 'user_id1') - }).then(() => { - return queryInterface.renameColumn('MicroservicePorts', 'user_id1', 'user_id') - }) - } -} diff --git a/src/data/migrations/20190117110458-create-tracking-event.js b/src/data/migrations/20190117110458-create-tracking-event.js deleted file mode 100644 index 88d69bf42..000000000 --- a/src/data/migrations/20190117110458-create-tracking-event.js +++ /dev/null @@ -1,44 +0,0 @@ -'use strict' - -const { convertToInt } = require('../../helpers/app-helper') - -module.exports = { - up: (queryInterface, Sequelize) => { - return queryInterface.createTable('TrackingEvents', { - id: { - type: Sequelize.INTEGER, - primaryKey: true, - autoIncrement: true, - allowNull: false, - field: 'id' - }, - uuid: { - type: Sequelize.TEXT, - allowNull: false, - field: 'uuid' - }, - sourceType: { - type: Sequelize.TEXT, - field: 'source_type' - }, - timestamp: { - type: Sequelize.BIGINT, - get () { - return convertToInt(this.getDataValue('timestamp')) - }, - field: 'timestamp' - }, - type: { - type: Sequelize.TEXT, - field: 'type' - }, - data: { - type: Sequelize.TEXT, - field: 'data' - } - }) - }, - down: (queryInterface, Sequelize) => { - return queryInterface.dropTable('TrackingEvents') - } -} diff --git a/src/data/migrations/20190226111416-add-system-metrics-to-fog.js b/src/data/migrations/20190226111416-add-system-metrics-to-fog.js deleted file mode 100644 index f160f9142..000000000 --- a/src/data/migrations/20190226111416-add-system-metrics-to-fog.js +++ /dev/null @@ -1,50 +0,0 @@ -'use strict' - -module.exports = { - up: (queryInterface, Sequelize) => { - return queryInterface.addColumn('Fogs', - 'system-available-memory', Sequelize.BIGINT - ).then(() => { - return queryInterface.addColumn('Fogs', - 'system-available-disk', Sequelize.BIGINT - ) - }).then(() => { - return queryInterface.addColumn('Fogs', - 'system-total-cpu', Sequelize.FLOAT - ) - }) - }, - - down: (queryInterface, Sequelize) => { - return queryInterface.removeColumn('Fogs', 'system-available-memory') - .then(() => { - return queryInterface.removeColumn('Fogs', 'system-available-disk') - }).then(() => { - return queryInterface.removeColumn('Fogs', 'system-total-cpu') - }) - // restore constraints. Because Sequelize has problem with Sqlite constraints - .then(() => { - return queryInterface.addConstraint('Fogs', { - fields: ['user_id'], - type: 'foreign key', - name: 'fogs_users_fkey_constraint', - references: { - table: 'Users', - field: 'id' - }, - onDelete: 'cascade' - }) - }).then(() => { - return queryInterface.addConstraint('Fogs', { - fields: ['fog_type_id'], - type: 'foreign key', - name: 'fogs_types_fkey_constraint', - references: { - table: 'FogTypes', - field: 'id' - }, - onDelete: 'set null' - }) - }) - } -} diff --git a/src/data/migrations/20190305142715-add-security-status-fields.js b/src/data/migrations/20190305142715-add-security-status-fields.js deleted file mode 100644 index 66c1262f0..000000000 --- a/src/data/migrations/20190305142715-add-security-status-fields.js +++ /dev/null @@ -1,44 +0,0 @@ -'use strict' - -module.exports = { - up: (queryInterface, Sequelize) => { - return queryInterface.addColumn('Fogs', - 'security_status', Sequelize.TEXT - ).then(() => { - return queryInterface.addColumn('Fogs', - 'security_violation_info', Sequelize.TEXT - ) - }) - }, - - down: (queryInterface, Sequelize) => { - return queryInterface.removeColumn('Fogs', 'security_status') - .then(() => { - return queryInterface.removeColumn('Fogs', 'security_violation_info') - }) - // restore constraints. Because Sequelize has problem with Sqlite constraints - .then(() => { - return queryInterface.addConstraint('Fogs', { - fields: ['user_id'], - type: 'foreign key', - name: 'fogs_users_fkey_constraint', - references: { - table: 'Users', - field: 'id' - }, - onDelete: 'cascade' - }) - }).then(() => { - return queryInterface.addConstraint('Fogs', { - fields: ['fog_type_id'], - type: 'foreign key', - name: 'fogs_types_fkey_constraint', - references: { - table: 'FogTypes', - field: 'id' - }, - onDelete: 'set null' - }) - }) - } -} diff --git a/src/data/migrations/20190409055710-add-microservices-env.js b/src/data/migrations/20190409055710-add-microservices-env.js deleted file mode 100644 index 121e18949..000000000 --- a/src/data/migrations/20190409055710-add-microservices-env.js +++ /dev/null @@ -1,31 +0,0 @@ -'use strict' -module.exports = { - up: (queryInterface, Sequelize) => { - return queryInterface.createTable('MicroserviceEnvs', { - id: { - type: Sequelize.INTEGER, - primaryKey: true, - autoIncrement: true, - allowNull: false, - field: 'id' - }, - key: { - type: Sequelize.TEXT, - field: 'key' - }, - value: { - type: Sequelize.TEXT, - field: 'value' - }, - microserviceUuid: { - type: Sequelize.STRING(32), - field: 'microservice_uuid', - references: { model: 'Microservices', key: 'uuid' }, - onDelete: 'cascade' - } - }) - }, - down: (queryInterface, Sequelize) => { - return queryInterface.dropTable('MicroserviceEnvs') - } -} diff --git a/src/data/migrations/20190410055710-add-microservices-arg.js b/src/data/migrations/20190410055710-add-microservices-arg.js deleted file mode 100644 index 37b1b2c47..000000000 --- a/src/data/migrations/20190410055710-add-microservices-arg.js +++ /dev/null @@ -1,27 +0,0 @@ -'use strict' -module.exports = { - up: (queryInterface, Sequelize) => { - return queryInterface.createTable('MicroserviceArgs', { - id: { - type: Sequelize.INTEGER, - primaryKey: true, - autoIncrement: true, - allowNull: false, - field: 'id' - }, - cmd: { - type: Sequelize.TEXT, - field: 'cmd' - }, - microserviceUuid: { - type: Sequelize.STRING(32), - field: 'microservice_uuid', - references: { model: 'Microservices', key: 'uuid' }, - onDelete: 'cascade' - } - }) - }, - down: (queryInterface, Sequelize) => { - return queryInterface.dropTable('MicroserviceArgs') - } -} diff --git a/src/data/migrations/20190704043715-agent-external-ip.js b/src/data/migrations/20190704043715-agent-external-ip.js deleted file mode 100644 index 2f6e4fc17..000000000 --- a/src/data/migrations/20190704043715-agent-external-ip.js +++ /dev/null @@ -1,37 +0,0 @@ -'use strict' - -module.exports = { - up: (queryInterface, Sequelize) => { - return queryInterface.addColumn('Fogs', - 'ip_address_external', Sequelize.TEXT - ) - }, - - down: (queryInterface, Sequelize) => { - return queryInterface.removeColumn('Fogs', 'ip_address_external') - // restore constraints. Because Sequelize has problem with Sqlite constraints - .then(() => { - return queryInterface.addConstraint('Fogs', { - feilds: ['user_id'], - type: 'foreign key', - name: 'fogs_users_fkey_constraint', - references: { - table: 'Users', - field: 'id' - }, - onDelete: 'cascade' - }) - }).then(() => { - return queryInterface.addConstraint('Fogs', { - feilds: ['fog_type_id'], - type: 'foreign key', - name: 'fogs_types_fkey_constraint', - references: { - table: 'FogTypes', - field: 'id' - }, - onDelete: 'set null' - }) - }) - } -} diff --git a/src/data/migrations/20190830071324-update catalog item images to be linked to microservice.js b/src/data/migrations/20190830071324-update catalog item images to be linked to microservice.js deleted file mode 100644 index d73c3515b..000000000 --- a/src/data/migrations/20190830071324-update catalog item images to be linked to microservice.js +++ /dev/null @@ -1,16 +0,0 @@ -'use strict' - -module.exports = { - up: (queryInterface, Sequelize) => { - return queryInterface.addColumn('CatalogItemImages', 'microservice_uuid', { - type: Sequelize.STRING(32), - field: 'microservice_uuid', - references: { model: 'Microservices', key: 'uuid' }, - onDelete: 'cascade' - }) - }, - - down: (queryInterface, Sequelize) => { - return queryInterface.removeColumn('CatalogItemImages', 'microservice_uuid') - } -} diff --git a/src/data/migrations/20190916030304-connector-health.js b/src/data/migrations/20190916030304-connector-health.js deleted file mode 100644 index a551c67e5..000000000 --- a/src/data/migrations/20190916030304-connector-health.js +++ /dev/null @@ -1,15 +0,0 @@ -'use strict' - -module.exports = { - up: (queryInterface, Sequelize) => { - return queryInterface.addColumn('Connectors', 'healthy', { - type: Sequelize.BOOLEAN, - field: 'healthy', - defaultValue: true - }) - }, - - down: (queryInterface, Sequelize) => { - return queryInterface.removeColumn('Connectors', 'healthy') - } -} diff --git a/src/data/migrations/20190916030532-connector-port-deletion.js b/src/data/migrations/20190916030532-connector-port-deletion.js deleted file mode 100644 index 9c9567fb7..000000000 --- a/src/data/migrations/20190916030532-connector-port-deletion.js +++ /dev/null @@ -1,15 +0,0 @@ -'use strict' - -module.exports = { - up: (queryInterface, Sequelize) => { - return queryInterface.addColumn('ConnectorPorts', 'moved', { - type: Sequelize.BOOLEAN, - field: 'moved', - defaultValue: false - }) - }, - - down: (queryInterface, Sequelize) => { - return queryInterface.removeColumn('ConnectorPorts', 'moved') - } -} diff --git a/src/data/migrations/20200123000302-system-fog-and-flow.js b/src/data/migrations/20200123000302-system-fog-and-flow.js deleted file mode 100644 index 1f51ff416..000000000 --- a/src/data/migrations/20200123000302-system-fog-and-flow.js +++ /dev/null @@ -1,39 +0,0 @@ -'use strict' - -module.exports = { - up: (queryInterface, Sequelize) => { - /* - Add altering commands here. - Return a promise to correctly handle asynchronicity. - - Example: - return queryInterface.createTable('users', { id: Sequelize.INTEGER }); - */ - return Promise.all([ - queryInterface.addColumn('Fogs', 'is_system', { - type: Sequelize.BOOLEAN, - defaultValue: false, - field: 'is_system' - }), - queryInterface.addColumn('Flows', 'is_system', { - type: Sequelize.BOOLEAN, - defaultValue: false, - field: 'is_system' - }) - ]) - }, - - down: (queryInterface, Sequelize) => { - /* - Add reverting commands here. - Return a promise to correctly handle asynchronicity. - - Example: - return queryInterface.dropTable('users'); - */ - return Promise.all([ - queryInterface.removeColumn('Fogs', 'is_system'), - queryInterface.removeColumn('Flows', 'is_system') - ]) - } -} diff --git a/src/data/migrations/20200123045032-fog-and-change-tracking.js b/src/data/migrations/20200123045032-fog-and-change-tracking.js deleted file mode 100644 index 0c38b5745..000000000 --- a/src/data/migrations/20200123045032-fog-and-change-tracking.js +++ /dev/null @@ -1,50 +0,0 @@ -'use strict' -//deleted -module.exports = { - up: (queryInterface, Sequelize) => { - /* - Add altering commands here. - Return a promise to correctly handle asynchronicity. - - Example: - return queryInterface.createTable('users', { id: Sequelize.INTEGER }); - */ - return Promise.all([ - queryInterface.addColumn('Fogs', 'docker_pruning_freq', { - type: Sequelize.INTEGER, - defaultValue: 1, - field: 'docker_pruning_freq' - }), - queryInterface.addColumn('Fogs', 'available_disk_threshold', { - type: Sequelize.FLOAT, - defaultValue: 20, - field: 'available_disk_threshold' - }), - queryInterface.addColumn('Fogs', 'log_level', { - type: Sequelize.TEXT, - defaultValue: 'INFO', - field: 'log_level' - }), - queryInterface.addColumn('ChangeTrackings', 'prune', { - type: Sequelize.BOOLEAN, - field: 'prune' - }) - ]) - }, - - down: (queryInterface, Sequelize) => { - /* - Add reverting commands here. - Return a promise to correctly handle asynchronicity. - - Example: - return queryInterface.dropTable('users'); - */ - return Promise.all([ - queryInterface.removeColumn('Fogs', 'docker_pruning_freq'), - queryInterface.removeColumn('Fogs', 'available_disk_threshold'), - queryInterface.removeColumn('Fogs', 'log_level'), - queryInterface.removeColumn('ChangeTrackings', 'prune') - ]) - } -} diff --git a/src/data/migrations/20200123163412-create-router.js b/src/data/migrations/20200123163412-create-router.js deleted file mode 100644 index 267655178..000000000 --- a/src/data/migrations/20200123163412-create-router.js +++ /dev/null @@ -1,91 +0,0 @@ -'use strict' - -module.exports = { - up: async (queryInterface, Sequelize) => { - await queryInterface.createTable('Routers', { - id: { - type: Sequelize.INTEGER, - primaryKey: true, - autoIncrement: true, - allowNull: false, - field: 'id' - }, - isEdge: { - type: Sequelize.BOOLEAN, - field: 'is_edge' - }, - messagingPort: { - type: Sequelize.INTEGER, - field: 'messaging_port' - }, - edgeRouterPort: { - type: Sequelize.INTEGER, - field: 'edge_router_port' - }, - interRouterPort: { - type: Sequelize.INTEGER, - field: 'inter_router_port' - }, - host: { - type: Sequelize.TEXT, - field: 'host' - }, - isDefault: { - type: Sequelize.BOOLEAN, - field: 'is_default' - }, - iofogUuid: { - type: Sequelize.STRING(32), - field: 'iofog_uuid', - references: { model: 'Fogs', key: 'uuid' }, - onDelete: 'cascade' - }, - createdAt: { - type: Sequelize.DATE, - allowNull: false, - field: 'created_at' - }, - updatedAt: { - type: Sequelize.DATE, - allowNull: false, - field: 'updated_at' - } - }) - - await queryInterface.createTable('RouterConnections', { - id: { - type: Sequelize.INTEGER, - primaryKey: true, - autoIncrement: true, - allowNull: false, - field: 'id' - }, - sourceRouter: { - type: Sequelize.INTEGER, - field: 'source_router', - references: { model: 'Routers', key: 'id' }, - onDelete: 'cascade' - }, - destRouter: { - type: Sequelize.INTEGER, - field: 'dest_router', - references: { model: 'Routers', key: 'id' }, - onDelete: 'cascade' - }, - createdAt: { - type: Sequelize.DATE, - allowNull: false, - field: 'created_at' - }, - updatedAt: { - type: Sequelize.DATE, - allowNull: false, - field: 'updated_at' - } - }) - }, - down: async (queryInterface, Sequelize) => { - await queryInterface.dropTable('Routers') - await queryInterface.dropTable('RouterConnections') - } -} diff --git a/src/data/migrations/20200123205245-router-port-host-agent-config.js b/src/data/migrations/20200123205245-router-port-host-agent-config.js deleted file mode 100644 index 9f1e02d81..000000000 --- a/src/data/migrations/20200123205245-router-port-host-agent-config.js +++ /dev/null @@ -1,18 +0,0 @@ -'use strict' - -module.exports = { - up: (queryInterface, Sequelize) => { - return Promise.all([ - queryInterface.addColumn('Fogs', 'router_id', { - type: Sequelize.INTEGER, - field: 'router_id' - }) - ]) - }, - - down: (queryInterface, Sequelize) => { - return Promise.all([ - queryInterface.removeColumn('Fogs', 'router_id') - ]) - } -} diff --git a/src/data/migrations/20200124040224-router-changed-flag.js b/src/data/migrations/20200124040224-router-changed-flag.js deleted file mode 100644 index 689696bd4..000000000 --- a/src/data/migrations/20200124040224-router-changed-flag.js +++ /dev/null @@ -1,29 +0,0 @@ -'use strict' - -module.exports = { - up: (queryInterface, Sequelize) => { - /* - Add altering commands here. - Return a promise to correctly handle asynchronicity. - - Example: - return queryInterface.createTable('users', { id: Sequelize.INTEGER }); - */ - return queryInterface.addColumn('ChangeTrackings', 'router_changed', { - type: Sequelize.BOOLEAN, - defaultValue: false, - field: 'router_changed' - }) - }, - - down: (queryInterface, Sequelize) => { - /* - Add reverting commands here. - Return a promise to correctly handle asynchronicity. - - Example: - return queryInterface.dropTable('users'); - */ - return queryInterface.removeColumn('ChangeTrackings', 'router_changed') - } -} diff --git a/src/data/migrations/20200202113124-create-public-ports.js b/src/data/migrations/20200202113124-create-public-ports.js deleted file mode 100644 index 89a51de95..000000000 --- a/src/data/migrations/20200202113124-create-public-ports.js +++ /dev/null @@ -1,65 +0,0 @@ -'use strict' - -module.exports = { - up: async (queryInterface, Sequelize) => { - await queryInterface.createTable('MicroservicePublicPorts', { - id: { - type: Sequelize.INTEGER, - primaryKey: true, - autoIncrement: true, - allowNull: false, - field: 'id' - }, - portId: { - type: Sequelize.INTEGER, - field: 'port_id', - references: { model: 'MicroservicePorts', key: 'id' }, - onDelete: 'cascade' - }, - hostId: { - type: Sequelize.STRING(32), - field: 'host_id', - references: { model: 'Fogs', key: 'uuid' }, - onDelete: 'cascade' - }, - localProxyId: { - type: Sequelize.STRING(32), - field: 'local_proxy_id', - references: { model: 'Microservices', key: 'uuid' }, - onDelete: 'cascade' - }, - remoteProxyId: { - type: Sequelize.STRING(32), - field: 'remote_proxy_id', - references: { model: 'Microservices', key: 'uuid' }, - onDelete: 'cascade' - }, - publicPort: { - type: Sequelize.INTEGER, - field: 'public_port' - }, - queueName: { - type: Sequelize.STRING(32), - field: 'queue_name' - }, - isTcp: { - type: Sequelize.BOOLEAN, - defaultValue: false, - field: 'is_tcp' - }, - createdAt: { - type: Sequelize.DATE, - allowNull: false, - field: 'created_at' - }, - updatedAt: { - type: Sequelize.DATE, - allowNull: false, - field: 'updated_at' - } - }) - }, - down: async (queryInterface, Sequelize) => { - await queryInterface.dropTable('MicroservicePublicPorts') - } -} diff --git a/src/data/migrations/20200213033350-create-config.js b/src/data/migrations/20200213033350-create-config.js deleted file mode 100644 index e23337929..000000000 --- a/src/data/migrations/20200213033350-create-config.js +++ /dev/null @@ -1,39 +0,0 @@ -'use strict' - -module.exports = { - up: (queryInterface, Sequelize) => { - return queryInterface.createTable('Config', { - id: { - type: Sequelize.INTEGER, - primaryKey: true, - autoIncrement: true, - allowNull: false, - field: 'id' - }, - key: { - type: Sequelize.STRING(255), - field: 'key', - unique: true, - allowNull: false - }, - value: { - type: Sequelize.TEXT, - field: 'value', - allowNull: false - }, - createdAt: { - type: Sequelize.DATE, - allowNull: false, - field: 'created_at' - }, - updatedAt: { - type: Sequelize.DATE, - allowNull: false, - field: 'updated_at' - } - }).then(() => queryInterface.addIndex('Config', ['key'], { indicesType: 'UNIQUE' })) - }, - down: (queryInterface, Sequelize) => { - return queryInterface.dropTable('Config') - } -} diff --git a/src/data/migrations/20200220210224-change-tracking-timestamp.js b/src/data/migrations/20200220210224-change-tracking-timestamp.js deleted file mode 100644 index c76c84f55..000000000 --- a/src/data/migrations/20200220210224-change-tracking-timestamp.js +++ /dev/null @@ -1,15 +0,0 @@ -'use strict' - -module.exports = { - up: async (queryInterface, Sequelize) => { - await queryInterface.addColumn('ChangeTrackings', 'last_updated', { - type: Sequelize.STRING, - defaultValue: false, - field: 'last_updated' - }) - }, - - down: async (queryInterface, Sequelize) => { - await queryInterface.removeColumn('ChangeTrackings', 'last_updated') - } -} diff --git a/src/data/migrations/20200316011904-microservice-extra-host.js b/src/data/migrations/20200316011904-microservice-extra-host.js deleted file mode 100644 index d907a7ed8..000000000 --- a/src/data/migrations/20200316011904-microservice-extra-host.js +++ /dev/null @@ -1,52 +0,0 @@ -'use strict' -module.exports = { - up: (queryInterface, Sequelize) => { - return queryInterface.createTable('MicroserviceExtraHost', { - id: { - type: Sequelize.INTEGER, - primaryKey: true, - autoIncrement: true, - allowNull: false, - field: 'id' - }, - name: { - type: Sequelize.TEXT - }, - templateType: { - type: Sequelize.TEXT, - field: 'template_type' - }, - publicPort: { - type: Sequelize.INTEGER, - field: 'public_port' - }, // Only if type is Apps - template: { - type: Sequelize.TEXT - }, // Contains the template string - value: { - type: Sequelize.TEXT - }, - microserviceUuid: { - type: Sequelize.STRING(32), - field: 'microservice_uuid', - references: { model: 'Microservices', key: 'uuid' }, - onDelete: 'cascade' - }, - targetMicroserviceUuid: { - type: Sequelize.STRING(32), - field: 'target_microservice_uuid', - references: { model: 'Microservices', key: 'uuid' }, - onDelete: 'cascade' - }, - targetFogUuid: { - type: Sequelize.STRING(32), - field: 'target_fog_uuid', - references: { model: 'Fogs', key: 'uuid' }, - onDelete: 'cascade' - } - }) - }, - down: (queryInterface, Sequelize) => { - return queryInterface.dropTable('MicroserviceExtraHost') - } -} diff --git a/src/data/migrations/20200316032240-add-fog-host.js b/src/data/migrations/20200316032240-add-fog-host.js deleted file mode 100644 index 005fb1691..000000000 --- a/src/data/migrations/20200316032240-add-fog-host.js +++ /dev/null @@ -1,27 +0,0 @@ -'use strict' - -module.exports = { - up: (queryInterface, Sequelize) => { - /* - Add altering commands here. - Return a promise to correctly handle asynchronicity. - - Example: - return queryInterface.createTable('users', { id: Sequelize.INTEGER }); - */ - return queryInterface.addColumn('Fogs', 'host', { - type: Sequelize.TEXT - }) - }, - - down: (queryInterface, Sequelize) => { - /* - Add reverting commands here. - Return a promise to correctly handle asynchronicity. - - Example: - return queryInterface.dropTable('users'); - */ - return queryInterface.removeColumn('Fogs', 'host') - } -} diff --git a/src/data/migrations/20200323050813-fog-update-messagespeed.js b/src/data/migrations/20200323050813-fog-update-messagespeed.js deleted file mode 100644 index 36d922d7b..000000000 --- a/src/data/migrations/20200323050813-fog-update-messagespeed.js +++ /dev/null @@ -1,22 +0,0 @@ -'use strict' - -const { convertToInt } = require('../../helpers/app-helper') - -module.exports = { - up: async (queryInterface, Sequelize) => { - await queryInterface.changeColumn('Fogs', 'message_speed', { - type: Sequelize.FLOAT, - field: 'message_speed' - }) - }, - - down: async (queryInterface, Sequelize) => { - await queryInterface.changeColumn('Fogs', 'message_speed', { - type: Sequelize.BIGINT, - get () { - return convertToInt(this.getDataValue('messageSpeed')) - }, - field: 'message_speed' - }) - } -} diff --git a/src/data/migrations/20200420020250-remove-connector.js b/src/data/migrations/20200420020250-remove-connector.js deleted file mode 100644 index 14452825a..000000000 --- a/src/data/migrations/20200420020250-remove-connector.js +++ /dev/null @@ -1,136 +0,0 @@ -'use strict' - -module.exports = { - up: (queryInterface, Sequelize) => { - return queryInterface.removeColumn('Routings', 'connector_port_id') - .then(() => queryInterface.removeColumn('MicroservicePublicModes', 'connector_port_id')) - .then(() => queryInterface.dropTable('ConnectorPorts')) - .then(() => queryInterface.dropTable('Connectors')) - }, - - down: (queryInterface, Sequelize) => { - const connectorTable = queryInterface.createTable('Connectors', { - id: { - type: Sequelize.INTEGER, - primaryKey: true, - autoIncrement: true, - allowNull: false, - field: 'id' - }, - name: { - type: Sequelize.TEXT, - field: 'name' - }, - domain: { - type: Sequelize.TEXT, - field: 'domain' - }, - publicIp: { - type: Sequelize.TEXT, - field: 'public_ip' - }, - cert: { - type: Sequelize.TEXT, - field: 'cert' - }, - selfSignedCerts: { - type: Sequelize.BOOLEAN, - field: 'self_signed_certs' - }, - devMode: { - type: Sequelize.BOOLEAN, - field: 'dev_mode' - }, - createdAt: { - allowNull: false, - type: Sequelize.DATE, - field: 'created_at' - }, - updatedAt: { - allowNull: false, - type: Sequelize.DATE, - field: 'updated_at' - } - }) - const connectorPortTable = queryInterface.createTable('ConnectorPorts', { - id: { - type: Sequelize.INTEGER, - primaryKey: true, - autoIncrement: true, - allowNull: false, - field: 'id' - }, - port1: { - type: Sequelize.INTEGER, - field: 'port1' - }, - port2: { - type: Sequelize.INTEGER, - field: 'port2' - }, - maxConnectionsPort1: { - type: Sequelize.INTEGER, - field: 'max_connections_port1' - }, - maxConnectionsPort2: { - type: Sequelize.INTEGER, - field: 'max_connection_port2' - }, - passcodePort1: { - type: Sequelize.TEXT, - field: 'passcode_port1' - }, - passcodePort2: { - type: Sequelize.TEXT, - field: 'passcode_port2' - }, - heartBeatAbsenceThresholdPort1: { - type: Sequelize.INTEGER, - field: 'heartbeat_absence_threshold_port1' - }, - heartBeatAbsenceThresholdPort2: { - type: Sequelize.INTEGER, - field: 'heartbeat_absence_threshold_port2' - }, - mappingId: { - type: Sequelize.TEXT, - field: 'mapping_id' - }, - createdAt: { - allowNull: false, - type: Sequelize.DATE, - field: 'created_at' - }, - updatedAt: { - allowNull: false, - type: Sequelize.DATE, - field: 'updated_at' - }, - connectorId: { - type: Sequelize.INTEGER, - field: 'connector_id', - references: { model: 'Connectors', key: 'id' }, - onDelete: 'cascade' - } - }) - - const connectorPortIdColumn = queryInterface.addColumn('Routings', 'connectorPortId', { - type: Sequelize.INTEGER, - field: 'connector_port_id', - references: { model: 'ConnectorPorts', key: 'id' }, - onDelete: 'set null' - }) - - const msvcConnectorPortIdColumn = queryInterface.addColumn('MicroservicePublicModes', 'connectorPortId', { - type: Sequelize.INTEGER, - field: 'connector_port_id', - references: { model: 'ConnectorPorts', key: 'id' }, - onDelete: 'set null' - }) - - return connectorTable - .then(() => connectorPortTable) - .then(() => connectorPortIdColumn) - .then(() => msvcConnectorPortIdColumn) - } -} diff --git a/src/data/migrations/20200423201804-add-volume-mapping-type.js b/src/data/migrations/20200423201804-add-volume-mapping-type.js deleted file mode 100644 index d6d0cc5e7..000000000 --- a/src/data/migrations/20200423201804-add-volume-mapping-type.js +++ /dev/null @@ -1,13 +0,0 @@ -'use strict' - -module.exports = { - up: (queryInterface, Sequelize) => { - return queryInterface.addColumn('VolumeMappings', 'type', { - type: Sequelize.TEXT - }) - }, - - down: (queryInterface, Sequelize) => { - return queryInterface.removeColumn('VolumeMappings', 'type') - } -} diff --git a/src/data/migrations/20200506004924-add-route-name.js b/src/data/migrations/20200506004924-add-route-name.js deleted file mode 100644 index 91d5e2de9..000000000 --- a/src/data/migrations/20200506004924-add-route-name.js +++ /dev/null @@ -1,17 +0,0 @@ -'use strict' -//deleted -module.exports = { - up: (queryInterface, Sequelize) => { - return queryInterface.addColumn('Routings', 'name', { - type: Sequelize.STRING(255), - allowNull: false, - defaultValue: 'route' - }).then(() => queryInterface.addIndex('Routings', ['name'], { - indicesType: 'UNIQUE' - })) - }, - - down: (queryInterface, Sequelize) => { - return queryInterface.removeColumn('Routings', 'name') - } -} diff --git a/src/data/migrations/20200512044934-rename-flow.js b/src/data/migrations/20200512044934-rename-flow.js deleted file mode 100644 index 0f9403888..000000000 --- a/src/data/migrations/20200512044934-rename-flow.js +++ /dev/null @@ -1,11 +0,0 @@ -'use strict' - -module.exports = { - up: (queryInterface, Sequelize) => { - return queryInterface.renameColumn('Microservices', 'flow_id', 'application_id') - }, - - down: (queryInterface, Sequelize) => { - return queryInterface.renameColumn('Microservices', 'application_id', 'flow_id') - } -} diff --git a/src/data/migrations/20200512214530-add-application-to-routing.js b/src/data/migrations/20200512214530-add-application-to-routing.js deleted file mode 100644 index 88a263c7a..000000000 --- a/src/data/migrations/20200512214530-add-application-to-routing.js +++ /dev/null @@ -1,25 +0,0 @@ -'use strict' - -module.exports = { - up: (queryInterface, Sequelize) => { - return queryInterface.addColumn('Routings', 'application_id', - { - type: Sequelize.INTEGER, - field: 'application_id', - references: { model: 'Flows', key: 'id' }, - onDelete: 'cascade' - } - ) - }, - - down: (queryInterface, Sequelize) => { - /* - Add reverting commands here. - Return a promise to correctly handle asynchronicity. - - Example: - return queryInterface.dropTable('users'); - */ - return queryInterface.removeColumn('Routings', 'application_id') - } -} diff --git a/src/data/migrations/20200901053246-add-percentage-msvc-status.js b/src/data/migrations/20200901053246-add-percentage-msvc-status.js deleted file mode 100644 index 9cd03a291..000000000 --- a/src/data/migrations/20200901053246-add-percentage-msvc-status.js +++ /dev/null @@ -1,14 +0,0 @@ -'use strict' - -module.exports = { - up: (queryInterface, Sequelize) => { - return queryInterface.addColumn('MicroserviceStatuses', 'percentage', { - type: Sequelize.FLOAT, - defaultValue: 0.00 - }) - }, - - down: (queryInterface, Sequelize) => { - return queryInterface.removeColumn('MicroserviceStatuses', 'percentage') - } -} diff --git a/src/data/migrations/20201001230303-add-tags-fogs.js b/src/data/migrations/20201001230303-add-tags-fogs.js deleted file mode 100644 index 54a13d3ef..000000000 --- a/src/data/migrations/20201001230303-add-tags-fogs.js +++ /dev/null @@ -1,46 +0,0 @@ -'use strict' - -module.exports = { - up: async (queryInterface, Sequelize) => { - await queryInterface.createTable('Tags', { - id: { - type: Sequelize.INTEGER, - primaryKey: true, - autoIncrement: true, - allowNull: false, - field: 'id' - }, - value: { - type: Sequelize.STRING(255), - field: 'value', - unique: true, - allowNull: false - } - }) - await queryInterface.createTable('IofogTags', { - id: { - type: Sequelize.INTEGER, - primaryKey: true, - autoIncrement: true, - allowNull: false, - field: 'id' - }, - TagId: { - type: Sequelize.INTEGER, - field: 'tag_id', - references: { model: 'Tags', key: 'id' }, - onDelete: 'cascade' - }, - FogUuid: { - type: Sequelize.STRING(255), - field: 'fog_uuid', - references: { model: 'Fogs', key: 'uuid' }, - onDelete: 'cascade' - } - }) - }, - down: async (queryInterface, Sequelize) => { - await queryInterface.dropTable('Tags') - await queryInterface.dropTable('IofogTags') - } -} diff --git a/src/data/migrations/20201028005645-create-edge-resources.js b/src/data/migrations/20201028005645-create-edge-resources.js deleted file mode 100644 index 63c02dc46..000000000 --- a/src/data/migrations/20201028005645-create-edge-resources.js +++ /dev/null @@ -1,113 +0,0 @@ -'use strict' - -module.exports = { - up: async (queryInterface, Sequelize) => { - await queryInterface.createTable('EdgeResources', { - id: { - type: Sequelize.INTEGER, - primaryKey: true, - autoIncrement: true, - allowNull: false - }, - name: { - type: Sequelize.TEXT, - allowNull: false - }, - version: { - type: Sequelize.TEXT, - allowNull: false - }, - description: Sequelize.TEXT, - displayName: { type: Sequelize.TEXT, field: 'display_name' }, - displayIcon: { type: Sequelize.TEXT, field: 'display_icon' }, - displayColor: { type: Sequelize.TEXT, field: 'display_color' }, - interfaceProtocol: { type: Sequelize.TEXT, field: 'interface_protocol' }, - interfaceId: { type: Sequelize.INTEGER, field: 'interface_id' } - }) - await queryInterface.createTable('AgentEdgeResources', { - id: { - type: Sequelize.INTEGER, - primaryKey: true, - autoIncrement: true, - allowNull: false, - field: 'id' - }, - EdgeResourceId: { - type: Sequelize.INTEGER, - field: 'edge_resource_id', - references: { model: 'EdgeResources', key: 'id' }, - onDelete: 'cascade' - }, - FogUuid: { - type: Sequelize.STRING(255), - field: 'fog_uuid', - references: { model: 'Fogs', key: 'uuid' }, - onDelete: 'cascade' - } - }) - await queryInterface.createTable('EdgeResourceOrchestrationTags', { - id: { - type: Sequelize.INTEGER, - primaryKey: true, - autoIncrement: true, - allowNull: false, - field: 'id' - }, - EdgeResourceId: { - type: Sequelize.INTEGER, - field: 'edge_resource_id', - references: { model: 'EdgeResources', key: 'id' }, - onDelete: 'cascade' - }, - TagId: { - type: Sequelize.INTEGER, - field: 'tag_id', - references: { model: 'Tags', key: 'id' }, - onDelete: 'cascade' - } - }) - await queryInterface.createTable('HTTPBasedResourceInterfaces', { - id: { - type: Sequelize.INTEGER, - primaryKey: true, - autoIncrement: true, - allowNull: false - }, - edgeResourceId: { - type: Sequelize.INTEGER, - field: 'edge_resource_id', - references: { model: 'EdgeResources', key: 'id' }, - onDelete: 'cascade' - } - }) - await queryInterface.createTable('HTTPBasedResourceInterfaceEndpoints', { - id: { - type: Sequelize.INTEGER, - primaryKey: true, - autoIncrement: true, - allowNull: false - }, - name: Sequelize.TEXT, - description: Sequelize.TEXT, - method: Sequelize.TEXT, - url: Sequelize.TEXT, - requestType: { type: Sequelize.TEXT, field: 'request_type' }, - responseType: { type: Sequelize.TEXT, field: 'response_type' }, - requestPayloadExample: { type: Sequelize.TEXT, field: 'request_payload_example' }, - responsePayloadExample: { type: Sequelize.TEXT, field: 'response_payload_example' }, - interfaceId: { - type: Sequelize.INTEGER, - field: 'interface_id', - references: { model: 'HTTPBasedResourceInterfaces', key: 'id' }, - onDelete: 'cascade' - } - }) - }, - down: async (queryInterface, Sequelize) => { - await queryInterface.dropTable('EdgeResources') - await queryInterface.dropTable('AgentEdgeResources') - await queryInterface.dropTable('EdgeResourceOrchestrationTags') - await queryInterface.dropTable('HTTPBasedResourceInterfaces') - await queryInterface.dropTable('HTTPBasedResourceInterfaceEndpoints') - } -} diff --git a/src/data/migrations/20201105003849-create-edge-resources-agent-flag.js b/src/data/migrations/20201105003849-create-edge-resources-agent-flag.js deleted file mode 100644 index 8c0a56763..000000000 --- a/src/data/migrations/20201105003849-create-edge-resources-agent-flag.js +++ /dev/null @@ -1,15 +0,0 @@ -'use strict' - -module.exports = { - up: async (queryInterface, Sequelize) => { - await queryInterface.addColumn('ChangeTrackings', 'linked_edge_resources', { - type: Sequelize.BOOLEAN, - defaultValue: false, - field: 'linked_edge_resources' - }) - }, - - down: async (queryInterface, Sequelize) => { - await queryInterface.removeColumn('ChangeTrackings', 'linked_edge_resources') - } -} diff --git a/src/data/migrations/20201203011708-microservice-status-error-msg.js b/src/data/migrations/20201203011708-microservice-status-error-msg.js deleted file mode 100644 index e2871c672..000000000 --- a/src/data/migrations/20201203011708-microservice-status-error-msg.js +++ /dev/null @@ -1,14 +0,0 @@ -'use strict' - -module.exports = { - up: (queryInterface, Sequelize) => { - return queryInterface.addColumn('MicroserviceStatuses', 'error_message', { - type: Sequelize.TEXT, - defaultValue: '' - }) - }, - - down: (queryInterface, Sequelize) => { - return queryInterface.removeColumn('MicroserviceStatuses', 'error_message') - } -} diff --git a/src/data/migrations/20201204003312-create_application_templates.js b/src/data/migrations/20201204003312-create_application_templates.js deleted file mode 100644 index d8550c43c..000000000 --- a/src/data/migrations/20201204003312-create_application_templates.js +++ /dev/null @@ -1,87 +0,0 @@ -'use strict' - -module.exports = { - up: async (queryInterface, Sequelize) => { - await queryInterface.createTable('ApplicationTemplates', { - id: { - type: Sequelize.INTEGER, - primaryKey: true, - autoIncrement: true, - allowNull: false - }, - name: { - type: Sequelize.STRING(255), - field: 'name', - defaultValue: 'new-application-template', - unique: true - }, - description: { - type: Sequelize.TEXT, - field: 'description', - defaultValue: '' - }, - schemaVersion: { - type: Sequelize.TEXT, - field: 'schema_version', - defaultValue: '' - }, - applicationJSON: { - type: Sequelize.TEXT, - field: 'application_json', - defaultValue: '{}' - }, - createdAt: { - allowNull: false, - type: Sequelize.DATE, - field: 'created_at' - }, - updatedAt: { - allowNull: false, - type: Sequelize.DATE, - field: 'updated_at' - } - }) - await queryInterface.createTable('ApplicationTemplateVariables', { - id: { - type: Sequelize.INTEGER, - primaryKey: true, - autoIncrement: true, - allowNull: false, - field: 'id' - }, - key: { - type: Sequelize.TEXT, - field: 'key' - }, - description: { - type: Sequelize.TEXT, - field: 'description', - defaultValue: '' - }, - defaultValue: { - type: Sequelize.TEXT, - field: 'default_value' - }, - applicationTemplateId: { - type: Sequelize.INTEGER, - field: 'application_template_id', - references: { model: 'ApplicationTemplates', key: 'id' }, - onDelete: 'cascade' - }, - createdAt: { - allowNull: false, - type: Sequelize.DATE, - field: 'created_at' - }, - updatedAt: { - allowNull: false, - type: Sequelize.DATE, - field: 'updated_at' - } - }) - }, - down: async (queryInterface, Sequelize) => { - await queryInterface.dropTable('ApplicationTemplates') - await queryInterface.dropTable('ApplicationTemplateVariables') - } -} diff --git a/src/data/migrations/20210104191500-add_custom_to_edge_resources.js b/src/data/migrations/20210104191500-add_custom_to_edge_resources.js deleted file mode 100644 index 407225bc1..000000000 --- a/src/data/migrations/20210104191500-add_custom_to_edge_resources.js +++ /dev/null @@ -1,22 +0,0 @@ -'use strict' - -module.exports = { - up: (queryInterface, Sequelize) => { - return queryInterface.addColumn('EdgeResources', 'custom', - { - type: Sequelize.TEXT - } - ) - }, - - down: (queryInterface, Sequelize) => { - /* - Add reverting commands here. - Return a promise to correctly handle asynchronicity. - - Example: - return queryInterface.dropTable('users'); - */ - return queryInterface.removeColumn('EdgeResources', 'custom') - } -} diff --git a/src/data/migrations/20210118012712-add_is_udp_to_port.js b/src/data/migrations/20210118012712-add_is_udp_to_port.js deleted file mode 100644 index b2039618d..000000000 --- a/src/data/migrations/20210118012712-add_is_udp_to_port.js +++ /dev/null @@ -1,21 +0,0 @@ -'use strict' - -module.exports = { - up: async (queryInterface, Sequelize) => { - return queryInterface.addColumn('MicroservicePorts', 'is_udp', - { - type: Sequelize.BOOLEAN - } - ) - }, - - down: async (queryInterface, Sequelize) => { - /** - * Add reverting commands here. - * - * Example: - * await queryInterface.dropTable('users'); - */ - return queryInterface.removeColumn('MicroservicePorts', 'is_udp') - } -} diff --git a/src/data/migrations/20211019214923-add-schemes-to-public-ports.js b/src/data/migrations/20211019214923-add-schemes-to-public-ports.js deleted file mode 100644 index 29d3d7be8..000000000 --- a/src/data/migrations/20211019214923-add-schemes-to-public-ports.js +++ /dev/null @@ -1,22 +0,0 @@ -'use strict' - -module.exports = { - up: async (queryInterface, Sequelize) => { - return queryInterface.addColumn('MicroservicePublicPorts', 'schemes', - { - type: Sequelize.TEXT, - defaultValue: JSON.stringify(['https']) - } - ) - }, - - down: async (queryInterface, Sequelize) => { - /** - * Add reverting commands here. - * - * Example: - * await queryInterface.dropTable('users'); - */ - return queryInterface.removeColumn('MicroservicePublicPorts', 'schemes') - } -} diff --git a/src/data/migrations/20211020014715-add-index-to-public-ports.js b/src/data/migrations/20211020014715-add-index-to-public-ports.js deleted file mode 100644 index 70af9276c..000000000 --- a/src/data/migrations/20211020014715-add-index-to-public-ports.js +++ /dev/null @@ -1,17 +0,0 @@ -'use strict' - -module.exports = { - up: (queryInterface, Sequelize) => { - return queryInterface.addConstraint('MicroservicePublicPorts', - { - fields: ['public_port', 'host_id'], - type: 'unique', - name: 'port_host_unique_constraint' - } - ) - }, - - down: (queryInterface, Sequelize) => { - return queryInterface.removeConstraint('MicroservicePublicPorts', 'port_host_unique_constraint') - } -} diff --git a/src/data/migrations/20211022010318-add-unique-constraint-msvc.js b/src/data/migrations/20211022010318-add-unique-constraint-msvc.js deleted file mode 100644 index 3e5b504aa..000000000 --- a/src/data/migrations/20211022010318-add-unique-constraint-msvc.js +++ /dev/null @@ -1,30 +0,0 @@ -'use strict' -//deleted -module.exports = { - up: (queryInterface, Sequelize) => { - /* - Add altering commands here. - Return a promise to correctly handle asynchronicity. - - Example: - return queryInterface.createTable('users', { id: Sequelize.INTEGER }); - */ - return queryInterface.addConstraint('Microservices', - { - fields: ['application_id', 'name'], - type: 'unique', - name: 'app_name_unique_constraint' - }) - }, - - down: (queryInterface, Sequelize) => { - /* - Add reverting commands here. - Return a promise to correctly handle asynchronicity. - - Example: - return queryInterface.dropTable('users'); - */ - return queryInterface.removeConstraint('Microservices', 'app_name_unique_constraint') - } -} diff --git a/src/data/migrations/20211022013326-add-unique-constraint-route.js b/src/data/migrations/20211022013326-add-unique-constraint-route.js deleted file mode 100644 index 2761f083a..000000000 --- a/src/data/migrations/20211022013326-add-unique-constraint-route.js +++ /dev/null @@ -1,30 +0,0 @@ -'use strict' -// deleted -module.exports = { - up: (queryInterface, Sequelize) => { - /* - Add altering commands here. - Return a promise to correctly handle asynchronicity. - - Example: - return queryInterface.createTable('users', { id: Sequelize.INTEGER }); - */ - return queryInterface.addConstraint('Routings', - { - fields: ['application_id', 'name'], - type: 'unique', - name: 'routings_app_name_unique_constraint' - }) - }, - - down: (queryInterface, Sequelize) => { - /* - Add reverting commands here. - Return a promise to correctly handle asynchronicity. - - Example: - return queryInterface.dropTable('users'); - */ - return queryInterface.removeConstraint('Routings', 'routings_app_name_unique_constraint') - } -} diff --git a/src/data/migrations/20220405053419-add-time-zone-agent-config.js b/src/data/migrations/20220405053419-add-time-zone-agent-config.js deleted file mode 100644 index 9cb59e0f5..000000000 --- a/src/data/migrations/20220405053419-add-time-zone-agent-config.js +++ /dev/null @@ -1,27 +0,0 @@ -'use strict' - -module.exports = { - up: (queryInterface, Sequelize) => { - /* - Add altering commands here. - Return a promise to correctly handle asynchronicity. - - Example: - return queryInterface.createTable('users', { id: Sequelize.INTEGER }); - */ - return queryInterface.addColumn('Fogs', 'time_zone', { - type: Sequelize.TEXT - }) - }, - - down: (queryInterface, Sequelize) => { - /* - Add reverting commands here. - Return a promise to correctly handle asynchronicity. - - Example: - return queryInterface.dropTable('users'); - */ - return queryInterface.removeColumn('Fogs', 'time_zone') - } -} diff --git a/src/data/migrations/20220409021708-drop-table-tracking.js b/src/data/migrations/20220409021708-drop-table-tracking.js deleted file mode 100644 index 6d6f2e322..000000000 --- a/src/data/migrations/20220409021708-drop-table-tracking.js +++ /dev/null @@ -1,25 +0,0 @@ -'use strict' - -module.exports = { - up: (queryInterface, Sequelize) => { - /* - Add altering commands here. - Return a promise to correctly handle asynchronicity. - - Example: - return queryInterface.createTable('users', { id: Sequelize.INTEGER }); - */ - return queryInterface.dropTable('TrackingEvent') - }, - - down: (queryInterface, Sequelize) => { - /* - Add reverting commands here. - Return a promise to correctly handle asynchronicity. - - Example: - return queryInterface.dropTable('users'); - */ - return queryInterface.createTable('TrackingEvent') - } -} diff --git a/src/data/migrations/20221021102712-add_is_proxy_to_port.js b/src/data/migrations/20221021102712-add_is_proxy_to_port.js deleted file mode 100644 index d5ccfa8e9..000000000 --- a/src/data/migrations/20221021102712-add_is_proxy_to_port.js +++ /dev/null @@ -1,21 +0,0 @@ -'use strict' - -module.exports = { - up: async (queryInterface, Sequelize) => { - return queryInterface.addColumn('MicroservicePorts', 'is_proxy', - { - type: Sequelize.BOOLEAN - } - ) - }, - - down: async (queryInterface, Sequelize) => { - /** - * Add reverting commands here. - * - * Example: - * await queryInterface.dropTable('users'); - */ - return queryInterface.removeColumn('MicroservicePorts', 'is_proxy') - } -} diff --git a/src/data/migrations/20221021132000-create-proxy-ports.js b/src/data/migrations/20221021132000-create-proxy-ports.js deleted file mode 100644 index 5788e7665..000000000 --- a/src/data/migrations/20221021132000-create-proxy-ports.js +++ /dev/null @@ -1,52 +0,0 @@ -'use strict' - -module.exports = { - up: async (queryInterface, Sequelize) => { - await queryInterface.createTable('MicroserviceProxyPorts', { - id: { - type: Sequelize.INTEGER, - primaryKey: true, - autoIncrement: true, - allowNull: false, - field: 'id' - }, - portId: { - type: Sequelize.INTEGER, - field: 'port_id', - references: { model: 'MicroservicePorts', key: 'id' }, - onDelete: 'cascade' - }, - host: { - type: Sequelize.STRING(128), - field: 'host' - }, - localProxyId: { - type: Sequelize.STRING(32), - field: 'local_proxy_id', - references: { model: 'Microservices', key: 'uuid' }, - onDelete: 'cascade' - }, - publicPort: { - type: Sequelize.INTEGER, - field: 'public_port' - }, - protocol: { - type: Sequelize.STRING(3), - field: 'protocol' - }, - createdAt: { - type: Sequelize.DATE, - allowNull: false, - field: 'created_at' - }, - updatedAt: { - type: Sequelize.DATE, - allowNull: false, - field: 'updated_at' - } - }) - }, - down: async (queryInterface, Sequelize) => { - await queryInterface.dropTable('MicroserviceProxyPorts') - } -} diff --git a/src/data/migrations/20221021152712-add_admin_port_to_proxy_ports.js b/src/data/migrations/20221021152712-add_admin_port_to_proxy_ports.js deleted file mode 100644 index 605ba2dc7..000000000 --- a/src/data/migrations/20221021152712-add_admin_port_to_proxy_ports.js +++ /dev/null @@ -1,21 +0,0 @@ -'use strict' - -module.exports = { - up: async (queryInterface, Sequelize) => { - return queryInterface.addColumn('MicroserviceProxyPorts', 'admin_port', - { - type: Sequelize.BOOLEAN - } - ) - }, - - down: async (queryInterface, Sequelize) => { - /** - * Add reverting commands here. - * - * Example: - * await queryInterface.dropTable('users'); - */ - return queryInterface.removeColumn('MicroserviceProxyPorts', 'admin_port') - } -} diff --git a/src/data/migrations/20221031162712-add_tokens_to_proxy_ports.js b/src/data/migrations/20221031162712-add_tokens_to_proxy_ports.js deleted file mode 100644 index 97f593c70..000000000 --- a/src/data/migrations/20221031162712-add_tokens_to_proxy_ports.js +++ /dev/null @@ -1,21 +0,0 @@ -'use strict' - -module.exports = { - up: async (queryInterface, Sequelize) => { - return queryInterface.addColumn('MicroserviceProxyPorts', 'proxy_token', - { - type: Sequelize.TEXT - } - ) - }, - - down: async (queryInterface, Sequelize) => { - /** - * Add reverting commands here. - * - * Example: - * await queryInterface.dropTable('users'); - */ - return queryInterface.removeColumn('MicroserviceProxyPorts', 'proxy_token') - } -} diff --git a/src/data/migrations/20221110151246-add_port_uuid_to_proxy_ports copy.js b/src/data/migrations/20221110151246-add_port_uuid_to_proxy_ports copy.js deleted file mode 100644 index 2199670b3..000000000 --- a/src/data/migrations/20221110151246-add_port_uuid_to_proxy_ports copy.js +++ /dev/null @@ -1,27 +0,0 @@ -'use strict' - -module.exports = { - up: async (queryInterface, Sequelize) => { - await queryInterface.addColumn('MicroserviceProxyPorts', 'port_uuid', - { - type: Sequelize.TEXT - } - ) - await queryInterface.addColumn('MicroserviceProxyPorts', 'server_token', - { - type: Sequelize.TEXT - } - ) - }, - - down: async (queryInterface, Sequelize) => { - /** - * Add reverting commands here. - * - * Example: - * await queryInterface.dropTable('users'); - */ - await queryInterface.removeColumn('MicroserviceProxyPorts', 'port_uuid') - await queryInterface.removeColumn('MicroserviceProxyPorts', 'server_token') - } -} diff --git a/src/data/seeders/20180928110125-insert-registry.js b/src/data/seeders/20180928110125-insert-registry.js deleted file mode 100644 index 87b33f0f8..000000000 --- a/src/data/seeders/20180928110125-insert-registry.js +++ /dev/null @@ -1,34 +0,0 @@ -'use strict' - -module.exports = { - up: (queryInterface, Sequelize) => { - return queryInterface.bulkInsert('Registries', [ - { - url: 'registry.hub.docker.com', - is_public: true, - secure: true, - certificate: '', - requires_cert: false, - user_name: '', - password: '', - user_email: '', - user_id: null - }, - { - url: 'from_cache', - is_public: true, - secure: true, - certificate: '', - requires_cert: false, - user_name: '', - password: '', - user_email: '', - user_id: null - } - ]) - }, - - down: (queryInterface, Sequelize) => { - return queryInterface.bulkDelete('Registries', null, {}) - } -} diff --git a/src/data/seeders/20180928111532-insert-catalog-item.js b/src/data/seeders/20180928111532-insert-catalog-item.js deleted file mode 100644 index 8e0c8e157..000000000 --- a/src/data/seeders/20180928111532-insert-catalog-item.js +++ /dev/null @@ -1,168 +0,0 @@ -'use strict' - -module.exports = { - up: (queryInterface, Sequelize) => { - return queryInterface.bulkInsert('CatalogItems', [ - { - name: 'Networking Tool', - description: 'The built-in networking tool for Eclipse ioFog.', - category: 'SYSTEM', - publisher: 'Eclipse ioFog', - disk_required: 0, - ram_required: 0, - picture: 'none.png', - config_example: null, - is_public: false, - registry_id: 1, - user_id: null - }, - { - name: 'RESTBlue', - description: 'REST API for Bluetooth Low Energy layer.', - category: 'SYSTEM', - publisher: 'Eclipse ioFog', - disk_required: 0, - ram_required: 0, - picture: 'none.png', - config_example: null, - is_public: false, - registry_id: 1, - user_id: null - }, - { - name: 'HAL', - description: 'REST API for Hardware Abstraction layer.', - category: 'SYSTEM', - publisher: 'Eclipse ioFog', - disk_required: 0, - ram_required: 0, - picture: 'none.png', - config_example: null, - is_public: false, - registry_id: 1, - user_id: null - }, - { - name: 'Diagnostics', - description: '0', - category: 'UTILITIES', - publisher: 'Eclipse ioFog', - disk_required: 0, - ram_required: 0, - picture: 'images/build/580.png', - config_example: null, - is_public: true, - registry_id: 1, - user_id: null - }, - { - name: 'Hello Web Demo', - description: 'A simple web server to test Eclipse ioFog.', - category: 'UTILITIES', - publisher: 'Eclipse ioFog', - disk_required: 0, - ram_required: 0, - picture: 'images/build/4.png', - config_example: null, - is_public: true, - registry_id: 1, - user_id: null - }, - { - name: 'Open Weather Map Data', - description: 'A stream of data from the Open Weather Map API in JSON format', - category: 'SENSORS', - publisher: 'Eclipse ioFog', - disk_required: 0, - ram_required: 0, - picture: 'images/build/8.png', - config_example: null, - is_public: true, - registry_id: 1, - user_id: null - }, - { - name: 'JSON REST API', - description: 'A configurable REST API that gives JSON output', - category: 'UTILITIES', - publisher: 'Eclipse ioFog', - disk_required: 0, - ram_required: 0, - picture: 'images/build/49.png', - config_example: null, - is_public: true, - registry_id: 1, - user_id: null - }, - { - name: 'Temperature Converter', - description: 'A simple temperature format converter', - category: 'UTILITIES', - publisher: 'Eclipse ioFog', - disk_required: 0, - ram_required: 0, - picture: 'images/build/58.png', - config_example: null, - is_public: true, - registry_id: 1, - user_id: null - }, - { - name: 'JSON Sub-Select', - description: 'Performs sub-selection and transform operations on any JSON messages', - category: 'UTILITIES', - publisher: 'Eclipse ioFog', - disk_required: 0, - ram_required: 0, - picture: 'images/build/59.png', - config_example: null, - is_public: true, - registry_id: 1, - user_id: null - }, - { - name: 'Humidity Sensor Simulator', - description: 'Humidity Sensor Simulator for Eclipse ioFog', - category: 'SIMULATOR', - publisher: 'Eclipse ioFog', - disk_required: 0, - ram_required: 0, - picture: 'images/build/simulator.png', - config_example: null, - is_public: true, - registry_id: 1, - user_id: null - }, - { - name: 'Seismic Sensor Simulator', - description: 'Seismic Sensor Simulator for Eclipse ioFog', - category: 'SIMULATOR', - publisher: 'Eclipse ioFog', - disk_required: 0, - ram_required: 0, - picture: 'images/build/simulator.png', - config_example: null, - is_public: true, - registry_id: 1, - user_id: null - }, - { - name: 'Temperature Sensor Simulator', - description: 'Temperature Sensor Simulator for Eclipse ioFog', - category: 'SIMULATOR', - publisher: 'Eclipse ioFog', - disk_required: 0, - ram_required: 0, - picture: 'images/build/simulator.png', - config_example: null, - is_public: true, - registry_id: 1, - user_id: null - } - ]) - }, - - down: (queryInterface, Sequelize) => { - return queryInterface.bulkDelete('CatalogItems', null, {}) - } -} diff --git a/src/data/seeders/20180928112152-insert-iofog-type.js b/src/data/seeders/20180928112152-insert-iofog-type.js deleted file mode 100644 index df1f994cd..000000000 --- a/src/data/seeders/20180928112152-insert-iofog-type.js +++ /dev/null @@ -1,50 +0,0 @@ -'use strict' - -module.exports = { - up: (queryInterface, Sequelize) => { - return queryInterface.bulkInsert('FogTypes', [ - { - id: 0, - name: 'Unspecified', - image: 'iointegrator0.png', - description: 'Unspecified device. Fog Type will be selected on provision', - network_catalog_item_id: 1, - hal_catalog_item_id: 3, - bluetooth_catalog_item_id: 2 - }, - { - id: 1, - name: 'Standard Linux (x86)', - image: 'iointegrator1.png', - description: 'A standard Linux server of at least moderate processing power and capacity. ' + - 'Compatible with common Linux types such as Ubuntu, Red Hat, and CentOS.', - network_catalog_item_id: 1, - hal_catalog_item_id: 3, - bluetooth_catalog_item_id: 2 - }, - { - id: 2, - name: 'ARM Linux', - image: 'iointegrator2.png', - description: 'A version of ioFog meant to run on Linux systems with ARM processors. ' + - 'Microservices for this ioFog type will be tailored to ARM systems.', - network_catalog_item_id: 1, - hal_catalog_item_id: 3, - bluetooth_catalog_item_id: 2 - } - ]).then(() => { - return queryInterface.bulkUpdate('Fogs', - { - fog_type_id: 0 - }, - { - fog_type_id: null - } - ) - }) - }, - - down: (queryInterface, Sequelize) => { - return queryInterface.bulkDelete('FogTypes', null, {}) - } -} diff --git a/src/data/seeders/20180928121334-insert-catalog-item-image.js b/src/data/seeders/20180928121334-insert-catalog-item-image.js deleted file mode 100644 index 682876fa3..000000000 --- a/src/data/seeders/20180928121334-insert-catalog-item-image.js +++ /dev/null @@ -1,132 +0,0 @@ -'use strict' - -module.exports = { - up: (queryInterface, Sequelize) => { - return queryInterface.bulkInsert('CatalogItemImages', [ - { - catalog_item_id: 1, - fog_type_id: 1, - container_image: 'iofog/core-networking' - }, - { - catalog_item_id: 1, - fog_type_id: 2, - container_image: 'iofog/core-networking-arm' - }, - { - catalog_item_id: 2, - fog_type_id: 1, - container_image: 'iofog/restblue' - }, - { - catalog_item_id: 2, - fog_type_id: 2, - container_image: 'iofog/restblue-arm' - }, - { - catalog_item_id: 3, - fog_type_id: 1, - container_image: 'ghcr.io/datasance/hal' - }, - { - catalog_item_id: 3, - fog_type_id: 2, - container_image: 'ghcr.io/datasance/hal-arm' - }, - { - catalog_item_id: 4, - fog_type_id: 1, - container_image: 'iofog/diagnostics' - }, - { - catalog_item_id: 4, - fog_type_id: 2, - container_image: 'iofog/diagnostics-arm' - }, - { - catalog_item_id: 5, - fog_type_id: 1, - container_image: 'iofog/hello-web' - }, - { - catalog_item_id: 5, - fog_type_id: 2, - container_image: 'iofog/hello-web-arm' - }, - { - catalog_item_id: 6, - fog_type_id: 1, - container_image: 'iofog/open-weather-map' - }, - { - catalog_item_id: 6, - fog_type_id: 2, - container_image: 'iofog/open-weather-map-arm' - }, - { - catalog_item_id: 7, - fog_type_id: 1, - container_image: 'iofog/json-rest-api' - }, - { - catalog_item_id: 7, - fog_type_id: 2, - container_image: 'iofog/json-rest-api-arm' - }, - { - catalog_item_id: 8, - fog_type_id: 1, - container_image: 'iofog/temperature-conversion' - }, - { - catalog_item_id: 8, - fog_type_id: 2, - container_image: 'iofog/temperature-conversion-arm' - }, - { - catalog_item_id: 9, - fog_type_id: 1, - container_image: 'iofog/json-subselect' - }, - { - catalog_item_id: 9, - fog_type_id: 2, - container_image: 'iofog/json-subselect-arm' - }, - { - catalog_item_id: 10, - fog_type_id: 1, - container_image: 'iofog/humidity-sensor-simulator' - }, - { - catalog_item_id: 10, - fog_type_id: 2, - container_image: 'iofog/humidity-sensor-simulator-arm' - }, - { - catalog_item_id: 11, - fog_type_id: 1, - container_image: 'iofog/seismic-sensor-simulator' - }, - { - catalog_item_id: 11, - fog_type_id: 2, - container_image: 'iofog/seismic-sensor-simulator-arm' - }, - { - catalog_item_id: 12, - fog_type_id: 1, - container_image: 'iofog/temperature-sensor-simulator' - }, - { - catalog_item_id: 12, - fog_type_id: 2, - container_image: 'iofog/temperature-sensor-simulator-arm' - } - ]) - }, - - down: (queryInterface, Sequelize) => { - return queryInterface.bulkDelete('CatalogItemImages', null, {}) - } -} diff --git a/src/data/seeders/20190130112616-insert-logging-catalog-item.js b/src/data/seeders/20190130112616-insert-logging-catalog-item.js deleted file mode 100644 index 4a2d97769..000000000 --- a/src/data/seeders/20190130112616-insert-logging-catalog-item.js +++ /dev/null @@ -1,42 +0,0 @@ -'use strict' - -module.exports = { - up: (queryInterface, Sequelize) => { - return queryInterface.bulkInsert('CatalogItems', [ - { - name: 'Common Logging', - description: 'Container which gathers logs and provides REST API' + - ' for adding and querying logs from containers', - category: 'UTILITIES', - publisher: 'Eclipse ioFog', - disk_required: 0, - ram_required: 0, - picture: 'none.png', - config_example: '{"access_tokens": ["Some_Access_Token"], "cleanfrequency": "1h40m", "ttl": "24h"}', - is_public: false, - registry_id: 1, - user_id: null - }] - ).then(() => { - return queryInterface.bulkInsert('CatalogItemImages', [ - { - catalog_item_id: 13, - fog_type_id: 1, - container_image: 'iofog/common-logging' - }, - { - catalog_item_id: 13, - fog_type_id: 2, - container_image: 'iofog/common-logging-arm' - } - ] - ) - }) - }, - - down: (queryInterface, Sequelize) => { - return queryInterface.bulkDelete('CatalogItems', { ID: 13 }, {}).then(() => { - return queryInterface.bulkDelete('CatalogItemImages', { catalog_item_id: 13 }) - }) - } -} diff --git a/src/data/seeders/20190131111441-insert-json-generator-catalog-item.js b/src/data/seeders/20190131111441-insert-json-generator-catalog-item.js deleted file mode 100644 index ae454d2bf..000000000 --- a/src/data/seeders/20190131111441-insert-json-generator-catalog-item.js +++ /dev/null @@ -1,38 +0,0 @@ -module.exports = { - up: (queryInterface, Sequelize) => { - return queryInterface.bulkInsert('CatalogItems', [ - { - name: 'JSON Generator', - description: 'Container generates ioMessages with contentdata as complex JSON object.', - category: 'UTILITIES', - publisher: 'Eclipse ioFog', - disk_required: 0, - ram_required: 0, - picture: 'none.png', - config_example: '{}', - is_public: true, - registry_id: 1, - user_id: null - }] - ).then(() => { - return queryInterface.bulkInsert('CatalogItemImages', [ - { - catalog_item_id: 14, - fog_type_id: 1, - container_image: 'iofog/json-generator' - }, - { - catalog_item_id: 14, - fog_type_id: 2, - container_image: 'iofog/json-generator-arm' - } - ]) - }) - }, - - down: (queryInterface, Sequelize) => { - return queryInterface.bulkDelete('CatalogItems', { ID: 14 }, {}).then(() => { - return queryInterface.bulkDelete('CatalogItemImages', { catalog_item_id: 14 }) - }) - } -} diff --git a/src/data/seeders/20190218103641-adding-default-configs.js b/src/data/seeders/20190218103641-adding-default-configs.js deleted file mode 100644 index 824d8b8db..000000000 --- a/src/data/seeders/20190218103641-adding-default-configs.js +++ /dev/null @@ -1,80 +0,0 @@ -'use strict' - -module.exports = { - up: (queryInterface, Sequelize) => { - return queryInterface.bulkUpdate('CatalogItems', - { - config_example: '{"citycode":"5391997","apikey":"6141811a6136148a00133488eadff0fb","frequency":1000}' - }, - { - name: 'Open Weather Map Data' - } - ).then(() => { - return queryInterface.bulkUpdate('CatalogItems', - { - config_example: '{"buffersize":3,"contentdataencoding":"utf8","contextdataencoding":"utf8",' + - 'outputfields":{"publisher":"source","contentdata":"temperature","timestamp":"time"}}' - }, - { - name: 'JSON REST API' - } - ) - }).then(() => { - return queryInterface.bulkUpdate('CatalogItems', - { - config_example: '{}' - }, - { - name: 'JSON Sub-Select' - } - ) - }).then(() => { - return queryInterface.bulkUpdate('CatalogItems', - { - is_public: true - }, - { - name: 'Common Logging' - } - ) - }) - }, - - down: (queryInterface, Sequelize) => { - return queryInterface.bulkUpdate('CatalogItems', - { - config_example: '{}' - }, - { - name: 'Open Weather Map Data' - } - ).then(() => { - return queryInterface.bulkUpdate('CatalogItems', - { - config_example: '{}' - }, - { - name: 'JSON REST API' - } - ) - }).then(() => { - return queryInterface.bulkUpdate('CatalogItems', - { - config_example: '{}' - }, - { - name: 'JSON Sub-Select' - } - ) - }).then(() => { - return queryInterface.bulkUpdate('CatalogItems', - { - is_public: false - }, - { - name: 'Common Logging' - } - ) - }) - } -} diff --git a/src/data/seeders/20200122200231-insert-router-catalog-item.js b/src/data/seeders/20200122200231-insert-router-catalog-item.js deleted file mode 100644 index df6353ece..000000000 --- a/src/data/seeders/20200122200231-insert-router-catalog-item.js +++ /dev/null @@ -1,87 +0,0 @@ -const constants = require('../constants') -const CatalogItemManager = require('../managers/catalog-item-manager') - -module.exports = { - up: async (queryInterface, Sequelize) => { - await queryInterface.bulkInsert('CatalogItems', [ - { - name: constants.ROUTER_CATALOG_NAME, - description: 'The built-in router for Eclipse ioFog.', - category: 'SYSTEM', - publisher: 'Eclipse ioFog', - disk_required: 0, - ram_required: 0, - picture: 'none.png', - config_example: null, - is_public: false, - registry_id: 1, - user_id: null - }, - { - name: constants.PROXY_CATALOG_NAME, - description: 'The built-in proxy for Eclipse ioFog.', - category: 'SYSTEM', - publisher: 'Eclipse ioFog', - disk_required: 0, - ram_required: 0, - picture: 'none.png', - config_example: null, - is_public: false, - registry_id: 1, - user_id: null - }] - ) - - // const sequelize = queryInterface.sequelize - // const transaction = await sequelize.transaction() - const transaction = { fakeTransaction: true } - - const router = await CatalogItemManager.findOne({ name: constants.ROUTER_CATALOG_NAME, isPublic: false }, transaction) - const proxy = await CatalogItemManager.findOne({ name: constants.PROXY_CATALOG_NAME, isPublic: false }, transaction) - - if (!router || !proxy) { - throw new Error('Unable to update the database. Could not find proxy or router catalog item') - } - - await queryInterface.bulkInsert('CatalogItemImages', [ - { - catalog_item_id: router.id, - fog_type_id: 1, - container_image: 'quay.io/interconnectedcloud/qdrouterd:latest' - }, - { - catalog_item_id: router.id, - fog_type_id: 2, - container_image: 'iofog/qdrouterd-arm:latest' - }, - { - catalog_item_id: proxy.id, - fog_type_id: 1, - container_image: 'iofog/proxy:latest' - }, - { - catalog_item_id: proxy.id, - fog_type_id: 2, - container_image: 'iofog/proxy-arm:latest' - }]) - }, - - down: async (queryInterface, Sequelize) => { - // const sequelize = queryInterface.sequelize - - // const transaction = await sequelize.transaction() - const transaction = { fakeTransaction: true } - - const router = await CatalogItemManager.findOne({ name: constants.ROUTER_CATALOG_NAME, isPublic: false }, transaction) - const proxy = await CatalogItemManager.findOne({ name: constants.PROXY_CATALOG_NAME, isPublic: false }, transaction) - if (router) { - await queryInterface.bulkDelete('CatalogItems', { id: router.id }, {}) - await queryInterface.bulkDelete('CatalogItemImages', { catalog_item_id: router.id }) - } - - if (proxy) { - await queryInterface.bulkDelete('CatalogItems', { id: proxy.id }, {}) - await queryInterface.bulkDelete('CatalogItemImages', { catalog_item_id: proxy.id }) - } - } -} diff --git a/src/data/seeders/20200313163114-update-router-catalog-item.js b/src/data/seeders/20200313163114-update-router-catalog-item.js deleted file mode 100644 index e1d9d0e72..000000000 --- a/src/data/seeders/20200313163114-update-router-catalog-item.js +++ /dev/null @@ -1,58 +0,0 @@ -const constants = require('../constants') -const CatalogItemManager = require('../managers/catalog-item-manager') - -module.exports = { - up: async (queryInterface, Sequelize) => { - const transaction = { fakeTransaction: true } - - const router = await CatalogItemManager.findOne({ name: constants.ROUTER_CATALOG_NAME, isPublic: false }, transaction) - - if (!router) { - throw new Error('Unable to update the database. Could not find router catalog item') - } - - await queryInterface.bulkUpdate('CatalogItemImages', - { - container_image: 'iofog/router:latest' - }, - { - catalog_item_id: router.id, - fog_type_id: 1 - }) - await queryInterface.bulkUpdate('CatalogItemImages', - { - container_image: 'iofog/router-arm:latest' - }, - { - catalog_item_id: router.id, - fog_type_id: 2 - }) - }, - - down: async (queryInterface, Sequelize) => { - const transaction = { fakeTransaction: true } - - const router = await CatalogItemManager.findOne({ name: constants.ROUTER_CATALOG_NAME, isPublic: false }, transaction) - - if (!router) { - throw new Error('Unable to update the database. Could not find router catalog item') - } - - await queryInterface.bulkUpdate('CatalogItemImages', - { - container_image: 'quay.io/interconnectedcloud/qdrouterd:latest' - }, - { - catalog_item_id: router.id, - fog_type_id: 1 - }) - await queryInterface.bulkUpdate('CatalogItemImages', - { - container_image: 'iofog/qdrouterd-arm:latest' - }, - { - catalog_item_id: router.id, - fog_type_id: 2 - }) - } -} diff --git a/src/data/seeders/20221019163114-insert-port-router-catalog-item.js b/src/data/seeders/20221019163114-insert-port-router-catalog-item.js deleted file mode 100644 index bfa750cc1..000000000 --- a/src/data/seeders/20221019163114-insert-port-router-catalog-item.js +++ /dev/null @@ -1,57 +0,0 @@ -const constants = require('../constants') -const CatalogItemManager = require('../managers/catalog-item-manager') - -module.exports = { - up: async (queryInterface, Sequelize) => { - await queryInterface.bulkInsert('CatalogItems', [ - { - name: constants.PORT_ROUTER_CATALOG_NAME, - description: 'The built-in port-router for Eclipse ioFog.', - category: 'SYSTEM', - publisher: 'Eclipse ioFog', - disk_required: 0, - ram_required: 0, - picture: 'none.png', - config_example: null, - is_public: false, - registry_id: 1, - user_id: null - }] - ) - - // const sequelize = queryInterface.sequelize - // const transaction = await sequelize.transaction() - const transaction = { fakeTransaction: true } - - const portRouter = await CatalogItemManager.findOne({ name: constants.PORT_ROUTER_CATALOG_NAME, isPublic: false }, transaction) - - if (!portRouter) { - throw new Error('Unable to update the database. Could not find port-router catalog item') - } - - await queryInterface.bulkInsert('CatalogItemImages', [ - { - catalog_item_id: portRouter.id, - fog_type_id: 1, - container_image: 'iofog/port-router:latest' - }, - { - catalog_item_id: portRouter.id, - fog_type_id: 2, - container_image: 'iofog/port-router:latest' - }]) - }, - - down: async (queryInterface, Sequelize) => { - // const sequelize = queryInterface.sequelize - - // const transaction = await sequelize.transaction() - const transaction = { fakeTransaction: true } - - const portRouter = await CatalogItemManager.findOne({ name: constants.PORT_ROUTER_CATALOG_NAME, isPublic: false }, transaction) - if (portRouter) { - await queryInterface.bulkDelete('CatalogItems', { id: portRouter.id }, {}) - await queryInterface.bulkDelete('CatalogItemImages', { catalog_item_id: portRouter.id }) - } - } -} diff --git a/src/config/keycloak.json b/src/keycloak.json similarity index 100% rename from src/config/keycloak.json rename to src/keycloak.json diff --git a/src/routes/application.js b/src/routes/application.js index 18cfe4608..7d6a800ad 100644 --- a/src/routes/application.js +++ b/src/routes/application.js @@ -15,6 +15,7 @@ const ApplicationController = require('../controllers/application-controller') const ResponseDecorator = require('../decorators/response-decorator') const Errors = require('../helpers/errors') const logger = require('../logger') +const keycloak = require('../config/keycloak.js').initKeycloak() module.exports = [ { @@ -32,13 +33,17 @@ module.exports = [ ] const getApplicationsByUserEndPoint = ResponseDecorator.handleErrors(ApplicationController.getApplicationsByUserEndPoint, successCode, errorCodes) - const responseObject = await getApplicationsByUserEndPoint(req) - res - .status(responseObject.code) - .send(responseObject.body) + // Add keycloak.protect() middleware to protect the route + await keycloak.protect(['SRE', 'Developer', 'Viewer'])(req, res, async () => { + const responseObject = await getApplicationsByUserEndPoint(req) - logger.apiRes({ req: req, res: responseObject }) + res + .status(responseObject.code) + .send(responseObject.body) + + logger.apiRes({ req: req, res: responseObject }) + }) } }, { @@ -61,13 +66,17 @@ module.exports = [ ] const createApplicationEndPoint = ResponseDecorator.handleErrors(ApplicationController.createApplicationEndPoint, successCode, errorCodes) - const responseObject = await createApplicationEndPoint(req) - res - .status(responseObject.code) - .send(responseObject.body) + // Add keycloak.protect() middleware to protect the route + await keycloak.protect(['SRE', 'Developer'])(req, res, async () => { + const responseObject = await createApplicationEndPoint(req) + + res + .status(responseObject.code) + .send(responseObject.body) - logger.apiRes({ req: req, res: responseObject }) + logger.apiRes({ req: req, res: responseObject }) + }) } }, { @@ -90,13 +99,17 @@ module.exports = [ ] const createApplicationEndPoint = ResponseDecorator.handleErrors(ApplicationController.createApplicationYAMLEndPoint, successCode, errorCodes) - const responseObject = await createApplicationEndPoint(req) - res - .status(responseObject.code) - .send(responseObject.body) + // Add keycloak.protect() middleware to protect the route + await keycloak.protect(['SRE', 'Developer'])(req, res, async () => { + const responseObject = await createApplicationEndPoint(req) - logger.apiRes({ req: req, res: responseObject }) + res + .status(responseObject.code) + .send(responseObject.body) + + logger.apiRes({ req: req, res: responseObject }) + }) } }, { @@ -118,14 +131,18 @@ module.exports = [ ] const getApplicationEndPoint = ResponseDecorator.handleErrors(ApplicationController.getApplicationEndPoint, successCode, errorCodes) - const responseObject = await getApplicationEndPoint(req) - res - .status(responseObject.code) - .send(responseObject.body) + // Add keycloak.protect() middleware to protect the route + await keycloak.protect(['SRE', 'Developer', 'Viewer'])(req, res, async () => { + const responseObject = await getApplicationEndPoint(req) + + res + .status(responseObject.code) + .send(responseObject.body) - logger.apiRes({ req: req, res: responseObject }) - return null + logger.apiRes({ req: req, res: responseObject }) + return null + }) } }, { @@ -152,13 +169,17 @@ module.exports = [ ] const updateApplicationEndPoint = ResponseDecorator.handleErrors(ApplicationController.patchApplicationEndPoint, successCode, errorCodes) - const responseObject = await updateApplicationEndPoint(req) - res - .status(responseObject.code) - .send(responseObject.body) + // Add keycloak.protect() middleware to protect the route + await keycloak.protect(['SRE', 'Developer'])(req, res, async () => { + const responseObject = await updateApplicationEndPoint(req) - logger.apiRes({ req: req, res: responseObject }) + res + .status(responseObject.code) + .send(responseObject.body) + + logger.apiRes({ req: req, res: responseObject }) + }) } }, { @@ -185,13 +206,17 @@ module.exports = [ ] const updateApplicationEndPoint = ResponseDecorator.handleErrors(ApplicationController.updateApplicationYAMLEndPoint, successCode, errorCodes) - const responseObject = await updateApplicationEndPoint(req) - res - .status(responseObject.code) - .send(responseObject.body) + // Add keycloak.protect() middleware to protect the route + await keycloak.protect(['SRE', 'Developer'])(req, res, async () => { + const responseObject = await updateApplicationEndPoint(req) + + res + .status(responseObject.code) + .send(responseObject.body) - logger.apiRes({ req: req, res: responseObject }) + logger.apiRes({ req: req, res: responseObject }) + }) } }, { @@ -218,13 +243,17 @@ module.exports = [ ] const updateApplicationEndPoint = ResponseDecorator.handleErrors(ApplicationController.updateApplicationEndPoint, successCode, errorCodes) - const responseObject = await updateApplicationEndPoint(req) - res - .status(responseObject.code) - .send(responseObject.body) + // Add keycloak.protect() middleware to protect the route + await keycloak.protect(['SRE', 'Developer'])(req, res, async () => { + const responseObject = await updateApplicationEndPoint(req) - logger.apiRes({ req: req, res: responseObject }) + res + .status(responseObject.code) + .send(responseObject.body) + + logger.apiRes({ req: req, res: responseObject }) + }) } }, { @@ -246,13 +275,17 @@ module.exports = [ ] const deleteApplicationEndPoint = ResponseDecorator.handleErrors(ApplicationController.deleteApplicationEndPoint, successCode, errorCodes) - const responseObject = await deleteApplicationEndPoint(req) - res - .status(responseObject.code) - .send(responseObject.body) + // Add keycloak.protect() middleware to protect the route + await keycloak.protect(['SRE', 'Developer'])(req, res, async () => { + const responseObject = await deleteApplicationEndPoint(req) + + res + .status(responseObject.code) + .send(responseObject.body) - logger.apiRes({ req: req, res: responseObject }) + logger.apiRes({ req: req, res: responseObject }) + }) } } ] diff --git a/src/routes/applicationTemplate.js b/src/routes/applicationTemplate.js index c25958b58..830b9074a 100644 --- a/src/routes/applicationTemplate.js +++ b/src/routes/applicationTemplate.js @@ -15,6 +15,7 @@ const ApplicationTemplateController = require('../controllers/application-templa const ResponseDecorator = require('../decorators/response-decorator') const Errors = require('../helpers/errors') const logger = require('../logger') +const keycloak = require('../config/keycloak.js').initKeycloak() module.exports = [ { @@ -32,13 +33,17 @@ module.exports = [ ] const getApplicationTemplatesByUserEndPoint = ResponseDecorator.handleErrors(ApplicationTemplateController.getApplicationTemplatesByUserEndPoint, successCode, errorCodes) - const responseObject = await getApplicationTemplatesByUserEndPoint(req) - res - .status(responseObject.code) - .send(responseObject.body) + // Add keycloak.protect() middleware to protect the route + await keycloak.protect(['SRE', 'Developer', 'Viewer'])(req, res, async () => { + const responseObject = await getApplicationTemplatesByUserEndPoint(req) - logger.apiRes({ req: req, res: responseObject }) + res + .status(responseObject.code) + .send(responseObject.body) + + logger.apiRes({ req: req, res: responseObject }) + }) } }, { @@ -60,13 +65,17 @@ module.exports = [ ] const createApplicationTemplateEndPoint = ResponseDecorator.handleErrors(ApplicationTemplateController.createApplicationTemplateEndPoint, successCode, errorCodes) - const responseObject = await createApplicationTemplateEndPoint(req) - res - .status(responseObject.code) - .send(responseObject.body) + // Add keycloak.protect() middleware to protect the route + await keycloak.protect(['SRE', 'Developer'])(req, res, async () => { + const responseObject = await createApplicationTemplateEndPoint(req) + + res + .status(responseObject.code) + .send(responseObject.body) - logger.apiRes({ req: req, res: responseObject }) + logger.apiRes({ req: req, res: responseObject }) + }) } }, { @@ -89,13 +98,17 @@ module.exports = [ ] const createApplicationTemplateEndPoint = ResponseDecorator.handleErrors(ApplicationTemplateController.createApplicationTemplateYAMLEndPoint, successCode, errorCodes) - const responseObject = await createApplicationTemplateEndPoint(req) - res - .status(responseObject.code) - .send(responseObject.body) + // Add keycloak.protect() middleware to protect the route + await keycloak.protect(['SRE', 'Developer'])(req, res, async () => { + const responseObject = await createApplicationTemplateEndPoint(req) - logger.apiRes({ req: req, res: responseObject }) + res + .status(responseObject.code) + .send(responseObject.body) + + logger.apiRes({ req: req, res: responseObject }) + }) } }, { @@ -117,13 +130,17 @@ module.exports = [ ] const getApplicationTemplateEndPoint = ResponseDecorator.handleErrors(ApplicationTemplateController.getApplicationTemplateEndPoint, successCode, errorCodes) - const responseObject = await getApplicationTemplateEndPoint(req) - res - .status(responseObject.code) - .send(responseObject.body) + // Add keycloak.protect() middleware to protect the route + await keycloak.protect(['SRE', 'Developer', 'Viewer'])(req, res, async () => { + const responseObject = await getApplicationTemplateEndPoint(req) + + res + .status(responseObject.code) + .send(responseObject.body) - logger.apiRes({ req: req, res: responseObject }) + logger.apiRes({ req: req, res: responseObject }) + }) } }, { @@ -149,13 +166,17 @@ module.exports = [ ] const patchApplicationTemplateEndPoint = ResponseDecorator.handleErrors(ApplicationTemplateController.patchApplicationTemplateEndPoint, successCode, errorCodes) - const responseObject = await patchApplicationTemplateEndPoint(req) - res - .status(responseObject.code) - .send(responseObject.body) + // Add keycloak.protect() middleware to protect the route + await keycloak.protect(['SRE', 'Developer'])(req, res, async () => { + const responseObject = await patchApplicationTemplateEndPoint(req) - logger.apiRes({ req: req, res: responseObject }) + res + .status(responseObject.code) + .send(responseObject.body) + + logger.apiRes({ req: req, res: responseObject }) + }) } }, { @@ -182,13 +203,17 @@ module.exports = [ ] const updateApplicationTemplateEndPoint = ResponseDecorator.handleErrors(ApplicationTemplateController.updateApplicationTemplateYAMLEndPoint, successCode, errorCodes) - const responseObject = await updateApplicationTemplateEndPoint(req) - res - .status(responseObject.code) - .send(responseObject.body) + // Add keycloak.protect() middleware to protect the route + await keycloak.protect(['SRE', 'Developer'])(req, res, async () => { + const responseObject = await updateApplicationTemplateEndPoint(req) + + res + .status(responseObject.code) + .send(responseObject.body) - logger.apiRes({ req: req, res: responseObject }) + logger.apiRes({ req: req, res: responseObject }) + }) } }, { @@ -214,13 +239,17 @@ module.exports = [ ] const updateApplicationTemplateEndPoint = ResponseDecorator.handleErrors(ApplicationTemplateController.updateApplicationTemplateEndPoint, successCode, errorCodes) - const responseObject = await updateApplicationTemplateEndPoint(req) - res - .status(responseObject.code) - .send(responseObject.body) + // Add keycloak.protect() middleware to protect the route + await keycloak.protect(['SRE', 'Developer'])(req, res, async () => { + const responseObject = await updateApplicationTemplateEndPoint(req) - logger.apiRes({ req: req, res: responseObject }) + res + .status(responseObject.code) + .send(responseObject.body) + + logger.apiRes({ req: req, res: responseObject }) + }) } }, { @@ -242,13 +271,17 @@ module.exports = [ ] const deleteApplicationTemplateEndPoint = ResponseDecorator.handleErrors(ApplicationTemplateController.deleteApplicationTemplateEndPoint, successCode, errorCodes) - const responseObject = await deleteApplicationTemplateEndPoint(req) - res - .status(responseObject.code) - .send(responseObject.body) + // Add keycloak.protect() middleware to protect the route + await keycloak.protect(['SRE', 'Developer'])(req, res, async () => { + const responseObject = await deleteApplicationTemplateEndPoint(req) + + res + .status(responseObject.code) + .send(responseObject.body) - logger.apiRes({ req: req, res: responseObject }) + logger.apiRes({ req: req, res: responseObject }) + }) } } ] diff --git a/src/routes/capabilities.js b/src/routes/capabilities.js index a4f684f6d..54eaa2b1c 100644 --- a/src/routes/capabilities.js +++ b/src/routes/capabilities.js @@ -11,6 +11,7 @@ * */ const logger = require('../logger') +const keycloak = require('../config/keycloak.js').initKeycloak() module.exports = [ { @@ -18,7 +19,11 @@ module.exports = [ path: '/api/v1/capabilities/edgeResources', middleware: async (req, res) => { logger.apiReq(req) - res.sendStatus(204) + + // Add keycloak.protect() middleware to protect the route + await keycloak.protect(['SRE', 'Developer', 'Viewer'])(req, res, async () => { + res.sendStatus(204) + }) } }, { @@ -26,7 +31,11 @@ module.exports = [ path: '/api/v1/capabilities/applicationTemplates', middleware: async (req, res) => { logger.apiReq(req) - res.sendStatus(204) + + // Add keycloak.protect() middleware to protect the route + await keycloak.protect(['SRE', 'Developer', 'Viewer'])(req, res, async () => { + res.sendStatus(204) + }) } } ] diff --git a/src/routes/catalog.js b/src/routes/catalog.js index 583b5a82f..ce39b0329 100644 --- a/src/routes/catalog.js +++ b/src/routes/catalog.js @@ -39,7 +39,7 @@ module.exports = [ ) // Add keycloak.protect() middleware to protect the route - await keycloak.protect('SRE')(req, res, async () => { + await keycloak.protect(['SRE', 'Developer', 'Viewer'])(req, res, async () => { const responseObject = await listCatalogItemsEndPoint(req) res @@ -78,13 +78,17 @@ module.exports = [ successCode, errorCodes ) - const responseObject = await createCatalogItemEndpoint(req) - res - .status(responseObject.code) - .send(responseObject.body) + // Add keycloak.protect() middleware to protect the route + await keycloak.protect(['SRE', 'Developer'])(req, res, async () => { + const responseObject = await createCatalogItemEndpoint(req) + + res + .status(responseObject.code) + .send(responseObject.body) - logger.apiRes({ req, res: responseObject }) + logger.apiRes({ req, res: responseObject }) + }) } }, { @@ -110,13 +114,17 @@ module.exports = [ successCode, errorCodes ) - const responseObject = await listCatalogItemEndPoint(req) - res - .status(responseObject.code) - .send(responseObject.body) + // Add keycloak.protect() middleware to protect the route + await keycloak.protect(['SRE', 'Developer', 'Viewer'])(req, res, async () => { + const responseObject = await listCatalogItemEndPoint(req) + + res + .status(responseObject.code) + .send(responseObject.body) - logger.apiRes({ req, res: responseObject }) + logger.apiRes({ req, res: responseObject }) + }) } }, { @@ -151,13 +159,17 @@ module.exports = [ successCode, errorCodes ) - const responseObject = await updateCatalogItemEndpoint(req) - res - .status(responseObject.code) - .send(responseObject.body) + // Add keycloak.protect() middleware to protect the route for SRE and Developer + await keycloak.protect(['SRE', 'Developer'])(req, res, async () => { + const responseObject = await updateCatalogItemEndpoint(req) - logger.apiRes({ req, res: responseObject }) + res + .status(responseObject.code) + .send(responseObject.body) + + logger.apiRes({ req, res: responseObject }) + }) } }, { @@ -183,13 +195,18 @@ module.exports = [ successCode, errorCodes ) - const responseObject = await deleteCatalogItemEndPoint(req) - res - .status(responseObject.code) - .send(responseObject.body) + // Add keycloak.protect() middleware to protect the route + await keycloak.protect(['SRE', 'Developer'])(req, res, async () => { + const responseObject = await deleteCatalogItemEndPoint(req) + + res + .status(responseObject.code) + .send(responseObject.body) - logger.apiRes({ req, res: responseObject }) + logger.apiRes({ req, res: responseObject }) + }) } } + ] diff --git a/src/routes/config.js b/src/routes/config.js index 1cf961afe..b0a249d60 100644 --- a/src/routes/config.js +++ b/src/routes/config.js @@ -15,6 +15,7 @@ const ConfigController = require('../controllers/config-controller') const ResponseDecorator = require('../decorators/response-decorator') const logger = require('../logger') const Errors = require('../helpers/errors') +const keycloak = require('../config/keycloak.js').initKeycloak() module.exports = [ { @@ -30,14 +31,18 @@ module.exports = [ errors: [Errors.AuthenticationError] } ] - const getConfigEndpoint = ResponseDecorator.handleErrors(ConfigController.listConfigEndpoint, successCode, errorCodes) - const responseObject = await getConfigEndpoint(req) - res - .status(responseObject.code) - .send(responseObject.body) + // Add keycloak.protect() middleware to protect the route + await keycloak.protect(['SRE', 'Developer', 'Viewer'])(req, res, async () => { + const getConfigEndpoint = ResponseDecorator.handleErrors(ConfigController.listConfigEndpoint, successCode, errorCodes) + const responseObject = await getConfigEndpoint(req) - logger.apiRes({ req: req, res: responseObject }) + res + .status(responseObject.code) + .send(responseObject.body) + + logger.apiRes({ req: req, res: responseObject }) + }) } }, { @@ -58,14 +63,17 @@ module.exports = [ } ] - const getConfigEndpoint = ResponseDecorator.handleErrors(ConfigController.getConfigEndpoint, successCode, errorCodes) - const responseObject = await getConfigEndpoint(req) + // Add keycloak.protect() middleware to protect the route + await keycloak.protect(['SRE', 'Developer', 'Viewer'])(req, res, async () => { + const getConfigEndpoint = ResponseDecorator.handleErrors(ConfigController.getConfigEndpoint, successCode, errorCodes) + const responseObject = await getConfigEndpoint(req) - res - .status(responseObject.code) - .send(responseObject.body) + res + .status(responseObject.code) + .send(responseObject.body) - logger.apiRes({ req: req, res: responseObject }) + logger.apiRes({ req: req, res: responseObject }) + }) } }, { @@ -86,14 +94,18 @@ module.exports = [ errors: [Errors.ValidationError] } ] - const upsertConfigElementEndpoint = ResponseDecorator.handleErrors(ConfigController.upsertConfigElementEndpoint, successCode, errorCodes) - const responseObject = await upsertConfigElementEndpoint(req) - res - .status(responseObject.code) - .send(responseObject.body) + // Add keycloak.protect() middleware to protect the route + await keycloak.protect(['SRE', 'Developer'])(req, res, async () => { + const upsertConfigElementEndpoint = ResponseDecorator.handleErrors(ConfigController.upsertConfigElementEndpoint, successCode, errorCodes) + const responseObject = await upsertConfigElementEndpoint(req) + + res + .status(responseObject.code) + .send(responseObject.body) - logger.apiRes({ req: req, res: responseObject }) + logger.apiRes({ req: req, res: responseObject }) + }) } } ] diff --git a/src/routes/diagnostics.js b/src/routes/diagnostics.js index 5df090b4c..8dab3ffaf 100644 --- a/src/routes/diagnostics.js +++ b/src/routes/diagnostics.js @@ -16,6 +16,7 @@ const ResponseDecorator = require('../decorators/response-decorator') const Errors = require('../helpers/errors') const fs = require('fs') const logger = require('../logger') +const keycloak = require('../config/keycloak.js').initKeycloak() module.exports = [ { @@ -36,18 +37,21 @@ module.exports = [ } ] - const createMicroserviceImageSnapshotEndPoint = ResponseDecorator.handleErrors( - DiagnosticController.createMicroserviceImageSnapshotEndPoint, - successCode, - errorCodes - ) - const responseObject = await createMicroserviceImageSnapshotEndPoint(req) + // Add keycloak.protect() middleware to protect the route + await keycloak.protect(['SRE', 'Developer'])(req, res, async () => { + const createMicroserviceImageSnapshotEndPoint = ResponseDecorator.handleErrors( + DiagnosticController.createMicroserviceImageSnapshotEndPoint, + successCode, + errorCodes + ) + const responseObject = await createMicroserviceImageSnapshotEndPoint(req) - res - .status(responseObject.code) - .send(responseObject.body) + res + .status(responseObject.code) + .send(responseObject.body) - logger.apiRes({ req: req, res: responseObject }) + logger.apiRes({ req: req, res: responseObject }) + }) } }, { @@ -68,26 +72,29 @@ module.exports = [ } ] - const getMicroserviceImageSnapshotEndPoint = ResponseDecorator.handleErrors( - DiagnosticController.getMicroserviceImageSnapshotEndPoint, - successCode, - errorCodes - ) - const responseObject = await getMicroserviceImageSnapshotEndPoint(req) - if (responseObject.code !== successCode) { - res - .status(responseObject.code) - .send(responseObject.body) - - logger.apiRes({ req: req, res: responseObject }) - } else { - res.writeHead(successCode, { - 'Content-Length': responseObject.body['Content-Length'], - 'Content-Type': responseObject.body['Content-Type'], - 'Content-Disposition': 'attachment; filename=' + responseObject.body.fileName - }) - fs.createReadStream(responseObject.body.filePath).pipe(res) - } + // Add keycloak.protect() middleware to protect the route + await keycloak.protect(['SRE', 'Developer'])(req, res, async () => { + const getMicroserviceImageSnapshotEndPoint = ResponseDecorator.handleErrors( + DiagnosticController.getMicroserviceImageSnapshotEndPoint, + successCode, + errorCodes + ) + const responseObject = await getMicroserviceImageSnapshotEndPoint(req) + if (responseObject.code !== successCode) { + res + .status(responseObject.code) + .send(responseObject.body) + + logger.apiRes({ req: req, res: responseObject }) + } else { + res.writeHead(successCode, { + 'Content-Length': responseObject.body['Content-Length'], + 'Content-Type': responseObject.body['Content-Type'], + 'Content-Disposition': 'attachment; filename=' + responseObject.body.fileName + }) + fs.createReadStream(responseObject.body.filePath).pipe(res) + } + }) } }, { @@ -112,18 +119,21 @@ module.exports = [ } ] - const changeMicroserviceStraceStateEndPoint = ResponseDecorator.handleErrors( - DiagnosticController.changeMicroserviceStraceStateEndPoint, - successCode, - errorCodes - ) - const responseObject = await changeMicroserviceStraceStateEndPoint(req) + // Add keycloak.protect() middleware to protect the route + await keycloak.protect(['SRE', 'Developer'])(req, res, async () => { + const changeMicroserviceStraceStateEndPoint = ResponseDecorator.handleErrors( + DiagnosticController.changeMicroserviceStraceStateEndPoint, + successCode, + errorCodes + ) + const responseObject = await changeMicroserviceStraceStateEndPoint(req) - res - .status(responseObject.code) - .send(responseObject.body) + res + .status(responseObject.code) + .send(responseObject.body) - logger.apiRes({ req: req, res: responseObject }) + logger.apiRes({ req: req, res: responseObject }) + }) } }, { @@ -144,18 +154,21 @@ module.exports = [ } ] - const getMicroserviceStraceDataEndPoint = ResponseDecorator.handleErrors( - DiagnosticController.getMicroserviceStraceDataEndPoint, - successCode, - errorCodes - ) - const responseObject = await getMicroserviceStraceDataEndPoint(req) + // Add keycloak.protect() middleware to protect the route + await keycloak.protect(['SRE', 'Developer'])(req, res, async () => { + const getMicroserviceStraceDataEndPoint = ResponseDecorator.handleErrors( + DiagnosticController.getMicroserviceStraceDataEndPoint, + successCode, + errorCodes + ) + const responseObject = await getMicroserviceStraceDataEndPoint(req) - res - .status(responseObject.code) - .send(responseObject.body) + res + .status(responseObject.code) + .send(responseObject.body) - logger.apiRes({ req: req, res: responseObject }) + logger.apiRes({ req: req, res: responseObject }) + }) } }, { @@ -184,18 +197,21 @@ module.exports = [ } ] - const postMicroserviceStraceDataToFtpEndPoint = ResponseDecorator.handleErrors( - DiagnosticController.postMicroserviceStraceDataToFtpEndPoint, - successCode, - errorCodes - ) - const responseObject = await postMicroserviceStraceDataToFtpEndPoint(req) + // Add keycloak.protect() middleware to protect the route + await keycloak.protect(['SRE', 'Developer'])(req, res, async () => { + const postMicroserviceStraceDataToFtpEndPoint = ResponseDecorator.handleErrors( + DiagnosticController.postMicroserviceStraceDataToFtpEndPoint, + successCode, + errorCodes + ) + const responseObject = await postMicroserviceStraceDataToFtpEndPoint(req) - res - .status(responseObject.code) - .send(responseObject.body) + res + .status(responseObject.code) + .send(responseObject.body) - logger.apiRes({ req: req, res: responseObject }) + logger.apiRes({ req: req, res: responseObject }) + }) } } ] diff --git a/src/routes/edgeResource.js b/src/routes/edgeResource.js index 3a972adcb..ebdc65cbf 100644 --- a/src/routes/edgeResource.js +++ b/src/routes/edgeResource.js @@ -15,6 +15,7 @@ const EdgeResourceController = require('../controllers/edge-resource-controller' const ResponseDecorator = require('../decorators/response-decorator') const logger = require('../logger') const Errors = require('../helpers/errors') +const keycloak = require('../config/keycloak.js').initKeycloak() module.exports = [ { @@ -30,14 +31,18 @@ module.exports = [ errors: [Errors.AuthenticationError] } ] - const getEdgeResourcesEndpoint = ResponseDecorator.handleErrors(EdgeResourceController.listEdgeResourcesEndpoint, successCode, errorCodes) - const responseObject = await getEdgeResourcesEndpoint(req) - res - .status(responseObject.code) - .send(responseObject.body) + // Add keycloak.protect() middleware to protect the route for SRE role + await keycloak.protect(['SRE', 'Developer', 'Viewer'])(req, res, async () => { + const getEdgeResourcesEndpoint = ResponseDecorator.handleErrors(EdgeResourceController.listEdgeResourcesEndpoint, successCode, errorCodes) + const responseObject = await getEdgeResourcesEndpoint(req) - logger.apiRes({ req: req, res: responseObject }) + res + .status(responseObject.code) + .send(responseObject.body) + + logger.apiRes({ req: req, res: responseObject }) + }) } }, { @@ -58,14 +63,17 @@ module.exports = [ } ] - const getEdgeResourceEndpoint = ResponseDecorator.handleErrors(EdgeResourceController.getEdgeResourceEndpoint, successCode, errorCodes) - const responseObject = await getEdgeResourceEndpoint(req) + // Add keycloak.protect() middleware to protect the route for SRE role + await keycloak.protect(['SRE', 'Developer', 'Viewer'])(req, res, async () => { + const getEdgeResourceEndpoint = ResponseDecorator.handleErrors(EdgeResourceController.getEdgeResourceEndpoint, successCode, errorCodes) + const responseObject = await getEdgeResourceEndpoint(req) - res - .status(responseObject.code) - .send(responseObject.body) + res + .status(responseObject.code) + .send(responseObject.body) - logger.apiRes({ req: req, res: responseObject }) + logger.apiRes({ req: req, res: responseObject }) + }) } }, { @@ -86,14 +94,17 @@ module.exports = [ } ] - const getEdgeResourceAllVersionsEndpoint = ResponseDecorator.handleErrors(EdgeResourceController.getEdgeResourceAllVersionsEndpoint, successCode, errorCodes) - const responseObject = await getEdgeResourceAllVersionsEndpoint(req) + // Add keycloak.protect() middleware to protect the route for SRE role + await keycloak.protect(['SRE', 'Developer', 'Viewer'])(req, res, async () => { + const getEdgeResourceAllVersionsEndpoint = ResponseDecorator.handleErrors(EdgeResourceController.getEdgeResourceAllVersionsEndpoint, successCode, errorCodes) + const responseObject = await getEdgeResourceAllVersionsEndpoint(req) - res - .status(responseObject.code) - .send(responseObject.body) + res + .status(responseObject.code) + .send(responseObject.body) - logger.apiRes({ req: req, res: responseObject }) + logger.apiRes({ req: req, res: responseObject }) + }) } }, { @@ -118,14 +129,18 @@ module.exports = [ errors: [Errors.ValidationError] } ] - const updateEdgeResourceEndpoint = ResponseDecorator.handleErrors(EdgeResourceController.updateEdgeResourceEndpoint, successCode, errorCodes) - const responseObject = await updateEdgeResourceEndpoint(req) - res - .status(responseObject.code) - .send(responseObject.body) + // Add keycloak.protect() middleware to protect the route for SRE role + await keycloak.protect(['SRE'])(req, res, async () => { + const updateEdgeResourceEndpoint = ResponseDecorator.handleErrors(EdgeResourceController.updateEdgeResourceEndpoint, successCode, errorCodes) + const responseObject = await updateEdgeResourceEndpoint(req) + + res + .status(responseObject.code) + .send(responseObject.body) - logger.apiRes({ req: req, res: responseObject }) + logger.apiRes({ req: req, res: responseObject }) + }) } }, { @@ -149,14 +164,18 @@ module.exports = [ errors: [Errors.ValidationError] } ] - const deleteEdgeResourceEndpoint = ResponseDecorator.handleErrors(EdgeResourceController.deleteEdgeResourceEndpoint, successCode, errorCodes) - const responseObject = await deleteEdgeResourceEndpoint(req) - res - .status(responseObject.code) - .send(responseObject.body) + // Add keycloak.protect() middleware to protect the route for SRE role + await keycloak.protect(['SRE'])(req, res, async () => { + const deleteEdgeResourceEndpoint = ResponseDecorator.handleErrors(EdgeResourceController.deleteEdgeResourceEndpoint, successCode, errorCodes) + const responseObject = await deleteEdgeResourceEndpoint(req) + + res + .status(responseObject.code) + .send(responseObject.body) - logger.apiRes({ req: req, res: responseObject }) + logger.apiRes({ req: req, res: responseObject }) + }) } }, { @@ -177,14 +196,18 @@ module.exports = [ errors: [Errors.ValidationError] } ] - const createEdgeResourceEndpoint = ResponseDecorator.handleErrors(EdgeResourceController.createEdgeResourceEndpoint, successCode, errorCodes) - const responseObject = await createEdgeResourceEndpoint(req) - res - .status(responseObject.code) - .send(responseObject.body) + // Add keycloak.protect() middleware to protect the route for SRE role + await keycloak.protect(['SRE'])(req, res, async () => { + const createEdgeResourceEndpoint = ResponseDecorator.handleErrors(EdgeResourceController.createEdgeResourceEndpoint, successCode, errorCodes) + const responseObject = await createEdgeResourceEndpoint(req) - logger.apiRes({ req: req, res: responseObject }) + res + .status(responseObject.code) + .send(responseObject.body) + + logger.apiRes({ req: req, res: responseObject }) + }) } }, { @@ -204,14 +227,18 @@ module.exports = [ errors: [Errors.ValidationError] } ] - const linkEdgeResourceEndpoint = ResponseDecorator.handleErrors(EdgeResourceController.linkEdgeResourceEndpoint, successCode, errorCodes) - const responseObject = await linkEdgeResourceEndpoint(req) - res - .status(responseObject.code) - .send(responseObject.body) + // Add keycloak.protect() middleware to protect the route for SRE role + await keycloak.protect(['SRE'])(req, res, async () => { + const linkEdgeResourceEndpoint = ResponseDecorator.handleErrors(EdgeResourceController.linkEdgeResourceEndpoint, successCode, errorCodes) + const responseObject = await linkEdgeResourceEndpoint(req) + + res + .status(responseObject.code) + .send(responseObject.body) - logger.apiRes({ req: req, res: responseObject }) + logger.apiRes({ req: req, res: responseObject }) + }) } }, { @@ -231,14 +258,18 @@ module.exports = [ errors: [Errors.ValidationError] } ] - const unlinkEdgeResourceEndpoint = ResponseDecorator.handleErrors(EdgeResourceController.unlinkEdgeResourceEndpoint, successCode, errorCodes) - const responseObject = await unlinkEdgeResourceEndpoint(req) - res - .status(responseObject.code) - .send(responseObject.body) + // Add keycloak.protect() middleware to protect the route for SRE role + await keycloak.protect(['SRE'])(req, res, async () => { + const unlinkEdgeResourceEndpoint = ResponseDecorator.handleErrors(EdgeResourceController.unlinkEdgeResourceEndpoint, successCode, errorCodes) + const responseObject = await unlinkEdgeResourceEndpoint(req) + + res + .status(responseObject.code) + .send(responseObject.body) - logger.apiRes({ req: req, res: responseObject }) + logger.apiRes({ req: req, res: responseObject }) + }) } } ] diff --git a/src/routes/flow.js b/src/routes/flow.js index 16b8616cf..928cec737 100644 --- a/src/routes/flow.js +++ b/src/routes/flow.js @@ -15,6 +15,7 @@ const FlowController = require('../controllers/application-controller') const ResponseDecorator = require('../decorators/response-decorator') const Errors = require('../helpers/errors') const logger = require('../logger') +const keycloak = require('../config/keycloak.js').initKeycloak() module.exports = [ { @@ -31,14 +32,17 @@ module.exports = [ } ] - const getFlowsByUserEndPoint = ResponseDecorator.handleErrors(FlowController.getApplicationsByUserEndPoint, successCode, errorCodes) - const responseObject = await getFlowsByUserEndPoint(req) + // Add keycloak.protect() middleware to protect the route for both SRE and Developer roles + await keycloak.protect(['SRE', 'Developer', 'Viewer'])(req, res, async () => { + const getFlowsByUserEndPoint = ResponseDecorator.handleErrors(FlowController.getApplicationsByUserEndPoint, successCode, errorCodes) + const responseObject = await getFlowsByUserEndPoint(req) - res - .status(responseObject.code) - .send({ flows: responseObject.body.applications }) + res + .status(responseObject.code) + .send({ flows: responseObject.body.applications }) - logger.apiRes({ req: req, res: responseObject }) + logger.apiRes({ req: req, res: responseObject }) + }) } }, { @@ -59,14 +63,17 @@ module.exports = [ } ] - const createFlowEndPoint = ResponseDecorator.handleErrors(FlowController.createApplicationEndPoint, successCode, errorCodes) - const responseObject = await createFlowEndPoint(req) + // Add keycloak.protect() middleware to protect the route for both SRE and Developer roles + await keycloak.protect(['SRE', 'Developer'])(req, res, async () => { + const createFlowEndPoint = ResponseDecorator.handleErrors(FlowController.createApplicationEndPoint, successCode, errorCodes) + const responseObject = await createFlowEndPoint(req) - res - .status(responseObject.code) - .send(responseObject.body) + res + .status(responseObject.code) + .send(responseObject.body) - logger.apiRes({ req: req, res: responseObject }) + logger.apiRes({ req: req, res: responseObject }) + }) } }, { @@ -87,14 +94,17 @@ module.exports = [ } ] - const getFlowEndPoint = ResponseDecorator.handleErrors(FlowController.getApplicationByIdEndPoint, successCode, errorCodes) - const responseObject = await getFlowEndPoint(req) + // Add keycloak.protect() middleware to protect the route for both SRE and Developer roles + await keycloak.protect(['SRE', 'Developer', 'Viewer'])(req, res, async () => { + const getFlowEndPoint = ResponseDecorator.handleErrors(FlowController.getApplicationByIdEndPoint, successCode, errorCodes) + const responseObject = await getFlowEndPoint(req) - res - .status(responseObject.code) - .send(responseObject.body) + res + .status(responseObject.code) + .send(responseObject.body) - logger.apiRes({ req: req, res: responseObject }) + logger.apiRes({ req: req, res: responseObject }) + }) } }, { @@ -119,14 +129,17 @@ module.exports = [ } ] - const updateFlowEndPoint = ResponseDecorator.handleErrors(FlowController.patchApplicationByIdEndPoint, successCode, errorCodes) - const responseObject = await updateFlowEndPoint(req) + // Add keycloak.protect() middleware to protect the route for both SRE and Developer roles + await keycloak.protect(['SRE', 'Developer'])(req, res, async () => { + const updateFlowEndPoint = ResponseDecorator.handleErrors(FlowController.patchApplicationByIdEndPoint, successCode, errorCodes) + const responseObject = await updateFlowEndPoint(req) - res - .status(responseObject.code) - .send(responseObject.body) + res + .status(responseObject.code) + .send(responseObject.body) - logger.apiRes({ req: req, res: responseObject }) + logger.apiRes({ req: req, res: responseObject }) + }) } }, { @@ -147,14 +160,17 @@ module.exports = [ } ] - const deleteFlowEndPoint = ResponseDecorator.handleErrors(FlowController.deleteApplicationByIdEndPoint, successCode, errorCodes) - const responseObject = await deleteFlowEndPoint(req) + // Add keycloak.protect() middleware to protect the route for both SRE and Developer roles + await keycloak.protect(['SRE', 'Developer'])(req, res, async () => { + const deleteFlowEndPoint = ResponseDecorator.handleErrors(FlowController.deleteApplicationByIdEndPoint, successCode, errorCodes) + const responseObject = await deleteFlowEndPoint(req) - res - .status(responseObject.code) - .send(responseObject.body) + res + .status(responseObject.code) + .send(responseObject.body) - logger.apiRes({ req: req, res: responseObject }) + logger.apiRes({ req: req, res: responseObject }) + }) } } ] diff --git a/src/routes/iofog.js b/src/routes/iofog.js index a38e14124..3271101d3 100644 --- a/src/routes/iofog.js +++ b/src/routes/iofog.js @@ -15,6 +15,7 @@ const FogController = require('../controllers/iofog-controller') const ResponseDecorator = require('../decorators/response-decorator') const Errors = require('../helpers/errors') const logger = require('../logger') +const keycloak = require('../config/keycloak.js').initKeycloak() module.exports = [ { @@ -35,14 +36,17 @@ module.exports = [ } ] - const getFogList = ResponseDecorator.handleErrors(FogController.getFogListEndPoint, successCode, errCodes) - const responseObject = await getFogList(req) + // Add keycloak.protect() middleware to protect the route for SRE, Developer, and Viewer roles + await keycloak.protect(['SRE', 'Developer', 'Viewer'])(req, res, async () => { + const getFogList = ResponseDecorator.handleErrors(FogController.getFogListEndPoint, successCode, errCodes) + const responseObject = await getFogList(req) - res - .status(responseObject.code) - .send(responseObject.body) + res + .status(responseObject.code) + .send(responseObject.body) - logger.apiRes({ req: req, res: responseObject }) + logger.apiRes({ req: req, res: responseObject }) + }) } }, { @@ -64,14 +68,17 @@ module.exports = [ } ] - const createFog = ResponseDecorator.handleErrors(FogController.createFogEndPoint, successCode, errCodes) - const responseObject = await createFog(req) + // Protect the route with SRE access control + await keycloak.protect('SRE')(req, res, async () => { + const createFog = ResponseDecorator.handleErrors(FogController.createFogEndPoint, successCode, errCodes) + const responseObject = await createFog(req) - res - .status(responseObject.code) - .send(responseObject.body) + res + .status(responseObject.code) + .send(responseObject.body) - logger.apiRes({ req: req, res: responseObject }) + logger.apiRes({ req: req, res: responseObject }) + }) } }, { @@ -97,14 +104,17 @@ module.exports = [ } ] - const updateFog = ResponseDecorator.handleErrors(FogController.updateFogEndPoint, successCode, errCodes) - const responseObject = await updateFog(req) + // Protect the route with SRE access control + await keycloak.protect('SRE')(req, res, async () => { + const updateFog = ResponseDecorator.handleErrors(FogController.updateFogEndPoint, successCode, errCodes) + const responseObject = await updateFog(req) - res - .status(responseObject.code) - .send(responseObject.body) + res + .status(responseObject.code) + .send(responseObject.body) - logger.apiRes({ req: req, res: responseObject }) + logger.apiRes({ req: req, res: responseObject }) + }) } }, { @@ -125,14 +135,17 @@ module.exports = [ } ] - const deleteFog = ResponseDecorator.handleErrors(FogController.deleteFogEndPoint, successCode, errCodes) - const responseObject = await deleteFog(req) + // Protect the route with SRE access control + await keycloak.protect('SRE')(req, res, async () => { + const deleteFog = ResponseDecorator.handleErrors(FogController.deleteFogEndPoint, successCode, errCodes) + const responseObject = await deleteFog(req) - res - .status(responseObject.code) - .send(responseObject.body) + res + .status(responseObject.code) + .send(responseObject.body) - logger.apiRes({ req: req, res: responseObject }) + logger.apiRes({ req: req, res: responseObject }) + }) } }, { @@ -153,14 +166,17 @@ module.exports = [ } ] - const getFog = ResponseDecorator.handleErrors(FogController.getFogEndPoint, successCode, errCodes) - const responseObject = await getFog(req) + // Protect the route with SRE, Developer, and Viewer access control + await keycloak.protect(['SRE', 'Developer', 'Viewer'])(req, res, async () => { + const getFog = ResponseDecorator.handleErrors(FogController.getFogEndPoint, successCode, errCodes) + const responseObject = await getFog(req) - res - .status(responseObject.code) - .send(responseObject.body) + res + .status(responseObject.code) + .send(responseObject.body) - logger.apiRes({ req: req, res: responseObject }) + logger.apiRes({ req: req, res: responseObject }) + }) } }, { @@ -181,15 +197,17 @@ module.exports = [ } ] - const generateFogProvisioningKey = ResponseDecorator.handleErrors(FogController.generateProvisioningKeyEndPoint, - successCode, errCodes) - const responseObject = await generateFogProvisioningKey(req) + await keycloak.protect(['SRE'])(req, res, async () => { + const generateFogProvisioningKey = ResponseDecorator.handleErrors(FogController.generateProvisioningKeyEndPoint, + successCode, errCodes) + const responseObject = await generateFogProvisioningKey(req) - res - .status(responseObject.code) - .send(responseObject.body) + res + .status(responseObject.code) + .send(responseObject.body) - logger.apiRes({ req: req, res: responseObject }) + logger.apiRes({ req: req, res: responseObject }) + }) } }, { @@ -214,15 +232,17 @@ module.exports = [ } ] - const setFogVersionCommand = ResponseDecorator.handleErrors(FogController.setFogVersionCommandEndPoint, - successCode, errCodes) - const responseObject = await setFogVersionCommand(req) + await keycloak.protect(['SRE'])(req, res, async () => { + const setFogVersionCommand = ResponseDecorator.handleErrors(FogController.setFogVersionCommandEndPoint, + successCode, errCodes) + const responseObject = await setFogVersionCommand(req) - res - .status(responseObject.code) - .send(responseObject.body) + res + .status(responseObject.code) + .send(responseObject.body) - logger.apiRes({ req: req, res: responseObject }) + logger.apiRes({ req: req, res: responseObject }) + }) } }, { @@ -247,15 +267,17 @@ module.exports = [ } ] - const setFogRebootCommand = ResponseDecorator.handleErrors(FogController.setFogRebootCommandEndPoint, - successCode, errCodes) - const responseObject = await setFogRebootCommand(req) + await keycloak.protect(['SRE'])(req, res, async () => { + const setFogRebootCommand = ResponseDecorator.handleErrors(FogController.setFogRebootCommandEndPoint, + successCode, errCodes) + const responseObject = await setFogRebootCommand(req) - res - .status(responseObject.code) - .send(responseObject.body) + res + .status(responseObject.code) + .send(responseObject.body) - logger.apiRes({ req: req, res: responseObject }) + logger.apiRes({ req: req, res: responseObject }) + }) } }, { @@ -276,15 +298,17 @@ module.exports = [ } ] - const getHalHardwareInfo = ResponseDecorator.handleErrors(FogController.getHalHardwareInfoEndPoint, - successCode, errCodes) - const responseObject = await getHalHardwareInfo(req) + await keycloak.protect(['SRE', 'Developer', 'Viewer'])(req, res, async () => { + const getHalHardwareInfo = ResponseDecorator.handleErrors(FogController.getHalHardwareInfoEndPoint, + successCode, errCodes) + const responseObject = await getHalHardwareInfo(req) - res - .status(responseObject.code) - .send(responseObject.body) + res + .status(responseObject.code) + .send(responseObject.body) - logger.apiRes({ req: req, res: responseObject }) + logger.apiRes({ req: req, res: responseObject }) + }) } }, { @@ -305,14 +329,16 @@ module.exports = [ } ] - const getHalUsbInfo = ResponseDecorator.handleErrors(FogController.getHalUsbInfoEndPoint, successCode, errCodes) - const responseObject = await getHalUsbInfo(req) + await keycloak.protect(['SRE', 'Developer', 'Viewer'])(req, res, async () => { + const getHalUsbInfo = ResponseDecorator.handleErrors(FogController.getHalUsbInfoEndPoint, successCode, errCodes) + const responseObject = await getHalUsbInfo(req) - res - .status(responseObject.code) - .send(responseObject.body) + res + .status(responseObject.code) + .send(responseObject.body) - logger.apiRes({ req: req, res: responseObject }) + logger.apiRes({ req: req, res: responseObject }) + }) } }, { @@ -337,15 +363,17 @@ module.exports = [ } ] - const setFogPruneCommand = ResponseDecorator.handleErrors(FogController.setFogPruneCommandEndPoint, - successCode, errCodes) - const responseObject = await setFogPruneCommand(req) + await keycloak.protect(['SRE'])(req, res, async () => { + const setFogPruneCommand = ResponseDecorator.handleErrors(FogController.setFogPruneCommandEndPoint, + successCode, errCodes) + const responseObject = await setFogPruneCommand(req) - res - .status(responseObject.code) - .send(responseObject.body) + res + .status(responseObject.code) + .send(responseObject.body) - logger.apiRes({ req: req, res: responseObject }) + logger.apiRes({ req: req, res: responseObject }) + }) } } ] diff --git a/src/routes/microservices.js b/src/routes/microservices.js index a005c5048..8a15a7438 100644 --- a/src/routes/microservices.js +++ b/src/routes/microservices.js @@ -15,6 +15,7 @@ const MicroservicesController = require('../controllers/microservices-controller const ResponseDecorator = require('../decorators/response-decorator') const Errors = require('../helpers/errors') const logger = require('../logger') +const keycloak = require('../config/keycloak.js').initKeycloak() module.exports = [ { @@ -31,18 +32,20 @@ module.exports = [ } ] - const listAllPublicPortsEndPoint = ResponseDecorator.handleErrors( - MicroservicesController.listAllPublicPortsEndPoint, - successCode, - errorCodes - ) - const responseObject = await listAllPublicPortsEndPoint(req) + await keycloak.protect(['SRE', 'Developer', 'Viewer'])(req, res, async () => { + const listAllPublicPortsEndPoint = ResponseDecorator.handleErrors( + MicroservicesController.listAllPublicPortsEndPoint, + successCode, + errorCodes + ) + const responseObject = await listAllPublicPortsEndPoint(req) - res - .status(responseObject.code) - .send(responseObject.body) + res + .status(responseObject.code) + .send(responseObject.body) - logger.apiRes({ req: req, res: responseObject }) + logger.apiRes({ req: req, res: responseObject }) + }) } }, { @@ -59,15 +62,17 @@ module.exports = [ } ] - const getMicroservicesByApplicationEndPoint = ResponseDecorator.handleErrors(MicroservicesController.getMicroservicesByApplicationEndPoint, - successCode, errorCodes) - const responseObject = await getMicroservicesByApplicationEndPoint(req) + await keycloak.protect(['SRE', 'Developer', 'Viewer'])(req, res, async () => { + const getMicroservicesByApplicationEndPoint = ResponseDecorator.handleErrors(MicroservicesController.getMicroservicesByApplicationEndPoint, + successCode, errorCodes) + const responseObject = await getMicroservicesByApplicationEndPoint(req) - res - .status(responseObject.code) - .send(responseObject.body) + res + .status(responseObject.code) + .send(responseObject.body) - logger.apiRes({ req: req, res: responseObject }) + logger.apiRes({ req: req, res: responseObject }) + }) } }, { @@ -89,15 +94,17 @@ module.exports = [ } ] - const createMicroservicesOnFogEndPoint = ResponseDecorator.handleErrors( - MicroservicesController.createMicroserviceOnFogEndPoint, successCode, errorCodes) - const responseObject = await createMicroservicesOnFogEndPoint(req) + await keycloak.protect(['SRE', 'Developer'])(req, res, async () => { + const createMicroservicesOnFogEndPoint = ResponseDecorator.handleErrors( + MicroservicesController.createMicroserviceOnFogEndPoint, successCode, errorCodes) + const responseObject = await createMicroservicesOnFogEndPoint(req) - res - .status(responseObject.code) - .send(responseObject.body) + res + .status(responseObject.code) + .send(responseObject.body) - logger.apiRes({ req: req, res: responseObject }) + logger.apiRes({ req: req, res: responseObject }) + }) } }, { @@ -120,15 +127,17 @@ module.exports = [ } ] - const createMicroservicesYAMLEndPoint = ResponseDecorator.handleErrors( - MicroservicesController.createMicroserviceYAMLEndPoint, successCode, errorCodes) - const responseObject = await createMicroservicesYAMLEndPoint(req) + await keycloak.protect(['SRE', 'Developer'])(req, res, async () => { + const createMicroservicesYAMLEndPoint = ResponseDecorator.handleErrors( + MicroservicesController.createMicroserviceYAMLEndPoint, successCode, errorCodes) + const responseObject = await createMicroservicesYAMLEndPoint(req) - res - .status(responseObject.code) - .send(responseObject.body) + res + .status(responseObject.code) + .send(responseObject.body) - logger.apiRes({ req: req, res: responseObject }) + logger.apiRes({ req: req, res: responseObject }) + }) } }, { @@ -149,18 +158,19 @@ module.exports = [ } ] - const getMicroserviceEndPoint = ResponseDecorator.handleErrors(MicroservicesController.getMicroserviceEndPoint, - successCode, errorCodes) - const responseObject = await getMicroserviceEndPoint(req) + await keycloak.protect(['SRE', 'Developer', 'Viewer'])(req, res, async () => { + const getMicroserviceEndPoint = ResponseDecorator.handleErrors(MicroservicesController.getMicroserviceEndPoint, + successCode, errorCodes) + const responseObject = await getMicroserviceEndPoint(req) - res - .status(responseObject.code) - .send(responseObject.body) + res + .status(responseObject.code) + .send(responseObject.body) - logger.apiRes({ req: req, res: responseObject }) + logger.apiRes({ req: req, res: responseObject }) + }) } }, - { method: 'patch', path: '/api/v1/microservices/:uuid', @@ -184,15 +194,17 @@ module.exports = [ } ] - const updateMicroserviceEndPoint = ResponseDecorator.handleErrors(MicroservicesController.updateMicroserviceEndPoint, - successCode, errorCodes) - const responseObject = await updateMicroserviceEndPoint(req) + await keycloak.protect(['SRE', 'Developer'])(req, res, async () => { + const updateMicroserviceEndPoint = ResponseDecorator.handleErrors(MicroservicesController.updateMicroserviceEndPoint, + successCode, errorCodes) + const responseObject = await updateMicroserviceEndPoint(req) - res - .status(responseObject.code) - .send(responseObject.body) + res + .status(responseObject.code) + .send(responseObject.body) - logger.apiRes({ req: req, res: responseObject }) + logger.apiRes({ req: req, res: responseObject }) + }) } }, @@ -220,15 +232,17 @@ module.exports = [ } ] - const updateMicroserviceYAMLEndPoint = ResponseDecorator.handleErrors(MicroservicesController.updateMicroserviceYAMLEndPoint, - successCode, errorCodes) - const responseObject = await updateMicroserviceYAMLEndPoint(req) + await keycloak.protect(['SRE', 'Developer'])(req, res, async () => { + const updateMicroserviceYAMLEndPoint = ResponseDecorator.handleErrors(MicroservicesController.updateMicroserviceYAMLEndPoint, + successCode, errorCodes) + const responseObject = await updateMicroserviceYAMLEndPoint(req) - res - .status(responseObject.code) - .send(responseObject.body) + res + .status(responseObject.code) + .send(responseObject.body) - logger.apiRes({ req: req, res: responseObject }) + logger.apiRes({ req: req, res: responseObject }) + }) } }, { @@ -249,15 +263,17 @@ module.exports = [ } ] - const deleteMicroserviceEndPoint = ResponseDecorator.handleErrors(MicroservicesController.deleteMicroserviceEndPoint, - successCode, errorCodes) - const responseObject = await deleteMicroserviceEndPoint(req) + await keycloak.protect(['SRE', 'Developer'])(req, res, async () => { + const deleteMicroserviceEndPoint = ResponseDecorator.handleErrors(MicroservicesController.deleteMicroserviceEndPoint, + successCode, errorCodes) + const responseObject = await deleteMicroserviceEndPoint(req) - res - .status(responseObject.code) - .send(responseObject.body) + res + .status(responseObject.code) + .send(responseObject.body) - logger.apiRes({ req: req, res: responseObject }) + logger.apiRes({ req: req, res: responseObject }) + }) } }, { @@ -282,15 +298,17 @@ module.exports = [ } ] - const createMicroserviceRouteEndPoint = ResponseDecorator.handleErrors( - MicroservicesController.createMicroserviceRouteEndPoint, successCode, errorCodes) - const responseObject = await createMicroserviceRouteEndPoint(req) + await keycloak.protect(['SRE', 'Developer'])(req, res, async () => { + const createMicroserviceRouteEndPoint = ResponseDecorator.handleErrors( + MicroservicesController.createMicroserviceRouteEndPoint, successCode, errorCodes) + const responseObject = await createMicroserviceRouteEndPoint(req) - res - .status(responseObject.code) - .send(responseObject.body) + res + .status(responseObject.code) + .send(responseObject.body) - logger.apiRes({ req: req, res: responseObject }) + logger.apiRes({ req: req, res: responseObject }) + }) } }, { @@ -315,15 +333,17 @@ module.exports = [ } ] - const deleteMicroserviceRouteEndPoint = ResponseDecorator.handleErrors( - MicroservicesController.deleteMicroserviceRouteEndPoint, successCode, errorCodes) - const responseObject = await deleteMicroserviceRouteEndPoint(req) + await keycloak.protect(['SRE', 'Developer'])(req, res, async () => { + const deleteMicroserviceRouteEndPoint = ResponseDecorator.handleErrors( + MicroservicesController.deleteMicroserviceRouteEndPoint, successCode, errorCodes) + const responseObject = await deleteMicroserviceRouteEndPoint(req) - res - .status(responseObject.code) - .send(responseObject.body) + res + .status(responseObject.code) + .send(responseObject.body) - logger.apiRes({ req: req, res: responseObject }) + logger.apiRes({ req: req, res: responseObject }) + }) } }, { @@ -348,15 +368,17 @@ module.exports = [ } ] - const createMicroservicePortMappingEndPoint = ResponseDecorator.handleErrors( - MicroservicesController.createMicroservicePortMappingEndPoint, successCode, errorCodes) - const responseObject = await createMicroservicePortMappingEndPoint(req) + await keycloak.protect(['SRE', 'Developer'])(req, res, async () => { + const createMicroservicePortMappingEndPoint = ResponseDecorator.handleErrors( + MicroservicesController.createMicroservicePortMappingEndPoint, successCode, errorCodes) + const responseObject = await createMicroservicePortMappingEndPoint(req) - res - .status(responseObject.code) - .send(responseObject.body) + res + .status(responseObject.code) + .send(responseObject.body) - logger.apiRes({ req: req, res: responseObject }) + logger.apiRes({ req: req, res: responseObject }) + }) } }, { @@ -377,15 +399,17 @@ module.exports = [ } ] - const deleteMicroservicePortMapping = ResponseDecorator.handleErrors( - MicroservicesController.deleteMicroservicePortMappingEndPoint, successCode, errorCodes) - const responseObject = await deleteMicroservicePortMapping(req) + await keycloak.protect(['SRE', 'Developer'])(req, res, async () => { + const deleteMicroservicePortMapping = ResponseDecorator.handleErrors( + MicroservicesController.deleteMicroservicePortMappingEndPoint, successCode, errorCodes) + const responseObject = await deleteMicroservicePortMapping(req) - res - .status(responseObject.code) - .send(responseObject.body) + res + .status(responseObject.code) + .send(responseObject.body) - logger.apiRes({ req: req, res: responseObject }) + logger.apiRes({ req: req, res: responseObject }) + }) } }, { @@ -406,15 +430,17 @@ module.exports = [ } ] - const getMicroservicePortMapping = ResponseDecorator.handleErrors( - MicroservicesController.getMicroservicePortMappingListEndPoint, successCode, errorCodes) - const responseObject = await getMicroservicePortMapping(req) + await keycloak.protect(['SRE', 'Developer', 'Viewer'])(req, res, async () => { + const getMicroservicePortMapping = ResponseDecorator.handleErrors( + MicroservicesController.getMicroservicePortMappingListEndPoint, successCode, errorCodes) + const responseObject = await getMicroservicePortMapping(req) - res - .status(responseObject.code) - .send(responseObject.body) + res + .status(responseObject.code) + .send(responseObject.body) - logger.apiRes({ req: req, res: responseObject }) + logger.apiRes({ req: req, res: responseObject }) + }) } }, { @@ -435,18 +461,20 @@ module.exports = [ } ] - const listMicroserviceVolumeMappingEndPoint = ResponseDecorator.handleErrors( - MicroservicesController.listMicroserviceVolumeMappingsEndPoint, - successCode, - errorCodes - ) - const responseObject = await listMicroserviceVolumeMappingEndPoint(req) + await keycloak.protect(['SRE', 'Developer', 'Viewer'])(req, res, async () => { + const listMicroserviceVolumeMappingEndPoint = ResponseDecorator.handleErrors( + MicroservicesController.listMicroserviceVolumeMappingsEndPoint, + successCode, + errorCodes + ) + const responseObject = await listMicroserviceVolumeMappingEndPoint(req) - res - .status(responseObject.code) - .send(responseObject.body) + res + .status(responseObject.code) + .send(responseObject.body) - logger.apiRes({ req: req, res: responseObject }) + logger.apiRes({ req: req, res: responseObject }) + }) } }, { @@ -471,18 +499,20 @@ module.exports = [ } ] - const createMicroserviceVolumeMappingEndPoint = ResponseDecorator.handleErrors( - MicroservicesController.createMicroserviceVolumeMappingEndPoint, - successCode, - errorCodes - ) - const responseObject = await createMicroserviceVolumeMappingEndPoint(req) + await keycloak.protect(['SRE', 'Developer'])(req, res, async () => { + const createMicroserviceVolumeMappingEndPoint = ResponseDecorator.handleErrors( + MicroservicesController.createMicroserviceVolumeMappingEndPoint, + successCode, + errorCodes + ) + const responseObject = await createMicroserviceVolumeMappingEndPoint(req) - res - .status(responseObject.code) - .send(responseObject.body) + res + .status(responseObject.code) + .send(responseObject.body) - logger.apiRes({ req: req, res: responseObject }) + logger.apiRes({ req: req, res: responseObject }) + }) } }, { @@ -507,18 +537,20 @@ module.exports = [ } ] - const deleteMicroserviceVolumeMappingEndPoint = ResponseDecorator.handleErrors( - MicroservicesController.deleteMicroserviceVolumeMappingEndPoint, - successCode, - errorCodes - ) - const responseObject = await deleteMicroserviceVolumeMappingEndPoint(req) + await keycloak.protect(['SRE', 'Developer'])(req, res, async () => { + const deleteMicroserviceVolumeMappingEndPoint = ResponseDecorator.handleErrors( + MicroservicesController.deleteMicroserviceVolumeMappingEndPoint, + successCode, + errorCodes + ) + const responseObject = await deleteMicroserviceVolumeMappingEndPoint(req) - res - .status(responseObject.code) - .send(responseObject.body) + res + .status(responseObject.code) + .send(responseObject.body) - logger.apiRes({ req: req, res: responseObject }) + logger.apiRes({ req: req, res: responseObject }) + }) } } ] diff --git a/src/routes/registries.js b/src/routes/registries.js index 8d327d588..e1369082c 100644 --- a/src/routes/registries.js +++ b/src/routes/registries.js @@ -15,6 +15,7 @@ const RegistryController = require('../controllers/registry-controller') const ResponseDecorator = require('../decorators/response-decorator') const Errors = require('../helpers/errors') const logger = require('../logger') +const keycloak = require('../config/keycloak.js').initKeycloak() module.exports = [ { @@ -35,13 +36,16 @@ module.exports = [ errors: [Errors.AuthenticationError] } ] - const registriesEndPoint = ResponseDecorator.handleErrors(RegistryController.createRegistryEndPoint, successCode, errorCodes) - const responseObject = await registriesEndPoint(req) - res - .status(responseObject.code) - .send(responseObject.body) - logger.apiRes({ req: req, res: responseObject }) + await keycloak.protect(['SRE', 'Developer'])(req, res, async () => { + const registriesEndPoint = ResponseDecorator.handleErrors(RegistryController.createRegistryEndPoint, successCode, errorCodes) + const responseObject = await registriesEndPoint(req) + res + .status(responseObject.code) + .send(responseObject.body) + + logger.apiRes({ req: req, res: responseObject }) + }) } }, { @@ -61,13 +65,16 @@ module.exports = [ errors: [Errors.AuthenticationError] } ] - const registriesEndPoint = ResponseDecorator.handleErrors(RegistryController.getRegistriesEndPoint, successCode, errorCodes) - const responseObject = await registriesEndPoint(req) - res - .status(responseObject.code) - .send(responseObject.body) - logger.apiRes({ req: req, res: responseObject }) + await keycloak.protect(['SRE', 'Developer', 'Viewer'])(req, res, async () => { + const registriesEndPoint = ResponseDecorator.handleErrors(RegistryController.getRegistriesEndPoint, successCode, errorCodes) + const responseObject = await registriesEndPoint(req) + res + .status(responseObject.code) + .send(responseObject.body) + + logger.apiRes({ req: req, res: responseObject }) + }) } }, { @@ -91,13 +98,16 @@ module.exports = [ errors: [Errors.NotFoundError] } ] - const registriesEndPoint = ResponseDecorator.handleErrors(RegistryController.deleteRegistryEndPoint, successCode, errorCodes) - const responseObject = await registriesEndPoint(req) - res - .status(responseObject.code) - .send(responseObject.body) - logger.apiRes({ req: req, res: responseObject }) + await keycloak.protect('SRE', 'Developer')(req, res, async () => { + const registriesEndPoint = ResponseDecorator.handleErrors(RegistryController.deleteRegistryEndPoint, successCode, errorCodes) + const responseObject = await registriesEndPoint(req) + res + .status(responseObject.code) + .send(responseObject.body) + + logger.apiRes({ req: req, res: responseObject }) + }) } }, { @@ -122,14 +132,17 @@ module.exports = [ errors: [Errors.NotFoundError] } ] - const updateRegistryEndPoint = ResponseDecorator.handleErrors(RegistryController.updateRegistryEndPoint, - successCode, errorCodes) - const responseObject = await updateRegistryEndPoint(req) - res - .status(responseObject.code) - .send(responseObject.body) - logger.apiRes({ req: req, res: responseObject }) + // Protecting for both SRE and Developer roles + await keycloak.protect(['SRE', 'Developer'])(req, res, async () => { + const updateRegistryEndPoint = ResponseDecorator.handleErrors(RegistryController.updateRegistryEndPoint, successCode, errorCodes) + const responseObject = await updateRegistryEndPoint(req) + res + .status(responseObject.code) + .send(responseObject.body) + + logger.apiRes({ req: req, res: responseObject }) + }) } } ] diff --git a/src/routes/router.js b/src/routes/router.js index 0dbc5e8df..88d42e43d 100644 --- a/src/routes/router.js +++ b/src/routes/router.js @@ -15,6 +15,7 @@ const Router = require('../controllers/router-controller') const ResponseDecorator = require('../decorators/response-decorator') const logger = require('../logger') const Errors = require('../helpers/errors') +const keycloak = require('../config/keycloak.js').initKeycloak() module.exports = [ { @@ -34,14 +35,22 @@ module.exports = [ errors: [Errors.NotFoundError] } ] - const getRouterEndpoint = ResponseDecorator.handleErrors(Router.getRouterEndPoint, successCode, errorCodes) - const responseObject = await getRouterEndpoint(req) - res - .status(responseObject.code) - .send(responseObject.body) + // Protecting for SRE, Developer, and Viewer roles + await keycloak.protect(['SRE', 'Developer', 'Viewer'])(req, res, async () => { + const getRouterEndpoint = ResponseDecorator.handleErrors( + Router.getRouterEndPoint, + successCode, + errorCodes + ) + const responseObject = await getRouterEndpoint(req) - logger.apiRes({ req: req, res: responseObject }) + res + .status(responseObject.code) + .send(responseObject.body) + + logger.apiRes({ req: req, res: responseObject }) + }) } }, { @@ -62,14 +71,22 @@ module.exports = [ errors: [Errors.ValidationError] } ] - const upsertDefaultRouter = ResponseDecorator.handleErrors(Router.upsertDefaultRouter, successCode, errorCodes) - const responseObject = await upsertDefaultRouter(req) - res - .status(responseObject.code) - .send(responseObject.body) + // Protecting for SRE role + await keycloak.protect('SRE')(req, res, async () => { + const upsertDefaultRouter = ResponseDecorator.handleErrors( + Router.upsertDefaultRouter, + successCode, + errorCodes + ) + const responseObject = await upsertDefaultRouter(req) + + res + .status(responseObject.code) + .send(responseObject.body) - logger.apiRes({ req: req, res: responseObject }) + logger.apiRes({ req: req, res: responseObject }) + }) } } ] diff --git a/src/routes/routing.js b/src/routes/routing.js index ac54028d2..a850e685b 100644 --- a/src/routes/routing.js +++ b/src/routes/routing.js @@ -15,6 +15,7 @@ const Routing = require('../controllers/routing-controller') const ResponseDecorator = require('../decorators/response-decorator') const logger = require('../logger') const Errors = require('../helpers/errors') +const keycloak = require('../config/keycloak.js').initKeycloak() module.exports = [ { @@ -34,14 +35,22 @@ module.exports = [ errors: [Errors.NotFoundError] } ] - const getRouterEndpoint = ResponseDecorator.handleErrors(Routing.getRoutingsEndPoint, successCode, errorCodes) - const responseObject = await getRouterEndpoint(req) - res - .status(responseObject.code) - .send(responseObject.body) - - logger.apiRes({ req: req, res: responseObject }) + // Protecting for SRE , Developer and Viewer roles + await keycloak.protect(['SRE', 'Developer', 'Viewer'])(req, res, async () => { + const getRouterEndpoint = ResponseDecorator.handleErrors( + Routing.getRoutingsEndPoint, + successCode, + errorCodes + ) + const responseObject = await getRouterEndpoint(req) + + res + .status(responseObject.code) + .send(responseObject.body) + + logger.apiRes({ req: req, res: responseObject }) + }) } }, { @@ -61,14 +70,22 @@ module.exports = [ errors: [Errors.NotFoundError] } ] - const getRouterEndpoint = ResponseDecorator.handleErrors(Routing.getRoutingEndPoint, successCode, errorCodes) - const responseObject = await getRouterEndpoint(req) - - res - .status(responseObject.code) - .send(responseObject.body) - logger.apiRes({ req: req, res: responseObject }) + // Protecting for SRE, Developer, and Viewer roles + await keycloak.protect(['SRE', 'Developer', 'Viewer'])(req, res, async () => { + const getRouterEndpoint = ResponseDecorator.handleErrors( + Routing.getRoutingEndPoint, + successCode, + errorCodes + ) + const responseObject = await getRouterEndpoint(req) + + res + .status(responseObject.code) + .send(responseObject.body) + + logger.apiRes({ req: req, res: responseObject }) + }) } }, { @@ -97,14 +114,22 @@ module.exports = [ errors: [Errors.NotFoundError] } ] - const createRoutingEndpoint = ResponseDecorator.handleErrors(Routing.createRoutingEndpoint, successCode, errorCodes) - const responseObject = await createRoutingEndpoint(req) - res - .status(responseObject.code) - .send(responseObject.body) - - logger.apiRes({ req: req, res: responseObject }) + // Protecting for SRE and Developer roles + await keycloak.protect(['SRE', 'Developer'])(req, res, async () => { + const createRoutingEndpoint = ResponseDecorator.handleErrors( + Routing.createRoutingEndpoint, + successCode, + errorCodes + ) + const responseObject = await createRoutingEndpoint(req) + + res + .status(responseObject.code) + .send(responseObject.body) + + logger.apiRes({ req: req, res: responseObject }) + }) } }, { @@ -130,15 +155,21 @@ module.exports = [ } ] - const updateRoutingEndpoint = ResponseDecorator.handleErrors(Routing.updateRoutingEndpoint, - successCode, errorCodes) - const responseObject = await updateRoutingEndpoint(req) - - res - .status(responseObject.code) - .send(responseObject.body) - - logger.apiRes({ req: req, res: responseObject }) + // Protecting for SRE and Developer roles + await keycloak.protect(['SRE', 'Developer'])(req, res, async () => { + const updateRoutingEndpoint = ResponseDecorator.handleErrors( + Routing.updateRoutingEndpoint, + successCode, + errorCodes + ) + const responseObject = await updateRoutingEndpoint(req) + + res + .status(responseObject.code) + .send(responseObject.body) + + logger.apiRes({ req: req, res: responseObject }) + }) } }, { @@ -159,15 +190,21 @@ module.exports = [ } ] - const deleteRoutingEndpoint = ResponseDecorator.handleErrors(Routing.deleteRoutingEndpoint, - successCode, errorCodes) - const responseObject = await deleteRoutingEndpoint(req) - - res - .status(responseObject.code) - .send(responseObject.body) - - logger.apiRes({ req: req, res: responseObject }) + // Protecting for SRE and Developer roles + await keycloak.protect(['SRE', 'Developer'])(req, res, async () => { + const deleteRoutingEndpoint = ResponseDecorator.handleErrors( + Routing.deleteRoutingEndpoint, + successCode, + errorCodes + ) + const responseObject = await deleteRoutingEndpoint(req) + + res + .status(responseObject.code) + .send(responseObject.body) + + logger.apiRes({ req: req, res: responseObject }) + }) } } ] diff --git a/src/routes/tunnel.js b/src/routes/tunnel.js index ed0d369fc..823e630f8 100644 --- a/src/routes/tunnel.js +++ b/src/routes/tunnel.js @@ -15,6 +15,7 @@ const TunnelController = require('../controllers/tunnel-controller') const ResponseDecorator = require('../decorators/response-decorator') const Errors = require('../helpers/errors') const logger = require('../logger') +const keycloak = require('../config/keycloak.js').initKeycloak() module.exports = [ { @@ -38,13 +39,21 @@ module.exports = [ errors: [Errors.NotFoundError] } ] - const tunnelEndPoint = ResponseDecorator.handleErrors(TunnelController.manageTunnelEndPoint, successCode, errorCodes) - const responseObject = await tunnelEndPoint(req) - res - .status(responseObject.code) - .send(responseObject.body) - logger.apiRes({ req: req, res: responseObject }) + // Protecting for SRE and Developer roles + await keycloak.protect(['SRE'])(req, res, async () => { + const tunnelEndPoint = ResponseDecorator.handleErrors( + TunnelController.manageTunnelEndPoint, + successCode, + errorCodes + ) + const responseObject = await tunnelEndPoint(req) + res + .status(responseObject.code) + .send(responseObject.body) + + logger.apiRes({ req: req, res: responseObject }) + }) } }, { @@ -64,13 +73,21 @@ module.exports = [ errors: [Errors.NotFoundError] } ] - const tunnelEndPoint = ResponseDecorator.handleErrors(TunnelController.getTunnelEndPoint, successCode, errorCodes) - const responseObject = await tunnelEndPoint(req) - res - .status(responseObject.code) - .send(responseObject.body) - logger.apiRes({ req: req, res: responseObject }) + // Protecting for SRE and Developer roles + await keycloak.protect(['SRE'])(req, res, async () => { + const tunnelEndPoint = ResponseDecorator.handleErrors( + TunnelController.getTunnelEndPoint, + successCode, + errorCodes + ) + const responseObject = await tunnelEndPoint(req) + res + .status(responseObject.code) + .send(responseObject.body) + + logger.apiRes({ req: req, res: responseObject }) + }) } } ] diff --git a/src/routes/user.js b/src/routes/user.js index df98f9317..333e2a417 100644 --- a/src/routes/user.js +++ b/src/routes/user.js @@ -11,12 +11,11 @@ * */ const constants = require('../helpers/constants') - const UserController = require('../controllers/user-controller') const ResponseDecorator = require('../decorators/response-decorator') const Errors = require('../helpers/errors') - const logger = require('../logger') +const keycloak = require('../config/keycloak.js').initKeycloak() module.exports = [ { @@ -47,5 +46,36 @@ module.exports = [ logger.apiRes('POST /api/v1/user/login', { args: { statusCode: responseObject.code } }) // don't use req and responseObject as args, because they have password and token } + }, + { + method: 'get', + path: '/api/v1/user/profile', + middleware: async (req, res) => { + logger.apiReq(req) + + const successCode = constants.HTTP_CODE_SUCCESS + const errorCodes = [ + { + code: constants.HTTP_CODE_UNAUTHORIZED, + errors: [Errors.AuthenticationError] + } + ] + + // Protecting for SRE, Developer, and Viewer roles + await keycloak.protect(['SRE', 'Developer', 'Viewer'])(req, res, async () => { + const getUserProfileEndPoint = ResponseDecorator.handleErrors( + UserController.getUserProfileEndPoint, + successCode, + errorCodes + ) + const responseObject = await getUserProfileEndPoint(req) + + res + .status(responseObject.code) + .send(responseObject.body) + + logger.apiRes({ req: req, res: responseObject }) + }) + } } ] diff --git a/src/services/user-service.js b/src/services/user-service.js index 2e9f4f4dc..a2ea2402b 100644 --- a/src/services/user-service.js +++ b/src/services/user-service.js @@ -39,7 +39,7 @@ const login = async function (credentials, isCLI, transaction) { 'Cache-Control': 'no-cache', 'Content-Type': 'application/x-www-form-urlencoded' }, - data: data, + data, httpsAgent: agent } @@ -49,7 +49,7 @@ const login = async function (credentials, isCLI, transaction) { // Extract the access token from the response const accessToken = response.data.access_token return { - accessToken: accessToken + accessToken } } catch (error) { console.error('Error during login:', error) @@ -57,6 +57,38 @@ const login = async function (credentials, isCLI, transaction) { } } +const profile = async function (req, isCLI, transaction) { + try { + const data = {} + const agent = new https.Agent({ + // Ignore SSL certificate errors + rejectUnauthorized: false + }) + + const profileconfig = { + method: 'get', + maxBodyLength: Infinity, + url: `${process.env.KC_URL}realms/${process.env.KC_REALM}/protocol/openid-connect/userinfo`, + headers: { + 'Content-Type': 'application/x-www-form-urlencoded', + Cookie: 'KEYCLOAK_LOCALE=en' + }, + data: data, + httpsAgent: agent + } + + // Make the request using async/await + const response = await axios.request(profileconfig) + + // Return the userinfo data + return response.data + } catch (error) { + console.error('Error during profile retrieval:', error) + throw new Errors.InvalidCredentialsError() + } +} + module.exports = { - login: TransactionDecorator.generateTransaction(login) + login: TransactionDecorator.generateTransaction(login), + profile: TransactionDecorator.generateTransaction(profile) } diff --git a/src/views/email-activation-temp.js b/src/views/email-activation-temp.js deleted file mode 100644 index a4538c6c7..000000000 --- a/src/views/email-activation-temp.js +++ /dev/null @@ -1,140 +0,0 @@ -/* - * ******************************************************************************* - * * Copyright (c) 2023 Datasance Teknoloji A.S. - * * - * * This program and the accompanying materials are made available under the - * * terms of the Eclipse Public License v. 2.0 which is available at - * * http://www.eclipse.org/legal/epl-2.0 - * * - * * SPDX-License-Identifier: EPL-2.0 - * ******************************************************************************* - * - */ - -const emailActivationTemplate = { - p1: ` -
- - - - - - - - -
-
- - - - - - - - - -
- Welcome to Eclipse ioFog! -
- - - - - - - - - - - - - - - - -
- Before we can get started, you need to click this button to activate your account. - If clicking the button doesn't work, copy and paste copy and paste this link into your web browser - address bar.
-
- ', - - p4: '/account/activate/code/', - - p5: ' -
- - Confirm Email Address - -
- — the IOFOG team -
-
-
- - - - - - -
- Follow - - @EclipseioFog - - on Twitter. -
-
-
-
-
-
` -} - -module.exports = emailActivationTemplate diff --git a/src/views/email-temp.js b/src/views/email-temp.js deleted file mode 100644 index ae0caed5b..000000000 --- a/src/views/email-temp.js +++ /dev/null @@ -1,76 +0,0 @@ -/* - * ******************************************************************************* - * * Copyright (c) 2023 Datasance Teknoloji A.S. - * * - * * This program and the accompanying materials are made available under the - * * terms of the Eclipse Public License v. 2.0 which is available at - * * http://www.eclipse.org/legal/epl-2.0 - * * - * * SPDX-License-Identifier: EPL-2.0 - * ******************************************************************************* - * - */ - -const emailRecoveryTemplate = { - p1: `
- - - - - - -
-
- - - - - - - - - -
- Hi, ', - - p2: '
- - - - - - - - - - - - -
- We sent you this email just to tell you that your password was changed. - Did you do that? If so, then we are all good. If not, then please contact us - so we can help you avoid any potential problems. -
- You can just reply directly to this email if you need to contact us. -
- — the IOFOG team -
-
-
- - - - - - -
- Follow @EclipseioFog on Twitter. -
-
-
-
` -} - -module.exports = emailRecoveryTemplate diff --git a/src/views/reset-password-temp.js b/src/views/reset-password-temp.js deleted file mode 100644 index 2f3885913..000000000 --- a/src/views/reset-password-temp.js +++ /dev/null @@ -1,126 +0,0 @@ -/* - * ******************************************************************************* - * * Copyright (c) 2023 Datasance Teknoloji A.S. - * * - * * This program and the accompanying materials are made available under the - * * terms of the Eclipse Public License v. 2.0 which is available at - * * http://www.eclipse.org/legal/epl-2.0 - * * - * * SPDX-License-Identifier: EPL-2.0 - * ******************************************************************************* - * - */ - -const emailResetTemplate = { - p1: `
- - - - - - - -
-
- - - - - - - - - -
- Hi ', - - p2: '
- - - - - - - - - - - - - - - - -
- It took like you were having some trouble with your password? -
- You can use the temporary password ', - - p3: ' to log in. -
- - Go To Login - -
- — the IOFOG team -
-
-
- - - - - - -
- Follow - - @EclipseioFog - - on Twitter. -
-
-
-
-
-
` -} - -module.exports = emailResetTemplate From 1e9b7aa3acfefda6332eb53897ea2761b7bd4823 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emirhan=20Durmu=C5=9F?= Date: Tue, 19 Mar 2024 18:10:18 +0300 Subject: [PATCH 064/178] user service for profile endpoint edited --- src/services/user-service.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/services/user-service.js b/src/services/user-service.js index a2ea2402b..67e04d384 100644 --- a/src/services/user-service.js +++ b/src/services/user-service.js @@ -59,7 +59,6 @@ const login = async function (credentials, isCLI, transaction) { const profile = async function (req, isCLI, transaction) { try { - const data = {} const agent = new https.Agent({ // Ignore SSL certificate errors rejectUnauthorized: false @@ -73,7 +72,6 @@ const profile = async function (req, isCLI, transaction) { 'Content-Type': 'application/x-www-form-urlencoded', Cookie: 'KEYCLOAK_LOCALE=en' }, - data: data, httpsAgent: agent } From 4e2930a15565194558e73cab295ec013d09c271d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emirhan=20Durmu=C5=9F?= Date: Tue, 19 Mar 2024 18:26:18 +0300 Subject: [PATCH 065/178] user profile route edited --- src/routes/user.js | 23 ++++++++++------------- 1 file changed, 10 insertions(+), 13 deletions(-) diff --git a/src/routes/user.js b/src/routes/user.js index 333e2a417..aac4bd49e 100644 --- a/src/routes/user.js +++ b/src/routes/user.js @@ -61,21 +61,18 @@ module.exports = [ } ] - // Protecting for SRE, Developer, and Viewer roles - await keycloak.protect(['SRE', 'Developer', 'Viewer'])(req, res, async () => { - const getUserProfileEndPoint = ResponseDecorator.handleErrors( - UserController.getUserProfileEndPoint, - successCode, - errorCodes - ) - const responseObject = await getUserProfileEndPoint(req) + const getUserProfileEndPoint = ResponseDecorator.handleErrors( + UserController.getUserProfileEndPoint, + successCode, + errorCodes + ) + const responseObject = await getUserProfileEndPoint(req) - res - .status(responseObject.code) - .send(responseObject.body) + res + .status(responseObject.code) + .send(responseObject.body) - logger.apiRes({ req: req, res: responseObject }) - }) + logger.apiRes({ req: req, res: responseObject }) } } ] From fe69c331435a72bf33a64b0e24f1b3c051046f86 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emirhan=20Durmu=C5=9F?= Date: Tue, 19 Mar 2024 18:33:04 +0300 Subject: [PATCH 066/178] user routes updated --- src/routes/user.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/routes/user.js b/src/routes/user.js index aac4bd49e..dfa8c0d1b 100644 --- a/src/routes/user.js +++ b/src/routes/user.js @@ -15,7 +15,6 @@ const UserController = require('../controllers/user-controller') const ResponseDecorator = require('../decorators/response-decorator') const Errors = require('../helpers/errors') const logger = require('../logger') -const keycloak = require('../config/keycloak.js').initKeycloak() module.exports = [ { From 735424886636086ef858fac2b7d0749f9df826c7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emirhan=20Durmu=C5=9F?= Date: Tue, 19 Mar 2024 19:06:56 +0300 Subject: [PATCH 067/178] user profile service edited for extracting token from endpoint request --- src/services/user-service.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/services/user-service.js b/src/services/user-service.js index 67e04d384..cb50b5c8c 100644 --- a/src/services/user-service.js +++ b/src/services/user-service.js @@ -59,6 +59,7 @@ const login = async function (credentials, isCLI, transaction) { const profile = async function (req, isCLI, transaction) { try { + const accessToken = req.headers.authorization.replace('Bearer ', '') const agent = new https.Agent({ // Ignore SSL certificate errors rejectUnauthorized: false @@ -70,7 +71,7 @@ const profile = async function (req, isCLI, transaction) { url: `${process.env.KC_URL}realms/${process.env.KC_REALM}/protocol/openid-connect/userinfo`, headers: { 'Content-Type': 'application/x-www-form-urlencoded', - Cookie: 'KEYCLOAK_LOCALE=en' + 'Authorization': `Bearer ${accessToken}` }, httpsAgent: agent } From 0bd03ccae8fe06f3ccdf2fa8cc3b5e142bf0acdb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emirhan=20Durmu=C5=9F?= Date: Fri, 22 Mar 2024 17:02:46 +0300 Subject: [PATCH 068/178] user login kc totp and user logout added --- docs/swagger.json | 22 ++++++++++++++++++ docs/swagger.yaml | 15 +++++++++++++ scripts/util.js | 2 +- src/controllers/user-controller.js | 10 +++++++-- src/routes/user.js | 22 ++++++++++++++++++ src/schemas/user.js | 5 +++-- src/services/user-service.js | 36 ++++++++++++++++++++++++++++-- 7 files changed, 105 insertions(+), 7 deletions(-) diff --git a/docs/swagger.json b/docs/swagger.json index 7a8c89f01..bcf2f19d2 100644 --- a/docs/swagger.json +++ b/docs/swagger.json @@ -2418,6 +2418,28 @@ } } }, + "/user/logout" : { + "post" : { + "tags" : [ "User" ], + "summary" : "Logout", + "operationId" : "logout", + "parameters" : [ ], + "security" : [ { + "userToken" : [ ] + } ], + "responses" : { + "204" : { + "description" : "Success" + }, + "401" : { + "description" : "Not Authorized" + }, + "500" : { + "description" : "Internal Server Error" + } + } + } + }, "/user/profile" : { "get" : { "tags" : [ "User" ], diff --git a/docs/swagger.yaml b/docs/swagger.yaml index 88a0f083d..6b37a59ae 100755 --- a/docs/swagger.yaml +++ b/docs/swagger.yaml @@ -2280,6 +2280,21 @@ paths: description: bad request "401": description: incorrect credentials + /user/logout: + post: + tags: + - User + summary: Logout + operationId: logout + security: + - userToken: [] + responses: + "204": + description: Success + "401": + description: Not Authorized + "500": + description: Internal Server Error /user/profile: get: tags: diff --git a/scripts/util.js b/scripts/util.js index 19d342820..0245dd7d3 100644 --- a/scripts/util.js +++ b/scripts/util.js @@ -22,7 +22,7 @@ const DEV_DB_BACKUP = `${TEMP_DIR}/dev_database.sqlite` const PROD_DB = `${ROOT_DIR}/src/data/sqlite_files/prod_database.sqlite` const PROD_DB_BACKUP = `${TEMP_DIR}/prod_database.sqlite` -let dbName = process.env.DB_NAME || 'iofogcontroller' +let dbName = process.env.DB_NAME || 'pot-controller' if (!dbName.endsWith('.sqlite')) { dbName += '.sqlite' } diff --git a/src/controllers/user-controller.js b/src/controllers/user-controller.js index 4ab3fceb9..64fd4322c 100644 --- a/src/controllers/user-controller.js +++ b/src/controllers/user-controller.js @@ -21,7 +21,8 @@ const userLoginEndPoint = async function (req) { const credentials = { email: user.email, - password: user.password + password: user.password, + totp: user.totp } return UserService.login(credentials, false) @@ -31,7 +32,12 @@ const getUserProfileEndPoint = async function (req) { return UserService.profile(req, false) } +const userLogoutEndPoint = async function (req, user) { + return UserService.logout(user, false) +} + module.exports = { userLoginEndPoint: userLoginEndPoint, - getUserProfileEndPoint: getUserProfileEndPoint + getUserProfileEndPoint: getUserProfileEndPoint, + userLogoutEndPoint: userLogoutEndPoint } diff --git a/src/routes/user.js b/src/routes/user.js index dfa8c0d1b..39d9dab86 100644 --- a/src/routes/user.js +++ b/src/routes/user.js @@ -73,5 +73,27 @@ module.exports = [ logger.apiRes({ req: req, res: responseObject }) } + }, + { + method: 'post', + path: '/api/v1/user/logout', + middleware: async (req, res) => { + logger.apiReq(req) + + const successCode = constants.HTTP_CODE_NO_CONTENT + const errorCodes = [ + { + code: constants.HTTP_CODE_UNAUTHORIZED, + errors: [Errors.AuthenticationError] + } + ] + + const userLogoutEndPoint = ResponseDecorator.handleErrors(UserController.userLogoutEndPoint, successCode, errorCodes) + const responseObject = await userLogoutEndPoint(req) + + res + .status(responseObject.code) + .send() + } } ] diff --git a/src/schemas/user.js b/src/schemas/user.js index eae5bd6db..ac3e99bcc 100644 --- a/src/schemas/user.js +++ b/src/schemas/user.js @@ -20,9 +20,10 @@ const login = { pattern: '^(([^<>()\\[\\]\\\\.,;:\\s@"]+(\\.[^<>()\\[\\]\\\\.,;:\\s@"]+)*)|(".+"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}' + '\\.[0-9]{1,3}\\.[0-9]{1,3}])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$' }, - password: { type: 'string' } + password: { type: 'string' }, + totp: { type: 'string' } }, - required: ['email', 'password'], + required: ['email', 'password', 'totp'], additionalProperties: true } diff --git a/src/services/user-service.js b/src/services/user-service.js index cb50b5c8c..50638b1a1 100644 --- a/src/services/user-service.js +++ b/src/services/user-service.js @@ -23,6 +23,7 @@ const login = async function (credentials, isCLI, transaction) { grant_type: 'password', username: credentials.email, password: credentials.password, + totp: credentials.totp, client_id: process.env.KC_CLIENT, client_secret: process.env.KC_CLIENT_SECRET }) @@ -71,7 +72,7 @@ const profile = async function (req, isCLI, transaction) { url: `${process.env.KC_URL}realms/${process.env.KC_REALM}/protocol/openid-connect/userinfo`, headers: { 'Content-Type': 'application/x-www-form-urlencoded', - 'Authorization': `Bearer ${accessToken}` + Authorization: `Bearer ${accessToken}` }, httpsAgent: agent } @@ -87,7 +88,38 @@ const profile = async function (req, isCLI, transaction) { } } +const logout = async function (req, isCLI, transaction) { + try { + const accessToken = req.headers.authorization.replace('Bearer ', '') + const agent = new https.Agent({ + // Ignore SSL certificate errors + rejectUnauthorized: false + }) + + const logoutconfig = { + method: 'post', + maxBodyLength: Infinity, + url: `${process.env.KC_URL}realms/${process.env.KC_REALM}/protocol/openid-connect/logout`, + headers: { + 'Content-Type': 'application/x-www-form-urlencoded', + Authorization: `Bearer ${accessToken}` + }, + httpsAgent: agent + } + + // Make the request using async/await + const response = await axios.request(logoutconfig) + + // Return the userinfo data + return response.data + } catch (error) { + console.error('Error during logout:', error) + throw new Errors.InvalidCredentialsError() + } +} + module.exports = { login: TransactionDecorator.generateTransaction(login), - profile: TransactionDecorator.generateTransaction(profile) + profile: TransactionDecorator.generateTransaction(profile), + logout: TransactionDecorator.generateTransaction(logout) } From 84157f7235c4fdc026a52ffb5b21914ce24a0447 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emirhan=20Durmu=C5=9F?= Date: Fri, 22 Mar 2024 18:59:12 +0300 Subject: [PATCH 069/178] user logout fixed --- Dockerfile.dev | 9 +-------- docs/swagger.yaml | 1 + src/controllers/user-controller.js | 4 ++-- 3 files changed, 4 insertions(+), 10 deletions(-) diff --git a/Dockerfile.dev b/Dockerfile.dev index 93120cfd2..1d2b52a27 100644 --- a/Dockerfile.dev +++ b/Dockerfile.dev @@ -37,18 +37,11 @@ RUN python3 -m ensurepip RUN pip3 install --no-cache --upgrade pip setuptools COPY --from=builder /tmp/datasance-iofogcontroller-*.tgz /tmp/iofog-controller.tgz -#ARG GITHUB_TOKEN - -#COPY --from=builder /tmp/.npmrc . -# Set GitHub npm registry with authentication token -#RUN echo "//npm.pkg.github.com/:_authToken=${GITHUB_TOKEN}" > ~/.npmrc - -#RUN npm config set @datasance:registry https://npm.pkg.github.com/ RUN npm i -g /tmp/iofog-controller.tgz && \ rm -rf /tmp/iofog-controller.tgz && \ iofog-controller config dev-mode --on -# RUN sudo rm -rf /usr/local/lib/node_modules/@datasance/iofogcontroller/src/data/sqlite_files + LABEL org.opencontainers.image.description controller LABEL org.opencontainers.image.source=https://github.com/datasance/controller LABEL org.opencontainers.image.licenses=EPL2.0 diff --git a/docs/swagger.yaml b/docs/swagger.yaml index 6b37a59ae..671979f38 100755 --- a/docs/swagger.yaml +++ b/docs/swagger.yaml @@ -4215,6 +4215,7 @@ components: required: - email - password + - totp properties: email: type: string diff --git a/src/controllers/user-controller.js b/src/controllers/user-controller.js index 64fd4322c..5291dc5ec 100644 --- a/src/controllers/user-controller.js +++ b/src/controllers/user-controller.js @@ -32,8 +32,8 @@ const getUserProfileEndPoint = async function (req) { return UserService.profile(req, false) } -const userLogoutEndPoint = async function (req, user) { - return UserService.logout(user, false) +const userLogoutEndPoint = async function (req) { + return UserService.logout(req, false) } module.exports = { From c5f25034ffddacb859b1ad8debb6d6685e389ab5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emirhan=20Durmu=C5=9F?= Date: Mon, 25 Mar 2024 17:57:22 +0300 Subject: [PATCH 070/178] ecn viewer version updated --- docs/swagger.yaml | 2 ++ package.json | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/swagger.yaml b/docs/swagger.yaml index 671979f38..1cd9a0005 100755 --- a/docs/swagger.yaml +++ b/docs/swagger.yaml @@ -4221,6 +4221,8 @@ components: type: string password: type: string + totp: + type: string LoginSuccessResponse: type: object required: diff --git a/package.json b/package.json index a98aa80a9..c09a6a6b4 100644 --- a/package.json +++ b/package.json @@ -57,7 +57,7 @@ "iofog-controller": "src/main.js" }, "dependencies": { - "@datasance/ecn-viewer": "0.0.1", + "@datasance/ecn-viewer": "0.1.0", "axios": "1.0.0-alpha.1", "body-parser": "^1.20.1", "child_process": "1.0.2", From cf88aebbadcf5a6474bc407b09708348c0a95d05 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emirhan=20Durmu=C5=9F?= Date: Mon, 25 Mar 2024 21:58:36 +0300 Subject: [PATCH 071/178] viewer keycloak variables and version updated --- package.json | 2 +- src/server.js | 8 +++++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index c09a6a6b4..d9a37331b 100644 --- a/package.json +++ b/package.json @@ -57,7 +57,7 @@ "iofog-controller": "src/main.js" }, "dependencies": { - "@datasance/ecn-viewer": "0.1.0", + "@datasance/ecn-viewer": "0.1.3", "axios": "1.0.0-alpha.1", "body-parser": "^1.20.1", "child_process": "1.0.2", diff --git a/src/server.js b/src/server.js index 92dcac4be..15a12acd3 100755 --- a/src/server.js +++ b/src/server.js @@ -182,6 +182,9 @@ const viewerURL = process.env.VIEWER_URL || config.get('Viewer:Url') const sslKey = config.get('Server:SslKey') const sslCert = config.get('Server:SslCert') const intermedKey = config.get('Server:IntermediateCert') +const kcRealm = process.env.KC_REALM +const kcURL = `${process.env.KC_URL}` +const kcClient = process.env.KC_VIEWER_CLIENT viewerApp.use('/', ecnViewer.middleware(express)) @@ -210,7 +213,10 @@ const initState = async () => { const ecnViewerControllerConfigFilePath = path.join(__dirname, '..', 'node_modules', '@datasance', 'ecn-viewer', 'build', 'controller-config.js') const ecnViewerControllerConfig = { port: apiPort, - user: {} + user: {}, + keycloakURL: kcURL, + keycloakRealm: kcRealm, + keycloakClientid: kcClient } if (viewerURL) { ecnViewerControllerConfig.url = viewerURL From 628894847adbf299d4b0d38ded528f0e2b159a16 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emirhan=20Durmu=C5=9F?= Date: Wed, 27 Mar 2024 18:53:58 +0300 Subject: [PATCH 072/178] edgeresource service fixed --- package.json | 2 -- src/schemas/user.js | 2 +- src/services/edge-resource-service.js | 4 ++-- 3 files changed, 3 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index d9a37331b..23e892fe5 100644 --- a/package.json +++ b/package.json @@ -85,8 +85,6 @@ "multer": "1.4.5-lts.1", "mysql2": "3.2.2", "nconf": "0.12.0", - "nodemailer": "6.7.3", - "nodemailer-smtp-transport": "2.4.2", "os": "0.1.1", "path": "0.12.7", "pino": "6.6.1", diff --git a/src/schemas/user.js b/src/schemas/user.js index ac3e99bcc..304068b66 100644 --- a/src/schemas/user.js +++ b/src/schemas/user.js @@ -23,7 +23,7 @@ const login = { password: { type: 'string' }, totp: { type: 'string' } }, - required: ['email', 'password', 'totp'], + required: ['email', 'password'], additionalProperties: true } diff --git a/src/services/edge-resource-service.js b/src/services/edge-resource-service.js index ba231b567..750e040a7 100644 --- a/src/services/edge-resource-service.js +++ b/src/services/edge-resource-service.js @@ -23,12 +23,12 @@ const TransactionDecorator = require('../decorators/transaction-decorator') const Validator = require('../schemas') const ChangeTrackingService = require('./change-tracking-service') -async function listEdgeResources (user, transaction) { +async function listEdgeResources (transaction) { const edgeResources = await EdgeResourceManager.findAllWithOrchestrationTags(transaction) return edgeResources.map(buildGetObject) } -async function getEdgeResource ({ name, version }, user, transaction) { +async function getEdgeResource ({ name, version }, transaction) { if (version) { const resource = await EdgeResourceManager.findOneWithOrchestrationTags({ name, version }, transaction) if (!resource) { From e0fa248e8902409dbbe4735ae8722b3fa4942315 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emirhan=20Durmu=C5=9F?= Date: Thu, 28 Mar 2024 13:42:10 +0300 Subject: [PATCH 073/178] user removed from endpoint's controller and service --- src/controllers/application-controller.js | 48 ++++---- .../application-template-controller.js | 36 +++--- src/controllers/catalog-controller.js | 20 ++-- src/controllers/config-controller.js | 6 +- src/controllers/diagnostic-controller.js | 20 ++-- src/controllers/edge-resource-controller.js | 32 +++--- src/controllers/iofog-controller.js | 44 ++++---- src/controllers/microservices-controller.js | 68 +++++------ src/controllers/registry-controller.js | 16 +-- src/controllers/routing-controller.js | 20 ++-- src/controllers/tunnel-controller.js | 10 +- src/services/application-service.js | 44 ++++---- src/services/application-template-service.js | 28 ++--- src/services/catalog-service.js | 18 +-- src/services/diagnostic-service.js | 12 +- src/services/edge-resource-service.js | 12 +- src/services/iofog-service.js | 42 +++---- src/services/microservice-ports/default.js | 42 ++++--- src/services/microservice-ports/proxy.js | 10 +- src/services/microservices-service.js | 106 +++++++++--------- src/services/registry-service.js | 16 +-- src/services/routing-service.js | 20 ++-- src/services/tunnel-service.js | 8 +- 23 files changed, 337 insertions(+), 341 deletions(-) diff --git a/src/controllers/application-controller.js b/src/controllers/application-controller.js index da06cfe8b..15676b7da 100644 --- a/src/controllers/application-controller.js +++ b/src/controllers/application-controller.js @@ -17,85 +17,85 @@ const errors = require('../helpers/errors') const ErrorMessages = require('../helpers/error-messages') const { rvaluesVarSubstition } = require('../helpers/template-helper') -const createApplicationEndPoint = async function (req, user) { +const createApplicationEndPoint = async function (req) { const application = req.body - return ApplicationService.createApplicationEndPoint(application, user, false) + return ApplicationService.createApplicationEndPoint(application, false) } -const createApplicationYAMLEndPoint = async function (req, user) { +const createApplicationYAMLEndPoint = async function (req) { if (!req.file) { throw new errors.ValidationError(ErrorMessages.APPLICATION_FILE_NOT_FOUND) } const fileContent = req.file.buffer.toString() const application = await YAMLParserService.parseAppFile(fileContent) - await rvaluesVarSubstition(application, { self: application }, user) + await rvaluesVarSubstition(application, { self: application }) - return ApplicationService.createApplicationEndPoint(application, user, false) + return ApplicationService.createApplicationEndPoint(application, false) } -const getApplicationsByUserEndPoint = async function (req, user) { - return ApplicationService.getUserApplicationsEndPoint(user, false) +const getApplicationsByUserEndPoint = async function (req) { + return ApplicationService.getUserApplicationsEndPoint(false) } -const getApplicationEndPoint = async function (req, user) { +const getApplicationEndPoint = async function (req) { const name = req.params.name - const application = await ApplicationService.getApplicationEndPoint({ name }, user, false) + const application = await ApplicationService.getApplicationEndPoint({ name }, false) return application } -const patchApplicationEndPoint = async function (req, user) { +const patchApplicationEndPoint = async function (req) { const application = req.body const name = req.params.name - return ApplicationService.patchApplicationEndPoint(application, { name }, user, false) + return ApplicationService.patchApplicationEndPoint(application, { name }, false) } -const updateApplicationEndPoint = async function (req, user) { +const updateApplicationEndPoint = async function (req) { const application = req.body const name = req.params.name - return ApplicationService.updateApplicationEndPoint(application, name, user, false) + return ApplicationService.updateApplicationEndPoint(application, name, false) } -const updateApplicationYAMLEndPoint = async function (req, user) { +const updateApplicationYAMLEndPoint = async function (req) { if (!req.file) { throw new errors.ValidationError(ErrorMessages.APPLICATION_FILE_NOT_FOUND) } const name = req.params.name const fileContent = req.file.buffer.toString() const application = await YAMLParserService.parseAppFile(fileContent) - await rvaluesVarSubstition(application, { self: application }, user) + await rvaluesVarSubstition(application, { self: application }) - return ApplicationService.updateApplicationEndPoint(application, name, user, false) + return ApplicationService.updateApplicationEndPoint(application, name, false) } -const deleteApplicationEndPoint = async function (req, user) { +const deleteApplicationEndPoint = async function (req) { const name = req.params.name - return ApplicationService.deleteApplicationEndPoint({ name }, user, false) + return ApplicationService.deleteApplicationEndPoint({ name }, false) } // Legacy -const deleteApplicationByIdEndPoint = async function (req, user) { +const deleteApplicationByIdEndPoint = async function (req) { const id = req.params.id - return ApplicationService.deleteApplicationEndPoint({ id }, user, false) + return ApplicationService.deleteApplicationEndPoint({ id }, false) } -const patchApplicationByIdEndPoint = async function (req, user) { +const patchApplicationByIdEndPoint = async function (req) { const application = req.body const id = req.params.id - return ApplicationService.patchApplicationEndPoint(application, { id }, user, false) + return ApplicationService.patchApplicationEndPoint(application, { id }, false) } -const getApplicationByIdEndPoint = async function (req, user) { +const getApplicationByIdEndPoint = async function (req) { const id = req.params.id - const application = await ApplicationService.getApplicationEndPoint({ id }, user, false) + const application = await ApplicationService.getApplicationEndPoint({ id }, false) return application } diff --git a/src/controllers/application-template-controller.js b/src/controllers/application-template-controller.js index 7a9e85d0a..61f281112 100644 --- a/src/controllers/application-template-controller.js +++ b/src/controllers/application-template-controller.js @@ -17,63 +17,63 @@ const errors = require('../helpers/errors') const ErrorMessages = require('../helpers/error-messages') const { rvaluesVarSubstition } = require('../helpers/template-helper') -const createApplicationTemplateEndPoint = async function (req, user) { +const createApplicationTemplateEndPoint = async function (req) { const application = req.body - return ApplicationTemplateService.createApplicationTemplateEndPoint(application, user, false) + return ApplicationTemplateService.createApplicationTemplateEndPoint(application, false) } -const createApplicationTemplateYAMLEndPoint = async function (req, user) { +const createApplicationTemplateYAMLEndPoint = async function (req) { if (!req.file) { throw new errors.ValidationError(ErrorMessages.APPLICATION_FILE_NOT_FOUND) } const fileContent = req.file.buffer.toString() const application = await YAMLParserService.parseAppTemplateFile(fileContent) - await rvaluesVarSubstition(application.variables, { self: application.variables }, user) + await rvaluesVarSubstition(application.variables, { self: application.variables }) - return ApplicationTemplateService.createApplicationTemplateEndPoint(application, user, false) + return ApplicationTemplateService.createApplicationTemplateEndPoint(application, false) } -const getApplicationTemplatesByUserEndPoint = async function (req, user) { - return ApplicationTemplateService.getUserApplicationTemplatesEndPoint(user, false) +const getApplicationTemplatesByUserEndPoint = async function (req) { + return ApplicationTemplateService.getUserApplicationTemplatesEndPoint(false) } -const getApplicationTemplateEndPoint = async function (req, user) { +const getApplicationTemplateEndPoint = async function (req) { const name = req.params.name - return ApplicationTemplateService.getApplicationTemplateEndPoint({ name }, user, false) + return ApplicationTemplateService.getApplicationTemplateEndPoint({ name }, false) } -const patchApplicationTemplateEndPoint = async function (req, user) { +const patchApplicationTemplateEndPoint = async function (req) { const application = req.body const name = req.params.name - return ApplicationTemplateService.patchApplicationTemplateEndPoint(application, { name }, user, false) + return ApplicationTemplateService.patchApplicationTemplateEndPoint(application, { name }, false) } -const updateApplicationTemplateEndPoint = async function (req, user) { +const updateApplicationTemplateEndPoint = async function (req) { const application = req.body const name = req.params.name - return ApplicationTemplateService.updateApplicationTemplateEndPoint(application, name, user, false) + return ApplicationTemplateService.updateApplicationTemplateEndPoint(application, name, false) } -const updateApplicationTemplateYAMLEndPoint = async function (req, user) { +const updateApplicationTemplateYAMLEndPoint = async function (req) { if (!req.file) { throw new errors.ValidationError(ErrorMessages.APPLICATION_FILE_NOT_FOUND) } const name = req.params.name const fileContent = req.file.buffer.toString() const application = await YAMLParserService.parseAppTemplateFile(fileContent) - await rvaluesVarSubstition(application.variables, { self: application.variables }, user) + await rvaluesVarSubstition(application.variables, { self: application.variables }) - return ApplicationTemplateService.updateApplicationTemplateEndPoint(application, name, user, false) + return ApplicationTemplateService.updateApplicationTemplateEndPoint(application, name, false) } -const deleteApplicationTemplateEndPoint = async function (req, user) { +const deleteApplicationTemplateEndPoint = async function (req) { const name = req.params.name - return ApplicationTemplateService.deleteApplicationTemplateEndPoint({ name }, user, false) + return ApplicationTemplateService.deleteApplicationTemplateEndPoint({ name }, false) } module.exports = { diff --git a/src/controllers/catalog-controller.js b/src/controllers/catalog-controller.js index afed875af..dcd35cd57 100644 --- a/src/controllers/catalog-controller.js +++ b/src/controllers/catalog-controller.js @@ -13,24 +13,24 @@ const CatalogService = require('../services/catalog-service') -const createCatalogItemEndPoint = async function (req, user) { - return CatalogService.createCatalogItemEndPoint(req.body, user) +const createCatalogItemEndPoint = async function (req) { + return CatalogService.createCatalogItemEndPoint(req.body) } -const listCatalogItemsEndPoint = async function (req, user) { - return CatalogService.listCatalogItemsEndPoint(user, false) +const listCatalogItemsEndPoint = async function (req) { + return CatalogService.listCatalogItemsEndPoint(false) } -const listCatalogItemEndPoint = async function (req, user) { - return CatalogService.getCatalogItemEndPoint(req.params.id, user, false) +const listCatalogItemEndPoint = async function (req) { + return CatalogService.getCatalogItemEndPoint(req.params.id, false) } -const deleteCatalogItemEndPoint = async function (req, user) { - await CatalogService.deleteCatalogItemEndPoint(req.params.id, user, false) +const deleteCatalogItemEndPoint = async function (req) { + await CatalogService.deleteCatalogItemEndPoint(req.params.id, false) } -const updateCatalogItemEndPoint = async function (req, user) { - await CatalogService.updateCatalogItemEndPoint(req.params.id, req.body, user, false) +const updateCatalogItemEndPoint = async function (req) { + await CatalogService.updateCatalogItemEndPoint(req.params.id, req.body, false) } module.exports = { diff --git a/src/controllers/config-controller.js b/src/controllers/config-controller.js index 0b57a14fc..2b5efd729 100644 --- a/src/controllers/config-controller.js +++ b/src/controllers/config-controller.js @@ -13,16 +13,16 @@ const ConfigService = require('../services/config-service') -const upsertConfigElementEndpoint = async function (req, user) { +const upsertConfigElementEndpoint = async function (req) { const configData = req.body return ConfigService.upsertConfigElement(configData) } -const listConfigEndpoint = async function (user) { +const listConfigEndpoint = async function () { return ConfigService.listConfig() } -const getConfigEndpoint = async function (req, user) { +const getConfigEndpoint = async function (req) { const key = req.params.key return ConfigService.getConfigElement(key) } diff --git a/src/controllers/diagnostic-controller.js b/src/controllers/diagnostic-controller.js index 640ae6642..35d053beb 100644 --- a/src/controllers/diagnostic-controller.js +++ b/src/controllers/diagnostic-controller.js @@ -13,24 +13,24 @@ const DiagnosticService = require('../services/diagnostic-service') -const changeMicroserviceStraceStateEndPoint = async function (req, user) { - return DiagnosticService.changeMicroserviceStraceState(req.params.uuid, req.body, user, false) +const changeMicroserviceStraceStateEndPoint = async function (req) { + return DiagnosticService.changeMicroserviceStraceState(req.params.uuid, req.body, false) } -const getMicroserviceStraceDataEndPoint = async function (req, user) { - return DiagnosticService.getMicroserviceStraceData(req.params.uuid, req.query, user, false) +const getMicroserviceStraceDataEndPoint = async function (req) { + return DiagnosticService.getMicroserviceStraceData(req.params.uuid, req.query, false) } -const postMicroserviceStraceDataToFtpEndPoint = async function (req, user) { - return DiagnosticService.postMicroserviceStraceDatatoFtp(req.params.uuid, req.body, user, false) +const postMicroserviceStraceDataToFtpEndPoint = async function (req) { + return DiagnosticService.postMicroserviceStraceDatatoFtp(req.params.uuid, req.body, false) } -const createMicroserviceImageSnapshotEndPoint = async function (req, user) { - return DiagnosticService.postMicroserviceImageSnapshotCreate(req.params.uuid, user, false) +const createMicroserviceImageSnapshotEndPoint = async function (req) { + return DiagnosticService.postMicroserviceImageSnapshotCreate(req.params.uuid, false) } -const getMicroserviceImageSnapshotEndPoint = async function (req, user) { - return DiagnosticService.getMicroserviceImageSnapshot(req.params.uuid, user, false) +const getMicroserviceImageSnapshotEndPoint = async function (req) { + return DiagnosticService.getMicroserviceImageSnapshot(req.params.uuid, false) } module.exports = { diff --git a/src/controllers/edge-resource-controller.js b/src/controllers/edge-resource-controller.js index f6ca86473..e4ec39658 100644 --- a/src/controllers/edge-resource-controller.js +++ b/src/controllers/edge-resource-controller.js @@ -13,24 +13,24 @@ const EdgeResourceService = require('../services/edge-resource-service') -const createEdgeResourceEndpoint = async function (req, user) { +const createEdgeResourceEndpoint = async function (req) { const edgeResourceData = req.body - return EdgeResourceService.createEdgeResource(edgeResourceData, user) + return EdgeResourceService.createEdgeResource(edgeResourceData) } -const updateEdgeResourceEndpoint = async function (req, user) { +const updateEdgeResourceEndpoint = async function (req) { const edgeResourceData = req.body const { version, name } = req.params - return EdgeResourceService.updateEdgeResourceEndpoint(edgeResourceData, { name, version }, user) + return EdgeResourceService.updateEdgeResourceEndpoint(edgeResourceData, { name, version }) } -const listEdgeResourcesEndpoint = async function (req, user) { - return { edgeResources: await EdgeResourceService.listEdgeResources(user) } +const listEdgeResourcesEndpoint = async function (req) { + return { edgeResources: await EdgeResourceService.listEdgeResources() } } -const getEdgeResourceEndpoint = async function (req, user) { +const getEdgeResourceEndpoint = async function (req) { const { version, name } = req.params - const result = await EdgeResourceService.getEdgeResource({ name, version }, user) + const result = await EdgeResourceService.getEdgeResource({ name, version }) if (version) { return result } else { @@ -38,27 +38,27 @@ const getEdgeResourceEndpoint = async function (req, user) { } } -const getEdgeResourceAllVersionsEndpoint = async function (req, user) { +const getEdgeResourceAllVersionsEndpoint = async function (req) { const { name } = req.params - const result = await EdgeResourceService.getEdgeResource({ name }, user) + const result = await EdgeResourceService.getEdgeResource({ name }) return { edgeResources: result } } -const deleteEdgeResourceEndpoint = async function (req, user) { +const deleteEdgeResourceEndpoint = async function (req) { const { version, name } = req.params - return EdgeResourceService.deleteEdgeResource({ name, version }, user) + return EdgeResourceService.deleteEdgeResource({ name, version }) } -const linkEdgeResourceEndpoint = async function (req, user) { +const linkEdgeResourceEndpoint = async function (req) { const { name, version } = req.params const { uuid } = req.body - return EdgeResourceService.linkEdgeResource({ name, version }, uuid, user) + return EdgeResourceService.linkEdgeResource({ name, version }, uuid) } -const unlinkEdgeResourceEndpoint = async function (req, user) { +const unlinkEdgeResourceEndpoint = async function (req) { const { name, version } = req.params const { uuid } = req.body - return EdgeResourceService.unlinkEdgeResource({ name, version }, uuid, user) + return EdgeResourceService.unlinkEdgeResource({ name, version }, uuid) } module.exports = { diff --git a/src/controllers/iofog-controller.js b/src/controllers/iofog-controller.js index 2a6c793c7..3d2f86ccb 100644 --- a/src/controllers/iofog-controller.js +++ b/src/controllers/iofog-controller.js @@ -14,83 +14,83 @@ const FogService = require('../services/iofog-service') const qs = require('qs') -async function createFogEndPoint (req, user) { +async function createFogEndPoint (req) { const newFog = req.body - return FogService.createFogEndPoint(newFog, user, false) + return FogService.createFogEndPoint(newFog, false) } -async function updateFogEndPoint (req, user) { +async function updateFogEndPoint (req) { const updateFog = req.body updateFog.uuid = req.params.uuid - return FogService.updateFogEndPoint(updateFog, user, false) + return FogService.updateFogEndPoint(updateFog, false) } -async function deleteFogEndPoint (req, user) { +async function deleteFogEndPoint (req) { const deleteFog = { uuid: req.params.uuid } - return FogService.deleteFogEndPoint(deleteFog, user, false) + return FogService.deleteFogEndPoint(deleteFog, false) } -async function getFogEndPoint (req, user) { +async function getFogEndPoint (req) { const getFog = { uuid: req.params.uuid } - return FogService.getFogEndPoint(getFog, user, false) + return FogService.getFogEndPoint(getFog, false) } -async function getFogListEndPoint (req, user) { +async function getFogListEndPoint (req) { const isSystem = req.query && req.query.system ? req.query.system === 'true' : false const query = qs.parse(req.query) - return FogService.getFogListEndPoint(query.filters, user, false, isSystem) + return FogService.getFogListEndPoint(query.filters, false, isSystem) } -async function generateProvisionKeyEndPoint (req, user) { +async function generateProvisionKeyEndPoint (req) { const fog = { uuid: req.params.uuid } - return FogService.generateProvisioningKeyEndPoint(fog, user, false) + return FogService.generateProvisioningKeyEndPoint(fog, false) } -async function setFogVersionCommandEndPoint (req, user) { +async function setFogVersionCommandEndPoint (req) { const fogVersionCommand = { uuid: req.params.uuid, versionCommand: req.params.versionCommand } - return FogService.setFogVersionCommandEndPoint(fogVersionCommand, user, false) + return FogService.setFogVersionCommandEndPoint(fogVersionCommand, false) } -async function setFogRebootCommandEndPoint (req, user) { +async function setFogRebootCommandEndPoint (req) { const fog = { uuid: req.params.uuid } - return FogService.setFogRebootCommandEndPoint(fog, user, false) + return FogService.setFogRebootCommandEndPoint(fog, false) } -async function getHalHardwareInfoEndPoint (req, user) { +async function getHalHardwareInfoEndPoint (req) { const uuidObj = { uuid: req.params.uuid } - return FogService.getHalHardwareInfoEndPoint(uuidObj, user, false) + return FogService.getHalHardwareInfoEndPoint(uuidObj, false) } -async function getHalUsbInfoEndPoint (req, user) { +async function getHalUsbInfoEndPoint (req) { const uuidObj = { uuid: req.params.uuid } - return FogService.getHalUsbInfoEndPoint(uuidObj, user, false) + return FogService.getHalUsbInfoEndPoint(uuidObj, false) } -async function setFogPruneCommandEndPoint (req, user) { +async function setFogPruneCommandEndPoint (req) { const fog = { uuid: req.params.uuid } - return FogService.setFogPruneCommandEndPoint(fog, user, false) + return FogService.setFogPruneCommandEndPoint(fog, false) } module.exports = { diff --git a/src/controllers/microservices-controller.js b/src/controllers/microservices-controller.js index f2ff25531..367c3003e 100644 --- a/src/controllers/microservices-controller.js +++ b/src/controllers/microservices-controller.js @@ -15,108 +15,108 @@ const MicroservicesService = require('../services/microservices-service') const YAMLParserService = require('../services/yaml-parser-service') const { rvaluesVarSubstition } = require('../helpers/template-helper') -const createMicroserviceOnFogEndPoint = async function (req, user) { +const createMicroserviceOnFogEndPoint = async function (req) { const microservice = req.body - return MicroservicesService.createMicroserviceEndPoint(microservice, user, false) + return MicroservicesService.createMicroserviceEndPoint(microservice, false) } -const createMicroserviceYAMLEndPoint = async function (req, user) { +const createMicroserviceYAMLEndPoint = async function (req) { const fileContent = req.file.buffer.toString() const microservice = await YAMLParserService.parseMicroserviceFile(fileContent) - await rvaluesVarSubstition(microservice, { self: microservice }, user) - return MicroservicesService.createMicroserviceEndPoint(microservice, user, false) + await rvaluesVarSubstition(microservice, { self: microservice }) + return MicroservicesService.createMicroserviceEndPoint(microservice, false) } -const getMicroserviceEndPoint = async function (req, user) { +const getMicroserviceEndPoint = async function (req) { const microserviceUuid = req.params.uuid - return MicroservicesService.getMicroserviceEndPoint(microserviceUuid, user, false) + return MicroservicesService.getMicroserviceEndPoint(microserviceUuid, false) } -const updateMicroserviceEndPoint = async function (req, user) { +const updateMicroserviceEndPoint = async function (req) { const microservice = req.body const microserviceUuid = req.params.uuid - return MicroservicesService.updateMicroserviceEndPoint(microserviceUuid, microservice, user, false) + return MicroservicesService.updateMicroserviceEndPoint(microserviceUuid, microservice, false) } -const updateMicroserviceYAMLEndPoint = async function (req, user) { +const updateMicroserviceYAMLEndPoint = async function (req) { const microserviceUuid = req.params.uuid const fileContent = req.file.buffer.toString() const microservice = await YAMLParserService.parseMicroserviceFile(fileContent) - await rvaluesVarSubstition(microservice, { self: microservice }, user) - return MicroservicesService.updateMicroserviceEndPoint(microserviceUuid, microservice, user, false) + await rvaluesVarSubstition(microservice, { self: microservice }) + return MicroservicesService.updateMicroserviceEndPoint(microserviceUuid, microservice, false) } -const deleteMicroserviceEndPoint = async function (req, user) { +const deleteMicroserviceEndPoint = async function (req) { const microserviceUuid = req.params.uuid const microserviceData = req.body || {} - return MicroservicesService.deleteMicroserviceEndPoint(microserviceUuid, microserviceData, user, false) + return MicroservicesService.deleteMicroserviceEndPoint(microserviceUuid, microserviceData, false) } -const getMicroservicesByApplicationEndPoint = async function (req, user) { +const getMicroservicesByApplicationEndPoint = async function (req) { // API Retro compatibility const flowId = req.query.flowId const applicationName = req.query.application - return MicroservicesService.listMicroservicesEndPoint({ applicationName, flowId }, user, false) + return MicroservicesService.listMicroservicesEndPoint({ applicationName, flowId }, false) } -const createMicroserviceRouteEndPoint = async function (req, user) { +const createMicroserviceRouteEndPoint = async function (req) { const sourceUuid = req.params.uuid const destUuid = req.params.receiverUuid - return MicroservicesService.createRouteEndPoint(sourceUuid, destUuid, user, false) + return MicroservicesService.createRouteEndPoint(sourceUuid, destUuid, false) } -const deleteMicroserviceRouteEndPoint = async function (req, user) { +const deleteMicroserviceRouteEndPoint = async function (req) { const sourceUuid = req.params.uuid const destUuid = req.params.receiverUuid - return MicroservicesService.deleteRouteEndPoint(sourceUuid, destUuid, user, false) + return MicroservicesService.deleteRouteEndPoint(sourceUuid, destUuid, false) } -const createMicroservicePortMappingEndPoint = async function (req, user) { +const createMicroservicePortMappingEndPoint = async function (req) { const uuid = req.params.uuid const portMappingData = req.body - return MicroservicesService.createPortMappingEndPoint(uuid, portMappingData, user, false) + return MicroservicesService.createPortMappingEndPoint(uuid, portMappingData, false) } -const deleteMicroservicePortMappingEndPoint = async function (req, user) { +const deleteMicroservicePortMappingEndPoint = async function (req) { const uuid = req.params.uuid const internalPort = req.params.internalPort - return MicroservicesService.deletePortMappingEndPoint(uuid, internalPort, user, false) + return MicroservicesService.deletePortMappingEndPoint(uuid, internalPort, false) } -const listMicroservicePortMappingsEndPoint = async function (req, user) { +const listMicroservicePortMappingsEndPoint = async function (req) { const uuid = req.params.uuid - const ports = await MicroservicesService.listMicroservicePortMappingsEndPoint(uuid, user, false) + const ports = await MicroservicesService.listMicroservicePortMappingsEndPoint(uuid, false) return { ports: ports } } -const createMicroserviceVolumeMappingEndPoint = async function (req, user) { +const createMicroserviceVolumeMappingEndPoint = async function (req) { const microserviceUuid = req.params.uuid const volumeMappingData = req.body - const volumeMapping = await MicroservicesService.createVolumeMappingEndPoint(microserviceUuid, volumeMappingData, user, false) + const volumeMapping = await MicroservicesService.createVolumeMappingEndPoint(microserviceUuid, volumeMappingData, false) return { id: volumeMapping.id } } -const listMicroserviceVolumeMappingsEndPoint = async function (req, user) { +const listMicroserviceVolumeMappingsEndPoint = async function (req) { const uuid = req.params.uuid - const volumeMappings = await MicroservicesService.listVolumeMappingsEndPoint(uuid, user, false) + const volumeMappings = await MicroservicesService.listVolumeMappingsEndPoint(uuid, false) return { volumeMappings: volumeMappings } } -const deleteMicroserviceVolumeMappingEndPoint = async function (req, user) { +const deleteMicroserviceVolumeMappingEndPoint = async function (req) { const uuid = req.params.uuid const id = req.params.id - return MicroservicesService.deleteVolumeMappingEndPoint(uuid, id, user, false) + return MicroservicesService.deleteVolumeMappingEndPoint(uuid, id, false) } -const listAllPublicPortsEndPoint = async function (req, user) { - return MicroservicesService.listAllPublicPortsEndPoint(user) +const listAllPublicPortsEndPoint = async function (req) { + return MicroservicesService.listAllPublicPortsEndPoint() } module.exports = { diff --git a/src/controllers/registry-controller.js b/src/controllers/registry-controller.js index 906db93cf..ab633cb0e 100644 --- a/src/controllers/registry-controller.js +++ b/src/controllers/registry-controller.js @@ -13,26 +13,26 @@ const RegistryService = require('../services/registry-service') -const createRegistryEndPoint = async function (req, user) { +const createRegistryEndPoint = async function (req) { const registry = req.body - return RegistryService.createRegistry(registry, user) + return RegistryService.createRegistry(registry) } -const getRegistriesEndPoint = async function (req, user) { - return RegistryService.findRegistries(user, false) +const getRegistriesEndPoint = async function (req) { + return RegistryService.findRegistries(false) } -const deleteRegistryEndPoint = async function (req, user) { +const deleteRegistryEndPoint = async function (req) { const deleteRegistry = { id: parseInt(req.params.id) } - return RegistryService.deleteRegistry(deleteRegistry, user, false) + return RegistryService.deleteRegistry(deleteRegistry, false) } -const updateRegistryEndPoint = async function (req, user) { +const updateRegistryEndPoint = async function (req) { const registry = req.body const registryId = req.params.id - return RegistryService.updateRegistry(registry, registryId, user, false) + return RegistryService.updateRegistry(registry, registryId, false) } module.exports = { diff --git a/src/controllers/routing-controller.js b/src/controllers/routing-controller.js index 01b5f8ec8..8d6df8bc4 100644 --- a/src/controllers/routing-controller.js +++ b/src/controllers/routing-controller.js @@ -13,32 +13,32 @@ const RoutingService = require('../services/routing-service') -const createRoutingEndpoint = async function (req, user) { +const createRoutingEndpoint = async function (req) { const routerData = req.body - return RoutingService.createRouting(routerData, user, false) + return RoutingService.createRouting(routerData, false) } -const getRoutingsEndPoint = async function (req, user) { - return RoutingService.getRoutings(user, false) +const getRoutingsEndPoint = async function (req) { + return RoutingService.getRoutings(false) } -const getRoutingEndPoint = async function (req, user) { +const getRoutingEndPoint = async function (req) { const routeName = req.params.name const appName = req.params.appName - return RoutingService.getRouting(appName, routeName, user, false) + return RoutingService.getRouting(appName, routeName, false) } -const updateRoutingEndpoint = async function (req, user) { +const updateRoutingEndpoint = async function (req) { const routeName = req.params.name const appName = req.params.appName const routeData = req.body - return RoutingService.updateRouting(appName, routeName, routeData, user, false) + return RoutingService.updateRouting(appName, routeName, routeData, false) } -const deleteRoutingEndpoint = async function (req, user) { +const deleteRoutingEndpoint = async function (req) { const routeName = req.params.name const appName = req.params.appName - return RoutingService.deleteRouting(appName, routeName, user, false) + return RoutingService.deleteRouting(appName, routeName, false) } module.exports = { diff --git a/src/controllers/tunnel-controller.js b/src/controllers/tunnel-controller.js index 7bc0ac9be..fb3ea34c9 100644 --- a/src/controllers/tunnel-controller.js +++ b/src/controllers/tunnel-controller.js @@ -15,7 +15,7 @@ const TunnelService = require('../services/tunnel-service') const Errors = require('../helpers/errors') const ErrorMessages = require('../helpers/error-messages') -const manageTunnelEndPoint = async function (req, user) { +const manageTunnelEndPoint = async function (req) { const action = req.body.action const tunnelData = { iofogUuid: req.params.id @@ -23,21 +23,21 @@ const manageTunnelEndPoint = async function (req, user) { switch (action) { case 'open': - await TunnelService.openTunnel(tunnelData, user, false) + await TunnelService.openTunnel(tunnelData, false) break case 'close': - await TunnelService.closeTunnel(tunnelData, user) + await TunnelService.closeTunnel(tunnelData) break default: throw new Errors.ValidationError(ErrorMessages.INVALID_ACTION_PROPERTY) } } -const getTunnelEndPoint = async function (req, user) { +const getTunnelEndPoint = async function (req) { const tunnelData = { iofogUuid: req.params.id } - return TunnelService.findTunnel(tunnelData, user) + return TunnelService.findTunnel(tunnelData) } module.exports = { diff --git a/src/services/application-service.js b/src/services/application-service.js index a823588f4..c337b9ec2 100644 --- a/src/services/application-service.js +++ b/src/services/application-service.js @@ -28,11 +28,11 @@ const remove = require('lodash/remove') const onlyUnique = (value, index, self) => self.indexOf(value) === index -const createApplicationEndPoint = async function (applicationData, user, isCLI, transaction) { +const createApplicationEndPoint = async function (applicationData, isCLI, transaction) { // if template is provided, use template data if (applicationData.template && applicationData.template.name) { applicationData = { - ...await ApplicationTemplateService.getApplicationDataFromTemplate(applicationData.template, user, isCLI, transaction), + ...await ApplicationTemplateService.getApplicationDataFromTemplate(applicationData.template, isCLI, transaction), isSystem: applicationData.isSystem, name: applicationData.name, description: applicationData.description, @@ -72,13 +72,13 @@ const createApplicationEndPoint = async function (applicationData, user, isCLI, try { if (applicationData.microservices) { for (const msvcData of applicationData.microservices) { - await MicroserviceService.createMicroserviceEndPoint(msvcData, user, isCLI, transaction) + await MicroserviceService.createMicroserviceEndPoint(msvcData, isCLI, transaction) } } if (applicationData.routes) { for (const routeData of applicationData.routes) { - await RoutingService.createRouting(routeData, user, isCLI, transaction) + await RoutingService.createRouting(routeData, isCLI, transaction) } } @@ -88,12 +88,12 @@ const createApplicationEndPoint = async function (applicationData, user, isCLI, } } catch (e) { // If anything failed during creating the application, delete all that was created - await deleteApplicationEndPoint({ name: application.name }, user, isCLI, transaction) + await deleteApplicationEndPoint({ name: application.name }, isCLI, transaction) throw e } } -const deleteApplicationEndPoint = async function (conditions, user, isCLI, transaction) { +const deleteApplicationEndPoint = async function (conditions, isCLI, transaction) { const whereObj = { ...conditions } @@ -105,7 +105,7 @@ const deleteApplicationEndPoint = async function (conditions, user, isCLI, trans } // Only patches the metadata (running, name, description, etc.) -const patchApplicationEndPoint = async function (applicationData, conditions, user, isCLI, transaction) { +const patchApplicationEndPoint = async function (applicationData, conditions, isCLI, transaction) { await Validator.validate(applicationData, Validator.schemas.applicationPatch) const oldApplication = await ApplicationManager.findOne({ ...conditions }, transaction) @@ -137,11 +137,11 @@ const patchApplicationEndPoint = async function (applicationData, conditions, us } // Updates the state (microservices, routes, etc.) -const updateApplicationEndPoint = async function (applicationData, name, user, isCLI, transaction) { +const updateApplicationEndPoint = async function (applicationData, name, isCLI, transaction) { // if template is provided, use template data if (applicationData.template && applicationData.template.name) { applicationData = { - ...await ApplicationTemplateService.getApplicationDataFromTemplate(applicationData.template, user, isCLI, transaction), + ...await ApplicationTemplateService.getApplicationDataFromTemplate(applicationData.template, isCLI, transaction), isSystem: applicationData.isSystem, name: applicationData.name || name, description: applicationData.description, @@ -188,10 +188,10 @@ const updateApplicationEndPoint = async function (applicationData, name, user, i await ApplicationManager.update(where, updateApplicationData, transaction) if (applicationData.microservices) { - await _updateMicroservices(application.name, applicationData.microservices, user, isCLI, transaction) + await _updateMicroservices(application.name, applicationData.microservices, isCLI, transaction) } if (applicationData.routes) { - await _updateRoutes(application.name, applicationData.routes, user, isCLI, transaction) + await _updateRoutes(application.name, applicationData.routes, isCLI, transaction) } if (oldApplication.isActivated !== applicationData.isActivated) { @@ -199,7 +199,7 @@ const updateApplicationEndPoint = async function (applicationData, name, user, i } } -const _updateRoutes = async function (application, routes, user, isCLI, transaction) { +const _updateRoutes = async function (application, routes, isCLI, transaction) { // Update routes const updatedRoutes = [...routes] const oldRoutes = await ApplicationManager.findApplicationRoutes({ name: application }, transaction) @@ -209,19 +209,19 @@ const _updateRoutes = async function (application, routes, user, isCLI, transact for (const oldRoute of oldRoutes) { const removed = remove(updatedRoutes, (n) => oldRoute.name === n.name) if (!removed.length) { - await RoutingService.deleteRouting(oldRoute.name, user, isCLI, transaction) + await RoutingService.deleteRouting(oldRoute.name, isCLI, transaction) } else { const updatedRoute = removed[0] - await RoutingService.updateRouting(application, updatedRoute.name, updatedRoute, user, isCLI, transaction) + await RoutingService.updateRouting(application, updatedRoute.name, updatedRoute, isCLI, transaction) } } // Create missing routes for (const route of updatedRoutes) { - await RoutingService.createRouting(route, user, isCLI, transaction) + await RoutingService.createRouting(route, isCLI, transaction) } } -const _updateMicroservices = async function (application, microservices, user, isCLI, transaction) { +const _updateMicroservices = async function (application, microservices, isCLI, transaction) { const updatedMicroservices = [...microservices] // Update microservices const oldMicroservices = await ApplicationManager.findApplicationMicroservices({ name: application }, transaction) @@ -238,14 +238,14 @@ const _updateMicroservices = async function (application, microservices, user, i iofogUuids.push(oldMsvc.iofogUuid) } else { const updatedMsvc = removed[0] - const updatedMicroservices = await MicroserviceService.updateMicroserviceEndPoint(oldMsvc.uuid, updatedMsvc, user, isCLI, transaction, false) + const updatedMicroservices = await MicroserviceService.updateMicroserviceEndPoint(oldMsvc.uuid, updatedMsvc, isCLI, transaction, false) oldMsvcsIofogUuids.push(updatedMicroservices.microserviceIofogUuid) updatedMsvcsUuid.push(updatedMicroservices.updatedMicroserviceIofogUuid) } } // Create missing microservices for (const microservice of updatedMicroservices) { - await MicroserviceService.createMicroserviceEndPoint(microservice, user, isCLI, transaction) + await MicroserviceService.createMicroserviceEndPoint(microservice, isCLI, transaction) } iofogUuids .filter(onlyUnique) @@ -270,7 +270,7 @@ const _updateMicroservices = async function (application, microservices, user, i }) } -const getUserApplicationsEndPoint = async function (user, isCLI, transaction) { +const getUserApplicationsEndPoint = async function (isCLI, transaction) { const application = { isSystem: false } @@ -300,7 +300,7 @@ async function _buildApplicationObject (application, transaction) { return application } -async function getApplication (conditions, user, isCLI, transaction) { +async function getApplication (conditions, isCLI, transaction) { const where = isCLI ? { ...conditions } : { ...conditions } @@ -314,8 +314,8 @@ async function getApplication (conditions, user, isCLI, transaction) { return application } -const getApplicationEndPoint = async function (conditions, user, isCLI, transaction) { - const application = await getApplication(conditions, user, isCLI, transaction) +const getApplicationEndPoint = async function (conditions, isCLI, transaction) { + const application = await getApplication(conditions, isCLI, transaction) return application } diff --git a/src/services/application-template-service.js b/src/services/application-template-service.js index 8fa309cb2..df68d89c2 100644 --- a/src/services/application-template-service.js +++ b/src/services/application-template-service.js @@ -24,7 +24,7 @@ const ApplicationTemplateVariableManager = require('../data/managers/application const TransactionDecorator = require('../decorators/transaction-decorator') const Validator = require('../schemas') -const createApplicationTemplateEndPoint = async function (applicationTemplateData, user, isCLI, transaction) { +const createApplicationTemplateEndPoint = async function (applicationTemplateData, isCLI, transaction) { // Add a name field to pass schema validation using the applicationCreate schema applicationTemplateData.application = { ...applicationTemplateData.application, name: 'validation' } await Validator.validate(applicationTemplateData, Validator.schemas.applicationTemplateCreate) @@ -56,12 +56,12 @@ const createApplicationTemplateEndPoint = async function (applicationTemplateDat } } catch (e) { // If anything failed during creating the application, delete all that was created - await deleteApplicationTemplateEndPoint({ name: applicationTemplate.name }, user, isCLI, transaction) + await deleteApplicationTemplateEndPoint({ name: applicationTemplate.name }, isCLI, transaction) throw e } } -const deleteApplicationTemplateEndPoint = async function (conditions, user, isCLI, transaction) { +const deleteApplicationTemplateEndPoint = async function (conditions, isCLI, transaction) { const whereObj = { ...conditions } @@ -70,7 +70,7 @@ const deleteApplicationTemplateEndPoint = async function (conditions, user, isCL await ApplicationTemplateManager.delete(where, transaction) } -const patchApplicationTemplateEndPoint = async function (applicationTemplateData, conditions, user, isCLI, transaction) { +const patchApplicationTemplateEndPoint = async function (applicationTemplateData, conditions, isCLI, transaction) { await Validator.validate(applicationTemplateData, Validator.schemas.applicationTemplatePatch) const oldApplicationTemplate = await ApplicationTemplateManager.findOne({ ...conditions }, transaction) @@ -95,7 +95,7 @@ const patchApplicationTemplateEndPoint = async function (applicationTemplateData await ApplicationTemplateManager.update(where, updateApplicationTemplateData, transaction) } -const updateApplicationTemplateEndPoint = async function (applicationTemplateData, name, user, isCLI, transaction) { +const updateApplicationTemplateEndPoint = async function (applicationTemplateData, name, isCLI, transaction) { // Add a name field to pass schema validation using the applicationCreate schema applicationTemplateData.application = { ...applicationTemplateData.application, name: 'validation' } await Validator.validate(applicationTemplateData, Validator.schemas.applicationTemplateUpdate) @@ -105,7 +105,7 @@ const updateApplicationTemplateEndPoint = async function (applicationTemplateDat const oldApplicationTemplate = await ApplicationTemplateManager.findOne({ name }, transaction) if (!oldApplicationTemplate) { - return createApplicationTemplateEndPoint({ ...applicationTemplateData, name }, user, isCLI, transaction) + return createApplicationTemplateEndPoint({ ...applicationTemplateData, name }, isCLI, transaction) } if (applicationTemplateData.name) { await _checkForDuplicateName(applicationTemplateData.name, oldApplicationTemplate.id, transaction) @@ -124,7 +124,7 @@ const updateApplicationTemplateEndPoint = async function (applicationTemplateDat await ApplicationTemplateManager.update(where, updateApplicationTemplateData, transaction) if (applicationTemplateData.variables) { - await _updateVariables(oldApplicationTemplate.id, applicationTemplateData.variables, user, isCLI, transaction) + await _updateVariables(oldApplicationTemplate.id, applicationTemplateData.variables, isCLI, transaction) } return { @@ -146,14 +146,14 @@ const _createVariable = async function (applicationTemplateId, variableData, tra return ApplicationTemplateVariableManager.create({ ...newVariable, applicationTemplateId }, transaction) } -const _updateVariables = async function (applicationTemplateId, variables, user, isCLI, transaction) { +const _updateVariables = async function (applicationTemplateId, variables, isCLI, transaction) { await ApplicationTemplateVariableManager.delete({ applicationTemplateId }, transaction) for (const variableData of variables) { await _createVariable(applicationTemplateId, variableData, transaction) } } -const getUserApplicationTemplatesEndPoint = async function (user, isCLI, transaction) { +const getUserApplicationTemplatesEndPoint = async function (isCLI, transaction) { const application = { } @@ -187,7 +187,7 @@ const getAllApplicationTemplatesEndPoint = async function (isCLI, transaction) { } } -async function getApplicationTemplate (conditions, user, isCLI, transaction) { +async function getApplicationTemplate (conditions, isCLI, transaction) { const where = isCLI ? { ...conditions } : { ...conditions } @@ -200,11 +200,11 @@ async function getApplicationTemplate (conditions, user, isCLI, transaction) { return _buildGetApplicationObj(application) } -const getApplicationTemplateEndPoint = async function (name, user, isCLI, transaction) { - return getApplicationTemplate(name, user, isCLI, transaction) +const getApplicationTemplateEndPoint = async function (name, isCLI, transaction) { + return getApplicationTemplate(name, isCLI, transaction) } -const getApplicationDataFromTemplate = async function (deploymentData, user, isCLI, transaction) { +const getApplicationDataFromTemplate = async function (deploymentData, isCLI, transaction) { await Validator.validate(deploymentData, Validator.schemas.applicationTemplateDeploy) const applicationTemplateDBObject = await ApplicationTemplateManager.findOnePopulated({ name: deploymentData.name }, transaction) @@ -236,7 +236,7 @@ const getApplicationDataFromTemplate = async function (deploymentData, user, isC } // default values are overwritten by user defined values, and self is always overwritten to the current object - await rvaluesVarSubstition(newApplication, { ...defaultVariablesValues, ...userProvidedVariables, self: newApplication }, user) + await rvaluesVarSubstition(newApplication, { ...defaultVariablesValues, ...userProvidedVariables, self: newApplication }) for (const msvc of newApplication.microservices) { // Send it back as a string for application creation and validation diff --git a/src/services/catalog-service.js b/src/services/catalog-service.js index 9b7a07a77..a6c0da298 100644 --- a/src/services/catalog-service.js +++ b/src/services/catalog-service.js @@ -26,11 +26,11 @@ const RegistryManager = require('../data/managers/registry-manager') const MicroserviceManager = require('../data/managers/microservice-manager') const MicroseriveStates = require('../enums/microservice-state') -const createCatalogItemEndPoint = async function (data, user, transaction) { +const createCatalogItemEndPoint = async function (data, transaction) { await Validator.validate(data, Validator.schemas.catalogItemCreate) await _checkForDuplicateName(data.name, transaction) await _checkForRestrictedPublisher(data.publisher) - const catalogItem = await _createCatalogItem(data, user, transaction) + const catalogItem = await _createCatalogItem(data, transaction) await _createCatalogImages(data, catalogItem, transaction) await _createCatalogItemInputType(data, catalogItem, transaction) await _createCatalogItemOutputType(data, catalogItem, transaction) @@ -40,7 +40,7 @@ const createCatalogItemEndPoint = async function (data, user, transaction) { } } -const updateCatalogItemEndPoint = async function (id, data, user, isCLI, transaction) { +const updateCatalogItemEndPoint = async function (id, data, isCLI, transaction) { await Validator.validate(data, Validator.schemas.catalogItemUpdate) const where = isCLI @@ -57,7 +57,7 @@ const updateCatalogItemEndPoint = async function (id, data, user, isCLI, transac await _updateCatalogItemIOTypes(data, where, transaction) } -const listCatalogItemsEndPoint = async function (user, isCLI, transaction) { +const listCatalogItemsEndPoint = async function (isCLI, transaction) { const where = isCLI ? {} : { @@ -74,7 +74,7 @@ const listCatalogItemsEndPoint = async function (user, isCLI, transaction) { } } -async function getCatalogItem (id, user, isCLI, transaction) { +async function getCatalogItem (id, isCLI, transaction) { const where = isCLI ? { id: id } : { @@ -93,11 +93,11 @@ async function getCatalogItem (id, user, isCLI, transaction) { return item } -const getCatalogItemEndPoint = async function (id, user, isCLI, transaction) { - return getCatalogItem(id, user, isCLI, transaction) +const getCatalogItemEndPoint = async function (id, isCLI, transaction) { + return getCatalogItem(id, isCLI, transaction) } -const deleteCatalogItemEndPoint = async function (id, user, isCLI, transaction) { +const deleteCatalogItemEndPoint = async function (id, isCLI, transaction) { const where = isCLI ? { id: id @@ -200,7 +200,7 @@ const _checkIfItemExists = async function (where, transaction) { return item } -const _createCatalogItem = async function (data, user, transaction) { +const _createCatalogItem = async function (data, transaction) { let catalogItem = { name: data.name, description: data.description, diff --git a/src/services/diagnostic-service.js b/src/services/diagnostic-service.js index 0b8502a12..f138683cc 100644 --- a/src/services/diagnostic-service.js +++ b/src/services/diagnostic-service.js @@ -26,9 +26,9 @@ const logger = require('../logger') const FtpClient = require('ftp') const mime = require('mime') -const changeMicroserviceStraceState = async function (uuid, data, user, isCLI, transaction) { +const changeMicroserviceStraceState = async function (uuid, data, isCLI, transaction) { await Validator.validate(data, Validator.schemas.straceStateUpdate) - const microservice = await MicroserviceService.getMicroserviceEndPoint(uuid, user, isCLI, transaction) + const microservice = await MicroserviceService.getMicroserviceEndPoint(uuid, isCLI, transaction) if (microservice.iofogUuid === null) { throw new Errors.ValidationError(ErrorMessages.STRACE_WITHOUT_FOG) } @@ -42,7 +42,7 @@ const changeMicroserviceStraceState = async function (uuid, data, user, isCLI, t await ChangeTrackingService.update(microservice.iofogUuid, ChangeTrackingService.events.diagnostics, transaction) } -const getMicroserviceStraceData = async function (uuid, data, user, isCLI, transaction) { +const getMicroserviceStraceData = async function (uuid, data, isCLI, transaction) { await Validator.validate(data, Validator.schemas.straceGetData) const microserviceWhere = isCLI @@ -75,7 +75,7 @@ const getMicroserviceStraceData = async function (uuid, data, user, isCLI, trans } } -const postMicroserviceStraceDatatoFtp = async function (uuid, data, user, isCLI, transaction) { +const postMicroserviceStraceDatatoFtp = async function (uuid, data, isCLI, transaction) { await Validator.validate(data, Validator.schemas.stracePostToFtp) const microserviceWhere = isCLI @@ -100,7 +100,7 @@ const postMicroserviceStraceDatatoFtp = async function (uuid, data, user, isCLI, _deleteFile(filePath) } -const postMicroserviceImageSnapshotCreate = async function (microserviceUuid, user, isCLI, transaction) { +const postMicroserviceImageSnapshotCreate = async function (microserviceUuid, isCLI, transaction) { const where = isCLI ? { uuid: microserviceUuid @@ -126,7 +126,7 @@ const postMicroserviceImageSnapshotCreate = async function (microserviceUuid, us await ChangeTrackingService.update(microservice.iofogUuid, ChangeTrackingService.events.imageSnapshot, transaction) } -const getMicroserviceImageSnapshot = async function (microserviceUuid, user, isCLI, transaction) { +const getMicroserviceImageSnapshot = async function (microserviceUuid, isCLI, transaction) { const where = isCLI ? { uuid: microserviceUuid diff --git a/src/services/edge-resource-service.js b/src/services/edge-resource-service.js index 750e040a7..dfa5052d5 100644 --- a/src/services/edge-resource-service.js +++ b/src/services/edge-resource-service.js @@ -155,7 +155,7 @@ async function _updateOrchestrationTags (tagArray, edgeResourceModel, transactio } } -async function createEdgeResource (edgeResourceData, user, transaction) { +async function createEdgeResource (edgeResourceData, transaction) { await Validator.validate(edgeResourceData, Validator.schemas.edgeResourceCreate) const { name, description, version, orchestrationTags, interfaceProtocol, display, custom } = edgeResourceData const existingResource = await EdgeResourceManager.findOne({ name, version }, transaction) @@ -192,7 +192,7 @@ async function createEdgeResource (edgeResourceData, user, transaction) { return buildGetObject(resource) } -async function updateEdgeResourceEndpoint (edgeResourceData, { name: oldName, version }, user, transaction) { +async function updateEdgeResourceEndpoint (edgeResourceData, { name: oldName, version }, transaction) { await Validator.validate(edgeResourceData, Validator.schemas.edgeResourceUpdate) const oldData = await EdgeResourceManager.findOne({ name: oldName, version }, transaction) if (!oldData) { @@ -202,7 +202,7 @@ async function updateEdgeResourceEndpoint (edgeResourceData, { name: oldName, ve if (!edgeResourceData.version) { edgeResourceData.version = version } - return createEdgeResource(edgeResourceData, user, transaction) + return createEdgeResource(edgeResourceData, transaction) } if (edgeResourceData.version && oldData.version !== edgeResourceData.version) { throw new Errors.ValidationError(AppHelper.formatMessage(ErrorMessages.RESOURCE_UPDATE_VERSION_MISMATCH)) @@ -244,7 +244,7 @@ async function updateEdgeResourceEndpoint (edgeResourceData, { name: oldName, ve } } -async function deleteEdgeResource ({ name, version }, user, transaction) { +async function deleteEdgeResource ({ name, version }, transaction) { const resource = await EdgeResourceManager.findOne({ name, version }, transaction) if (!resource) { throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.NOT_FOUND_RESOURCE_NAME_VERSION, name, version)) @@ -258,7 +258,7 @@ async function deleteEdgeResource ({ name, version }, user, transaction) { await EdgeResourceManager.delete({ name, version }, transaction) } -async function linkEdgeResource ({ name, version }, uuid, user, transaction) { +async function linkEdgeResource ({ name, version }, uuid, transaction) { const resource = await EdgeResourceManager.findOne({ name, version }, transaction) if (!resource) { throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.NOT_FOUND_RESOURCE_NAME_VERSION, name, version)) @@ -274,7 +274,7 @@ async function linkEdgeResource ({ name, version }, uuid, user, transaction) { await ChangeTrackingService.update(agent.uuid, ChangeTrackingService.events.edgeResources, transaction) } -async function unlinkEdgeResource ({ name, version }, uuid, user, transaction) { +async function unlinkEdgeResource ({ name, version }, uuid, transaction) { const resource = await EdgeResourceManager.findOne({ name, version }, transaction) if (!resource) { throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.NOT_FOUND_RESOURCE_NAME_VERSION, name, version)) diff --git a/src/services/iofog-service.js b/src/services/iofog-service.js index 06b1fce95..a162b3e8e 100644 --- a/src/services/iofog-service.js +++ b/src/services/iofog-service.js @@ -35,7 +35,7 @@ const Constants = require('../helpers/constants') const Op = require('sequelize').Op const lget = require('lodash/get') -async function createFogEndPoint (fogData, user, isCLI, transaction) { +async function createFogEndPoint (fogData, isCLI, transaction) { await Validator.validate(fogData, Validator.schemas.iofogCreate) let createFogData = { @@ -119,11 +119,11 @@ async function createFogEndPoint (fogData, user, isCLI, transaction) { await ChangeTrackingService.create(fog.uuid, transaction) if (fogData.abstractedHardwareEnabled) { - await _createHalMicroserviceForFog(fog, null, user, transaction) + await _createHalMicroserviceForFog(fog, null, transaction) } if (fogData.bluetoothEnabled) { - await _createBluetoothMicroserviceForFog(fog, null, user, transaction) + await _createBluetoothMicroserviceForFog(fog, null, transaction) } await ChangeTrackingService.update(createFogData.uuid, ChangeTrackingService.events.microserviceCommon, transaction) @@ -145,7 +145,7 @@ async function _setTags (fogModel, tagsArray, transaction) { } } -async function updateFogEndPoint (fogData, user, isCLI, transaction) { +async function updateFogEndPoint (fogData, isCLI, transaction) { await Validator.validate(fogData, Validator.schemas.iofogUpdate) const queryFogData = { uuid: fogData.uuid } @@ -268,7 +268,7 @@ async function updateFogEndPoint (fogData, user, isCLI, transaction) { msChanged = true } if (oldFog.abstractedHardwareEnabled === false && fogData.abstractedHardwareEnabled === true) { - await _createHalMicroserviceForFog(fogData, oldFog, user, transaction) + await _createHalMicroserviceForFog(fogData, oldFog, transaction) msChanged = true } @@ -277,7 +277,7 @@ async function updateFogEndPoint (fogData, user, isCLI, transaction) { msChanged = true } if (oldFog.bluetoothEnabled === false && fogData.bluetoothEnabled === true) { - await _createBluetoothMicroserviceForFog(fogData, oldFog, user, transaction) + await _createBluetoothMicroserviceForFog(fogData, oldFog, transaction) msChanged = true } @@ -359,7 +359,7 @@ async function _deleteFogRouter (fogData, transaction) { await MicroserviceManager.delete({ catalogItemId: routerCatalog.id, iofogUuid: fogData.uuid }, transaction) } -async function deleteFogEndPoint (fogData, user, isCLI, transaction) { +async function deleteFogEndPoint (fogData, isCLI, transaction) { await Validator.validate(fogData, Validator.schemas.iofogDelete) const queryFogData = { uuid: fogData.uuid } @@ -442,7 +442,7 @@ function _mapTags (fog) { return fog.tags ? fog.tags.map(t => t.value) : [] } -async function getFog (fogData, user, isCLI, transaction) { +async function getFog (fogData, isCLI, transaction) { await Validator.validate(fogData, Validator.schemas.iofogGet) const queryFogData = fogData.uuid ? { uuid: fogData.uuid } : { name: fogData.name } @@ -460,15 +460,15 @@ async function getFog (fogData, user, isCLI, transaction) { return _getFogExtraInformation(fog, transaction) } -async function getFogEndPoint (fogData, user, isCLI, transaction) { - return getFog(fogData, user, isCLI, transaction) +async function getFogEndPoint (fogData, isCLI, transaction) { + return getFog(fogData, isCLI, transaction) } -async function getFogListEndPoint (filters, user, isCLI, isSystem, transaction) { +async function getFogListEndPoint (filters, isCLI, isSystem, transaction) { await Validator.validate(filters, Validator.schemas.iofogFilters) // If listing system agent through REST API, make sure user is authenticated - if (isSystem && !isCLI && !lget(user, 'id')) { + if (isSystem && !isCLI && !lget('id')) { throw new Errors.AuthenticationError('Unauthorized') } @@ -485,7 +485,7 @@ async function getFogListEndPoint (filters, user, isCLI, isSystem, transaction) } } -async function generateProvisioningKeyEndPoint (fogData, user, isCLI, transaction) { +async function generateProvisioningKeyEndPoint (fogData, isCLI, transaction) { await Validator.validate(fogData, Validator.schemas.iofogGenerateProvision) const queryFogData = { uuid: fogData.uuid } @@ -514,7 +514,7 @@ async function generateProvisioningKeyEndPoint (fogData, user, isCLI, transactio } } -async function setFogVersionCommandEndPoint (fogVersionData, user, isCLI, transaction) { +async function setFogVersionCommandEndPoint (fogVersionData, isCLI, transaction) { await Validator.validate(fogVersionData, Validator.schemas.iofogSetVersionCommand) const queryFogData = { uuid: fogVersionData.uuid } @@ -541,12 +541,12 @@ async function setFogVersionCommandEndPoint (fogVersionData, user, isCLI, transa throw new Errors.ValidationError(ErrorMessages.INVALID_VERSION_COMMAND_UPGRADE) } - await generateProvisioningKeyEndPoint({ uuid: fogVersionData.uuid }, user, isCLI, transaction) + await generateProvisioningKeyEndPoint({ uuid: fogVersionData.uuid }, isCLI, transaction) await FogVersionCommandManager.updateOrCreate({ iofogUuid: fogVersionData.uuid }, newVersionCommand, transaction) await ChangeTrackingService.update(fogVersionData.uuid, ChangeTrackingService.events.version, transaction) } -async function setFogRebootCommandEndPoint (fogData, user, isCLI, transaction) { +async function setFogRebootCommandEndPoint (fogData, isCLI, transaction) { await Validator.validate(fogData, Validator.schemas.iofogReboot) const queryFogData = { uuid: fogData.uuid } @@ -564,7 +564,7 @@ async function setFogRebootCommandEndPoint (fogData, user, isCLI, transaction) { await ChangeTrackingService.update(fogData.uuid, ChangeTrackingService.events.reboot, transaction) } -async function getHalHardwareInfoEndPoint (uuidObj, user, isCLI, transaction) { +async function getHalHardwareInfoEndPoint (uuidObj, isCLI, transaction) { await Validator.validate(uuidObj, Validator.schemas.halGet) const fog = await FogManager.findOne({ @@ -584,7 +584,7 @@ async function getHalHardwareInfoEndPoint (uuidObj, user, isCLI, transaction) { }, transaction) } -async function getHalUsbInfoEndPoint (uuidObj, user, isCLI, transaction) { +async function getHalUsbInfoEndPoint (uuidObj, isCLI, transaction) { await Validator.validate(uuidObj, Validator.schemas.halGet) const fog = await FogManager.findOne({ @@ -640,7 +640,7 @@ async function _processDeleteCommand (fog, transaction) { await FogManager.delete({ uuid: fog.uuid }, transaction) } -async function _createHalMicroserviceForFog (fogData, oldFog, user, transaction) { +async function _createHalMicroserviceForFog (fogData, oldFog, transaction) { const halItem = await CatalogService.getHalCatalogItem(transaction) const halMicroserviceData = { @@ -667,7 +667,7 @@ async function _deleteHalMicroserviceByFog (fogData, transaction) { await MicroserviceManager.delete(deleteHalMicroserviceData, transaction) } -async function _createBluetoothMicroserviceForFog (fogData, oldFog, user, transaction) { +async function _createBluetoothMicroserviceForFog (fogData, oldFog, transaction) { const bluetoothItem = await CatalogService.getBluetoothCatalogItem(transaction) const bluetoothMicroserviceData = { @@ -694,7 +694,7 @@ async function _deleteBluetoothMicroserviceByFog (fogData, transaction) { await MicroserviceManager.delete(deleteBluetoothMicroserviceData, transaction) } -async function setFogPruneCommandEndPoint (fogData, user, isCLI, transaction) { +async function setFogPruneCommandEndPoint (fogData, isCLI, transaction) { await Validator.validate(fogData, Validator.schemas.iofogPrune) const queryFogData = { uuid: fogData.uuid } diff --git a/src/services/microservice-ports/default.js b/src/services/microservice-ports/default.js index 8ca6ac690..07b504909 100644 --- a/src/services/microservice-ports/default.js +++ b/src/services/microservice-ports/default.js @@ -180,11 +180,11 @@ async function validatePublicPortAppHostTemplate (extraHost, templateArgs, msvc, throw new Errors.ValidationError(AppHelper.formatMessage(ErrorMessages.NOT_FOUND_HOST_TEMPLATE, templateArgs[4])) } -async function movePublicPortsToNewFog (updatedMicroservice, user, transaction) { +async function movePublicPortsToNewFog (updatedMicroservice, transaction) { const portMappings = await updatedMicroservice.getPorts() for (const portMapping of portMappings) { if (portMapping.isProxy) { - Proxy.moveProxyPortsToNewFog(updatedMicroservice, portMapping, user, transaction) + Proxy.moveProxyPortsToNewFog(updatedMicroservice, portMapping, transaction) continue } else if (!portMapping.isPublic) { continue @@ -201,13 +201,13 @@ async function movePublicPortsToNewFog (updatedMicroservice, user, transaction) host: destAgentsRouter.host, port: destAgentsRouter.messagingPort } - const newProxy = await _createOrUpdateProxyMicroservice(localMapping, networkRouter, updatedMicroservice.iofogUuid, localProxy.catalogItemId, user, transaction) + const newProxy = await _createOrUpdateProxyMicroservice(localMapping, networkRouter, updatedMicroservice.iofogUuid, localProxy.catalogItemId, transaction) publicPort.localProxyId = newProxy.uuid await MicroservicePublicPortManager.updateOrCreate({ id: publicPort.id }, publicPort.toJSON(), transaction) } } -async function createPortMapping (microservice, portMappingData, user, transaction) { +async function createPortMapping (microservice, portMappingData, transaction) { if (!microservice.iofogUuid) { throw new Errors.ValidationError(AppHelper.formatMessage(ErrorMessages.REQUIRED_FOG_NODE)) } @@ -231,15 +231,15 @@ async function createPortMapping (microservice, portMappingData, user, transacti portMappingData.protocol = portMappingData.protocol || '' if (portMappingData.public) { - return _createPublicPortMapping(microservice, portMappingData, user, transaction) + return _createPublicPortMapping(microservice, portMappingData, transaction) } else if (portMappingData.proxy) { - return Proxy.createProxyPortMapping(microservice, portMappingData, user, transaction) + return Proxy.createProxyPortMapping(microservice, portMappingData, transaction) } else { - return _createSimplePortMapping(microservice, portMappingData, user, transaction) + return _createSimplePortMapping(microservice, portMappingData, transaction) } } -async function _createOrUpdateProxyMicroservice (mapping, networkRouter, hostUuid, proxyCatalogId, user, transaction) { +async function _createOrUpdateProxyMicroservice (mapping, networkRouter, hostUuid, proxyCatalogId, transaction) { const existingProxy = await MicroserviceManager.findOne({ catalogItemId: proxyCatalogId, iofogUuid: hostUuid }, transaction) if (existingProxy) { const config = JSON.parse(existingProxy.config || '{}') @@ -267,7 +267,7 @@ async function _createOrUpdateProxyMicroservice (mapping, networkRouter, hostUui return res } -async function _createPublicPortMapping (microservice, portMappingData, user, transaction) { +async function _createPublicPortMapping (microservice, portMappingData, transaction) { const isTcp = portMappingData.public.protocol ? portMappingData.public.protocol.toLowerCase() === 'tcp' : false const isUdp = portMappingData.protocol.toLowerCase() === 'udp' const localAgent = portMappingData.localAgent // This is populated by validating the ports @@ -289,7 +289,6 @@ async function _createPublicPortMapping (microservice, portMappingData, user, tr localNetworkRouter, microservice.iofogUuid, proxyCatalog.id, - user, transaction) : null @@ -307,7 +306,6 @@ async function _createPublicPortMapping (microservice, portMappingData, user, tr remoteNetworkRouter, portMappingData.publicHost.uuid, proxyCatalog.id, - user, transaction) : null } @@ -345,13 +343,13 @@ async function _createPublicPortMapping (microservice, portMappingData, user, tr } } -async function _deletePortMapping (microservice, portMapping, user, transaction) { +async function _deletePortMapping (microservice, portMapping, transaction) { if (portMapping.isPublic) { await _deletePublicPortMapping(microservice, portMapping, transaction) } else if (portMapping.isProxy) { - return Proxy.deleteProxyPortMapping(microservice, portMapping, user, transaction) + return Proxy.deleteProxyPortMapping(microservice, portMapping, transaction) } else { - await _deleteSimplePortMapping(microservice, portMapping, user, transaction) + await _deleteSimplePortMapping(microservice, portMapping, transaction) } } @@ -386,7 +384,7 @@ async function _deletePublicPortMapping (microservice, portMapping, transaction) await MicroservicePortManager.delete({ id: portMapping.id }, transaction) } -async function _createSimplePortMapping (microservice, portMappingData, user, transaction) { +async function _createSimplePortMapping (microservice, portMappingData, transaction) { // create port mapping const mappingData = { isPublic: false, @@ -401,7 +399,7 @@ async function _createSimplePortMapping (microservice, portMappingData, user, tr await switchOnUpdateFlagsForMicroservicesForPortMapping(microservice, false, transaction) } -async function _deleteSimplePortMapping (microservice, msPorts, user, transaction) { +async function _deleteSimplePortMapping (microservice, msPorts, transaction) { await MicroservicePortManager.delete({ id: msPorts.id }, transaction) const updateRebuildMs = { @@ -470,7 +468,7 @@ async function switchOnUpdateFlagsForMicroservicesForPortMapping (microservice, } } -async function listPortMappings (microserviceUuid, user, isCLI, transaction) { +async function listPortMappings (microserviceUuid, isCLI, transaction) { const where = isCLI ? { uuid: microserviceUuid } : { uuid: microserviceUuid } @@ -483,7 +481,7 @@ async function listPortMappings (microserviceUuid, user, isCLI, transaction) { return _buildPortsList(portsPairs, transaction) } -async function deletePortMapping (microserviceUuid, internalPort, user, isCLI, transaction) { +async function deletePortMapping (microserviceUuid, internalPort, isCLI, transaction) { const where = isCLI ? { uuid: microserviceUuid } : { uuid: microserviceUuid } @@ -505,13 +503,13 @@ async function deletePortMapping (microserviceUuid, internalPort, user, isCLI, t throw new Errors.NotFoundError('port mapping not exists') } - await _deletePortMapping(microservice, msPorts, user, transaction) + await _deletePortMapping(microservice, msPorts, transaction) } -async function deletePortMappings (microservice, user, transaction) { +async function deletePortMappings (microservice, transaction) { const portMappings = await MicroservicePortManager.findAll({ microserviceUuid: microservice.uuid }, transaction) for (const ports of portMappings) { - await _deletePortMapping(microservice, ports, user, transaction) + await _deletePortMapping(microservice, ports, transaction) } } @@ -519,7 +517,7 @@ async function getPortMappings (microserviceUuid, transaction) { return MicroservicePortManager.findAll({ microserviceUuid }, transaction) } -function listAllPublicPorts (user, transaction) { +function listAllPublicPorts (transaction) { return MicroservicePortManager.findAllPublicPorts(transaction) } diff --git a/src/services/microservice-ports/proxy.js b/src/services/microservice-ports/proxy.js index 0a7e2dab2..d16a31f63 100644 --- a/src/services/microservice-ports/proxy.js +++ b/src/services/microservice-ports/proxy.js @@ -20,7 +20,7 @@ const MicroservicePortManager = require('../../data/managers/microservice-port-m const MicroserviceProxyPortManager = require('../../data/managers/microservice-proxy-port-manager') const ProxyBrokerClient = require('../../helpers/proxy-broker-client') -async function _createOrUpdatePortRouterMicroservice (existingProxy, localPort, protocol, portRouterServerConfig, hostUuid, portRouterCatalogId, microserviceUuid, user, transaction) { +async function _createOrUpdatePortRouterMicroservice (existingProxy, localPort, protocol, portRouterServerConfig, hostUuid, portRouterCatalogId, microserviceUuid, transaction) { const proxyConfig = { name: `${microserviceUuid}_${localPort}`, server_addr: portRouterServerConfig.host, @@ -59,7 +59,7 @@ async function _createOrUpdatePortRouterMicroservice (existingProxy, localPort, return res } -async function createProxyPortMapping (microservice, portMappingData, user, transaction) { +async function createProxyPortMapping (microservice, portMappingData, transaction) { const protocol = portMappingData.protocol || 'tcp' // create proxy microservices @@ -82,7 +82,6 @@ async function createProxyPortMapping (microservice, portMappingData, user, tran microservice.iofogUuid, portRouterCatalog.id, microservice.uuid, - user, transaction) const mappingData = { @@ -130,7 +129,7 @@ async function buildProxyPortMapping (pm, mapping, transaction) { } } -async function deleteProxyPortMapping (microservice, portMapping, user, transaction) { +async function deleteProxyPortMapping (microservice, portMapping, transaction) { const proxyPort = await portMapping.getProxyPort() if (proxyPort) { await _updateOrDeleteProxyMicroservice(proxyPort, false, transaction) @@ -165,7 +164,7 @@ async function _updateOrDeleteProxyMicroservice (proxyPort, isMove, transaction) } } -async function moveProxyPortsToNewFog (updatedMicroservice, portMapping, user, transaction) { +async function moveProxyPortsToNewFog (updatedMicroservice, portMapping, transaction) { const proxyPort = await portMapping.getProxyPort() const localProxy = await MicroserviceManager.findOne({ uuid: proxyPort.localProxyId }, transaction) await _updateOrDeleteProxyMicroservice(proxyPort, true, transaction) @@ -194,7 +193,6 @@ async function moveProxyPortsToNewFog (updatedMicroservice, portMapping, user, t updatedMicroservice.iofogUuid, localProxy.catalogItemId, updatedMicroservice.uuid, - user, transaction) proxyPort.localProxyId = newProxy.uuid diff --git a/src/services/microservices-service.js b/src/services/microservices-service.js index 4c90f7185..55156d1ce 100644 --- a/src/services/microservices-service.js +++ b/src/services/microservices-service.js @@ -37,14 +37,14 @@ const { VOLUME_MAPPING_DEFAULT } = require('../helpers/constants') const constants = require('../helpers/constants') const isEqual = require('lodash/isEqual') -async function listMicroservicesEndPoint (opt, user, isCLI, transaction) { +async function listMicroservicesEndPoint (opt, isCLI, transaction) { // API retro compatibility const { applicationName, flowId } = opt - let application = await _validateApplication(applicationName, user, isCLI, transaction) + let application = await _validateApplication(applicationName, isCLI, transaction) if (flowId) { // _validateApplication wil try by ID if it fails finding by name - application = await _validateApplication(flowId, user, isCLI, transaction) + application = await _validateApplication(flowId, isCLI, transaction) } const where = application ? { applicationId: application.id, delete: false } : { delete: false, applicationId: { [Op.ne]: null } } @@ -60,7 +60,7 @@ async function listMicroservicesEndPoint (opt, user, isCLI, transaction) { } } -async function getMicroserviceEndPoint (microserviceUuid, user, isCLI, transaction) { +async function getMicroserviceEndPoint (microserviceUuid, isCLI, transaction) { if (!isCLI) { await _validateMicroserviceOnGet(microserviceUuid, transaction) } @@ -150,7 +150,7 @@ async function _validateAgentHostTemplate (extraHost, templateArgs, transaction) return extraHost } -async function _validateExtraHost (extraHostData, user, transaction) { +async function _validateExtraHost (extraHostData, transaction) { const extraHost = { templateType: 'Litteral', name: extraHostData.name, @@ -171,13 +171,13 @@ async function _validateExtraHost (extraHostData, user, transaction) { throw new Errors.ValidationError(AppHelper.formatMessage(ErrorMessages.INVALID_HOST_TEMPLATE, template)) } -async function _validateExtraHosts (microserviceData, user, transaction) { +async function _validateExtraHosts (microserviceData, transaction) { if (!microserviceData.extraHosts || microserviceData.extraHosts.length === 0) { return [] } const extraHosts = [] for (const extraHost of microserviceData.extraHosts) { - extraHosts.push(await _validateExtraHost(extraHost, user, transaction)) + extraHosts.push(await _validateExtraHost(extraHost, transaction)) } return extraHosts } @@ -195,7 +195,7 @@ function _validateImageFogType (microserviceData, fog, images) { } } -async function _findFog (microserviceData, user, isCLI, transaction) { +async function _findFog (microserviceData, isCLI, transaction) { const fogConditions = {} if (microserviceData.iofogUuid) { fogConditions.uuid = microserviceData.iofogUuid @@ -205,7 +205,7 @@ async function _findFog (microserviceData, user, isCLI, transaction) { return FogManager.findOne(fogConditions, transaction) } -async function createMicroserviceEndPoint (microserviceData, user, isCLI, transaction) { +async function createMicroserviceEndPoint (microserviceData, isCLI, transaction) { // API Retro compatibility if (!microserviceData.application) { microserviceData.application = microserviceData.flowId @@ -213,7 +213,7 @@ async function createMicroserviceEndPoint (microserviceData, user, isCLI, transa await Validator.validate(microserviceData, Validator.schemas.microserviceCreate) // find fog - const fog = await _findFog(microserviceData, user, isCLI, transaction) + const fog = await _findFog(microserviceData, isCLI, transaction) if (!fog) { throw new Errors.ValidationError(AppHelper.formatMessage(ErrorMessages.INVALID_IOFOG_UUID, microserviceData.iofogUuid || microserviceData.agentName)) } @@ -224,7 +224,7 @@ async function createMicroserviceEndPoint (microserviceData, user, isCLI, transa // validate images if (microserviceData.catalogItemId) { // validate catalog item - const catalogItem = await CatalogService.getCatalogItem(microserviceData.catalogItemId, user, isCLI, transaction) + const catalogItem = await CatalogService.getCatalogItem(microserviceData.catalogItemId, isCLI, transaction) _validateImagesAgainstCatalog(catalogItem, microserviceData.images || []) microserviceData.images = catalogItem.images _validateImageFogType(microserviceData, fog, catalogItem.images) @@ -237,13 +237,13 @@ async function createMicroserviceEndPoint (microserviceData, user, isCLI, transa } // validate extraHosts - const extraHosts = await _validateExtraHosts(microserviceData, user, transaction) + const extraHosts = await _validateExtraHosts(microserviceData, transaction) await MicroservicePortService.validatePortMappings(microserviceData, transaction) _validateVolumeMappings(microserviceData.volumeMappings) - const microservice = await _createMicroservice({ ...microserviceData, iofogUuid: fog.uuid }, user, isCLI, transaction) + const microservice = await _createMicroservice({ ...microserviceData, iofogUuid: fog.uuid }, isCLI, transaction) if (!microserviceData.catalogItemId) { await _createMicroserviceImages(microservice, microserviceData.images, transaction) @@ -253,7 +253,7 @@ async function createMicroserviceEndPoint (microserviceData, user, isCLI, transa const proxyPorts = [] if (microserviceData.ports) { for (const mapping of microserviceData.ports) { - const res = await MicroservicePortService.createPortMapping(microservice, mapping, user, transaction) + const res = await MicroservicePortService.createPortMapping(microservice, mapping, transaction) if (res) { if (res.publicLinks) { publicPorts.push({ @@ -273,17 +273,17 @@ async function createMicroserviceEndPoint (microserviceData, user, isCLI, transa } for (const extraHost of extraHosts) { - await _createExtraHost(microservice, extraHost, user, transaction) + await _createExtraHost(microservice, extraHost, transaction) } if (microserviceData.env) { for (const env of microserviceData.env) { - await _createEnv(microservice, env, user, transaction) + await _createEnv(microservice, env, transaction) } } if (microserviceData.cmd) { for (const arg of microserviceData.cmd) { - await _createArg(microservice, arg, user, transaction) + await _createArg(microservice, arg, transaction) } } if (microserviceData.volumeMappings) { @@ -346,7 +346,7 @@ async function _updateRelatedExtraHosts (updatedMicroservice, transaction) { } } -async function updateMicroserviceEndPoint (microserviceUuid, microserviceData, user, isCLI, transaction, changeTrackingEnabled = true) { +async function updateMicroserviceEndPoint (microserviceUuid, microserviceData, isCLI, transaction, changeTrackingEnabled = true) { await Validator.validate(microserviceData, Validator.schemas.microserviceUpdate) let needStatusReset = false const query = isCLI @@ -358,11 +358,11 @@ async function updateMicroserviceEndPoint (microserviceUuid, microserviceData, u } // validate extraHosts - const extraHosts = microserviceData.extraHosts ? await _validateExtraHosts(microserviceData, user, transaction) : null + const extraHosts = microserviceData.extraHosts ? await _validateExtraHosts(microserviceData, transaction) : null const config = _validateMicroserviceConfig(microserviceData.config) - const newFog = await _findFog(microserviceData, user, isCLI, transaction) || {} + const newFog = await _findFog(microserviceData, isCLI, transaction) || {} const microserviceToUpdate = { name: microserviceData.name, config: config, @@ -400,7 +400,7 @@ async function updateMicroserviceEndPoint (microserviceUuid, microserviceData, u } if (microserviceDataUpdate.ports) { - await _updatePorts(microserviceDataUpdate.ports, microservice, user, transaction) + await _updatePorts(microserviceDataUpdate.ports, microservice, transaction) } if (microserviceDataUpdate.iofogUuid && microservice.iofogUuid !== microserviceDataUpdate.iofogUuid) { @@ -433,7 +433,7 @@ async function updateMicroserviceEndPoint (microserviceUuid, microserviceData, u const iofogUuid = microserviceDataUpdate.iofogUuid || microservice.iofogUuid if (microserviceDataUpdate.catalogItemId) { - const catalogItem = await CatalogService.getCatalogItem(microserviceDataUpdate.catalogItemId, user, isCLI, transaction) + const catalogItem = await CatalogService.getCatalogItem(microserviceDataUpdate.catalogItemId, isCLI, transaction) _validateImagesAgainstCatalog(catalogItem, microserviceDataUpdate.images || []) if (microserviceDataUpdate.catalogItemId !== undefined && microserviceDataUpdate.catalogItemId !== microservice.catalogItemId) { // Catalog item changed or removed, set rebuild flag @@ -468,12 +468,12 @@ async function updateMicroserviceEndPoint (microserviceUuid, microserviceData, u // Validate image type let images = [] if (microserviceDataUpdate.catalogItemId) { - const catalogItem = await CatalogService.getCatalogItem(microserviceDataUpdate.catalogItemId, user, isCLI, transaction) + const catalogItem = await CatalogService.getCatalogItem(microserviceDataUpdate.catalogItemId, isCLI, transaction) images = catalogItem.images } else if (microserviceDataUpdate.images) { images = microserviceDataUpdate.images } else if (microservice.catalogItemId) { - const catalogItem = await CatalogService.getCatalogItem(microservice.catalogItemId, user, isCLI, transaction) + const catalogItem = await CatalogService.getCatalogItem(microservice.catalogItemId, isCLI, transaction) images = catalogItem.images } else { images = await microservice.getImages() @@ -493,7 +493,7 @@ async function updateMicroserviceEndPoint (microserviceUuid, microserviceData, u const updatedMicroservice = await MicroserviceManager.updateAndFind(query, microserviceDataUpdate, transaction) if (extraHosts) { - await _updateExtraHosts(extraHosts, microserviceUuid, user, transaction) + await _updateExtraHosts(extraHosts, microserviceUuid, transaction) } // Update extra hosts that reference this microservice @@ -512,7 +512,7 @@ async function updateMicroserviceEndPoint (microserviceUuid, microserviceData, u } if (microserviceDataUpdate.iofogUuid && microserviceDataUpdate.iofogUuid !== microservice.iofogUuid) { - await MicroservicePortService.movePublicPortsToNewFog(updatedMicroservice, user, transaction) + await MicroservicePortService.movePublicPortsToNewFog(updatedMicroservice, transaction) } if (needStatusReset) { @@ -561,7 +561,7 @@ const _checkIfMicroserviceImagesAreEqual = (microserviceDataUpdateImages, catalo return isEqual(newMicroserviceImages, oldMicroservicesImages) } -async function deleteMicroserviceEndPoint (microserviceUuid, microserviceData, user, isCLI, transaction) { +async function deleteMicroserviceEndPoint (microserviceUuid, microserviceData, isCLI, transaction) { const where = isCLI ? { uuid: microserviceUuid @@ -594,7 +594,7 @@ async function deleteNotRunningMicroservices (fog, transaction) { .forEach(async (microservice) => { await deleteMicroserviceWithRoutesAndPortMappings(microservice, transaction) }) } -async function createRouteEndPoint (sourceMicroserviceUuid, destMicroserviceUuid, user, isCLI, transaction) { +async function createRouteEndPoint (sourceMicroserviceUuid, destMicroserviceUuid, isCLI, transaction) { // Print deprecated warning const sourceMsvc = await MicroserviceManager.findOne({ uuid: sourceMicroserviceUuid }, transaction) if (!sourceMsvc) { @@ -610,10 +610,10 @@ async function createRouteEndPoint (sourceMicroserviceUuid, destMicroserviceUuid throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.INVALID_FLOW_ID, sourceMsvc.applicationId)) } - return RoutingService.createRouting({ application: application.name, from: sourceMsvc.name, to: destMsvc.name, name: `r-${sourceMsvc.name}-${destMsvc.name}` }, user, isCLI, transaction) + return RoutingService.createRouting({ application: application.name, from: sourceMsvc.name, to: destMsvc.name, name: `r-${sourceMsvc.name}-${destMsvc.name}` }, isCLI, transaction) } -async function deleteRouteEndPoint (sourceMicroserviceUuid, destMicroserviceUuid, user, isCLI, transaction) { +async function deleteRouteEndPoint (sourceMicroserviceUuid, destMicroserviceUuid, isCLI, transaction) { // Print deprecated warning const route = await RoutingManager.findOnePopulated({ @@ -624,10 +624,10 @@ async function deleteRouteEndPoint (sourceMicroserviceUuid, destMicroserviceUuid throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.ROUTE_NOT_FOUND)) } - return RoutingService.deleteRouting(route.application.name, route.name, user, isCLI, transaction) + return RoutingService.deleteRouting(route.application.name, route.name, isCLI, transaction) } -async function createPortMappingEndPoint (microserviceUuid, portMappingData, user, isCLI, transaction) { +async function createPortMappingEndPoint (microserviceUuid, portMappingData, isCLI, transaction) { await Validator.validate(portMappingData, Validator.schemas.portsCreate) const where = isCLI @@ -645,10 +645,10 @@ async function createPortMappingEndPoint (microserviceUuid, portMappingData, use } await MicroservicePortService.validatePortMapping(agent, portMappingData, {}, transaction) - return MicroservicePortService.createPortMapping(microservice, portMappingData, user, transaction) + return MicroservicePortService.createPortMapping(microservice, portMappingData, transaction) } -async function _createExtraHost (microservice, extraHostData, user, transaction) { +async function _createExtraHost (microservice, extraHostData, transaction) { const msExtraHostData = { ...extraHostData, microserviceUuid: microservice.uuid @@ -657,7 +657,7 @@ async function _createExtraHost (microservice, extraHostData, user, transaction) await MicroserviceExtraHostManager.create(msExtraHostData, transaction) } -async function _createEnv (microservice, envData, user, transaction) { +async function _createEnv (microservice, envData, transaction) { if (!microservice.iofogUuid) { throw new Errors.ValidationError(AppHelper.formatMessage(ErrorMessages.REQUIRED_FOG_NODE)) } @@ -672,7 +672,7 @@ async function _createEnv (microservice, envData, user, transaction) { await MicroservicePortService.switchOnUpdateFlagsForMicroservicesForPortMapping(microservice, false, transaction) } -async function _createArg (microservice, arg, user, transaction) { +async function _createArg (microservice, arg, transaction) { if (!microservice.iofogUuid) { throw new Errors.ValidationError(AppHelper.formatMessage(ErrorMessages.REQUIRED_FOG_NODE)) } @@ -686,12 +686,12 @@ async function _createArg (microservice, arg, user, transaction) { await MicroservicePortService.switchOnUpdateFlagsForMicroservicesForPortMapping(microservice, false, transaction) } -async function deletePortMappingEndPoint (microserviceUuid, internalPort, user, isCLI, transaction) { - return MicroservicePortService.deletePortMapping(microserviceUuid, internalPort, user, isCLI, transaction) +async function deletePortMappingEndPoint (microserviceUuid, internalPort, isCLI, transaction) { + return MicroservicePortService.deletePortMapping(microserviceUuid, internalPort, isCLI, transaction) } -async function listPortMappingsEndPoint (microserviceUuid, user, isCLI, transaction) { - return MicroservicePortService.listPortMappings(microserviceUuid, user, isCLI, transaction) +async function listPortMappingsEndPoint (microserviceUuid, isCLI, transaction) { + return MicroservicePortService.listPortMappings(microserviceUuid, isCLI, transaction) } async function getReceiverMicroservices (microservice, transaction) { @@ -706,7 +706,7 @@ async function isMicroserviceConsumer (microservice, transaction) { return !!(routes && routes.length > 0) } -async function createVolumeMappingEndPoint (microserviceUuid, volumeMappingData, user, isCLI, transaction) { +async function createVolumeMappingEndPoint (microserviceUuid, volumeMappingData, isCLI, transaction) { await Validator.validate(volumeMappingData, Validator.schemas.volumeMappings) const where = isCLI @@ -743,7 +743,7 @@ async function createVolumeMappingEndPoint (microserviceUuid, volumeMappingData, return VolumeMappingManager.create(volumeMappingObj, transaction) } -async function deleteVolumeMappingEndPoint (microserviceUuid, volumeMappingUuid, user, isCLI, transaction) { +async function deleteVolumeMappingEndPoint (microserviceUuid, volumeMappingUuid, isCLI, transaction) { const where = isCLI ? { uuid: microserviceUuid } : { uuid: microserviceUuid } @@ -764,7 +764,7 @@ async function deleteVolumeMappingEndPoint (microserviceUuid, volumeMappingUuid, } } -async function listVolumeMappingsEndPoint (microserviceUuid, user, isCLI, transaction) { +async function listVolumeMappingsEndPoint (microserviceUuid, isCLI, transaction) { const where = isCLI ? { uuid: microserviceUuid } : { uuid: microserviceUuid } @@ -789,7 +789,7 @@ function _validateMicroserviceConfig (config) { return result } -async function _createMicroservice (microserviceData, user, isCLI, transaction) { +async function _createMicroservice (microserviceData, isCLI, transaction) { const config = _validateMicroserviceConfig(microserviceData.config) let newMicroservice = { @@ -813,7 +813,7 @@ async function _createMicroservice (microserviceData, user, isCLI, transaction) } // validate application - const application = await _validateApplication(microserviceData.application, user, isCLI, transaction) + const application = await _validateApplication(microserviceData.application, isCLI, transaction) newMicroservice.applicationId = application.id await _checkForDuplicateName(newMicroservice.name, {}, newMicroservice.applicationId, transaction) @@ -829,7 +829,7 @@ async function _createMicroservice (microserviceData, user, isCLI, transaction) return MicroserviceManager.create(newMicroservice, transaction) } -async function _validateApplication (name, user, isCLI, transaction) { +async function _validateApplication (name, isCLI, transaction) { if (!name) { return null } @@ -916,12 +916,12 @@ async function _deleteImages (microserviceUuid, transaction) { }, transaction) } -async function _updateExtraHosts (extraHosts, microserviceUuid, user, transaction) { +async function _updateExtraHosts (extraHosts, microserviceUuid, transaction) { await MicroserviceExtraHostManager.delete({ microserviceUuid: microserviceUuid }, transaction) for (const extraHost of extraHosts) { - await _createExtraHost({ uuid: microserviceUuid }, extraHost, user, transaction) + await _createExtraHost({ uuid: microserviceUuid }, extraHost, transaction) } } @@ -954,10 +954,10 @@ async function _updateArg (arg, microserviceUuid, transaction) { } } -async function _updatePorts (newPortMappings, microservice, user, transaction) { - await MicroservicePortService.deletePortMappings(microservice, user, transaction) +async function _updatePorts (newPortMappings, microservice, transaction) { + await MicroservicePortService.deletePortMappings(microservice, transaction) for (const portMapping of newPortMappings) { - await createPortMappingEndPoint(microservice.uuid, portMapping, user, false, transaction) + await createPortMappingEndPoint(microservice.uuid, portMapping, false, transaction) } } @@ -1080,8 +1080,8 @@ async function _buildGetMicroserviceResponse (microservice, transaction) { return res } -function listAllPublicPortsEndPoint (user, transaction) { - return MicroservicePortService.listAllPublicPorts(user, transaction) +function listAllPublicPortsEndPoint (transaction) { + return MicroservicePortService.listAllPublicPorts(transaction) } module.exports = { diff --git a/src/services/registry-service.js b/src/services/registry-service.js index b5220cb99..de0a8eade 100644 --- a/src/services/registry-service.js +++ b/src/services/registry-service.js @@ -22,7 +22,7 @@ const Sequelize = require('sequelize') const Op = Sequelize.Op const AppHelper = require('../helpers/app-helper') -const createRegistry = async function (registry, user, transaction) { +const createRegistry = async function (registry, transaction) { await Validator.validate(registry, Validator.schemas.registryCreate) if (registry.requiresCert && registry.certificate === undefined) { throw new Errors.ValidationError(ErrorMessages.CERT_PROPERTY_REQUIRED) @@ -42,14 +42,14 @@ const createRegistry = async function (registry, user, transaction) { const createdRegistry = await RegistryManager.create(registryCreate, transaction) - await _updateChangeTracking(user, transaction) + await _updateChangeTracking(transaction) return { id: createdRegistry.id } } -const findRegistries = async function (user, isCLI, transaction) { +const findRegistries = async function (isCLI, transaction) { const queryRegistry = isCLI ? {} : { @@ -67,7 +67,7 @@ const findRegistries = async function (user, isCLI, transaction) { } } -const deleteRegistry = async function (registryData, user, isCLI, transaction) { +const deleteRegistry = async function (registryData, isCLI, transaction) { await Validator.validate(registryData, Validator.schemas.registryDelete) const queryData = isCLI ? { id: registryData.id } @@ -77,10 +77,10 @@ const deleteRegistry = async function (registryData, user, isCLI, transaction) { throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.INVALID_REGISTRY_ID, registryData.id)) } await RegistryManager.delete(queryData, transaction) - await _updateChangeTracking(user, transaction) + await _updateChangeTracking(transaction) } -const updateRegistry = async function (registry, registryId, user, isCLI, transaction) { +const updateRegistry = async function (registry, registryId, isCLI, transaction) { await Validator.validate(registry, Validator.schemas.registryUpdate) if (registry.requiresCert && registry.certificate === undefined) { @@ -117,10 +117,10 @@ const updateRegistry = async function (registry, registryId, user, isCLI, transa await RegistryManager.update(where, registryUpdate, transaction) - await _updateChangeTracking(user, transaction) + await _updateChangeTracking(transaction) } -const _updateChangeTracking = async function (user, transaction) { +const _updateChangeTracking = async function (transaction) { const fogs = await FogManager.findAll(transaction) for (const fog of fogs) { await ChangeTrackingService.update(fog.uuid, ChangeTrackingService.events.registries, transaction) diff --git a/src/services/routing-service.js b/src/services/routing-service.js index b3737ba90..f6cb1fdc4 100644 --- a/src/services/routing-service.js +++ b/src/services/routing-service.js @@ -21,7 +21,7 @@ const RoutingManager = require('../data/managers/routing-manager') const TransactionDecorator = require('../decorators/transaction-decorator') const Validator = require('../schemas') -async function getRoutings (user, isCLI, transaction) { +async function getRoutings (isCLI, transaction) { const routes = await RoutingManager.findAllPopulated({}, transaction) return { routes: routes.map(r => ({ application: r.application.name, @@ -34,7 +34,7 @@ async function getRoutings (user, isCLI, transaction) { })) } } -async function getRouting (appName, name, user, isCLI, transaction) { +async function getRouting (appName, name, isCLI, transaction) { const application = await ApplicationManager.findOne({ name: appName }, transaction) if (!application) { throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.INVALID_FLOW_NAME, appName)) @@ -54,7 +54,7 @@ async function getRouting (appName, name, user, isCLI, transaction) { } } -async function _validateRouteMsvc (routingData, user, isCLI, transaction) { +async function _validateRouteMsvc (routingData, isCLI, transaction) { // Retro compatibility logic if (routingData.sourceMicroserviceUuid) { const sourceWhere = { uuid: routingData.sourceMicroserviceUuid } @@ -91,15 +91,15 @@ async function _validateRouteMsvc (routingData, user, isCLI, transaction) { } } -async function createRouting (routingData, user, isCLI, transaction) { +async function createRouting (routingData, isCLI, transaction) { await Validator.validate(routingData, Validator.schemas.routingCreate) - const { sourceMicroservice, destMicroservice } = await _validateRouteMsvc(routingData, user, isCLI, transaction) + const { sourceMicroservice, destMicroservice } = await _validateRouteMsvc(routingData, isCLI, transaction) - return _createRoute(sourceMicroservice, destMicroservice, routingData, user, transaction) + return _createRoute(sourceMicroservice, destMicroservice, routingData, transaction) } -async function updateRouting (appName, routeName, routeData, user, isCLI, transaction) { +async function updateRouting (appName, routeName, routeData, isCLI, transaction) { await Validator.validate(routeData, Validator.schemas.routingUpdate) const application = await ApplicationManager.findOne({ name: appName }, transaction) if (!application) { @@ -111,7 +111,7 @@ async function updateRouting (appName, routeName, routeData, user, isCLI, transa throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.INVALID_ROUTING_NAME, routeName)) } - const { sourceMicroservice, destMicroservice } = await _validateRouteMsvc({ ...routeData, application: oldRoute.application.name }, user, isCLI, transaction) + const { sourceMicroservice, destMicroservice } = await _validateRouteMsvc({ ...routeData, application: oldRoute.application.name }, isCLI, transaction) const updateRebuildMs = { rebuild: true @@ -143,7 +143,7 @@ async function updateRouting (appName, routeName, routeData, user, isCLI, transa await RoutingManager.update({ id: oldRoute.id }, updateRouteData, transaction) } -async function _createRoute (sourceMicroservice, destMicroservice, routeData, user, transaction) { +async function _createRoute (sourceMicroservice, destMicroservice, routeData, transaction) { if (!sourceMicroservice.iofogUuid || !destMicroservice.iofogUuid) { throw new Errors.ValidationError('fog not set') } @@ -162,7 +162,7 @@ async function _createRoute (sourceMicroservice, destMicroservice, routeData, us return _createSimpleRoute(sourceMicroservice, destMicroservice, routeData, transaction) } -async function deleteRouting (appName, name, user, isCLI, transaction) { +async function deleteRouting (appName, name, isCLI, transaction) { const application = await ApplicationManager.findOne({ name: appName }, transaction) if (!application) { throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.INVALID_FLOW_NAME, appName)) diff --git a/src/services/tunnel-service.js b/src/services/tunnel-service.js index 680f7e5c3..14142af29 100644 --- a/src/services/tunnel-service.js +++ b/src/services/tunnel-service.js @@ -21,7 +21,7 @@ const ErrorMessages = require('../helpers/error-messages') const TransactionDecorator = require('../decorators/transaction-decorator') const ChangeTrackingService = require('./change-tracking-service') -const openTunnel = async function (tunnelData, user, isCli, transaction) { +const openTunnel = async function (tunnelData, isCli, transaction) { const iofog = await FogManager.findOne({ uuid: tunnelData.iofogUuid }, transaction) if (!iofog) { throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.INVALID_IOFOG_UUID, tunnelData.iofogUuid)) @@ -47,7 +47,7 @@ const openTunnel = async function (tunnelData, user, isCli, transaction) { await ChangeTrackingService.update(tunnelData.iofogUuid, ChangeTrackingService.events.tunnel, transaction) } -const findTunnel = async function (tunnelData, user, transaction) { +const findTunnel = async function (tunnelData, transaction) { const tunnel = await TunnelManager.findOne(tunnelData, transaction) if (!tunnel) { throw new Errors.NotFoundError('Invalid Tunnel Id') @@ -68,8 +68,8 @@ const findAll = async function (transaction) { } } -const closeTunnel = async function (tunnelData, user, transaction) { - await module.exports.findTunnel(tunnelData, user, transaction) +const closeTunnel = async function (tunnelData, transaction) { + await module.exports.findTunnel(tunnelData, transaction) await TunnelManager.update(tunnelData, { closed: true }, transaction) await ChangeTrackingService.update(tunnelData.iofogUuid, ChangeTrackingService.events.tunnel, transaction) } From ef5771fcfc02e9e328f7244c84075579e95b0741 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emirhan=20Durmu=C5=9F?= Date: Thu, 28 Mar 2024 14:04:09 +0300 Subject: [PATCH 074/178] Revert "user removed from endpoint's controller and service" This reverts commit e0fa248e8902409dbbe4735ae8722b3fa4942315. --- src/controllers/application-controller.js | 48 ++++---- .../application-template-controller.js | 36 +++--- src/controllers/catalog-controller.js | 20 ++-- src/controllers/config-controller.js | 6 +- src/controllers/diagnostic-controller.js | 20 ++-- src/controllers/edge-resource-controller.js | 32 +++--- src/controllers/iofog-controller.js | 44 ++++---- src/controllers/microservices-controller.js | 68 +++++------ src/controllers/registry-controller.js | 16 +-- src/controllers/routing-controller.js | 20 ++-- src/controllers/tunnel-controller.js | 10 +- src/services/application-service.js | 44 ++++---- src/services/application-template-service.js | 28 ++--- src/services/catalog-service.js | 18 +-- src/services/diagnostic-service.js | 12 +- src/services/edge-resource-service.js | 12 +- src/services/iofog-service.js | 42 +++---- src/services/microservice-ports/default.js | 42 +++---- src/services/microservice-ports/proxy.js | 10 +- src/services/microservices-service.js | 106 +++++++++--------- src/services/registry-service.js | 16 +-- src/services/routing-service.js | 20 ++-- src/services/tunnel-service.js | 8 +- 23 files changed, 341 insertions(+), 337 deletions(-) diff --git a/src/controllers/application-controller.js b/src/controllers/application-controller.js index 15676b7da..da06cfe8b 100644 --- a/src/controllers/application-controller.js +++ b/src/controllers/application-controller.js @@ -17,85 +17,85 @@ const errors = require('../helpers/errors') const ErrorMessages = require('../helpers/error-messages') const { rvaluesVarSubstition } = require('../helpers/template-helper') -const createApplicationEndPoint = async function (req) { +const createApplicationEndPoint = async function (req, user) { const application = req.body - return ApplicationService.createApplicationEndPoint(application, false) + return ApplicationService.createApplicationEndPoint(application, user, false) } -const createApplicationYAMLEndPoint = async function (req) { +const createApplicationYAMLEndPoint = async function (req, user) { if (!req.file) { throw new errors.ValidationError(ErrorMessages.APPLICATION_FILE_NOT_FOUND) } const fileContent = req.file.buffer.toString() const application = await YAMLParserService.parseAppFile(fileContent) - await rvaluesVarSubstition(application, { self: application }) + await rvaluesVarSubstition(application, { self: application }, user) - return ApplicationService.createApplicationEndPoint(application, false) + return ApplicationService.createApplicationEndPoint(application, user, false) } -const getApplicationsByUserEndPoint = async function (req) { - return ApplicationService.getUserApplicationsEndPoint(false) +const getApplicationsByUserEndPoint = async function (req, user) { + return ApplicationService.getUserApplicationsEndPoint(user, false) } -const getApplicationEndPoint = async function (req) { +const getApplicationEndPoint = async function (req, user) { const name = req.params.name - const application = await ApplicationService.getApplicationEndPoint({ name }, false) + const application = await ApplicationService.getApplicationEndPoint({ name }, user, false) return application } -const patchApplicationEndPoint = async function (req) { +const patchApplicationEndPoint = async function (req, user) { const application = req.body const name = req.params.name - return ApplicationService.patchApplicationEndPoint(application, { name }, false) + return ApplicationService.patchApplicationEndPoint(application, { name }, user, false) } -const updateApplicationEndPoint = async function (req) { +const updateApplicationEndPoint = async function (req, user) { const application = req.body const name = req.params.name - return ApplicationService.updateApplicationEndPoint(application, name, false) + return ApplicationService.updateApplicationEndPoint(application, name, user, false) } -const updateApplicationYAMLEndPoint = async function (req) { +const updateApplicationYAMLEndPoint = async function (req, user) { if (!req.file) { throw new errors.ValidationError(ErrorMessages.APPLICATION_FILE_NOT_FOUND) } const name = req.params.name const fileContent = req.file.buffer.toString() const application = await YAMLParserService.parseAppFile(fileContent) - await rvaluesVarSubstition(application, { self: application }) + await rvaluesVarSubstition(application, { self: application }, user) - return ApplicationService.updateApplicationEndPoint(application, name, false) + return ApplicationService.updateApplicationEndPoint(application, name, user, false) } -const deleteApplicationEndPoint = async function (req) { +const deleteApplicationEndPoint = async function (req, user) { const name = req.params.name - return ApplicationService.deleteApplicationEndPoint({ name }, false) + return ApplicationService.deleteApplicationEndPoint({ name }, user, false) } // Legacy -const deleteApplicationByIdEndPoint = async function (req) { +const deleteApplicationByIdEndPoint = async function (req, user) { const id = req.params.id - return ApplicationService.deleteApplicationEndPoint({ id }, false) + return ApplicationService.deleteApplicationEndPoint({ id }, user, false) } -const patchApplicationByIdEndPoint = async function (req) { +const patchApplicationByIdEndPoint = async function (req, user) { const application = req.body const id = req.params.id - return ApplicationService.patchApplicationEndPoint(application, { id }, false) + return ApplicationService.patchApplicationEndPoint(application, { id }, user, false) } -const getApplicationByIdEndPoint = async function (req) { +const getApplicationByIdEndPoint = async function (req, user) { const id = req.params.id - const application = await ApplicationService.getApplicationEndPoint({ id }, false) + const application = await ApplicationService.getApplicationEndPoint({ id }, user, false) return application } diff --git a/src/controllers/application-template-controller.js b/src/controllers/application-template-controller.js index 61f281112..7a9e85d0a 100644 --- a/src/controllers/application-template-controller.js +++ b/src/controllers/application-template-controller.js @@ -17,63 +17,63 @@ const errors = require('../helpers/errors') const ErrorMessages = require('../helpers/error-messages') const { rvaluesVarSubstition } = require('../helpers/template-helper') -const createApplicationTemplateEndPoint = async function (req) { +const createApplicationTemplateEndPoint = async function (req, user) { const application = req.body - return ApplicationTemplateService.createApplicationTemplateEndPoint(application, false) + return ApplicationTemplateService.createApplicationTemplateEndPoint(application, user, false) } -const createApplicationTemplateYAMLEndPoint = async function (req) { +const createApplicationTemplateYAMLEndPoint = async function (req, user) { if (!req.file) { throw new errors.ValidationError(ErrorMessages.APPLICATION_FILE_NOT_FOUND) } const fileContent = req.file.buffer.toString() const application = await YAMLParserService.parseAppTemplateFile(fileContent) - await rvaluesVarSubstition(application.variables, { self: application.variables }) + await rvaluesVarSubstition(application.variables, { self: application.variables }, user) - return ApplicationTemplateService.createApplicationTemplateEndPoint(application, false) + return ApplicationTemplateService.createApplicationTemplateEndPoint(application, user, false) } -const getApplicationTemplatesByUserEndPoint = async function (req) { - return ApplicationTemplateService.getUserApplicationTemplatesEndPoint(false) +const getApplicationTemplatesByUserEndPoint = async function (req, user) { + return ApplicationTemplateService.getUserApplicationTemplatesEndPoint(user, false) } -const getApplicationTemplateEndPoint = async function (req) { +const getApplicationTemplateEndPoint = async function (req, user) { const name = req.params.name - return ApplicationTemplateService.getApplicationTemplateEndPoint({ name }, false) + return ApplicationTemplateService.getApplicationTemplateEndPoint({ name }, user, false) } -const patchApplicationTemplateEndPoint = async function (req) { +const patchApplicationTemplateEndPoint = async function (req, user) { const application = req.body const name = req.params.name - return ApplicationTemplateService.patchApplicationTemplateEndPoint(application, { name }, false) + return ApplicationTemplateService.patchApplicationTemplateEndPoint(application, { name }, user, false) } -const updateApplicationTemplateEndPoint = async function (req) { +const updateApplicationTemplateEndPoint = async function (req, user) { const application = req.body const name = req.params.name - return ApplicationTemplateService.updateApplicationTemplateEndPoint(application, name, false) + return ApplicationTemplateService.updateApplicationTemplateEndPoint(application, name, user, false) } -const updateApplicationTemplateYAMLEndPoint = async function (req) { +const updateApplicationTemplateYAMLEndPoint = async function (req, user) { if (!req.file) { throw new errors.ValidationError(ErrorMessages.APPLICATION_FILE_NOT_FOUND) } const name = req.params.name const fileContent = req.file.buffer.toString() const application = await YAMLParserService.parseAppTemplateFile(fileContent) - await rvaluesVarSubstition(application.variables, { self: application.variables }) + await rvaluesVarSubstition(application.variables, { self: application.variables }, user) - return ApplicationTemplateService.updateApplicationTemplateEndPoint(application, name, false) + return ApplicationTemplateService.updateApplicationTemplateEndPoint(application, name, user, false) } -const deleteApplicationTemplateEndPoint = async function (req) { +const deleteApplicationTemplateEndPoint = async function (req, user) { const name = req.params.name - return ApplicationTemplateService.deleteApplicationTemplateEndPoint({ name }, false) + return ApplicationTemplateService.deleteApplicationTemplateEndPoint({ name }, user, false) } module.exports = { diff --git a/src/controllers/catalog-controller.js b/src/controllers/catalog-controller.js index dcd35cd57..afed875af 100644 --- a/src/controllers/catalog-controller.js +++ b/src/controllers/catalog-controller.js @@ -13,24 +13,24 @@ const CatalogService = require('../services/catalog-service') -const createCatalogItemEndPoint = async function (req) { - return CatalogService.createCatalogItemEndPoint(req.body) +const createCatalogItemEndPoint = async function (req, user) { + return CatalogService.createCatalogItemEndPoint(req.body, user) } -const listCatalogItemsEndPoint = async function (req) { - return CatalogService.listCatalogItemsEndPoint(false) +const listCatalogItemsEndPoint = async function (req, user) { + return CatalogService.listCatalogItemsEndPoint(user, false) } -const listCatalogItemEndPoint = async function (req) { - return CatalogService.getCatalogItemEndPoint(req.params.id, false) +const listCatalogItemEndPoint = async function (req, user) { + return CatalogService.getCatalogItemEndPoint(req.params.id, user, false) } -const deleteCatalogItemEndPoint = async function (req) { - await CatalogService.deleteCatalogItemEndPoint(req.params.id, false) +const deleteCatalogItemEndPoint = async function (req, user) { + await CatalogService.deleteCatalogItemEndPoint(req.params.id, user, false) } -const updateCatalogItemEndPoint = async function (req) { - await CatalogService.updateCatalogItemEndPoint(req.params.id, req.body, false) +const updateCatalogItemEndPoint = async function (req, user) { + await CatalogService.updateCatalogItemEndPoint(req.params.id, req.body, user, false) } module.exports = { diff --git a/src/controllers/config-controller.js b/src/controllers/config-controller.js index 2b5efd729..0b57a14fc 100644 --- a/src/controllers/config-controller.js +++ b/src/controllers/config-controller.js @@ -13,16 +13,16 @@ const ConfigService = require('../services/config-service') -const upsertConfigElementEndpoint = async function (req) { +const upsertConfigElementEndpoint = async function (req, user) { const configData = req.body return ConfigService.upsertConfigElement(configData) } -const listConfigEndpoint = async function () { +const listConfigEndpoint = async function (user) { return ConfigService.listConfig() } -const getConfigEndpoint = async function (req) { +const getConfigEndpoint = async function (req, user) { const key = req.params.key return ConfigService.getConfigElement(key) } diff --git a/src/controllers/diagnostic-controller.js b/src/controllers/diagnostic-controller.js index 35d053beb..640ae6642 100644 --- a/src/controllers/diagnostic-controller.js +++ b/src/controllers/diagnostic-controller.js @@ -13,24 +13,24 @@ const DiagnosticService = require('../services/diagnostic-service') -const changeMicroserviceStraceStateEndPoint = async function (req) { - return DiagnosticService.changeMicroserviceStraceState(req.params.uuid, req.body, false) +const changeMicroserviceStraceStateEndPoint = async function (req, user) { + return DiagnosticService.changeMicroserviceStraceState(req.params.uuid, req.body, user, false) } -const getMicroserviceStraceDataEndPoint = async function (req) { - return DiagnosticService.getMicroserviceStraceData(req.params.uuid, req.query, false) +const getMicroserviceStraceDataEndPoint = async function (req, user) { + return DiagnosticService.getMicroserviceStraceData(req.params.uuid, req.query, user, false) } -const postMicroserviceStraceDataToFtpEndPoint = async function (req) { - return DiagnosticService.postMicroserviceStraceDatatoFtp(req.params.uuid, req.body, false) +const postMicroserviceStraceDataToFtpEndPoint = async function (req, user) { + return DiagnosticService.postMicroserviceStraceDatatoFtp(req.params.uuid, req.body, user, false) } -const createMicroserviceImageSnapshotEndPoint = async function (req) { - return DiagnosticService.postMicroserviceImageSnapshotCreate(req.params.uuid, false) +const createMicroserviceImageSnapshotEndPoint = async function (req, user) { + return DiagnosticService.postMicroserviceImageSnapshotCreate(req.params.uuid, user, false) } -const getMicroserviceImageSnapshotEndPoint = async function (req) { - return DiagnosticService.getMicroserviceImageSnapshot(req.params.uuid, false) +const getMicroserviceImageSnapshotEndPoint = async function (req, user) { + return DiagnosticService.getMicroserviceImageSnapshot(req.params.uuid, user, false) } module.exports = { diff --git a/src/controllers/edge-resource-controller.js b/src/controllers/edge-resource-controller.js index e4ec39658..f6ca86473 100644 --- a/src/controllers/edge-resource-controller.js +++ b/src/controllers/edge-resource-controller.js @@ -13,24 +13,24 @@ const EdgeResourceService = require('../services/edge-resource-service') -const createEdgeResourceEndpoint = async function (req) { +const createEdgeResourceEndpoint = async function (req, user) { const edgeResourceData = req.body - return EdgeResourceService.createEdgeResource(edgeResourceData) + return EdgeResourceService.createEdgeResource(edgeResourceData, user) } -const updateEdgeResourceEndpoint = async function (req) { +const updateEdgeResourceEndpoint = async function (req, user) { const edgeResourceData = req.body const { version, name } = req.params - return EdgeResourceService.updateEdgeResourceEndpoint(edgeResourceData, { name, version }) + return EdgeResourceService.updateEdgeResourceEndpoint(edgeResourceData, { name, version }, user) } -const listEdgeResourcesEndpoint = async function (req) { - return { edgeResources: await EdgeResourceService.listEdgeResources() } +const listEdgeResourcesEndpoint = async function (req, user) { + return { edgeResources: await EdgeResourceService.listEdgeResources(user) } } -const getEdgeResourceEndpoint = async function (req) { +const getEdgeResourceEndpoint = async function (req, user) { const { version, name } = req.params - const result = await EdgeResourceService.getEdgeResource({ name, version }) + const result = await EdgeResourceService.getEdgeResource({ name, version }, user) if (version) { return result } else { @@ -38,27 +38,27 @@ const getEdgeResourceEndpoint = async function (req) { } } -const getEdgeResourceAllVersionsEndpoint = async function (req) { +const getEdgeResourceAllVersionsEndpoint = async function (req, user) { const { name } = req.params - const result = await EdgeResourceService.getEdgeResource({ name }) + const result = await EdgeResourceService.getEdgeResource({ name }, user) return { edgeResources: result } } -const deleteEdgeResourceEndpoint = async function (req) { +const deleteEdgeResourceEndpoint = async function (req, user) { const { version, name } = req.params - return EdgeResourceService.deleteEdgeResource({ name, version }) + return EdgeResourceService.deleteEdgeResource({ name, version }, user) } -const linkEdgeResourceEndpoint = async function (req) { +const linkEdgeResourceEndpoint = async function (req, user) { const { name, version } = req.params const { uuid } = req.body - return EdgeResourceService.linkEdgeResource({ name, version }, uuid) + return EdgeResourceService.linkEdgeResource({ name, version }, uuid, user) } -const unlinkEdgeResourceEndpoint = async function (req) { +const unlinkEdgeResourceEndpoint = async function (req, user) { const { name, version } = req.params const { uuid } = req.body - return EdgeResourceService.unlinkEdgeResource({ name, version }, uuid) + return EdgeResourceService.unlinkEdgeResource({ name, version }, uuid, user) } module.exports = { diff --git a/src/controllers/iofog-controller.js b/src/controllers/iofog-controller.js index 3d2f86ccb..2a6c793c7 100644 --- a/src/controllers/iofog-controller.js +++ b/src/controllers/iofog-controller.js @@ -14,83 +14,83 @@ const FogService = require('../services/iofog-service') const qs = require('qs') -async function createFogEndPoint (req) { +async function createFogEndPoint (req, user) { const newFog = req.body - return FogService.createFogEndPoint(newFog, false) + return FogService.createFogEndPoint(newFog, user, false) } -async function updateFogEndPoint (req) { +async function updateFogEndPoint (req, user) { const updateFog = req.body updateFog.uuid = req.params.uuid - return FogService.updateFogEndPoint(updateFog, false) + return FogService.updateFogEndPoint(updateFog, user, false) } -async function deleteFogEndPoint (req) { +async function deleteFogEndPoint (req, user) { const deleteFog = { uuid: req.params.uuid } - return FogService.deleteFogEndPoint(deleteFog, false) + return FogService.deleteFogEndPoint(deleteFog, user, false) } -async function getFogEndPoint (req) { +async function getFogEndPoint (req, user) { const getFog = { uuid: req.params.uuid } - return FogService.getFogEndPoint(getFog, false) + return FogService.getFogEndPoint(getFog, user, false) } -async function getFogListEndPoint (req) { +async function getFogListEndPoint (req, user) { const isSystem = req.query && req.query.system ? req.query.system === 'true' : false const query = qs.parse(req.query) - return FogService.getFogListEndPoint(query.filters, false, isSystem) + return FogService.getFogListEndPoint(query.filters, user, false, isSystem) } -async function generateProvisionKeyEndPoint (req) { +async function generateProvisionKeyEndPoint (req, user) { const fog = { uuid: req.params.uuid } - return FogService.generateProvisioningKeyEndPoint(fog, false) + return FogService.generateProvisioningKeyEndPoint(fog, user, false) } -async function setFogVersionCommandEndPoint (req) { +async function setFogVersionCommandEndPoint (req, user) { const fogVersionCommand = { uuid: req.params.uuid, versionCommand: req.params.versionCommand } - return FogService.setFogVersionCommandEndPoint(fogVersionCommand, false) + return FogService.setFogVersionCommandEndPoint(fogVersionCommand, user, false) } -async function setFogRebootCommandEndPoint (req) { +async function setFogRebootCommandEndPoint (req, user) { const fog = { uuid: req.params.uuid } - return FogService.setFogRebootCommandEndPoint(fog, false) + return FogService.setFogRebootCommandEndPoint(fog, user, false) } -async function getHalHardwareInfoEndPoint (req) { +async function getHalHardwareInfoEndPoint (req, user) { const uuidObj = { uuid: req.params.uuid } - return FogService.getHalHardwareInfoEndPoint(uuidObj, false) + return FogService.getHalHardwareInfoEndPoint(uuidObj, user, false) } -async function getHalUsbInfoEndPoint (req) { +async function getHalUsbInfoEndPoint (req, user) { const uuidObj = { uuid: req.params.uuid } - return FogService.getHalUsbInfoEndPoint(uuidObj, false) + return FogService.getHalUsbInfoEndPoint(uuidObj, user, false) } -async function setFogPruneCommandEndPoint (req) { +async function setFogPruneCommandEndPoint (req, user) { const fog = { uuid: req.params.uuid } - return FogService.setFogPruneCommandEndPoint(fog, false) + return FogService.setFogPruneCommandEndPoint(fog, user, false) } module.exports = { diff --git a/src/controllers/microservices-controller.js b/src/controllers/microservices-controller.js index 367c3003e..f2ff25531 100644 --- a/src/controllers/microservices-controller.js +++ b/src/controllers/microservices-controller.js @@ -15,108 +15,108 @@ const MicroservicesService = require('../services/microservices-service') const YAMLParserService = require('../services/yaml-parser-service') const { rvaluesVarSubstition } = require('../helpers/template-helper') -const createMicroserviceOnFogEndPoint = async function (req) { +const createMicroserviceOnFogEndPoint = async function (req, user) { const microservice = req.body - return MicroservicesService.createMicroserviceEndPoint(microservice, false) + return MicroservicesService.createMicroserviceEndPoint(microservice, user, false) } -const createMicroserviceYAMLEndPoint = async function (req) { +const createMicroserviceYAMLEndPoint = async function (req, user) { const fileContent = req.file.buffer.toString() const microservice = await YAMLParserService.parseMicroserviceFile(fileContent) - await rvaluesVarSubstition(microservice, { self: microservice }) - return MicroservicesService.createMicroserviceEndPoint(microservice, false) + await rvaluesVarSubstition(microservice, { self: microservice }, user) + return MicroservicesService.createMicroserviceEndPoint(microservice, user, false) } -const getMicroserviceEndPoint = async function (req) { +const getMicroserviceEndPoint = async function (req, user) { const microserviceUuid = req.params.uuid - return MicroservicesService.getMicroserviceEndPoint(microserviceUuid, false) + return MicroservicesService.getMicroserviceEndPoint(microserviceUuid, user, false) } -const updateMicroserviceEndPoint = async function (req) { +const updateMicroserviceEndPoint = async function (req, user) { const microservice = req.body const microserviceUuid = req.params.uuid - return MicroservicesService.updateMicroserviceEndPoint(microserviceUuid, microservice, false) + return MicroservicesService.updateMicroserviceEndPoint(microserviceUuid, microservice, user, false) } -const updateMicroserviceYAMLEndPoint = async function (req) { +const updateMicroserviceYAMLEndPoint = async function (req, user) { const microserviceUuid = req.params.uuid const fileContent = req.file.buffer.toString() const microservice = await YAMLParserService.parseMicroserviceFile(fileContent) - await rvaluesVarSubstition(microservice, { self: microservice }) - return MicroservicesService.updateMicroserviceEndPoint(microserviceUuid, microservice, false) + await rvaluesVarSubstition(microservice, { self: microservice }, user) + return MicroservicesService.updateMicroserviceEndPoint(microserviceUuid, microservice, user, false) } -const deleteMicroserviceEndPoint = async function (req) { +const deleteMicroserviceEndPoint = async function (req, user) { const microserviceUuid = req.params.uuid const microserviceData = req.body || {} - return MicroservicesService.deleteMicroserviceEndPoint(microserviceUuid, microserviceData, false) + return MicroservicesService.deleteMicroserviceEndPoint(microserviceUuid, microserviceData, user, false) } -const getMicroservicesByApplicationEndPoint = async function (req) { +const getMicroservicesByApplicationEndPoint = async function (req, user) { // API Retro compatibility const flowId = req.query.flowId const applicationName = req.query.application - return MicroservicesService.listMicroservicesEndPoint({ applicationName, flowId }, false) + return MicroservicesService.listMicroservicesEndPoint({ applicationName, flowId }, user, false) } -const createMicroserviceRouteEndPoint = async function (req) { +const createMicroserviceRouteEndPoint = async function (req, user) { const sourceUuid = req.params.uuid const destUuid = req.params.receiverUuid - return MicroservicesService.createRouteEndPoint(sourceUuid, destUuid, false) + return MicroservicesService.createRouteEndPoint(sourceUuid, destUuid, user, false) } -const deleteMicroserviceRouteEndPoint = async function (req) { +const deleteMicroserviceRouteEndPoint = async function (req, user) { const sourceUuid = req.params.uuid const destUuid = req.params.receiverUuid - return MicroservicesService.deleteRouteEndPoint(sourceUuid, destUuid, false) + return MicroservicesService.deleteRouteEndPoint(sourceUuid, destUuid, user, false) } -const createMicroservicePortMappingEndPoint = async function (req) { +const createMicroservicePortMappingEndPoint = async function (req, user) { const uuid = req.params.uuid const portMappingData = req.body - return MicroservicesService.createPortMappingEndPoint(uuid, portMappingData, false) + return MicroservicesService.createPortMappingEndPoint(uuid, portMappingData, user, false) } -const deleteMicroservicePortMappingEndPoint = async function (req) { +const deleteMicroservicePortMappingEndPoint = async function (req, user) { const uuid = req.params.uuid const internalPort = req.params.internalPort - return MicroservicesService.deletePortMappingEndPoint(uuid, internalPort, false) + return MicroservicesService.deletePortMappingEndPoint(uuid, internalPort, user, false) } -const listMicroservicePortMappingsEndPoint = async function (req) { +const listMicroservicePortMappingsEndPoint = async function (req, user) { const uuid = req.params.uuid - const ports = await MicroservicesService.listMicroservicePortMappingsEndPoint(uuid, false) + const ports = await MicroservicesService.listMicroservicePortMappingsEndPoint(uuid, user, false) return { ports: ports } } -const createMicroserviceVolumeMappingEndPoint = async function (req) { +const createMicroserviceVolumeMappingEndPoint = async function (req, user) { const microserviceUuid = req.params.uuid const volumeMappingData = req.body - const volumeMapping = await MicroservicesService.createVolumeMappingEndPoint(microserviceUuid, volumeMappingData, false) + const volumeMapping = await MicroservicesService.createVolumeMappingEndPoint(microserviceUuid, volumeMappingData, user, false) return { id: volumeMapping.id } } -const listMicroserviceVolumeMappingsEndPoint = async function (req) { +const listMicroserviceVolumeMappingsEndPoint = async function (req, user) { const uuid = req.params.uuid - const volumeMappings = await MicroservicesService.listVolumeMappingsEndPoint(uuid, false) + const volumeMappings = await MicroservicesService.listVolumeMappingsEndPoint(uuid, user, false) return { volumeMappings: volumeMappings } } -const deleteMicroserviceVolumeMappingEndPoint = async function (req) { +const deleteMicroserviceVolumeMappingEndPoint = async function (req, user) { const uuid = req.params.uuid const id = req.params.id - return MicroservicesService.deleteVolumeMappingEndPoint(uuid, id, false) + return MicroservicesService.deleteVolumeMappingEndPoint(uuid, id, user, false) } -const listAllPublicPortsEndPoint = async function (req) { - return MicroservicesService.listAllPublicPortsEndPoint() +const listAllPublicPortsEndPoint = async function (req, user) { + return MicroservicesService.listAllPublicPortsEndPoint(user) } module.exports = { diff --git a/src/controllers/registry-controller.js b/src/controllers/registry-controller.js index ab633cb0e..906db93cf 100644 --- a/src/controllers/registry-controller.js +++ b/src/controllers/registry-controller.js @@ -13,26 +13,26 @@ const RegistryService = require('../services/registry-service') -const createRegistryEndPoint = async function (req) { +const createRegistryEndPoint = async function (req, user) { const registry = req.body - return RegistryService.createRegistry(registry) + return RegistryService.createRegistry(registry, user) } -const getRegistriesEndPoint = async function (req) { - return RegistryService.findRegistries(false) +const getRegistriesEndPoint = async function (req, user) { + return RegistryService.findRegistries(user, false) } -const deleteRegistryEndPoint = async function (req) { +const deleteRegistryEndPoint = async function (req, user) { const deleteRegistry = { id: parseInt(req.params.id) } - return RegistryService.deleteRegistry(deleteRegistry, false) + return RegistryService.deleteRegistry(deleteRegistry, user, false) } -const updateRegistryEndPoint = async function (req) { +const updateRegistryEndPoint = async function (req, user) { const registry = req.body const registryId = req.params.id - return RegistryService.updateRegistry(registry, registryId, false) + return RegistryService.updateRegistry(registry, registryId, user, false) } module.exports = { diff --git a/src/controllers/routing-controller.js b/src/controllers/routing-controller.js index 8d6df8bc4..01b5f8ec8 100644 --- a/src/controllers/routing-controller.js +++ b/src/controllers/routing-controller.js @@ -13,32 +13,32 @@ const RoutingService = require('../services/routing-service') -const createRoutingEndpoint = async function (req) { +const createRoutingEndpoint = async function (req, user) { const routerData = req.body - return RoutingService.createRouting(routerData, false) + return RoutingService.createRouting(routerData, user, false) } -const getRoutingsEndPoint = async function (req) { - return RoutingService.getRoutings(false) +const getRoutingsEndPoint = async function (req, user) { + return RoutingService.getRoutings(user, false) } -const getRoutingEndPoint = async function (req) { +const getRoutingEndPoint = async function (req, user) { const routeName = req.params.name const appName = req.params.appName - return RoutingService.getRouting(appName, routeName, false) + return RoutingService.getRouting(appName, routeName, user, false) } -const updateRoutingEndpoint = async function (req) { +const updateRoutingEndpoint = async function (req, user) { const routeName = req.params.name const appName = req.params.appName const routeData = req.body - return RoutingService.updateRouting(appName, routeName, routeData, false) + return RoutingService.updateRouting(appName, routeName, routeData, user, false) } -const deleteRoutingEndpoint = async function (req) { +const deleteRoutingEndpoint = async function (req, user) { const routeName = req.params.name const appName = req.params.appName - return RoutingService.deleteRouting(appName, routeName, false) + return RoutingService.deleteRouting(appName, routeName, user, false) } module.exports = { diff --git a/src/controllers/tunnel-controller.js b/src/controllers/tunnel-controller.js index fb3ea34c9..7bc0ac9be 100644 --- a/src/controllers/tunnel-controller.js +++ b/src/controllers/tunnel-controller.js @@ -15,7 +15,7 @@ const TunnelService = require('../services/tunnel-service') const Errors = require('../helpers/errors') const ErrorMessages = require('../helpers/error-messages') -const manageTunnelEndPoint = async function (req) { +const manageTunnelEndPoint = async function (req, user) { const action = req.body.action const tunnelData = { iofogUuid: req.params.id @@ -23,21 +23,21 @@ const manageTunnelEndPoint = async function (req) { switch (action) { case 'open': - await TunnelService.openTunnel(tunnelData, false) + await TunnelService.openTunnel(tunnelData, user, false) break case 'close': - await TunnelService.closeTunnel(tunnelData) + await TunnelService.closeTunnel(tunnelData, user) break default: throw new Errors.ValidationError(ErrorMessages.INVALID_ACTION_PROPERTY) } } -const getTunnelEndPoint = async function (req) { +const getTunnelEndPoint = async function (req, user) { const tunnelData = { iofogUuid: req.params.id } - return TunnelService.findTunnel(tunnelData) + return TunnelService.findTunnel(tunnelData, user) } module.exports = { diff --git a/src/services/application-service.js b/src/services/application-service.js index c337b9ec2..a823588f4 100644 --- a/src/services/application-service.js +++ b/src/services/application-service.js @@ -28,11 +28,11 @@ const remove = require('lodash/remove') const onlyUnique = (value, index, self) => self.indexOf(value) === index -const createApplicationEndPoint = async function (applicationData, isCLI, transaction) { +const createApplicationEndPoint = async function (applicationData, user, isCLI, transaction) { // if template is provided, use template data if (applicationData.template && applicationData.template.name) { applicationData = { - ...await ApplicationTemplateService.getApplicationDataFromTemplate(applicationData.template, isCLI, transaction), + ...await ApplicationTemplateService.getApplicationDataFromTemplate(applicationData.template, user, isCLI, transaction), isSystem: applicationData.isSystem, name: applicationData.name, description: applicationData.description, @@ -72,13 +72,13 @@ const createApplicationEndPoint = async function (applicationData, isCLI, transa try { if (applicationData.microservices) { for (const msvcData of applicationData.microservices) { - await MicroserviceService.createMicroserviceEndPoint(msvcData, isCLI, transaction) + await MicroserviceService.createMicroserviceEndPoint(msvcData, user, isCLI, transaction) } } if (applicationData.routes) { for (const routeData of applicationData.routes) { - await RoutingService.createRouting(routeData, isCLI, transaction) + await RoutingService.createRouting(routeData, user, isCLI, transaction) } } @@ -88,12 +88,12 @@ const createApplicationEndPoint = async function (applicationData, isCLI, transa } } catch (e) { // If anything failed during creating the application, delete all that was created - await deleteApplicationEndPoint({ name: application.name }, isCLI, transaction) + await deleteApplicationEndPoint({ name: application.name }, user, isCLI, transaction) throw e } } -const deleteApplicationEndPoint = async function (conditions, isCLI, transaction) { +const deleteApplicationEndPoint = async function (conditions, user, isCLI, transaction) { const whereObj = { ...conditions } @@ -105,7 +105,7 @@ const deleteApplicationEndPoint = async function (conditions, isCLI, transaction } // Only patches the metadata (running, name, description, etc.) -const patchApplicationEndPoint = async function (applicationData, conditions, isCLI, transaction) { +const patchApplicationEndPoint = async function (applicationData, conditions, user, isCLI, transaction) { await Validator.validate(applicationData, Validator.schemas.applicationPatch) const oldApplication = await ApplicationManager.findOne({ ...conditions }, transaction) @@ -137,11 +137,11 @@ const patchApplicationEndPoint = async function (applicationData, conditions, is } // Updates the state (microservices, routes, etc.) -const updateApplicationEndPoint = async function (applicationData, name, isCLI, transaction) { +const updateApplicationEndPoint = async function (applicationData, name, user, isCLI, transaction) { // if template is provided, use template data if (applicationData.template && applicationData.template.name) { applicationData = { - ...await ApplicationTemplateService.getApplicationDataFromTemplate(applicationData.template, isCLI, transaction), + ...await ApplicationTemplateService.getApplicationDataFromTemplate(applicationData.template, user, isCLI, transaction), isSystem: applicationData.isSystem, name: applicationData.name || name, description: applicationData.description, @@ -188,10 +188,10 @@ const updateApplicationEndPoint = async function (applicationData, name, isCLI, await ApplicationManager.update(where, updateApplicationData, transaction) if (applicationData.microservices) { - await _updateMicroservices(application.name, applicationData.microservices, isCLI, transaction) + await _updateMicroservices(application.name, applicationData.microservices, user, isCLI, transaction) } if (applicationData.routes) { - await _updateRoutes(application.name, applicationData.routes, isCLI, transaction) + await _updateRoutes(application.name, applicationData.routes, user, isCLI, transaction) } if (oldApplication.isActivated !== applicationData.isActivated) { @@ -199,7 +199,7 @@ const updateApplicationEndPoint = async function (applicationData, name, isCLI, } } -const _updateRoutes = async function (application, routes, isCLI, transaction) { +const _updateRoutes = async function (application, routes, user, isCLI, transaction) { // Update routes const updatedRoutes = [...routes] const oldRoutes = await ApplicationManager.findApplicationRoutes({ name: application }, transaction) @@ -209,19 +209,19 @@ const _updateRoutes = async function (application, routes, isCLI, transaction) { for (const oldRoute of oldRoutes) { const removed = remove(updatedRoutes, (n) => oldRoute.name === n.name) if (!removed.length) { - await RoutingService.deleteRouting(oldRoute.name, isCLI, transaction) + await RoutingService.deleteRouting(oldRoute.name, user, isCLI, transaction) } else { const updatedRoute = removed[0] - await RoutingService.updateRouting(application, updatedRoute.name, updatedRoute, isCLI, transaction) + await RoutingService.updateRouting(application, updatedRoute.name, updatedRoute, user, isCLI, transaction) } } // Create missing routes for (const route of updatedRoutes) { - await RoutingService.createRouting(route, isCLI, transaction) + await RoutingService.createRouting(route, user, isCLI, transaction) } } -const _updateMicroservices = async function (application, microservices, isCLI, transaction) { +const _updateMicroservices = async function (application, microservices, user, isCLI, transaction) { const updatedMicroservices = [...microservices] // Update microservices const oldMicroservices = await ApplicationManager.findApplicationMicroservices({ name: application }, transaction) @@ -238,14 +238,14 @@ const _updateMicroservices = async function (application, microservices, isCLI, iofogUuids.push(oldMsvc.iofogUuid) } else { const updatedMsvc = removed[0] - const updatedMicroservices = await MicroserviceService.updateMicroserviceEndPoint(oldMsvc.uuid, updatedMsvc, isCLI, transaction, false) + const updatedMicroservices = await MicroserviceService.updateMicroserviceEndPoint(oldMsvc.uuid, updatedMsvc, user, isCLI, transaction, false) oldMsvcsIofogUuids.push(updatedMicroservices.microserviceIofogUuid) updatedMsvcsUuid.push(updatedMicroservices.updatedMicroserviceIofogUuid) } } // Create missing microservices for (const microservice of updatedMicroservices) { - await MicroserviceService.createMicroserviceEndPoint(microservice, isCLI, transaction) + await MicroserviceService.createMicroserviceEndPoint(microservice, user, isCLI, transaction) } iofogUuids .filter(onlyUnique) @@ -270,7 +270,7 @@ const _updateMicroservices = async function (application, microservices, isCLI, }) } -const getUserApplicationsEndPoint = async function (isCLI, transaction) { +const getUserApplicationsEndPoint = async function (user, isCLI, transaction) { const application = { isSystem: false } @@ -300,7 +300,7 @@ async function _buildApplicationObject (application, transaction) { return application } -async function getApplication (conditions, isCLI, transaction) { +async function getApplication (conditions, user, isCLI, transaction) { const where = isCLI ? { ...conditions } : { ...conditions } @@ -314,8 +314,8 @@ async function getApplication (conditions, isCLI, transaction) { return application } -const getApplicationEndPoint = async function (conditions, isCLI, transaction) { - const application = await getApplication(conditions, isCLI, transaction) +const getApplicationEndPoint = async function (conditions, user, isCLI, transaction) { + const application = await getApplication(conditions, user, isCLI, transaction) return application } diff --git a/src/services/application-template-service.js b/src/services/application-template-service.js index df68d89c2..8fa309cb2 100644 --- a/src/services/application-template-service.js +++ b/src/services/application-template-service.js @@ -24,7 +24,7 @@ const ApplicationTemplateVariableManager = require('../data/managers/application const TransactionDecorator = require('../decorators/transaction-decorator') const Validator = require('../schemas') -const createApplicationTemplateEndPoint = async function (applicationTemplateData, isCLI, transaction) { +const createApplicationTemplateEndPoint = async function (applicationTemplateData, user, isCLI, transaction) { // Add a name field to pass schema validation using the applicationCreate schema applicationTemplateData.application = { ...applicationTemplateData.application, name: 'validation' } await Validator.validate(applicationTemplateData, Validator.schemas.applicationTemplateCreate) @@ -56,12 +56,12 @@ const createApplicationTemplateEndPoint = async function (applicationTemplateDat } } catch (e) { // If anything failed during creating the application, delete all that was created - await deleteApplicationTemplateEndPoint({ name: applicationTemplate.name }, isCLI, transaction) + await deleteApplicationTemplateEndPoint({ name: applicationTemplate.name }, user, isCLI, transaction) throw e } } -const deleteApplicationTemplateEndPoint = async function (conditions, isCLI, transaction) { +const deleteApplicationTemplateEndPoint = async function (conditions, user, isCLI, transaction) { const whereObj = { ...conditions } @@ -70,7 +70,7 @@ const deleteApplicationTemplateEndPoint = async function (conditions, isCLI, tra await ApplicationTemplateManager.delete(where, transaction) } -const patchApplicationTemplateEndPoint = async function (applicationTemplateData, conditions, isCLI, transaction) { +const patchApplicationTemplateEndPoint = async function (applicationTemplateData, conditions, user, isCLI, transaction) { await Validator.validate(applicationTemplateData, Validator.schemas.applicationTemplatePatch) const oldApplicationTemplate = await ApplicationTemplateManager.findOne({ ...conditions }, transaction) @@ -95,7 +95,7 @@ const patchApplicationTemplateEndPoint = async function (applicationTemplateData await ApplicationTemplateManager.update(where, updateApplicationTemplateData, transaction) } -const updateApplicationTemplateEndPoint = async function (applicationTemplateData, name, isCLI, transaction) { +const updateApplicationTemplateEndPoint = async function (applicationTemplateData, name, user, isCLI, transaction) { // Add a name field to pass schema validation using the applicationCreate schema applicationTemplateData.application = { ...applicationTemplateData.application, name: 'validation' } await Validator.validate(applicationTemplateData, Validator.schemas.applicationTemplateUpdate) @@ -105,7 +105,7 @@ const updateApplicationTemplateEndPoint = async function (applicationTemplateDat const oldApplicationTemplate = await ApplicationTemplateManager.findOne({ name }, transaction) if (!oldApplicationTemplate) { - return createApplicationTemplateEndPoint({ ...applicationTemplateData, name }, isCLI, transaction) + return createApplicationTemplateEndPoint({ ...applicationTemplateData, name }, user, isCLI, transaction) } if (applicationTemplateData.name) { await _checkForDuplicateName(applicationTemplateData.name, oldApplicationTemplate.id, transaction) @@ -124,7 +124,7 @@ const updateApplicationTemplateEndPoint = async function (applicationTemplateDat await ApplicationTemplateManager.update(where, updateApplicationTemplateData, transaction) if (applicationTemplateData.variables) { - await _updateVariables(oldApplicationTemplate.id, applicationTemplateData.variables, isCLI, transaction) + await _updateVariables(oldApplicationTemplate.id, applicationTemplateData.variables, user, isCLI, transaction) } return { @@ -146,14 +146,14 @@ const _createVariable = async function (applicationTemplateId, variableData, tra return ApplicationTemplateVariableManager.create({ ...newVariable, applicationTemplateId }, transaction) } -const _updateVariables = async function (applicationTemplateId, variables, isCLI, transaction) { +const _updateVariables = async function (applicationTemplateId, variables, user, isCLI, transaction) { await ApplicationTemplateVariableManager.delete({ applicationTemplateId }, transaction) for (const variableData of variables) { await _createVariable(applicationTemplateId, variableData, transaction) } } -const getUserApplicationTemplatesEndPoint = async function (isCLI, transaction) { +const getUserApplicationTemplatesEndPoint = async function (user, isCLI, transaction) { const application = { } @@ -187,7 +187,7 @@ const getAllApplicationTemplatesEndPoint = async function (isCLI, transaction) { } } -async function getApplicationTemplate (conditions, isCLI, transaction) { +async function getApplicationTemplate (conditions, user, isCLI, transaction) { const where = isCLI ? { ...conditions } : { ...conditions } @@ -200,11 +200,11 @@ async function getApplicationTemplate (conditions, isCLI, transaction) { return _buildGetApplicationObj(application) } -const getApplicationTemplateEndPoint = async function (name, isCLI, transaction) { - return getApplicationTemplate(name, isCLI, transaction) +const getApplicationTemplateEndPoint = async function (name, user, isCLI, transaction) { + return getApplicationTemplate(name, user, isCLI, transaction) } -const getApplicationDataFromTemplate = async function (deploymentData, isCLI, transaction) { +const getApplicationDataFromTemplate = async function (deploymentData, user, isCLI, transaction) { await Validator.validate(deploymentData, Validator.schemas.applicationTemplateDeploy) const applicationTemplateDBObject = await ApplicationTemplateManager.findOnePopulated({ name: deploymentData.name }, transaction) @@ -236,7 +236,7 @@ const getApplicationDataFromTemplate = async function (deploymentData, isCLI, tr } // default values are overwritten by user defined values, and self is always overwritten to the current object - await rvaluesVarSubstition(newApplication, { ...defaultVariablesValues, ...userProvidedVariables, self: newApplication }) + await rvaluesVarSubstition(newApplication, { ...defaultVariablesValues, ...userProvidedVariables, self: newApplication }, user) for (const msvc of newApplication.microservices) { // Send it back as a string for application creation and validation diff --git a/src/services/catalog-service.js b/src/services/catalog-service.js index a6c0da298..9b7a07a77 100644 --- a/src/services/catalog-service.js +++ b/src/services/catalog-service.js @@ -26,11 +26,11 @@ const RegistryManager = require('../data/managers/registry-manager') const MicroserviceManager = require('../data/managers/microservice-manager') const MicroseriveStates = require('../enums/microservice-state') -const createCatalogItemEndPoint = async function (data, transaction) { +const createCatalogItemEndPoint = async function (data, user, transaction) { await Validator.validate(data, Validator.schemas.catalogItemCreate) await _checkForDuplicateName(data.name, transaction) await _checkForRestrictedPublisher(data.publisher) - const catalogItem = await _createCatalogItem(data, transaction) + const catalogItem = await _createCatalogItem(data, user, transaction) await _createCatalogImages(data, catalogItem, transaction) await _createCatalogItemInputType(data, catalogItem, transaction) await _createCatalogItemOutputType(data, catalogItem, transaction) @@ -40,7 +40,7 @@ const createCatalogItemEndPoint = async function (data, transaction) { } } -const updateCatalogItemEndPoint = async function (id, data, isCLI, transaction) { +const updateCatalogItemEndPoint = async function (id, data, user, isCLI, transaction) { await Validator.validate(data, Validator.schemas.catalogItemUpdate) const where = isCLI @@ -57,7 +57,7 @@ const updateCatalogItemEndPoint = async function (id, data, isCLI, transaction) await _updateCatalogItemIOTypes(data, where, transaction) } -const listCatalogItemsEndPoint = async function (isCLI, transaction) { +const listCatalogItemsEndPoint = async function (user, isCLI, transaction) { const where = isCLI ? {} : { @@ -74,7 +74,7 @@ const listCatalogItemsEndPoint = async function (isCLI, transaction) { } } -async function getCatalogItem (id, isCLI, transaction) { +async function getCatalogItem (id, user, isCLI, transaction) { const where = isCLI ? { id: id } : { @@ -93,11 +93,11 @@ async function getCatalogItem (id, isCLI, transaction) { return item } -const getCatalogItemEndPoint = async function (id, isCLI, transaction) { - return getCatalogItem(id, isCLI, transaction) +const getCatalogItemEndPoint = async function (id, user, isCLI, transaction) { + return getCatalogItem(id, user, isCLI, transaction) } -const deleteCatalogItemEndPoint = async function (id, isCLI, transaction) { +const deleteCatalogItemEndPoint = async function (id, user, isCLI, transaction) { const where = isCLI ? { id: id @@ -200,7 +200,7 @@ const _checkIfItemExists = async function (where, transaction) { return item } -const _createCatalogItem = async function (data, transaction) { +const _createCatalogItem = async function (data, user, transaction) { let catalogItem = { name: data.name, description: data.description, diff --git a/src/services/diagnostic-service.js b/src/services/diagnostic-service.js index f138683cc..0b8502a12 100644 --- a/src/services/diagnostic-service.js +++ b/src/services/diagnostic-service.js @@ -26,9 +26,9 @@ const logger = require('../logger') const FtpClient = require('ftp') const mime = require('mime') -const changeMicroserviceStraceState = async function (uuid, data, isCLI, transaction) { +const changeMicroserviceStraceState = async function (uuid, data, user, isCLI, transaction) { await Validator.validate(data, Validator.schemas.straceStateUpdate) - const microservice = await MicroserviceService.getMicroserviceEndPoint(uuid, isCLI, transaction) + const microservice = await MicroserviceService.getMicroserviceEndPoint(uuid, user, isCLI, transaction) if (microservice.iofogUuid === null) { throw new Errors.ValidationError(ErrorMessages.STRACE_WITHOUT_FOG) } @@ -42,7 +42,7 @@ const changeMicroserviceStraceState = async function (uuid, data, isCLI, transac await ChangeTrackingService.update(microservice.iofogUuid, ChangeTrackingService.events.diagnostics, transaction) } -const getMicroserviceStraceData = async function (uuid, data, isCLI, transaction) { +const getMicroserviceStraceData = async function (uuid, data, user, isCLI, transaction) { await Validator.validate(data, Validator.schemas.straceGetData) const microserviceWhere = isCLI @@ -75,7 +75,7 @@ const getMicroserviceStraceData = async function (uuid, data, isCLI, transaction } } -const postMicroserviceStraceDatatoFtp = async function (uuid, data, isCLI, transaction) { +const postMicroserviceStraceDatatoFtp = async function (uuid, data, user, isCLI, transaction) { await Validator.validate(data, Validator.schemas.stracePostToFtp) const microserviceWhere = isCLI @@ -100,7 +100,7 @@ const postMicroserviceStraceDatatoFtp = async function (uuid, data, isCLI, trans _deleteFile(filePath) } -const postMicroserviceImageSnapshotCreate = async function (microserviceUuid, isCLI, transaction) { +const postMicroserviceImageSnapshotCreate = async function (microserviceUuid, user, isCLI, transaction) { const where = isCLI ? { uuid: microserviceUuid @@ -126,7 +126,7 @@ const postMicroserviceImageSnapshotCreate = async function (microserviceUuid, is await ChangeTrackingService.update(microservice.iofogUuid, ChangeTrackingService.events.imageSnapshot, transaction) } -const getMicroserviceImageSnapshot = async function (microserviceUuid, isCLI, transaction) { +const getMicroserviceImageSnapshot = async function (microserviceUuid, user, isCLI, transaction) { const where = isCLI ? { uuid: microserviceUuid diff --git a/src/services/edge-resource-service.js b/src/services/edge-resource-service.js index dfa5052d5..750e040a7 100644 --- a/src/services/edge-resource-service.js +++ b/src/services/edge-resource-service.js @@ -155,7 +155,7 @@ async function _updateOrchestrationTags (tagArray, edgeResourceModel, transactio } } -async function createEdgeResource (edgeResourceData, transaction) { +async function createEdgeResource (edgeResourceData, user, transaction) { await Validator.validate(edgeResourceData, Validator.schemas.edgeResourceCreate) const { name, description, version, orchestrationTags, interfaceProtocol, display, custom } = edgeResourceData const existingResource = await EdgeResourceManager.findOne({ name, version }, transaction) @@ -192,7 +192,7 @@ async function createEdgeResource (edgeResourceData, transaction) { return buildGetObject(resource) } -async function updateEdgeResourceEndpoint (edgeResourceData, { name: oldName, version }, transaction) { +async function updateEdgeResourceEndpoint (edgeResourceData, { name: oldName, version }, user, transaction) { await Validator.validate(edgeResourceData, Validator.schemas.edgeResourceUpdate) const oldData = await EdgeResourceManager.findOne({ name: oldName, version }, transaction) if (!oldData) { @@ -202,7 +202,7 @@ async function updateEdgeResourceEndpoint (edgeResourceData, { name: oldName, ve if (!edgeResourceData.version) { edgeResourceData.version = version } - return createEdgeResource(edgeResourceData, transaction) + return createEdgeResource(edgeResourceData, user, transaction) } if (edgeResourceData.version && oldData.version !== edgeResourceData.version) { throw new Errors.ValidationError(AppHelper.formatMessage(ErrorMessages.RESOURCE_UPDATE_VERSION_MISMATCH)) @@ -244,7 +244,7 @@ async function updateEdgeResourceEndpoint (edgeResourceData, { name: oldName, ve } } -async function deleteEdgeResource ({ name, version }, transaction) { +async function deleteEdgeResource ({ name, version }, user, transaction) { const resource = await EdgeResourceManager.findOne({ name, version }, transaction) if (!resource) { throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.NOT_FOUND_RESOURCE_NAME_VERSION, name, version)) @@ -258,7 +258,7 @@ async function deleteEdgeResource ({ name, version }, transaction) { await EdgeResourceManager.delete({ name, version }, transaction) } -async function linkEdgeResource ({ name, version }, uuid, transaction) { +async function linkEdgeResource ({ name, version }, uuid, user, transaction) { const resource = await EdgeResourceManager.findOne({ name, version }, transaction) if (!resource) { throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.NOT_FOUND_RESOURCE_NAME_VERSION, name, version)) @@ -274,7 +274,7 @@ async function linkEdgeResource ({ name, version }, uuid, transaction) { await ChangeTrackingService.update(agent.uuid, ChangeTrackingService.events.edgeResources, transaction) } -async function unlinkEdgeResource ({ name, version }, uuid, transaction) { +async function unlinkEdgeResource ({ name, version }, uuid, user, transaction) { const resource = await EdgeResourceManager.findOne({ name, version }, transaction) if (!resource) { throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.NOT_FOUND_RESOURCE_NAME_VERSION, name, version)) diff --git a/src/services/iofog-service.js b/src/services/iofog-service.js index a162b3e8e..06b1fce95 100644 --- a/src/services/iofog-service.js +++ b/src/services/iofog-service.js @@ -35,7 +35,7 @@ const Constants = require('../helpers/constants') const Op = require('sequelize').Op const lget = require('lodash/get') -async function createFogEndPoint (fogData, isCLI, transaction) { +async function createFogEndPoint (fogData, user, isCLI, transaction) { await Validator.validate(fogData, Validator.schemas.iofogCreate) let createFogData = { @@ -119,11 +119,11 @@ async function createFogEndPoint (fogData, isCLI, transaction) { await ChangeTrackingService.create(fog.uuid, transaction) if (fogData.abstractedHardwareEnabled) { - await _createHalMicroserviceForFog(fog, null, transaction) + await _createHalMicroserviceForFog(fog, null, user, transaction) } if (fogData.bluetoothEnabled) { - await _createBluetoothMicroserviceForFog(fog, null, transaction) + await _createBluetoothMicroserviceForFog(fog, null, user, transaction) } await ChangeTrackingService.update(createFogData.uuid, ChangeTrackingService.events.microserviceCommon, transaction) @@ -145,7 +145,7 @@ async function _setTags (fogModel, tagsArray, transaction) { } } -async function updateFogEndPoint (fogData, isCLI, transaction) { +async function updateFogEndPoint (fogData, user, isCLI, transaction) { await Validator.validate(fogData, Validator.schemas.iofogUpdate) const queryFogData = { uuid: fogData.uuid } @@ -268,7 +268,7 @@ async function updateFogEndPoint (fogData, isCLI, transaction) { msChanged = true } if (oldFog.abstractedHardwareEnabled === false && fogData.abstractedHardwareEnabled === true) { - await _createHalMicroserviceForFog(fogData, oldFog, transaction) + await _createHalMicroserviceForFog(fogData, oldFog, user, transaction) msChanged = true } @@ -277,7 +277,7 @@ async function updateFogEndPoint (fogData, isCLI, transaction) { msChanged = true } if (oldFog.bluetoothEnabled === false && fogData.bluetoothEnabled === true) { - await _createBluetoothMicroserviceForFog(fogData, oldFog, transaction) + await _createBluetoothMicroserviceForFog(fogData, oldFog, user, transaction) msChanged = true } @@ -359,7 +359,7 @@ async function _deleteFogRouter (fogData, transaction) { await MicroserviceManager.delete({ catalogItemId: routerCatalog.id, iofogUuid: fogData.uuid }, transaction) } -async function deleteFogEndPoint (fogData, isCLI, transaction) { +async function deleteFogEndPoint (fogData, user, isCLI, transaction) { await Validator.validate(fogData, Validator.schemas.iofogDelete) const queryFogData = { uuid: fogData.uuid } @@ -442,7 +442,7 @@ function _mapTags (fog) { return fog.tags ? fog.tags.map(t => t.value) : [] } -async function getFog (fogData, isCLI, transaction) { +async function getFog (fogData, user, isCLI, transaction) { await Validator.validate(fogData, Validator.schemas.iofogGet) const queryFogData = fogData.uuid ? { uuid: fogData.uuid } : { name: fogData.name } @@ -460,15 +460,15 @@ async function getFog (fogData, isCLI, transaction) { return _getFogExtraInformation(fog, transaction) } -async function getFogEndPoint (fogData, isCLI, transaction) { - return getFog(fogData, isCLI, transaction) +async function getFogEndPoint (fogData, user, isCLI, transaction) { + return getFog(fogData, user, isCLI, transaction) } -async function getFogListEndPoint (filters, isCLI, isSystem, transaction) { +async function getFogListEndPoint (filters, user, isCLI, isSystem, transaction) { await Validator.validate(filters, Validator.schemas.iofogFilters) // If listing system agent through REST API, make sure user is authenticated - if (isSystem && !isCLI && !lget('id')) { + if (isSystem && !isCLI && !lget(user, 'id')) { throw new Errors.AuthenticationError('Unauthorized') } @@ -485,7 +485,7 @@ async function getFogListEndPoint (filters, isCLI, isSystem, transaction) { } } -async function generateProvisioningKeyEndPoint (fogData, isCLI, transaction) { +async function generateProvisioningKeyEndPoint (fogData, user, isCLI, transaction) { await Validator.validate(fogData, Validator.schemas.iofogGenerateProvision) const queryFogData = { uuid: fogData.uuid } @@ -514,7 +514,7 @@ async function generateProvisioningKeyEndPoint (fogData, isCLI, transaction) { } } -async function setFogVersionCommandEndPoint (fogVersionData, isCLI, transaction) { +async function setFogVersionCommandEndPoint (fogVersionData, user, isCLI, transaction) { await Validator.validate(fogVersionData, Validator.schemas.iofogSetVersionCommand) const queryFogData = { uuid: fogVersionData.uuid } @@ -541,12 +541,12 @@ async function setFogVersionCommandEndPoint (fogVersionData, isCLI, transaction) throw new Errors.ValidationError(ErrorMessages.INVALID_VERSION_COMMAND_UPGRADE) } - await generateProvisioningKeyEndPoint({ uuid: fogVersionData.uuid }, isCLI, transaction) + await generateProvisioningKeyEndPoint({ uuid: fogVersionData.uuid }, user, isCLI, transaction) await FogVersionCommandManager.updateOrCreate({ iofogUuid: fogVersionData.uuid }, newVersionCommand, transaction) await ChangeTrackingService.update(fogVersionData.uuid, ChangeTrackingService.events.version, transaction) } -async function setFogRebootCommandEndPoint (fogData, isCLI, transaction) { +async function setFogRebootCommandEndPoint (fogData, user, isCLI, transaction) { await Validator.validate(fogData, Validator.schemas.iofogReboot) const queryFogData = { uuid: fogData.uuid } @@ -564,7 +564,7 @@ async function setFogRebootCommandEndPoint (fogData, isCLI, transaction) { await ChangeTrackingService.update(fogData.uuid, ChangeTrackingService.events.reboot, transaction) } -async function getHalHardwareInfoEndPoint (uuidObj, isCLI, transaction) { +async function getHalHardwareInfoEndPoint (uuidObj, user, isCLI, transaction) { await Validator.validate(uuidObj, Validator.schemas.halGet) const fog = await FogManager.findOne({ @@ -584,7 +584,7 @@ async function getHalHardwareInfoEndPoint (uuidObj, isCLI, transaction) { }, transaction) } -async function getHalUsbInfoEndPoint (uuidObj, isCLI, transaction) { +async function getHalUsbInfoEndPoint (uuidObj, user, isCLI, transaction) { await Validator.validate(uuidObj, Validator.schemas.halGet) const fog = await FogManager.findOne({ @@ -640,7 +640,7 @@ async function _processDeleteCommand (fog, transaction) { await FogManager.delete({ uuid: fog.uuid }, transaction) } -async function _createHalMicroserviceForFog (fogData, oldFog, transaction) { +async function _createHalMicroserviceForFog (fogData, oldFog, user, transaction) { const halItem = await CatalogService.getHalCatalogItem(transaction) const halMicroserviceData = { @@ -667,7 +667,7 @@ async function _deleteHalMicroserviceByFog (fogData, transaction) { await MicroserviceManager.delete(deleteHalMicroserviceData, transaction) } -async function _createBluetoothMicroserviceForFog (fogData, oldFog, transaction) { +async function _createBluetoothMicroserviceForFog (fogData, oldFog, user, transaction) { const bluetoothItem = await CatalogService.getBluetoothCatalogItem(transaction) const bluetoothMicroserviceData = { @@ -694,7 +694,7 @@ async function _deleteBluetoothMicroserviceByFog (fogData, transaction) { await MicroserviceManager.delete(deleteBluetoothMicroserviceData, transaction) } -async function setFogPruneCommandEndPoint (fogData, isCLI, transaction) { +async function setFogPruneCommandEndPoint (fogData, user, isCLI, transaction) { await Validator.validate(fogData, Validator.schemas.iofogPrune) const queryFogData = { uuid: fogData.uuid } diff --git a/src/services/microservice-ports/default.js b/src/services/microservice-ports/default.js index 07b504909..8ca6ac690 100644 --- a/src/services/microservice-ports/default.js +++ b/src/services/microservice-ports/default.js @@ -180,11 +180,11 @@ async function validatePublicPortAppHostTemplate (extraHost, templateArgs, msvc, throw new Errors.ValidationError(AppHelper.formatMessage(ErrorMessages.NOT_FOUND_HOST_TEMPLATE, templateArgs[4])) } -async function movePublicPortsToNewFog (updatedMicroservice, transaction) { +async function movePublicPortsToNewFog (updatedMicroservice, user, transaction) { const portMappings = await updatedMicroservice.getPorts() for (const portMapping of portMappings) { if (portMapping.isProxy) { - Proxy.moveProxyPortsToNewFog(updatedMicroservice, portMapping, transaction) + Proxy.moveProxyPortsToNewFog(updatedMicroservice, portMapping, user, transaction) continue } else if (!portMapping.isPublic) { continue @@ -201,13 +201,13 @@ async function movePublicPortsToNewFog (updatedMicroservice, transaction) { host: destAgentsRouter.host, port: destAgentsRouter.messagingPort } - const newProxy = await _createOrUpdateProxyMicroservice(localMapping, networkRouter, updatedMicroservice.iofogUuid, localProxy.catalogItemId, transaction) + const newProxy = await _createOrUpdateProxyMicroservice(localMapping, networkRouter, updatedMicroservice.iofogUuid, localProxy.catalogItemId, user, transaction) publicPort.localProxyId = newProxy.uuid await MicroservicePublicPortManager.updateOrCreate({ id: publicPort.id }, publicPort.toJSON(), transaction) } } -async function createPortMapping (microservice, portMappingData, transaction) { +async function createPortMapping (microservice, portMappingData, user, transaction) { if (!microservice.iofogUuid) { throw new Errors.ValidationError(AppHelper.formatMessage(ErrorMessages.REQUIRED_FOG_NODE)) } @@ -231,15 +231,15 @@ async function createPortMapping (microservice, portMappingData, transaction) { portMappingData.protocol = portMappingData.protocol || '' if (portMappingData.public) { - return _createPublicPortMapping(microservice, portMappingData, transaction) + return _createPublicPortMapping(microservice, portMappingData, user, transaction) } else if (portMappingData.proxy) { - return Proxy.createProxyPortMapping(microservice, portMappingData, transaction) + return Proxy.createProxyPortMapping(microservice, portMappingData, user, transaction) } else { - return _createSimplePortMapping(microservice, portMappingData, transaction) + return _createSimplePortMapping(microservice, portMappingData, user, transaction) } } -async function _createOrUpdateProxyMicroservice (mapping, networkRouter, hostUuid, proxyCatalogId, transaction) { +async function _createOrUpdateProxyMicroservice (mapping, networkRouter, hostUuid, proxyCatalogId, user, transaction) { const existingProxy = await MicroserviceManager.findOne({ catalogItemId: proxyCatalogId, iofogUuid: hostUuid }, transaction) if (existingProxy) { const config = JSON.parse(existingProxy.config || '{}') @@ -267,7 +267,7 @@ async function _createOrUpdateProxyMicroservice (mapping, networkRouter, hostUui return res } -async function _createPublicPortMapping (microservice, portMappingData, transaction) { +async function _createPublicPortMapping (microservice, portMappingData, user, transaction) { const isTcp = portMappingData.public.protocol ? portMappingData.public.protocol.toLowerCase() === 'tcp' : false const isUdp = portMappingData.protocol.toLowerCase() === 'udp' const localAgent = portMappingData.localAgent // This is populated by validating the ports @@ -289,6 +289,7 @@ async function _createPublicPortMapping (microservice, portMappingData, transact localNetworkRouter, microservice.iofogUuid, proxyCatalog.id, + user, transaction) : null @@ -306,6 +307,7 @@ async function _createPublicPortMapping (microservice, portMappingData, transact remoteNetworkRouter, portMappingData.publicHost.uuid, proxyCatalog.id, + user, transaction) : null } @@ -343,13 +345,13 @@ async function _createPublicPortMapping (microservice, portMappingData, transact } } -async function _deletePortMapping (microservice, portMapping, transaction) { +async function _deletePortMapping (microservice, portMapping, user, transaction) { if (portMapping.isPublic) { await _deletePublicPortMapping(microservice, portMapping, transaction) } else if (portMapping.isProxy) { - return Proxy.deleteProxyPortMapping(microservice, portMapping, transaction) + return Proxy.deleteProxyPortMapping(microservice, portMapping, user, transaction) } else { - await _deleteSimplePortMapping(microservice, portMapping, transaction) + await _deleteSimplePortMapping(microservice, portMapping, user, transaction) } } @@ -384,7 +386,7 @@ async function _deletePublicPortMapping (microservice, portMapping, transaction) await MicroservicePortManager.delete({ id: portMapping.id }, transaction) } -async function _createSimplePortMapping (microservice, portMappingData, transaction) { +async function _createSimplePortMapping (microservice, portMappingData, user, transaction) { // create port mapping const mappingData = { isPublic: false, @@ -399,7 +401,7 @@ async function _createSimplePortMapping (microservice, portMappingData, transact await switchOnUpdateFlagsForMicroservicesForPortMapping(microservice, false, transaction) } -async function _deleteSimplePortMapping (microservice, msPorts, transaction) { +async function _deleteSimplePortMapping (microservice, msPorts, user, transaction) { await MicroservicePortManager.delete({ id: msPorts.id }, transaction) const updateRebuildMs = { @@ -468,7 +470,7 @@ async function switchOnUpdateFlagsForMicroservicesForPortMapping (microservice, } } -async function listPortMappings (microserviceUuid, isCLI, transaction) { +async function listPortMappings (microserviceUuid, user, isCLI, transaction) { const where = isCLI ? { uuid: microserviceUuid } : { uuid: microserviceUuid } @@ -481,7 +483,7 @@ async function listPortMappings (microserviceUuid, isCLI, transaction) { return _buildPortsList(portsPairs, transaction) } -async function deletePortMapping (microserviceUuid, internalPort, isCLI, transaction) { +async function deletePortMapping (microserviceUuid, internalPort, user, isCLI, transaction) { const where = isCLI ? { uuid: microserviceUuid } : { uuid: microserviceUuid } @@ -503,13 +505,13 @@ async function deletePortMapping (microserviceUuid, internalPort, isCLI, transac throw new Errors.NotFoundError('port mapping not exists') } - await _deletePortMapping(microservice, msPorts, transaction) + await _deletePortMapping(microservice, msPorts, user, transaction) } -async function deletePortMappings (microservice, transaction) { +async function deletePortMappings (microservice, user, transaction) { const portMappings = await MicroservicePortManager.findAll({ microserviceUuid: microservice.uuid }, transaction) for (const ports of portMappings) { - await _deletePortMapping(microservice, ports, transaction) + await _deletePortMapping(microservice, ports, user, transaction) } } @@ -517,7 +519,7 @@ async function getPortMappings (microserviceUuid, transaction) { return MicroservicePortManager.findAll({ microserviceUuid }, transaction) } -function listAllPublicPorts (transaction) { +function listAllPublicPorts (user, transaction) { return MicroservicePortManager.findAllPublicPorts(transaction) } diff --git a/src/services/microservice-ports/proxy.js b/src/services/microservice-ports/proxy.js index d16a31f63..0a7e2dab2 100644 --- a/src/services/microservice-ports/proxy.js +++ b/src/services/microservice-ports/proxy.js @@ -20,7 +20,7 @@ const MicroservicePortManager = require('../../data/managers/microservice-port-m const MicroserviceProxyPortManager = require('../../data/managers/microservice-proxy-port-manager') const ProxyBrokerClient = require('../../helpers/proxy-broker-client') -async function _createOrUpdatePortRouterMicroservice (existingProxy, localPort, protocol, portRouterServerConfig, hostUuid, portRouterCatalogId, microserviceUuid, transaction) { +async function _createOrUpdatePortRouterMicroservice (existingProxy, localPort, protocol, portRouterServerConfig, hostUuid, portRouterCatalogId, microserviceUuid, user, transaction) { const proxyConfig = { name: `${microserviceUuid}_${localPort}`, server_addr: portRouterServerConfig.host, @@ -59,7 +59,7 @@ async function _createOrUpdatePortRouterMicroservice (existingProxy, localPort, return res } -async function createProxyPortMapping (microservice, portMappingData, transaction) { +async function createProxyPortMapping (microservice, portMappingData, user, transaction) { const protocol = portMappingData.protocol || 'tcp' // create proxy microservices @@ -82,6 +82,7 @@ async function createProxyPortMapping (microservice, portMappingData, transactio microservice.iofogUuid, portRouterCatalog.id, microservice.uuid, + user, transaction) const mappingData = { @@ -129,7 +130,7 @@ async function buildProxyPortMapping (pm, mapping, transaction) { } } -async function deleteProxyPortMapping (microservice, portMapping, transaction) { +async function deleteProxyPortMapping (microservice, portMapping, user, transaction) { const proxyPort = await portMapping.getProxyPort() if (proxyPort) { await _updateOrDeleteProxyMicroservice(proxyPort, false, transaction) @@ -164,7 +165,7 @@ async function _updateOrDeleteProxyMicroservice (proxyPort, isMove, transaction) } } -async function moveProxyPortsToNewFog (updatedMicroservice, portMapping, transaction) { +async function moveProxyPortsToNewFog (updatedMicroservice, portMapping, user, transaction) { const proxyPort = await portMapping.getProxyPort() const localProxy = await MicroserviceManager.findOne({ uuid: proxyPort.localProxyId }, transaction) await _updateOrDeleteProxyMicroservice(proxyPort, true, transaction) @@ -193,6 +194,7 @@ async function moveProxyPortsToNewFog (updatedMicroservice, portMapping, transac updatedMicroservice.iofogUuid, localProxy.catalogItemId, updatedMicroservice.uuid, + user, transaction) proxyPort.localProxyId = newProxy.uuid diff --git a/src/services/microservices-service.js b/src/services/microservices-service.js index 55156d1ce..4c90f7185 100644 --- a/src/services/microservices-service.js +++ b/src/services/microservices-service.js @@ -37,14 +37,14 @@ const { VOLUME_MAPPING_DEFAULT } = require('../helpers/constants') const constants = require('../helpers/constants') const isEqual = require('lodash/isEqual') -async function listMicroservicesEndPoint (opt, isCLI, transaction) { +async function listMicroservicesEndPoint (opt, user, isCLI, transaction) { // API retro compatibility const { applicationName, flowId } = opt - let application = await _validateApplication(applicationName, isCLI, transaction) + let application = await _validateApplication(applicationName, user, isCLI, transaction) if (flowId) { // _validateApplication wil try by ID if it fails finding by name - application = await _validateApplication(flowId, isCLI, transaction) + application = await _validateApplication(flowId, user, isCLI, transaction) } const where = application ? { applicationId: application.id, delete: false } : { delete: false, applicationId: { [Op.ne]: null } } @@ -60,7 +60,7 @@ async function listMicroservicesEndPoint (opt, isCLI, transaction) { } } -async function getMicroserviceEndPoint (microserviceUuid, isCLI, transaction) { +async function getMicroserviceEndPoint (microserviceUuid, user, isCLI, transaction) { if (!isCLI) { await _validateMicroserviceOnGet(microserviceUuid, transaction) } @@ -150,7 +150,7 @@ async function _validateAgentHostTemplate (extraHost, templateArgs, transaction) return extraHost } -async function _validateExtraHost (extraHostData, transaction) { +async function _validateExtraHost (extraHostData, user, transaction) { const extraHost = { templateType: 'Litteral', name: extraHostData.name, @@ -171,13 +171,13 @@ async function _validateExtraHost (extraHostData, transaction) { throw new Errors.ValidationError(AppHelper.formatMessage(ErrorMessages.INVALID_HOST_TEMPLATE, template)) } -async function _validateExtraHosts (microserviceData, transaction) { +async function _validateExtraHosts (microserviceData, user, transaction) { if (!microserviceData.extraHosts || microserviceData.extraHosts.length === 0) { return [] } const extraHosts = [] for (const extraHost of microserviceData.extraHosts) { - extraHosts.push(await _validateExtraHost(extraHost, transaction)) + extraHosts.push(await _validateExtraHost(extraHost, user, transaction)) } return extraHosts } @@ -195,7 +195,7 @@ function _validateImageFogType (microserviceData, fog, images) { } } -async function _findFog (microserviceData, isCLI, transaction) { +async function _findFog (microserviceData, user, isCLI, transaction) { const fogConditions = {} if (microserviceData.iofogUuid) { fogConditions.uuid = microserviceData.iofogUuid @@ -205,7 +205,7 @@ async function _findFog (microserviceData, isCLI, transaction) { return FogManager.findOne(fogConditions, transaction) } -async function createMicroserviceEndPoint (microserviceData, isCLI, transaction) { +async function createMicroserviceEndPoint (microserviceData, user, isCLI, transaction) { // API Retro compatibility if (!microserviceData.application) { microserviceData.application = microserviceData.flowId @@ -213,7 +213,7 @@ async function createMicroserviceEndPoint (microserviceData, isCLI, transaction) await Validator.validate(microserviceData, Validator.schemas.microserviceCreate) // find fog - const fog = await _findFog(microserviceData, isCLI, transaction) + const fog = await _findFog(microserviceData, user, isCLI, transaction) if (!fog) { throw new Errors.ValidationError(AppHelper.formatMessage(ErrorMessages.INVALID_IOFOG_UUID, microserviceData.iofogUuid || microserviceData.agentName)) } @@ -224,7 +224,7 @@ async function createMicroserviceEndPoint (microserviceData, isCLI, transaction) // validate images if (microserviceData.catalogItemId) { // validate catalog item - const catalogItem = await CatalogService.getCatalogItem(microserviceData.catalogItemId, isCLI, transaction) + const catalogItem = await CatalogService.getCatalogItem(microserviceData.catalogItemId, user, isCLI, transaction) _validateImagesAgainstCatalog(catalogItem, microserviceData.images || []) microserviceData.images = catalogItem.images _validateImageFogType(microserviceData, fog, catalogItem.images) @@ -237,13 +237,13 @@ async function createMicroserviceEndPoint (microserviceData, isCLI, transaction) } // validate extraHosts - const extraHosts = await _validateExtraHosts(microserviceData, transaction) + const extraHosts = await _validateExtraHosts(microserviceData, user, transaction) await MicroservicePortService.validatePortMappings(microserviceData, transaction) _validateVolumeMappings(microserviceData.volumeMappings) - const microservice = await _createMicroservice({ ...microserviceData, iofogUuid: fog.uuid }, isCLI, transaction) + const microservice = await _createMicroservice({ ...microserviceData, iofogUuid: fog.uuid }, user, isCLI, transaction) if (!microserviceData.catalogItemId) { await _createMicroserviceImages(microservice, microserviceData.images, transaction) @@ -253,7 +253,7 @@ async function createMicroserviceEndPoint (microserviceData, isCLI, transaction) const proxyPorts = [] if (microserviceData.ports) { for (const mapping of microserviceData.ports) { - const res = await MicroservicePortService.createPortMapping(microservice, mapping, transaction) + const res = await MicroservicePortService.createPortMapping(microservice, mapping, user, transaction) if (res) { if (res.publicLinks) { publicPorts.push({ @@ -273,17 +273,17 @@ async function createMicroserviceEndPoint (microserviceData, isCLI, transaction) } for (const extraHost of extraHosts) { - await _createExtraHost(microservice, extraHost, transaction) + await _createExtraHost(microservice, extraHost, user, transaction) } if (microserviceData.env) { for (const env of microserviceData.env) { - await _createEnv(microservice, env, transaction) + await _createEnv(microservice, env, user, transaction) } } if (microserviceData.cmd) { for (const arg of microserviceData.cmd) { - await _createArg(microservice, arg, transaction) + await _createArg(microservice, arg, user, transaction) } } if (microserviceData.volumeMappings) { @@ -346,7 +346,7 @@ async function _updateRelatedExtraHosts (updatedMicroservice, transaction) { } } -async function updateMicroserviceEndPoint (microserviceUuid, microserviceData, isCLI, transaction, changeTrackingEnabled = true) { +async function updateMicroserviceEndPoint (microserviceUuid, microserviceData, user, isCLI, transaction, changeTrackingEnabled = true) { await Validator.validate(microserviceData, Validator.schemas.microserviceUpdate) let needStatusReset = false const query = isCLI @@ -358,11 +358,11 @@ async function updateMicroserviceEndPoint (microserviceUuid, microserviceData, i } // validate extraHosts - const extraHosts = microserviceData.extraHosts ? await _validateExtraHosts(microserviceData, transaction) : null + const extraHosts = microserviceData.extraHosts ? await _validateExtraHosts(microserviceData, user, transaction) : null const config = _validateMicroserviceConfig(microserviceData.config) - const newFog = await _findFog(microserviceData, isCLI, transaction) || {} + const newFog = await _findFog(microserviceData, user, isCLI, transaction) || {} const microserviceToUpdate = { name: microserviceData.name, config: config, @@ -400,7 +400,7 @@ async function updateMicroserviceEndPoint (microserviceUuid, microserviceData, i } if (microserviceDataUpdate.ports) { - await _updatePorts(microserviceDataUpdate.ports, microservice, transaction) + await _updatePorts(microserviceDataUpdate.ports, microservice, user, transaction) } if (microserviceDataUpdate.iofogUuid && microservice.iofogUuid !== microserviceDataUpdate.iofogUuid) { @@ -433,7 +433,7 @@ async function updateMicroserviceEndPoint (microserviceUuid, microserviceData, i const iofogUuid = microserviceDataUpdate.iofogUuid || microservice.iofogUuid if (microserviceDataUpdate.catalogItemId) { - const catalogItem = await CatalogService.getCatalogItem(microserviceDataUpdate.catalogItemId, isCLI, transaction) + const catalogItem = await CatalogService.getCatalogItem(microserviceDataUpdate.catalogItemId, user, isCLI, transaction) _validateImagesAgainstCatalog(catalogItem, microserviceDataUpdate.images || []) if (microserviceDataUpdate.catalogItemId !== undefined && microserviceDataUpdate.catalogItemId !== microservice.catalogItemId) { // Catalog item changed or removed, set rebuild flag @@ -468,12 +468,12 @@ async function updateMicroserviceEndPoint (microserviceUuid, microserviceData, i // Validate image type let images = [] if (microserviceDataUpdate.catalogItemId) { - const catalogItem = await CatalogService.getCatalogItem(microserviceDataUpdate.catalogItemId, isCLI, transaction) + const catalogItem = await CatalogService.getCatalogItem(microserviceDataUpdate.catalogItemId, user, isCLI, transaction) images = catalogItem.images } else if (microserviceDataUpdate.images) { images = microserviceDataUpdate.images } else if (microservice.catalogItemId) { - const catalogItem = await CatalogService.getCatalogItem(microservice.catalogItemId, isCLI, transaction) + const catalogItem = await CatalogService.getCatalogItem(microservice.catalogItemId, user, isCLI, transaction) images = catalogItem.images } else { images = await microservice.getImages() @@ -493,7 +493,7 @@ async function updateMicroserviceEndPoint (microserviceUuid, microserviceData, i const updatedMicroservice = await MicroserviceManager.updateAndFind(query, microserviceDataUpdate, transaction) if (extraHosts) { - await _updateExtraHosts(extraHosts, microserviceUuid, transaction) + await _updateExtraHosts(extraHosts, microserviceUuid, user, transaction) } // Update extra hosts that reference this microservice @@ -512,7 +512,7 @@ async function updateMicroserviceEndPoint (microserviceUuid, microserviceData, i } if (microserviceDataUpdate.iofogUuid && microserviceDataUpdate.iofogUuid !== microservice.iofogUuid) { - await MicroservicePortService.movePublicPortsToNewFog(updatedMicroservice, transaction) + await MicroservicePortService.movePublicPortsToNewFog(updatedMicroservice, user, transaction) } if (needStatusReset) { @@ -561,7 +561,7 @@ const _checkIfMicroserviceImagesAreEqual = (microserviceDataUpdateImages, catalo return isEqual(newMicroserviceImages, oldMicroservicesImages) } -async function deleteMicroserviceEndPoint (microserviceUuid, microserviceData, isCLI, transaction) { +async function deleteMicroserviceEndPoint (microserviceUuid, microserviceData, user, isCLI, transaction) { const where = isCLI ? { uuid: microserviceUuid @@ -594,7 +594,7 @@ async function deleteNotRunningMicroservices (fog, transaction) { .forEach(async (microservice) => { await deleteMicroserviceWithRoutesAndPortMappings(microservice, transaction) }) } -async function createRouteEndPoint (sourceMicroserviceUuid, destMicroserviceUuid, isCLI, transaction) { +async function createRouteEndPoint (sourceMicroserviceUuid, destMicroserviceUuid, user, isCLI, transaction) { // Print deprecated warning const sourceMsvc = await MicroserviceManager.findOne({ uuid: sourceMicroserviceUuid }, transaction) if (!sourceMsvc) { @@ -610,10 +610,10 @@ async function createRouteEndPoint (sourceMicroserviceUuid, destMicroserviceUuid throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.INVALID_FLOW_ID, sourceMsvc.applicationId)) } - return RoutingService.createRouting({ application: application.name, from: sourceMsvc.name, to: destMsvc.name, name: `r-${sourceMsvc.name}-${destMsvc.name}` }, isCLI, transaction) + return RoutingService.createRouting({ application: application.name, from: sourceMsvc.name, to: destMsvc.name, name: `r-${sourceMsvc.name}-${destMsvc.name}` }, user, isCLI, transaction) } -async function deleteRouteEndPoint (sourceMicroserviceUuid, destMicroserviceUuid, isCLI, transaction) { +async function deleteRouteEndPoint (sourceMicroserviceUuid, destMicroserviceUuid, user, isCLI, transaction) { // Print deprecated warning const route = await RoutingManager.findOnePopulated({ @@ -624,10 +624,10 @@ async function deleteRouteEndPoint (sourceMicroserviceUuid, destMicroserviceUuid throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.ROUTE_NOT_FOUND)) } - return RoutingService.deleteRouting(route.application.name, route.name, isCLI, transaction) + return RoutingService.deleteRouting(route.application.name, route.name, user, isCLI, transaction) } -async function createPortMappingEndPoint (microserviceUuid, portMappingData, isCLI, transaction) { +async function createPortMappingEndPoint (microserviceUuid, portMappingData, user, isCLI, transaction) { await Validator.validate(portMappingData, Validator.schemas.portsCreate) const where = isCLI @@ -645,10 +645,10 @@ async function createPortMappingEndPoint (microserviceUuid, portMappingData, isC } await MicroservicePortService.validatePortMapping(agent, portMappingData, {}, transaction) - return MicroservicePortService.createPortMapping(microservice, portMappingData, transaction) + return MicroservicePortService.createPortMapping(microservice, portMappingData, user, transaction) } -async function _createExtraHost (microservice, extraHostData, transaction) { +async function _createExtraHost (microservice, extraHostData, user, transaction) { const msExtraHostData = { ...extraHostData, microserviceUuid: microservice.uuid @@ -657,7 +657,7 @@ async function _createExtraHost (microservice, extraHostData, transaction) { await MicroserviceExtraHostManager.create(msExtraHostData, transaction) } -async function _createEnv (microservice, envData, transaction) { +async function _createEnv (microservice, envData, user, transaction) { if (!microservice.iofogUuid) { throw new Errors.ValidationError(AppHelper.formatMessage(ErrorMessages.REQUIRED_FOG_NODE)) } @@ -672,7 +672,7 @@ async function _createEnv (microservice, envData, transaction) { await MicroservicePortService.switchOnUpdateFlagsForMicroservicesForPortMapping(microservice, false, transaction) } -async function _createArg (microservice, arg, transaction) { +async function _createArg (microservice, arg, user, transaction) { if (!microservice.iofogUuid) { throw new Errors.ValidationError(AppHelper.formatMessage(ErrorMessages.REQUIRED_FOG_NODE)) } @@ -686,12 +686,12 @@ async function _createArg (microservice, arg, transaction) { await MicroservicePortService.switchOnUpdateFlagsForMicroservicesForPortMapping(microservice, false, transaction) } -async function deletePortMappingEndPoint (microserviceUuid, internalPort, isCLI, transaction) { - return MicroservicePortService.deletePortMapping(microserviceUuid, internalPort, isCLI, transaction) +async function deletePortMappingEndPoint (microserviceUuid, internalPort, user, isCLI, transaction) { + return MicroservicePortService.deletePortMapping(microserviceUuid, internalPort, user, isCLI, transaction) } -async function listPortMappingsEndPoint (microserviceUuid, isCLI, transaction) { - return MicroservicePortService.listPortMappings(microserviceUuid, isCLI, transaction) +async function listPortMappingsEndPoint (microserviceUuid, user, isCLI, transaction) { + return MicroservicePortService.listPortMappings(microserviceUuid, user, isCLI, transaction) } async function getReceiverMicroservices (microservice, transaction) { @@ -706,7 +706,7 @@ async function isMicroserviceConsumer (microservice, transaction) { return !!(routes && routes.length > 0) } -async function createVolumeMappingEndPoint (microserviceUuid, volumeMappingData, isCLI, transaction) { +async function createVolumeMappingEndPoint (microserviceUuid, volumeMappingData, user, isCLI, transaction) { await Validator.validate(volumeMappingData, Validator.schemas.volumeMappings) const where = isCLI @@ -743,7 +743,7 @@ async function createVolumeMappingEndPoint (microserviceUuid, volumeMappingData, return VolumeMappingManager.create(volumeMappingObj, transaction) } -async function deleteVolumeMappingEndPoint (microserviceUuid, volumeMappingUuid, isCLI, transaction) { +async function deleteVolumeMappingEndPoint (microserviceUuid, volumeMappingUuid, user, isCLI, transaction) { const where = isCLI ? { uuid: microserviceUuid } : { uuid: microserviceUuid } @@ -764,7 +764,7 @@ async function deleteVolumeMappingEndPoint (microserviceUuid, volumeMappingUuid, } } -async function listVolumeMappingsEndPoint (microserviceUuid, isCLI, transaction) { +async function listVolumeMappingsEndPoint (microserviceUuid, user, isCLI, transaction) { const where = isCLI ? { uuid: microserviceUuid } : { uuid: microserviceUuid } @@ -789,7 +789,7 @@ function _validateMicroserviceConfig (config) { return result } -async function _createMicroservice (microserviceData, isCLI, transaction) { +async function _createMicroservice (microserviceData, user, isCLI, transaction) { const config = _validateMicroserviceConfig(microserviceData.config) let newMicroservice = { @@ -813,7 +813,7 @@ async function _createMicroservice (microserviceData, isCLI, transaction) { } // validate application - const application = await _validateApplication(microserviceData.application, isCLI, transaction) + const application = await _validateApplication(microserviceData.application, user, isCLI, transaction) newMicroservice.applicationId = application.id await _checkForDuplicateName(newMicroservice.name, {}, newMicroservice.applicationId, transaction) @@ -829,7 +829,7 @@ async function _createMicroservice (microserviceData, isCLI, transaction) { return MicroserviceManager.create(newMicroservice, transaction) } -async function _validateApplication (name, isCLI, transaction) { +async function _validateApplication (name, user, isCLI, transaction) { if (!name) { return null } @@ -916,12 +916,12 @@ async function _deleteImages (microserviceUuid, transaction) { }, transaction) } -async function _updateExtraHosts (extraHosts, microserviceUuid, transaction) { +async function _updateExtraHosts (extraHosts, microserviceUuid, user, transaction) { await MicroserviceExtraHostManager.delete({ microserviceUuid: microserviceUuid }, transaction) for (const extraHost of extraHosts) { - await _createExtraHost({ uuid: microserviceUuid }, extraHost, transaction) + await _createExtraHost({ uuid: microserviceUuid }, extraHost, user, transaction) } } @@ -954,10 +954,10 @@ async function _updateArg (arg, microserviceUuid, transaction) { } } -async function _updatePorts (newPortMappings, microservice, transaction) { - await MicroservicePortService.deletePortMappings(microservice, transaction) +async function _updatePorts (newPortMappings, microservice, user, transaction) { + await MicroservicePortService.deletePortMappings(microservice, user, transaction) for (const portMapping of newPortMappings) { - await createPortMappingEndPoint(microservice.uuid, portMapping, false, transaction) + await createPortMappingEndPoint(microservice.uuid, portMapping, user, false, transaction) } } @@ -1080,8 +1080,8 @@ async function _buildGetMicroserviceResponse (microservice, transaction) { return res } -function listAllPublicPortsEndPoint (transaction) { - return MicroservicePortService.listAllPublicPorts(transaction) +function listAllPublicPortsEndPoint (user, transaction) { + return MicroservicePortService.listAllPublicPorts(user, transaction) } module.exports = { diff --git a/src/services/registry-service.js b/src/services/registry-service.js index de0a8eade..b5220cb99 100644 --- a/src/services/registry-service.js +++ b/src/services/registry-service.js @@ -22,7 +22,7 @@ const Sequelize = require('sequelize') const Op = Sequelize.Op const AppHelper = require('../helpers/app-helper') -const createRegistry = async function (registry, transaction) { +const createRegistry = async function (registry, user, transaction) { await Validator.validate(registry, Validator.schemas.registryCreate) if (registry.requiresCert && registry.certificate === undefined) { throw new Errors.ValidationError(ErrorMessages.CERT_PROPERTY_REQUIRED) @@ -42,14 +42,14 @@ const createRegistry = async function (registry, transaction) { const createdRegistry = await RegistryManager.create(registryCreate, transaction) - await _updateChangeTracking(transaction) + await _updateChangeTracking(user, transaction) return { id: createdRegistry.id } } -const findRegistries = async function (isCLI, transaction) { +const findRegistries = async function (user, isCLI, transaction) { const queryRegistry = isCLI ? {} : { @@ -67,7 +67,7 @@ const findRegistries = async function (isCLI, transaction) { } } -const deleteRegistry = async function (registryData, isCLI, transaction) { +const deleteRegistry = async function (registryData, user, isCLI, transaction) { await Validator.validate(registryData, Validator.schemas.registryDelete) const queryData = isCLI ? { id: registryData.id } @@ -77,10 +77,10 @@ const deleteRegistry = async function (registryData, isCLI, transaction) { throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.INVALID_REGISTRY_ID, registryData.id)) } await RegistryManager.delete(queryData, transaction) - await _updateChangeTracking(transaction) + await _updateChangeTracking(user, transaction) } -const updateRegistry = async function (registry, registryId, isCLI, transaction) { +const updateRegistry = async function (registry, registryId, user, isCLI, transaction) { await Validator.validate(registry, Validator.schemas.registryUpdate) if (registry.requiresCert && registry.certificate === undefined) { @@ -117,10 +117,10 @@ const updateRegistry = async function (registry, registryId, isCLI, transaction) await RegistryManager.update(where, registryUpdate, transaction) - await _updateChangeTracking(transaction) + await _updateChangeTracking(user, transaction) } -const _updateChangeTracking = async function (transaction) { +const _updateChangeTracking = async function (user, transaction) { const fogs = await FogManager.findAll(transaction) for (const fog of fogs) { await ChangeTrackingService.update(fog.uuid, ChangeTrackingService.events.registries, transaction) diff --git a/src/services/routing-service.js b/src/services/routing-service.js index f6cb1fdc4..b3737ba90 100644 --- a/src/services/routing-service.js +++ b/src/services/routing-service.js @@ -21,7 +21,7 @@ const RoutingManager = require('../data/managers/routing-manager') const TransactionDecorator = require('../decorators/transaction-decorator') const Validator = require('../schemas') -async function getRoutings (isCLI, transaction) { +async function getRoutings (user, isCLI, transaction) { const routes = await RoutingManager.findAllPopulated({}, transaction) return { routes: routes.map(r => ({ application: r.application.name, @@ -34,7 +34,7 @@ async function getRoutings (isCLI, transaction) { })) } } -async function getRouting (appName, name, isCLI, transaction) { +async function getRouting (appName, name, user, isCLI, transaction) { const application = await ApplicationManager.findOne({ name: appName }, transaction) if (!application) { throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.INVALID_FLOW_NAME, appName)) @@ -54,7 +54,7 @@ async function getRouting (appName, name, isCLI, transaction) { } } -async function _validateRouteMsvc (routingData, isCLI, transaction) { +async function _validateRouteMsvc (routingData, user, isCLI, transaction) { // Retro compatibility logic if (routingData.sourceMicroserviceUuid) { const sourceWhere = { uuid: routingData.sourceMicroserviceUuid } @@ -91,15 +91,15 @@ async function _validateRouteMsvc (routingData, isCLI, transaction) { } } -async function createRouting (routingData, isCLI, transaction) { +async function createRouting (routingData, user, isCLI, transaction) { await Validator.validate(routingData, Validator.schemas.routingCreate) - const { sourceMicroservice, destMicroservice } = await _validateRouteMsvc(routingData, isCLI, transaction) + const { sourceMicroservice, destMicroservice } = await _validateRouteMsvc(routingData, user, isCLI, transaction) - return _createRoute(sourceMicroservice, destMicroservice, routingData, transaction) + return _createRoute(sourceMicroservice, destMicroservice, routingData, user, transaction) } -async function updateRouting (appName, routeName, routeData, isCLI, transaction) { +async function updateRouting (appName, routeName, routeData, user, isCLI, transaction) { await Validator.validate(routeData, Validator.schemas.routingUpdate) const application = await ApplicationManager.findOne({ name: appName }, transaction) if (!application) { @@ -111,7 +111,7 @@ async function updateRouting (appName, routeName, routeData, isCLI, transaction) throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.INVALID_ROUTING_NAME, routeName)) } - const { sourceMicroservice, destMicroservice } = await _validateRouteMsvc({ ...routeData, application: oldRoute.application.name }, isCLI, transaction) + const { sourceMicroservice, destMicroservice } = await _validateRouteMsvc({ ...routeData, application: oldRoute.application.name }, user, isCLI, transaction) const updateRebuildMs = { rebuild: true @@ -143,7 +143,7 @@ async function updateRouting (appName, routeName, routeData, isCLI, transaction) await RoutingManager.update({ id: oldRoute.id }, updateRouteData, transaction) } -async function _createRoute (sourceMicroservice, destMicroservice, routeData, transaction) { +async function _createRoute (sourceMicroservice, destMicroservice, routeData, user, transaction) { if (!sourceMicroservice.iofogUuid || !destMicroservice.iofogUuid) { throw new Errors.ValidationError('fog not set') } @@ -162,7 +162,7 @@ async function _createRoute (sourceMicroservice, destMicroservice, routeData, tr return _createSimpleRoute(sourceMicroservice, destMicroservice, routeData, transaction) } -async function deleteRouting (appName, name, isCLI, transaction) { +async function deleteRouting (appName, name, user, isCLI, transaction) { const application = await ApplicationManager.findOne({ name: appName }, transaction) if (!application) { throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.INVALID_FLOW_NAME, appName)) diff --git a/src/services/tunnel-service.js b/src/services/tunnel-service.js index 14142af29..680f7e5c3 100644 --- a/src/services/tunnel-service.js +++ b/src/services/tunnel-service.js @@ -21,7 +21,7 @@ const ErrorMessages = require('../helpers/error-messages') const TransactionDecorator = require('../decorators/transaction-decorator') const ChangeTrackingService = require('./change-tracking-service') -const openTunnel = async function (tunnelData, isCli, transaction) { +const openTunnel = async function (tunnelData, user, isCli, transaction) { const iofog = await FogManager.findOne({ uuid: tunnelData.iofogUuid }, transaction) if (!iofog) { throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.INVALID_IOFOG_UUID, tunnelData.iofogUuid)) @@ -47,7 +47,7 @@ const openTunnel = async function (tunnelData, isCli, transaction) { await ChangeTrackingService.update(tunnelData.iofogUuid, ChangeTrackingService.events.tunnel, transaction) } -const findTunnel = async function (tunnelData, transaction) { +const findTunnel = async function (tunnelData, user, transaction) { const tunnel = await TunnelManager.findOne(tunnelData, transaction) if (!tunnel) { throw new Errors.NotFoundError('Invalid Tunnel Id') @@ -68,8 +68,8 @@ const findAll = async function (transaction) { } } -const closeTunnel = async function (tunnelData, transaction) { - await module.exports.findTunnel(tunnelData, transaction) +const closeTunnel = async function (tunnelData, user, transaction) { + await module.exports.findTunnel(tunnelData, user, transaction) await TunnelManager.update(tunnelData, { closed: true }, transaction) await ChangeTrackingService.update(tunnelData.iofogUuid, ChangeTrackingService.events.tunnel, transaction) } From 4a2603b5660e09d269f90462067195c9a80bf5db Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emirhan=20Durmu=C5=9F?= Date: Thu, 28 Mar 2024 14:52:40 +0300 Subject: [PATCH 075/178] iofog service user check fixed --- src/services/iofog-service.js | 45 ----------------------------------- 1 file changed, 45 deletions(-) diff --git a/src/services/iofog-service.js b/src/services/iofog-service.js index 06b1fce95..9f3bb6d04 100644 --- a/src/services/iofog-service.js +++ b/src/services/iofog-service.js @@ -189,11 +189,6 @@ async function updateFogEndPoint (fogData, user, isCLI, transaction) { // Update tags await _setTags(oldFog, fogData.tags, transaction) - // If using REST API and not system fog. You must be the fog's user to access it - if (!oldFog.isSystem && !isCLI) { - throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.INVALID_IOFOG_UUID, fogData.uuid)) - } - if (updateFogData.name) { const conflictQuery = isCLI ? { name: updateFogData.name, uuid: { [Op.not]: fogData.uuid } } @@ -369,11 +364,6 @@ async function deleteFogEndPoint (fogData, user, isCLI, transaction) { throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.INVALID_IOFOG_UUID, fogData.uuid)) } - // If using REST API and not system fog. You must be the fog's user to access it - if (!fog.isSystem && !isCLI) { - throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.INVALID_IOFOG_UUID, fogData.uuid)) - } - await _deleteFogRouter(fogData, transaction) await _processDeleteCommand(fog, transaction) @@ -452,11 +442,6 @@ async function getFog (fogData, user, isCLI, transaction) { throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.INVALID_IOFOG_UUID, fogData.uuid)) } - // If using REST API and not system fog. You must be the fog's user to access it - if (!fog.isSystem && !isCLI) { - throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.INVALID_IOFOG_UUID, fogData.uuid)) - } - return _getFogExtraInformation(fog, transaction) } @@ -501,11 +486,6 @@ async function generateProvisioningKeyEndPoint (fogData, user, isCLI, transactio throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.INVALID_IOFOG_UUID, fogData.uuid)) } - // If using REST API and not system fog. You must be the fog's user to access it - if (!fog.isSystem && !isCLI) { - throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.INVALID_IOFOG_UUID, fogData.uuid)) - } - const provisioningKeyData = await FogProvisionKeyManager.updateOrCreate({ iofogUuid: fogData.uuid }, newProvision, transaction) return { @@ -529,11 +509,6 @@ async function setFogVersionCommandEndPoint (fogVersionData, user, isCLI, transa throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.INVALID_IOFOG_UUID, queryFogData.uuid)) } - // If using REST API and not system fog. You must be the fog's user to access it - if (!fog.isSystem && !isCLI) { - throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.INVALID_IOFOG_UUID, queryFogData.uuid)) - } - if (!fog.isReadyToRollback && fogVersionData.versionCommand === 'rollback') { throw new Errors.ValidationError(ErrorMessages.INVALID_VERSION_COMMAND_ROLLBACK) } @@ -556,11 +531,6 @@ async function setFogRebootCommandEndPoint (fogData, user, isCLI, transaction) { throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.INVALID_IOFOG_UUID, fogData.uuid)) } - // If using REST API and not system fog. You must be the fog's user to access it - if (!fog.isSystem && !isCLI) { - throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.INVALID_IOFOG_UUID, fogData.uuid)) - } - await ChangeTrackingService.update(fogData.uuid, ChangeTrackingService.events.reboot, transaction) } @@ -574,11 +544,6 @@ async function getHalHardwareInfoEndPoint (uuidObj, user, isCLI, transaction) { throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.INVALID_IOFOG_UUID, uuidObj.uuid)) } - // If using REST API and not system fog. You must be the fog's user to access it - if (!fog.isSystem && !isCLI) { - throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.INVALID_IOFOG_UUID, uuidObj.uuid)) - } - return HWInfoManager.findOne({ iofogUuid: uuidObj.uuid }, transaction) @@ -594,11 +559,6 @@ async function getHalUsbInfoEndPoint (uuidObj, user, isCLI, transaction) { throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.INVALID_IOFOG_UUID, uuidObj.uuid)) } - // If using REST API and not system fog. You must be the fog's user to access it - if (!fog.isSystem && !isCLI) { - throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.INVALID_IOFOG_UUID, uuidObj.uuid)) - } - return USBInfoManager.findOne({ iofogUuid: uuidObj.uuid }, transaction) @@ -704,11 +664,6 @@ async function setFogPruneCommandEndPoint (fogData, user, isCLI, transaction) { throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.INVALID_IOFOG_UUID, fogData.uuid)) } - // If using REST API and not system fog. You must be the fog's user to access it - if (!fog.isSystem && !isCLI) { - throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.INVALID_IOFOG_UUID, fogData.uuid)) - } - await ChangeTrackingService.update(fogData.uuid, ChangeTrackingService.events.prune, transaction) } From ae027545769b11b97e69636d573f61d760081f61 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emirhan=20Durmu=C5=9F?= Date: Thu, 28 Mar 2024 19:55:12 +0300 Subject: [PATCH 076/178] microservice-service module's traction decorator edited --- src/services/edge-resource-service.js | 2 +- src/services/microservices-service.js | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/services/edge-resource-service.js b/src/services/edge-resource-service.js index 750e040a7..d83db34d7 100644 --- a/src/services/edge-resource-service.js +++ b/src/services/edge-resource-service.js @@ -28,7 +28,7 @@ async function listEdgeResources (transaction) { return edgeResources.map(buildGetObject) } -async function getEdgeResource ({ name, version }, transaction) { +async function getEdgeResource ({ name, version }, user, transaction) { if (version) { const resource = await EdgeResourceManager.findOneWithOrchestrationTags({ name, version }, transaction) if (!resource) { diff --git a/src/services/microservices-service.js b/src/services/microservices-service.js index 4c90f7185..07924e43a 100644 --- a/src/services/microservices-service.js +++ b/src/services/microservices-service.js @@ -1090,8 +1090,8 @@ module.exports = { createRouteEndPoint: TransactionDecorator.generateTransaction(createRouteEndPoint), createVolumeMappingEndPoint: TransactionDecorator.generateTransaction(createVolumeMappingEndPoint), deleteMicroserviceEndPoint: TransactionDecorator.generateTransaction(deleteMicroserviceEndPoint), - deleteMicroserviceWithRoutesAndPortMappings: deleteMicroserviceWithRoutesAndPortMappings, - deleteNotRunningMicroservices: deleteNotRunningMicroservices, + deleteMicroserviceWithRoutesAndPortMappings: TransactionDecorator.generateTransaction(deleteMicroserviceWithRoutesAndPortMappings), + deleteNotRunningMicroservices: TransactionDecorator.generateTransaction(deleteNotRunningMicroservices), deletePortMappingEndPoint: TransactionDecorator.generateTransaction(deletePortMappingEndPoint), deleteRouteEndPoint: TransactionDecorator.generateTransaction(deleteRouteEndPoint), deleteVolumeMappingEndPoint: TransactionDecorator.generateTransaction(deleteVolumeMappingEndPoint), From 30d19f3fa90706bd5494a698bdfa46060bb45528 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emirhan=20Durmu=C5=9F?= Date: Thu, 28 Mar 2024 19:57:23 +0300 Subject: [PATCH 077/178] revert edgeresource service changes --- src/services/edge-resource-service.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/services/edge-resource-service.js b/src/services/edge-resource-service.js index d83db34d7..750e040a7 100644 --- a/src/services/edge-resource-service.js +++ b/src/services/edge-resource-service.js @@ -28,7 +28,7 @@ async function listEdgeResources (transaction) { return edgeResources.map(buildGetObject) } -async function getEdgeResource ({ name, version }, user, transaction) { +async function getEdgeResource ({ name, version }, transaction) { if (version) { const resource = await EdgeResourceManager.findOneWithOrchestrationTags({ name, version }, transaction) if (!resource) { From 10ea1c6dd3f705d7f76297210ff81b657a047030 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emirhan=20Durmu=C5=9F?= Date: Thu, 28 Mar 2024 20:42:32 +0300 Subject: [PATCH 078/178] Revert "revert edgeresource service changes" This reverts commit 30d19f3fa90706bd5494a698bdfa46060bb45528. --- src/services/edge-resource-service.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/services/edge-resource-service.js b/src/services/edge-resource-service.js index 750e040a7..d83db34d7 100644 --- a/src/services/edge-resource-service.js +++ b/src/services/edge-resource-service.js @@ -28,7 +28,7 @@ async function listEdgeResources (transaction) { return edgeResources.map(buildGetObject) } -async function getEdgeResource ({ name, version }, transaction) { +async function getEdgeResource ({ name, version }, user, transaction) { if (version) { const resource = await EdgeResourceManager.findOneWithOrchestrationTags({ name, version }, transaction) if (!resource) { From 9329fd4a3e82bd9b7d6553e411c7cac9910dd345 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emirhan=20Durmu=C5=9F?= Date: Thu, 28 Mar 2024 20:42:45 +0300 Subject: [PATCH 079/178] Revert "microservice-service module's traction decorator edited" This reverts commit ae027545769b11b97e69636d573f61d760081f61. --- src/services/edge-resource-service.js | 2 +- src/services/microservices-service.js | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/services/edge-resource-service.js b/src/services/edge-resource-service.js index d83db34d7..750e040a7 100644 --- a/src/services/edge-resource-service.js +++ b/src/services/edge-resource-service.js @@ -28,7 +28,7 @@ async function listEdgeResources (transaction) { return edgeResources.map(buildGetObject) } -async function getEdgeResource ({ name, version }, user, transaction) { +async function getEdgeResource ({ name, version }, transaction) { if (version) { const resource = await EdgeResourceManager.findOneWithOrchestrationTags({ name, version }, transaction) if (!resource) { diff --git a/src/services/microservices-service.js b/src/services/microservices-service.js index 07924e43a..4c90f7185 100644 --- a/src/services/microservices-service.js +++ b/src/services/microservices-service.js @@ -1090,8 +1090,8 @@ module.exports = { createRouteEndPoint: TransactionDecorator.generateTransaction(createRouteEndPoint), createVolumeMappingEndPoint: TransactionDecorator.generateTransaction(createVolumeMappingEndPoint), deleteMicroserviceEndPoint: TransactionDecorator.generateTransaction(deleteMicroserviceEndPoint), - deleteMicroserviceWithRoutesAndPortMappings: TransactionDecorator.generateTransaction(deleteMicroserviceWithRoutesAndPortMappings), - deleteNotRunningMicroservices: TransactionDecorator.generateTransaction(deleteNotRunningMicroservices), + deleteMicroserviceWithRoutesAndPortMappings: deleteMicroserviceWithRoutesAndPortMappings, + deleteNotRunningMicroservices: deleteNotRunningMicroservices, deletePortMappingEndPoint: TransactionDecorator.generateTransaction(deletePortMappingEndPoint), deleteRouteEndPoint: TransactionDecorator.generateTransaction(deleteRouteEndPoint), deleteVolumeMappingEndPoint: TransactionDecorator.generateTransaction(deleteVolumeMappingEndPoint), From cc487eda0001b7a4c2c2931e8c9ad8b7d863c9db Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emirhan=20Durmu=C5=9F?= Date: Thu, 28 Mar 2024 22:20:13 +0300 Subject: [PATCH 080/178] Revert "Revert "user removed from endpoint's controller and service"" This reverts commit ef5771fcfc02e9e328f7244c84075579e95b0741. --- src/controllers/application-controller.js | 48 ++++---- .../application-template-controller.js | 36 +++--- src/controllers/catalog-controller.js | 20 ++-- src/controllers/config-controller.js | 6 +- src/controllers/diagnostic-controller.js | 20 ++-- src/controllers/edge-resource-controller.js | 32 +++--- src/controllers/iofog-controller.js | 44 ++++---- src/controllers/microservices-controller.js | 68 +++++------ src/controllers/registry-controller.js | 16 +-- src/controllers/routing-controller.js | 20 ++-- src/controllers/tunnel-controller.js | 10 +- src/services/application-service.js | 44 ++++---- src/services/application-template-service.js | 28 ++--- src/services/catalog-service.js | 18 +-- src/services/diagnostic-service.js | 12 +- src/services/edge-resource-service.js | 12 +- src/services/iofog-service.js | 42 +++---- src/services/microservice-ports/default.js | 42 ++++--- src/services/microservice-ports/proxy.js | 10 +- src/services/microservices-service.js | 106 +++++++++--------- src/services/registry-service.js | 16 +-- src/services/routing-service.js | 20 ++-- src/services/tunnel-service.js | 8 +- 23 files changed, 337 insertions(+), 341 deletions(-) diff --git a/src/controllers/application-controller.js b/src/controllers/application-controller.js index da06cfe8b..15676b7da 100644 --- a/src/controllers/application-controller.js +++ b/src/controllers/application-controller.js @@ -17,85 +17,85 @@ const errors = require('../helpers/errors') const ErrorMessages = require('../helpers/error-messages') const { rvaluesVarSubstition } = require('../helpers/template-helper') -const createApplicationEndPoint = async function (req, user) { +const createApplicationEndPoint = async function (req) { const application = req.body - return ApplicationService.createApplicationEndPoint(application, user, false) + return ApplicationService.createApplicationEndPoint(application, false) } -const createApplicationYAMLEndPoint = async function (req, user) { +const createApplicationYAMLEndPoint = async function (req) { if (!req.file) { throw new errors.ValidationError(ErrorMessages.APPLICATION_FILE_NOT_FOUND) } const fileContent = req.file.buffer.toString() const application = await YAMLParserService.parseAppFile(fileContent) - await rvaluesVarSubstition(application, { self: application }, user) + await rvaluesVarSubstition(application, { self: application }) - return ApplicationService.createApplicationEndPoint(application, user, false) + return ApplicationService.createApplicationEndPoint(application, false) } -const getApplicationsByUserEndPoint = async function (req, user) { - return ApplicationService.getUserApplicationsEndPoint(user, false) +const getApplicationsByUserEndPoint = async function (req) { + return ApplicationService.getUserApplicationsEndPoint(false) } -const getApplicationEndPoint = async function (req, user) { +const getApplicationEndPoint = async function (req) { const name = req.params.name - const application = await ApplicationService.getApplicationEndPoint({ name }, user, false) + const application = await ApplicationService.getApplicationEndPoint({ name }, false) return application } -const patchApplicationEndPoint = async function (req, user) { +const patchApplicationEndPoint = async function (req) { const application = req.body const name = req.params.name - return ApplicationService.patchApplicationEndPoint(application, { name }, user, false) + return ApplicationService.patchApplicationEndPoint(application, { name }, false) } -const updateApplicationEndPoint = async function (req, user) { +const updateApplicationEndPoint = async function (req) { const application = req.body const name = req.params.name - return ApplicationService.updateApplicationEndPoint(application, name, user, false) + return ApplicationService.updateApplicationEndPoint(application, name, false) } -const updateApplicationYAMLEndPoint = async function (req, user) { +const updateApplicationYAMLEndPoint = async function (req) { if (!req.file) { throw new errors.ValidationError(ErrorMessages.APPLICATION_FILE_NOT_FOUND) } const name = req.params.name const fileContent = req.file.buffer.toString() const application = await YAMLParserService.parseAppFile(fileContent) - await rvaluesVarSubstition(application, { self: application }, user) + await rvaluesVarSubstition(application, { self: application }) - return ApplicationService.updateApplicationEndPoint(application, name, user, false) + return ApplicationService.updateApplicationEndPoint(application, name, false) } -const deleteApplicationEndPoint = async function (req, user) { +const deleteApplicationEndPoint = async function (req) { const name = req.params.name - return ApplicationService.deleteApplicationEndPoint({ name }, user, false) + return ApplicationService.deleteApplicationEndPoint({ name }, false) } // Legacy -const deleteApplicationByIdEndPoint = async function (req, user) { +const deleteApplicationByIdEndPoint = async function (req) { const id = req.params.id - return ApplicationService.deleteApplicationEndPoint({ id }, user, false) + return ApplicationService.deleteApplicationEndPoint({ id }, false) } -const patchApplicationByIdEndPoint = async function (req, user) { +const patchApplicationByIdEndPoint = async function (req) { const application = req.body const id = req.params.id - return ApplicationService.patchApplicationEndPoint(application, { id }, user, false) + return ApplicationService.patchApplicationEndPoint(application, { id }, false) } -const getApplicationByIdEndPoint = async function (req, user) { +const getApplicationByIdEndPoint = async function (req) { const id = req.params.id - const application = await ApplicationService.getApplicationEndPoint({ id }, user, false) + const application = await ApplicationService.getApplicationEndPoint({ id }, false) return application } diff --git a/src/controllers/application-template-controller.js b/src/controllers/application-template-controller.js index 7a9e85d0a..61f281112 100644 --- a/src/controllers/application-template-controller.js +++ b/src/controllers/application-template-controller.js @@ -17,63 +17,63 @@ const errors = require('../helpers/errors') const ErrorMessages = require('../helpers/error-messages') const { rvaluesVarSubstition } = require('../helpers/template-helper') -const createApplicationTemplateEndPoint = async function (req, user) { +const createApplicationTemplateEndPoint = async function (req) { const application = req.body - return ApplicationTemplateService.createApplicationTemplateEndPoint(application, user, false) + return ApplicationTemplateService.createApplicationTemplateEndPoint(application, false) } -const createApplicationTemplateYAMLEndPoint = async function (req, user) { +const createApplicationTemplateYAMLEndPoint = async function (req) { if (!req.file) { throw new errors.ValidationError(ErrorMessages.APPLICATION_FILE_NOT_FOUND) } const fileContent = req.file.buffer.toString() const application = await YAMLParserService.parseAppTemplateFile(fileContent) - await rvaluesVarSubstition(application.variables, { self: application.variables }, user) + await rvaluesVarSubstition(application.variables, { self: application.variables }) - return ApplicationTemplateService.createApplicationTemplateEndPoint(application, user, false) + return ApplicationTemplateService.createApplicationTemplateEndPoint(application, false) } -const getApplicationTemplatesByUserEndPoint = async function (req, user) { - return ApplicationTemplateService.getUserApplicationTemplatesEndPoint(user, false) +const getApplicationTemplatesByUserEndPoint = async function (req) { + return ApplicationTemplateService.getUserApplicationTemplatesEndPoint(false) } -const getApplicationTemplateEndPoint = async function (req, user) { +const getApplicationTemplateEndPoint = async function (req) { const name = req.params.name - return ApplicationTemplateService.getApplicationTemplateEndPoint({ name }, user, false) + return ApplicationTemplateService.getApplicationTemplateEndPoint({ name }, false) } -const patchApplicationTemplateEndPoint = async function (req, user) { +const patchApplicationTemplateEndPoint = async function (req) { const application = req.body const name = req.params.name - return ApplicationTemplateService.patchApplicationTemplateEndPoint(application, { name }, user, false) + return ApplicationTemplateService.patchApplicationTemplateEndPoint(application, { name }, false) } -const updateApplicationTemplateEndPoint = async function (req, user) { +const updateApplicationTemplateEndPoint = async function (req) { const application = req.body const name = req.params.name - return ApplicationTemplateService.updateApplicationTemplateEndPoint(application, name, user, false) + return ApplicationTemplateService.updateApplicationTemplateEndPoint(application, name, false) } -const updateApplicationTemplateYAMLEndPoint = async function (req, user) { +const updateApplicationTemplateYAMLEndPoint = async function (req) { if (!req.file) { throw new errors.ValidationError(ErrorMessages.APPLICATION_FILE_NOT_FOUND) } const name = req.params.name const fileContent = req.file.buffer.toString() const application = await YAMLParserService.parseAppTemplateFile(fileContent) - await rvaluesVarSubstition(application.variables, { self: application.variables }, user) + await rvaluesVarSubstition(application.variables, { self: application.variables }) - return ApplicationTemplateService.updateApplicationTemplateEndPoint(application, name, user, false) + return ApplicationTemplateService.updateApplicationTemplateEndPoint(application, name, false) } -const deleteApplicationTemplateEndPoint = async function (req, user) { +const deleteApplicationTemplateEndPoint = async function (req) { const name = req.params.name - return ApplicationTemplateService.deleteApplicationTemplateEndPoint({ name }, user, false) + return ApplicationTemplateService.deleteApplicationTemplateEndPoint({ name }, false) } module.exports = { diff --git a/src/controllers/catalog-controller.js b/src/controllers/catalog-controller.js index afed875af..dcd35cd57 100644 --- a/src/controllers/catalog-controller.js +++ b/src/controllers/catalog-controller.js @@ -13,24 +13,24 @@ const CatalogService = require('../services/catalog-service') -const createCatalogItemEndPoint = async function (req, user) { - return CatalogService.createCatalogItemEndPoint(req.body, user) +const createCatalogItemEndPoint = async function (req) { + return CatalogService.createCatalogItemEndPoint(req.body) } -const listCatalogItemsEndPoint = async function (req, user) { - return CatalogService.listCatalogItemsEndPoint(user, false) +const listCatalogItemsEndPoint = async function (req) { + return CatalogService.listCatalogItemsEndPoint(false) } -const listCatalogItemEndPoint = async function (req, user) { - return CatalogService.getCatalogItemEndPoint(req.params.id, user, false) +const listCatalogItemEndPoint = async function (req) { + return CatalogService.getCatalogItemEndPoint(req.params.id, false) } -const deleteCatalogItemEndPoint = async function (req, user) { - await CatalogService.deleteCatalogItemEndPoint(req.params.id, user, false) +const deleteCatalogItemEndPoint = async function (req) { + await CatalogService.deleteCatalogItemEndPoint(req.params.id, false) } -const updateCatalogItemEndPoint = async function (req, user) { - await CatalogService.updateCatalogItemEndPoint(req.params.id, req.body, user, false) +const updateCatalogItemEndPoint = async function (req) { + await CatalogService.updateCatalogItemEndPoint(req.params.id, req.body, false) } module.exports = { diff --git a/src/controllers/config-controller.js b/src/controllers/config-controller.js index 0b57a14fc..2b5efd729 100644 --- a/src/controllers/config-controller.js +++ b/src/controllers/config-controller.js @@ -13,16 +13,16 @@ const ConfigService = require('../services/config-service') -const upsertConfigElementEndpoint = async function (req, user) { +const upsertConfigElementEndpoint = async function (req) { const configData = req.body return ConfigService.upsertConfigElement(configData) } -const listConfigEndpoint = async function (user) { +const listConfigEndpoint = async function () { return ConfigService.listConfig() } -const getConfigEndpoint = async function (req, user) { +const getConfigEndpoint = async function (req) { const key = req.params.key return ConfigService.getConfigElement(key) } diff --git a/src/controllers/diagnostic-controller.js b/src/controllers/diagnostic-controller.js index 640ae6642..35d053beb 100644 --- a/src/controllers/diagnostic-controller.js +++ b/src/controllers/diagnostic-controller.js @@ -13,24 +13,24 @@ const DiagnosticService = require('../services/diagnostic-service') -const changeMicroserviceStraceStateEndPoint = async function (req, user) { - return DiagnosticService.changeMicroserviceStraceState(req.params.uuid, req.body, user, false) +const changeMicroserviceStraceStateEndPoint = async function (req) { + return DiagnosticService.changeMicroserviceStraceState(req.params.uuid, req.body, false) } -const getMicroserviceStraceDataEndPoint = async function (req, user) { - return DiagnosticService.getMicroserviceStraceData(req.params.uuid, req.query, user, false) +const getMicroserviceStraceDataEndPoint = async function (req) { + return DiagnosticService.getMicroserviceStraceData(req.params.uuid, req.query, false) } -const postMicroserviceStraceDataToFtpEndPoint = async function (req, user) { - return DiagnosticService.postMicroserviceStraceDatatoFtp(req.params.uuid, req.body, user, false) +const postMicroserviceStraceDataToFtpEndPoint = async function (req) { + return DiagnosticService.postMicroserviceStraceDatatoFtp(req.params.uuid, req.body, false) } -const createMicroserviceImageSnapshotEndPoint = async function (req, user) { - return DiagnosticService.postMicroserviceImageSnapshotCreate(req.params.uuid, user, false) +const createMicroserviceImageSnapshotEndPoint = async function (req) { + return DiagnosticService.postMicroserviceImageSnapshotCreate(req.params.uuid, false) } -const getMicroserviceImageSnapshotEndPoint = async function (req, user) { - return DiagnosticService.getMicroserviceImageSnapshot(req.params.uuid, user, false) +const getMicroserviceImageSnapshotEndPoint = async function (req) { + return DiagnosticService.getMicroserviceImageSnapshot(req.params.uuid, false) } module.exports = { diff --git a/src/controllers/edge-resource-controller.js b/src/controllers/edge-resource-controller.js index f6ca86473..e4ec39658 100644 --- a/src/controllers/edge-resource-controller.js +++ b/src/controllers/edge-resource-controller.js @@ -13,24 +13,24 @@ const EdgeResourceService = require('../services/edge-resource-service') -const createEdgeResourceEndpoint = async function (req, user) { +const createEdgeResourceEndpoint = async function (req) { const edgeResourceData = req.body - return EdgeResourceService.createEdgeResource(edgeResourceData, user) + return EdgeResourceService.createEdgeResource(edgeResourceData) } -const updateEdgeResourceEndpoint = async function (req, user) { +const updateEdgeResourceEndpoint = async function (req) { const edgeResourceData = req.body const { version, name } = req.params - return EdgeResourceService.updateEdgeResourceEndpoint(edgeResourceData, { name, version }, user) + return EdgeResourceService.updateEdgeResourceEndpoint(edgeResourceData, { name, version }) } -const listEdgeResourcesEndpoint = async function (req, user) { - return { edgeResources: await EdgeResourceService.listEdgeResources(user) } +const listEdgeResourcesEndpoint = async function (req) { + return { edgeResources: await EdgeResourceService.listEdgeResources() } } -const getEdgeResourceEndpoint = async function (req, user) { +const getEdgeResourceEndpoint = async function (req) { const { version, name } = req.params - const result = await EdgeResourceService.getEdgeResource({ name, version }, user) + const result = await EdgeResourceService.getEdgeResource({ name, version }) if (version) { return result } else { @@ -38,27 +38,27 @@ const getEdgeResourceEndpoint = async function (req, user) { } } -const getEdgeResourceAllVersionsEndpoint = async function (req, user) { +const getEdgeResourceAllVersionsEndpoint = async function (req) { const { name } = req.params - const result = await EdgeResourceService.getEdgeResource({ name }, user) + const result = await EdgeResourceService.getEdgeResource({ name }) return { edgeResources: result } } -const deleteEdgeResourceEndpoint = async function (req, user) { +const deleteEdgeResourceEndpoint = async function (req) { const { version, name } = req.params - return EdgeResourceService.deleteEdgeResource({ name, version }, user) + return EdgeResourceService.deleteEdgeResource({ name, version }) } -const linkEdgeResourceEndpoint = async function (req, user) { +const linkEdgeResourceEndpoint = async function (req) { const { name, version } = req.params const { uuid } = req.body - return EdgeResourceService.linkEdgeResource({ name, version }, uuid, user) + return EdgeResourceService.linkEdgeResource({ name, version }, uuid) } -const unlinkEdgeResourceEndpoint = async function (req, user) { +const unlinkEdgeResourceEndpoint = async function (req) { const { name, version } = req.params const { uuid } = req.body - return EdgeResourceService.unlinkEdgeResource({ name, version }, uuid, user) + return EdgeResourceService.unlinkEdgeResource({ name, version }, uuid) } module.exports = { diff --git a/src/controllers/iofog-controller.js b/src/controllers/iofog-controller.js index 2a6c793c7..3d2f86ccb 100644 --- a/src/controllers/iofog-controller.js +++ b/src/controllers/iofog-controller.js @@ -14,83 +14,83 @@ const FogService = require('../services/iofog-service') const qs = require('qs') -async function createFogEndPoint (req, user) { +async function createFogEndPoint (req) { const newFog = req.body - return FogService.createFogEndPoint(newFog, user, false) + return FogService.createFogEndPoint(newFog, false) } -async function updateFogEndPoint (req, user) { +async function updateFogEndPoint (req) { const updateFog = req.body updateFog.uuid = req.params.uuid - return FogService.updateFogEndPoint(updateFog, user, false) + return FogService.updateFogEndPoint(updateFog, false) } -async function deleteFogEndPoint (req, user) { +async function deleteFogEndPoint (req) { const deleteFog = { uuid: req.params.uuid } - return FogService.deleteFogEndPoint(deleteFog, user, false) + return FogService.deleteFogEndPoint(deleteFog, false) } -async function getFogEndPoint (req, user) { +async function getFogEndPoint (req) { const getFog = { uuid: req.params.uuid } - return FogService.getFogEndPoint(getFog, user, false) + return FogService.getFogEndPoint(getFog, false) } -async function getFogListEndPoint (req, user) { +async function getFogListEndPoint (req) { const isSystem = req.query && req.query.system ? req.query.system === 'true' : false const query = qs.parse(req.query) - return FogService.getFogListEndPoint(query.filters, user, false, isSystem) + return FogService.getFogListEndPoint(query.filters, false, isSystem) } -async function generateProvisionKeyEndPoint (req, user) { +async function generateProvisionKeyEndPoint (req) { const fog = { uuid: req.params.uuid } - return FogService.generateProvisioningKeyEndPoint(fog, user, false) + return FogService.generateProvisioningKeyEndPoint(fog, false) } -async function setFogVersionCommandEndPoint (req, user) { +async function setFogVersionCommandEndPoint (req) { const fogVersionCommand = { uuid: req.params.uuid, versionCommand: req.params.versionCommand } - return FogService.setFogVersionCommandEndPoint(fogVersionCommand, user, false) + return FogService.setFogVersionCommandEndPoint(fogVersionCommand, false) } -async function setFogRebootCommandEndPoint (req, user) { +async function setFogRebootCommandEndPoint (req) { const fog = { uuid: req.params.uuid } - return FogService.setFogRebootCommandEndPoint(fog, user, false) + return FogService.setFogRebootCommandEndPoint(fog, false) } -async function getHalHardwareInfoEndPoint (req, user) { +async function getHalHardwareInfoEndPoint (req) { const uuidObj = { uuid: req.params.uuid } - return FogService.getHalHardwareInfoEndPoint(uuidObj, user, false) + return FogService.getHalHardwareInfoEndPoint(uuidObj, false) } -async function getHalUsbInfoEndPoint (req, user) { +async function getHalUsbInfoEndPoint (req) { const uuidObj = { uuid: req.params.uuid } - return FogService.getHalUsbInfoEndPoint(uuidObj, user, false) + return FogService.getHalUsbInfoEndPoint(uuidObj, false) } -async function setFogPruneCommandEndPoint (req, user) { +async function setFogPruneCommandEndPoint (req) { const fog = { uuid: req.params.uuid } - return FogService.setFogPruneCommandEndPoint(fog, user, false) + return FogService.setFogPruneCommandEndPoint(fog, false) } module.exports = { diff --git a/src/controllers/microservices-controller.js b/src/controllers/microservices-controller.js index f2ff25531..367c3003e 100644 --- a/src/controllers/microservices-controller.js +++ b/src/controllers/microservices-controller.js @@ -15,108 +15,108 @@ const MicroservicesService = require('../services/microservices-service') const YAMLParserService = require('../services/yaml-parser-service') const { rvaluesVarSubstition } = require('../helpers/template-helper') -const createMicroserviceOnFogEndPoint = async function (req, user) { +const createMicroserviceOnFogEndPoint = async function (req) { const microservice = req.body - return MicroservicesService.createMicroserviceEndPoint(microservice, user, false) + return MicroservicesService.createMicroserviceEndPoint(microservice, false) } -const createMicroserviceYAMLEndPoint = async function (req, user) { +const createMicroserviceYAMLEndPoint = async function (req) { const fileContent = req.file.buffer.toString() const microservice = await YAMLParserService.parseMicroserviceFile(fileContent) - await rvaluesVarSubstition(microservice, { self: microservice }, user) - return MicroservicesService.createMicroserviceEndPoint(microservice, user, false) + await rvaluesVarSubstition(microservice, { self: microservice }) + return MicroservicesService.createMicroserviceEndPoint(microservice, false) } -const getMicroserviceEndPoint = async function (req, user) { +const getMicroserviceEndPoint = async function (req) { const microserviceUuid = req.params.uuid - return MicroservicesService.getMicroserviceEndPoint(microserviceUuid, user, false) + return MicroservicesService.getMicroserviceEndPoint(microserviceUuid, false) } -const updateMicroserviceEndPoint = async function (req, user) { +const updateMicroserviceEndPoint = async function (req) { const microservice = req.body const microserviceUuid = req.params.uuid - return MicroservicesService.updateMicroserviceEndPoint(microserviceUuid, microservice, user, false) + return MicroservicesService.updateMicroserviceEndPoint(microserviceUuid, microservice, false) } -const updateMicroserviceYAMLEndPoint = async function (req, user) { +const updateMicroserviceYAMLEndPoint = async function (req) { const microserviceUuid = req.params.uuid const fileContent = req.file.buffer.toString() const microservice = await YAMLParserService.parseMicroserviceFile(fileContent) - await rvaluesVarSubstition(microservice, { self: microservice }, user) - return MicroservicesService.updateMicroserviceEndPoint(microserviceUuid, microservice, user, false) + await rvaluesVarSubstition(microservice, { self: microservice }) + return MicroservicesService.updateMicroserviceEndPoint(microserviceUuid, microservice, false) } -const deleteMicroserviceEndPoint = async function (req, user) { +const deleteMicroserviceEndPoint = async function (req) { const microserviceUuid = req.params.uuid const microserviceData = req.body || {} - return MicroservicesService.deleteMicroserviceEndPoint(microserviceUuid, microserviceData, user, false) + return MicroservicesService.deleteMicroserviceEndPoint(microserviceUuid, microserviceData, false) } -const getMicroservicesByApplicationEndPoint = async function (req, user) { +const getMicroservicesByApplicationEndPoint = async function (req) { // API Retro compatibility const flowId = req.query.flowId const applicationName = req.query.application - return MicroservicesService.listMicroservicesEndPoint({ applicationName, flowId }, user, false) + return MicroservicesService.listMicroservicesEndPoint({ applicationName, flowId }, false) } -const createMicroserviceRouteEndPoint = async function (req, user) { +const createMicroserviceRouteEndPoint = async function (req) { const sourceUuid = req.params.uuid const destUuid = req.params.receiverUuid - return MicroservicesService.createRouteEndPoint(sourceUuid, destUuid, user, false) + return MicroservicesService.createRouteEndPoint(sourceUuid, destUuid, false) } -const deleteMicroserviceRouteEndPoint = async function (req, user) { +const deleteMicroserviceRouteEndPoint = async function (req) { const sourceUuid = req.params.uuid const destUuid = req.params.receiverUuid - return MicroservicesService.deleteRouteEndPoint(sourceUuid, destUuid, user, false) + return MicroservicesService.deleteRouteEndPoint(sourceUuid, destUuid, false) } -const createMicroservicePortMappingEndPoint = async function (req, user) { +const createMicroservicePortMappingEndPoint = async function (req) { const uuid = req.params.uuid const portMappingData = req.body - return MicroservicesService.createPortMappingEndPoint(uuid, portMappingData, user, false) + return MicroservicesService.createPortMappingEndPoint(uuid, portMappingData, false) } -const deleteMicroservicePortMappingEndPoint = async function (req, user) { +const deleteMicroservicePortMappingEndPoint = async function (req) { const uuid = req.params.uuid const internalPort = req.params.internalPort - return MicroservicesService.deletePortMappingEndPoint(uuid, internalPort, user, false) + return MicroservicesService.deletePortMappingEndPoint(uuid, internalPort, false) } -const listMicroservicePortMappingsEndPoint = async function (req, user) { +const listMicroservicePortMappingsEndPoint = async function (req) { const uuid = req.params.uuid - const ports = await MicroservicesService.listMicroservicePortMappingsEndPoint(uuid, user, false) + const ports = await MicroservicesService.listMicroservicePortMappingsEndPoint(uuid, false) return { ports: ports } } -const createMicroserviceVolumeMappingEndPoint = async function (req, user) { +const createMicroserviceVolumeMappingEndPoint = async function (req) { const microserviceUuid = req.params.uuid const volumeMappingData = req.body - const volumeMapping = await MicroservicesService.createVolumeMappingEndPoint(microserviceUuid, volumeMappingData, user, false) + const volumeMapping = await MicroservicesService.createVolumeMappingEndPoint(microserviceUuid, volumeMappingData, false) return { id: volumeMapping.id } } -const listMicroserviceVolumeMappingsEndPoint = async function (req, user) { +const listMicroserviceVolumeMappingsEndPoint = async function (req) { const uuid = req.params.uuid - const volumeMappings = await MicroservicesService.listVolumeMappingsEndPoint(uuid, user, false) + const volumeMappings = await MicroservicesService.listVolumeMappingsEndPoint(uuid, false) return { volumeMappings: volumeMappings } } -const deleteMicroserviceVolumeMappingEndPoint = async function (req, user) { +const deleteMicroserviceVolumeMappingEndPoint = async function (req) { const uuid = req.params.uuid const id = req.params.id - return MicroservicesService.deleteVolumeMappingEndPoint(uuid, id, user, false) + return MicroservicesService.deleteVolumeMappingEndPoint(uuid, id, false) } -const listAllPublicPortsEndPoint = async function (req, user) { - return MicroservicesService.listAllPublicPortsEndPoint(user) +const listAllPublicPortsEndPoint = async function (req) { + return MicroservicesService.listAllPublicPortsEndPoint() } module.exports = { diff --git a/src/controllers/registry-controller.js b/src/controllers/registry-controller.js index 906db93cf..ab633cb0e 100644 --- a/src/controllers/registry-controller.js +++ b/src/controllers/registry-controller.js @@ -13,26 +13,26 @@ const RegistryService = require('../services/registry-service') -const createRegistryEndPoint = async function (req, user) { +const createRegistryEndPoint = async function (req) { const registry = req.body - return RegistryService.createRegistry(registry, user) + return RegistryService.createRegistry(registry) } -const getRegistriesEndPoint = async function (req, user) { - return RegistryService.findRegistries(user, false) +const getRegistriesEndPoint = async function (req) { + return RegistryService.findRegistries(false) } -const deleteRegistryEndPoint = async function (req, user) { +const deleteRegistryEndPoint = async function (req) { const deleteRegistry = { id: parseInt(req.params.id) } - return RegistryService.deleteRegistry(deleteRegistry, user, false) + return RegistryService.deleteRegistry(deleteRegistry, false) } -const updateRegistryEndPoint = async function (req, user) { +const updateRegistryEndPoint = async function (req) { const registry = req.body const registryId = req.params.id - return RegistryService.updateRegistry(registry, registryId, user, false) + return RegistryService.updateRegistry(registry, registryId, false) } module.exports = { diff --git a/src/controllers/routing-controller.js b/src/controllers/routing-controller.js index 01b5f8ec8..8d6df8bc4 100644 --- a/src/controllers/routing-controller.js +++ b/src/controllers/routing-controller.js @@ -13,32 +13,32 @@ const RoutingService = require('../services/routing-service') -const createRoutingEndpoint = async function (req, user) { +const createRoutingEndpoint = async function (req) { const routerData = req.body - return RoutingService.createRouting(routerData, user, false) + return RoutingService.createRouting(routerData, false) } -const getRoutingsEndPoint = async function (req, user) { - return RoutingService.getRoutings(user, false) +const getRoutingsEndPoint = async function (req) { + return RoutingService.getRoutings(false) } -const getRoutingEndPoint = async function (req, user) { +const getRoutingEndPoint = async function (req) { const routeName = req.params.name const appName = req.params.appName - return RoutingService.getRouting(appName, routeName, user, false) + return RoutingService.getRouting(appName, routeName, false) } -const updateRoutingEndpoint = async function (req, user) { +const updateRoutingEndpoint = async function (req) { const routeName = req.params.name const appName = req.params.appName const routeData = req.body - return RoutingService.updateRouting(appName, routeName, routeData, user, false) + return RoutingService.updateRouting(appName, routeName, routeData, false) } -const deleteRoutingEndpoint = async function (req, user) { +const deleteRoutingEndpoint = async function (req) { const routeName = req.params.name const appName = req.params.appName - return RoutingService.deleteRouting(appName, routeName, user, false) + return RoutingService.deleteRouting(appName, routeName, false) } module.exports = { diff --git a/src/controllers/tunnel-controller.js b/src/controllers/tunnel-controller.js index 7bc0ac9be..fb3ea34c9 100644 --- a/src/controllers/tunnel-controller.js +++ b/src/controllers/tunnel-controller.js @@ -15,7 +15,7 @@ const TunnelService = require('../services/tunnel-service') const Errors = require('../helpers/errors') const ErrorMessages = require('../helpers/error-messages') -const manageTunnelEndPoint = async function (req, user) { +const manageTunnelEndPoint = async function (req) { const action = req.body.action const tunnelData = { iofogUuid: req.params.id @@ -23,21 +23,21 @@ const manageTunnelEndPoint = async function (req, user) { switch (action) { case 'open': - await TunnelService.openTunnel(tunnelData, user, false) + await TunnelService.openTunnel(tunnelData, false) break case 'close': - await TunnelService.closeTunnel(tunnelData, user) + await TunnelService.closeTunnel(tunnelData) break default: throw new Errors.ValidationError(ErrorMessages.INVALID_ACTION_PROPERTY) } } -const getTunnelEndPoint = async function (req, user) { +const getTunnelEndPoint = async function (req) { const tunnelData = { iofogUuid: req.params.id } - return TunnelService.findTunnel(tunnelData, user) + return TunnelService.findTunnel(tunnelData) } module.exports = { diff --git a/src/services/application-service.js b/src/services/application-service.js index a823588f4..c337b9ec2 100644 --- a/src/services/application-service.js +++ b/src/services/application-service.js @@ -28,11 +28,11 @@ const remove = require('lodash/remove') const onlyUnique = (value, index, self) => self.indexOf(value) === index -const createApplicationEndPoint = async function (applicationData, user, isCLI, transaction) { +const createApplicationEndPoint = async function (applicationData, isCLI, transaction) { // if template is provided, use template data if (applicationData.template && applicationData.template.name) { applicationData = { - ...await ApplicationTemplateService.getApplicationDataFromTemplate(applicationData.template, user, isCLI, transaction), + ...await ApplicationTemplateService.getApplicationDataFromTemplate(applicationData.template, isCLI, transaction), isSystem: applicationData.isSystem, name: applicationData.name, description: applicationData.description, @@ -72,13 +72,13 @@ const createApplicationEndPoint = async function (applicationData, user, isCLI, try { if (applicationData.microservices) { for (const msvcData of applicationData.microservices) { - await MicroserviceService.createMicroserviceEndPoint(msvcData, user, isCLI, transaction) + await MicroserviceService.createMicroserviceEndPoint(msvcData, isCLI, transaction) } } if (applicationData.routes) { for (const routeData of applicationData.routes) { - await RoutingService.createRouting(routeData, user, isCLI, transaction) + await RoutingService.createRouting(routeData, isCLI, transaction) } } @@ -88,12 +88,12 @@ const createApplicationEndPoint = async function (applicationData, user, isCLI, } } catch (e) { // If anything failed during creating the application, delete all that was created - await deleteApplicationEndPoint({ name: application.name }, user, isCLI, transaction) + await deleteApplicationEndPoint({ name: application.name }, isCLI, transaction) throw e } } -const deleteApplicationEndPoint = async function (conditions, user, isCLI, transaction) { +const deleteApplicationEndPoint = async function (conditions, isCLI, transaction) { const whereObj = { ...conditions } @@ -105,7 +105,7 @@ const deleteApplicationEndPoint = async function (conditions, user, isCLI, trans } // Only patches the metadata (running, name, description, etc.) -const patchApplicationEndPoint = async function (applicationData, conditions, user, isCLI, transaction) { +const patchApplicationEndPoint = async function (applicationData, conditions, isCLI, transaction) { await Validator.validate(applicationData, Validator.schemas.applicationPatch) const oldApplication = await ApplicationManager.findOne({ ...conditions }, transaction) @@ -137,11 +137,11 @@ const patchApplicationEndPoint = async function (applicationData, conditions, us } // Updates the state (microservices, routes, etc.) -const updateApplicationEndPoint = async function (applicationData, name, user, isCLI, transaction) { +const updateApplicationEndPoint = async function (applicationData, name, isCLI, transaction) { // if template is provided, use template data if (applicationData.template && applicationData.template.name) { applicationData = { - ...await ApplicationTemplateService.getApplicationDataFromTemplate(applicationData.template, user, isCLI, transaction), + ...await ApplicationTemplateService.getApplicationDataFromTemplate(applicationData.template, isCLI, transaction), isSystem: applicationData.isSystem, name: applicationData.name || name, description: applicationData.description, @@ -188,10 +188,10 @@ const updateApplicationEndPoint = async function (applicationData, name, user, i await ApplicationManager.update(where, updateApplicationData, transaction) if (applicationData.microservices) { - await _updateMicroservices(application.name, applicationData.microservices, user, isCLI, transaction) + await _updateMicroservices(application.name, applicationData.microservices, isCLI, transaction) } if (applicationData.routes) { - await _updateRoutes(application.name, applicationData.routes, user, isCLI, transaction) + await _updateRoutes(application.name, applicationData.routes, isCLI, transaction) } if (oldApplication.isActivated !== applicationData.isActivated) { @@ -199,7 +199,7 @@ const updateApplicationEndPoint = async function (applicationData, name, user, i } } -const _updateRoutes = async function (application, routes, user, isCLI, transaction) { +const _updateRoutes = async function (application, routes, isCLI, transaction) { // Update routes const updatedRoutes = [...routes] const oldRoutes = await ApplicationManager.findApplicationRoutes({ name: application }, transaction) @@ -209,19 +209,19 @@ const _updateRoutes = async function (application, routes, user, isCLI, transact for (const oldRoute of oldRoutes) { const removed = remove(updatedRoutes, (n) => oldRoute.name === n.name) if (!removed.length) { - await RoutingService.deleteRouting(oldRoute.name, user, isCLI, transaction) + await RoutingService.deleteRouting(oldRoute.name, isCLI, transaction) } else { const updatedRoute = removed[0] - await RoutingService.updateRouting(application, updatedRoute.name, updatedRoute, user, isCLI, transaction) + await RoutingService.updateRouting(application, updatedRoute.name, updatedRoute, isCLI, transaction) } } // Create missing routes for (const route of updatedRoutes) { - await RoutingService.createRouting(route, user, isCLI, transaction) + await RoutingService.createRouting(route, isCLI, transaction) } } -const _updateMicroservices = async function (application, microservices, user, isCLI, transaction) { +const _updateMicroservices = async function (application, microservices, isCLI, transaction) { const updatedMicroservices = [...microservices] // Update microservices const oldMicroservices = await ApplicationManager.findApplicationMicroservices({ name: application }, transaction) @@ -238,14 +238,14 @@ const _updateMicroservices = async function (application, microservices, user, i iofogUuids.push(oldMsvc.iofogUuid) } else { const updatedMsvc = removed[0] - const updatedMicroservices = await MicroserviceService.updateMicroserviceEndPoint(oldMsvc.uuid, updatedMsvc, user, isCLI, transaction, false) + const updatedMicroservices = await MicroserviceService.updateMicroserviceEndPoint(oldMsvc.uuid, updatedMsvc, isCLI, transaction, false) oldMsvcsIofogUuids.push(updatedMicroservices.microserviceIofogUuid) updatedMsvcsUuid.push(updatedMicroservices.updatedMicroserviceIofogUuid) } } // Create missing microservices for (const microservice of updatedMicroservices) { - await MicroserviceService.createMicroserviceEndPoint(microservice, user, isCLI, transaction) + await MicroserviceService.createMicroserviceEndPoint(microservice, isCLI, transaction) } iofogUuids .filter(onlyUnique) @@ -270,7 +270,7 @@ const _updateMicroservices = async function (application, microservices, user, i }) } -const getUserApplicationsEndPoint = async function (user, isCLI, transaction) { +const getUserApplicationsEndPoint = async function (isCLI, transaction) { const application = { isSystem: false } @@ -300,7 +300,7 @@ async function _buildApplicationObject (application, transaction) { return application } -async function getApplication (conditions, user, isCLI, transaction) { +async function getApplication (conditions, isCLI, transaction) { const where = isCLI ? { ...conditions } : { ...conditions } @@ -314,8 +314,8 @@ async function getApplication (conditions, user, isCLI, transaction) { return application } -const getApplicationEndPoint = async function (conditions, user, isCLI, transaction) { - const application = await getApplication(conditions, user, isCLI, transaction) +const getApplicationEndPoint = async function (conditions, isCLI, transaction) { + const application = await getApplication(conditions, isCLI, transaction) return application } diff --git a/src/services/application-template-service.js b/src/services/application-template-service.js index 8fa309cb2..df68d89c2 100644 --- a/src/services/application-template-service.js +++ b/src/services/application-template-service.js @@ -24,7 +24,7 @@ const ApplicationTemplateVariableManager = require('../data/managers/application const TransactionDecorator = require('../decorators/transaction-decorator') const Validator = require('../schemas') -const createApplicationTemplateEndPoint = async function (applicationTemplateData, user, isCLI, transaction) { +const createApplicationTemplateEndPoint = async function (applicationTemplateData, isCLI, transaction) { // Add a name field to pass schema validation using the applicationCreate schema applicationTemplateData.application = { ...applicationTemplateData.application, name: 'validation' } await Validator.validate(applicationTemplateData, Validator.schemas.applicationTemplateCreate) @@ -56,12 +56,12 @@ const createApplicationTemplateEndPoint = async function (applicationTemplateDat } } catch (e) { // If anything failed during creating the application, delete all that was created - await deleteApplicationTemplateEndPoint({ name: applicationTemplate.name }, user, isCLI, transaction) + await deleteApplicationTemplateEndPoint({ name: applicationTemplate.name }, isCLI, transaction) throw e } } -const deleteApplicationTemplateEndPoint = async function (conditions, user, isCLI, transaction) { +const deleteApplicationTemplateEndPoint = async function (conditions, isCLI, transaction) { const whereObj = { ...conditions } @@ -70,7 +70,7 @@ const deleteApplicationTemplateEndPoint = async function (conditions, user, isCL await ApplicationTemplateManager.delete(where, transaction) } -const patchApplicationTemplateEndPoint = async function (applicationTemplateData, conditions, user, isCLI, transaction) { +const patchApplicationTemplateEndPoint = async function (applicationTemplateData, conditions, isCLI, transaction) { await Validator.validate(applicationTemplateData, Validator.schemas.applicationTemplatePatch) const oldApplicationTemplate = await ApplicationTemplateManager.findOne({ ...conditions }, transaction) @@ -95,7 +95,7 @@ const patchApplicationTemplateEndPoint = async function (applicationTemplateData await ApplicationTemplateManager.update(where, updateApplicationTemplateData, transaction) } -const updateApplicationTemplateEndPoint = async function (applicationTemplateData, name, user, isCLI, transaction) { +const updateApplicationTemplateEndPoint = async function (applicationTemplateData, name, isCLI, transaction) { // Add a name field to pass schema validation using the applicationCreate schema applicationTemplateData.application = { ...applicationTemplateData.application, name: 'validation' } await Validator.validate(applicationTemplateData, Validator.schemas.applicationTemplateUpdate) @@ -105,7 +105,7 @@ const updateApplicationTemplateEndPoint = async function (applicationTemplateDat const oldApplicationTemplate = await ApplicationTemplateManager.findOne({ name }, transaction) if (!oldApplicationTemplate) { - return createApplicationTemplateEndPoint({ ...applicationTemplateData, name }, user, isCLI, transaction) + return createApplicationTemplateEndPoint({ ...applicationTemplateData, name }, isCLI, transaction) } if (applicationTemplateData.name) { await _checkForDuplicateName(applicationTemplateData.name, oldApplicationTemplate.id, transaction) @@ -124,7 +124,7 @@ const updateApplicationTemplateEndPoint = async function (applicationTemplateDat await ApplicationTemplateManager.update(where, updateApplicationTemplateData, transaction) if (applicationTemplateData.variables) { - await _updateVariables(oldApplicationTemplate.id, applicationTemplateData.variables, user, isCLI, transaction) + await _updateVariables(oldApplicationTemplate.id, applicationTemplateData.variables, isCLI, transaction) } return { @@ -146,14 +146,14 @@ const _createVariable = async function (applicationTemplateId, variableData, tra return ApplicationTemplateVariableManager.create({ ...newVariable, applicationTemplateId }, transaction) } -const _updateVariables = async function (applicationTemplateId, variables, user, isCLI, transaction) { +const _updateVariables = async function (applicationTemplateId, variables, isCLI, transaction) { await ApplicationTemplateVariableManager.delete({ applicationTemplateId }, transaction) for (const variableData of variables) { await _createVariable(applicationTemplateId, variableData, transaction) } } -const getUserApplicationTemplatesEndPoint = async function (user, isCLI, transaction) { +const getUserApplicationTemplatesEndPoint = async function (isCLI, transaction) { const application = { } @@ -187,7 +187,7 @@ const getAllApplicationTemplatesEndPoint = async function (isCLI, transaction) { } } -async function getApplicationTemplate (conditions, user, isCLI, transaction) { +async function getApplicationTemplate (conditions, isCLI, transaction) { const where = isCLI ? { ...conditions } : { ...conditions } @@ -200,11 +200,11 @@ async function getApplicationTemplate (conditions, user, isCLI, transaction) { return _buildGetApplicationObj(application) } -const getApplicationTemplateEndPoint = async function (name, user, isCLI, transaction) { - return getApplicationTemplate(name, user, isCLI, transaction) +const getApplicationTemplateEndPoint = async function (name, isCLI, transaction) { + return getApplicationTemplate(name, isCLI, transaction) } -const getApplicationDataFromTemplate = async function (deploymentData, user, isCLI, transaction) { +const getApplicationDataFromTemplate = async function (deploymentData, isCLI, transaction) { await Validator.validate(deploymentData, Validator.schemas.applicationTemplateDeploy) const applicationTemplateDBObject = await ApplicationTemplateManager.findOnePopulated({ name: deploymentData.name }, transaction) @@ -236,7 +236,7 @@ const getApplicationDataFromTemplate = async function (deploymentData, user, isC } // default values are overwritten by user defined values, and self is always overwritten to the current object - await rvaluesVarSubstition(newApplication, { ...defaultVariablesValues, ...userProvidedVariables, self: newApplication }, user) + await rvaluesVarSubstition(newApplication, { ...defaultVariablesValues, ...userProvidedVariables, self: newApplication }) for (const msvc of newApplication.microservices) { // Send it back as a string for application creation and validation diff --git a/src/services/catalog-service.js b/src/services/catalog-service.js index 9b7a07a77..a6c0da298 100644 --- a/src/services/catalog-service.js +++ b/src/services/catalog-service.js @@ -26,11 +26,11 @@ const RegistryManager = require('../data/managers/registry-manager') const MicroserviceManager = require('../data/managers/microservice-manager') const MicroseriveStates = require('../enums/microservice-state') -const createCatalogItemEndPoint = async function (data, user, transaction) { +const createCatalogItemEndPoint = async function (data, transaction) { await Validator.validate(data, Validator.schemas.catalogItemCreate) await _checkForDuplicateName(data.name, transaction) await _checkForRestrictedPublisher(data.publisher) - const catalogItem = await _createCatalogItem(data, user, transaction) + const catalogItem = await _createCatalogItem(data, transaction) await _createCatalogImages(data, catalogItem, transaction) await _createCatalogItemInputType(data, catalogItem, transaction) await _createCatalogItemOutputType(data, catalogItem, transaction) @@ -40,7 +40,7 @@ const createCatalogItemEndPoint = async function (data, user, transaction) { } } -const updateCatalogItemEndPoint = async function (id, data, user, isCLI, transaction) { +const updateCatalogItemEndPoint = async function (id, data, isCLI, transaction) { await Validator.validate(data, Validator.schemas.catalogItemUpdate) const where = isCLI @@ -57,7 +57,7 @@ const updateCatalogItemEndPoint = async function (id, data, user, isCLI, transac await _updateCatalogItemIOTypes(data, where, transaction) } -const listCatalogItemsEndPoint = async function (user, isCLI, transaction) { +const listCatalogItemsEndPoint = async function (isCLI, transaction) { const where = isCLI ? {} : { @@ -74,7 +74,7 @@ const listCatalogItemsEndPoint = async function (user, isCLI, transaction) { } } -async function getCatalogItem (id, user, isCLI, transaction) { +async function getCatalogItem (id, isCLI, transaction) { const where = isCLI ? { id: id } : { @@ -93,11 +93,11 @@ async function getCatalogItem (id, user, isCLI, transaction) { return item } -const getCatalogItemEndPoint = async function (id, user, isCLI, transaction) { - return getCatalogItem(id, user, isCLI, transaction) +const getCatalogItemEndPoint = async function (id, isCLI, transaction) { + return getCatalogItem(id, isCLI, transaction) } -const deleteCatalogItemEndPoint = async function (id, user, isCLI, transaction) { +const deleteCatalogItemEndPoint = async function (id, isCLI, transaction) { const where = isCLI ? { id: id @@ -200,7 +200,7 @@ const _checkIfItemExists = async function (where, transaction) { return item } -const _createCatalogItem = async function (data, user, transaction) { +const _createCatalogItem = async function (data, transaction) { let catalogItem = { name: data.name, description: data.description, diff --git a/src/services/diagnostic-service.js b/src/services/diagnostic-service.js index 0b8502a12..f138683cc 100644 --- a/src/services/diagnostic-service.js +++ b/src/services/diagnostic-service.js @@ -26,9 +26,9 @@ const logger = require('../logger') const FtpClient = require('ftp') const mime = require('mime') -const changeMicroserviceStraceState = async function (uuid, data, user, isCLI, transaction) { +const changeMicroserviceStraceState = async function (uuid, data, isCLI, transaction) { await Validator.validate(data, Validator.schemas.straceStateUpdate) - const microservice = await MicroserviceService.getMicroserviceEndPoint(uuid, user, isCLI, transaction) + const microservice = await MicroserviceService.getMicroserviceEndPoint(uuid, isCLI, transaction) if (microservice.iofogUuid === null) { throw new Errors.ValidationError(ErrorMessages.STRACE_WITHOUT_FOG) } @@ -42,7 +42,7 @@ const changeMicroserviceStraceState = async function (uuid, data, user, isCLI, t await ChangeTrackingService.update(microservice.iofogUuid, ChangeTrackingService.events.diagnostics, transaction) } -const getMicroserviceStraceData = async function (uuid, data, user, isCLI, transaction) { +const getMicroserviceStraceData = async function (uuid, data, isCLI, transaction) { await Validator.validate(data, Validator.schemas.straceGetData) const microserviceWhere = isCLI @@ -75,7 +75,7 @@ const getMicroserviceStraceData = async function (uuid, data, user, isCLI, trans } } -const postMicroserviceStraceDatatoFtp = async function (uuid, data, user, isCLI, transaction) { +const postMicroserviceStraceDatatoFtp = async function (uuid, data, isCLI, transaction) { await Validator.validate(data, Validator.schemas.stracePostToFtp) const microserviceWhere = isCLI @@ -100,7 +100,7 @@ const postMicroserviceStraceDatatoFtp = async function (uuid, data, user, isCLI, _deleteFile(filePath) } -const postMicroserviceImageSnapshotCreate = async function (microserviceUuid, user, isCLI, transaction) { +const postMicroserviceImageSnapshotCreate = async function (microserviceUuid, isCLI, transaction) { const where = isCLI ? { uuid: microserviceUuid @@ -126,7 +126,7 @@ const postMicroserviceImageSnapshotCreate = async function (microserviceUuid, us await ChangeTrackingService.update(microservice.iofogUuid, ChangeTrackingService.events.imageSnapshot, transaction) } -const getMicroserviceImageSnapshot = async function (microserviceUuid, user, isCLI, transaction) { +const getMicroserviceImageSnapshot = async function (microserviceUuid, isCLI, transaction) { const where = isCLI ? { uuid: microserviceUuid diff --git a/src/services/edge-resource-service.js b/src/services/edge-resource-service.js index 750e040a7..dfa5052d5 100644 --- a/src/services/edge-resource-service.js +++ b/src/services/edge-resource-service.js @@ -155,7 +155,7 @@ async function _updateOrchestrationTags (tagArray, edgeResourceModel, transactio } } -async function createEdgeResource (edgeResourceData, user, transaction) { +async function createEdgeResource (edgeResourceData, transaction) { await Validator.validate(edgeResourceData, Validator.schemas.edgeResourceCreate) const { name, description, version, orchestrationTags, interfaceProtocol, display, custom } = edgeResourceData const existingResource = await EdgeResourceManager.findOne({ name, version }, transaction) @@ -192,7 +192,7 @@ async function createEdgeResource (edgeResourceData, user, transaction) { return buildGetObject(resource) } -async function updateEdgeResourceEndpoint (edgeResourceData, { name: oldName, version }, user, transaction) { +async function updateEdgeResourceEndpoint (edgeResourceData, { name: oldName, version }, transaction) { await Validator.validate(edgeResourceData, Validator.schemas.edgeResourceUpdate) const oldData = await EdgeResourceManager.findOne({ name: oldName, version }, transaction) if (!oldData) { @@ -202,7 +202,7 @@ async function updateEdgeResourceEndpoint (edgeResourceData, { name: oldName, ve if (!edgeResourceData.version) { edgeResourceData.version = version } - return createEdgeResource(edgeResourceData, user, transaction) + return createEdgeResource(edgeResourceData, transaction) } if (edgeResourceData.version && oldData.version !== edgeResourceData.version) { throw new Errors.ValidationError(AppHelper.formatMessage(ErrorMessages.RESOURCE_UPDATE_VERSION_MISMATCH)) @@ -244,7 +244,7 @@ async function updateEdgeResourceEndpoint (edgeResourceData, { name: oldName, ve } } -async function deleteEdgeResource ({ name, version }, user, transaction) { +async function deleteEdgeResource ({ name, version }, transaction) { const resource = await EdgeResourceManager.findOne({ name, version }, transaction) if (!resource) { throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.NOT_FOUND_RESOURCE_NAME_VERSION, name, version)) @@ -258,7 +258,7 @@ async function deleteEdgeResource ({ name, version }, user, transaction) { await EdgeResourceManager.delete({ name, version }, transaction) } -async function linkEdgeResource ({ name, version }, uuid, user, transaction) { +async function linkEdgeResource ({ name, version }, uuid, transaction) { const resource = await EdgeResourceManager.findOne({ name, version }, transaction) if (!resource) { throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.NOT_FOUND_RESOURCE_NAME_VERSION, name, version)) @@ -274,7 +274,7 @@ async function linkEdgeResource ({ name, version }, uuid, user, transaction) { await ChangeTrackingService.update(agent.uuid, ChangeTrackingService.events.edgeResources, transaction) } -async function unlinkEdgeResource ({ name, version }, uuid, user, transaction) { +async function unlinkEdgeResource ({ name, version }, uuid, transaction) { const resource = await EdgeResourceManager.findOne({ name, version }, transaction) if (!resource) { throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.NOT_FOUND_RESOURCE_NAME_VERSION, name, version)) diff --git a/src/services/iofog-service.js b/src/services/iofog-service.js index 9f3bb6d04..bc690d3cf 100644 --- a/src/services/iofog-service.js +++ b/src/services/iofog-service.js @@ -35,7 +35,7 @@ const Constants = require('../helpers/constants') const Op = require('sequelize').Op const lget = require('lodash/get') -async function createFogEndPoint (fogData, user, isCLI, transaction) { +async function createFogEndPoint (fogData, isCLI, transaction) { await Validator.validate(fogData, Validator.schemas.iofogCreate) let createFogData = { @@ -119,11 +119,11 @@ async function createFogEndPoint (fogData, user, isCLI, transaction) { await ChangeTrackingService.create(fog.uuid, transaction) if (fogData.abstractedHardwareEnabled) { - await _createHalMicroserviceForFog(fog, null, user, transaction) + await _createHalMicroserviceForFog(fog, null, transaction) } if (fogData.bluetoothEnabled) { - await _createBluetoothMicroserviceForFog(fog, null, user, transaction) + await _createBluetoothMicroserviceForFog(fog, null, transaction) } await ChangeTrackingService.update(createFogData.uuid, ChangeTrackingService.events.microserviceCommon, transaction) @@ -145,7 +145,7 @@ async function _setTags (fogModel, tagsArray, transaction) { } } -async function updateFogEndPoint (fogData, user, isCLI, transaction) { +async function updateFogEndPoint (fogData, isCLI, transaction) { await Validator.validate(fogData, Validator.schemas.iofogUpdate) const queryFogData = { uuid: fogData.uuid } @@ -263,7 +263,7 @@ async function updateFogEndPoint (fogData, user, isCLI, transaction) { msChanged = true } if (oldFog.abstractedHardwareEnabled === false && fogData.abstractedHardwareEnabled === true) { - await _createHalMicroserviceForFog(fogData, oldFog, user, transaction) + await _createHalMicroserviceForFog(fogData, oldFog, transaction) msChanged = true } @@ -272,7 +272,7 @@ async function updateFogEndPoint (fogData, user, isCLI, transaction) { msChanged = true } if (oldFog.bluetoothEnabled === false && fogData.bluetoothEnabled === true) { - await _createBluetoothMicroserviceForFog(fogData, oldFog, user, transaction) + await _createBluetoothMicroserviceForFog(fogData, oldFog, transaction) msChanged = true } @@ -354,7 +354,7 @@ async function _deleteFogRouter (fogData, transaction) { await MicroserviceManager.delete({ catalogItemId: routerCatalog.id, iofogUuid: fogData.uuid }, transaction) } -async function deleteFogEndPoint (fogData, user, isCLI, transaction) { +async function deleteFogEndPoint (fogData, isCLI, transaction) { await Validator.validate(fogData, Validator.schemas.iofogDelete) const queryFogData = { uuid: fogData.uuid } @@ -432,7 +432,7 @@ function _mapTags (fog) { return fog.tags ? fog.tags.map(t => t.value) : [] } -async function getFog (fogData, user, isCLI, transaction) { +async function getFog (fogData, isCLI, transaction) { await Validator.validate(fogData, Validator.schemas.iofogGet) const queryFogData = fogData.uuid ? { uuid: fogData.uuid } : { name: fogData.name } @@ -445,15 +445,15 @@ async function getFog (fogData, user, isCLI, transaction) { return _getFogExtraInformation(fog, transaction) } -async function getFogEndPoint (fogData, user, isCLI, transaction) { - return getFog(fogData, user, isCLI, transaction) +async function getFogEndPoint (fogData, isCLI, transaction) { + return getFog(fogData, isCLI, transaction) } -async function getFogListEndPoint (filters, user, isCLI, isSystem, transaction) { +async function getFogListEndPoint (filters, isCLI, isSystem, transaction) { await Validator.validate(filters, Validator.schemas.iofogFilters) // If listing system agent through REST API, make sure user is authenticated - if (isSystem && !isCLI && !lget(user, 'id')) { + if (isSystem && !isCLI && !lget('id')) { throw new Errors.AuthenticationError('Unauthorized') } @@ -470,7 +470,7 @@ async function getFogListEndPoint (filters, user, isCLI, isSystem, transaction) } } -async function generateProvisioningKeyEndPoint (fogData, user, isCLI, transaction) { +async function generateProvisioningKeyEndPoint (fogData, isCLI, transaction) { await Validator.validate(fogData, Validator.schemas.iofogGenerateProvision) const queryFogData = { uuid: fogData.uuid } @@ -494,7 +494,7 @@ async function generateProvisioningKeyEndPoint (fogData, user, isCLI, transactio } } -async function setFogVersionCommandEndPoint (fogVersionData, user, isCLI, transaction) { +async function setFogVersionCommandEndPoint (fogVersionData, isCLI, transaction) { await Validator.validate(fogVersionData, Validator.schemas.iofogSetVersionCommand) const queryFogData = { uuid: fogVersionData.uuid } @@ -516,12 +516,12 @@ async function setFogVersionCommandEndPoint (fogVersionData, user, isCLI, transa throw new Errors.ValidationError(ErrorMessages.INVALID_VERSION_COMMAND_UPGRADE) } - await generateProvisioningKeyEndPoint({ uuid: fogVersionData.uuid }, user, isCLI, transaction) + await generateProvisioningKeyEndPoint({ uuid: fogVersionData.uuid }, isCLI, transaction) await FogVersionCommandManager.updateOrCreate({ iofogUuid: fogVersionData.uuid }, newVersionCommand, transaction) await ChangeTrackingService.update(fogVersionData.uuid, ChangeTrackingService.events.version, transaction) } -async function setFogRebootCommandEndPoint (fogData, user, isCLI, transaction) { +async function setFogRebootCommandEndPoint (fogData, isCLI, transaction) { await Validator.validate(fogData, Validator.schemas.iofogReboot) const queryFogData = { uuid: fogData.uuid } @@ -534,7 +534,7 @@ async function setFogRebootCommandEndPoint (fogData, user, isCLI, transaction) { await ChangeTrackingService.update(fogData.uuid, ChangeTrackingService.events.reboot, transaction) } -async function getHalHardwareInfoEndPoint (uuidObj, user, isCLI, transaction) { +async function getHalHardwareInfoEndPoint (uuidObj, isCLI, transaction) { await Validator.validate(uuidObj, Validator.schemas.halGet) const fog = await FogManager.findOne({ @@ -549,7 +549,7 @@ async function getHalHardwareInfoEndPoint (uuidObj, user, isCLI, transaction) { }, transaction) } -async function getHalUsbInfoEndPoint (uuidObj, user, isCLI, transaction) { +async function getHalUsbInfoEndPoint (uuidObj, isCLI, transaction) { await Validator.validate(uuidObj, Validator.schemas.halGet) const fog = await FogManager.findOne({ @@ -600,7 +600,7 @@ async function _processDeleteCommand (fog, transaction) { await FogManager.delete({ uuid: fog.uuid }, transaction) } -async function _createHalMicroserviceForFog (fogData, oldFog, user, transaction) { +async function _createHalMicroserviceForFog (fogData, oldFog, transaction) { const halItem = await CatalogService.getHalCatalogItem(transaction) const halMicroserviceData = { @@ -627,7 +627,7 @@ async function _deleteHalMicroserviceByFog (fogData, transaction) { await MicroserviceManager.delete(deleteHalMicroserviceData, transaction) } -async function _createBluetoothMicroserviceForFog (fogData, oldFog, user, transaction) { +async function _createBluetoothMicroserviceForFog (fogData, oldFog, transaction) { const bluetoothItem = await CatalogService.getBluetoothCatalogItem(transaction) const bluetoothMicroserviceData = { @@ -654,7 +654,7 @@ async function _deleteBluetoothMicroserviceByFog (fogData, transaction) { await MicroserviceManager.delete(deleteBluetoothMicroserviceData, transaction) } -async function setFogPruneCommandEndPoint (fogData, user, isCLI, transaction) { +async function setFogPruneCommandEndPoint (fogData, isCLI, transaction) { await Validator.validate(fogData, Validator.schemas.iofogPrune) const queryFogData = { uuid: fogData.uuid } diff --git a/src/services/microservice-ports/default.js b/src/services/microservice-ports/default.js index 8ca6ac690..07b504909 100644 --- a/src/services/microservice-ports/default.js +++ b/src/services/microservice-ports/default.js @@ -180,11 +180,11 @@ async function validatePublicPortAppHostTemplate (extraHost, templateArgs, msvc, throw new Errors.ValidationError(AppHelper.formatMessage(ErrorMessages.NOT_FOUND_HOST_TEMPLATE, templateArgs[4])) } -async function movePublicPortsToNewFog (updatedMicroservice, user, transaction) { +async function movePublicPortsToNewFog (updatedMicroservice, transaction) { const portMappings = await updatedMicroservice.getPorts() for (const portMapping of portMappings) { if (portMapping.isProxy) { - Proxy.moveProxyPortsToNewFog(updatedMicroservice, portMapping, user, transaction) + Proxy.moveProxyPortsToNewFog(updatedMicroservice, portMapping, transaction) continue } else if (!portMapping.isPublic) { continue @@ -201,13 +201,13 @@ async function movePublicPortsToNewFog (updatedMicroservice, user, transaction) host: destAgentsRouter.host, port: destAgentsRouter.messagingPort } - const newProxy = await _createOrUpdateProxyMicroservice(localMapping, networkRouter, updatedMicroservice.iofogUuid, localProxy.catalogItemId, user, transaction) + const newProxy = await _createOrUpdateProxyMicroservice(localMapping, networkRouter, updatedMicroservice.iofogUuid, localProxy.catalogItemId, transaction) publicPort.localProxyId = newProxy.uuid await MicroservicePublicPortManager.updateOrCreate({ id: publicPort.id }, publicPort.toJSON(), transaction) } } -async function createPortMapping (microservice, portMappingData, user, transaction) { +async function createPortMapping (microservice, portMappingData, transaction) { if (!microservice.iofogUuid) { throw new Errors.ValidationError(AppHelper.formatMessage(ErrorMessages.REQUIRED_FOG_NODE)) } @@ -231,15 +231,15 @@ async function createPortMapping (microservice, portMappingData, user, transacti portMappingData.protocol = portMappingData.protocol || '' if (portMappingData.public) { - return _createPublicPortMapping(microservice, portMappingData, user, transaction) + return _createPublicPortMapping(microservice, portMappingData, transaction) } else if (portMappingData.proxy) { - return Proxy.createProxyPortMapping(microservice, portMappingData, user, transaction) + return Proxy.createProxyPortMapping(microservice, portMappingData, transaction) } else { - return _createSimplePortMapping(microservice, portMappingData, user, transaction) + return _createSimplePortMapping(microservice, portMappingData, transaction) } } -async function _createOrUpdateProxyMicroservice (mapping, networkRouter, hostUuid, proxyCatalogId, user, transaction) { +async function _createOrUpdateProxyMicroservice (mapping, networkRouter, hostUuid, proxyCatalogId, transaction) { const existingProxy = await MicroserviceManager.findOne({ catalogItemId: proxyCatalogId, iofogUuid: hostUuid }, transaction) if (existingProxy) { const config = JSON.parse(existingProxy.config || '{}') @@ -267,7 +267,7 @@ async function _createOrUpdateProxyMicroservice (mapping, networkRouter, hostUui return res } -async function _createPublicPortMapping (microservice, portMappingData, user, transaction) { +async function _createPublicPortMapping (microservice, portMappingData, transaction) { const isTcp = portMappingData.public.protocol ? portMappingData.public.protocol.toLowerCase() === 'tcp' : false const isUdp = portMappingData.protocol.toLowerCase() === 'udp' const localAgent = portMappingData.localAgent // This is populated by validating the ports @@ -289,7 +289,6 @@ async function _createPublicPortMapping (microservice, portMappingData, user, tr localNetworkRouter, microservice.iofogUuid, proxyCatalog.id, - user, transaction) : null @@ -307,7 +306,6 @@ async function _createPublicPortMapping (microservice, portMappingData, user, tr remoteNetworkRouter, portMappingData.publicHost.uuid, proxyCatalog.id, - user, transaction) : null } @@ -345,13 +343,13 @@ async function _createPublicPortMapping (microservice, portMappingData, user, tr } } -async function _deletePortMapping (microservice, portMapping, user, transaction) { +async function _deletePortMapping (microservice, portMapping, transaction) { if (portMapping.isPublic) { await _deletePublicPortMapping(microservice, portMapping, transaction) } else if (portMapping.isProxy) { - return Proxy.deleteProxyPortMapping(microservice, portMapping, user, transaction) + return Proxy.deleteProxyPortMapping(microservice, portMapping, transaction) } else { - await _deleteSimplePortMapping(microservice, portMapping, user, transaction) + await _deleteSimplePortMapping(microservice, portMapping, transaction) } } @@ -386,7 +384,7 @@ async function _deletePublicPortMapping (microservice, portMapping, transaction) await MicroservicePortManager.delete({ id: portMapping.id }, transaction) } -async function _createSimplePortMapping (microservice, portMappingData, user, transaction) { +async function _createSimplePortMapping (microservice, portMappingData, transaction) { // create port mapping const mappingData = { isPublic: false, @@ -401,7 +399,7 @@ async function _createSimplePortMapping (microservice, portMappingData, user, tr await switchOnUpdateFlagsForMicroservicesForPortMapping(microservice, false, transaction) } -async function _deleteSimplePortMapping (microservice, msPorts, user, transaction) { +async function _deleteSimplePortMapping (microservice, msPorts, transaction) { await MicroservicePortManager.delete({ id: msPorts.id }, transaction) const updateRebuildMs = { @@ -470,7 +468,7 @@ async function switchOnUpdateFlagsForMicroservicesForPortMapping (microservice, } } -async function listPortMappings (microserviceUuid, user, isCLI, transaction) { +async function listPortMappings (microserviceUuid, isCLI, transaction) { const where = isCLI ? { uuid: microserviceUuid } : { uuid: microserviceUuid } @@ -483,7 +481,7 @@ async function listPortMappings (microserviceUuid, user, isCLI, transaction) { return _buildPortsList(portsPairs, transaction) } -async function deletePortMapping (microserviceUuid, internalPort, user, isCLI, transaction) { +async function deletePortMapping (microserviceUuid, internalPort, isCLI, transaction) { const where = isCLI ? { uuid: microserviceUuid } : { uuid: microserviceUuid } @@ -505,13 +503,13 @@ async function deletePortMapping (microserviceUuid, internalPort, user, isCLI, t throw new Errors.NotFoundError('port mapping not exists') } - await _deletePortMapping(microservice, msPorts, user, transaction) + await _deletePortMapping(microservice, msPorts, transaction) } -async function deletePortMappings (microservice, user, transaction) { +async function deletePortMappings (microservice, transaction) { const portMappings = await MicroservicePortManager.findAll({ microserviceUuid: microservice.uuid }, transaction) for (const ports of portMappings) { - await _deletePortMapping(microservice, ports, user, transaction) + await _deletePortMapping(microservice, ports, transaction) } } @@ -519,7 +517,7 @@ async function getPortMappings (microserviceUuid, transaction) { return MicroservicePortManager.findAll({ microserviceUuid }, transaction) } -function listAllPublicPorts (user, transaction) { +function listAllPublicPorts (transaction) { return MicroservicePortManager.findAllPublicPorts(transaction) } diff --git a/src/services/microservice-ports/proxy.js b/src/services/microservice-ports/proxy.js index 0a7e2dab2..d16a31f63 100644 --- a/src/services/microservice-ports/proxy.js +++ b/src/services/microservice-ports/proxy.js @@ -20,7 +20,7 @@ const MicroservicePortManager = require('../../data/managers/microservice-port-m const MicroserviceProxyPortManager = require('../../data/managers/microservice-proxy-port-manager') const ProxyBrokerClient = require('../../helpers/proxy-broker-client') -async function _createOrUpdatePortRouterMicroservice (existingProxy, localPort, protocol, portRouterServerConfig, hostUuid, portRouterCatalogId, microserviceUuid, user, transaction) { +async function _createOrUpdatePortRouterMicroservice (existingProxy, localPort, protocol, portRouterServerConfig, hostUuid, portRouterCatalogId, microserviceUuid, transaction) { const proxyConfig = { name: `${microserviceUuid}_${localPort}`, server_addr: portRouterServerConfig.host, @@ -59,7 +59,7 @@ async function _createOrUpdatePortRouterMicroservice (existingProxy, localPort, return res } -async function createProxyPortMapping (microservice, portMappingData, user, transaction) { +async function createProxyPortMapping (microservice, portMappingData, transaction) { const protocol = portMappingData.protocol || 'tcp' // create proxy microservices @@ -82,7 +82,6 @@ async function createProxyPortMapping (microservice, portMappingData, user, tran microservice.iofogUuid, portRouterCatalog.id, microservice.uuid, - user, transaction) const mappingData = { @@ -130,7 +129,7 @@ async function buildProxyPortMapping (pm, mapping, transaction) { } } -async function deleteProxyPortMapping (microservice, portMapping, user, transaction) { +async function deleteProxyPortMapping (microservice, portMapping, transaction) { const proxyPort = await portMapping.getProxyPort() if (proxyPort) { await _updateOrDeleteProxyMicroservice(proxyPort, false, transaction) @@ -165,7 +164,7 @@ async function _updateOrDeleteProxyMicroservice (proxyPort, isMove, transaction) } } -async function moveProxyPortsToNewFog (updatedMicroservice, portMapping, user, transaction) { +async function moveProxyPortsToNewFog (updatedMicroservice, portMapping, transaction) { const proxyPort = await portMapping.getProxyPort() const localProxy = await MicroserviceManager.findOne({ uuid: proxyPort.localProxyId }, transaction) await _updateOrDeleteProxyMicroservice(proxyPort, true, transaction) @@ -194,7 +193,6 @@ async function moveProxyPortsToNewFog (updatedMicroservice, portMapping, user, t updatedMicroservice.iofogUuid, localProxy.catalogItemId, updatedMicroservice.uuid, - user, transaction) proxyPort.localProxyId = newProxy.uuid diff --git a/src/services/microservices-service.js b/src/services/microservices-service.js index 4c90f7185..55156d1ce 100644 --- a/src/services/microservices-service.js +++ b/src/services/microservices-service.js @@ -37,14 +37,14 @@ const { VOLUME_MAPPING_DEFAULT } = require('../helpers/constants') const constants = require('../helpers/constants') const isEqual = require('lodash/isEqual') -async function listMicroservicesEndPoint (opt, user, isCLI, transaction) { +async function listMicroservicesEndPoint (opt, isCLI, transaction) { // API retro compatibility const { applicationName, flowId } = opt - let application = await _validateApplication(applicationName, user, isCLI, transaction) + let application = await _validateApplication(applicationName, isCLI, transaction) if (flowId) { // _validateApplication wil try by ID if it fails finding by name - application = await _validateApplication(flowId, user, isCLI, transaction) + application = await _validateApplication(flowId, isCLI, transaction) } const where = application ? { applicationId: application.id, delete: false } : { delete: false, applicationId: { [Op.ne]: null } } @@ -60,7 +60,7 @@ async function listMicroservicesEndPoint (opt, user, isCLI, transaction) { } } -async function getMicroserviceEndPoint (microserviceUuid, user, isCLI, transaction) { +async function getMicroserviceEndPoint (microserviceUuid, isCLI, transaction) { if (!isCLI) { await _validateMicroserviceOnGet(microserviceUuid, transaction) } @@ -150,7 +150,7 @@ async function _validateAgentHostTemplate (extraHost, templateArgs, transaction) return extraHost } -async function _validateExtraHost (extraHostData, user, transaction) { +async function _validateExtraHost (extraHostData, transaction) { const extraHost = { templateType: 'Litteral', name: extraHostData.name, @@ -171,13 +171,13 @@ async function _validateExtraHost (extraHostData, user, transaction) { throw new Errors.ValidationError(AppHelper.formatMessage(ErrorMessages.INVALID_HOST_TEMPLATE, template)) } -async function _validateExtraHosts (microserviceData, user, transaction) { +async function _validateExtraHosts (microserviceData, transaction) { if (!microserviceData.extraHosts || microserviceData.extraHosts.length === 0) { return [] } const extraHosts = [] for (const extraHost of microserviceData.extraHosts) { - extraHosts.push(await _validateExtraHost(extraHost, user, transaction)) + extraHosts.push(await _validateExtraHost(extraHost, transaction)) } return extraHosts } @@ -195,7 +195,7 @@ function _validateImageFogType (microserviceData, fog, images) { } } -async function _findFog (microserviceData, user, isCLI, transaction) { +async function _findFog (microserviceData, isCLI, transaction) { const fogConditions = {} if (microserviceData.iofogUuid) { fogConditions.uuid = microserviceData.iofogUuid @@ -205,7 +205,7 @@ async function _findFog (microserviceData, user, isCLI, transaction) { return FogManager.findOne(fogConditions, transaction) } -async function createMicroserviceEndPoint (microserviceData, user, isCLI, transaction) { +async function createMicroserviceEndPoint (microserviceData, isCLI, transaction) { // API Retro compatibility if (!microserviceData.application) { microserviceData.application = microserviceData.flowId @@ -213,7 +213,7 @@ async function createMicroserviceEndPoint (microserviceData, user, isCLI, transa await Validator.validate(microserviceData, Validator.schemas.microserviceCreate) // find fog - const fog = await _findFog(microserviceData, user, isCLI, transaction) + const fog = await _findFog(microserviceData, isCLI, transaction) if (!fog) { throw new Errors.ValidationError(AppHelper.formatMessage(ErrorMessages.INVALID_IOFOG_UUID, microserviceData.iofogUuid || microserviceData.agentName)) } @@ -224,7 +224,7 @@ async function createMicroserviceEndPoint (microserviceData, user, isCLI, transa // validate images if (microserviceData.catalogItemId) { // validate catalog item - const catalogItem = await CatalogService.getCatalogItem(microserviceData.catalogItemId, user, isCLI, transaction) + const catalogItem = await CatalogService.getCatalogItem(microserviceData.catalogItemId, isCLI, transaction) _validateImagesAgainstCatalog(catalogItem, microserviceData.images || []) microserviceData.images = catalogItem.images _validateImageFogType(microserviceData, fog, catalogItem.images) @@ -237,13 +237,13 @@ async function createMicroserviceEndPoint (microserviceData, user, isCLI, transa } // validate extraHosts - const extraHosts = await _validateExtraHosts(microserviceData, user, transaction) + const extraHosts = await _validateExtraHosts(microserviceData, transaction) await MicroservicePortService.validatePortMappings(microserviceData, transaction) _validateVolumeMappings(microserviceData.volumeMappings) - const microservice = await _createMicroservice({ ...microserviceData, iofogUuid: fog.uuid }, user, isCLI, transaction) + const microservice = await _createMicroservice({ ...microserviceData, iofogUuid: fog.uuid }, isCLI, transaction) if (!microserviceData.catalogItemId) { await _createMicroserviceImages(microservice, microserviceData.images, transaction) @@ -253,7 +253,7 @@ async function createMicroserviceEndPoint (microserviceData, user, isCLI, transa const proxyPorts = [] if (microserviceData.ports) { for (const mapping of microserviceData.ports) { - const res = await MicroservicePortService.createPortMapping(microservice, mapping, user, transaction) + const res = await MicroservicePortService.createPortMapping(microservice, mapping, transaction) if (res) { if (res.publicLinks) { publicPorts.push({ @@ -273,17 +273,17 @@ async function createMicroserviceEndPoint (microserviceData, user, isCLI, transa } for (const extraHost of extraHosts) { - await _createExtraHost(microservice, extraHost, user, transaction) + await _createExtraHost(microservice, extraHost, transaction) } if (microserviceData.env) { for (const env of microserviceData.env) { - await _createEnv(microservice, env, user, transaction) + await _createEnv(microservice, env, transaction) } } if (microserviceData.cmd) { for (const arg of microserviceData.cmd) { - await _createArg(microservice, arg, user, transaction) + await _createArg(microservice, arg, transaction) } } if (microserviceData.volumeMappings) { @@ -346,7 +346,7 @@ async function _updateRelatedExtraHosts (updatedMicroservice, transaction) { } } -async function updateMicroserviceEndPoint (microserviceUuid, microserviceData, user, isCLI, transaction, changeTrackingEnabled = true) { +async function updateMicroserviceEndPoint (microserviceUuid, microserviceData, isCLI, transaction, changeTrackingEnabled = true) { await Validator.validate(microserviceData, Validator.schemas.microserviceUpdate) let needStatusReset = false const query = isCLI @@ -358,11 +358,11 @@ async function updateMicroserviceEndPoint (microserviceUuid, microserviceData, u } // validate extraHosts - const extraHosts = microserviceData.extraHosts ? await _validateExtraHosts(microserviceData, user, transaction) : null + const extraHosts = microserviceData.extraHosts ? await _validateExtraHosts(microserviceData, transaction) : null const config = _validateMicroserviceConfig(microserviceData.config) - const newFog = await _findFog(microserviceData, user, isCLI, transaction) || {} + const newFog = await _findFog(microserviceData, isCLI, transaction) || {} const microserviceToUpdate = { name: microserviceData.name, config: config, @@ -400,7 +400,7 @@ async function updateMicroserviceEndPoint (microserviceUuid, microserviceData, u } if (microserviceDataUpdate.ports) { - await _updatePorts(microserviceDataUpdate.ports, microservice, user, transaction) + await _updatePorts(microserviceDataUpdate.ports, microservice, transaction) } if (microserviceDataUpdate.iofogUuid && microservice.iofogUuid !== microserviceDataUpdate.iofogUuid) { @@ -433,7 +433,7 @@ async function updateMicroserviceEndPoint (microserviceUuid, microserviceData, u const iofogUuid = microserviceDataUpdate.iofogUuid || microservice.iofogUuid if (microserviceDataUpdate.catalogItemId) { - const catalogItem = await CatalogService.getCatalogItem(microserviceDataUpdate.catalogItemId, user, isCLI, transaction) + const catalogItem = await CatalogService.getCatalogItem(microserviceDataUpdate.catalogItemId, isCLI, transaction) _validateImagesAgainstCatalog(catalogItem, microserviceDataUpdate.images || []) if (microserviceDataUpdate.catalogItemId !== undefined && microserviceDataUpdate.catalogItemId !== microservice.catalogItemId) { // Catalog item changed or removed, set rebuild flag @@ -468,12 +468,12 @@ async function updateMicroserviceEndPoint (microserviceUuid, microserviceData, u // Validate image type let images = [] if (microserviceDataUpdate.catalogItemId) { - const catalogItem = await CatalogService.getCatalogItem(microserviceDataUpdate.catalogItemId, user, isCLI, transaction) + const catalogItem = await CatalogService.getCatalogItem(microserviceDataUpdate.catalogItemId, isCLI, transaction) images = catalogItem.images } else if (microserviceDataUpdate.images) { images = microserviceDataUpdate.images } else if (microservice.catalogItemId) { - const catalogItem = await CatalogService.getCatalogItem(microservice.catalogItemId, user, isCLI, transaction) + const catalogItem = await CatalogService.getCatalogItem(microservice.catalogItemId, isCLI, transaction) images = catalogItem.images } else { images = await microservice.getImages() @@ -493,7 +493,7 @@ async function updateMicroserviceEndPoint (microserviceUuid, microserviceData, u const updatedMicroservice = await MicroserviceManager.updateAndFind(query, microserviceDataUpdate, transaction) if (extraHosts) { - await _updateExtraHosts(extraHosts, microserviceUuid, user, transaction) + await _updateExtraHosts(extraHosts, microserviceUuid, transaction) } // Update extra hosts that reference this microservice @@ -512,7 +512,7 @@ async function updateMicroserviceEndPoint (microserviceUuid, microserviceData, u } if (microserviceDataUpdate.iofogUuid && microserviceDataUpdate.iofogUuid !== microservice.iofogUuid) { - await MicroservicePortService.movePublicPortsToNewFog(updatedMicroservice, user, transaction) + await MicroservicePortService.movePublicPortsToNewFog(updatedMicroservice, transaction) } if (needStatusReset) { @@ -561,7 +561,7 @@ const _checkIfMicroserviceImagesAreEqual = (microserviceDataUpdateImages, catalo return isEqual(newMicroserviceImages, oldMicroservicesImages) } -async function deleteMicroserviceEndPoint (microserviceUuid, microserviceData, user, isCLI, transaction) { +async function deleteMicroserviceEndPoint (microserviceUuid, microserviceData, isCLI, transaction) { const where = isCLI ? { uuid: microserviceUuid @@ -594,7 +594,7 @@ async function deleteNotRunningMicroservices (fog, transaction) { .forEach(async (microservice) => { await deleteMicroserviceWithRoutesAndPortMappings(microservice, transaction) }) } -async function createRouteEndPoint (sourceMicroserviceUuid, destMicroserviceUuid, user, isCLI, transaction) { +async function createRouteEndPoint (sourceMicroserviceUuid, destMicroserviceUuid, isCLI, transaction) { // Print deprecated warning const sourceMsvc = await MicroserviceManager.findOne({ uuid: sourceMicroserviceUuid }, transaction) if (!sourceMsvc) { @@ -610,10 +610,10 @@ async function createRouteEndPoint (sourceMicroserviceUuid, destMicroserviceUuid throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.INVALID_FLOW_ID, sourceMsvc.applicationId)) } - return RoutingService.createRouting({ application: application.name, from: sourceMsvc.name, to: destMsvc.name, name: `r-${sourceMsvc.name}-${destMsvc.name}` }, user, isCLI, transaction) + return RoutingService.createRouting({ application: application.name, from: sourceMsvc.name, to: destMsvc.name, name: `r-${sourceMsvc.name}-${destMsvc.name}` }, isCLI, transaction) } -async function deleteRouteEndPoint (sourceMicroserviceUuid, destMicroserviceUuid, user, isCLI, transaction) { +async function deleteRouteEndPoint (sourceMicroserviceUuid, destMicroserviceUuid, isCLI, transaction) { // Print deprecated warning const route = await RoutingManager.findOnePopulated({ @@ -624,10 +624,10 @@ async function deleteRouteEndPoint (sourceMicroserviceUuid, destMicroserviceUuid throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.ROUTE_NOT_FOUND)) } - return RoutingService.deleteRouting(route.application.name, route.name, user, isCLI, transaction) + return RoutingService.deleteRouting(route.application.name, route.name, isCLI, transaction) } -async function createPortMappingEndPoint (microserviceUuid, portMappingData, user, isCLI, transaction) { +async function createPortMappingEndPoint (microserviceUuid, portMappingData, isCLI, transaction) { await Validator.validate(portMappingData, Validator.schemas.portsCreate) const where = isCLI @@ -645,10 +645,10 @@ async function createPortMappingEndPoint (microserviceUuid, portMappingData, use } await MicroservicePortService.validatePortMapping(agent, portMappingData, {}, transaction) - return MicroservicePortService.createPortMapping(microservice, portMappingData, user, transaction) + return MicroservicePortService.createPortMapping(microservice, portMappingData, transaction) } -async function _createExtraHost (microservice, extraHostData, user, transaction) { +async function _createExtraHost (microservice, extraHostData, transaction) { const msExtraHostData = { ...extraHostData, microserviceUuid: microservice.uuid @@ -657,7 +657,7 @@ async function _createExtraHost (microservice, extraHostData, user, transaction) await MicroserviceExtraHostManager.create(msExtraHostData, transaction) } -async function _createEnv (microservice, envData, user, transaction) { +async function _createEnv (microservice, envData, transaction) { if (!microservice.iofogUuid) { throw new Errors.ValidationError(AppHelper.formatMessage(ErrorMessages.REQUIRED_FOG_NODE)) } @@ -672,7 +672,7 @@ async function _createEnv (microservice, envData, user, transaction) { await MicroservicePortService.switchOnUpdateFlagsForMicroservicesForPortMapping(microservice, false, transaction) } -async function _createArg (microservice, arg, user, transaction) { +async function _createArg (microservice, arg, transaction) { if (!microservice.iofogUuid) { throw new Errors.ValidationError(AppHelper.formatMessage(ErrorMessages.REQUIRED_FOG_NODE)) } @@ -686,12 +686,12 @@ async function _createArg (microservice, arg, user, transaction) { await MicroservicePortService.switchOnUpdateFlagsForMicroservicesForPortMapping(microservice, false, transaction) } -async function deletePortMappingEndPoint (microserviceUuid, internalPort, user, isCLI, transaction) { - return MicroservicePortService.deletePortMapping(microserviceUuid, internalPort, user, isCLI, transaction) +async function deletePortMappingEndPoint (microserviceUuid, internalPort, isCLI, transaction) { + return MicroservicePortService.deletePortMapping(microserviceUuid, internalPort, isCLI, transaction) } -async function listPortMappingsEndPoint (microserviceUuid, user, isCLI, transaction) { - return MicroservicePortService.listPortMappings(microserviceUuid, user, isCLI, transaction) +async function listPortMappingsEndPoint (microserviceUuid, isCLI, transaction) { + return MicroservicePortService.listPortMappings(microserviceUuid, isCLI, transaction) } async function getReceiverMicroservices (microservice, transaction) { @@ -706,7 +706,7 @@ async function isMicroserviceConsumer (microservice, transaction) { return !!(routes && routes.length > 0) } -async function createVolumeMappingEndPoint (microserviceUuid, volumeMappingData, user, isCLI, transaction) { +async function createVolumeMappingEndPoint (microserviceUuid, volumeMappingData, isCLI, transaction) { await Validator.validate(volumeMappingData, Validator.schemas.volumeMappings) const where = isCLI @@ -743,7 +743,7 @@ async function createVolumeMappingEndPoint (microserviceUuid, volumeMappingData, return VolumeMappingManager.create(volumeMappingObj, transaction) } -async function deleteVolumeMappingEndPoint (microserviceUuid, volumeMappingUuid, user, isCLI, transaction) { +async function deleteVolumeMappingEndPoint (microserviceUuid, volumeMappingUuid, isCLI, transaction) { const where = isCLI ? { uuid: microserviceUuid } : { uuid: microserviceUuid } @@ -764,7 +764,7 @@ async function deleteVolumeMappingEndPoint (microserviceUuid, volumeMappingUuid, } } -async function listVolumeMappingsEndPoint (microserviceUuid, user, isCLI, transaction) { +async function listVolumeMappingsEndPoint (microserviceUuid, isCLI, transaction) { const where = isCLI ? { uuid: microserviceUuid } : { uuid: microserviceUuid } @@ -789,7 +789,7 @@ function _validateMicroserviceConfig (config) { return result } -async function _createMicroservice (microserviceData, user, isCLI, transaction) { +async function _createMicroservice (microserviceData, isCLI, transaction) { const config = _validateMicroserviceConfig(microserviceData.config) let newMicroservice = { @@ -813,7 +813,7 @@ async function _createMicroservice (microserviceData, user, isCLI, transaction) } // validate application - const application = await _validateApplication(microserviceData.application, user, isCLI, transaction) + const application = await _validateApplication(microserviceData.application, isCLI, transaction) newMicroservice.applicationId = application.id await _checkForDuplicateName(newMicroservice.name, {}, newMicroservice.applicationId, transaction) @@ -829,7 +829,7 @@ async function _createMicroservice (microserviceData, user, isCLI, transaction) return MicroserviceManager.create(newMicroservice, transaction) } -async function _validateApplication (name, user, isCLI, transaction) { +async function _validateApplication (name, isCLI, transaction) { if (!name) { return null } @@ -916,12 +916,12 @@ async function _deleteImages (microserviceUuid, transaction) { }, transaction) } -async function _updateExtraHosts (extraHosts, microserviceUuid, user, transaction) { +async function _updateExtraHosts (extraHosts, microserviceUuid, transaction) { await MicroserviceExtraHostManager.delete({ microserviceUuid: microserviceUuid }, transaction) for (const extraHost of extraHosts) { - await _createExtraHost({ uuid: microserviceUuid }, extraHost, user, transaction) + await _createExtraHost({ uuid: microserviceUuid }, extraHost, transaction) } } @@ -954,10 +954,10 @@ async function _updateArg (arg, microserviceUuid, transaction) { } } -async function _updatePorts (newPortMappings, microservice, user, transaction) { - await MicroservicePortService.deletePortMappings(microservice, user, transaction) +async function _updatePorts (newPortMappings, microservice, transaction) { + await MicroservicePortService.deletePortMappings(microservice, transaction) for (const portMapping of newPortMappings) { - await createPortMappingEndPoint(microservice.uuid, portMapping, user, false, transaction) + await createPortMappingEndPoint(microservice.uuid, portMapping, false, transaction) } } @@ -1080,8 +1080,8 @@ async function _buildGetMicroserviceResponse (microservice, transaction) { return res } -function listAllPublicPortsEndPoint (user, transaction) { - return MicroservicePortService.listAllPublicPorts(user, transaction) +function listAllPublicPortsEndPoint (transaction) { + return MicroservicePortService.listAllPublicPorts(transaction) } module.exports = { diff --git a/src/services/registry-service.js b/src/services/registry-service.js index b5220cb99..de0a8eade 100644 --- a/src/services/registry-service.js +++ b/src/services/registry-service.js @@ -22,7 +22,7 @@ const Sequelize = require('sequelize') const Op = Sequelize.Op const AppHelper = require('../helpers/app-helper') -const createRegistry = async function (registry, user, transaction) { +const createRegistry = async function (registry, transaction) { await Validator.validate(registry, Validator.schemas.registryCreate) if (registry.requiresCert && registry.certificate === undefined) { throw new Errors.ValidationError(ErrorMessages.CERT_PROPERTY_REQUIRED) @@ -42,14 +42,14 @@ const createRegistry = async function (registry, user, transaction) { const createdRegistry = await RegistryManager.create(registryCreate, transaction) - await _updateChangeTracking(user, transaction) + await _updateChangeTracking(transaction) return { id: createdRegistry.id } } -const findRegistries = async function (user, isCLI, transaction) { +const findRegistries = async function (isCLI, transaction) { const queryRegistry = isCLI ? {} : { @@ -67,7 +67,7 @@ const findRegistries = async function (user, isCLI, transaction) { } } -const deleteRegistry = async function (registryData, user, isCLI, transaction) { +const deleteRegistry = async function (registryData, isCLI, transaction) { await Validator.validate(registryData, Validator.schemas.registryDelete) const queryData = isCLI ? { id: registryData.id } @@ -77,10 +77,10 @@ const deleteRegistry = async function (registryData, user, isCLI, transaction) { throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.INVALID_REGISTRY_ID, registryData.id)) } await RegistryManager.delete(queryData, transaction) - await _updateChangeTracking(user, transaction) + await _updateChangeTracking(transaction) } -const updateRegistry = async function (registry, registryId, user, isCLI, transaction) { +const updateRegistry = async function (registry, registryId, isCLI, transaction) { await Validator.validate(registry, Validator.schemas.registryUpdate) if (registry.requiresCert && registry.certificate === undefined) { @@ -117,10 +117,10 @@ const updateRegistry = async function (registry, registryId, user, isCLI, transa await RegistryManager.update(where, registryUpdate, transaction) - await _updateChangeTracking(user, transaction) + await _updateChangeTracking(transaction) } -const _updateChangeTracking = async function (user, transaction) { +const _updateChangeTracking = async function (transaction) { const fogs = await FogManager.findAll(transaction) for (const fog of fogs) { await ChangeTrackingService.update(fog.uuid, ChangeTrackingService.events.registries, transaction) diff --git a/src/services/routing-service.js b/src/services/routing-service.js index b3737ba90..f6cb1fdc4 100644 --- a/src/services/routing-service.js +++ b/src/services/routing-service.js @@ -21,7 +21,7 @@ const RoutingManager = require('../data/managers/routing-manager') const TransactionDecorator = require('../decorators/transaction-decorator') const Validator = require('../schemas') -async function getRoutings (user, isCLI, transaction) { +async function getRoutings (isCLI, transaction) { const routes = await RoutingManager.findAllPopulated({}, transaction) return { routes: routes.map(r => ({ application: r.application.name, @@ -34,7 +34,7 @@ async function getRoutings (user, isCLI, transaction) { })) } } -async function getRouting (appName, name, user, isCLI, transaction) { +async function getRouting (appName, name, isCLI, transaction) { const application = await ApplicationManager.findOne({ name: appName }, transaction) if (!application) { throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.INVALID_FLOW_NAME, appName)) @@ -54,7 +54,7 @@ async function getRouting (appName, name, user, isCLI, transaction) { } } -async function _validateRouteMsvc (routingData, user, isCLI, transaction) { +async function _validateRouteMsvc (routingData, isCLI, transaction) { // Retro compatibility logic if (routingData.sourceMicroserviceUuid) { const sourceWhere = { uuid: routingData.sourceMicroserviceUuid } @@ -91,15 +91,15 @@ async function _validateRouteMsvc (routingData, user, isCLI, transaction) { } } -async function createRouting (routingData, user, isCLI, transaction) { +async function createRouting (routingData, isCLI, transaction) { await Validator.validate(routingData, Validator.schemas.routingCreate) - const { sourceMicroservice, destMicroservice } = await _validateRouteMsvc(routingData, user, isCLI, transaction) + const { sourceMicroservice, destMicroservice } = await _validateRouteMsvc(routingData, isCLI, transaction) - return _createRoute(sourceMicroservice, destMicroservice, routingData, user, transaction) + return _createRoute(sourceMicroservice, destMicroservice, routingData, transaction) } -async function updateRouting (appName, routeName, routeData, user, isCLI, transaction) { +async function updateRouting (appName, routeName, routeData, isCLI, transaction) { await Validator.validate(routeData, Validator.schemas.routingUpdate) const application = await ApplicationManager.findOne({ name: appName }, transaction) if (!application) { @@ -111,7 +111,7 @@ async function updateRouting (appName, routeName, routeData, user, isCLI, transa throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.INVALID_ROUTING_NAME, routeName)) } - const { sourceMicroservice, destMicroservice } = await _validateRouteMsvc({ ...routeData, application: oldRoute.application.name }, user, isCLI, transaction) + const { sourceMicroservice, destMicroservice } = await _validateRouteMsvc({ ...routeData, application: oldRoute.application.name }, isCLI, transaction) const updateRebuildMs = { rebuild: true @@ -143,7 +143,7 @@ async function updateRouting (appName, routeName, routeData, user, isCLI, transa await RoutingManager.update({ id: oldRoute.id }, updateRouteData, transaction) } -async function _createRoute (sourceMicroservice, destMicroservice, routeData, user, transaction) { +async function _createRoute (sourceMicroservice, destMicroservice, routeData, transaction) { if (!sourceMicroservice.iofogUuid || !destMicroservice.iofogUuid) { throw new Errors.ValidationError('fog not set') } @@ -162,7 +162,7 @@ async function _createRoute (sourceMicroservice, destMicroservice, routeData, us return _createSimpleRoute(sourceMicroservice, destMicroservice, routeData, transaction) } -async function deleteRouting (appName, name, user, isCLI, transaction) { +async function deleteRouting (appName, name, isCLI, transaction) { const application = await ApplicationManager.findOne({ name: appName }, transaction) if (!application) { throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.INVALID_FLOW_NAME, appName)) diff --git a/src/services/tunnel-service.js b/src/services/tunnel-service.js index 680f7e5c3..14142af29 100644 --- a/src/services/tunnel-service.js +++ b/src/services/tunnel-service.js @@ -21,7 +21,7 @@ const ErrorMessages = require('../helpers/error-messages') const TransactionDecorator = require('../decorators/transaction-decorator') const ChangeTrackingService = require('./change-tracking-service') -const openTunnel = async function (tunnelData, user, isCli, transaction) { +const openTunnel = async function (tunnelData, isCli, transaction) { const iofog = await FogManager.findOne({ uuid: tunnelData.iofogUuid }, transaction) if (!iofog) { throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.INVALID_IOFOG_UUID, tunnelData.iofogUuid)) @@ -47,7 +47,7 @@ const openTunnel = async function (tunnelData, user, isCli, transaction) { await ChangeTrackingService.update(tunnelData.iofogUuid, ChangeTrackingService.events.tunnel, transaction) } -const findTunnel = async function (tunnelData, user, transaction) { +const findTunnel = async function (tunnelData, transaction) { const tunnel = await TunnelManager.findOne(tunnelData, transaction) if (!tunnel) { throw new Errors.NotFoundError('Invalid Tunnel Id') @@ -68,8 +68,8 @@ const findAll = async function (transaction) { } } -const closeTunnel = async function (tunnelData, user, transaction) { - await module.exports.findTunnel(tunnelData, user, transaction) +const closeTunnel = async function (tunnelData, transaction) { + await module.exports.findTunnel(tunnelData, transaction) await TunnelManager.update(tunnelData, { closed: true }, transaction) await ChangeTrackingService.update(tunnelData.iofogUuid, ChangeTrackingService.events.tunnel, transaction) } From 744c9ba47e15258523efc68e6af6f637d39c6b73 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emirhan=20Durmu=C5=9F?= Date: Fri, 29 Mar 2024 00:05:52 +0300 Subject: [PATCH 081/178] listEdgeResources and listEdgeResourcesEndpoint modified --- src/controllers/edge-resource-controller.js | 2 +- src/services/edge-resource-service.js | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/controllers/edge-resource-controller.js b/src/controllers/edge-resource-controller.js index e4ec39658..68ffb5601 100644 --- a/src/controllers/edge-resource-controller.js +++ b/src/controllers/edge-resource-controller.js @@ -24,7 +24,7 @@ const updateEdgeResourceEndpoint = async function (req) { return EdgeResourceService.updateEdgeResourceEndpoint(edgeResourceData, { name, version }) } -const listEdgeResourcesEndpoint = async function (req) { +const listEdgeResourcesEndpoint = async function () { return { edgeResources: await EdgeResourceService.listEdgeResources() } } diff --git a/src/services/edge-resource-service.js b/src/services/edge-resource-service.js index dfa5052d5..10e943cae 100644 --- a/src/services/edge-resource-service.js +++ b/src/services/edge-resource-service.js @@ -23,8 +23,8 @@ const TransactionDecorator = require('../decorators/transaction-decorator') const Validator = require('../schemas') const ChangeTrackingService = require('./change-tracking-service') -async function listEdgeResources (transaction) { - const edgeResources = await EdgeResourceManager.findAllWithOrchestrationTags(transaction) +async function listEdgeResources () { + const edgeResources = await EdgeResourceManager.findAllWithOrchestrationTags() return edgeResources.map(buildGetObject) } From a7ec8e001f37c810019ced4147f0bf247e20a2d4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emirhan=20Durmu=C5=9F?= Date: Sat, 30 Mar 2024 15:47:02 +0300 Subject: [PATCH 082/178] ecn-viewer version updated --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 23e892fe5..e9338a3b7 100644 --- a/package.json +++ b/package.json @@ -57,7 +57,7 @@ "iofog-controller": "src/main.js" }, "dependencies": { - "@datasance/ecn-viewer": "0.1.3", + "@datasance/ecn-viewer": "0.1.4", "axios": "1.0.0-alpha.1", "body-parser": "^1.20.1", "child_process": "1.0.2", From b5b66c4c7eeb934950923af317a851356673a751 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emirhan=20Durmu=C5=9F?= Date: Tue, 2 Apr 2024 17:16:29 +0300 Subject: [PATCH 083/178] release version and microservice port service update --- package.json | 4 ++-- src/services/microservice-ports/default.js | 10 +--------- 2 files changed, 3 insertions(+), 11 deletions(-) diff --git a/package.json b/package.json index e9338a3b7..5a1d07603 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@datasance/iofogcontroller", - "version": "3.0.6", + "version": "3.1.0", "description": "ioFog Controller project for Eclipse IoFog @ iofog.org \\nCopyright (c) 2023 Datasance Teknoloji A.S.", "main": "./src/main.js", "author": "Emirhan Durmus", @@ -57,7 +57,7 @@ "iofog-controller": "src/main.js" }, "dependencies": { - "@datasance/ecn-viewer": "0.1.4", + "@datasance/ecn-viewer": "0.1.5", "axios": "1.0.0-alpha.1", "body-parser": "^1.20.1", "child_process": "1.0.2", diff --git a/src/services/microservice-ports/default.js b/src/services/microservice-ports/default.js index 07b504909..57a4ed428 100644 --- a/src/services/microservice-ports/default.js +++ b/src/services/microservice-ports/default.js @@ -214,15 +214,7 @@ async function createPortMapping (microservice, portMappingData, transaction) { const msPorts = await MicroservicePortManager.findOne({ microserviceUuid: microservice.uuid, - [Op.or]: - [ - { - portInternal: portMappingData.internal - }, - { - portExternal: portMappingData.external - } - ] + [Op.or]: [] }, transaction) if (msPorts) { throw new Errors.ValidationError(ErrorMessages.PORT_MAPPING_ALREADY_EXISTS) From 9a38a42df4a5a5bf49c72c320a6ffbbbcad4967d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emirhan=20Durmu=C5=9F?= Date: Tue, 2 Apr 2024 17:22:14 +0300 Subject: [PATCH 084/178] audit fix --- .nsprc | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/.nsprc b/.nsprc index 2a54564df..8bc4c1c5a 100644 --- a/.nsprc +++ b/.nsprc @@ -41,6 +41,18 @@ }, "1096483": { "notes": "" + }, + "1096820": { + "notes": "" + }, + "1096571": { + "notes": "" + }, + "1096727": { + "notes": "" + }, + "1096643": { + "notes": "" } } \ No newline at end of file From f45704465077c26582b7b0f47f6821056b13550a Mon Sep 17 00:00:00 2001 From: Alpaslan DOGAN Date: Mon, 20 May 2024 21:28:05 +0300 Subject: [PATCH 085/178] node and node moduls updated. --- .nsprc | 59 +- Dockerfile.dev | 6 +- package-lock.json | 16924 +++++++++++++++++---------------------- package.json | 94 +- scripts/postinstall.js | 14 +- src/main.js | 13 +- 6 files changed, 7268 insertions(+), 9842 deletions(-) diff --git a/.nsprc b/.nsprc index 8bc4c1c5a..9e26dfeeb 100644 --- a/.nsprc +++ b/.nsprc @@ -1,58 +1 @@ -{ - "1091459": { - "notes": "" - }, - "1091725": { - "notes": "" - } - , - "1092972": { - "notes": "" - }, - "1094554": { - "notes": "" - }, - "1094555": { - "notes": "" - }, - "1094556": { - "notes": "" - }, - "1095102": { - "notes": "" - }, - "1095024": { - "notes": "" - }, - "1096366": { - "notes": "" - }, - "1095365": { - "notes": "" - }, - "1095367": { - "notes": "" - }, - "1096460": { - "notes": "" - }, - "1096482": { - "notes": "" - }, - "1096483": { - "notes": "" - }, - "1096820": { - "notes": "" - }, - "1096571": { - "notes": "" - }, - "1096727": { - "notes": "" - }, - "1096643": { - "notes": "" - } - -} \ No newline at end of file +{} \ No newline at end of file diff --git a/Dockerfile.dev b/Dockerfile.dev index 1d2b52a27..3695faa46 100644 --- a/Dockerfile.dev +++ b/Dockerfile.dev @@ -1,4 +1,4 @@ -FROM node:hydrogen-bookworm AS builder +FROM node:iron-bookworm AS builder ARG PKG_VERSION ARG GITHUB_TOKEN @@ -16,13 +16,13 @@ RUN sed -i.back "s|PAT|${GITHUB_TOKEN}|g" .npmrc RUN npm config set @datasance:registry https://npm.pkg.github.com/ -RUN npm i --build-from-source +RUN npm i --build-from-source --force RUN npm version $PKG_VERSION --allow-same-version --no-git-tag-version RUN npm pack -FROM node:hydrogen-alpine3.17 +FROM node:iron-alpine3.18 RUN apk add sudo logrotate g++ make diff --git a/package-lock.json b/package-lock.json index b012a4d5f..444a4b4d4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,87 +1,104 @@ { "name": "@datasance/iofogcontroller", - "version": "3.0.6", + "version": "3.1.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@datasance/iofogcontroller", - "version": "3.0.6", + "version": "3.1.0", "hasInstallScript": true, "license": "EPL-2.0", "dependencies": { - "@datasance/ecn-viewer": "0.0.1", - "axios": "1.0.0-alpha.1", - "body-parser": "^1.20.1", + "@datasance/ecn-viewer": "0.1.5", + "axios": "1.6.8", + "body-parser": "^1.20.2", "child_process": "1.0.2", - "command-line-args": "5.0.2", - "command-line-usage": "5.0.5", + "command-line-args": "5.2.1", + "command-line-usage": "7.0.1", "concurrent-queue": "7.0.2", - "cookie-parser": "1.4.3", + "cookie-parser": "1.4.6", "cors": "2.8.5", "daemonize2": "0.4.2", - "ejs": "3.1.7", - "express": "4.17.3", + "ejs": "3.1.10", + "express": "4.19.2", "express-session": "1.18.0", - "formidable": "1.2.1", + "formidable": "3.5.1", "ftp": "0.3.10", - "helmet": "3.21.2", + "globally": "^0.0.0", + "helmet": "7.1.0", "https": "1.0.0", "is-elevated": "3.0.0", - "js-yaml": "3.14.1", - "jsonschema": "1.2.5", - "keycloak-connect": "24.0.1", - "minimatch": "3.1.2", - "moment": "2.29.4", - "moment-timezone": "0.5.38", - "morgan": "1.9.1", + "js-yaml": "4.1.0", + "jsonschema": "1.4.1", + "keycloak-connect": "24.0.4", + "minimatch": "9.0.4", + "moment": "2.30.1", + "moment-timezone": "0.5.45", + "morgan": "1.10.0", "multer": "1.4.5-lts.1", - "mysql2": "3.2.2", - "nconf": "0.12.0", - "nodemailer": "6.7.3", - "nodemailer-smtp-transport": "2.4.2", - "os": "0.1.1", + "mysql2": "3.9.7", + "nconf": "0.12.1", + "node-fetch-npm": "^2.0.4", + "npm-check-updates": "^16.14.20", + "os": "0.1.2", "path": "0.12.7", - "pino": "6.6.1", - "pino-std-serializers": "2.5.0", + "pino": "9.1.0", + "pino-std-serializers": "7.0.0", "portscanner": "2.2.0", - "qs": "6.10.3", - "request": "2.88.0", - "request-promise": "4.2.4", - "retry-as-promised": "3.1.0", - "semantic-release": "19.0.3", - "semver": "5.6.0", - "sequelize": "6.29.0", - "sqlite3": "^5.1.5", + "qs": "6.12.1", + "retry-as-promised": "7.0.4", + "sequelize": "6.37.3", + "sqlite3": "^5.1.7", "string-format": "2.0.0", - "swagger-ui-express": "^4.6.2", - "umzug": "2.2.0", - "underscore": "1.13.1", + "swagger-ui-express": "^5.0.0", + "umzug": "3.8.0", + "underscore": "1.13.6", "xss-clean": "0.1.1" }, "bin": { "iofog-controller": "src/main.js" }, "devDependencies": { - "acorn": "7.1.1", - "bdd-lazy-var": "2.5.2", - "chai": "4.2.0", - "chai-as-promised": "7.1.1", - "chai-http": "4.2.1", - "eslint": "5.14.1", - "eslint-config-google": "0.12.0", - "mocha": "9.2.2", - "mocha-junit-reporter": "2.0.0", - "newman": "5.3.2", + "acorn": "8.11.3", + "bdd-lazy-var": "2.6.1", + "chai": "5.1.1", + "chai-as-promised": "7.1.2", + "chai-http": "4.4.0", + "eslint": "9.2.0", + "eslint-config-google": "0.14.0", + "mocha": "10.4.0", + "mocha-junit-reporter": "2.2.1", + "newman": "6.1.2", "newman-reporter-junitfull": "1.1.1", - "nyc": "15.0.0", - "sequelize-cli": "5.5.0", - "sinon": "7.5.0", - "sinon-chai": "3.3.0", - "snyk": "^1.1064.0", + "nyc": "15.1.0", + "sequelize-cli": "6.6.2", + "sinon": "17.0.1", + "sinon-chai": "3.7.0", + "snyk": "^1.1291.0", "standard": "12.0.1" } }, + "node_modules/@75lb/deep-merge": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@75lb/deep-merge/-/deep-merge-1.1.1.tgz", + "integrity": "sha512-xvgv6pkMGBA6GwdyJbNAnDmfAIR/DfWhrj9jgWh3TY7gRm3KO46x/GPjRg6wJ0nOepwqrNxFfojebh0Df4h4Tw==", + "dependencies": { + "lodash.assignwith": "^4.2.0", + "typical": "^7.1.1" + }, + "engines": { + "node": ">=12.17" + } + }, + "node_modules/@75lb/deep-merge/node_modules/typical": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/typical/-/typical-7.1.1.tgz", + "integrity": "sha512-T+tKVNs6Wu7IWiAce5BgMd7OZfNYUndHwc5MknN+UHOudi7sGZzuHdCadllRuqJ3fPtgFtIH9+lt9qRv6lmpfA==", + "engines": { + "node": ">=12.17" + } + }, "node_modules/@ampproject/remapping": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", @@ -96,42 +113,43 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", - "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", + "version": "7.24.2", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.2.tgz", + "integrity": "sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==", + "dev": true, "dependencies": { - "@babel/highlight": "^7.23.4", - "chalk": "^2.4.2" + "@babel/highlight": "^7.24.2", + "picocolors": "^1.0.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/compat-data": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.5.tgz", - "integrity": "sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==", + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.4.tgz", + "integrity": "sha512-vg8Gih2MLK+kOkHJp4gBEIkyaIi00jgWot2D9QOmmfLC8jINSOzmCLta6Bvz/JSBCqnegV0L80jhxkol5GWNfQ==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.0.tgz", - "integrity": "sha512-fQfkg0Gjkza3nf0c7/w6Xf34BW4YvzNfACRLmmb7XRLa6XHdR+K9AlJlxneFfWYf6uhOzuzZVTjF/8KfndZANw==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.5.tgz", + "integrity": "sha512-tVQRucExLQ02Boi4vdPp49svNGcfL2GhdTCT9aldhXgCJVAI21EtRfBettiuLUwce/7r6bFdgs6JFkcdTiFttA==", "dev": true, "dependencies": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.23.5", - "@babel/generator": "^7.23.6", + "@babel/code-frame": "^7.24.2", + "@babel/generator": "^7.24.5", "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helpers": "^7.24.0", - "@babel/parser": "^7.24.0", + "@babel/helper-module-transforms": "^7.24.5", + "@babel/helpers": "^7.24.5", + "@babel/parser": "^7.24.5", "@babel/template": "^7.24.0", - "@babel/traverse": "^7.24.0", - "@babel/types": "^7.24.0", + "@babel/traverse": "^7.24.5", + "@babel/types": "^7.24.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -185,14 +203,14 @@ } }, "node_modules/@babel/generator": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.6.tgz", - "integrity": "sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.5.tgz", + "integrity": "sha512-x32i4hEXvr+iI0NEoEfDKzlemF8AmtOP8CcrRaEcpzysWuoEb1KknpcvMsHKPONoKZiDuItklgWhB18xEhr9PA==", "dev": true, "dependencies": { - "@babel/types": "^7.23.6", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", + "@babel/types": "^7.24.5", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^2.5.1" }, "engines": { @@ -274,28 +292,28 @@ } }, "node_modules/@babel/helper-module-imports": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", - "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", + "version": "7.24.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.3.tgz", + "integrity": "sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg==", "dev": true, "dependencies": { - "@babel/types": "^7.22.15" + "@babel/types": "^7.24.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", - "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.24.5.tgz", + "integrity": "sha512-9GxeY8c2d2mdQUP1Dye0ks3VDyIMS98kt/llQ2nUId8IsWqTF0l1LkSX0/uP7l7MCDrzXS009Hyhe2gzTiGW8A==", "dev": true, "dependencies": { "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-simple-access": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/helper-validator-identifier": "^7.22.20" + "@babel/helper-module-imports": "^7.24.3", + "@babel/helper-simple-access": "^7.24.5", + "@babel/helper-split-export-declaration": "^7.24.5", + "@babel/helper-validator-identifier": "^7.24.5" }, "engines": { "node": ">=6.9.0" @@ -305,42 +323,43 @@ } }, "node_modules/@babel/helper-simple-access": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", - "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.5.tgz", + "integrity": "sha512-uH3Hmf5q5n7n8mz7arjUlDOCbttY/DW4DYhE6FUsjKJ/oYC1kQQUvwEQWxRwUpX9qQKRXeqLwWxrqilMrf32sQ==", "dev": true, "dependencies": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.24.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-split-export-declaration": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", - "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.5.tgz", + "integrity": "sha512-5CHncttXohrHk8GWOFCcCl4oRD9fKosWlIRgWm4ql9VYioKm52Mk2xsmoohvm7f3JoiLSM5ZgJuRaf5QZZYd3Q==", "dev": true, "dependencies": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.24.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-string-parser": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", - "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.1.tgz", + "integrity": "sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.5.tgz", + "integrity": "sha512-3q93SSKX2TWCG30M2G2kwaKeTYgEUp5Snjuj8qm729SObL6nbtUldAi37qbxkD5gg3xnBio+f9nqpSepGZMvxA==", + "dev": true, "engines": { "node": ">=6.9.0" } @@ -355,36 +374,109 @@ } }, "node_modules/@babel/helpers": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.0.tgz", - "integrity": "sha512-ulDZdc0Aj5uLc5nETsa7EPx2L7rM0YJM8r7ck7U73AXi7qOV44IHHRAYZHY6iU1rr3C5N4NtTmMRUJP6kwCWeA==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.5.tgz", + "integrity": "sha512-CiQmBMMpMQHwM5m01YnrM6imUG1ebgYJ+fAIW4FZe6m4qHTPaRHti+R8cggAwkdz4oXhtO4/K9JWlh+8hIfR2Q==", "dev": true, "dependencies": { "@babel/template": "^7.24.0", - "@babel/traverse": "^7.24.0", - "@babel/types": "^7.24.0" + "@babel/traverse": "^7.24.5", + "@babel/types": "^7.24.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/highlight": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", - "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.5.tgz", + "integrity": "sha512-8lLmua6AVh/8SLJRRVD6V8p73Hir9w5mJrhE+IPpILG31KKlI9iz5zmBYKcWPS59qSfgP9RaSBQSHHE81WKuEw==", + "dev": true, "dependencies": { - "@babel/helper-validator-identifier": "^7.22.20", + "@babel/helper-validator-identifier": "^7.24.5", "chalk": "^2.4.2", - "js-tokens": "^4.0.0" + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" }, "engines": { "node": ">=6.9.0" } }, + "node_modules/@babel/highlight/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/@babel/highlight/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/highlight/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/@babel/parser": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.0.tgz", - "integrity": "sha512-QuP/FxEAzMSjXygs8v4N9dvdXzEHN4W1oF3PxuWAtPo08UdM17u89RDMgjLn/mlc56iM0HlLmVkO/wgR+rDgHg==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.5.tgz", + "integrity": "sha512-EOv5IK8arwh3LI47dz1b0tKUb/1uhHAnHJOrjgtQMIpu1uXd9mlFrJg9IUgGUgZ41Ch0K8REPTYpO7B76b4vJg==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -408,19 +500,19 @@ } }, "node_modules/@babel/traverse": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.0.tgz", - "integrity": "sha512-HfuJlI8qq3dEDmNU5ChzzpZRWq+oxCZQyMzIMEqLho+AQnhMnKQUzH6ydo3RBl/YjPCuk68Y6s0Gx0AeyULiWw==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.5.tgz", + "integrity": "sha512-7aaBLeDQ4zYcUFDUD41lJc1fG8+5IU9DaNSJAgal866FGvmD5EbWQgnEC6kO1gGLsX0esNkfnJSndbTXA3r7UA==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.23.5", - "@babel/generator": "^7.23.6", + "@babel/code-frame": "^7.24.2", + "@babel/generator": "^7.24.5", "@babel/helper-environment-visitor": "^7.22.20", "@babel/helper-function-name": "^7.23.0", "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.24.0", - "@babel/types": "^7.24.0", + "@babel/helper-split-export-declaration": "^7.24.5", + "@babel/parser": "^7.24.5", + "@babel/types": "^7.24.5", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -445,6 +537,15 @@ } } }, + "node_modules/@babel/traverse/node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, "node_modules/@babel/traverse/node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -452,13 +553,13 @@ "dev": true }, "node_modules/@babel/types": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.0.tgz", - "integrity": "sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.5.tgz", + "integrity": "sha512-6mQNsaLeXTw0nxYUYu+NSa4Hx4BlF1x1x8/PMFbiR+GBSr+2DkECc69b8hgy2frEodNcvPffeH8YfWd3LI6jhQ==", "dev": true, "dependencies": { - "@babel/helper-string-parser": "^7.23.4", - "@babel/helper-validator-identifier": "^7.22.20", + "@babel/helper-string-parser": "^7.24.1", + "@babel/helper-validator-identifier": "^7.24.5", "to-fast-properties": "^2.0.0" }, "engines": { @@ -475,166 +576,362 @@ } }, "node_modules/@datasance/ecn-viewer": { - "version": "0.0.1", - "resolved": "https://npm.pkg.github.com/download/@datasance/ecn-viewer/0.0.1/e4d3b4942f496b6bcafa982865b9bb14e324eb06", - "integrity": "sha512-rrSn+AWwRDCyME5zLH444VtRNcm7umTKoDOKa/3xFKyFPi6QntZVLr7iI207NcmoU4ilNXPpdvOmLGk7ZSUCWA==", - "license": "EPL-2.0" - }, - "node_modules/@gar/promisify": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", - "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==", - "optional": true + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/@datasance/ecn-viewer/-/ecn-viewer-0.1.5.tgz", + "integrity": "sha512-6RtIBh9FX63+mA6pqlcnA5g91vNEkMIg2JMEQkPJYjmNUH/8Zk3qlf6kmsqnaPaAawkbECtwn+RFMLCVhd2Btw==" }, - "node_modules/@isaacs/cliui": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "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": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + "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/@isaacs/cliui/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==", + "node_modules/@eslint-community/eslint-utils/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" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" + "url": "https://opencollective.com/eslint" } }, - "node_modules/@isaacs/cliui/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "node_modules/@eslint-community/regexpp": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", + "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", "dev": true, "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, - "node_modules/@isaacs/cliui/node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true - }, - "node_modules/@isaacs/cliui/node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "node_modules/@eslint/eslintrc": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.0.2.tgz", + "integrity": "sha512-wV19ZEGEMAC1eHgrS7UQPqsdEiCIbTKTasEfcXAigzoXICcqZSjBZEHlZwNVvKg6UBCjSlos84XiLqsRJnIcIg==", "dev": true, "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^10.0.1", + "globals": "^14.0.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": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://opencollective.com/eslint" } }, - "node_modules/@isaacs/cliui/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==", + "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "node_modules/@eslint/eslintrc/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": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" + "ms": "2.1.2" }, "engines": { - "node": ">=12" + "node": ">=6.0" }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "node_modules/@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "node_modules/@eslint/eslintrc/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": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" + "brace-expansion": "^1.1.7" }, "engines": { - "node": ">=8" + "node": "*" } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "node_modules/@eslint/eslintrc/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/@eslint/js": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.2.0.tgz", + "integrity": "sha512-ESiIudvhoYni+MdsI8oD7skpprZ89qKocwRM2KEvhhBJ9nl5MRh7BXU5GTod7Mdygq+AUl+QzId6iWJKR/wABA==", "dev": true, - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, "engines": { - "node": ">=8" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "node_modules/@faker-js/faker": { + "version": "5.5.3", + "resolved": "https://registry.npmjs.org/@faker-js/faker/-/faker-5.5.3.tgz", + "integrity": "sha512-R11tGE6yIFwqpaIqcfkcg7AICXzFg14+5h5v0TfF/9+RMDL6jhzCy/pxHVOfbALGdtVYdt6JdR21tuxEgl34dw==", + "dev": true + }, + "node_modules/@gar/promisify": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", + "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==" + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", + "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", "dev": true, "dependencies": { - "p-locate": "^4.1.0" + "@humanwhocodes/object-schema": "^2.0.3", + "debug": "^4.3.1", + "minimatch": "^3.0.5" }, "engines": { - "node": ">=8" + "node": ">=10.10.0" } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "node_modules/@humanwhocodes/config-array/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": { - "p-try": "^2.0.0" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@humanwhocodes/config-array/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" + "node": ">=6.0" }, - "funding": { + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@humanwhocodes/config-array/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/@humanwhocodes/config-array/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/@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": "2.0.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", + "dev": true + }, + "node_modules/@humanwhocodes/retry": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.2.4.tgz", + "integrity": "sha512-Ttl/jHpxfS3st5sxwICYfk4pOH0WrLI1SpW283GgQL7sCWU7EHIOhX4b4fkIxr3tkfzwg8+FNojtzsIEE7Ecgg==", + "dev": true, + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/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==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" + }, + "node_modules/@isaacs/cliui/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "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/@isaacs/cliui/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==", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, @@ -659,6 +956,12 @@ "node": ">=8" } }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true + }, "node_modules/@istanbuljs/schema": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", @@ -749,232 +1052,208 @@ } }, "node_modules/@npmcli/fs": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-1.1.1.tgz", - "integrity": "sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ==", - "optional": true, + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-3.1.1.tgz", + "integrity": "sha512-q9CRWjpHCMIh5sVyefoD1cA7PkvILqCZsnSOEUUivORLjxCO/Irmue2DprETiNgEqktDBZaM1Bi+jrarx1XdCg==", "dependencies": { - "@gar/promisify": "^1.0.1", "semver": "^7.3.5" - } - }, - "node_modules/@npmcli/fs/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==", - "optional": true, - "dependencies": { - "yallist": "^4.0.0" }, "engines": { - "node": ">=10" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/@npmcli/fs/node_modules/semver": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", - "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", - "optional": true, + "node_modules/@npmcli/git": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-4.1.0.tgz", + "integrity": "sha512-9hwoB3gStVfa0N31ymBmrX+GuDGdVA/QWShZVqE0HK2Af+7QGGrCTbZia/SW0ImUTjTne7SP91qxDmtXvDHRPQ==", "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" + "@npmcli/promise-spawn": "^6.0.0", + "lru-cache": "^7.4.4", + "npm-pick-manifest": "^8.0.0", + "proc-log": "^3.0.0", + "promise-inflight": "^1.0.1", + "promise-retry": "^2.0.1", + "semver": "^7.3.5", + "which": "^3.0.0" }, "engines": { - "node": ">=10" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/@npmcli/move-file": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.1.2.tgz", - "integrity": "sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==", - "deprecated": "This functionality has been moved to @npmcli/fs", - "optional": true, - "dependencies": { - "mkdirp": "^1.0.4", - "rimraf": "^3.0.2" - }, + "node_modules/@npmcli/git/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", "engines": { - "node": ">=10" + "node": ">=12" } }, - "node_modules/@npmcli/move-file/node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "optional": true, + "node_modules/@npmcli/git/node_modules/which": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/which/-/which-3.0.1.tgz", + "integrity": "sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==", + "dependencies": { + "isexe": "^2.0.0" + }, "bin": { - "mkdirp": "bin/cmd.js" + "node-which": "bin/which.js" }, "engines": { - "node": ">=10" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/@npmcli/move-file/node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "optional": true, + "node_modules/@npmcli/installed-package-contents": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-2.1.0.tgz", + "integrity": "sha512-c8UuGLeZpm69BryRykLuKRyKFZYJsZSCT4aVY5ds4omyZqJ172ApzgfKJ5eV/r3HgLdUYgFVe54KSFVjKoe27w==", "dependencies": { - "glob": "^7.1.3" + "npm-bundled": "^3.0.0", + "npm-normalize-package-bin": "^3.0.0" }, "bin": { - "rimraf": "bin.js" + "installed-package-contents": "bin/index.js" }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@octokit/auth-token": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-3.0.4.tgz", - "integrity": "sha512-TWFX7cZF2LXoCvdmJWY7XVPi74aSY0+FfBZNSXEXFkMpjcqsQwDSYVv5FhRFaI0V1ECnwbz4j59T/G+rXNWaIQ==", "engines": { - "node": ">= 14" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/@octokit/core": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/@octokit/core/-/core-4.2.4.tgz", - "integrity": "sha512-rYKilwgzQ7/imScn3M9/pFfUf4I1AZEH3KhyJmtPdE2zfaXAn2mFfUy4FbKewzc2We5y/LlKLj36fWJLKC2SIQ==", + "node_modules/@npmcli/move-file": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-2.0.1.tgz", + "integrity": "sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ==", + "deprecated": "This functionality has been moved to @npmcli/fs", "dependencies": { - "@octokit/auth-token": "^3.0.0", - "@octokit/graphql": "^5.0.0", - "@octokit/request": "^6.0.0", - "@octokit/request-error": "^3.0.0", - "@octokit/types": "^9.0.0", - "before-after-hook": "^2.2.0", - "universal-user-agent": "^6.0.0" + "mkdirp": "^1.0.4", + "rimraf": "^3.0.2" }, "engines": { - "node": ">= 14" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/@octokit/endpoint": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-7.0.6.tgz", - "integrity": "sha512-5L4fseVRUsDFGR00tMWD/Trdeeihn999rTMGRMC1G/Ldi1uWlWJzI98H4Iak5DB/RVvQuyMYKqSK/R6mbSOQyg==", + "node_modules/@npmcli/move-file/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": { - "@octokit/types": "^9.0.0", - "is-plain-object": "^5.0.0", - "universal-user-agent": "^6.0.0" - }, - "engines": { - "node": ">= 14" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "node_modules/@octokit/graphql": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-5.0.6.tgz", - "integrity": "sha512-Fxyxdy/JH0MnIB5h+UQ3yCoh1FG4kWXfFKkpWqjZHw/p+Kc8Y44Hu/kCgNBT6nU1shNumEchmW/sUO1JuQnPcw==", + "node_modules/@npmcli/move-file/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dependencies": { - "@octokit/request": "^6.0.0", - "@octokit/types": "^9.0.0", - "universal-user-agent": "^6.0.0" + "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": ">= 14" + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@octokit/openapi-types": { - "version": "18.1.1", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-18.1.1.tgz", - "integrity": "sha512-VRaeH8nCDtF5aXWnjPuEMIYf1itK/s3JYyJcWFJT8X9pSNnBtriDf7wlEWsGuhPLl4QIH4xM8fqTXDwJ3Mu6sw==" - }, - "node_modules/@octokit/plugin-paginate-rest": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-6.1.2.tgz", - "integrity": "sha512-qhrmtQeHU/IivxucOV1bbI/xZyC/iOBhclokv7Sut5vnejAIAEXVcGQeRpQlU39E0WwK9lNvJHphHri/DB6lbQ==", + "node_modules/@npmcli/move-file/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": { - "@octokit/tsconfig": "^1.0.2", - "@octokit/types": "^9.2.3" + "brace-expansion": "^1.1.7" }, "engines": { - "node": ">= 14" - }, - "peerDependencies": { - "@octokit/core": ">=4" + "node": "*" } }, - "node_modules/@octokit/plugin-retry": { - "version": "4.1.6", - "resolved": "https://registry.npmjs.org/@octokit/plugin-retry/-/plugin-retry-4.1.6.tgz", - "integrity": "sha512-obkYzIgEC75r8+9Pnfiiqy3y/x1bc3QLE5B7qvv9wi9Kj0R5tGQFC6QMBg1154WQ9lAVypuQDGyp3hNpp15gQQ==", - "dependencies": { - "@octokit/types": "^9.0.0", - "bottleneck": "^2.15.3" + "node_modules/@npmcli/move-file/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": ">= 14" - }, - "peerDependencies": { - "@octokit/core": ">=3" + "node": ">=10" } }, - "node_modules/@octokit/plugin-throttling": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/@octokit/plugin-throttling/-/plugin-throttling-5.2.3.tgz", - "integrity": "sha512-C9CFg9mrf6cugneKiaI841iG8DOv6P5XXkjmiNNut+swePxQ7RWEdAZRp5rJoE1hjsIqiYcKa/ZkOQ+ujPI39Q==", + "node_modules/@npmcli/move-file/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": { - "@octokit/types": "^9.0.0", - "bottleneck": "^2.15.3" + "glob": "^7.1.3" }, - "engines": { - "node": ">= 14" + "bin": { + "rimraf": "bin.js" }, - "peerDependencies": { - "@octokit/core": "^4.0.0" + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@npmcli/node-gyp": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-3.0.0.tgz", + "integrity": "sha512-gp8pRXC2oOxu0DUE1/M3bYtb1b3/DbJ5aM113+XJBgfXdussRAsX0YOrOhdd8WvnAR6auDBvJomGAkLKA5ydxA==", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/@octokit/request": { - "version": "6.2.8", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-6.2.8.tgz", - "integrity": "sha512-ow4+pkVQ+6XVVsekSYBzJC0VTVvh/FCTUUgTsboGq+DTeWdyIFV8WSCdo0RIxk6wSkBTHqIK1mYuY7nOBXOchw==", + "node_modules/@npmcli/promise-spawn": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-6.0.2.tgz", + "integrity": "sha512-gGq0NJkIGSwdbUt4yhdF8ZrmkGKVz9vAdVzpOfnom+V8PLSmSOVhZwbNvZZS1EYcJN5hzzKBxmmVVAInM6HQLg==", "dependencies": { - "@octokit/endpoint": "^7.0.0", - "@octokit/request-error": "^3.0.0", - "@octokit/types": "^9.0.0", - "is-plain-object": "^5.0.0", - "node-fetch": "^2.6.7", - "universal-user-agent": "^6.0.0" + "which": "^3.0.0" }, "engines": { - "node": ">= 14" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/@octokit/request-error": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-3.0.3.tgz", - "integrity": "sha512-crqw3V5Iy2uOU5Np+8M/YexTlT8zxCfI+qu+LxUB7SZpje4Qmx3mub5DfEKSO8Ylyk0aogi6TYdf6kxzh2BguQ==", + "node_modules/@npmcli/promise-spawn/node_modules/which": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/which/-/which-3.0.1.tgz", + "integrity": "sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==", "dependencies": { - "@octokit/types": "^9.0.0", - "deprecation": "^2.0.0", - "once": "^1.4.0" + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/which.js" }, "engines": { - "node": ">= 14" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/@octokit/request-error/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==", + "node_modules/@npmcli/run-script": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-6.0.2.tgz", + "integrity": "sha512-NCcr1uQo1k5U+SYlnIrbAh3cxy+OQT1VtqiAbxdymSlptbzBb62AjH2xXgjNCoP073hoa1CfCAcwoZ8k96C4nA==", "dependencies": { - "wrappy": "1" + "@npmcli/node-gyp": "^3.0.0", + "@npmcli/promise-spawn": "^6.0.0", + "node-gyp": "^9.0.0", + "read-package-json-fast": "^3.0.0", + "which": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/@octokit/tsconfig": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@octokit/tsconfig/-/tsconfig-1.0.2.tgz", - "integrity": "sha512-I0vDR0rdtP8p2lGMzvsJzbhdOWy405HcGovrspJ8RRibHnyRgggUSNO5AIox5LmqiwmatHKYsvj6VGFHkqS7lA==" - }, - "node_modules/@octokit/types": { - "version": "9.3.2", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-9.3.2.tgz", - "integrity": "sha512-D4iHGTdAnEEVsB8fl95m1hiz7D5YiRdQ9b/OEb3BYRVwbLsGHcRVPz+u+BgRLNk0Q0/4iZCBqDN96j2XNxfXrA==", + "node_modules/@npmcli/run-script/node_modules/which": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/which/-/which-3.0.1.tgz", + "integrity": "sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==", "dependencies": { - "@octokit/openapi-types": "^18.0.0" + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/@one-ini/wasm": { @@ -987,7 +1266,6 @@ "version": "0.11.0", "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", - "dev": true, "optional": true, "engines": { "node": ">=14" @@ -1044,6 +1322,21 @@ "node": ">= 6" } }, + "node_modules/@postman/tough-cookie": { + "version": "4.1.3-postman.1", + "resolved": "https://registry.npmjs.org/@postman/tough-cookie/-/tough-cookie-4.1.3-postman.1.tgz", + "integrity": "sha512-txpgUqZOnWYnUHZpHjkfb0IwVH4qJmyq77pPnJLlfhMtdCLMFTEeQHlzQiK906aaNCe4NEB5fGJHo9uzGbFMeA==", + "dev": true, + "dependencies": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.2.0", + "url-parse": "^1.5.3" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/@postman/tunnel-agent": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/@postman/tunnel-agent/-/tunnel-agent-0.6.3.tgz", @@ -1056,442 +1349,325 @@ "node": "*" } }, - "node_modules/@semantic-release/commit-analyzer": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/@semantic-release/commit-analyzer/-/commit-analyzer-9.0.2.tgz", - "integrity": "sha512-E+dr6L+xIHZkX4zNMe6Rnwg4YQrWNXK+rNsvwOPpdFppvZO1olE2fIgWhv89TkQErygevbjsZFSIxp+u6w2e5g==", + "node_modules/@rushstack/node-core-library": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@rushstack/node-core-library/-/node-core-library-4.3.0.tgz", + "integrity": "sha512-JuNZ7lwaYQ4R1TugpryyWBn4lIxK+L7fF+muibFp0by5WklG22nsvH868fuBoZMLo5FqAs6WFOifNos4PJjWSA==", "dependencies": { - "conventional-changelog-angular": "^5.0.0", - "conventional-commits-filter": "^2.0.0", - "conventional-commits-parser": "^3.2.3", - "debug": "^4.0.0", - "import-from": "^4.0.0", - "lodash": "^4.17.4", - "micromatch": "^4.0.2" - }, - "engines": { - "node": ">=14.17" + "fs-extra": "~7.0.1", + "import-lazy": "~4.0.0", + "jju": "~1.4.0", + "resolve": "~1.22.1", + "semver": "~7.5.4", + "z-schema": "~5.0.2" }, "peerDependencies": { - "semantic-release": ">=18.0.0-beta.1" + "@types/node": "*" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "node_modules/@semantic-release/commit-analyzer/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "node_modules/@rushstack/node-core-library/node_modules/fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", "dependencies": { - "ms": "2.1.2" + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" }, "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "node": ">=6 <7 || >=8" } }, - "node_modules/@semantic-release/commit-analyzer/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/@rushstack/node-core-library/node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } }, - "node_modules/@semantic-release/error": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@semantic-release/error/-/error-3.0.0.tgz", - "integrity": "sha512-5hiM4Un+tpl4cKw3lV4UgzJj+SmfNIDCLLw0TepzQxz9ZGV5ixnqkzIVF+3tp0ZHgcMKE+VNGHJjEeyFG2dcSw==", + "node_modules/@rushstack/node-core-library/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": ">=14.17" + "node": ">=10" } }, - "node_modules/@semantic-release/github": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@semantic-release/github/-/github-8.1.0.tgz", - "integrity": "sha512-erR9E5rpdsz0dW1I7785JtndQuMWN/iDcemcptf67tBNOmBUN0b2YNOgcjYUnBpgRpZ5ozfBHrK7Bz+2ets/Dg==", - "dependencies": { - "@octokit/core": "^4.2.1", - "@octokit/plugin-paginate-rest": "^6.1.2", - "@octokit/plugin-retry": "^4.1.3", - "@octokit/plugin-throttling": "^5.2.3", - "@semantic-release/error": "^3.0.0", - "aggregate-error": "^3.0.0", - "debug": "^4.0.0", - "dir-glob": "^3.0.0", - "fs-extra": "^11.0.0", - "globby": "^11.0.0", - "http-proxy-agent": "^7.0.0", - "https-proxy-agent": "^7.0.0", - "issue-parser": "^6.0.0", - "lodash": "^4.17.4", - "mime": "^3.0.0", - "p-filter": "^2.0.0", - "url-join": "^4.0.0" + "node_modules/@rushstack/node-core-library/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" }, - "engines": { - "node": ">=14.17" + "bin": { + "semver": "bin/semver.js" }, - "peerDependencies": { - "semantic-release": ">=18.0.0-beta.1" + "engines": { + "node": ">=10" } }, - "node_modules/@semantic-release/github/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "node_modules/@rushstack/node-core-library/node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/@rushstack/terminal": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@rushstack/terminal/-/terminal-0.11.0.tgz", + "integrity": "sha512-LKz7pv0G9Py5uULahNSixK1pTqIIKd103pAGhDW51YfzPojvmO5wfITe0PEUNAJZjuufN/KgeRW83dJo1gL2rQ==", "dependencies": { - "ms": "2.1.2" + "@rushstack/node-core-library": "4.3.0", + "supports-color": "~8.1.1" }, - "engines": { - "node": ">=6.0" + "peerDependencies": { + "@types/node": "*" }, "peerDependenciesMeta": { - "supports-color": { + "@types/node": { "optional": true } } }, - "node_modules/@semantic-release/github/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/@semantic-release/npm": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/@semantic-release/npm/-/npm-9.0.2.tgz", - "integrity": "sha512-zgsynF6McdzxPnFet+a4iO9HpAlARXOM5adz7VGVCvj0ne8wtL2ZOQoDV2wZPDmdEotDIbVeJjafhelZjs9j6g==", + "node_modules/@rushstack/terminal/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dependencies": { - "@semantic-release/error": "^3.0.0", - "aggregate-error": "^3.0.0", - "execa": "^5.0.0", - "fs-extra": "^11.0.0", - "lodash": "^4.17.15", - "nerf-dart": "^1.0.0", - "normalize-url": "^6.0.0", - "npm": "^8.3.0", - "rc": "^1.2.8", - "read-pkg": "^5.0.0", - "registry-auth-token": "^5.0.0", - "semver": "^7.1.2", - "tempy": "^1.0.0" + "has-flag": "^4.0.0" }, "engines": { - "node": ">=16 || ^14.17" + "node": ">=10" }, - "peerDependencies": { - "semantic-release": ">=19.0.0" + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" } }, - "node_modules/@semantic-release/npm/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==", + "node_modules/@rushstack/ts-command-line": { + "version": "4.21.0", + "resolved": "https://registry.npmjs.org/@rushstack/ts-command-line/-/ts-command-line-4.21.0.tgz", + "integrity": "sha512-z38FLUCn8M9FQf19gJ9eltdwkvc47PxvJmVZS6aKwbBAa3Pis3r3A+ZcBCVPNb9h/Tbga+i0tHdzoSGUoji9GQ==", "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" + "@rushstack/terminal": "0.11.0", + "@types/argparse": "1.0.38", + "argparse": "~1.0.9", + "string-argv": "~0.3.1" } }, - "node_modules/@semantic-release/npm/node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "node_modules/@rushstack/ts-command-line/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "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" + "sprintf-js": "~1.0.2" + } + }, + "node_modules/@rushstack/ts-command-line/node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" + }, + "node_modules/@sentry-internal/tracing": { + "version": "7.115.0", + "resolved": "https://registry.npmjs.org/@sentry-internal/tracing/-/tracing-7.115.0.tgz", + "integrity": "sha512-n1w3eJadvzkL4HebjtJGHre8Z9WbYpPw5GxSNI8ZFM+OTnhzzCAEcNL2C4tr7ssD2Lkao4+N3KaigJi54geOmg==", + "dev": true, + "dependencies": { + "@sentry/core": "7.115.0", + "@sentry/types": "7.115.0", + "@sentry/utils": "7.115.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" + "node": ">=8" } }, - "node_modules/@semantic-release/npm/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==", - "engines": { - "node": ">=10" + "node_modules/@sentry/core": { + "version": "7.115.0", + "resolved": "https://registry.npmjs.org/@sentry/core/-/core-7.115.0.tgz", + "integrity": "sha512-LSacE6rY/pJY4esXdLex5qVjo82DX6sQuvDLcEcR00bvRWGWMxSi2SipeW4RLbKmYyi0Ub+T+tUJxIOViyqyXw==", + "dev": true, + "dependencies": { + "@sentry/types": "7.115.0", + "@sentry/utils": "7.115.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">=8" } }, - "node_modules/@semantic-release/npm/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==", + "node_modules/@sentry/integrations": { + "version": "7.115.0", + "resolved": "https://registry.npmjs.org/@sentry/integrations/-/integrations-7.115.0.tgz", + "integrity": "sha512-0a75FIfG2mLPTmQ2QYFYoh3yvHqGT+D4SBAcsWVZEG24lNCiofSHnjffzIOXZX+2Spi1nY+cxIt9ItSyS2Z8VQ==", + "dev": true, + "dependencies": { + "@sentry/core": "7.115.0", + "@sentry/types": "7.115.0", + "@sentry/utils": "7.115.0", + "localforage": "^1.8.1" + }, "engines": { "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@semantic-release/npm/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==", + "node_modules/@sentry/node": { + "version": "7.115.0", + "resolved": "https://registry.npmjs.org/@sentry/node/-/node-7.115.0.tgz", + "integrity": "sha512-Y8kiwHqiICLkraSTsm7O/MWkfakRXOjhwpv4f3f+5CmPIigW0YCMTQZ3sSX+NhnvDhdkmakWy3tH9CX8+T2Ykg==", + "dev": true, "dependencies": { - "yallist": "^4.0.0" + "@sentry-internal/tracing": "7.115.0", + "@sentry/core": "7.115.0", + "@sentry/integrations": "7.115.0", + "@sentry/types": "7.115.0", + "@sentry/utils": "7.115.0" }, "engines": { - "node": ">=10" + "node": ">=8" } }, - "node_modules/@semantic-release/npm/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==", + "node_modules/@sentry/types": { + "version": "7.115.0", + "resolved": "https://registry.npmjs.org/@sentry/types/-/types-7.115.0.tgz", + "integrity": "sha512-KbhDS0DX+lk9VFCCR4AwPdiU9KUAH+vI+5HBLlgCNMY7KRGxRLnpXi3VyGi80iRdt2gi8sg2ncsVhc+SunBx7w==", + "dev": true, "engines": { - "node": ">=6" + "node": ">=8" } }, - "node_modules/@semantic-release/npm/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==", + "node_modules/@sentry/utils": { + "version": "7.115.0", + "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-7.115.0.tgz", + "integrity": "sha512-MhrpHOMPwsjlXE3vnfFFyexneozPluaMCgL7MzH2iL0m7FxXG8A9CEe7W9sVG8hh1kw8ksYz1ryb2Mx2L+UTJA==", + "dev": true, "dependencies": { - "path-key": "^3.0.0" + "@sentry/types": "7.115.0" }, "engines": { "node": ">=8" } }, - "node_modules/@semantic-release/npm/node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "node_modules/@sigstore/bundle": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@sigstore/bundle/-/bundle-1.1.0.tgz", + "integrity": "sha512-PFutXEy0SmQxYI4texPw3dd2KewuNqv7OuK1ZFtY2fM754yhvG2KdgwIhRnoEE2uHdtdGNQ8s0lb94dW9sELog==", "dependencies": { - "mimic-fn": "^2.1.0" + "@sigstore/protobuf-specs": "^0.2.0" }, "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/@semantic-release/npm/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==", - "engines": { - "node": ">=8" - } - }, - "node_modules/@semantic-release/npm/node_modules/semver": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", - "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@semantic-release/npm/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==", - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@semantic-release/npm/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==", - "engines": { - "node": ">=8" - } - }, - "node_modules/@semantic-release/npm/node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, + "node_modules/@sigstore/protobuf-specs": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.2.1.tgz", + "integrity": "sha512-XTWVxnWJu+c1oCshMLwnKvz8ZQJJDVOlciMfgpJBQbThVjKTCG8dwyhgLngBD2KN0ap9F/gOV8rFDEx8uh7R2A==", "engines": { - "node": ">= 8" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/@semantic-release/release-notes-generator": { - "version": "10.0.3", - "resolved": "https://registry.npmjs.org/@semantic-release/release-notes-generator/-/release-notes-generator-10.0.3.tgz", - "integrity": "sha512-k4x4VhIKneOWoBGHkx0qZogNjCldLPRiAjnIpMnlUh6PtaWXp/T+C9U7/TaNDDtgDa5HMbHl4WlREdxHio6/3w==", + "node_modules/@sigstore/sign": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@sigstore/sign/-/sign-1.0.0.tgz", + "integrity": "sha512-INxFVNQteLtcfGmcoldzV6Je0sbbfh9I16DM4yJPw3j5+TFP8X6uIiA18mvpEa9yyeycAKgPmOA3X9hVdVTPUA==", "dependencies": { - "conventional-changelog-angular": "^5.0.0", - "conventional-changelog-writer": "^5.0.0", - "conventional-commits-filter": "^2.0.0", - "conventional-commits-parser": "^3.2.3", - "debug": "^4.0.0", - "get-stream": "^6.0.0", - "import-from": "^4.0.0", - "into-stream": "^6.0.0", - "lodash": "^4.17.4", - "read-pkg-up": "^7.0.0" + "@sigstore/bundle": "^1.1.0", + "@sigstore/protobuf-specs": "^0.2.0", + "make-fetch-happen": "^11.0.1" }, "engines": { - "node": ">=14.17" - }, - "peerDependencies": { - "semantic-release": ">=18.0.0-beta.1" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/@semantic-release/release-notes-generator/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "node_modules/@sigstore/tuf": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@sigstore/tuf/-/tuf-1.0.3.tgz", + "integrity": "sha512-2bRovzs0nJZFlCN3rXirE4gwxCn97JNjMmwpecqlbgV9WcxX7WRuIrgzx/X7Ib7MYRbyUTpBYE0s2x6AmZXnlg==", "dependencies": { - "ms": "2.1.2" + "@sigstore/protobuf-specs": "^0.2.0", + "tuf-js": "^1.1.7" }, "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/@semantic-release/release-notes-generator/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==", + "node_modules/@sindresorhus/is": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-5.6.0.tgz", + "integrity": "sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g==", "engines": { - "node": ">=10" + "node": ">=14.16" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@semantic-release/release-notes-generator/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/@sentry-internal/tracing": { - "version": "7.105.0", - "resolved": "https://registry.npmjs.org/@sentry-internal/tracing/-/tracing-7.105.0.tgz", - "integrity": "sha512-b+AFYB7Bc9vmyxl2jbmuT4esX5G0oPfpz35A0sxFzmJIhvMg1YMDNio2c81BtKN+VSPORCnKMLhfk3kyKKvWMQ==", - "dev": true, - "dependencies": { - "@sentry/core": "7.105.0", - "@sentry/types": "7.105.0", - "@sentry/utils": "7.105.0" - }, - "engines": { - "node": ">=8" + "url": "https://github.com/sindresorhus/is?sponsor=1" } }, - "node_modules/@sentry/core": { - "version": "7.105.0", - "resolved": "https://registry.npmjs.org/@sentry/core/-/core-7.105.0.tgz", - "integrity": "sha512-5xsaTG6jZincTeJUmZomlv20mVRZUEF1U/g89lmrSOybyk2+opEnB1JeBn4ODwnvmSik8r2QLr6/RiYlaxRJCg==", + "node_modules/@sinonjs/commons": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", + "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", "dev": true, "dependencies": { - "@sentry/types": "7.105.0", - "@sentry/utils": "7.105.0" - }, - "engines": { - "node": ">=8" + "type-detect": "4.0.8" } }, - "node_modules/@sentry/node": { - "version": "7.105.0", - "resolved": "https://registry.npmjs.org/@sentry/node/-/node-7.105.0.tgz", - "integrity": "sha512-b0QwZ7vT4hcJi6LmNRh3dcaYpLtXnkYXkL0rfhMb8hN8sUx8zuOWFMI7j0cfAloVThUeJVwGyv9dERfzGS2r2w==", + "node_modules/@sinonjs/fake-timers": { + "version": "11.2.2", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-11.2.2.tgz", + "integrity": "sha512-G2piCSxQ7oWOxwGSAyFHfPIsyeJGXYtc6mFbnFA+kRXkiEnTl8c/8jul2S329iFBnDI9HGoeWWAZvuvOkZccgw==", "dev": true, "dependencies": { - "@sentry-internal/tracing": "7.105.0", - "@sentry/core": "7.105.0", - "@sentry/types": "7.105.0", - "@sentry/utils": "7.105.0" - }, - "engines": { - "node": ">=8" + "@sinonjs/commons": "^3.0.0" } }, - "node_modules/@sentry/types": { - "version": "7.105.0", - "resolved": "https://registry.npmjs.org/@sentry/types/-/types-7.105.0.tgz", - "integrity": "sha512-80o0KMVM+X2Ym9hoQxvJetkJJwkpCg7o6tHHFXI+Rp7fawc2iCMTa0IRQMUiSkFvntQLYIdDoNNuKdzz2PbQGA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@sentry/utils": { - "version": "7.105.0", - "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-7.105.0.tgz", - "integrity": "sha512-YVAV0c2KLM8+VZCicQ/E/P2+J9Vs0hGhrXwV7w6ZEAtvxrg4oF270toL1WRhvcaf8JO4J1v4V+LuU6Txs4uEeQ==", + "node_modules/@sinonjs/samsam": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-8.0.0.tgz", + "integrity": "sha512-Bp8KUVlLp8ibJZrnvq2foVhP0IVX2CIprMJPK0vqGqgrDa0OHVKeZyBykqskkrdxV6yKBPmGasO8LVjAKR3Gew==", "dev": true, "dependencies": { - "@sentry/types": "7.105.0" - }, - "engines": { - "node": ">=8" + "@sinonjs/commons": "^2.0.0", + "lodash.get": "^4.4.2", + "type-detect": "^4.0.8" } }, - "node_modules/@sinonjs/commons": { - "version": "1.8.6", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.6.tgz", - "integrity": "sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==", + "node_modules/@sinonjs/samsam/node_modules/@sinonjs/commons": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-2.0.0.tgz", + "integrity": "sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==", "dev": true, "dependencies": { "type-detect": "4.0.8" } }, - "node_modules/@sinonjs/formatio": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/@sinonjs/formatio/-/formatio-3.2.2.tgz", - "integrity": "sha512-B8SEsgd8gArBLMD6zpRw3juQ2FVSsmdd7qlevyDqzS9WTCtvF55/gAL+h6gue8ZvPYcdiPdvueM/qm//9XzyTQ==", - "dev": true, - "dependencies": { - "@sinonjs/commons": "^1", - "@sinonjs/samsam": "^3.1.0" - } - }, - "node_modules/@sinonjs/samsam": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-3.3.3.tgz", - "integrity": "sha512-bKCMKZvWIjYD0BLGnNrxVuw4dkWCYsLqFOUWw8VgKF/+5Y+mE7LfHWPIYoDXowH+3a9LsWDMo0uAP8YDosPvHQ==", - "dev": true, - "dependencies": { - "@sinonjs/commons": "^1.3.0", - "array-from": "^2.1.1", - "lodash": "^4.17.15" - } - }, "node_modules/@sinonjs/text-encoding": { "version": "0.7.2", "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.2.tgz", "integrity": "sha512-sXXKG+uL9IrKqViTtao2Ws6dy0znu9sOaP1di/jKGW1M6VssO8vlpXCQcpZ+jisQ1tTFAC5Jo/EOzFbggBagFQ==", "dev": true }, + "node_modules/@szmarczak/http-timer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz", + "integrity": "sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==", + "dependencies": { + "defer-to-connect": "^2.0.1" + }, + "engines": { + "node": ">=14.16" + } + }, "node_modules/@testim/chrome-version": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/@testim/chrome-version/-/chrome-version-1.1.4.tgz", @@ -1499,12 +1675,11 @@ "optional": true }, "node_modules/@tootallnate/once": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", - "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", - "optional": true, + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", "engines": { - "node": ">= 6" + "node": ">= 10" } }, "node_modules/@tootallnate/quickjs-emscripten": { @@ -1513,10 +1688,35 @@ "integrity": "sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==", "optional": true }, + "node_modules/@tufjs/canonical-json": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@tufjs/canonical-json/-/canonical-json-1.0.0.tgz", + "integrity": "sha512-QTnf++uxunWvG2z3UFNzAoQPHxnSXOwtaI3iJ+AohhV+5vONuArPjJE7aPXPVXfXJsqrVbZBu9b81AJoSd09IQ==", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@tufjs/models": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tufjs/models/-/models-1.0.4.tgz", + "integrity": "sha512-qaGV9ltJP0EO25YfFUPhxRVK0evXFIAGicsVXuRim4Ed9cjPxYhNnNJ49SFmbeLgtxpslIkX317IgpfcHPVj/A==", + "dependencies": { + "@tufjs/canonical-json": "1.0.0", + "minimatch": "^9.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@types/argparse": { + "version": "1.0.38", + "resolved": "https://registry.npmjs.org/@types/argparse/-/argparse-1.0.38.tgz", + "integrity": "sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA==" + }, "node_modules/@types/chai": { - "version": "4.3.12", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.12.tgz", - "integrity": "sha512-zNKDHG/1yxm8Il6uCCVsm+dRdEsJlFoDu73X17y09bId6UwoYww+vFBsAcRzl8knM1sab3Dp1VRikFQwDOtDDw==", + "version": "4.3.16", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.16.tgz", + "integrity": "sha512-PatH4iOdyh3MyWtmHVFXLWCCIhUbopaltqddG9BzB+gMIzee2MJrvd+jouii9Z3wzQJruGWAm7WOMjgfG8hQlQ==", "dev": true }, "node_modules/@types/cookiejar": { @@ -1533,10 +1733,10 @@ "@types/ms": "*" } }, - "node_modules/@types/minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==" + "node_modules/@types/http-cache-semantics": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz", + "integrity": "sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==" }, "node_modules/@types/ms": { "version": "0.7.34", @@ -1544,27 +1744,22 @@ "integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==" }, "node_modules/@types/node": { - "version": "20.11.24", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.24.tgz", - "integrity": "sha512-Kza43ewS3xoLgCEpQrsT+xRo/EJej1y0kVYGiLFE1NEODXGzTfwiC6tXTLMQskn1X4/Rjlh0MQUvx9W+L9long==", + "version": "20.12.12", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.12.tgz", + "integrity": "sha512-eWLDGF/FOSPtAvEqeRAQ4C8LSA7M1I7i0ky1I8U7kD1J5ITyW3AsRhQrKVoWf5pFKZ2kILsEGJhsI9r93PYnOw==", "dependencies": { "undici-types": "~5.26.4" } }, - "node_modules/@types/normalize-package-data": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz", - "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==" - }, - "node_modules/@types/parse-json": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", - "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==" + "node_modules/@types/semver-utils": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@types/semver-utils/-/semver-utils-1.1.3.tgz", + "integrity": "sha512-T+YwkslhsM+CeuhYUxyAjWm7mJ5am/K10UX40RuA6k6Lc7eGtq8iY2xOzy7Vq0GOqhl/xZl5l2FwURZMTPTUww==" }, "node_modules/@types/superagent": { - "version": "3.8.7", - "resolved": "https://registry.npmjs.org/@types/superagent/-/superagent-3.8.7.tgz", - "integrity": "sha512-9KhCkyXv268A2nZ1Wvu7rQWM+BmdYUVkycFeNnYrUL5Zwu7o8wPQ3wBfW59dDP+wuoxw0ww8YKgTNv8j/cgscA==", + "version": "4.1.13", + "resolved": "https://registry.npmjs.org/@types/superagent/-/superagent-4.1.13.tgz", + "integrity": "sha512-YIGelp3ZyMiH0/A09PMAORO0EBGlF5xIKfDpK74wdYvWUs2o96b5CItJcWPdH409b7SAXIIG6p8NdU/4U2Maww==", "dev": true, "dependencies": { "@types/cookiejar": "*", @@ -1572,9 +1767,9 @@ } }, "node_modules/@types/validator": { - "version": "13.11.9", - "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.11.9.tgz", - "integrity": "sha512-FCTsikRozryfayPuiI46QzH3fnrOoctTjvOYZkho9BTFLCOZ2rgZJHMOVgCOfttjPJcgOx52EpkY0CMfy87MIw==" + "version": "13.11.10", + "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.11.10.tgz", + "integrity": "sha512-e2PNXoXLr6Z+dbfx5zSh9TRlXJrELycxiaXznp4S5+D2M3b9bqJEitNHA5923jhnB2zzFiZHa2f0SI1HoIahpg==" }, "node_modules/@types/yauzl": { "version": "2.10.3", @@ -1585,19 +1780,20 @@ "@types/node": "*" } }, - "node_modules/@ungap/promise-all-settled": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz", - "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==", - "dev": true - }, "node_modules/abbrev": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-2.0.0.tgz", - "integrity": "sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==", - "dev": true, + "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/abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "dependencies": { + "event-target-shim": "^5.0.0" + }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": ">=6.5" } }, "node_modules/accepts": { @@ -1613,9 +1809,9 @@ } }, "node_modules/acorn": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.1.tgz", - "integrity": "sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg==", + "version": "8.11.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", + "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", "dev": true, "bin": { "acorn": "bin/acorn" @@ -1642,14 +1838,14 @@ } }, "node_modules/agent-base": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.0.tgz", - "integrity": "sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==", + "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.3.4" + "debug": "4" }, "engines": { - "node": ">= 14" + "node": ">= 6.0.0" } }, "node_modules/agent-base/node_modules/debug": { @@ -1677,7 +1873,6 @@ "version": "4.5.0", "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.5.0.tgz", "integrity": "sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==", - "optional": true, "dependencies": { "humanize-ms": "^1.2.1" }, @@ -1701,6 +1896,7 @@ "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", @@ -1721,6 +1917,14 @@ "ajv": "^6.9.1" } }, + "node_modules/ansi-align": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", + "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", + "dependencies": { + "string-width": "^4.1.0" + } + }, "node_modules/ansi-colors": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", @@ -1740,35 +1944,27 @@ } }, "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==", - "dev": true, + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, "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==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dependencies": { - "color-convert": "^1.9.0" + "color-convert": "^2.0.1" }, "engines": { - "node": ">=4" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/ansicolors": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/ansicolors/-/ansicolors-0.3.2.tgz", - "integrity": "sha512-QXu7BPrP29VllRxH8GwB7x5iX5qWKAAMLqKQGWTeLWVlNHNOpVMJ91dsxQAIWXpjuW5wqvxu3Jd/nRjrJ+0pqg==" - }, - "node_modules/any-promise": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==" - }, "node_modules/anymatch": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", @@ -1802,8 +1998,7 @@ "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==", - "optional": true + "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==" }, "node_modules/archy": { "version": "1.0.0", @@ -1815,7 +2010,6 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz", "integrity": "sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==", - "optional": true, "dependencies": { "delegates": "^1.0.0", "readable-stream": "^3.6.0" @@ -1828,7 +2022,6 @@ "version": "3.6.2", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "optional": true, "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -1842,45 +2035,21 @@ "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==", - "optional": true, "dependencies": { "safe-buffer": "~5.2.0" } }, "node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/argv-formatter": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/argv-formatter/-/argv-formatter-1.0.0.tgz", - "integrity": "sha512-F2+Hkm9xFaRg+GkaNnbwXNDV5O6pnCFEmqyhvfC/Ic5LbgOWjJh3L+mN/s91rxVL3znE7DYVpW0GJFT+4YBgWw==" - }, - "node_modules/argv-tools": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/argv-tools/-/argv-tools-0.1.2.tgz", - "integrity": "sha512-wxqoymY0BEu9NblZVQiOTOAiJUjPhaa/kbNMjC2h6bnrmUSgnxKgWJo3lzXvi3bHJRwXyqK/dHzMlZVRT89Cxg==", - "dependencies": { - "array-back": "^2.0.0", - "find-replace": "^2.0.1" - }, - "engines": { - "node": ">=4.0.0" - } + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" }, "node_modules/array-back": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/array-back/-/array-back-2.0.0.tgz", - "integrity": "sha512-eJv4pLLufP3g5kcZry0j6WXpIbzYw9GUB4mVJZno9wfwiBxbizTnHCw3VJb07cBihbFX48Y7oSrW9y+gt4glyw==", - "dependencies": { - "typical": "^2.6.1" - }, + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/array-back/-/array-back-3.1.0.tgz", + "integrity": "sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==", "engines": { - "node": ">=4" + "node": ">=6" } }, "node_modules/array-buffer-byte-length": { @@ -1904,27 +2073,17 @@ "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" }, - "node_modules/array-from": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/array-from/-/array-from-2.1.1.tgz", - "integrity": "sha512-GQTc6Uupx1FCavi5mPzBvVT7nEOeWMmUA9P95wpfpW1XwMSKs+KaymD5C2Up7KAUKg/mYwbsUYzdZWcoajlNZg==", - "dev": true - }, - "node_modules/array-ify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz", - "integrity": "sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==" - }, "node_modules/array-includes": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.7.tgz", - "integrity": "sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==", + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz", + "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1", + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.4", "is-string": "^1.0.7" }, "engines": { @@ -1964,18 +2123,16 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", - "engines": { - "node": ">=0.10.0" - } + "node_modules/asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" }, "node_modules/asn1": { "version": "0.2.6", "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", + "dev": true, "dependencies": { "safer-buffer": "~2.1.0" } @@ -1995,17 +2152,18 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", + "dev": true, "engines": { "node": ">=0.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==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", + "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", "dev": true, "engines": { - "node": "*" + "node": ">=12" } }, "node_modules/ast-types": { @@ -2020,21 +2178,6 @@ "node": ">=4" } }, - "node_modules/ast-types/node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", - "optional": true - }, - "node_modules/astral-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", - "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/async": { "version": "3.2.5", "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz", @@ -2045,6 +2188,15 @@ "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/atomic-sleep": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/atomic-sleep/-/atomic-sleep-1.0.0.tgz", @@ -2072,6 +2224,7 @@ "version": "0.7.0", "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", + "dev": true, "engines": { "node": "*" } @@ -2079,14 +2232,15 @@ "node_modules/aws4": { "version": "1.12.0", "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz", - "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==" + "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==", + "dev": true }, "node_modules/axios": { - "version": "1.0.0-alpha.1", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.0.0-alpha.1.tgz", - "integrity": "sha512-p+meG161943WT+K7sJYquHR46xxi/z0tk7vnSmEf/LrfEAyiP+0uTMMYk1OEo1IRF18oGRhnFxN1y8fLcXaTMw==", + "version": "1.6.8", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.8.tgz", + "integrity": "sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ==", "dependencies": { - "follow-redirects": "^1.15.0", + "follow-redirects": "^1.15.6", "form-data": "^4.0.0", "proxy-from-env": "^1.1.0" } @@ -2102,6 +2256,15 @@ "js-tokens": "^3.0.2" } }, + "node_modules/babel-code-frame/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==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/babel-code-frame/node_modules/ansi-styles": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", @@ -2127,6 +2290,15 @@ "node": ">=0.10.0" } }, + "node_modules/babel-code-frame/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, "node_modules/babel-code-frame/node_modules/js-tokens": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", @@ -2154,15 +2326,6 @@ "node": ">=0.8.0" } }, - "node_modules/babel-runtime": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", - "integrity": "sha512-ITKNuq2wKlW1fJg9sSW52eepoYgZBggvOAHC0u/CYu/qxQ9EVzThCgR69BnSXLHjy2f7SY5zaQ4yt7H9ZVxY2g==", - "dependencies": { - "core-js": "^2.4.0", - "regenerator-runtime": "^0.11.0" - } - }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", @@ -2216,28 +2379,47 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", + "dev": true, "dependencies": { "tweetnacl": "^0.14.3" } }, "node_modules/bdd-lazy-var": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/bdd-lazy-var/-/bdd-lazy-var-2.5.2.tgz", - "integrity": "sha512-EBFk8uOTALu8crLChd+KfhHwv+frhxqE235jcy6NY1G1weB0Gyr5H7u0zvUnr1yduzX6M1I/ERaVGdY1cd+6ZQ==", - "dev": true - }, - "node_modules/before-after-hook": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.3.tgz", - "integrity": "sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==" + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/bdd-lazy-var/-/bdd-lazy-var-2.6.1.tgz", + "integrity": "sha512-X3ADwcFji/IHIrYJhTTpaiWhoOx4pl4whdAx1dmvdeUPsMUb7fVYFvf/Q33VEAEAVkEwi5rgNSZ0Y9oOVeQV+A==", + "dev": true, + "peerDependencies": { + "jasmine": ">=2", + "jasmine-core": ">=2", + "jest": ">=20", + "mocha": ">=2.3" + }, + "peerDependenciesMeta": { + "jasmine": { + "optional": true + }, + "jasmine-core": { + "optional": true + }, + "jest": { + "optional": true + }, + "mocha": { + "optional": true + } + } }, "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": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", "dev": true, "engines": { "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/bindings": { @@ -2280,9 +2462,10 @@ } }, "node_modules/bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-2.11.0.tgz", + "integrity": "sha512-UfFSr22dmHPQqPP9XWHRhq+gWnHCYguQGkXQlbyPtW5qTnhFWA8/iXg765tH0cAjy7l/zPJ1aBTO0g5XgA7kvQ==", + "dev": true }, "node_modules/bn.js": { "version": "4.12.0", @@ -2332,23 +2515,112 @@ "integrity": "sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==", "dev": true }, - "node_modules/bottleneck": { - "version": "2.19.5", - "resolved": "https://registry.npmjs.org/bottleneck/-/bottleneck-2.19.5.tgz", - "integrity": "sha512-VHiNCbI1lKdl44tGrhNfU3lup0Tj/ZBMJB5/2ZbNXRCPuRCO7ed2mgcK4r17y+KB2EfuYuRaVlwNbAeaWGSpbw==" + "node_modules/boxen": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-7.1.1.tgz", + "integrity": "sha512-2hCgjEmP8YLWQ130n2FerGv7rYpfBmnmp9Uy2Le1vge6X3gZIfSmEzP5QTDElFxcvVcXlEn8Aq6MU/PZygIOog==", + "dependencies": { + "ansi-align": "^3.0.1", + "camelcase": "^7.0.1", + "chalk": "^5.2.0", + "cli-boxes": "^3.0.0", + "string-width": "^5.1.2", + "type-fest": "^2.13.0", + "widest-line": "^4.0.1", + "wrap-ansi": "^8.1.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/boxen/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==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } }, - "node_modules/bowser": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.11.0.tgz", - "integrity": "sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==" + "node_modules/boxen/node_modules/camelcase": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-7.0.1.tgz", + "integrity": "sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/boxen/node_modules/chalk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/boxen/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==" + }, + "node_modules/boxen/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==", + "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/boxen/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==", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/boxen/node_modules/type-fest": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", + "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, "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==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "balanced-match": "^1.0.0" } }, "node_modules/braces": { @@ -2471,66 +2743,119 @@ } }, "node_modules/cacache": { - "version": "15.3.0", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.3.0.tgz", - "integrity": "sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==", - "optional": true, + "version": "17.1.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-17.1.4.tgz", + "integrity": "sha512-/aJwG2l3ZMJ1xNAnqbMpA40of9dj/pIH3QfiuQSqjfPJF747VR0J/bHn+/KdNnHKc6XQcWt/AfRSBft82W1d2A==", "dependencies": { - "@npmcli/fs": "^1.0.0", - "@npmcli/move-file": "^1.0.1", - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "glob": "^7.1.4", - "infer-owner": "^1.0.4", - "lru-cache": "^6.0.0", - "minipass": "^3.1.1", + "@npmcli/fs": "^3.1.0", + "fs-minipass": "^3.0.0", + "glob": "^10.2.2", + "lru-cache": "^7.7.1", + "minipass": "^7.0.3", "minipass-collect": "^1.0.2", "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.2", - "mkdirp": "^1.0.3", + "minipass-pipeline": "^1.2.4", "p-map": "^4.0.0", - "promise-inflight": "^1.0.1", - "rimraf": "^3.0.2", - "ssri": "^8.0.1", - "tar": "^6.0.2", - "unique-filename": "^1.1.1" + "ssri": "^10.0.0", + "tar": "^6.1.11", + "unique-filename": "^3.0.0" }, "engines": { - "node": ">= 10" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/cacache/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==", - "optional": true, + "node_modules/cacache/node_modules/foreground-child": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", + "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", "dependencies": { - "yallist": "^4.0.0" + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" }, "engines": { - "node": ">=10" + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/cacache/node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "optional": true, + "node_modules/cacache/node_modules/glob": { + "version": "10.3.15", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.15.tgz", + "integrity": "sha512-0c6RlJt1TICLyvJYIApxb8GsXoai0KUP7AxKKAtsYXdgJR1mGEUa7DgwShbdk1nly0PYoZj01xd4hzbq3fsjpw==", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.6", + "minimatch": "^9.0.1", + "minipass": "^7.0.4", + "path-scurry": "^1.11.0" + }, "bin": { - "mkdirp": "bin/cmd.js" + "glob": "dist/esm/bin.mjs" }, "engines": { - "node": ">=10" + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/cacache/node_modules/p-map": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", - "optional": true, + "node_modules/cacache/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "engines": { + "node": ">=12" + } + }, + "node_modules/cacache/node_modules/minipass": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.1.tgz", + "integrity": "sha512-UZ7eQ+h8ywIRAW1hIEl2AqdwzJucU/Kp59+8kkZeSvafXhZjul247BvIJjEVFVeON6d7lM46XX1HXCduKAS8VA==", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/cacache/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/cacheable-lookup": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz", + "integrity": "sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==", + "engines": { + "node": ">=14.16" + } + }, + "node_modules/cacheable-request": { + "version": "10.2.14", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-10.2.14.tgz", + "integrity": "sha512-zkDT5WAF4hSSoUgyfg5tFIxz8XQK+25W/TLVojJTMKBaxevLBBtLxgqguAuVQB8PVW79FVjHcU+GJ9tVbDZ9mQ==", "dependencies": { - "aggregate-error": "^3.0.0" + "@types/http-cache-semantics": "^4.0.2", + "get-stream": "^6.0.1", + "http-cache-semantics": "^4.1.1", + "keyv": "^4.5.3", + "mimic-response": "^4.0.0", + "normalize-url": "^8.0.0", + "responselike": "^3.0.0" }, + "engines": { + "node": ">=14.16" + } + }, + "node_modules/cacheable-request/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==", "engines": { "node": ">=10" }, @@ -2538,19 +2863,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/cacache/node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "optional": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" + "node_modules/cacheable-request/node_modules/mimic-response": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-4.0.0.tgz", + "integrity": "sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/caching-transform": { @@ -2611,6 +2932,7 @@ "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" } @@ -2619,35 +2941,15 @@ "version": "5.3.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, "engines": { "node": ">=6" } }, - "node_modules/camelcase-keys": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", - "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", - "dependencies": { - "camelcase": "^5.3.1", - "map-obj": "^4.0.0", - "quick-lru": "^4.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/camelize": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/camelize/-/camelize-1.0.0.tgz", - "integrity": "sha512-W2lPwkBkMZwFlPCXhIlYgxu+7gC/NUlCtdK652DAJ1JdgV0sTrvuPFshNPrFa1TY2JOkLhgdeEBplB4ezEa+xg==" - }, "node_modules/caniuse-lite": { - "version": "1.0.30001593", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001593.tgz", - "integrity": "sha512-UWM1zlo3cZfkpBysd7AS+z+v007q9G1+fLTUU42rQnY6t2axoogPW/xol6T7juU5EUoOhML4WgBIdG+9yYqAjQ==", + "version": "1.0.30001620", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001620.tgz", + "integrity": "sha512-WJvYsOjd1/BYUY6SNGUosK9DUidBPDTnOARHp3fSmFO1ekdxaY6nKRttEVrfMmYi80ctS0kz1wiWmm14fVc3ew==", "dev": true, "funding": [ { @@ -2675,87 +2977,104 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/cardinal": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/cardinal/-/cardinal-2.1.1.tgz", - "integrity": "sha512-JSr5eOgoEymtYHBjNWyjrMqet9Am2miJhlfKNdqLp6zoeAh0KN5dRAcxlecj5mAJrmQomgiOBj35xHLrFjqBpw==", - "dependencies": { - "ansicolors": "~0.3.2", - "redeyed": "~2.1.0" - }, - "bin": { - "cdl": "bin/cdl.js" - } - }, "node_modules/caseless": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==", + "dev": true }, "node_modules/chai": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.2.0.tgz", - "integrity": "sha512-XQU3bhBukrOsQCuwZndwGcCVQHyZi53fQ6Ys1Fym7E4olpIqqZZhhoFJoaKVvV17lWQoXYwgWN2nF5crA8J2jw==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/chai/-/chai-5.1.1.tgz", + "integrity": "sha512-pT1ZgP8rPNqUgieVaEY+ryQr6Q4HXNg8Ei9UnLUrjN4IA7dvQC5JB+/kxVcPNDHyBcc/26CXPkbNzq3qwrOEKA==", "dev": true, "dependencies": { - "assertion-error": "^1.1.0", - "check-error": "^1.0.2", - "deep-eql": "^3.0.1", - "get-func-name": "^2.0.0", - "pathval": "^1.1.0", - "type-detect": "^4.0.5" + "assertion-error": "^2.0.1", + "check-error": "^2.1.1", + "deep-eql": "^5.0.1", + "loupe": "^3.1.0", + "pathval": "^2.0.0" }, "engines": { - "node": ">=4" + "node": ">=12" } }, "node_modules/chai-as-promised": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/chai-as-promised/-/chai-as-promised-7.1.1.tgz", - "integrity": "sha512-azL6xMoi+uxu6z4rhWQ1jbdUhOMhis2PvscD/xjLqNMkv3BPPp2JyyuTHOrf9BOosGpNQ11v6BKv/g57RXbiaA==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/chai-as-promised/-/chai-as-promised-7.1.2.tgz", + "integrity": "sha512-aBDHZxRzYnUYuIAIPBH2s511DjlKPzXNlXSGFC8CwmroWQLfrW0LtE1nK3MAwwNhJPa9raEjNCmRoFpG0Hurdw==", "dev": true, "dependencies": { "check-error": "^1.0.2" }, "peerDependencies": { - "chai": ">= 2.1.2 < 5" + "chai": ">= 2.1.2 < 6" + } + }, + "node_modules/chai-as-promised/node_modules/check-error": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz", + "integrity": "sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==", + "dev": true, + "dependencies": { + "get-func-name": "^2.0.2" + }, + "engines": { + "node": "*" } }, "node_modules/chai-http": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/chai-http/-/chai-http-4.2.1.tgz", - "integrity": "sha512-S2Ezy5uSVuOYleeXppfUKtTU/xbHCZyKkwjheNJ/76SGFTUPDpDkkpVdPNgC3sAO1Ap5J5LJ+/rXdLG8EGhCDA==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/chai-http/-/chai-http-4.4.0.tgz", + "integrity": "sha512-uswN3rZpawlRaa5NiDUHcDZ3v2dw5QgLyAwnQ2tnVNuP7CwIsOFuYJ0xR1WiR7ymD4roBnJIzOUep7w9jQMFJA==", "dev": true, "dependencies": { "@types/chai": "4", - "@types/superagent": "^3.8.3", - "cookiejar": "^2.1.1", + "@types/superagent": "4.1.13", + "charset": "^1.0.1", + "cookiejar": "^2.1.4", "is-ip": "^2.0.0", "methods": "^1.1.2", - "qs": "^6.5.1", - "superagent": "^3.7.0" + "qs": "^6.11.2", + "superagent": "^8.0.9" }, "engines": { - "node": ">=4" + "node": ">=10" } }, "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==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": ">=4" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chalk-template": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/chalk-template/-/chalk-template-0.4.0.tgz", + "integrity": "sha512-/ghrgmhfY8RaSdeo43hNXxpoHAtxdbskUHjPpfqUWGttFgycUhYPGx3YZBCnUCvOa7Doivn1IZec3DEGFoMgLg==", + "dependencies": { + "chalk": "^4.1.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/chalk-template?sponsor=1" } }, "node_modules/chardet": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-2.0.0.tgz", + "integrity": "sha512-xVgPpulCooDjY6zH4m9YW3jbkaBe3FKIAvF5sj5t7aBNsVl2ljIE+xwJ4iNgiDZHFQvNIpjdKdVOQvvk5ZfxbQ==", "dev": true }, "node_modules/charenc": { @@ -2777,15 +3096,12 @@ } }, "node_modules/check-error": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz", - "integrity": "sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz", + "integrity": "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==", "dev": true, - "dependencies": { - "get-func-name": "^2.0.2" - }, "engines": { - "node": "*" + "node": ">= 16" } }, "node_modules/child_process": { @@ -2820,6 +3136,18 @@ "fsevents": "~2.3.2" } }, + "node_modules/chokidar/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/chownr": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", @@ -2829,9 +3157,9 @@ } }, "node_modules/chromedriver": { - "version": "122.0.6", - "resolved": "https://registry.npmjs.org/chromedriver/-/chromedriver-122.0.6.tgz", - "integrity": "sha512-Q0r+QlUtiJWMQ5HdYaFa0CtBmLFq3n5JWfmq9mOC00UMBvWxku09gUkvBt457QnYfTM/XHqY/HTFOxHvATnTmA==", + "version": "125.0.0", + "resolved": "https://registry.npmjs.org/chromedriver/-/chromedriver-125.0.0.tgz", + "integrity": "sha512-wWXrxWLWqXRTmRZDtPigs+ys44srlpHTpsL7MHnZc9iaE1oIB0hslSVeem6TcsEb1Ou8nvPx3vs5bPwCI6+VHg==", "hasInstallScript": true, "optional": true, "dependencies": { @@ -2850,15 +3178,18 @@ "node": ">=18" } }, - "node_modules/chromedriver/node_modules/axios": { - "version": "1.6.8", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.8.tgz", - "integrity": "sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ==", - "optional": true, - "dependencies": { - "follow-redirects": "^1.15.6", - "form-data": "^4.0.0", - "proxy-from-env": "^1.1.0" + "node_modules/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "engines": { + "node": ">=8" } }, "node_modules/circular-json": { @@ -2876,18 +3207,31 @@ "node": ">=6" } }, + "node_modules/cli-boxes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-3.0.0.tgz", + "integrity": "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/cli-color": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/cli-color/-/cli-color-1.4.0.tgz", - "integrity": "sha512-xu6RvQqqrWEo6MPR1eixqGPywhYBHRs653F9jfXB2Hx4jdM/3WxiNE1vppRmxtMIfl16SFYTpYlrnqH/HsK/2w==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/cli-color/-/cli-color-2.0.4.tgz", + "integrity": "sha512-zlnpg0jNcibNrO7GG9IeHH7maWFeCz+Ja1wx/7tZNU5ASSSSZ+/qZciM0/LHCYxSdqv5h2sdbQ/PXYdOuetXvA==", "dev": true, "dependencies": { - "ansi-regex": "^2.1.1", - "d": "1", - "es5-ext": "^0.10.46", + "d": "^1.0.1", + "es5-ext": "^0.10.64", "es6-iterator": "^2.0.3", - "memoizee": "^0.4.14", - "timers-ext": "^0.1.5" + "memoizee": "^0.4.15", + "timers-ext": "^0.1.7" + }, + "engines": { + "node": ">=0.10" } }, "node_modules/cli-cursor": { @@ -2903,66 +3247,21 @@ } }, "node_modules/cli-progress": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/cli-progress/-/cli-progress-3.10.0.tgz", - "integrity": "sha512-kLORQrhYCAtUPLZxqsAt2YJGOvRdt34+O6jl5cQGb7iF3dM55FQZlTR+rQyIK9JUcO9bBMwZsTlND+3dmFU2Cw==", + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/cli-progress/-/cli-progress-3.12.0.tgz", + "integrity": "sha512-tRkV3HJ1ASwm19THiiLIXLO7Im7wlTuKnvkYaTkyoAPefqjNg7W7DHKUlGRxy9vxDvbyCYQkQozvptuMkGCg8A==", "dev": true, "dependencies": { - "string-width": "^4.2.0" + "string-width": "^4.2.3" }, "engines": { "node": ">=4" } }, - "node_modules/cli-progress/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==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/cli-progress/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/cli-progress/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==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cli-progress/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==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/cli-table3": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.1.tgz", - "integrity": "sha512-w0q/enDHhPLq44ovMGdQeeDLvwxwavsJX7oQGYt/LrBlYsyaxyDnp6z3QzFut/6kLLKnlcUVJLrpB7KBfgG/RA==", - "dev": true, + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.3.tgz", + "integrity": "sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==", "dependencies": { "string-width": "^4.2.0" }, @@ -2970,51 +3269,7 @@ "node": "10.* || >= 12.*" }, "optionalDependencies": { - "colors": "1.4.0" - } - }, - "node_modules/cli-table3/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==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/cli-table3/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/cli-table3/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==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cli-table3/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==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" + "@colors/colors": "1.5.0" } }, "node_modules/cli-width": { @@ -3033,64 +3288,42 @@ "wrap-ansi": "^7.0.0" } }, - "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==", + "node_modules/cliui/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "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==", + "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": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "color-name": "~1.1.4" }, "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/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": ">=7.0.0" } }, "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==" + "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==", - "optional": true, "bin": { "color-support": "bin.js" } @@ -3116,41 +3349,56 @@ } }, "node_modules/command-line-args": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-5.0.2.tgz", - "integrity": "sha512-/qPcbL8zpqg53x4rAaqMFlRV4opN3pbla7I7k9x8kyOBMQoGT6WltjN6sXZuxOXw6DgdK7Ad+ijYS5gjcr7vlA==", + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-5.2.1.tgz", + "integrity": "sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg==", "dependencies": { - "argv-tools": "^0.1.1", - "array-back": "^2.0.0", - "find-replace": "^2.0.1", + "array-back": "^3.1.0", + "find-replace": "^3.0.0", "lodash.camelcase": "^4.3.0", - "typical": "^2.6.1" + "typical": "^4.0.0" }, "engines": { "node": ">=4.0.0" } }, "node_modules/command-line-usage": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-5.0.5.tgz", - "integrity": "sha512-d8NrGylA5oCXSbGoKz05FkehDAzSmIm4K03S5VDh4d5lZAtTWfc3D1RuETtuQCn8129nYfJfDdF7P/lwcz1BlA==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-7.0.1.tgz", + "integrity": "sha512-NCyznE//MuTjwi3y84QVUGEOT+P5oto1e1Pk/jFPVdPPfsG03qpTIl3yw6etR+v73d0lXsoojRpvbru2sqePxQ==", "dependencies": { - "array-back": "^2.0.0", - "chalk": "^2.4.1", - "table-layout": "^0.4.3", - "typical": "^2.6.1" + "array-back": "^6.2.2", + "chalk-template": "^0.4.0", + "table-layout": "^3.0.0", + "typical": "^7.1.1" }, "engines": { - "node": ">=4.0.0" + "node": ">=12.20.0" + } + }, + "node_modules/command-line-usage/node_modules/array-back": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/array-back/-/array-back-6.2.2.tgz", + "integrity": "sha512-gUAZ7HPyb4SJczXAMUXMGAvI976JoK3qEx9v1FTmeYuJj0IBiaKttG1ydtGKdkfqWkIkouke7nG8ufGy77+Cvw==", + "engines": { + "node": ">=12.17" + } + }, + "node_modules/command-line-usage/node_modules/typical": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/typical/-/typical-7.1.1.tgz", + "integrity": "sha512-T+tKVNs6Wu7IWiAce5BgMd7OZfNYUndHwc5MknN+UHOudi7sGZzuHdCadllRuqJ3fPtgFtIH9+lt9qRv6lmpfA==", + "engines": { + "node": ">=12.17" } }, "node_modules/commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz", + "integrity": "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==", "dev": true, "engines": { - "node": ">= 10" + "node": ">=16" } }, "node_modules/commondir": { @@ -3159,15 +3407,6 @@ "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", "dev": true }, - "node_modules/compare-func": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-2.0.0.tgz", - "integrity": "sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==", - "dependencies": { - "array-ify": "^1.0.0", - "dot-prop": "^5.1.0" - } - }, "node_modules/compare-versions": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-6.1.0.tgz", @@ -3262,11 +3501,28 @@ "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" }, + "node_modules/configstore": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-6.0.0.tgz", + "integrity": "sha512-cD31W1v3GqUlQvbBCGcXmd2Nj9SvLDOP1oQ0YFuLETufzSPaKp11rYBsSOm7rCsW3OnIRAFM3OxRhceaXNYHkA==", + "dependencies": { + "dot-prop": "^6.0.1", + "graceful-fs": "^4.2.6", + "unique-string": "^3.0.0", + "write-file-atomic": "^3.0.3", + "xdg-basedir": "^5.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/yeoman/configstore?sponsor=1" + } + }, "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==", - "optional": true + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==" }, "node_modules/contains-path": { "version": "0.1.0", @@ -3288,14 +3544,6 @@ "node": ">= 0.6" } }, - "node_modules/content-security-policy-builder": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/content-security-policy-builder/-/content-security-policy-builder-2.1.0.tgz", - "integrity": "sha512-/MtLWhJVvJNkA9dVLAp6fg9LxD2gfI6R2Fi1hPmfjYXSahJJzcfvoeDOxSyp4NvxMuwWv3WMssE9o31DoULHrQ==", - "engines": { - "node": ">=4.0.0" - } - }, "node_modules/content-type": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", @@ -3304,79 +3552,6 @@ "node": ">= 0.6" } }, - "node_modules/conventional-changelog-angular": { - "version": "5.0.13", - "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-5.0.13.tgz", - "integrity": "sha512-i/gipMxs7s8L/QeuavPF2hLnJgH6pEZAttySB6aiQLWcX3puWDL3ACVmvBhJGxnAy52Qc15ua26BufY6KpmrVA==", - "dependencies": { - "compare-func": "^2.0.0", - "q": "^1.5.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/conventional-changelog-writer": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-5.0.1.tgz", - "integrity": "sha512-5WsuKUfxW7suLblAbFnxAcrvf6r+0b7GvNaWUwUIk0bXMnENP/PEieGKVUQrjPqwPT4o3EPAASBXiY6iHooLOQ==", - "dependencies": { - "conventional-commits-filter": "^2.0.7", - "dateformat": "^3.0.0", - "handlebars": "^4.7.7", - "json-stringify-safe": "^5.0.1", - "lodash": "^4.17.15", - "meow": "^8.0.0", - "semver": "^6.0.0", - "split": "^1.0.0", - "through2": "^4.0.0" - }, - "bin": { - "conventional-changelog-writer": "cli.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/conventional-changelog-writer/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/conventional-commits-filter": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-2.0.7.tgz", - "integrity": "sha512-ASS9SamOP4TbCClsRHxIHXRfcGCnIoQqkvAzCSbZzTFLfcTqJVugB0agRgsEELsqaeWgsXv513eS116wnlSSPA==", - "dependencies": { - "lodash.ismatch": "^4.4.0", - "modify-values": "^1.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/conventional-commits-parser": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-3.2.4.tgz", - "integrity": "sha512-nK7sAtfi+QXbxHCYfhpZsfRtaitZLIA6889kFIouLvz6repszQDgxBu7wf2WbU+Dco7sAnNCJYERCwt54WPC2Q==", - "dependencies": { - "is-text-path": "^1.0.1", - "JSONStream": "^1.0.4", - "lodash": "^4.17.15", - "meow": "^8.0.0", - "split2": "^3.0.0", - "through2": "^4.0.0" - }, - "bin": { - "conventional-commits-parser": "cli.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/convert-source-map": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", @@ -3384,19 +3559,19 @@ "dev": true }, "node_modules/cookie": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", - "integrity": "sha512-+IJOX0OqlHCszo2mBUq+SrEbCj6w7Kpffqx60zYbPTFaO4+yYgRjHwcZNpWvaTylDHaV7PPmBHzSecZiMhtPgw==", + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==", "engines": { "node": ">= 0.6" } }, "node_modules/cookie-parser": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.4.3.tgz", - "integrity": "sha512-EZyO2G+zVFsMjU8jDtxs2iLS1DmryYNjC0s4/IHtsS6pWPUJSr0kt0UPOctRZosebPHYekb7bNcIBt4YW0S9bg==", + "version": "1.4.6", + "resolved": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.4.6.tgz", + "integrity": "sha512-z3IzaNjdwUC2olLIB5/ITd0/setiaFMLYiZJle7xg5Fe9KWAceil7xszYfHHBtDFYLSgJduS2Ty0P1uJdPDJeA==", "dependencies": { - "cookie": "0.3.1", + "cookie": "0.4.1", "cookie-signature": "1.0.6" }, "engines": { @@ -3414,13 +3589,6 @@ "integrity": "sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==", "dev": true }, - "node_modules/core-js": { - "version": "2.6.12", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz", - "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==", - "deprecated": "core-js@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js.", - "hasInstallScript": 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", @@ -3438,34 +3606,17 @@ "node": ">= 0.10" } }, - "node_modules/cosmiconfig": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", - "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", - "dependencies": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", "dependencies": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" }, "engines": { - "node": ">=4.8" + "node": ">= 8" } }, "node_modules/crypt": { @@ -3478,11 +3629,28 @@ } }, "node_modules/crypto-random-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", - "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-4.0.0.tgz", + "integrity": "sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==", + "dependencies": { + "type-fest": "^1.0.1" + }, "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/crypto-random-string/node_modules/type-fest": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", + "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/csv-parse": { @@ -3516,6 +3684,7 @@ "version": "1.14.1", "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", + "dev": true, "dependencies": { "assert-plus": "^1.0.0" }, @@ -3523,11 +3692,6 @@ "node": ">=0.10" } }, - "node_modules/dasherize": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dasherize/-/dasherize-2.0.0.tgz", - "integrity": "sha512-APql/TZ6FdLEpf2z7/X2a2zyqK8juYtqaSVqxw9mYoQ64CXkfU15AeLh8pUszT8+fnYjgm6t0aIYpWKJbnLkuA==" - }, "node_modules/data-uri-to-buffer": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-6.0.2.tgz", @@ -3537,12 +3701,55 @@ "node": ">= 14" } }, - "node_modules/dateformat": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz", - "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==", + "node_modules/data-view-buffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", + "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, "engines": { - "node": "*" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz", + "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz", + "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/debug": { @@ -3566,29 +3773,7 @@ "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/decamelize-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.1.tgz", - "integrity": "sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==", - "dependencies": { - "decamelize": "^1.1.0", - "map-obj": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/decamelize-keys/node_modules/map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -3608,15 +3793,12 @@ } }, "node_modules/deep-eql": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", - "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.1.tgz", + "integrity": "sha512-nwQCf6ne2gez3o1MxWifqkciwt0zhl0LO1/UwVu4uMBuPmflWM4oQ70XMqHqnBJA+nhzncaqL9HVL6KkHJ28lw==", "dev": true, - "dependencies": { - "type-detect": "^4.0.0" - }, "engines": { - "node": ">=0.12" + "node": ">=6" } }, "node_modules/deep-extend": { @@ -3648,6 +3830,14 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/defer-to-connect": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", + "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", + "engines": { + "node": ">=10" + } + }, "node_modules/define-data-property": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", @@ -3717,59 +3907,52 @@ "uniq": "^1.0.1" } }, + "node_modules/deglob/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/deglob/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/deglob/node_modules/ignore": { "version": "3.3.10", "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==", "dev": true }, - "node_modules/del": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/del/-/del-6.1.1.tgz", - "integrity": "sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg==", - "dependencies": { - "globby": "^11.0.1", - "graceful-fs": "^4.2.4", - "is-glob": "^4.0.1", - "is-path-cwd": "^2.2.0", - "is-path-inside": "^3.0.2", - "p-map": "^4.0.0", - "rimraf": "^3.0.2", - "slash": "^3.0.0" + "node_modules/deglob/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": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/del/node_modules/p-map": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", - "dependencies": { - "aggregate-error": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/del/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": "*" } }, "node_modules/delayed-stream": { @@ -3783,8 +3966,7 @@ "node_modules/delegates": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", - "optional": true + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==" }, "node_modules/denque": { "version": "2.1.0", @@ -3802,10 +3984,15 @@ "node": ">= 0.8" } }, - "node_modules/deprecation": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz", - "integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==" + "node_modules/des.js": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.1.0.tgz", + "integrity": "sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg==", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } }, "node_modules/destroy": { "version": "1.2.0", @@ -3817,9 +4004,9 @@ } }, "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==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", + "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", "engines": { "node": ">=8" } @@ -3830,6 +4017,15 @@ "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", "dev": true }, + "node_modules/dezalgo": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.4.tgz", + "integrity": "sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==", + "dependencies": { + "asap": "^2.0.0", + "wrappy": "1" + } + }, "node_modules/diff": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", @@ -3850,43 +4046,30 @@ "node": ">=8" } }, - "node_modules/dns-prefetch-control": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/dns-prefetch-control/-/dns-prefetch-control-0.2.0.tgz", - "integrity": "sha512-hvSnros73+qyZXhHFjx2CMLwoj3Fe7eR9EJsFsqmcI1bB2OBWL/+0YzaEaKssCHnj/6crawNnUyw74Gm2EKe+Q==", - "engines": { - "node": ">=4.0.0" - } - }, "node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", "dev": true, "dependencies": { "esutils": "^2.0.2" }, "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/dont-sniff-mimetype": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/dont-sniff-mimetype/-/dont-sniff-mimetype-1.1.0.tgz", - "integrity": "sha512-ZjI4zqTaxveH2/tTlzS1wFp+7ncxNZaIEWYg3lzZRHkKf5zPT/MnEG6WL0BhHMJUabkh8GeU5NL5j+rEUCb7Ug==", - "engines": { - "node": ">=4.0.0" + "node": ">=0.10.0" } }, "node_modules/dot-prop": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", - "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-6.0.1.tgz", + "integrity": "sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==", "dependencies": { "is-obj": "^2.0.0" }, "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/dottie": { @@ -3894,56 +4077,16 @@ "resolved": "https://registry.npmjs.org/dottie/-/dottie-2.0.6.tgz", "integrity": "sha512-iGCHkfUc5kFekGiqhe8B/mdaurD+lakO9txNnTvKtA6PISrw86LgqHvRzWYPyoE2Ph5aMIrCw9/uko6XHTKCwA==" }, - "node_modules/duplexer2": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", - "integrity": "sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==", - "dependencies": { - "readable-stream": "^2.0.2" - } - }, - "node_modules/duplexer2/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/duplexer2/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/duplexer2/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/duplexer2/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/eastasianwidth": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "dev": true + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" }, "node_modules/ecc-jsbn": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", + "dev": true, "dependencies": { "jsbn": "~0.1.0", "safer-buffer": "^2.1.0" @@ -3952,7 +4095,8 @@ "node_modules/ecc-jsbn/node_modules/jsbn": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==" + "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==", + "dev": true }, "node_modules/editorconfig": { "version": "1.0.4", @@ -3972,15 +4116,6 @@ "node": ">=14" } }, - "node_modules/editorconfig/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, "node_modules/editorconfig/node_modules/commander": { "version": "10.0.1", "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", @@ -3990,18 +4125,6 @@ "node": ">=14" } }, - "node_modules/editorconfig/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/editorconfig/node_modules/minimatch": { "version": "9.0.1", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.1.tgz", @@ -4017,30 +4140,15 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/editorconfig/node_modules/semver": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", - "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "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/ejs": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.7.tgz", - "integrity": "sha512-BIar7R6abbUxDA3bfXrO4DSgwo8I+fB5/1zgujl3HLLjwd6+9iOnrT+t3grn2qbk9vOgBubXOFwX2m9axoFaGw==", + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", + "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", "dependencies": { "jake": "^10.8.5" }, @@ -4052,9 +4160,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.691", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.691.tgz", - "integrity": "sha512-vJ+/LmKja/St8Ofq4JGMFVZuwG7ECU6akjNSn2/g6nv8xbIBOWGlEs+WA8/3XaWkU0Nlyu0iFGgOxC4mpgFjgA==", + "version": "1.4.772", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.772.tgz", + "integrity": "sha512-jFfEbxR/abTTJA3ci+2ok1NTuOBBtB4jH+UT6PUmRN+DY3WSD4FFRsgoVQ+QNIJ0T7wrXwzsWCI2WKC46b++2A==", "dev": true }, "node_modules/elliptic": { @@ -4071,6 +4179,17 @@ "minimalistic-crypto-utils": "^1.0.1" } }, + "node_modules/emittery": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", + "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sindresorhus/emittery?sponsor=1" + } + }, "node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -4088,7 +4207,6 @@ "version": "0.1.13", "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", - "optional": true, "dependencies": { "iconv-lite": "^0.6.2" } @@ -4097,7 +4215,6 @@ "version": "0.6.3", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "optional": true, "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" }, @@ -4121,155 +4238,10 @@ "wrappy": "1" } }, - "node_modules/env-ci": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/env-ci/-/env-ci-5.5.0.tgz", - "integrity": "sha512-o0JdWIbOLP+WJKIUt36hz1ImQQFuN92nhsfTkHHap+J8CiI8WgGpH/a9jEGHh4/TU5BUUGjlnKXNoDb57+ne+A==", - "dependencies": { - "execa": "^5.0.0", - "fromentries": "^1.3.2", - "java-properties": "^1.0.0" - }, - "engines": { - "node": ">=10.17" - } - }, - "node_modules/env-ci/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==", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/env-ci/node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "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/env-ci/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==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/env-ci/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==", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/env-ci/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==", - "engines": { - "node": ">=6" - } - }, - "node_modules/env-ci/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==", - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/env-ci/node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/env-ci/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==", - "engines": { - "node": ">=8" - } - }, - "node_modules/env-ci/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==", - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/env-ci/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==", - "engines": { - "node": ">=8" - } - }, - "node_modules/env-ci/node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, "node_modules/env-paths": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", - "optional": true, "engines": { "node": ">=6" } @@ -4277,29 +4249,33 @@ "node_modules/err-code": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", - "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", - "optional": true + "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==" }, "node_modules/error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, "dependencies": { "is-arrayish": "^0.2.1" } }, "node_modules/es-abstract": { - "version": "1.22.5", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.5.tgz", - "integrity": "sha512-oW69R+4q2wG+Hc3KZePPZxOiisRIqfKBVo/HLx94QcJeWGU/8sZhCvc829rd1kS366vlJbzBfXf9yWwf0+Ko7w==", + "version": "1.23.3", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz", + "integrity": "sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==", "dev": true, "dependencies": { "array-buffer-byte-length": "^1.0.1", "arraybuffer.prototype.slice": "^1.0.3", "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.7", + "data-view-buffer": "^1.0.1", + "data-view-byte-length": "^1.0.1", + "data-view-byte-offset": "^1.0.0", "es-define-property": "^1.0.0", "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", "es-set-tostringtag": "^2.0.3", "es-to-primitive": "^1.2.1", "function.prototype.name": "^1.1.6", @@ -4310,10 +4286,11 @@ "has-property-descriptors": "^1.0.2", "has-proto": "^1.0.3", "has-symbols": "^1.0.3", - "hasown": "^2.0.1", + "hasown": "^2.0.2", "internal-slot": "^1.0.7", "is-array-buffer": "^3.0.4", "is-callable": "^1.2.7", + "is-data-view": "^1.0.1", "is-negative-zero": "^2.0.3", "is-regex": "^1.1.4", "is-shared-array-buffer": "^1.0.3", @@ -4324,17 +4301,17 @@ "object-keys": "^1.1.1", "object.assign": "^4.1.5", "regexp.prototype.flags": "^1.5.2", - "safe-array-concat": "^1.1.0", + "safe-array-concat": "^1.1.2", "safe-regex-test": "^1.0.3", - "string.prototype.trim": "^1.2.8", - "string.prototype.trimend": "^1.0.7", - "string.prototype.trimstart": "^1.0.7", + "string.prototype.trim": "^1.2.9", + "string.prototype.trimend": "^1.0.8", + "string.prototype.trimstart": "^1.0.8", "typed-array-buffer": "^1.0.2", "typed-array-byte-length": "^1.0.1", "typed-array-byte-offset": "^1.0.2", - "typed-array-length": "^1.0.5", + "typed-array-length": "^1.0.6", "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.14" + "which-typed-array": "^1.1.15" }, "engines": { "node": ">= 0.4" @@ -4362,10 +4339,22 @@ "node": ">= 0.4" } }, - "node_modules/es-set-tostringtag": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", - "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", + "node_modules/es-object-atoms": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", + "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", + "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", "dev": true, "dependencies": { "get-intrinsic": "^1.2.4", @@ -4459,17 +4448,32 @@ "node": ">=6" } }, + "node_modules/escape-goat": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-4.0.0.tgz", + "integrity": "sha512-2Sd4ShcWxbx6OY1IHyla/CVNwvg7XwZVoXZHcSu9w9SReNP1EzzD5T8NWKIR38fIqEns9kDWKUQTXXAmlDrdPg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "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==", + "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": ">=0.8.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/escodegen": { @@ -4493,98 +4497,67 @@ "source-map": "~0.6.1" } }, - "node_modules/escodegen/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "optional": true, - "engines": { - "node": ">=4.0" - } - }, "node_modules/eslint": { - "version": "5.14.1", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-5.14.1.tgz", - "integrity": "sha512-CyUMbmsjxedx8B0mr79mNOqetvkbij/zrXnFeK2zc3pGRn3/tibjiNAv/3UxFEyfMDjh+ZqTrJrEGBFiGfD5Og==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.0.0", - "ajv": "^6.9.1", - "chalk": "^2.1.0", - "cross-spawn": "^6.0.5", - "debug": "^4.0.1", - "doctrine": "^3.0.0", - "eslint-scope": "^4.0.0", - "eslint-utils": "^1.3.1", - "eslint-visitor-keys": "^1.0.0", - "espree": "^5.0.1", - "esquery": "^1.0.1", + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.2.0.tgz", + "integrity": "sha512-0n/I88vZpCOzO+PQpt0lbsqmn9AsnsJAQseIqhZFI8ibQT0U1AkEKRxA3EVMos0BoHSXDQvCXY25TUjB5tr8Og==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^3.0.2", + "@eslint/js": "9.2.0", + "@humanwhocodes/config-array": "^0.13.0", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.2.3", + "@nodelib/fs.walk": "^1.2.8", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^8.0.1", + "eslint-visitor-keys": "^4.0.0", + "espree": "^10.0.1", + "esquery": "^1.4.2", "esutils": "^2.0.2", - "file-entry-cache": "^5.0.1", - "functional-red-black-tree": "^1.0.1", - "glob": "^7.1.2", - "globals": "^11.7.0", - "ignore": "^4.0.6", - "import-fresh": "^3.0.0", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", "imurmurhash": "^0.1.4", - "inquirer": "^6.2.2", - "js-yaml": "^3.12.0", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.3.0", - "lodash": "^4.17.11", - "minimatch": "^3.0.4", - "mkdirp": "^0.5.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", "natural-compare": "^1.4.0", - "optionator": "^0.8.2", - "path-is-inside": "^1.0.2", - "progress": "^2.0.0", - "regexpp": "^2.0.1", - "semver": "^5.5.1", - "strip-ansi": "^4.0.0", - "strip-json-comments": "^2.0.1", - "table": "^5.2.3", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", "text-table": "^0.2.0" }, "bin": { "eslint": "bin/eslint.js" }, "engines": { - "node": "^6.14.0 || ^8.10.0 || >=9.10.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, "node_modules/eslint-config-google": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/eslint-config-google/-/eslint-config-google-0.12.0.tgz", - "integrity": "sha512-SHDM3nIRCJBACjf8c/H6FvCwRmKbphESNl3gJFBNbw4KYDLCONB3ABYLXDGF+iaVP9XSTND/Q5/PuGoFkp4xbg==", + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/eslint-config-google/-/eslint-config-google-0.14.0.tgz", + "integrity": "sha512-WsbX4WbjuMvTdeVL6+J3rK1RGhCTqjsFjX7UMSMgZiyxxaNLkoJENbrGExzERFeoTpGw3F3FypTiWAP9ZXzkEw==", "dev": true, "engines": { "node": ">=0.10.0" }, "peerDependencies": { - "eslint": ">=5.4.0" - } - }, - "node_modules/eslint-config-standard": { - "version": "12.0.0", - "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-12.0.0.tgz", - "integrity": "sha512-COUz8FnXhqFitYj4DTqHzidjIL/t4mumGZto5c7DrBpvWoie+Sn3P4sLEzUGeYhRElWuFEf8K1S1EfvD1vixCQ==", - "dev": true, - "peerDependencies": { - "eslint": ">=5.0.0", - "eslint-plugin-import": ">=2.13.0", - "eslint-plugin-node": ">=7.0.0", - "eslint-plugin-promise": ">=4.0.0", - "eslint-plugin-standard": ">=4.0.0" - } - }, - "node_modules/eslint-config-standard-jsx": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/eslint-config-standard-jsx/-/eslint-config-standard-jsx-6.0.2.tgz", - "integrity": "sha512-D+YWAoXw+2GIdbMBRAzWwr1ZtvnSf4n4yL0gKGg7ShUOGXkSOLerI17K4F6LdQMJPNMoWYqepzQD/fKY+tXNSg==", - "dev": true, - "peerDependencies": { - "eslint": ">=5.0.0", - "eslint-plugin-react": ">=7.11.1" + "eslint": ">=5.16.0" } }, "node_modules/eslint-import-resolver-node": { @@ -4661,333 +4634,155 @@ "eslint": ">=4.19.1" } }, - "node_modules/eslint-plugin-import": { - "version": "2.14.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.14.0.tgz", - "integrity": "sha512-FpuRtniD/AY6sXByma2Wr0TXvXJ4nA/2/04VPlfpmUDPOpOY264x+ILiwnrk/k4RINgDAyFZByxqPUbSQ5YE7g==", + "node_modules/eslint-plugin-node": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-7.0.1.tgz", + "integrity": "sha512-lfVw3TEqThwq0j2Ba/Ckn2ABdwmL5dkOgAux1rvOk6CO7A6yGyPI2+zIxN6FyNkp1X1X/BSvKOceD6mBWSj4Yw==", "dev": true, "dependencies": { - "contains-path": "^0.1.0", - "debug": "^2.6.8", - "doctrine": "1.5.0", - "eslint-import-resolver-node": "^0.3.1", - "eslint-module-utils": "^2.2.0", - "has": "^1.0.1", - "lodash": "^4.17.4", - "minimatch": "^3.0.3", - "read-pkg-up": "^2.0.0", - "resolve": "^1.6.0" + "eslint-plugin-es": "^1.3.1", + "eslint-utils": "^1.3.1", + "ignore": "^4.0.2", + "minimatch": "^3.0.4", + "resolve": "^1.8.1", + "semver": "^5.5.0" }, "engines": { - "node": ">=4" + "node": ">=6" }, "peerDependencies": { - "eslint": "2.x - 5.x" + "eslint": ">=4.19.1" } }, - "node_modules/eslint-plugin-import/node_modules/doctrine": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", - "integrity": "sha512-lsGyRuYr4/PIB0txi+Fy2xOMI2dGaTguCaotzFGkVZuKR5usKfcRWIFKNM3QNrU7hh/+w2bwTW+ZeXPK5l8uVg==", + "node_modules/eslint-plugin-node/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": { - "esutils": "^2.0.2", - "isarray": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "node_modules/eslint-plugin-import/node_modules/find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==", + "node_modules/eslint-plugin-node/node_modules/ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", "dev": true, - "dependencies": { - "locate-path": "^2.0.0" - }, "engines": { - "node": ">=4" + "node": ">= 4" } }, - "node_modules/eslint-plugin-import/node_modules/hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true - }, - "node_modules/eslint-plugin-import/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/eslint-plugin-import/node_modules/load-json-file": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", - "integrity": "sha512-3p6ZOGNbiX4CdvEd1VcE6yi78UrGNpjHO33noGwHCnT/o2fyllJDepsm8+mFFv/DvtwFHht5HIHSyOy5a+ChVQ==", + "node_modules/eslint-plugin-node/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": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "strip-bom": "^3.0.0" + "brace-expansion": "^1.1.7" }, "engines": { - "node": ">=4" + "node": "*" } }, - "node_modules/eslint-plugin-import/node_modules/locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==", + "node_modules/eslint-plugin-node/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/eslint-plugin-promise": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-4.0.1.tgz", + "integrity": "sha512-Si16O0+Hqz1gDHsys6RtFRrW7cCTB6P7p3OJmKp3Y3dxpQE2qwOA7d3xnV+0mBmrPoi0RBnxlCKvqu70te6wjg==", "dev": true, - "dependencies": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - }, "engines": { - "node": ">=4" + "node": ">=6" } }, - "node_modules/eslint-plugin-import/node_modules/normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "node_modules/eslint-plugin-standard": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-standard/-/eslint-plugin-standard-4.0.2.tgz", + "integrity": "sha512-nKptN8l7jksXkwFk++PhJB3cCDTcXOEyhISIN86Ue2feJ1LFyY3PrY3/xT2keXlJSY5bpmbiTG0f885/YKAvTA==", "dev": true, - "dependencies": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "peerDependencies": { + "eslint": ">=5.0.0" } }, - "node_modules/eslint-plugin-import/node_modules/p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "node_modules/eslint-scope": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.0.1.tgz", + "integrity": "sha512-pL8XjgP4ZOmmwfFE8mEhSxA7ZY4C+LWyqjQ3o4yWkkmD0qcMT9kkW3zWHOczhWcjTSgqycYAgwSlXvZltv65og==", "dev": true, "dependencies": { - "p-try": "^1.0.0" + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" }, "engines": { - "node": ">=4" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/eslint-plugin-import/node_modules/p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==", + "node_modules/eslint-utils": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz", + "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==", "dev": true, "dependencies": { - "p-limit": "^1.1.0" + "eslint-visitor-keys": "^1.1.0" }, "engines": { - "node": ">=4" + "node": ">=6" } }, - "node_modules/eslint-plugin-import/node_modules/p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==", + "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", "dev": true, "engines": { "node": ">=4" } }, - "node_modules/eslint-plugin-import/node_modules/parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==", + "node_modules/eslint-visitor-keys": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.0.0.tgz", + "integrity": "sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw==", "dev": true, - "dependencies": { - "error-ex": "^1.2.0" - }, "engines": { - "node": ">=0.10.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/eslint-plugin-import/node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "node_modules/eslint/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, - "engines": { - "node": ">=4" - } - }, - "node_modules/eslint-plugin-import/node_modules/path-type": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", - "integrity": "sha512-dUnb5dXUf+kzhC/W/F4e5/SkluXIFf5VUHolW1Eg1irn1hGWjPGdsRcvYJ1nD6lhk8Ir7VM0bHJKsYTx8Jx9OQ==", - "dev": true, - "dependencies": { - "pify": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/eslint-plugin-import/node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/eslint-plugin-import/node_modules/read-pkg": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", - "integrity": "sha512-eFIBOPW7FGjzBuk3hdXEuNSiTZS/xEMlH49HxMyzb0hyPfu4EhVjT2DH32K1hSSmVq4sebAWnZuuY5auISUTGA==", - "dev": true, - "dependencies": { - "load-json-file": "^2.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/eslint-plugin-import/node_modules/read-pkg-up": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", - "integrity": "sha512-1orxQfbWGUiTn9XsPlChs6rLie/AV9jwZTGmu2NZw/CUDJQchXJFYE0Fq5j7+n558T1JhDWLdhyd1Zj+wLY//w==", - "dev": true, - "dependencies": { - "find-up": "^2.0.0", - "read-pkg": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/eslint-plugin-import/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/eslint-plugin-node": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-7.0.1.tgz", - "integrity": "sha512-lfVw3TEqThwq0j2Ba/Ckn2ABdwmL5dkOgAux1rvOk6CO7A6yGyPI2+zIxN6FyNkp1X1X/BSvKOceD6mBWSj4Yw==", - "dev": true, - "dependencies": { - "eslint-plugin-es": "^1.3.1", - "eslint-utils": "^1.3.1", - "ignore": "^4.0.2", - "minimatch": "^3.0.4", - "resolve": "^1.8.1", - "semver": "^5.5.0" - }, - "engines": { - "node": ">=6" - }, - "peerDependencies": { - "eslint": ">=4.19.1" - } - }, - "node_modules/eslint-plugin-promise": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-4.0.1.tgz", - "integrity": "sha512-Si16O0+Hqz1gDHsys6RtFRrW7cCTB6P7p3OJmKp3Y3dxpQE2qwOA7d3xnV+0mBmrPoi0RBnxlCKvqu70te6wjg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/eslint-plugin-react": { - "version": "7.11.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.11.1.tgz", - "integrity": "sha512-cVVyMadRyW7qsIUh3FHp3u6QHNhOgVrLQYdQEB1bPWBsgbNCHdFAeNMquBMCcZJu59eNthX053L70l7gRt4SCw==", - "dev": true, - "dependencies": { - "array-includes": "^3.0.3", - "doctrine": "^2.1.0", - "has": "^1.0.3", - "jsx-ast-utils": "^2.0.1", - "prop-types": "^15.6.2" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0" - } - }, - "node_modules/eslint-plugin-react/node_modules/doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dev": true, - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/eslint-plugin-standard": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-standard/-/eslint-plugin-standard-4.0.2.tgz", - "integrity": "sha512-nKptN8l7jksXkwFk++PhJB3cCDTcXOEyhISIN86Ue2feJ1LFyY3PrY3/xT2keXlJSY5bpmbiTG0f885/YKAvTA==", - "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" - } - ], - "peerDependencies": { - "eslint": ">=5.0.0" - } - }, - "node_modules/eslint-scope": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", - "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", - "dev": true, - "dependencies": { - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/eslint-utils": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz", - "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==", - "dev": true, - "dependencies": { - "eslint-visitor-keys": "^1.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true, - "engines": { - "node": ">=4" + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, "node_modules/eslint/node_modules/debug": { @@ -5007,6 +4802,18 @@ } } }, + "node_modules/eslint/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/eslint/node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -5029,35 +4836,27 @@ } }, "node_modules/espree": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-5.0.1.tgz", - "integrity": "sha512-qWAZcWh4XE/RwzLJejfcofscgMc9CamR6Tn1+XRXNzrvUSSbiAjGOI/fggztjIi7y9VLPqnICMIPiGyr8JaZ0A==", + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.0.1.tgz", + "integrity": "sha512-MWkrWZbJsL2UwnjxTX3gG8FneachS/Mwg7tdGXce011sJd5b0JG54vat5KHnfSBODZ3Wvzd2WnjxyzsRoVv+ww==", "dev": true, "dependencies": { - "acorn": "^6.0.7", - "acorn-jsx": "^5.0.0", - "eslint-visitor-keys": "^1.0.0" + "acorn": "^8.11.3", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.0.0" }, "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/espree/node_modules/acorn": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", - "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==", - "dev": true, - "bin": { - "acorn": "bin/acorn" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, - "engines": { - "node": ">=0.4.0" + "funding": { + "url": "https://opencollective.com/eslint" } }, "node_modules/esprima": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "devOptional": true, "bin": { "esparse": "bin/esparse.js", "esvalidate": "bin/esvalidate.js" @@ -5078,15 +4877,6 @@ "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", @@ -5099,20 +4889,11 @@ "node": ">=4.0" } }, - "node_modules/esrecurse/node_modules/estraverse": { + "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/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true, + "devOptional": true, "engines": { "node": ">=4.0" } @@ -5144,11 +4925,21 @@ "es5-ext": "~0.10.14" } }, - "node_modules/eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", - "dev": true + "node_modules/event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "engines": { + "node": ">=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/eventuate": { "version": "4.0.0", @@ -5185,54 +4976,113 @@ "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==", + "node_modules/execa/node_modules/cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dependencies": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, "engines": { - "node": ">=6" + "node": ">=4.8" } }, - "node_modules/expect-ct": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/expect-ct/-/expect-ct-0.2.0.tgz", - "integrity": "sha512-6SK3MG/Bbhm8MsgyJAylg+ucIOU71/FzyFalcfu5nY19dH8y/z0tBJU0wrNBXD4B27EoQtqPF/9wqH0iYAd04g==", + "node_modules/execa/node_modules/path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", "engines": { - "node": ">=4.0.0" + "node": ">=4" } }, - "node_modules/express": { - "version": "4.17.3", - "resolved": "https://registry.npmjs.org/express/-/express-4.17.3.tgz", - "integrity": "sha512-yuSQpz5I+Ch7gFrPCk4/c+dIBKlQUxtgwqzph132bsT6qhuzss6I8cLJQz7B3rFblzd6wtcI0ZbGltH/C4LjUg==", + "node_modules/execa/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/execa/node_modules/shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", "dependencies": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.19.2", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.4.2", + "shebang-regex": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/execa/node_modules/shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/execa/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "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/exponential-backoff": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.1.tgz", + "integrity": "sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==" + }, + "node_modules/express": { + "version": "4.19.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz", + "integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.2", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.6.0", "cookie-signature": "1.0.6", "debug": "2.6.9", - "depd": "~1.1.2", + "depd": "2.0.0", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "etag": "~1.8.1", - "finalhandler": "~1.1.2", + "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.3.0", + "on-finished": "2.4.1", "parseurl": "~1.3.3", "path-to-regexp": "0.1.7", "proxy-addr": "~2.0.7", - "qs": "6.9.7", + "qs": "6.11.0", "range-parser": "~1.2.1", "safe-buffer": "5.2.1", - "send": "0.17.2", - "serve-static": "1.14.2", + "send": "0.18.0", + "serve-static": "1.15.0", "setprototypeof": "1.2.0", - "statuses": "~1.5.0", + "statuses": "2.0.1", "type-is": "~1.6.18", "utils-merge": "1.0.1", "vary": "~1.1.2" @@ -5272,72 +5122,21 @@ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.7.tgz", "integrity": "sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA==" }, - "node_modules/express/node_modules/body-parser": { - "version": "1.19.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.2.tgz", - "integrity": "sha512-SAAwOxgoCKMGs9uUAUFHygfLAyaniaoun6I8mFY9pRAJL9+Kec34aU+oIjDhTycub1jozEfEwx1W1IuOYxVSFw==", - "dependencies": { - "bytes": "3.1.2", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "~1.1.2", - "http-errors": "1.8.1", - "iconv-lite": "0.4.24", - "on-finished": "~2.3.0", - "qs": "6.9.7", - "raw-body": "2.4.3", - "type-is": "~1.6.18" - }, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/express/node_modules/cookie": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", - "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/express/node_modules/depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/express/node_modules/http-errors": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", - "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", - "dependencies": { - "depd": "~1.1.2", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.1" - }, + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", "engines": { "node": ">= 0.6" } }, - "node_modules/express/node_modules/on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", + "node_modules/express/node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", "dependencies": { - "ee-first": "1.1.1" + "side-channel": "^1.0.4" }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/express/node_modules/qs": { - "version": "6.9.7", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.7.tgz", - "integrity": "sha512-IhMFgUmuNpyRfxA90umL7ByLlgRXu6tIfKPpF5TmcfRLlLCckfP/g3IQmju6jjpu+Hh8rA+2p6A27ZSPOOHdKw==", "engines": { "node": ">=0.6" }, @@ -5345,20 +5144,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/express/node_modules/raw-body": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.3.tgz", - "integrity": "sha512-UlTNLIcu0uzb4D2f4WltY6cVjLi+/jEN4lgEUj3E04tpMDpUlkBo/eSn6zou9hum2VMNpCCUone0O0WeJim07g==", - "dependencies": { - "bytes": "3.1.2", - "http-errors": "1.8.1", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/ext": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz", @@ -5371,22 +5156,29 @@ "node_modules/extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true }, "node_modules/external-editor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", - "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz", + "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==", "dev": true, "dependencies": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", + "chardet": "^0.4.0", + "iconv-lite": "^0.4.17", "tmp": "^0.0.33" }, "engines": { - "node": ">=4" + "node": ">=0.12" } }, + "node_modules/external-editor/node_modules/chardet": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz", + "integrity": "sha512-j/Toj7f1z98Hh2cYo2BVr85EpIRWqUi7rtRSGxh/cqUjqrnJe9l9UE7IUGd2vQ2p+kSHLkSzObQPZPLUC6TQwg==", + "dev": true + }, "node_modules/extract-zip": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", @@ -5449,20 +5241,16 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", + "dev": true, "engines": [ "node >=0.6.0" ] }, - "node_modules/faker": { - "version": "5.5.3", - "resolved": "https://registry.npmjs.org/faker/-/faker-5.5.3.tgz", - "integrity": "sha512-wLTv2a28wjUyWkbnX7u/ABZBkUkIF2fCd73V6P2oFqEGEktDfzWx4UxrSqtPRw0xPRAcjeAOIiJWqZm3pP4u3g==", - "dev": true - }, "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==" + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true }, "node_modules/fast-glob": { "version": "3.3.2", @@ -5479,10 +5267,22 @@ "node": ">=8.6.0" } }, + "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-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==" + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true }, "node_modules/fast-levenshtein": { "version": "2.0.6", @@ -5490,10 +5290,15 @@ "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", "dev": true }, + "node_modules/fast-memoize": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/fast-memoize/-/fast-memoize-2.5.2.tgz", + "integrity": "sha512-Ue0LwpDYErFbmNnZSF0UH6eImUwDmogUO1jyE+JbN2gsQz/jICm1Ve7t9QT0rNSsfJt+Hs4/S3GnsDVjL4HVrw==" + }, "node_modules/fast-redact": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-redact/-/fast-redact-2.1.0.tgz", - "integrity": "sha512-0LkHpTLyadJavq9sRzzyqIoMZemWli77K2/MGOkafrR64B9ItrvZ9aT+jluvNDsv0YEHjSNhlMBtbokuoqii4A==", + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/fast-redact/-/fast-redact-3.5.0.tgz", + "integrity": "sha512-dwsoQlS7h9hMeYUq1W++23NDcBLV4KqONnITDV9DjfS3q1SgDGVrBdvvTLUotWtPSD7asWDV9/CmsZPy8Hf70A==", "engines": { "node": ">=6" } @@ -5501,7 +5306,8 @@ "node_modules/fast-safe-stringify": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", - "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==" + "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==", + "dev": true }, "node_modules/fastq": { "version": "1.17.1", @@ -5520,18 +5326,11 @@ "pend": "~1.2.0" } }, - "node_modules/feature-policy": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/feature-policy/-/feature-policy-0.3.0.tgz", - "integrity": "sha512-ZtijOTFN7TzCujt1fnNhfWPFPSHeZkesff9AXZj+UEjYBynWNUIYpC87Ve4wHzyexQsImicLu7WsC2LHq7/xrQ==", - "engines": { - "node": ">=4.0.0" - } - }, "node_modules/figures": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", "integrity": "sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA==", + "dev": true, "dependencies": { "escape-string-regexp": "^1.0.5" }, @@ -5539,16 +5338,25 @@ "node": ">=4" } }, + "node_modules/figures/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, "node_modules/file-entry-cache": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", - "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", "dev": true, "dependencies": { - "flat-cache": "^2.0.1" + "flat-cache": "^4.0.0" }, "engines": { - "node": ">=4" + "node": ">=16.0.0" } }, "node_modules/file-type": { @@ -5573,14 +5381,6 @@ "minimatch": "^5.0.1" } }, - "node_modules/filelist/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, "node_modules/filelist/node_modules/minimatch": { "version": "5.1.6", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", @@ -5593,12 +5393,12 @@ } }, "node_modules/filesize": { - "version": "8.0.7", - "resolved": "https://registry.npmjs.org/filesize/-/filesize-8.0.7.tgz", - "integrity": "sha512-pjmC+bkIF8XI7fWaH8KxHcZL3DPybs1roSKP4rKDvy20tAWwIObE4+JIseG2byfGKhud5ZnM4YSGKBz7Sh0ndQ==", + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/filesize/-/filesize-10.1.0.tgz", + "integrity": "sha512-GTLKYyBSDz3nPhlLVPjPWZCnhkd9TrrRArNcy8Z+J2cqScB7h2McAzR6NBX6nYOoWafql0roY8hrocxnZBv9CQ==", "dev": true, "engines": { - "node": ">= 0.4.0" + "node": ">= 10.4.0" } }, "node_modules/fill-range": { @@ -5613,33 +5413,22 @@ } }, "node_modules/finalhandler": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", - "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "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.3.0", + "on-finished": "2.4.1", "parseurl": "~1.3.3", - "statuses": "~1.5.0", + "statuses": "2.0.1", "unpipe": "~1.0.0" }, "engines": { "node": ">= 0.8" } }, - "node_modules/finalhandler/node_modules/on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/find-cache-dir": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", @@ -5658,12 +5447,11 @@ } }, "node_modules/find-replace": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-2.0.1.tgz", - "integrity": "sha512-LzDo3Fpa30FLIBsh6DCDnMN1KW2g4QKkqKmejlImgWY67dDFPX/x9Kh/op/GK522DchQXEvDi/wD48HKW49XOQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-3.0.0.tgz", + "integrity": "sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ==", "dependencies": { - "array-back": "^2.0.0", - "test-value": "^3.0.0" + "array-back": "^3.0.1" }, "engines": { "node": ">=4.0.0" @@ -5679,7 +5467,6 @@ "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" @@ -5691,20 +5478,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/find-versions": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/find-versions/-/find-versions-4.0.0.tgz", - "integrity": "sha512-wgpWy002tA+wgmO27buH/9KzyEOQnKsG/R0yrcjPT9BOFm0zRBVQbZ95nRGXWMywS8YR5knRbpohio0bcJABxQ==", - "dependencies": { - "semver-regex": "^3.1.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/flat": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", @@ -5715,28 +5488,22 @@ } }, "node_modules/flat-cache": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", - "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", "dev": true, "dependencies": { - "flatted": "^2.0.0", - "rimraf": "2.6.3", - "write": "1.0.3" + "flatted": "^3.2.9", + "keyv": "^4.5.4" }, "engines": { - "node": ">=4" + "node": ">=16" } }, - "node_modules/flatstr": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/flatstr/-/flatstr-1.0.12.tgz", - "integrity": "sha512-4zPxDyhCyiN2wIAtSLI6gc82/EjqZc1onI4Mz/l0pWrAlsSfYH/2ZIcU+e3oA2wDwbzIWNKwa23F8rh6+DRWkw==" - }, "node_modules/flatted": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", - "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", + "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", "dev": true }, "node_modules/follow-redirects": { @@ -5780,69 +5547,11 @@ "node": ">=8.0.0" } }, - "node_modules/foreground-child/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/foreground-child/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/foreground-child/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/foreground-child/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/foreground-child/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/forever-agent": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", + "dev": true, "engines": { "node": "*" } @@ -5860,26 +5569,49 @@ "node": ">= 6" } }, - "node_modules/formidable": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.2.1.tgz", - "integrity": "sha512-Fs9VRguL0gqGHkXS5GQiMCr1VhZBxz0JnJs4JmMp/2jL18Fmbzvv7vOFRU+U8TBkHEE/CX1qDXzJplVULgsLeg==", - "deprecated": "Please upgrade to latest, formidable@v2 or formidable@v3! Check these notes: https://bit.ly/2ZEqIau" + "node_modules/form-data-encoder": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-2.1.4.tgz", + "integrity": "sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==", + "engines": { + "node": ">= 14.17" + } }, - "node_modules/forwarded": { - "version": "0.2.0", + "node_modules/formidable": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/formidable/-/formidable-3.5.1.tgz", + "integrity": "sha512-WJWKelbRHN41m5dumb0/k8TeAx7Id/y3a+Z7QfhxP/htI9Js5zYaEDtG8uMgG0vM0lOlqnmjE99/kfpOYi/0Og==", + "dependencies": { + "dezalgo": "^1.0.4", + "hexoid": "^1.0.0", + "once": "^1.4.0" + }, + "funding": { + "url": "https://ko-fi.com/tunnckoCore/commissions" + } + }, + "node_modules/formidable/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/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/frameguard": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/frameguard/-/frameguard-3.1.0.tgz", - "integrity": "sha512-TxgSKM+7LTA6sidjOiSZK9wxY0ffMPY3Wta//MqwmX0nZuEHc8QrkV8Fh3ZhMJeiH+Uyh/tcaarImRy8u77O7g==", + "node_modules/fp-and-or": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/fp-and-or/-/fp-and-or-0.1.4.tgz", + "integrity": "sha512-+yRYRhpnFPWXSly/6V4Lw9IfOV26uu30kynGJ03PW+MnjOEQe45RZ141QcS0aJehYBYA50GfCDnsRbFJdhssRw==", "engines": { - "node": ">=4.0.0" + "node": ">=10" } }, "node_modules/fresh": { @@ -5890,51 +5622,11 @@ "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/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/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/fromentries": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/fromentries/-/fromentries-1.3.2.tgz", "integrity": "sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==", + "dev": true, "funding": [ { "type": "github", @@ -5959,6 +5651,7 @@ "version": "11.2.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", + "optional": true, "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", @@ -5968,15 +5661,32 @@ "node": ">=14.14" } }, + "node_modules/fs-extra/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "optional": true, + "engines": { + "node": ">= 10.0.0" + } + }, "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==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.3.tgz", + "integrity": "sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==", "dependencies": { - "minipass": "^3.0.0" + "minipass": "^7.0.3" }, "engines": { - "node": ">= 8" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/fs-minipass/node_modules/minipass": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.1.tgz", + "integrity": "sha512-UZ7eQ+h8ywIRAW1hIEl2AqdwzJucU/Kp59+8kkZeSvafXhZjul247BvIJjEVFVeON6d7lM46XX1HXCduKAS8VA==", + "engines": { + "node": ">=16 || 14 >=14.17" } }, "node_modules/fs.realpath": { @@ -6055,7 +5765,6 @@ "version": "4.0.4", "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz", "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==", - "optional": true, "dependencies": { "aproba": "^1.0.3 || ^2.0.0", "color-support": "^1.1.3", @@ -6070,50 +5779,6 @@ "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/gauge/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==", - "optional": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/gauge/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==", - "optional": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/gauge/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==", - "optional": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/gauge/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==", - "optional": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/generate-function": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.3.1.tgz", @@ -6176,12 +5841,14 @@ } }, "node_modules/get-stdin": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-6.0.0.tgz", - "integrity": "sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g==", - "dev": true, + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-8.0.0.tgz", + "integrity": "sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg==", "engines": { - "node": ">=4" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/get-stream": { @@ -6254,105 +5921,57 @@ "version": "0.1.7", "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", + "dev": true, "dependencies": { "assert-plus": "^1.0.0" } }, - "node_modules/git-log-parser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/git-log-parser/-/git-log-parser-1.2.0.tgz", - "integrity": "sha512-rnCVNfkTL8tdNryFuaY0fYiBWEBcgF748O6ZI61rslBvr2o7U65c2/6npCRqH40vuAhtgtDiqLTJjBVdrejCzA==", - "dependencies": { - "argv-formatter": "~1.0.0", - "spawn-error-forwarder": "~1.0.0", - "split2": "~1.0.0", - "stream-combiner2": "~1.1.1", - "through2": "~2.0.0", - "traverse": "~0.6.6" - } - }, - "node_modules/git-log-parser/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/git-log-parser/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/git-log-parser/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/git-log-parser/node_modules/split2": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/split2/-/split2-1.0.0.tgz", - "integrity": "sha512-NKywug4u4pX/AZBB1FCPzZ6/7O+Xhz1qMVbzTvvKvikjO99oPN87SkK08mEY9P63/5lWjK+wgOOgApnTg5r6qg==", - "dependencies": { - "through2": "~2.0.0" - } - }, - "node_modules/git-log-parser/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/git-log-parser/node_modules/through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dependencies": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, "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": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "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" + "minimatch": "^5.0.1", + "once": "^1.3.0" }, "engines": { - "node": "*" + "node": ">=12" }, "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==", + "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.1" + "is-glob": "^4.0.3" }, "engines": { - "node": ">= 6" + "node": ">=10.13.0" + } + }, + "node_modules/glob/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" } }, "node_modules/global-agent": { @@ -6372,49 +5991,45 @@ "node": ">=10.0" } }, - "node_modules/global-agent/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, + "node_modules/global-dirs": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.1.tgz", + "integrity": "sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==", "dependencies": { - "yallist": "^4.0.0" + "ini": "2.0.0" }, "engines": { "node": ">=10" - } - }, - "node_modules/global-agent/node_modules/semver": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", - "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" }, - "engines": { - "node": ">=10" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/globally": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/globally/-/globally-0.0.0.tgz", + "integrity": "sha512-tYG+DbE1S3kqNI4Cy7ZZ3hrniG9uOAlOWnqZVg952NFIktni+UUGSYbuwdPDuykfh/xy3G0h+OXpgqsVsJN6gQ==" + }, "node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", "dev": true, "engines": { - "node": ">=4" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/globalthis": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", - "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", "dev": true, "dependencies": { - "define-properties": "^1.1.3" + "define-properties": "^1.2.1", + "gopd": "^1.0.1" }, "engines": { "node": ">= 0.4" @@ -6442,14 +6057,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/globby/node_modules/ignore": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", - "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", - "engines": { - "node": ">= 4" - } - }, "node_modules/gopd": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", @@ -6461,32 +6068,59 @@ "url": "https://github.com/sponsors/ljharb" } }, - "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/growl": { - "version": "1.10.5", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", - "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", - "dev": true, - "engines": { - "node": ">=4.x" - } - }, - "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==", + "node_modules/got": { + "version": "12.6.1", + "resolved": "https://registry.npmjs.org/got/-/got-12.6.1.tgz", + "integrity": "sha512-mThBblvlAF1d4O5oqyvN+ZxLAYwIJK7bpMxgYqPD9okW0C3qm5FFn7k811QrcuEBwaogR3ngOFoCfs6mRv7teQ==", "dependencies": { - "minimist": "^1.2.5", - "neo-async": "^2.6.0", - "source-map": "^0.6.1", - "wordwrap": "^1.0.0" - }, - "bin": { - "handlebars": "bin/handlebars" + "@sindresorhus/is": "^5.2.0", + "@szmarczak/http-timer": "^5.0.1", + "cacheable-lookup": "^7.0.0", + "cacheable-request": "^10.2.8", + "decompress-response": "^6.0.0", + "form-data-encoder": "^2.1.2", + "get-stream": "^6.0.1", + "http2-wrapper": "^2.1.10", + "lowercase-keys": "^3.0.0", + "p-cancelable": "^3.0.0", + "responselike": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sindresorhus/got?sponsor=1" + } + }, + "node_modules/got/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==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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/handlebars": { + "version": "4.7.8", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", + "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", + "dev": true, + "dependencies": { + "minimist": "^1.2.5", + "neo-async": "^2.6.2", + "source-map": "^0.6.1", + "wordwrap": "^1.0.0" + }, + "bin": { + "handlebars": "bin/handlebars" }, "engines": { "node": ">=0.4.7" @@ -6499,6 +6133,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==", + "dev": true, "engines": { "node": ">=4" } @@ -6508,6 +6143,7 @@ "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", "deprecated": "this library is no longer supported", + "dev": true, "dependencies": { "ajv": "^6.12.3", "har-schema": "^2.0.0" @@ -6516,14 +6152,6 @@ "node": ">=6" } }, - "node_modules/hard-rejection": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", - "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", - "engines": { - "node": ">=6" - } - }, "node_modules/has": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/has/-/has-1.0.4.tgz", @@ -6545,6 +6173,15 @@ "node": ">=0.10.0" } }, + "node_modules/has-ansi/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==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/has-bigints": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", @@ -6555,11 +6192,11 @@ } }, "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==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "engines": { - "node": ">=4" + "node": ">=8" } }, "node_modules/has-property-descriptors": { @@ -6613,8 +6250,18 @@ "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==", - "optional": true + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==" + }, + "node_modules/has-yarn": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-3.0.0.tgz", + "integrity": "sha512-IrsVwUHhEULx3R8f/aA8AHuEzAorplsab/v8HBzEiIukwq5i/EC+xmOW+HfP1OaDP+2JkgT1yILHN2O3UFIbcA==", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, "node_modules/hash.js": { "version": "1.1.7", @@ -6654,9 +6301,9 @@ } }, "node_modules/hasown": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.1.tgz", - "integrity": "sha512-1/th4MHjnwncwXsIW6QMzlvYL9kG5e/CpVvLRZe4XPa8TOUNbCELqmvhDmnkNsAjwaG4+I8gJJL0JBvTTLO9qA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", "dependencies": { "function-bind": "^1.1.2" }, @@ -6674,58 +6321,19 @@ } }, "node_modules/helmet": { - "version": "3.21.2", - "resolved": "https://registry.npmjs.org/helmet/-/helmet-3.21.2.tgz", - "integrity": "sha512-okUo+MeWgg00cKB8Csblu8EXgcIoDyb5ZS/3u0W4spCimeVuCUvVZ6Vj3O2VJ1Sxpyb8jCDvzu0L1KKT11pkIg==", - "dependencies": { - "depd": "2.0.0", - "dns-prefetch-control": "0.2.0", - "dont-sniff-mimetype": "1.1.0", - "expect-ct": "0.2.0", - "feature-policy": "0.3.0", - "frameguard": "3.1.0", - "helmet-crossdomain": "0.4.0", - "helmet-csp": "2.9.4", - "hide-powered-by": "1.1.0", - "hpkp": "2.0.0", - "hsts": "2.2.0", - "ienoopen": "1.1.0", - "nocache": "2.1.0", - "referrer-policy": "1.2.0", - "x-xss-protection": "1.3.0" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/helmet-crossdomain": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/helmet-crossdomain/-/helmet-crossdomain-0.4.0.tgz", - "integrity": "sha512-AB4DTykRw3HCOxovD1nPR16hllrVImeFp5VBV9/twj66lJ2nU75DP8FPL0/Jp4jj79JhTfG+pFI2MD02kWJ+fA==", - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/helmet-csp": { - "version": "2.9.4", - "resolved": "https://registry.npmjs.org/helmet-csp/-/helmet-csp-2.9.4.tgz", - "integrity": "sha512-qUgGx8+yk7Xl8XFEGI4MFu1oNmulxhQVTlV8HP8tV3tpfslCs30OZz/9uQqsWPvDISiu/NwrrCowsZBhFADYqg==", - "dependencies": { - "bowser": "^2.7.0", - "camelize": "1.0.0", - "content-security-policy-builder": "2.1.0", - "dasherize": "2.0.0" - }, + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/helmet/-/helmet-7.1.0.tgz", + "integrity": "sha512-g+HZqgfbpXdCkme/Cd/mZkV0aV3BZZZSugecH03kl38m/Kmdx8jKjBikpDj2cr+Iynv4KpYEviojNdTJActJAg==", "engines": { - "node": ">=4.0.0" + "node": ">=16.0.0" } }, - "node_modules/hide-powered-by": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/hide-powered-by/-/hide-powered-by-1.1.0.tgz", - "integrity": "sha512-Io1zA2yOA1YJslkr+AJlWSf2yWFkKjvkcL9Ni1XSUqnGLr/qRQe2UI3Cn/J9MsJht7yEVCe0SscY1HgVMujbgg==", + "node_modules/hexoid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hexoid/-/hexoid-1.0.0.tgz", + "integrity": "sha512-QFLV0taWQOZtvIRIAdBChesmogZrtuXvVWsFHZTk2SU+anspqZ2vMnoLg7IE1+Uk16N19APic1BuF8bC8c2m5g==", "engines": { - "node": ">=4.0.0" + "node": ">=8" } }, "node_modules/hmac-drbg": { @@ -6738,50 +6346,23 @@ "minimalistic-crypto-utils": "^1.0.1" } }, - "node_modules/hook-std": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/hook-std/-/hook-std-2.0.0.tgz", - "integrity": "sha512-zZ6T5WcuBMIUVh49iPQS9t977t7C0l7OtHrpeMb5uk48JdflRX0NSFvCekfYNmGQETnLq9W/isMyHl69kxGi8g==", - "engines": { - "node": ">=8" - } - }, "node_modules/hosted-git-info": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", - "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-5.2.1.tgz", + "integrity": "sha512-xIcQYMnhcx2Nr4JTjsFmwwnr9vldugPy9uVm0o87bjqqWMv9GaqsTeT+i99wTl0mk1uLxJtHxLb8kymqTENQsw==", "dependencies": { - "lru-cache": "^6.0.0" + "lru-cache": "^7.5.1" }, "engines": { - "node": ">=10" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, "node_modules/hosted-git-info/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/hpkp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/hpkp/-/hpkp-2.0.0.tgz", - "integrity": "sha512-TaZpC6cO/k3DFsjfzz1LnOobbVSq+J+7WpJxrVtN4L+8+BPQj8iBDRB2Dx49613N+e7/+ZSQ9ra+xZm7Blf4wg==" - }, - "node_modules/hsts": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/hsts/-/hsts-2.2.0.tgz", - "integrity": "sha512-ToaTnQ2TbJkochoVcdXYm4HOCliNozlviNsg+X2XQLQvZNI/kCHR9rZxVYpJB3UPcHz80PgxRyWQ7PdU1r+VBQ==", - "dependencies": { - "depd": "2.0.0" - }, + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", "engines": { - "node": ">=4.0.0" + "node": ">=12" } }, "node_modules/html-escaper": { @@ -6793,8 +6374,7 @@ "node_modules/http-cache-semantics": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", - "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", - "optional": true + "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==" }, "node_modules/http-errors": { "version": "2.0.0", @@ -6811,24 +6391,17 @@ "node": ">= 0.8" } }, - "node_modules/http-errors/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/http-proxy-agent": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", - "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", "dependencies": { - "agent-base": "^7.1.0", - "debug": "^4.3.4" + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" }, "engines": { - "node": ">= 14" + "node": ">= 6" } }, "node_modules/http-proxy-agent/node_modules/debug": { @@ -6872,17 +6445,41 @@ "node": ">=0.10" } }, + "node_modules/http2-wrapper": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.2.1.tgz", + "integrity": "sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==", + "dependencies": { + "quick-lru": "^5.1.1", + "resolve-alpn": "^1.2.0" + }, + "engines": { + "node": ">=10.19.0" + } + }, "node_modules/httpntlm": { - "version": "1.7.7", - "resolved": "https://registry.npmjs.org/httpntlm/-/httpntlm-1.7.7.tgz", - "integrity": "sha512-Pv2Rvrz8H0qv1Dne5mAdZ9JegG1uc6Vu5lwLflIY6s8RKHdZQbW39L4dYswSgqMDT0pkJILUTKjeyU0VPNRZjA==", + "version": "1.8.13", + "resolved": "https://registry.npmjs.org/httpntlm/-/httpntlm-1.8.13.tgz", + "integrity": "sha512-2F2FDPiWT4rewPzNMg3uPhNkP3NExENlUGADRUDPQvuftuUTGW98nLZtGemCIW3G40VhWZYgkIDcQFAwZ3mf2Q==", "dev": true, + "funding": [ + { + "type": "paypal", + "url": "https://www.paypal.com/donate/?hosted_button_id=2CKNJLZJBW8ZC" + }, + { + "type": "buymeacoffee", + "url": "https://www.buymeacoffee.com/samdecrock" + } + ], "dependencies": { + "des.js": "^1.0.1", "httpreq": ">=0.4.22", + "js-md4": "^0.3.2", "underscore": "~1.12.1" }, "engines": { - "node": ">=0.8.0" + "node": ">=10.4.0" } }, "node_modules/httpntlm/node_modules/underscore": { @@ -6906,15 +6503,15 @@ "integrity": "sha512-4EC57ddXrkaF0x83Oj8sM6SLQHAWXw90Skqu2M4AEWENZ3F02dFJE/GARA8igO79tcgYqGrD7ae4f5L3um2lgg==" }, "node_modules/https-proxy-agent": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.4.tgz", - "integrity": "sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg==", + "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": "^7.0.2", + "agent-base": "6", "debug": "4" }, "engines": { - "node": ">= 14" + "node": ">= 6" } }, "node_modules/https-proxy-agent/node_modules/debug": { @@ -6938,19 +6535,10 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, - "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==", - "engines": { - "node": ">=10.17.0" - } - }, "node_modules/humanize-ms": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", - "optional": true, "dependencies": { "ms": "^2.0.0" } @@ -6985,27 +6573,36 @@ } ] }, - "node_modules/ienoopen": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/ienoopen/-/ienoopen-1.1.0.tgz", - "integrity": "sha512-MFs36e/ca6ohEKtinTJ5VvAJ6oDRAYFdYXweUnGY9L9vcoqFOU4n2ZhmJ0C4z/cwGZ3YIQRSB3XZ1+ghZkY5NQ==", + "node_modules/ignore": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", + "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", "engines": { - "node": ">=4.0.0" + "node": ">= 4" } }, - "node_modules/ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "dev": true, + "node_modules/ignore-walk": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-6.0.5.tgz", + "integrity": "sha512-VuuG0wCnjhnylG1ABXT3dAuIpTNDs/G8jlpmwXY03fXoXy/8ZK8/T+hMzt8L4WnrLCJgdybqgPagnF/f97cg3A==", + "dependencies": { + "minimatch": "^9.0.0" + }, "engines": { - "node": ">= 4" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, + "node_modules/immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==", + "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" @@ -7017,22 +6614,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/import-from": { + "node_modules/import-lazy": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/import-from/-/import-from-4.0.0.tgz", - "integrity": "sha512-P9J71vT5nLlDeV8FHs5nNxaLbrpfAV5cF5srvbZfpwpcJoM/xZR3hiv+q+SAnuSmuGbXMWud063iIMx/V/EWZQ==", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz", + "integrity": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==", "engines": { - "node": ">=12.2" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8" } }, "node_modules/imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "devOptional": true, "engines": { "node": ">=0.8.19" } @@ -7048,8 +6641,7 @@ "node_modules/infer-owner": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", - "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", - "optional": true + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==" }, "node_modules/inflection": { "version": "1.13.4", @@ -7082,23 +6674,23 @@ } }, "node_modules/inquirer": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.5.2.tgz", - "integrity": "sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-5.2.0.tgz", + "integrity": "sha512-E9BmnJbAKLPGonz0HeWHtbKf+EeSP93paWO3ZYoUpq/aowXvYGjjCSuashhXPpzbArIjBbji39THkxTz9ZeEUQ==", "dev": true, "dependencies": { - "ansi-escapes": "^3.2.0", - "chalk": "^2.4.2", + "ansi-escapes": "^3.0.0", + "chalk": "^2.0.0", "cli-cursor": "^2.1.0", "cli-width": "^2.0.0", - "external-editor": "^3.0.3", + "external-editor": "^2.1.0", "figures": "^2.0.0", - "lodash": "^4.17.12", + "lodash": "^4.3.0", "mute-stream": "0.0.7", "run-async": "^2.2.0", - "rxjs": "^6.4.0", + "rxjs": "^5.5.2", "string-width": "^2.1.0", - "strip-ansi": "^5.1.0", + "strip-ansi": "^4.0.0", "through": "^2.3.6" }, "engines": { @@ -7106,74 +6698,145 @@ } }, "node_modules/inquirer/node_modules/ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", + "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", "dev": true, "engines": { - "node": ">=6" + "node": ">=4" } }, - "node_modules/inquirer/node_modules/strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "node_modules/inquirer/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "dependencies": { - "ansi-regex": "^4.1.0" + "color-convert": "^1.9.0" }, "engines": { - "node": ">=6" + "node": ">=4" } }, - "node_modules/internal-slot": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", - "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", + "node_modules/inquirer/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "dependencies": { - "es-errors": "^1.3.0", - "hasown": "^2.0.0", - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">= 0.4" - } - }, - "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" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=4" } }, - "node_modules/ip-address": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", - "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==", - "optional": true, + "node_modules/inquirer/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, "dependencies": { - "jsbn": "1.1.0", - "sprintf-js": "^1.1.3" - }, - "engines": { - "node": ">= 12" + "color-name": "1.1.3" } }, - "node_modules/ip-address/node_modules/sprintf-js": { + "node_modules/inquirer/node_modules/color-name": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", - "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", - "optional": true - }, + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/inquirer/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/inquirer/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/inquirer/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==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/inquirer/node_modules/string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "dependencies": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/inquirer/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==", + "dev": true, + "dependencies": { + "ansi-regex": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/inquirer/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/internal-slot": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", + "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0", + "hasown": "^2.0.0", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/ip-address": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", + "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==", + "dependencies": { + "jsbn": "1.1.0", + "sprintf-js": "^1.1.3" + }, + "engines": { + "node": ">= 12" + } + }, "node_modules/ip-regex": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", @@ -7221,7 +6884,8 @@ "node_modules/is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true }, "node_modules/is-bigint": { "version": "1.0.4", @@ -7281,6 +6945,17 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-ci": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz", + "integrity": "sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==", + "dependencies": { + "ci-info": "^3.2.0" + }, + "bin": { + "is-ci": "bin.js" + } + }, "node_modules/is-core-module": { "version": "2.13.1", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", @@ -7292,6 +6967,21 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-data-view": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz", + "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==", + "dev": true, + "dependencies": { + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-date-object": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", @@ -7328,12 +7018,11 @@ } }, "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==", - "devOptional": true, + "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": ">=4" + "node": ">=8" } }, "node_modules/is-glob": { @@ -7347,6 +7036,21 @@ "node": ">=0.10.0" } }, + "node_modules/is-installed-globally": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", + "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", + "dependencies": { + "global-dirs": "^3.0.0", + "is-path-inside": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-ip": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-ip/-/is-ip-2.0.0.tgz", @@ -7362,8 +7066,7 @@ "node_modules/is-lambda": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", - "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==", - "optional": true + "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==" }, "node_modules/is-negative-zero": { "version": "2.0.3", @@ -7377,6 +7080,17 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-npm": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-6.0.0.tgz", + "integrity": "sha512-JEjxbSmtPSt1c8XTkVrlujcXdKV1/tvuQ7GwKcAlyiVLeYFQ2VHat8xfrDJsIkhCdF/tZ7CiIR3sy141c6+gPQ==", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "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", @@ -7416,14 +7130,6 @@ "node": ">=8" } }, - "node_modules/is-path-cwd": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", - "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", - "engines": { - "node": ">=6" - } - }, "node_modules/is-path-inside": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", @@ -7433,19 +7139,12 @@ } }, "node_modules/is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-plain-object": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", - "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "dev": true, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, "node_modules/is-promise": { @@ -7542,17 +7241,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-text-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-1.0.1.tgz", - "integrity": "sha512-xFuJpne9oFz5qDaodwmmG08e3CawH/2ZV8Qqza1Ko7Sk8POWbkRdwIoAWVhqvq0XeUzANEhKo2n0IXUGBm7A/w==", - "dependencies": { - "text-extensions": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/is-typed-array": { "version": "1.1.13", "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", @@ -7612,6 +7300,14 @@ "node": ">=0.10.0" } }, + "node_modules/is-yarn-global": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.4.1.tgz", + "integrity": "sha512-/kppl+R+LO5VmhYSEWARUFjodS25D68gvj8W7z0I7OWhUla5xWu8KL6CtB2V0R6yqhnRgbcaREMr4EEM6htLPQ==", + "engines": { + "node": ">=12" + } + }, "node_modules/is2": { "version": "2.0.9", "resolved": "https://registry.npmjs.org/is2/-/is2-2.0.9.tgz", @@ -7648,22 +7344,8 @@ "node_modules/isstream": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==" - }, - "node_modules/issue-parser": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/issue-parser/-/issue-parser-6.0.0.tgz", - "integrity": "sha512-zKa/Dxq2lGsBIXQ7CUZWTHfvxPC2ej0KfO7fIPqLlHB9J2hJ7rGhZ5rilhuufylr4RXYPzJUeFjKxz305OsNlA==", - "dependencies": { - "lodash.capitalize": "^4.2.1", - "lodash.escaperegexp": "^4.1.2", - "lodash.isplainobject": "^4.0.6", - "lodash.isstring": "^4.0.1", - "lodash.uniqby": "^4.7.0" - }, - "engines": { - "node": ">=10.13" - } + "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==", + "dev": true }, "node_modules/istanbul-lib-coverage": { "version": "3.2.2", @@ -7727,87 +7409,73 @@ "node": ">=8" } }, - "node_modules/istanbul-lib-processinfo/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==", + "node_modules/istanbul-lib-processinfo/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": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/istanbul-lib-processinfo/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" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "node_modules/istanbul-lib-processinfo/node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "node_modules/istanbul-lib-processinfo/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": { - "glob": "^7.1.3" + "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" }, - "bin": { - "rimraf": "bin.js" + "engines": { + "node": "*" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/istanbul-lib-processinfo/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==", + "node_modules/istanbul-lib-processinfo/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": { - "shebang-regex": "^3.0.0" + "brace-expansion": "^1.1.7" }, "engines": { - "node": ">=8" + "node": "*" } }, - "node_modules/istanbul-lib-processinfo/node_modules/shebang-regex": { + "node_modules/istanbul-lib-processinfo/node_modules/p-map": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", + "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", "dev": true, + "dependencies": { + "aggregate-error": "^3.0.0" + }, "engines": { "node": ">=8" } }, - "node_modules/istanbul-lib-processinfo/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==", - "dev": true, - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/istanbul-lib-processinfo/node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "node_modules/istanbul-lib-processinfo/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": { - "isexe": "^2.0.0" + "glob": "^7.1.3" }, "bin": { - "node-which": "bin/node-which" + "rimraf": "bin.js" }, - "engines": { - "node": ">= 8" + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/istanbul-lib-report": { @@ -7824,31 +7492,10 @@ "node": ">=10" } }, - "node_modules/istanbul-lib-report/node_modules/has-flag": { + "node_modules/istanbul-lib-report/node_modules/make-dir": { "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/istanbul-lib-report/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/istanbul-lib-report/node_modules/make-dir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", - "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", "dev": true, "dependencies": { "semver": "^7.5.3" @@ -7860,33 +7507,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/istanbul-lib-report/node_modules/semver": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", - "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-lib-report/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/istanbul-lib-source-maps": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", @@ -7941,7 +7561,6 @@ "version": "2.3.6", "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", - "dev": true, "dependencies": { "@isaacs/cliui": "^8.0.2" }, @@ -7956,9 +7575,9 @@ } }, "node_modules/jake": { - "version": "10.8.7", - "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.7.tgz", - "integrity": "sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w==", + "version": "10.9.1", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.1.tgz", + "integrity": "sha512-61btcOHNnLnsOdtLgA5efqQWjnSi/vow5HbI7HMdKKWqvrKR1bLK3BPlJn9gcSaP2ewuamUSMB5XEy76KUIS2w==", "dependencies": { "async": "^3.2.3", "chalk": "^4.0.2", @@ -7972,76 +7591,38 @@ "node": ">=10" } }, - "node_modules/jake/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/jake/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/jake/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": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "node_modules/jake/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/jake/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": { - "color-name": "~1.1.4" + "brace-expansion": "^1.1.7" }, "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jake/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/jake/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": "*" } }, - "node_modules/jake/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/jju": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/jju/-/jju-1.4.0.tgz", + "integrity": "sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==" }, - "node_modules/java-properties": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/java-properties/-/java-properties-1.0.2.tgz", - "integrity": "sha512-qjdpeo2yKlYTH7nFdK0vbZWuTCesk4o63v5iVOlhMQPfuIZQfW/HI35SjfhA+4qpg36rnFSvUK5b1m+ckIblQQ==", - "engines": { - "node": ">= 0.6.0" + "node_modules/jose": { + "version": "4.14.4", + "resolved": "https://registry.npmjs.org/jose/-/jose-4.14.4.tgz", + "integrity": "sha512-j8GhLiKmUAh+dsFXlX1aJCbt5KMibuKb+d7j1JaOJG6s2UjX1PQlW+OKB/sD4a/5ZYF4RcmYmLSndOoU3Lt/3g==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/panva" } }, "node_modules/js-beautify": { @@ -8065,27 +7646,13 @@ "node": ">=14" } }, - "node_modules/js-beautify/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/js-beautify/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==", + "node_modules/js-beautify/node_modules/abbrev": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-2.0.0.tgz", + "integrity": "sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==", "dev": true, - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, "engines": { - "node": ">= 8" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/js-beautify/node_modules/foreground-child": { @@ -8105,79 +7672,49 @@ } }, "node_modules/js-beautify/node_modules/glob": { - "version": "10.3.10", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", - "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", + "version": "10.3.15", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.15.tgz", + "integrity": "sha512-0c6RlJt1TICLyvJYIApxb8GsXoai0KUP7AxKKAtsYXdgJR1mGEUa7DgwShbdk1nly0PYoZj01xd4hzbq3fsjpw==", "dev": true, "dependencies": { "foreground-child": "^3.1.0", - "jackspeak": "^2.3.5", + "jackspeak": "^2.3.6", "minimatch": "^9.0.1", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", - "path-scurry": "^1.10.1" + "minipass": "^7.0.4", + "path-scurry": "^1.11.0" }, "bin": { "glob": "dist/esm/bin.mjs" }, "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/js-beautify/node_modules/minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" + "node": ">=16 || 14 >=14.18" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/js-beautify/node_modules/minipass": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", - "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.1.tgz", + "integrity": "sha512-UZ7eQ+h8ywIRAW1hIEl2AqdwzJucU/Kp59+8kkZeSvafXhZjul247BvIJjEVFVeON6d7lM46XX1HXCduKAS8VA==", "dev": true, "engines": { "node": ">=16 || 14 >=14.17" } }, - "node_modules/js-beautify/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/js-beautify/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==", + "node_modules/js-beautify/node_modules/nopt": { + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-7.2.1.tgz", + "integrity": "sha512-taM24ViiimT/XntxbPyJQzCG+p4EKOpgD3mxFwW38mGjVUrfERQOeY4EDHjdnptttfHuHQXFx+lTP08Q+mLa/w==", "dev": true, "dependencies": { - "shebang-regex": "^3.0.0" + "abbrev": "^2.0.0" + }, + "bin": { + "nopt": "bin/nopt.js" }, "engines": { - "node": ">=8" - } - }, - "node_modules/js-beautify/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": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/js-beautify/node_modules/signal-exit": { @@ -8192,21 +7729,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/js-beautify/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/js-cookie": { "version": "3.0.5", "resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-3.0.5.tgz", @@ -8216,24 +7738,30 @@ "node": ">=14" } }, + "node_modules/js-md4": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/js-md4/-/js-md4-0.3.2.tgz", + "integrity": "sha512-/GDnfQYsltsjRswQhN9fhv3EMw2sCpUdrdxyWDOUK7eyD++r3gRhzgiQgc/x4MAv2i1iuQ4lxO5mvqM3vj4bwA==", + "dev": true + }, "node_modules/js-sha512": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/js-sha512/-/js-sha512-0.8.0.tgz", - "integrity": "sha512-PWsmefG6Jkodqt+ePTvBZCSMFgN7Clckjd0O7su3I0+BW2QWUTJNzjktHsztGLhncP2h8mcF9V9Y2Ha59pAViQ==", + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/js-sha512/-/js-sha512-0.9.0.tgz", + "integrity": "sha512-mirki9WS/SUahm+1TbAPkqvbCiCfOAAsyXeHxK1UkullnJVVqoJG2pL9ObvT05CN+tM7fxhfYm0NbXn+1hWoZg==", "dev": true }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true }, "node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" + "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" @@ -8242,8 +7770,7 @@ "node_modules/jsbn": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz", - "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==", - "optional": true + "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==" }, "node_modules/jsesc": { "version": "2.5.2", @@ -8257,25 +7784,43 @@ "node": ">=4" } }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==" + }, "node_modules/json-parse-better-errors": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==" }, "node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.2.tgz", + "integrity": "sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ==", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/json-parse-helpfulerror": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/json-parse-helpfulerror/-/json-parse-helpfulerror-1.0.3.tgz", + "integrity": "sha512-XgP0FGR77+QhUxjXkwOMkC94k3WtqEBfcnjWqhRd82qTat4SWKRE+9kUnynz/shm3I4ea2+qISvTIeGTNU7kJg==", + "dependencies": { + "jju": "^1.1.0" + } }, "node_modules/json-schema": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", - "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", + "dev": true }, "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==" + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true }, "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", @@ -8286,13 +7831,13 @@ "node_modules/json-stringify-safe": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==" + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", + "dev": true }, "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" }, @@ -8304,6 +7849,7 @@ "version": "6.1.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "devOptional": true, "dependencies": { "universalify": "^2.0.0" }, @@ -8311,6 +7857,20 @@ "graceful-fs": "^4.1.6" } }, + "node_modules/jsonfile/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "devOptional": true, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/jsonlines": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsonlines/-/jsonlines-0.1.1.tgz", + "integrity": "sha512-ekDrAGso79Cvf+dtm+mL8OBI2bmAOt3gssYs833De/C9NmIpWDWyUO4zPgB5x2/OhY366dkhgfPMYfwZF7yOZA==" + }, "node_modules/jsonparse": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", @@ -8320,24 +7880,9 @@ ] }, "node_modules/jsonschema": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/jsonschema/-/jsonschema-1.2.5.tgz", - "integrity": "sha512-kVTF+08x25PQ0CjuVc0gRM9EUPb0Fe9Ln/utFOgcdxEIOHuU7ooBk/UPTd7t1M91pP35m0MU1T8M5P7vP1bRRw==", - "engines": { - "node": "*" - } - }, - "node_modules/JSONStream": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", - "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", - "dependencies": { - "jsonparse": "^1.2.0", - "through": ">=2.2.7 <3" - }, - "bin": { - "JSONStream": "bin.js" - }, + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsonschema/-/jsonschema-1.4.1.tgz", + "integrity": "sha512-S6cATIPVv1z0IlxdN+zUk5EPjkGCdnhN4wVSBlvoUO1tOLJootbo9CquNJmbIh4yikWHiUedhRYrNPn1arpEmQ==", "engines": { "node": "*" } @@ -8371,9 +7916,9 @@ } }, "node_modules/just-extend": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.2.1.tgz", - "integrity": "sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-6.2.0.tgz", + "integrity": "sha512-cYofQu2Xpom82S6qD778jBDpwvvy39s1l/hrYij2u9AMdQcGRpaBu6kY4mVhuno5kJVi1DAz4aiphA2WI1/OAw==", "dev": true }, "node_modules/jwk-to-pem": { @@ -8387,9 +7932,9 @@ } }, "node_modules/keycloak-connect": { - "version": "24.0.1", - "resolved": "https://registry.npmjs.org/keycloak-connect/-/keycloak-connect-24.0.1.tgz", - "integrity": "sha512-DlXI6fPR+t58pKVECxvOua5S/rws0CU3yz2juxKQor4b8PKoY0sN/QZ2vxBGPHmvMKtH8VodmPJA2k/VoiD5uw==", + "version": "24.0.4", + "resolved": "https://registry.npmjs.org/keycloak-connect/-/keycloak-connect-24.0.4.tgz", + "integrity": "sha512-MaXcNEvvNM7z4QBw2oBAj7iAkH8BFMIO3REP6eXok5C6CfKC0ljS4byeXic6EQ0tBT5OtV9s4Xcv4aCqSWHtZA==", "dependencies": { "jwk-to-pem": "^2.0.0" }, @@ -8400,31 +7945,57 @@ "chromedriver": "latest" } }, - "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==", + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/kleur": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", + "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", "engines": { - "node": ">=0.10.0" + "node": ">=6" } }, - "node_modules/levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", - "dev": true, + "node_modules/latest-version": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-7.0.0.tgz", + "integrity": "sha512-KvNT4XqAMzdcL6ka6Tl3i2lYeFDgXNCuIX+xNx6ZMVR1dFq+idXd9FLKNMOIx0t9mJ9/HudyX4oZWXZQ0UJHeg==", "dependencies": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" + "package-json": "^8.1.0" }, "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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/lie": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.1.1.tgz", + "integrity": "sha512-RiNhHysUjhrDQntfYSfY4MU24coXXdEOgw9WGcKHNeEwffDYbF//u87M1EWaMGzuFoSbqW0C9C6lEEhDOAswfw==", + "dev": true, + "dependencies": { + "immediate": "~3.0.5" + } }, "node_modules/liquid-json": { "version": "0.3.1", @@ -8439,6 +8010,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", "integrity": "sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==", + "dev": true, "dependencies": { "graceful-fs": "^4.1.2", "parse-json": "^4.0.0", @@ -8449,31 +8021,28 @@ "node": ">=4" } }, - "node_modules/load-json-file/node_modules/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", - "dependencies": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/load-json-file/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/localforage": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/localforage/-/localforage-1.10.0.tgz", + "integrity": "sha512-14/H1aX7hzBBmmh7sGPd+AOMkkIrHM3Z1PAyGgZigA1H1p5O5ANnMyWzvpAETtG68/dC4pC0ncy3+PPGzXZHPg==", + "dev": true, + "dependencies": { + "lie": "3.1.1" + } + }, "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" }, @@ -8489,56 +8058,42 @@ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, + "node_modules/lodash.assignwith": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.assignwith/-/lodash.assignwith-4.2.0.tgz", + "integrity": "sha512-ZznplvbvtjK2gMvnQ1BR/zqPFZmS6jbK4p+6Up4xcRYA7yMIwxHCfbTcrYxXKzzqLsQ05eJPVznEW3tuwV7k1g==" + }, "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.capitalize": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/lodash.capitalize/-/lodash.capitalize-4.2.1.tgz", - "integrity": "sha512-kZzYOKspf8XVX5AvmQF94gQW0lejFVgb80G85bU4ZWzoJ6C03PQg3coYAUpSTpQWelrZELd3XWgHzw4Ck5kaIw==" - }, - "node_modules/lodash.escaperegexp": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz", - "integrity": "sha512-TM9YBvyC84ZxE3rgfefxUWiQKLilstD6k7PTGt6wfbtXF8ixIJLOL3VYyV/z+ZiPLsVxAsKAFVwWlWeb2Y8Yyw==" - }, "node_modules/lodash.flattendeep": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", "integrity": "sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==", "dev": true }, + "node_modules/lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==" + }, + "node_modules/lodash.isequal": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", + "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==" + }, "node_modules/lodash.isfinite": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/lodash.isfinite/-/lodash.isfinite-3.3.2.tgz", "integrity": "sha512-7FGG40uhC8Mm633uKW1r58aElFlBlxCrg9JfSi3P6aYiWmfiWF0PgMd86ZUsxE5GwWPdHoS2+48bwTh2VPkIQA==" }, - "node_modules/lodash.ismatch": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.ismatch/-/lodash.ismatch-4.4.0.tgz", - "integrity": "sha512-fPMfXjGQEV9Xsq/8MTSgUf255gawYRbjwMyDbcvDhXgV7enSZA0hynz6vMPnpAb5iONEzBHBPsT+0zes5Z301g==" - }, - "node_modules/lodash.isplainobject": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", - "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==" - }, - "node_modules/lodash.isstring": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", - "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==" - }, - "node_modules/lodash.padend": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/lodash.padend/-/lodash.padend-4.6.1.tgz", - "integrity": "sha512-sOQs2aqGpbl27tmCS1QNZA09Uqp01ZzWfDUoD+xzTii0E7dSQfRKcRetFwa+uXaxaqL+TKm7CgD2JdKP7aZBSw==" - }, - "node_modules/lodash.uniqby": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/lodash.uniqby/-/lodash.uniqby-4.7.0.tgz", - "integrity": "sha512-e/zcLx6CSbmaEgFHCA7BnoQKyCtKMxnuWrJygbwPs/AIn+IMKl66L8/s+wBUn5LRw2pZx3bUHibiV1b6aTWIww==" + "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/log-symbols": { "version": "4.1.0", @@ -8556,82 +8111,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/log-symbols/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/log-symbols/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "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/log-symbols/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/log-symbols/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/log-symbols/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/log-symbols/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/lolex": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lolex/-/lolex-4.2.0.tgz", - "integrity": "sha512-gKO5uExCXvSm6zbF562EvM+rd1kQDnB9AZBbiQVzf1ZmdDpxUSvpnAaVOP83N/31mRK8Ml8/VE8DMvsAZQ+7wg==", - "dev": true - }, "node_modules/long": { "version": "5.2.3", "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz", @@ -8649,6 +8128,26 @@ "loose-envify": "cli.js" } }, + "node_modules/loupe": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.1.tgz", + "integrity": "sha512-edNu/8D5MKVfGVFRhFf8aAxiTM6Wumfz5XsaatSxlD3w4R1d/WEKUTydCdPGbl9K7QG/Ca3GnDV2sIKIpXRQcw==", + "dev": true, + "dependencies": { + "get-func-name": "^2.0.1" + } + }, + "node_modules/lowercase-keys": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz", + "integrity": "sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/lru-cache": { "version": "8.0.5", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-8.0.5.tgz", @@ -8691,345 +8190,94 @@ } }, "node_modules/make-fetch-happen": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-9.1.0.tgz", - "integrity": "sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg==", - "optional": true, + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-11.1.1.tgz", + "integrity": "sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w==", "dependencies": { - "agentkeepalive": "^4.1.3", - "cacache": "^15.2.0", - "http-cache-semantics": "^4.1.0", - "http-proxy-agent": "^4.0.1", + "agentkeepalive": "^4.2.1", + "cacache": "^17.0.0", + "http-cache-semantics": "^4.1.1", + "http-proxy-agent": "^5.0.0", "https-proxy-agent": "^5.0.0", "is-lambda": "^1.0.1", - "lru-cache": "^6.0.0", - "minipass": "^3.1.3", - "minipass-collect": "^1.0.2", - "minipass-fetch": "^1.3.2", + "lru-cache": "^7.7.1", + "minipass": "^5.0.0", + "minipass-fetch": "^3.0.0", "minipass-flush": "^1.0.5", "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.2", + "negotiator": "^0.6.3", "promise-retry": "^2.0.1", - "socks-proxy-agent": "^6.0.0", - "ssri": "^8.0.0" + "socks-proxy-agent": "^7.0.0", + "ssri": "^10.0.0" }, "engines": { - "node": ">= 10" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/make-fetch-happen/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==", - "optional": true, - "dependencies": { - "debug": "4" - }, + "node_modules/make-fetch-happen/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", "engines": { - "node": ">= 6.0.0" + "node": ">=12" } }, - "node_modules/make-fetch-happen/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "optional": true, + "node_modules/matcher": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/matcher/-/matcher-3.0.0.tgz", + "integrity": "sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==", + "dev": true, "dependencies": { - "ms": "2.1.2" + "escape-string-regexp": "^4.0.0" }, "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "node": ">=10" } }, - "node_modules/make-fetch-happen/node_modules/http-proxy-agent": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", - "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", - "optional": true, + "node_modules/md5": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/md5/-/md5-2.3.0.tgz", + "integrity": "sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==", + "dev": true, "dependencies": { - "@tootallnate/once": "1", - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" + "charenc": "0.0.2", + "crypt": "0.0.2", + "is-buffer": "~1.1.6" } }, - "node_modules/make-fetch-happen/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==", - "optional": true, - "dependencies": { - "agent-base": "6", - "debug": "4" - }, + "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": ">= 6" + "node": ">= 0.6" } }, - "node_modules/make-fetch-happen/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==", - "optional": true, + "node_modules/memoizee": { + "version": "0.4.15", + "resolved": "https://registry.npmjs.org/memoizee/-/memoizee-0.4.15.tgz", + "integrity": "sha512-UBWmJpLZd5STPm7PMUlOw/TSy972M+z8gcyQ5veOnSDRREz/0bmpyTfKt3/51DhEBqCZQn1udM/5flcSPYhkdQ==", + "dev": true, "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" + "d": "^1.0.1", + "es5-ext": "^0.10.53", + "es6-weak-map": "^2.0.3", + "event-emitter": "^0.3.5", + "is-promise": "^2.2.2", + "lru-queue": "^0.1.0", + "next-tick": "^1.1.0", + "timers-ext": "^0.1.7" } }, - "node_modules/make-fetch-happen/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==", - "optional": true + "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/map-obj": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", - "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/marked": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/marked/-/marked-4.3.0.tgz", - "integrity": "sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==", - "bin": { - "marked": "bin/marked.js" - }, - "engines": { - "node": ">= 12" - } - }, - "node_modules/marked-terminal": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/marked-terminal/-/marked-terminal-5.2.0.tgz", - "integrity": "sha512-Piv6yNwAQXGFjZSaiNljyNFw7jKDdGrw70FSbtxEyldLsyeuV5ZHm/1wW++kWbrOF1VPnUgYOhB2oLL0ZpnekA==", - "dependencies": { - "ansi-escapes": "^6.2.0", - "cardinal": "^2.1.1", - "chalk": "^5.2.0", - "cli-table3": "^0.6.3", - "node-emoji": "^1.11.0", - "supports-hyperlinks": "^2.3.0" - }, - "engines": { - "node": ">=14.13.1 || >=16.0.0" - }, - "peerDependencies": { - "marked": "^1.0.0 || ^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0" - } - }, - "node_modules/marked-terminal/node_modules/ansi-escapes": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-6.2.0.tgz", - "integrity": "sha512-kzRaCqXnpzWs+3z5ABPQiVke+iq0KXkHo8xiWV4RPTi5Yli0l97BEQuhXV1s7+aSU/fu1kUuxgS4MsQ0fRuygw==", - "dependencies": { - "type-fest": "^3.0.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/marked-terminal/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/marked-terminal/node_modules/chalk": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", - "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/marked-terminal/node_modules/cli-table3": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.3.tgz", - "integrity": "sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==", - "dependencies": { - "string-width": "^4.2.0" - }, - "engines": { - "node": "10.* || >= 12.*" - }, - "optionalDependencies": { - "@colors/colors": "1.5.0" - } - }, - "node_modules/marked-terminal/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/marked-terminal/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/marked-terminal/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/marked-terminal/node_modules/type-fest": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-3.13.1.tgz", - "integrity": "sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==", - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/matcher": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/matcher/-/matcher-3.0.0.tgz", - "integrity": "sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==", - "dev": true, - "dependencies": { - "escape-string-regexp": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/matcher/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/md5": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/md5/-/md5-2.3.0.tgz", - "integrity": "sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==", - "dev": true, - "dependencies": { - "charenc": "0.0.2", - "crypt": "0.0.2", - "is-buffer": "~1.1.6" - } - }, - "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/memoizee": { - "version": "0.4.15", - "resolved": "https://registry.npmjs.org/memoizee/-/memoizee-0.4.15.tgz", - "integrity": "sha512-UBWmJpLZd5STPm7PMUlOw/TSy972M+z8gcyQ5veOnSDRREz/0bmpyTfKt3/51DhEBqCZQn1udM/5flcSPYhkdQ==", - "dev": true, - "dependencies": { - "d": "^1.0.1", - "es5-ext": "^0.10.53", - "es6-weak-map": "^2.0.3", - "event-emitter": "^0.3.5", - "is-promise": "^2.2.2", - "lru-queue": "^0.1.0", - "next-tick": "^1.1.0", - "timers-ext": "^0.1.7" - } - }, - "node_modules/meow": { - "version": "8.1.2", - "resolved": "https://registry.npmjs.org/meow/-/meow-8.1.2.tgz", - "integrity": "sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==", - "dependencies": { - "@types/minimist": "^1.2.0", - "camelcase-keys": "^6.2.2", - "decamelize-keys": "^1.1.0", - "hard-rejection": "^2.1.0", - "minimist-options": "4.1.0", - "normalize-package-data": "^3.0.0", - "read-pkg-up": "^7.0.1", - "redent": "^3.0.0", - "trim-newlines": "^3.0.0", - "type-fest": "^0.18.0", - "yargs-parser": "^20.2.3" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/meow/node_modules/type-fest": { - "version": "0.18.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", - "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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/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==" - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "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" } @@ -9055,14 +8303,14 @@ } }, "node_modules/mime": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", - "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==", + "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": ">=10.0.0" + "node": ">=4" } }, "node_modules/mime-db": { @@ -9113,14 +8361,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/min-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", - "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", - "engines": { - "node": ">=4" - } - }, "node_modules/minimalistic-assert": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", @@ -9132,14 +8372,17 @@ "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==" }, "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", + "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", "dependencies": { - "brace-expansion": "^1.1.7" + "brace-expansion": "^2.0.1" }, "engines": { - "node": "*" + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/minimist": { @@ -9150,26 +8393,10 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/minimist-options": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", - "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", - "dependencies": { - "arrify": "^1.0.1", - "is-plain-obj": "^1.1.0", - "kind-of": "^6.0.3" - }, - "engines": { - "node": ">= 6" - } - }, "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" - }, + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", "engines": { "node": ">=8" } @@ -9178,7 +8405,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", - "optional": true, "dependencies": { "minipass": "^3.0.0" }, @@ -9186,28 +8412,45 @@ "node": ">= 8" } }, + "node_modules/minipass-collect/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/minipass-fetch": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-1.4.1.tgz", - "integrity": "sha512-CGH1eblLq26Y15+Azk7ey4xh0J/XfJfrCox5LDJiKqI2Q2iwOLOKrlmIaODiSQS8d18jalF6y2K2ePUm0CmShw==", - "optional": true, + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.5.tgz", + "integrity": "sha512-2N8elDQAtSnFV0Dk7gt15KHsS0Fyz6CbYZ360h0WTYV1Ty46li3rAXVOQj1THMNLdmrD9Vt5pBPtWtVkpwGBqg==", "dependencies": { - "minipass": "^3.1.0", + "minipass": "^7.0.3", "minipass-sized": "^1.0.3", - "minizlib": "^2.0.0" + "minizlib": "^2.1.2" }, "engines": { - "node": ">=8" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" }, "optionalDependencies": { - "encoding": "^0.1.12" + "encoding": "^0.1.13" + } + }, + "node_modules/minipass-fetch/node_modules/minipass": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.1.tgz", + "integrity": "sha512-UZ7eQ+h8ywIRAW1hIEl2AqdwzJucU/Kp59+8kkZeSvafXhZjul247BvIJjEVFVeON6d7lM46XX1HXCduKAS8VA==", + "engines": { + "node": ">=16 || 14 >=14.17" } }, "node_modules/minipass-flush": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", - "optional": true, "dependencies": { "minipass": "^3.0.0" }, @@ -9215,11 +8458,41 @@ "node": ">= 8" } }, - "node_modules/minipass-pipeline": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", - "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", - "optional": true, + "node_modules/minipass-flush/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/minipass-json-stream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minipass-json-stream/-/minipass-json-stream-1.0.1.tgz", + "integrity": "sha512-ODqY18UZt/I8k+b7rl2AENgbWE8IDYam+undIJONvigAz8KR5GWblsFTEfQs0WODsjbSXWlm+JHEv8Gr6Tfdbg==", + "dependencies": { + "jsonparse": "^1.3.1", + "minipass": "^3.0.0" + } + }, + "node_modules/minipass-json-stream/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/minipass-pipeline": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", + "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", "dependencies": { "minipass": "^3.0.0" }, @@ -9227,11 +8500,21 @@ "node": ">=8" } }, + "node_modules/minipass-pipeline/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/minipass-sized": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", - "optional": true, "dependencies": { "minipass": "^3.0.0" }, @@ -9239,6 +8522,17 @@ "node": ">=8" } }, + "node_modules/minipass-sized/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/minizlib": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", @@ -9251,15 +8545,30 @@ "node": ">= 8" } }, - "node_modules/mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "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": { - "minimist": "^1.2.6" + "yallist": "^4.0.0" }, + "engines": { + "node": ">=8" + } + }, + "node_modules/mkdirp": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz", + "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==", + "dev": true, "bin": { - "mkdirp": "bin/cmd.js" + "mkdirp": "dist/cjs/src/bin.js" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/mkdirp-classic": { @@ -9268,74 +8577,60 @@ "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==" }, "node_modules/mocha": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-9.2.2.tgz", - "integrity": "sha512-L6XC3EdwT6YrIk0yXpavvLkn8h+EU+Y5UcCHKECyMbdUIxyMuZj4bX4U9e1nvnvUUvQVsV2VHQr5zLdcUkhW/g==", + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.4.0.tgz", + "integrity": "sha512-eqhGB8JKapEYcC4ytX/xrzKforgEc3j1pGlAXVy3eRwrtAy5/nIfT1SvgGzfN0XZZxeLq0aQWkOUAmqIJiv+bA==", "dev": true, "dependencies": { - "@ungap/promise-all-settled": "1.1.2", "ansi-colors": "4.1.1", "browser-stdout": "1.3.1", "chokidar": "3.5.3", - "debug": "4.3.3", + "debug": "4.3.4", "diff": "5.0.0", "escape-string-regexp": "4.0.0", "find-up": "5.0.0", - "glob": "7.2.0", - "growl": "1.10.5", + "glob": "8.1.0", "he": "1.2.0", "js-yaml": "4.1.0", "log-symbols": "4.1.0", - "minimatch": "4.2.1", + "minimatch": "5.0.1", "ms": "2.1.3", - "nanoid": "3.3.1", "serialize-javascript": "6.0.0", "strip-json-comments": "3.1.1", "supports-color": "8.1.1", - "which": "2.0.2", - "workerpool": "6.2.0", + "workerpool": "6.2.1", "yargs": "16.2.0", "yargs-parser": "20.2.4", "yargs-unparser": "2.0.0" }, "bin": { "_mocha": "bin/_mocha", - "mocha": "bin/mocha" + "mocha": "bin/mocha.js" }, "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mochajs" + "node": ">= 14.0.0" } }, "node_modules/mocha-junit-reporter": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mocha-junit-reporter/-/mocha-junit-reporter-2.0.0.tgz", - "integrity": "sha512-20HoWh2HEfhqmigfXOKUhZQyX23JImskc37ZOhIjBKoBEsb+4cAFRJpAVhFpnvsztLklW/gFVzsrobjLwmX4lA==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/mocha-junit-reporter/-/mocha-junit-reporter-2.2.1.tgz", + "integrity": "sha512-iDn2tlKHn8Vh8o4nCzcUVW4q7iXp7cC4EB78N0cDHIobLymyHNwe0XG8HEHHjc3hJlXm0Vy6zcrxaIhnI2fWmw==", "dev": true, "dependencies": { - "debug": "^2.2.0", - "md5": "^2.1.0", - "mkdirp": "~0.5.1", - "strip-ansi": "^4.0.0", - "xml": "^1.0.0" + "debug": "^4.3.4", + "md5": "^2.3.0", + "mkdirp": "^3.0.0", + "strip-ansi": "^6.0.1", + "xml": "^1.0.1" }, "peerDependencies": { "mocha": ">=2.2.5" } }, - "node_modules/mocha/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/mocha/node_modules/debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "node_modules/mocha-junit-reporter/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" @@ -9349,84 +8644,42 @@ } } }, - "node_modules/mocha/node_modules/debug/node_modules/ms": { + "node_modules/mocha-junit-reporter/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/mocha/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/mocha/node_modules/glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "node_modules/mocha/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": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "ms": "2.1.2" }, "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/mocha/node_modules/glob/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" + "node": ">=6.0" }, - "engines": { - "node": "*" - } - }, - "node_modules/mocha/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" + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "node_modules/mocha/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/mocha/node_modules/debug/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/mocha/node_modules/minimatch": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-4.2.1.tgz", - "integrity": "sha512-9Uq1ChtSZO+Mxa/CL1eGizn2vRn3MlLgzhT0Iz8zaY8NdvxvB0d5QdPFmCKf7JKA9Lerx5vRrnwO03jsSfGG9g==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", + "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", "dev": true, "dependencies": { - "brace-expansion": "^1.1.7" + "brace-expansion": "^2.0.1" }, "engines": { "node": ">=10" @@ -9438,18 +8691,6 @@ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dev": true }, - "node_modules/mocha/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/mocha/node_modules/supports-color": { "version": "8.1.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", @@ -9465,71 +8706,40 @@ "url": "https://github.com/chalk/supports-color?sponsor=1" } }, - "node_modules/mocha/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/modify-values": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/modify-values/-/modify-values-1.0.1.tgz", - "integrity": "sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw==", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/moment": { - "version": "2.29.4", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz", - "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==", + "version": "2.30.1", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz", + "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==", "engines": { "node": "*" } }, "node_modules/moment-timezone": { - "version": "0.5.38", - "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.38.tgz", - "integrity": "sha512-nMIrzGah4+oYZPflDvLZUgoVUO4fvAqHstvG3xAUnMolWncuAiLDWNnJZj6EwJGMGfb1ZcuTFE6GI3hNOVWI/Q==", + "version": "0.5.45", + "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.45.tgz", + "integrity": "sha512-HIWmqA86KcmCAhnMAN0wuDOARV/525R2+lOLotuGFzn4HO+FH+/645z2wx0Dt3iDv6/p61SIvKnDstISainhLQ==", "dependencies": { - "moment": ">= 2.9.0" + "moment": "^2.29.4" }, "engines": { "node": "*" } }, "node_modules/morgan": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.9.1.tgz", - "integrity": "sha512-HQStPIV4y3afTiCYVxirakhlCfGkI161c76kKFca7Fk1JusM//Qeo1ej2XaMniiNeaZklMVrh3vTtIzpzwbpmA==", + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.10.0.tgz", + "integrity": "sha512-AbegBVI4sh6El+1gNwvD5YIck7nSA36weD7xvIxG4in80j/UoK8AEGaWnnz8v1GxonMCltmlNs5ZKbGvl9b1XQ==", "dependencies": { - "basic-auth": "~2.0.0", + "basic-auth": "~2.0.1", "debug": "2.6.9", - "depd": "~1.1.2", + "depd": "~2.0.0", "on-finished": "~2.3.0", - "on-headers": "~1.0.1" + "on-headers": "~1.0.2" }, "engines": { "node": ">= 0.8.0" } }, - "node_modules/morgan/node_modules/depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", - "engines": { - "node": ">= 0.6" - } - }, "node_modules/morgan/node_modules/on-finished": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", @@ -9563,6 +8773,17 @@ "node": ">= 6.0.0" } }, + "node_modules/multer/node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, "node_modules/multer/node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -9578,9 +8799,9 @@ "dev": true }, "node_modules/mysql2": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.2.2.tgz", - "integrity": "sha512-h+MYStGolwzn9bNpnq3WtwQar6XVPZKbsMdkIbZ9xTH27BSMpzBdZiilALI9LP2MO1Ky1LlgcWPLRM/e6Eilqg==", + "version": "3.9.7", + "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.9.7.tgz", + "integrity": "sha512-KnJT8vYRcNAZv73uf9zpXqNbvBG7DJrs+1nACsjZP1HMJ1TgXEy8wnNilXAn/5i57JizXKtrUtwDB7HxT9DDpw==", "dependencies": { "denque": "^2.1.0", "generate-function": "^2.3.1", @@ -9625,18 +8846,6 @@ "node": ">=12" } }, - "node_modules/nanoid": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.1.tgz", - "integrity": "sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==", - "dev": true, - "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", @@ -9649,9 +8858,9 @@ "dev": true }, "node_modules/nconf": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/nconf/-/nconf-0.12.0.tgz", - "integrity": "sha512-T3fZPw3c7Dfrz8JBQEbEcZJ2s8f7cUMpKuyBtsGQe0b71pcXx6gNh4oti2xh5dxB+gO9ufNfISBlGvvWtfyMcA==", + "version": "0.12.1", + "resolved": "https://registry.npmjs.org/nconf/-/nconf-0.12.1.tgz", + "integrity": "sha512-p2cfF+B3XXacQdswUYWZ0w6Vld0832A/tuqjLBu3H1sfUcby4N2oVbGhyuCkZv+t3iY3aiFEj7gZGqax9Q2c1w==", "dependencies": { "async": "^3.0.0", "ini": "^2.0.0", @@ -9673,12 +8882,8 @@ "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==" - }, - "node_modules/nerf-dart": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/nerf-dart/-/nerf-dart-1.0.0.tgz", - "integrity": "sha512-EZSPZB70jiVsivaBLYDCyntd5eH8NTSMOn3rB+HxwdmKThGELLdYv8qVIMWvZEFy9w8ZZpW9h9OB32l1rGtj7g==" + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true }, "node_modules/netmask": { "version": "2.0.2", @@ -9690,38 +8895,38 @@ } }, "node_modules/newman": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/newman/-/newman-5.3.2.tgz", - "integrity": "sha512-cWy8pV0iwvMOZLTw3hkAHcwo2ZA0GKkXm8oUMn1Ltii3ZI2nKpnrg9QGdIT0hGHChRkX6prY5e3Aar7uykMGNg==", + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/newman/-/newman-6.1.2.tgz", + "integrity": "sha512-VyaXFguIYM7QUWXHQlHtkj3axzZQFHgj9OYkhbKpq4iphKAJckHFstltacSBtgpeiGp5SKk9FBdCYVbJXcLvnQ==", "dev": true, "dependencies": { - "async": "3.2.3", - "chardet": "1.4.0", - "cli-progress": "3.10.0", - "cli-table3": "0.6.1", + "@postman/tough-cookie": "4.1.3-postman.1", + "async": "3.2.5", + "chardet": "2.0.0", + "cli-progress": "3.12.0", + "cli-table3": "0.6.3", "colors": "1.4.0", - "commander": "7.2.0", + "commander": "11.1.0", "csv-parse": "4.16.3", - "eventemitter3": "4.0.7", - "filesize": "8.0.7", + "filesize": "10.1.0", + "liquid-json": "0.3.1", "lodash": "4.17.21", - "mkdirp": "1.0.4", - "postman-collection": "4.1.1", - "postman-collection-transformer": "4.1.6", - "postman-request": "2.88.1-postman.31", - "postman-runtime": "7.29.0", + "mkdirp": "3.0.1", + "postman-collection": "4.4.0", + "postman-collection-transformer": "4.1.8", + "postman-request": "2.88.1-postman.33", + "postman-runtime": "7.37.1", "pretty-ms": "7.0.1", - "semver": "7.3.5", + "semver": "7.6.0", "serialised-error": "1.1.3", - "tough-cookie": "3.0.1", - "word-wrap": "1.2.3", + "word-wrap": "1.2.5", "xmlbuilder": "15.1.1" }, "bin": { "newman": "bin/newman.js" }, "engines": { - "node": ">=10" + "node": ">=16" } }, "node_modules/newman-reporter-junitfull": { @@ -9750,240 +8955,305 @@ "node": ">=4.0" } }, - "node_modules/newman/node_modules/async": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.3.tgz", - "integrity": "sha512-spZRyzKL5l5BZQrr/6m/SqFdBN0q3OCI0f9rjfBzCMBIP4p75P620rR3gTmaksNOhmzgdxcaxdNfMy6anrbM0g==", + "node_modules/next-tick": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", + "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==", "dev": true }, - "node_modules/newman/node_modules/chardet": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-1.4.0.tgz", - "integrity": "sha512-NpwMDdSIprbYx1CLnfbxEIarI0Z+s9MssEgggMNheGM+WD68yOhV7IEA/3r6tr0yTRgQD0HuZJDw32s99i6L+A==", - "dev": true + "node_modules/nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" }, - "node_modules/newman/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==", + "node_modules/nise": { + "version": "5.1.9", + "resolved": "https://registry.npmjs.org/nise/-/nise-5.1.9.tgz", + "integrity": "sha512-qOnoujW4SV6e40dYxJOb3uvuoPHtmLzIk4TFo+j0jPJoC+5Z9xja5qH5JZobEPsa8+YYphMrOSwnrshEhG2qww==", "dev": true, "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" + "@sinonjs/commons": "^3.0.0", + "@sinonjs/fake-timers": "^11.2.2", + "@sinonjs/text-encoding": "^0.7.2", + "just-extend": "^6.2.0", + "path-to-regexp": "^6.2.1" } }, - "node_modules/newman/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" + "node_modules/nise/node_modules/path-to-regexp": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.2.2.tgz", + "integrity": "sha512-GQX3SSMokngb36+whdpRXE+3f9V8UzyAorlYvOGx87ufGHehNTn5lCxrKtLyZ4Yl/wEKnNnr98ZzOwwDZV5ogw==", + "dev": true + }, + "node_modules/node-abi": { + "version": "3.62.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.62.0.tgz", + "integrity": "sha512-CPMcGa+y33xuL1E0TcNIu4YyaZCxnnvkVaEXrsosR3FxN+fV8xvb7Mzpb7IgKler10qeMkE6+Dp8qJhpzdq35g==", + "dependencies": { + "semver": "^7.3.5" }, "engines": { "node": ">=10" } }, - "node_modules/newman/node_modules/semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, + "node_modules/node-addon-api": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.0.tgz", + "integrity": "sha512-mNcltoe1R8o7STTegSOHdnJNN7s5EUvhoS7ShnTHDyOSd+8H+UdWODq6qSv67PjC8Zc5JRT8+oLAMCr0SIXw7g==", "engines": { - "node": ">=10" + "node": "^16 || ^18 || >= 20" } }, - "node_modules/next-tick": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", - "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==", - "dev": true - }, - "node_modules/nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" + "node_modules/node-fetch-npm": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/node-fetch-npm/-/node-fetch-npm-2.0.4.tgz", + "integrity": "sha512-iOuIQDWDyjhv9qSDrj9aq/klt6F9z1p2otB3AV7v3zBDcL/x+OfGsvGQZZCcMZbUf4Ujw1xGNQkjvGnVT22cKg==", + "deprecated": "This module is not used anymore, npm uses minipass-fetch for its fetch implementation now", + "dependencies": { + "encoding": "^0.1.11", + "json-parse-better-errors": "^1.0.0", + "safe-buffer": "^5.1.1" + }, + "engines": { + "node": ">=4" + } }, - "node_modules/nise": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/nise/-/nise-1.5.3.tgz", - "integrity": "sha512-Ymbac/94xeIrMf59REBPOv0thr+CJVFMhrlAkW/gjCIE58BGQdCj0x7KRCb3yz+Ga2Rz3E9XXSvUyyxqqhjQAQ==", + "node_modules/node-forge": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", + "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", "dev": true, + "engines": { + "node": ">= 6.13.0" + } + }, + "node_modules/node-gyp": { + "version": "9.4.1", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-9.4.1.tgz", + "integrity": "sha512-OQkWKbjQKbGkMf/xqI1jjy3oCTgMKJac58G2+bjZb3fza6gW2YrCSdMQYaoTb70crvE//Gngr4f0AgVHmqHvBQ==", "dependencies": { - "@sinonjs/formatio": "^3.2.1", - "@sinonjs/text-encoding": "^0.7.1", - "just-extend": "^4.0.2", - "lolex": "^5.0.1", - "path-to-regexp": "^1.7.0" + "env-paths": "^2.2.0", + "exponential-backoff": "^3.1.1", + "glob": "^7.1.4", + "graceful-fs": "^4.2.6", + "make-fetch-happen": "^10.0.3", + "nopt": "^6.0.0", + "npmlog": "^6.0.0", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.2", + "which": "^2.0.2" + }, + "bin": { + "node-gyp": "bin/node-gyp.js" + }, + "engines": { + "node": "^12.13 || ^14.13 || >=16" } }, - "node_modules/nise/node_modules/lolex": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/lolex/-/lolex-5.1.2.tgz", - "integrity": "sha512-h4hmjAvHTmd+25JSwrtTIuwbKdwg5NzZVRMLn9saij4SZaepCrTCxPr35H/3bjwfMJtN+t3CX8672UIkglz28A==", - "dev": true, + "node_modules/node-gyp/node_modules/@npmcli/fs": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-2.1.2.tgz", + "integrity": "sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ==", "dependencies": { - "@sinonjs/commons": "^1.7.0" + "@gar/promisify": "^1.1.3", + "semver": "^7.3.5" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/nise/node_modules/path-to-regexp": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", - "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", - "dev": true, + "node_modules/node-gyp/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": { - "isarray": "0.0.1" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "node_modules/nocache": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/nocache/-/nocache-2.1.0.tgz", - "integrity": "sha512-0L9FvHG3nfnnmaEQPjT9xhfN4ISk0A8/2j4M37Np4mcDesJjHgEUfgPhdCyZuFI954tjokaIj/A3NdpFNdEh4Q==", + "node_modules/node-gyp/node_modules/cacache": { + "version": "16.1.3", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-16.1.3.tgz", + "integrity": "sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ==", + "dependencies": { + "@npmcli/fs": "^2.1.0", + "@npmcli/move-file": "^2.0.0", + "chownr": "^2.0.0", + "fs-minipass": "^2.1.0", + "glob": "^8.0.1", + "infer-owner": "^1.0.4", + "lru-cache": "^7.7.1", + "minipass": "^3.1.6", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "mkdirp": "^1.0.4", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^9.0.0", + "tar": "^6.1.11", + "unique-filename": "^2.0.0" + }, "engines": { - "node": ">=4.0.0" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/node-abi": { - "version": "3.56.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.56.0.tgz", - "integrity": "sha512-fZjdhDOeRcaS+rcpve7XuwHBmktS1nS1gzgghwKUQQ8nTy2FdSDr6ZT8k6YhvlJeHmmQMYiT/IH9hfco5zeW2Q==", + "node_modules/node-gyp/node_modules/cacache/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dependencies": { - "semver": "^7.3.5" + "balanced-match": "^1.0.0" + } + }, + "node_modules/node-gyp/node_modules/cacache/node_modules/glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" }, "engines": { - "node": ">=10" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "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==", + "node_modules/node-gyp/node_modules/cacache/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", "dependencies": { - "yallist": "^4.0.0" + "brace-expansion": "^2.0.1" }, "engines": { "node": ">=10" } }, - "node_modules/node-abi/node_modules/semver": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", - "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "node_modules/node-gyp/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": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" + "minipass": "^3.0.0" }, "engines": { - "node": ">=10" + "node": ">= 8" } }, - "node_modules/node-addon-api": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.0.tgz", - "integrity": "sha512-mNcltoe1R8o7STTegSOHdnJNN7s5EUvhoS7ShnTHDyOSd+8H+UdWODq6qSv67PjC8Zc5JRT8+oLAMCr0SIXw7g==", + "node_modules/node-gyp/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": "^16 || ^18 || >= 20" + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/node-emoji": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.11.0.tgz", - "integrity": "sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==", - "dependencies": { - "lodash": "^4.17.21" + "node_modules/node-gyp/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "engines": { + "node": ">=12" } }, - "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==", + "node_modules/node-gyp/node_modules/make-fetch-happen": { + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-10.2.1.tgz", + "integrity": "sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w==", "dependencies": { - "whatwg-url": "^5.0.0" + "agentkeepalive": "^4.2.1", + "cacache": "^16.1.0", + "http-cache-semantics": "^4.1.0", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^7.7.1", + "minipass": "^3.1.6", + "minipass-collect": "^1.0.2", + "minipass-fetch": "^2.0.3", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.3", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^7.0.0", + "ssri": "^9.0.0" }, "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/node-gyp": { - "version": "8.4.1", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-8.4.1.tgz", - "integrity": "sha512-olTJRgUtAb/hOXG0E93wZDs5YiJlgbXxTwQAFHyNlRsXQnYzUaF2aGgujZbw+hR8aF4ZG/rST57bWMWD16jr9w==", - "optional": true, + "node_modules/node-gyp/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": { - "env-paths": "^2.2.0", - "glob": "^7.1.4", - "graceful-fs": "^4.2.6", - "make-fetch-happen": "^9.1.0", - "nopt": "^5.0.0", - "npmlog": "^6.0.0", - "rimraf": "^3.0.2", - "semver": "^7.3.5", - "tar": "^6.1.2", - "which": "^2.0.2" - }, - "bin": { - "node-gyp": "bin/node-gyp.js" + "brace-expansion": "^1.1.7" }, "engines": { - "node": ">= 10.12.0" + "node": "*" } }, - "node_modules/node-gyp/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==", - "optional": true - }, - "node_modules/node-gyp/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==", - "optional": true, + "node_modules/node-gyp/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": ">=10" + "node": ">=8" } }, - "node_modules/node-gyp/node_modules/nopt": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", - "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", - "optional": true, + "node_modules/node-gyp/node_modules/minipass-fetch": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-2.1.2.tgz", + "integrity": "sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA==", "dependencies": { - "abbrev": "1" + "minipass": "^3.1.6", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + }, + "optionalDependencies": { + "encoding": "^0.1.13" + } + }, + "node_modules/node-gyp/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", "bin": { - "nopt": "bin/nopt.js" + "mkdirp": "bin/cmd.js" }, "engines": { - "node": ">=6" + "node": ">=10" } }, "node_modules/node-gyp/node_modules/rimraf": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "optional": true, "dependencies": { "glob": "^7.1.3" }, @@ -9994,34 +9264,37 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/node-gyp/node_modules/semver": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", - "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", - "optional": true, + "node_modules/node-gyp/node_modules/ssri": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-9.0.1.tgz", + "integrity": "sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q==", "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" + "minipass": "^3.1.1" }, "engines": { - "node": ">=10" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/node-gyp/node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "optional": true, + "node_modules/node-gyp/node_modules/unique-filename": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-2.0.1.tgz", + "integrity": "sha512-ODWHtkkdx3IAR+veKxFV+VBkUMcN+FaqzUUd7IZzt+0zhDZFPFxhlqwPF3YQvMHx1TD0tdgYl+kuPnJ8E6ql7A==", "dependencies": { - "isexe": "^2.0.0" + "unique-slug": "^3.0.0" }, - "bin": { - "node-which": "bin/node-which" + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/node-gyp/node_modules/unique-slug": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-3.0.0.tgz", + "integrity": "sha512-8EyMynh679x/0gqE9fT9oilG+qEt+ibFyqjuVTsZn1+CMxH+XLlpvr2UZx4nVcCwTpx81nICr2JQFkM+HPLq4w==", + "dependencies": { + "imurmurhash": "^0.1.4" }, "engines": { - "node": ">= 8" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, "node_modules/node-oauth1": { @@ -10048,94 +9321,51 @@ "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", "dev": true }, - "node_modules/nodemailer": { - "version": "6.7.3", - "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.7.3.tgz", - "integrity": "sha512-KUdDsspqx89sD4UUyUKzdlUOper3hRkDVkrKh/89G+d9WKsU5ox51NWS4tB1XR5dPUdR4SP0E3molyEfOvSa3g==", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/nodemailer-fetch": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/nodemailer-fetch/-/nodemailer-fetch-1.3.0.tgz", - "integrity": "sha512-5P5+lR0+sWvk1UZGFoTida33dG0xAqk1Pv0t7cPlrJ09dLdZWh/kenxb0vOoUoNVOci4gmSYOnMHzvheSBeFag==" - }, - "node_modules/nodemailer-shared": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/nodemailer-shared/-/nodemailer-shared-1.0.4.tgz", - "integrity": "sha512-tfqdDPbj6L3PywhNqCa988bDxxnffo3Gw0DZkaYwOYVsnMZFgF7LoffS4FAFbiGb1M+mcNBPX/Vy9l0A95fJAg==", - "dependencies": { - "nodemailer-fetch": "1.3.0" - } - }, - "node_modules/nodemailer-smtp-transport": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/nodemailer-smtp-transport/-/nodemailer-smtp-transport-2.4.2.tgz", - "integrity": "sha512-VD3oQ5Xzgszg+2f0H3qAnXhciF6pZ9j2hHNaJqHEzh+caEs/cU1dDmCbpdN2bJxPYBeCilA2XshhtEnvxJgZGQ==", - "dependencies": { - "nodemailer-shared": "1.0.4", - "nodemailer-wellknown": "0.1.8", - "smtp-connection": "2.3.2" - } - }, - "node_modules/nodemailer-wellknown": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/nodemailer-wellknown/-/nodemailer-wellknown-0.1.8.tgz", - "integrity": "sha512-kxDRGWY6ZYtcKsCr4IMw5B9nST0EKK8Ay/JjgK96lBEdpt6nRl2ds5khTVv/BGLECbLIAzOsmIwP7KUt1C9frA==" - }, "node_modules/nopt": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-7.2.0.tgz", - "integrity": "sha512-CVDtwCdhYIvnAzFoJ6NJ6dX3oga9/HyciQDnG1vQDjSLMeKLJ4A93ZqYKDrgYSr1FBY5/hMYC+2VCi24pgpkGA==", - "dev": true, + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-6.0.0.tgz", + "integrity": "sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==", "dependencies": { - "abbrev": "^2.0.0" + "abbrev": "^1.0.0" }, "bin": { "nopt": "bin/nopt.js" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, "node_modules/normalize-package-data": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", - "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-5.0.0.tgz", + "integrity": "sha512-h9iPVIfrVZ9wVYQnxFgtw1ugSvGEMOlyPWWtm8BMJhnwyEL/FLbYbTY3V3PpjI/BUK67n9PEWDu6eHzu1fB15Q==", "dependencies": { - "hosted-git-info": "^4.0.1", - "is-core-module": "^2.5.0", - "semver": "^7.3.4", - "validate-npm-package-license": "^3.0.1" + "hosted-git-info": "^6.0.0", + "is-core-module": "^2.8.1", + "semver": "^7.3.5", + "validate-npm-package-license": "^3.0.4" }, "engines": { - "node": ">=10" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/normalize-package-data/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==", + "node_modules/normalize-package-data/node_modules/hosted-git-info": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-6.1.1.tgz", + "integrity": "sha512-r0EI+HBMcXadMrugk0GCQ+6BQV39PiWAZVfq7oIckeGiN7sjRGyQxPdft3nQekFTCQbYxLBH+/axZMeH8UX6+w==", "dependencies": { - "yallist": "^4.0.0" + "lru-cache": "^7.5.1" }, "engines": { - "node": ">=10" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/normalize-package-data/node_modules/semver": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", - "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, + "node_modules/normalize-package-data/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", "engines": { - "node": ">=10" + "node": ">=12" } }, "node_modules/normalize-path": { @@ -10148,3850 +9378,3587 @@ } }, "node_modules/normalize-url": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", - "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.0.1.tgz", + "integrity": "sha512-IO9QvjUMWxPQQhs60oOu10CRkWCiZzSUkzbXGGV9pviYl1fXYcvkzQ5jV9z8Y6un8ARoVRl4EtC6v6jNqbaJ/w==", "engines": { - "node": ">=10" + "node": ">=14.16" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/npm": { - "version": "8.19.4", - "resolved": "https://registry.npmjs.org/npm/-/npm-8.19.4.tgz", - "integrity": "sha512-3HANl8i9DKnUA89P4KEgVNN28EjSeDCmvEqbzOAuxCFDzdBZzjUl99zgnGpOUumvW5lvJo2HKcjrsc+tfyv1Hw==", - "bundleDependencies": [ - "@isaacs/string-locale-compare", - "@npmcli/arborist", - "@npmcli/ci-detect", - "@npmcli/config", - "@npmcli/fs", - "@npmcli/map-workspaces", - "@npmcli/package-json", - "@npmcli/run-script", - "abbrev", - "archy", - "cacache", - "chalk", - "chownr", - "cli-columns", - "cli-table3", - "columnify", - "fastest-levenshtein", - "fs-minipass", - "glob", - "graceful-fs", - "hosted-git-info", - "ini", - "init-package-json", - "is-cidr", - "json-parse-even-better-errors", - "libnpmaccess", - "libnpmdiff", - "libnpmexec", - "libnpmfund", - "libnpmhook", - "libnpmorg", - "libnpmpack", - "libnpmpublish", - "libnpmsearch", - "libnpmteam", - "libnpmversion", - "make-fetch-happen", - "minimatch", - "minipass", - "minipass-pipeline", - "mkdirp", - "mkdirp-infer-owner", - "ms", - "node-gyp", - "nopt", - "npm-audit-report", - "npm-install-checks", - "npm-package-arg", - "npm-pick-manifest", - "npm-profile", - "npm-registry-fetch", - "npm-user-validate", - "npmlog", - "opener", - "p-map", - "pacote", - "parse-conflict-json", - "proc-log", - "qrcode-terminal", - "read", - "read-package-json", - "read-package-json-fast", - "readdir-scoped-modules", - "rimraf", - "semver", - "ssri", - "tar", - "text-table", - "tiny-relative-date", - "treeverse", - "validate-npm-package-name", - "which", - "write-file-atomic" - ], + "node_modules/npm-bundled": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-3.0.1.tgz", + "integrity": "sha512-+AvaheE/ww1JEwRHOrn4WHNzOxGtVp+adrg2AeZS/7KuxGUYFuBta98wYpfHBbJp6Tg6j1NKSEVHNcfZzJHQwQ==", "dependencies": { - "@isaacs/string-locale-compare": "^1.1.0", - "@npmcli/arborist": "^5.6.3", - "@npmcli/ci-detect": "^2.0.0", - "@npmcli/config": "^4.2.1", - "@npmcli/fs": "^2.1.0", - "@npmcli/map-workspaces": "^2.0.3", - "@npmcli/package-json": "^2.0.0", - "@npmcli/run-script": "^4.2.1", - "abbrev": "~1.1.1", - "archy": "~1.0.0", - "cacache": "^16.1.3", - "chalk": "^4.1.2", - "chownr": "^2.0.0", - "cli-columns": "^4.0.0", - "cli-table3": "^0.6.2", - "columnify": "^1.6.0", - "fastest-levenshtein": "^1.0.12", - "fs-minipass": "^2.1.0", - "glob": "^8.0.1", - "graceful-fs": "^4.2.10", - "hosted-git-info": "^5.2.1", - "ini": "^3.0.1", - "init-package-json": "^3.0.2", - "is-cidr": "^4.0.2", - "json-parse-even-better-errors": "^2.3.1", - "libnpmaccess": "^6.0.4", - "libnpmdiff": "^4.0.5", - "libnpmexec": "^4.0.14", - "libnpmfund": "^3.0.5", - "libnpmhook": "^8.0.4", - "libnpmorg": "^4.0.4", - "libnpmpack": "^4.1.3", - "libnpmpublish": "^6.0.5", - "libnpmsearch": "^5.0.4", - "libnpmteam": "^4.0.4", - "libnpmversion": "^3.0.7", - "make-fetch-happen": "^10.2.0", - "minimatch": "^5.1.0", - "minipass": "^3.1.6", - "minipass-pipeline": "^1.2.4", - "mkdirp": "^1.0.4", - "mkdirp-infer-owner": "^2.0.0", - "ms": "^2.1.2", - "node-gyp": "^9.1.0", - "nopt": "^6.0.0", - "npm-audit-report": "^3.0.0", - "npm-install-checks": "^5.0.0", - "npm-package-arg": "^9.1.0", - "npm-pick-manifest": "^7.0.2", - "npm-profile": "^6.2.0", - "npm-registry-fetch": "^13.3.1", - "npm-user-validate": "^1.0.1", - "npmlog": "^6.0.2", - "opener": "^1.5.2", - "p-map": "^4.0.0", - "pacote": "^13.6.2", - "parse-conflict-json": "^2.0.2", - "proc-log": "^2.0.1", - "qrcode-terminal": "^0.12.0", - "read": "~1.0.7", - "read-package-json": "^5.0.2", - "read-package-json-fast": "^2.0.3", - "readdir-scoped-modules": "^1.1.0", - "rimraf": "^3.0.2", - "semver": "^7.3.7", - "ssri": "^9.0.1", - "tar": "^6.1.11", - "text-table": "~0.2.0", - "tiny-relative-date": "^1.3.0", - "treeverse": "^2.0.0", - "validate-npm-package-name": "^4.0.0", - "which": "^2.0.2", - "write-file-atomic": "^4.0.1" - }, - "bin": { - "npm": "bin/npm-cli.js", - "npx": "bin/npx-cli.js" + "npm-normalize-package-bin": "^3.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "^14.17.0 || ^16.13.0 || >=18.0.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==", + "node_modules/npm-check-updates": { + "version": "16.14.20", + "resolved": "https://registry.npmjs.org/npm-check-updates/-/npm-check-updates-16.14.20.tgz", + "integrity": "sha512-sYbIhun4DrjO7NFOTdvs11nCar0etEhZTsEjL47eM0TuiGMhmYughRCxG2SpGRmGAQ7AkwN7bw2lWzoE7q6yOQ==", "dependencies": { - "path-key": "^2.0.0" + "@types/semver-utils": "^1.1.1", + "chalk": "^5.3.0", + "cli-table3": "^0.6.3", + "commander": "^10.0.1", + "fast-memoize": "^2.5.2", + "find-up": "5.0.0", + "fp-and-or": "^0.1.4", + "get-stdin": "^8.0.0", + "globby": "^11.0.4", + "hosted-git-info": "^5.1.0", + "ini": "^4.1.1", + "js-yaml": "^4.1.0", + "json-parse-helpfulerror": "^1.0.3", + "jsonlines": "^0.1.1", + "lodash": "^4.17.21", + "make-fetch-happen": "^11.1.1", + "minimatch": "^9.0.3", + "p-map": "^4.0.0", + "pacote": "15.2.0", + "parse-github-url": "^1.0.2", + "progress": "^2.0.3", + "prompts-ncu": "^3.0.0", + "rc-config-loader": "^4.1.3", + "remote-git-tags": "^3.0.0", + "rimraf": "^5.0.5", + "semver": "^7.5.4", + "semver-utils": "^1.1.4", + "source-map-support": "^0.5.21", + "spawn-please": "^2.0.2", + "strip-ansi": "^7.1.0", + "strip-json-comments": "^5.0.1", + "untildify": "^4.0.0", + "update-notifier": "^6.0.2" + }, + "bin": { + "ncu": "build/src/bin/cli.js", + "npm-check-updates": "build/src/bin/cli.js" }, "engines": { - "node": ">=4" + "node": ">=14.14" } }, - "node_modules/npm/node_modules/@colors/colors": { - "version": "1.5.0", - "inBundle": true, - "license": "MIT", - "optional": true, + "node_modules/npm-check-updates/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==", "engines": { - "node": ">=0.1.90" - } - }, - "node_modules/npm/node_modules/@gar/promisify": { - "version": "1.1.3", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/@isaacs/string-locale-compare": { - "version": "1.1.0", - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/@npmcli/arborist": { - "version": "5.6.3", - "inBundle": true, - "license": "ISC", - "dependencies": { - "@isaacs/string-locale-compare": "^1.1.0", - "@npmcli/installed-package-contents": "^1.0.7", - "@npmcli/map-workspaces": "^2.0.3", - "@npmcli/metavuln-calculator": "^3.0.1", - "@npmcli/move-file": "^2.0.0", - "@npmcli/name-from-folder": "^1.0.1", - "@npmcli/node-gyp": "^2.0.0", - "@npmcli/package-json": "^2.0.0", - "@npmcli/query": "^1.2.0", - "@npmcli/run-script": "^4.1.3", - "bin-links": "^3.0.3", - "cacache": "^16.1.3", - "common-ancestor-path": "^1.0.1", - "hosted-git-info": "^5.2.1", - "json-parse-even-better-errors": "^2.3.1", - "json-stringify-nice": "^1.1.4", - "minimatch": "^5.1.0", - "mkdirp": "^1.0.4", - "mkdirp-infer-owner": "^2.0.0", - "nopt": "^6.0.0", - "npm-install-checks": "^5.0.0", - "npm-package-arg": "^9.0.0", - "npm-pick-manifest": "^7.0.2", - "npm-registry-fetch": "^13.0.0", - "npmlog": "^6.0.2", - "pacote": "^13.6.1", - "parse-conflict-json": "^2.0.1", - "proc-log": "^2.0.0", - "promise-all-reject-late": "^1.0.0", - "promise-call-limit": "^1.0.1", - "read-package-json-fast": "^2.0.2", - "readdir-scoped-modules": "^1.1.0", - "rimraf": "^3.0.2", - "semver": "^7.3.7", - "ssri": "^9.0.0", - "treeverse": "^2.0.0", - "walk-up-path": "^1.0.0" - }, - "bin": { - "arborist": "bin/index.js" + "node": ">=12" }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, - "node_modules/npm/node_modules/@npmcli/ci-detect": { - "version": "2.0.0", - "inBundle": true, - "license": "ISC", + "node_modules/npm-check-updates/node_modules/chalk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16" + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/npm/node_modules/@npmcli/config": { - "version": "4.2.2", - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/map-workspaces": "^2.0.2", - "ini": "^3.0.0", - "mkdirp-infer-owner": "^2.0.0", - "nopt": "^6.0.0", - "proc-log": "^2.0.0", - "read-package-json-fast": "^2.0.3", - "semver": "^7.3.5", - "walk-up-path": "^1.0.0" - }, + "node_modules/npm-check-updates/node_modules/commander": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=14" } }, - "node_modules/npm/node_modules/@npmcli/disparity-colors": { - "version": "2.0.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "ansi-styles": "^4.3.0" - }, + "node_modules/npm-check-updates/node_modules/ini": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.2.tgz", + "integrity": "sha512-AMB1mvwR1pyBFY/nSevUX6y8nJWS63/SzUKD3JyQn97s4xgIdgQPT75IRouIiBAN4yLQBUShNYVW0+UG25daCw==", "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/npm/node_modules/@npmcli/fs": { - "version": "2.1.2", - "inBundle": true, - "license": "ISC", + "node_modules/npm-check-updates/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==", "dependencies": { - "@gar/promisify": "^1.1.3", - "semver": "^7.3.5" + "ansi-regex": "^6.0.1" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/npm/node_modules/@npmcli/git": { - "version": "3.0.2", - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/promise-spawn": "^3.0.0", - "lru-cache": "^7.4.4", - "mkdirp": "^1.0.4", - "npm-pick-manifest": "^7.0.0", - "proc-log": "^2.0.0", - "promise-inflight": "^1.0.1", - "promise-retry": "^2.0.1", - "semver": "^7.3.5", - "which": "^2.0.2" - }, + "node_modules/npm-check-updates/node_modules/strip-json-comments": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-5.0.1.tgz", + "integrity": "sha512-0fk9zBqO67Nq5M/m45qHCJxylV/DhBlIOVExqgOMiCCrzrhU6tCibRXNqE3jwJLftzE9SNuZtYbpzcO+i9FiKw==", "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/npm/node_modules/@npmcli/installed-package-contents": { - "version": "1.0.7", - "inBundle": true, - "license": "ISC", + "node_modules/npm-install-checks": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-6.3.0.tgz", + "integrity": "sha512-W29RiK/xtpCGqn6f3ixfRYGk+zRyr+Ew9F2E20BfXxT5/euLdA/Nm7fO7OeTGuAmTs30cpgInyJ0cYe708YTZw==", "dependencies": { - "npm-bundled": "^1.1.1", - "npm-normalize-package-bin": "^1.0.1" - }, - "bin": { - "installed-package-contents": "index.js" + "semver": "^7.1.1" }, "engines": { - "node": ">= 10" - } - }, - "node_modules/npm/node_modules/@npmcli/installed-package-contents/node_modules/npm-bundled": { - "version": "1.1.2", - "inBundle": true, - "license": "ISC", - "dependencies": { - "npm-normalize-package-bin": "^1.0.1" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/npm/node_modules/@npmcli/map-workspaces": { - "version": "2.0.4", - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/name-from-folder": "^1.0.1", - "glob": "^8.0.1", - "minimatch": "^5.0.1", - "read-package-json-fast": "^2.0.3" - }, + "node_modules/npm-normalize-package-bin": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-3.0.1.tgz", + "integrity": "sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ==", "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/npm/node_modules/@npmcli/metavuln-calculator": { - "version": "3.1.1", - "inBundle": true, - "license": "ISC", + "node_modules/npm-package-arg": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-10.1.0.tgz", + "integrity": "sha512-uFyyCEmgBfZTtrKk/5xDfHp6+MdrqGotX/VoOyEEl3mBwiEE5FlBaePanazJSVMPT7vKepcjYBY2ztg9A3yPIA==", "dependencies": { - "cacache": "^16.0.0", - "json-parse-even-better-errors": "^2.3.1", - "pacote": "^13.0.3", - "semver": "^7.3.5" + "hosted-git-info": "^6.0.0", + "proc-log": "^3.0.0", + "semver": "^7.3.5", + "validate-npm-package-name": "^5.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/npm/node_modules/@npmcli/move-file": { - "version": "2.0.1", - "inBundle": true, - "license": "MIT", + "node_modules/npm-package-arg/node_modules/hosted-git-info": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-6.1.1.tgz", + "integrity": "sha512-r0EI+HBMcXadMrugk0GCQ+6BQV39PiWAZVfq7oIckeGiN7sjRGyQxPdft3nQekFTCQbYxLBH+/axZMeH8UX6+w==", "dependencies": { - "mkdirp": "^1.0.4", - "rimraf": "^3.0.2" + "lru-cache": "^7.5.1" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/npm/node_modules/@npmcli/name-from-folder": { - "version": "1.0.1", - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/@npmcli/node-gyp": { - "version": "2.0.0", - "inBundle": true, - "license": "ISC", + "node_modules/npm-package-arg/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=12" } }, - "node_modules/npm/node_modules/@npmcli/package-json": { - "version": "2.0.0", - "inBundle": true, - "license": "ISC", + "node_modules/npm-packlist": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-7.0.4.tgz", + "integrity": "sha512-d6RGEuRrNS5/N84iglPivjaJPxhDbZmlbTwTDX2IbcRHG5bZCdtysYMhwiPvcF4GisXHGn7xsxv+GQ7T/02M5Q==", "dependencies": { - "json-parse-even-better-errors": "^2.3.1" + "ignore-walk": "^6.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/npm/node_modules/@npmcli/promise-spawn": { - "version": "3.0.0", - "inBundle": true, - "license": "ISC", + "node_modules/npm-pick-manifest": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-8.0.2.tgz", + "integrity": "sha512-1dKY+86/AIiq1tkKVD3l0WI+Gd3vkknVGAggsFeBkTvbhMQ1OND/LKkYv4JtXPKUJ8bOTCyLiqEg2P6QNdK+Gg==", "dependencies": { - "infer-owner": "^1.0.4" + "npm-install-checks": "^6.0.0", + "npm-normalize-package-bin": "^3.0.0", + "npm-package-arg": "^10.0.0", + "semver": "^7.3.5" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/npm/node_modules/@npmcli/query": { - "version": "1.2.0", - "inBundle": true, - "license": "ISC", + "node_modules/npm-registry-fetch": { + "version": "14.0.5", + "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-14.0.5.tgz", + "integrity": "sha512-kIDMIo4aBm6xg7jOttupWZamsZRkAqMqwqqbVXnUqstY5+tapvv6bkH/qMR76jdgV+YljEUCyWx3hRYMrJiAgA==", "dependencies": { - "npm-package-arg": "^9.1.0", - "postcss-selector-parser": "^6.0.10", - "semver": "^7.3.7" + "make-fetch-happen": "^11.0.0", + "minipass": "^5.0.0", + "minipass-fetch": "^3.0.0", + "minipass-json-stream": "^1.0.1", + "minizlib": "^2.1.2", + "npm-package-arg": "^10.0.0", + "proc-log": "^3.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/npm/node_modules/@npmcli/run-script": { - "version": "4.2.1", - "inBundle": true, - "license": "ISC", + "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": { - "@npmcli/node-gyp": "^2.0.0", - "@npmcli/promise-spawn": "^3.0.0", - "node-gyp": "^9.0.0", - "read-package-json-fast": "^2.0.3", - "which": "^2.0.2" + "path-key": "^2.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=4" } }, - "node_modules/npm/node_modules/@tootallnate/once": { - "version": "2.0.0", - "inBundle": true, - "license": "MIT", + "node_modules/npm-run-path/node_modules/path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", "engines": { - "node": ">= 10" + "node": ">=4" } }, - "node_modules/npm/node_modules/abbrev": { - "version": "1.1.1", - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/agent-base": { + "node_modules/npmlog": { "version": "6.0.2", - "inBundle": true, - "license": "MIT", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz", + "integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==", "dependencies": { - "debug": "4" + "are-we-there-yet": "^3.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^4.0.3", + "set-blocking": "^2.0.0" }, "engines": { - "node": ">= 6.0.0" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/npm/node_modules/agentkeepalive": { - "version": "4.2.1", - "inBundle": true, - "license": "MIT", + "node_modules/nyc": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/nyc/-/nyc-15.1.0.tgz", + "integrity": "sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A==", + "dev": true, "dependencies": { - "debug": "^4.1.0", - "depd": "^1.1.2", - "humanize-ms": "^1.2.1" + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "caching-transform": "^4.0.0", + "convert-source-map": "^1.7.0", + "decamelize": "^1.2.0", + "find-cache-dir": "^3.2.0", + "find-up": "^4.1.0", + "foreground-child": "^2.0.0", + "get-package-type": "^0.1.0", + "glob": "^7.1.6", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-hook": "^3.0.0", + "istanbul-lib-instrument": "^4.0.0", + "istanbul-lib-processinfo": "^2.0.2", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.0.2", + "make-dir": "^3.0.0", + "node-preload": "^0.2.1", + "p-map": "^3.0.0", + "process-on-spawn": "^1.0.0", + "resolve-from": "^5.0.0", + "rimraf": "^3.0.0", + "signal-exit": "^3.0.2", + "spawn-wrap": "^2.0.0", + "test-exclude": "^6.0.0", + "yargs": "^15.0.2" + }, + "bin": { + "nyc": "bin/nyc.js" }, "engines": { - "node": ">= 8.0.0" + "node": ">=8.9" } }, - "node_modules/npm/node_modules/aggregate-error": { - "version": "3.1.0", - "inBundle": true, - "license": "MIT", + "node_modules/nyc/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": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - }, - "engines": { - "node": ">=8" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "node_modules/npm/node_modules/ansi-regex": { - "version": "5.0.1", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=8" + "node_modules/nyc/node_modules/cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" } }, - "node_modules/npm/node_modules/ansi-styles": { - "version": "4.3.0", - "inBundle": true, - "license": "MIT", + "node_modules/nyc/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, "dependencies": { - "color-convert": "^2.0.1" + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" }, "engines": { "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/npm/node_modules/aproba": { - "version": "2.0.0", - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/archy": { - "version": "1.0.0", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/are-we-there-yet": { - "version": "3.0.1", - "inBundle": true, - "license": "ISC", + "node_modules/nyc/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": { - "delegates": "^1.0.0", - "readable-stream": "^3.6.0" + "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": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/npm/node_modules/asap": { - "version": "2.0.6", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/balanced-match": { - "version": "1.0.2", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/bin-links": { - "version": "3.0.3", - "inBundle": true, - "license": "ISC", + "node_modules/nyc/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, "dependencies": { - "cmd-shim": "^5.0.0", - "mkdirp-infer-owner": "^2.0.0", - "npm-normalize-package-bin": "^2.0.0", - "read-cmd-shim": "^3.0.0", - "rimraf": "^3.0.0", - "write-file-atomic": "^4.0.0" + "p-locate": "^4.1.0" }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/bin-links/node_modules/npm-normalize-package-bin": { - "version": "2.0.0", - "inBundle": true, - "license": "ISC", - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/binary-extensions": { - "version": "2.2.0", - "inBundle": true, - "license": "MIT", "engines": { "node": ">=8" } }, - "node_modules/npm/node_modules/brace-expansion": { - "version": "2.0.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/npm/node_modules/builtins": { - "version": "5.0.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "semver": "^7.0.0" - } - }, - "node_modules/npm/node_modules/cacache": { - "version": "16.1.3", - "inBundle": true, - "license": "ISC", + "node_modules/nyc/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": { - "@npmcli/fs": "^2.1.0", - "@npmcli/move-file": "^2.0.0", - "chownr": "^2.0.0", - "fs-minipass": "^2.1.0", - "glob": "^8.0.1", - "infer-owner": "^1.0.4", - "lru-cache": "^7.7.1", - "minipass": "^3.1.6", - "minipass-collect": "^1.0.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "mkdirp": "^1.0.4", - "p-map": "^4.0.0", - "promise-inflight": "^1.0.1", - "rimraf": "^3.0.2", - "ssri": "^9.0.0", - "tar": "^6.1.11", - "unique-filename": "^2.0.0" + "brace-expansion": "^1.1.7" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "*" } }, - "node_modules/npm/node_modules/chalk": { - "version": "4.1.2", - "inBundle": true, - "license": "MIT", + "node_modules/nyc/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "p-try": "^2.0.0" }, "engines": { - "node": ">=10" + "node": ">=6" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/npm/node_modules/chownr": { - "version": "2.0.0", - "inBundle": true, - "license": "ISC", + "node_modules/nyc/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, "engines": { - "node": ">=10" + "node": ">=8" } }, - "node_modules/npm/node_modules/cidr-regex": { - "version": "3.1.1", - "inBundle": true, - "license": "BSD-2-Clause", + "node_modules/nyc/node_modules/p-map": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", + "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", + "dev": true, "dependencies": { - "ip-regex": "^4.1.0" + "aggregate-error": "^3.0.0" }, "engines": { - "node": ">=10" + "node": ">=8" } }, - "node_modules/npm/node_modules/clean-stack": { - "version": "2.2.0", - "inBundle": true, - "license": "MIT", + "node_modules/nyc/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, "engines": { - "node": ">=6" + "node": ">=8" } }, - "node_modules/npm/node_modules/cli-columns": { - "version": "4.0.0", - "inBundle": true, - "license": "MIT", + "node_modules/nyc/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": { - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1" + "glob": "^7.1.3" }, - "engines": { - "node": ">= 10" + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/npm/node_modules/cli-table3": { - "version": "0.6.2", - "inBundle": true, - "license": "MIT", + "node_modules/nyc/node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, "dependencies": { - "string-width": "^4.2.0" + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" }, "engines": { - "node": "10.* || >= 12.*" - }, - "optionalDependencies": { - "@colors/colors": "1.5.0" + "node": ">=8" } }, - "node_modules/npm/node_modules/clone": { - "version": "1.0.4", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=0.8" - } + "node_modules/nyc/node_modules/y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "dev": true }, - "node_modules/npm/node_modules/cmd-shim": { - "version": "5.0.0", - "inBundle": true, - "license": "ISC", + "node_modules/nyc/node_modules/yargs": { + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "dev": true, "dependencies": { - "mkdirp-infer-owner": "^2.0.0" + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=8" } }, - "node_modules/npm/node_modules/color-convert": { - "version": "2.0.1", - "inBundle": true, - "license": "MIT", + "node_modules/nyc/node_modules/yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "dev": true, "dependencies": { - "color-name": "~1.1.4" + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" }, "engines": { - "node": ">=7.0.0" + "node": ">=6" } }, - "node_modules/npm/node_modules/color-name": { - "version": "1.1.4", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/color-support": { - "version": "1.1.3", - "inBundle": true, - "license": "ISC", - "bin": { - "color-support": "bin.js" + "node_modules/oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "dev": true, + "engines": { + "node": "*" } }, - "node_modules/npm/node_modules/columnify": { - "version": "1.6.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "strip-ansi": "^6.0.1", - "wcwidth": "^1.0.0" - }, + "node_modules/object-assign": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.0.1.tgz", + "integrity": "sha512-c6legOHWepAbWnp3j5SRUMpxCXBKI4rD7A5Osn9IzZ8w4O/KccXdW0lqdkQKbpk0eHGjNgKihgzY6WuEq99Tfw==", "engines": { - "node": ">=8.0.0" + "node": ">=0.10.0" } }, - "node_modules/npm/node_modules/common-ancestor-path": { - "version": "1.0.1", - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/concat-map": { - "version": "0.0.1", - "inBundle": true, - "license": "MIT" + "node_modules/object-hash": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-1.3.1.tgz", + "integrity": "sha512-OSuu/pU4ENM9kmREg0BdNrUDIl1heYa4mBZacJc+vVWz4GtAwu7jO8s4AIt2aGRUTqxykpWzI3Oqnsm13tTMDA==", + "dev": true, + "engines": { + "node": ">= 0.10.0" + } }, - "node_modules/npm/node_modules/console-control-strings": { - "version": "1.1.0", - "inBundle": true, - "license": "ISC" + "node_modules/object-inspect": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", + "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "node_modules/npm/node_modules/cssesc": { - "version": "3.0.0", - "inBundle": true, - "license": "MIT", - "bin": { - "cssesc": "bin/cssesc" - }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, "engines": { - "node": ">=4" + "node": ">= 0.4" } }, - "node_modules/npm/node_modules/debug": { - "version": "4.3.4", - "inBundle": true, - "license": "MIT", + "node_modules/object.assign": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", + "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", + "dev": true, "dependencies": { - "ms": "2.1.2" + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" }, "engines": { - "node": ">=6.0" + "node": ">= 0.4" }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/npm/node_modules/debug/node_modules/ms": { - "version": "2.1.2", - "inBundle": true, - "license": "MIT" + "node_modules/on-error": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/on-error/-/on-error-2.1.0.tgz", + "integrity": "sha512-wpKXxCW2wXLI+9DB9DDBVuOCN9C5rjyaP4GWwqhgrSd2ys1Vyc9yGaPmC5HSOdQ30x9zCLozi9mHx3lm01E+LQ==" }, - "node_modules/npm/node_modules/debuglog": { - "version": "1.0.1", - "inBundle": true, - "license": "MIT", + "node_modules/on-exit-leak-free": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/on-exit-leak-free/-/on-exit-leak-free-2.1.2.tgz", + "integrity": "sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==", "engines": { - "node": "*" + "node": ">=14.0.0" } }, - "node_modules/npm/node_modules/defaults": { - "version": "1.0.3", - "inBundle": true, - "license": "MIT", + "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": { - "clone": "^1.0.2" + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" } }, - "node_modules/npm/node_modules/delegates": { - "version": "1.0.0", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/depd": { - "version": "1.1.2", - "inBundle": true, - "license": "MIT", + "node_modules/on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", "engines": { - "node": ">= 0.6" + "node": ">= 0.8" } }, - "node_modules/npm/node_modules/dezalgo": { - "version": "1.0.4", - "inBundle": true, - "license": "ISC", + "node_modules/once": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", + "integrity": "sha512-6vaNInhu+CHxtONf3zw3vq4SP2DOQhjBvIa3rNcG0+P7eKWlYH6Peu7rHizSloRU2EwMz6GraLieis9Ac9+p1w==", "dependencies": { - "asap": "^2.0.0", "wrappy": "1" } }, - "node_modules/npm/node_modules/diff": { - "version": "5.1.0", - "inBundle": true, - "license": "BSD-3-Clause", + "node_modules/onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==", + "dev": true, + "dependencies": { + "mimic-fn": "^1.0.0" + }, "engines": { - "node": ">=0.3.1" + "node": ">=4" } }, - "node_modules/npm/node_modules/emoji-regex": { - "version": "8.0.0", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/encoding": { - "version": "0.1.13", - "inBundle": true, - "license": "MIT", - "optional": true, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, "dependencies": { - "iconv-lite": "^0.6.2" - } - }, - "node_modules/npm/node_modules/env-paths": { - "version": "2.2.1", - "inBundle": true, - "license": "MIT", + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, "engines": { - "node": ">=6" + "node": ">= 0.8.0" } }, - "node_modules/npm/node_modules/err-code": { - "version": "2.0.3", - "inBundle": true, - "license": "MIT" + "node_modules/os": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/os/-/os-0.1.2.tgz", + "integrity": "sha512-ZoXJkvAnljwvc56MbvhtKVWmSkzV712k42Is2mA0+0KTSRakq5XXuXpjZjgAt9ctzl51ojhQWakQQpmOvXWfjQ==" }, - "node_modules/npm/node_modules/fastest-levenshtein": { - "version": "1.0.12", - "inBundle": true, - "license": "MIT" + "node_modules/os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "node_modules/npm/node_modules/fs-minipass": { - "version": "2.1.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "minipass": "^3.0.0" - }, + "node_modules/p-cancelable": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz", + "integrity": "sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==", "engines": { - "node": ">= 8" + "node": ">=12.20" } }, - "node_modules/npm/node_modules/fs.realpath": { + "node_modules/p-finally": { "version": "1.0.0", - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/function-bind": { - "version": "1.1.1", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/gauge": { - "version": "4.0.4", - "inBundle": true, - "license": "ISC", - "dependencies": { - "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.3", - "console-control-strings": "^1.1.0", - "has-unicode": "^2.0.1", - "signal-exit": "^3.0.7", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wide-align": "^1.1.5" - }, + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=4" } }, - "node_modules/npm/node_modules/glob": { - "version": "8.0.3", - "inBundle": true, - "license": "ISC", + "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==", "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" + "yocto-queue": "^0.1.0" }, "engines": { - "node": ">=12" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/npm/node_modules/graceful-fs": { - "version": "4.2.10", - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/has": { - "version": "1.0.3", - "inBundle": true, - "license": "MIT", + "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==", "dependencies": { - "function-bind": "^1.1.1" + "p-limit": "^3.0.2" }, "engines": { - "node": ">= 0.4.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/npm/node_modules/has-flag": { + "node_modules/p-map": { "version": "4.0.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/has-unicode": { - "version": "2.0.1", - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/hosted-git-info": { - "version": "5.2.1", - "inBundle": true, - "license": "ISC", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", "dependencies": { - "lru-cache": "^7.5.1" + "aggregate-error": "^3.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/npm/node_modules/http-cache-semantics": { - "version": "4.1.1", - "inBundle": true, - "license": "BSD-2-Clause" - }, - "node_modules/npm/node_modules/http-proxy-agent": { - "version": "5.0.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "@tootallnate/once": "2", - "agent-base": "6", - "debug": "4" - }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, "engines": { - "node": ">= 6" + "node": ">=6" } }, - "node_modules/npm/node_modules/https-proxy-agent": { - "version": "5.0.1", - "inBundle": true, - "license": "MIT", + "node_modules/pac-proxy-agent": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-7.0.1.tgz", + "integrity": "sha512-ASV8yU4LLKBAjqIPMbrgtaKIvxQri/yh2OpI+S6hVa9JRkUI3Y3NPFbfngDtY7oFtSMD3w31Xns89mDa3Feo5A==", + "optional": true, "dependencies": { - "agent-base": "6", - "debug": "4" + "@tootallnate/quickjs-emscripten": "^0.23.0", + "agent-base": "^7.0.2", + "debug": "^4.3.4", + "get-uri": "^6.0.1", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.2", + "pac-resolver": "^7.0.0", + "socks-proxy-agent": "^8.0.2" }, "engines": { - "node": ">= 6" - } - }, - "node_modules/npm/node_modules/humanize-ms": { - "version": "1.2.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "ms": "^2.0.0" + "node": ">= 14" } }, - "node_modules/npm/node_modules/iconv-lite": { - "version": "0.6.3", - "inBundle": true, - "license": "MIT", + "node_modules/pac-proxy-agent/node_modules/agent-base": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", + "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", "optional": true, "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" + "debug": "^4.3.4" }, "engines": { - "node": ">=0.10.0" + "node": ">= 14" } }, - "node_modules/npm/node_modules/ignore-walk": { - "version": "5.0.1", - "inBundle": true, - "license": "ISC", + "node_modules/pac-proxy-agent/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "optional": true, "dependencies": { - "minimatch": "^5.0.1" + "ms": "2.1.2" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "node_modules/npm/node_modules/imurmurhash": { - "version": "0.1.4", - "inBundle": true, - "license": "MIT", + "node_modules/pac-proxy-agent/node_modules/http-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "optional": true, + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, "engines": { - "node": ">=0.8.19" + "node": ">= 14" } }, - "node_modules/npm/node_modules/indent-string": { - "version": "4.0.0", - "inBundle": true, - "license": "MIT", + "node_modules/pac-proxy-agent/node_modules/https-proxy-agent": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.4.tgz", + "integrity": "sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg==", + "optional": true, + "dependencies": { + "agent-base": "^7.0.2", + "debug": "4" + }, "engines": { - "node": ">=8" + "node": ">= 14" } }, - "node_modules/npm/node_modules/infer-owner": { - "version": "1.0.4", - "inBundle": true, - "license": "ISC" + "node_modules/pac-proxy-agent/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==", + "optional": true }, - "node_modules/npm/node_modules/inflight": { - "version": "1.0.6", - "inBundle": true, - "license": "ISC", + "node_modules/pac-proxy-agent/node_modules/socks-proxy-agent": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.3.tgz", + "integrity": "sha512-VNegTZKhuGq5vSD6XNKlbqWhyt/40CgoEw8XxD6dhnm8Jq9IEa3nIa4HwnM8XOqU0CdB0BwWVXusqiFXfHB3+A==", + "optional": true, "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/npm/node_modules/inherits": { - "version": "2.0.4", - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/ini": { - "version": "3.0.1", - "inBundle": true, - "license": "ISC", + "agent-base": "^7.1.1", + "debug": "^4.3.4", + "socks": "^2.7.1" + }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">= 14" } }, - "node_modules/npm/node_modules/init-package-json": { - "version": "3.0.2", - "inBundle": true, - "license": "ISC", + "node_modules/pac-resolver": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-7.0.1.tgz", + "integrity": "sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==", + "optional": true, "dependencies": { - "npm-package-arg": "^9.0.1", - "promzard": "^0.3.0", - "read": "^1.0.7", - "read-package-json": "^5.0.0", - "semver": "^7.3.5", - "validate-npm-package-license": "^3.0.4", - "validate-npm-package-name": "^4.0.0" + "degenerator": "^5.0.0", + "netmask": "^2.0.2" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">= 14" } }, - "node_modules/npm/node_modules/ip": { - "version": "2.0.0", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/ip-regex": { - "version": "4.3.0", - "inBundle": true, - "license": "MIT", + "node_modules/package-hash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-4.0.0.tgz", + "integrity": "sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.15", + "hasha": "^5.0.0", + "lodash.flattendeep": "^4.4.0", + "release-zalgo": "^1.0.0" + }, "engines": { "node": ">=8" } }, - "node_modules/npm/node_modules/is-cidr": { - "version": "4.0.2", - "inBundle": true, - "license": "BSD-2-Clause", + "node_modules/package-json": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-8.1.1.tgz", + "integrity": "sha512-cbH9IAIJHNj9uXi196JVsRlt7cHKak6u/e6AkL/bkRelZ7rlL3X1YKxsZwa36xipOEKAsdtmaG6aAJoM1fx2zA==", "dependencies": { - "cidr-regex": "^3.1.1" + "got": "^12.1.0", + "registry-auth-token": "^5.0.1", + "registry-url": "^6.0.0", + "semver": "^7.3.7" }, "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/is-core-module": { - "version": "2.10.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "has": "^1.0.3" + "node": ">=14.16" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/npm/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "inBundle": true, - "license": "MIT", + "node_modules/pacote": { + "version": "15.2.0", + "resolved": "https://registry.npmjs.org/pacote/-/pacote-15.2.0.tgz", + "integrity": "sha512-rJVZeIwHTUta23sIZgEIM62WYwbmGbThdbnkt81ravBplQv+HjyroqnLRNH2+sLJHcGZmLRmhPwACqhfTcOmnA==", + "dependencies": { + "@npmcli/git": "^4.0.0", + "@npmcli/installed-package-contents": "^2.0.1", + "@npmcli/promise-spawn": "^6.0.1", + "@npmcli/run-script": "^6.0.0", + "cacache": "^17.0.0", + "fs-minipass": "^3.0.0", + "minipass": "^5.0.0", + "npm-package-arg": "^10.0.0", + "npm-packlist": "^7.0.0", + "npm-pick-manifest": "^8.0.0", + "npm-registry-fetch": "^14.0.0", + "proc-log": "^3.0.0", + "promise-retry": "^2.0.1", + "read-package-json": "^6.0.0", + "read-package-json-fast": "^3.0.0", + "sigstore": "^1.3.0", + "ssri": "^10.0.0", + "tar": "^6.1.11" + }, + "bin": { + "pacote": "lib/bin.js" + }, "engines": { - "node": ">=8" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/npm/node_modules/is-lambda": { + "node_modules/parent-module": { "version": "1.0.1", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/isexe": { - "version": "2.0.0", - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/json-stringify-nice": { - "version": "1.1.4", - "inBundle": true, - "license": "ISC", - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/npm/node_modules/jsonparse": { - "version": "1.3.1", - "engines": [ - "node >= 0.2.0" - ], - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/just-diff": { - "version": "5.1.1", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/just-diff-apply": { - "version": "5.4.1", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/libnpmaccess": { - "version": "6.0.4", - "inBundle": true, - "license": "ISC", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, "dependencies": { - "aproba": "^2.0.0", - "minipass": "^3.1.1", - "npm-package-arg": "^9.0.1", - "npm-registry-fetch": "^13.0.0" + "callsites": "^3.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=6" } }, - "node_modules/npm/node_modules/libnpmdiff": { - "version": "4.0.5", - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/disparity-colors": "^2.0.0", - "@npmcli/installed-package-contents": "^1.0.7", - "binary-extensions": "^2.2.0", - "diff": "^5.1.0", - "minimatch": "^5.0.1", - "npm-package-arg": "^9.0.1", - "pacote": "^13.6.1", - "tar": "^6.1.0" + "node_modules/parse-github-url": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/parse-github-url/-/parse-github-url-1.0.2.tgz", + "integrity": "sha512-kgBf6avCbO3Cn6+RnzRGLkUsv4ZVqv/VfAYkRsyBcgkshNvVBkRn1FEZcW0Jb+npXQWm2vHPnnOqFteZxRRGNw==", + "bin": { + "parse-github-url": "cli.js" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=0.10.0" } }, - "node_modules/npm/node_modules/libnpmexec": { - "version": "4.0.14", - "inBundle": true, - "license": "ISC", + "node_modules/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", + "dev": true, "dependencies": { - "@npmcli/arborist": "^5.6.3", - "@npmcli/ci-detect": "^2.0.0", - "@npmcli/fs": "^2.1.1", - "@npmcli/run-script": "^4.2.0", - "chalk": "^4.1.0", - "mkdirp-infer-owner": "^2.0.0", - "npm-package-arg": "^9.0.1", - "npmlog": "^6.0.2", - "pacote": "^13.6.1", - "proc-log": "^2.0.0", - "read": "^1.0.7", - "read-package-json-fast": "^2.0.2", - "semver": "^7.3.7", - "walk-up-path": "^1.0.0" + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=4" } }, - "node_modules/npm/node_modules/libnpmfund": { - "version": "3.0.5", - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/arborist": "^5.6.3" - }, + "node_modules/parse-ms": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-2.1.0.tgz", + "integrity": "sha512-kHt7kzLoS9VBZfUsiKjv43mr91ea+U05EyKkEtqp7vNbHxmaVuEqN7XxeEVnGrMtYOAxGrDElSi96K7EgO1zCA==", + "dev": true, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=6" } }, - "node_modules/npm/node_modules/libnpmhook": { - "version": "8.0.4", - "inBundle": true, - "license": "ISC", - "dependencies": { - "aproba": "^2.0.0", - "npm-registry-fetch": "^13.0.0" - }, + "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": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">= 0.8" } }, - "node_modules/npm/node_modules/libnpmorg": { - "version": "4.0.4", - "inBundle": true, - "license": "ISC", + "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": { - "aproba": "^2.0.0", - "npm-registry-fetch": "^13.0.0" - }, + "process": "^0.11.1", + "util": "^0.10.3" + } + }, + "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==", "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=8" } }, - "node_modules/npm/node_modules/libnpmpack": { - "version": "4.1.3", - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/run-script": "^4.1.3", - "npm-package-arg": "^9.0.1", - "pacote": "^13.6.1" - }, + "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": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=0.10.0" } }, - "node_modules/npm/node_modules/libnpmpublish": { - "version": "6.0.5", - "inBundle": true, - "license": "ISC", - "dependencies": { - "normalize-package-data": "^4.0.0", - "npm-package-arg": "^9.0.1", - "npm-registry-fetch": "^13.0.0", - "semver": "^7.3.7", - "ssri": "^9.0.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==", + "dev": true + }, + "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==", "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=8" } }, - "node_modules/npm/node_modules/libnpmsearch": { - "version": "5.0.4", - "inBundle": true, - "license": "ISC", + "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-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", "dependencies": { - "npm-registry-fetch": "^13.0.0" + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/npm/node_modules/libnpmteam": { - "version": "4.0.4", - "inBundle": true, - "license": "ISC", - "dependencies": { - "aproba": "^2.0.0", - "npm-registry-fetch": "^13.0.0" - }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.2.tgz", + "integrity": "sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==", "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "14 || >=16.14" } }, - "node_modules/npm/node_modules/libnpmversion": { - "version": "3.0.7", - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/git": "^3.0.0", - "@npmcli/run-script": "^4.1.3", - "json-parse-even-better-errors": "^2.3.1", - "proc-log": "^2.0.0", - "semver": "^7.3.7" - }, + "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": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=8" } }, - "node_modules/npm/node_modules/lru-cache": { - "version": "7.13.2", - "inBundle": true, - "license": "ISC", + "node_modules/pathval": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.0.tgz", + "integrity": "sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==", + "dev": true, "engines": { - "node": ">=12" + "node": ">= 14.16" } }, - "node_modules/npm/node_modules/make-fetch-happen": { - "version": "10.2.1", - "inBundle": true, - "license": "ISC", - "dependencies": { - "agentkeepalive": "^4.2.1", - "cacache": "^16.1.0", - "http-cache-semantics": "^4.1.0", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.0", - "is-lambda": "^1.0.1", - "lru-cache": "^7.7.1", - "minipass": "^3.1.6", - "minipass-collect": "^1.0.2", - "minipass-fetch": "^2.0.3", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.3", - "promise-retry": "^2.0.1", - "socks-proxy-agent": "^7.0.0", - "ssri": "^9.0.0" - }, + "node_modules/pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", + "optional": true + }, + "node_modules/performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", + "dev": true + }, + "node_modules/pg-connection-string": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.6.4.tgz", + "integrity": "sha512-v+Z7W/0EO707aNMaAEfiGnGL9sxxumwLl2fJvCQtMn9Fxsg+lPpPkdcyBSv/KFgpGdYkMfn+EI1Or2EHjpgLCA==" + }, + "node_modules/picocolors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", + "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/npm/node_modules/minimatch": { - "version": "5.1.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, + "node_modules/pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", + "dev": true, "engines": { - "node": ">=10" + "node": ">=4" } }, - "node_modules/npm/node_modules/minipass": { - "version": "3.3.4", - "inBundle": true, - "license": "ISC", + "node_modules/pino": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/pino/-/pino-9.1.0.tgz", + "integrity": "sha512-qUcgfrlyOtjwhNLdbhoL7NR4NkHjzykAPw0V2QLFbvu/zss29h4NkRnibyFzBrNCbzCOY3WZ9hhKSwfOkNggYA==", "dependencies": { - "yallist": "^4.0.0" + "atomic-sleep": "^1.0.0", + "fast-redact": "^3.1.1", + "on-exit-leak-free": "^2.1.0", + "pino-abstract-transport": "^1.2.0", + "pino-std-serializers": "^7.0.0", + "process-warning": "^3.0.0", + "quick-format-unescaped": "^4.0.3", + "real-require": "^0.2.0", + "safe-stable-stringify": "^2.3.1", + "sonic-boom": "^4.0.1", + "thread-stream": "^3.0.0" }, - "engines": { - "node": ">=8" + "bin": { + "pino": "bin.js" } }, - "node_modules/npm/node_modules/minipass-collect": { - "version": "1.0.2", - "inBundle": true, - "license": "ISC", + "node_modules/pino-abstract-transport": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pino-abstract-transport/-/pino-abstract-transport-1.2.0.tgz", + "integrity": "sha512-Guhh8EZfPCfH+PMXAb6rKOjGQEoy0xlAIn+irODG5kgfYV+BQ0rGYYWTIel3P5mmyXqkYkPmdIkywsn6QKUR1Q==", "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" + "readable-stream": "^4.0.0", + "split2": "^4.0.0" } }, - "node_modules/npm/node_modules/minipass-fetch": { - "version": "2.1.1", - "inBundle": true, - "license": "MIT", + "node_modules/pino-abstract-transport/node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "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": { - "minipass": "^3.1.6", - "minipass-sized": "^1.0.3", - "minizlib": "^2.1.2" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - }, - "optionalDependencies": { - "encoding": "^0.1.13" + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" } }, - "node_modules/npm/node_modules/minipass-flush": { - "version": "1.0.5", - "inBundle": true, - "license": "ISC", + "node_modules/pino-abstract-transport/node_modules/readable-stream": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.5.2.tgz", + "integrity": "sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==", "dependencies": { - "minipass": "^3.0.0" + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" }, "engines": { - "node": ">= 8" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, - "node_modules/npm/node_modules/minipass-json-stream": { - "version": "1.0.1", - "inBundle": true, - "license": "MIT", + "node_modules/pino-abstract-transport/node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", "dependencies": { - "jsonparse": "^1.3.1", - "minipass": "^3.0.0" + "safe-buffer": "~5.2.0" } }, - "node_modules/npm/node_modules/minipass-pipeline": { - "version": "1.2.4", - "inBundle": true, - "license": "ISC", + "node_modules/pino-std-serializers": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-7.0.0.tgz", + "integrity": "sha512-e906FRY0+tV27iq4juKzSYPbUj2do2X2JX4EzSca1631EB2QJQUqGbDuERal7LCtOpxl6x3+nvo9NPZcmjkiFA==" + }, + "node_modules/pkg-conf": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/pkg-conf/-/pkg-conf-2.1.0.tgz", + "integrity": "sha512-C+VUP+8jis7EsQZIhDYmS5qlNtjv2yP4SNtjXK9AP1ZcTRlnSfuumaTnRfYZnYgUUYVIKqL0fRvmUGDV2fmp6g==", + "dev": true, "dependencies": { - "minipass": "^3.0.0" + "find-up": "^2.0.0", + "load-json-file": "^4.0.0" }, "engines": { - "node": ">=8" + "node": ">=4" } }, - "node_modules/npm/node_modules/minipass-sized": { - "version": "1.0.3", - "inBundle": true, - "license": "ISC", + "node_modules/pkg-conf/node_modules/find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==", + "dev": true, "dependencies": { - "minipass": "^3.0.0" + "locate-path": "^2.0.0" }, "engines": { - "node": ">=8" + "node": ">=4" } }, - "node_modules/npm/node_modules/minizlib": { - "version": "2.1.2", - "inBundle": true, - "license": "MIT", + "node_modules/pkg-conf/node_modules/locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==", + "dev": true, "dependencies": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" }, "engines": { - "node": ">= 8" + "node": ">=4" } }, - "node_modules/npm/node_modules/mkdirp": { - "version": "1.0.4", - "inBundle": true, - "license": "MIT", - "bin": { - "mkdirp": "bin/cmd.js" + "node_modules/pkg-conf/node_modules/p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "dependencies": { + "p-try": "^1.0.0" }, "engines": { - "node": ">=10" + "node": ">=4" } }, - "node_modules/npm/node_modules/mkdirp-infer-owner": { + "node_modules/pkg-conf/node_modules/p-locate": { "version": "2.0.0", - "inBundle": true, - "license": "ISC", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==", + "dev": true, "dependencies": { - "chownr": "^2.0.0", - "infer-owner": "^1.0.4", - "mkdirp": "^1.0.3" + "p-limit": "^1.1.0" }, "engines": { - "node": ">=10" + "node": ">=4" } }, - "node_modules/npm/node_modules/ms": { - "version": "2.1.3", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/mute-stream": { - "version": "0.0.8", - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/negotiator": { - "version": "0.6.3", - "inBundle": true, - "license": "MIT", + "node_modules/pkg-conf/node_modules/p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==", + "dev": true, "engines": { - "node": ">= 0.6" + "node": ">=4" } }, - "node_modules/npm/node_modules/node-gyp": { - "version": "9.1.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "env-paths": "^2.2.0", - "glob": "^7.1.4", - "graceful-fs": "^4.2.6", - "make-fetch-happen": "^10.0.3", - "nopt": "^5.0.0", - "npmlog": "^6.0.0", - "rimraf": "^3.0.2", - "semver": "^7.3.5", - "tar": "^6.1.2", - "which": "^2.0.2" - }, - "bin": { - "node-gyp": "bin/node-gyp.js" - }, + "node_modules/pkg-conf/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "dev": true, "engines": { - "node": "^12.22 || ^14.13 || >=16" + "node": ">=4" } }, - "node_modules/npm/node_modules/node-gyp/node_modules/brace-expansion": { - "version": "1.1.11", - "inBundle": true, - "license": "MIT", + "node_modules/pkg-config": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pkg-config/-/pkg-config-1.1.1.tgz", + "integrity": "sha512-ft/WI9YK6FuTuw4Ql+QUaNXtm/ASQNqDUUsZEgFZKyFpW6amyP8Gx01xrRs8KdiNbbqXfYxkOXplpq1euWbOjw==", + "dev": true, "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "debug-log": "^1.0.0", + "find-root": "^1.0.0", + "xtend": "^4.0.1" + }, + "engines": { + "node": ">=0.10" } }, - "node_modules/npm/node_modules/node-gyp/node_modules/glob": { - "version": "7.2.3", - "inBundle": true, - "license": "ISC", + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "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" + "find-up": "^4.0.0" }, "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">=8" } }, - "node_modules/npm/node_modules/node-gyp/node_modules/minimatch": { - "version": "3.1.2", - "inBundle": true, - "license": "ISC", + "node_modules/pkg-dir/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, "dependencies": { - "brace-expansion": "^1.1.7" + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" }, "engines": { - "node": "*" + "node": ">=8" } }, - "node_modules/npm/node_modules/node-gyp/node_modules/nopt": { + "node_modules/pkg-dir/node_modules/locate-path": { "version": "5.0.0", - "inBundle": true, - "license": "ISC", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, "dependencies": { - "abbrev": "1" - }, - "bin": { - "nopt": "bin/nopt.js" + "p-locate": "^4.1.0" }, "engines": { - "node": ">=6" + "node": ">=8" } }, - "node_modules/npm/node_modules/nopt": { - "version": "6.0.0", - "inBundle": true, - "license": "ISC", + "node_modules/pkg-dir/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, "dependencies": { - "abbrev": "^1.0.0" - }, - "bin": { - "nopt": "bin/nopt.js" + "p-try": "^2.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/normalize-package-data": { - "version": "4.0.1", - "inBundle": true, - "license": "BSD-2-Clause", - "dependencies": { - "hosted-git-info": "^5.0.0", - "is-core-module": "^2.8.1", - "semver": "^7.3.5", - "validate-npm-package-license": "^3.0.4" + "node": ">=6" }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/npm/node_modules/npm-audit-report": { - "version": "3.0.0", - "inBundle": true, - "license": "ISC", + "node_modules/pkg-dir/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, "dependencies": { - "chalk": "^4.0.0" + "p-limit": "^2.2.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=8" } }, - "node_modules/npm/node_modules/npm-bundled": { - "version": "2.0.1", - "inBundle": true, - "license": "ISC", - "dependencies": { - "npm-normalize-package-bin": "^2.0.0" - }, + "node_modules/pluralize": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-7.0.0.tgz", + "integrity": "sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow==", + "dev": true, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=4" } }, - "node_modules/npm/node_modules/npm-bundled/node_modules/npm-normalize-package-bin": { - "version": "2.0.0", - "inBundle": true, - "license": "ISC", + "node_modules/pony-cause": { + "version": "2.1.11", + "resolved": "https://registry.npmjs.org/pony-cause/-/pony-cause-2.1.11.tgz", + "integrity": "sha512-M7LhCsdNbNgiLYiP4WjsfLUuFmCfnjdF6jKe2R9NKl4WFN+HZPGHJZ9lnLP7f9ZnKe3U9nuWD0szirmj+migUg==", "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=12.0.0" } }, - "node_modules/npm/node_modules/npm-install-checks": { - "version": "5.0.0", - "inBundle": true, - "license": "BSD-2-Clause", + "node_modules/portscanner": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/portscanner/-/portscanner-2.2.0.tgz", + "integrity": "sha512-IFroCz/59Lqa2uBvzK3bKDbDDIEaAY8XJ1jFxcLWTqosrsc32//P4VuSB2vZXoHiHqOmx8B5L5hnKOxL/7FlPw==", "dependencies": { - "semver": "^7.1.1" + "async": "^2.6.0", + "is-number-like": "^1.0.3" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=0.4", + "npm": ">=1.0.0" } }, - "node_modules/npm/node_modules/npm-normalize-package-bin": { - "version": "1.0.1", - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/npm-package-arg": { - "version": "9.1.0", - "inBundle": true, - "license": "ISC", + "node_modules/portscanner/node_modules/async": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", + "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", "dependencies": { - "hosted-git-info": "^5.0.0", - "proc-log": "^2.0.1", - "semver": "^7.3.5", - "validate-npm-package-name": "^4.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "lodash": "^4.17.14" } }, - "node_modules/npm/node_modules/npm-packlist": { - "version": "5.1.3", - "inBundle": true, - "license": "ISC", - "dependencies": { - "glob": "^8.0.1", - "ignore-walk": "^5.0.1", - "npm-bundled": "^2.0.0", - "npm-normalize-package-bin": "^2.0.0" - }, - "bin": { - "npm-packlist": "bin/index.js" - }, + "node_modules/possible-typed-array-names": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", + "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", + "dev": true, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">= 0.4" } }, - "node_modules/npm/node_modules/npm-packlist/node_modules/npm-normalize-package-bin": { - "version": "2.0.0", - "inBundle": true, - "license": "ISC", + "node_modules/postman-collection": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/postman-collection/-/postman-collection-4.4.0.tgz", + "integrity": "sha512-2BGDFcUwlK08CqZFUlIC8kwRJueVzPjZnnokWPtJCd9f2J06HBQpGL7t2P1Ud1NEsK9NHq9wdipUhWLOPj5s/Q==", + "dev": true, + "dependencies": { + "@faker-js/faker": "5.5.3", + "file-type": "3.9.0", + "http-reasons": "0.1.0", + "iconv-lite": "0.6.3", + "liquid-json": "0.3.1", + "lodash": "4.17.21", + "mime-format": "2.0.1", + "mime-types": "2.1.35", + "postman-url-encoder": "3.0.5", + "semver": "7.5.4", + "uuid": "8.3.2" + }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=10" } }, - "node_modules/npm/node_modules/npm-pick-manifest": { - "version": "7.0.2", - "inBundle": true, - "license": "ISC", + "node_modules/postman-collection-transformer": { + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/postman-collection-transformer/-/postman-collection-transformer-4.1.8.tgz", + "integrity": "sha512-smJ6X7Z7kbg6hp7JZPFixrSN3J3WkQed7DrWCC5tF7IxOMpFLqhtTtGssY8nD1inP8+mJf+N72Pf2ttUAHgBKw==", + "dev": true, "dependencies": { - "npm-install-checks": "^5.0.0", - "npm-normalize-package-bin": "^2.0.0", - "npm-package-arg": "^9.0.0", - "semver": "^7.3.5" + "commander": "8.3.0", + "inherits": "2.0.4", + "lodash": "4.17.21", + "semver": "7.5.4", + "strip-json-comments": "3.1.1" + }, + "bin": { + "postman-collection-transformer": "bin/transform-collection.js" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=10" } }, - "node_modules/npm/node_modules/npm-pick-manifest/node_modules/npm-normalize-package-bin": { - "version": "2.0.0", - "inBundle": true, - "license": "ISC", + "node_modules/postman-collection-transformer/node_modules/commander": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "dev": true, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">= 12" } }, - "node_modules/npm/node_modules/npm-profile": { - "version": "6.2.1", - "inBundle": true, - "license": "ISC", + "node_modules/postman-collection-transformer/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": { - "npm-registry-fetch": "^13.0.1", - "proc-log": "^2.0.0" + "yallist": "^4.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=10" } }, - "node_modules/npm/node_modules/npm-registry-fetch": { - "version": "13.3.1", - "inBundle": true, - "license": "ISC", + "node_modules/postman-collection-transformer/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": { - "make-fetch-happen": "^10.0.6", - "minipass": "^3.1.6", - "minipass-fetch": "^2.0.3", - "minipass-json-stream": "^1.0.1", - "minizlib": "^2.1.2", - "npm-package-arg": "^9.0.1", - "proc-log": "^2.0.0" + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=10" } }, - "node_modules/npm/node_modules/npm-user-validate": { - "version": "1.0.1", - "inBundle": true, - "license": "BSD-2-Clause" - }, - "node_modules/npm/node_modules/npmlog": { - "version": "6.0.2", - "inBundle": true, - "license": "ISC", + "node_modules/postman-collection/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, "dependencies": { - "are-we-there-yet": "^3.0.0", - "console-control-strings": "^1.1.0", - "gauge": "^4.0.3", - "set-blocking": "^2.0.0" + "safer-buffer": ">= 2.1.2 < 3.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/once": { - "version": "1.4.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/npm/node_modules/opener": { - "version": "1.5.2", - "inBundle": true, - "license": "(WTFPL OR MIT)", - "bin": { - "opener": "bin/opener-bin.js" + "node": ">=0.10.0" } }, - "node_modules/npm/node_modules/p-map": { - "version": "4.0.0", - "inBundle": true, - "license": "MIT", + "node_modules/postman-collection/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": { - "aggregate-error": "^3.0.0" + "yallist": "^4.0.0" }, "engines": { "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/npm/node_modules/pacote": { - "version": "13.6.2", - "inBundle": true, - "license": "ISC", + "node_modules/postman-collection/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": { - "@npmcli/git": "^3.0.0", - "@npmcli/installed-package-contents": "^1.0.7", - "@npmcli/promise-spawn": "^3.0.0", - "@npmcli/run-script": "^4.1.0", - "cacache": "^16.0.0", - "chownr": "^2.0.0", - "fs-minipass": "^2.1.0", - "infer-owner": "^1.0.4", - "minipass": "^3.1.6", - "mkdirp": "^1.0.4", - "npm-package-arg": "^9.0.0", - "npm-packlist": "^5.1.0", - "npm-pick-manifest": "^7.0.0", - "npm-registry-fetch": "^13.0.1", - "proc-log": "^2.0.0", - "promise-retry": "^2.0.1", - "read-package-json": "^5.0.0", - "read-package-json-fast": "^2.0.3", - "rimraf": "^3.0.2", - "ssri": "^9.0.0", - "tar": "^6.1.11" + "lru-cache": "^6.0.0" }, "bin": { - "pacote": "lib/bin.js" + "semver": "bin/semver.js" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=10" } }, - "node_modules/npm/node_modules/parse-conflict-json": { - "version": "2.0.2", - "inBundle": true, - "license": "ISC", + "node_modules/postman-request": { + "version": "2.88.1-postman.33", + "resolved": "https://registry.npmjs.org/postman-request/-/postman-request-2.88.1-postman.33.tgz", + "integrity": "sha512-uL9sCML4gPH6Z4hreDWbeinKU0p0Ke261nU7OvII95NU22HN6Dk7T/SaVPaj6T4TsQqGKIFw6/woLZnH7ugFNA==", + "dev": true, "dependencies": { - "json-parse-even-better-errors": "^2.3.1", - "just-diff": "^5.0.1", - "just-diff-apply": "^5.2.0" + "@postman/form-data": "~3.1.1", + "@postman/tough-cookie": "~4.1.3-postman.1", + "@postman/tunnel-agent": "^0.6.3", + "aws-sign2": "~0.7.0", + "aws4": "^1.12.0", + "brotli": "^1.3.3", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "har-validator": "~5.1.3", + "http-signature": "~1.3.1", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "^2.1.35", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.3", + "safe-buffer": "^5.1.2", + "stream-length": "^1.0.2", + "uuid": "^8.3.2" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">= 6" } }, - "node_modules/npm/node_modules/path-is-absolute": { - "version": "1.0.1", - "inBundle": true, - "license": "MIT", + "node_modules/postman-request/node_modules/qs": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", + "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", + "dev": true, "engines": { - "node": ">=0.10.0" + "node": ">=0.6" } }, - "node_modules/npm/node_modules/postcss-selector-parser": { - "version": "6.0.10", - "inBundle": true, - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" + "node_modules/postman-runtime": { + "version": "7.37.1", + "resolved": "https://registry.npmjs.org/postman-runtime/-/postman-runtime-7.37.1.tgz", + "integrity": "sha512-yqKN/p6Ba8+yq9iZsxJLkMPko3lKvs3hixkiPy5O7bapFQWgX6jWhny4W2O8BzE5T8KzE8s1HAgT2gi7e2Y5Jg==", + "dev": true, + "dependencies": { + "@postman/tough-cookie": "4.1.3-postman.1", + "async": "3.2.5", + "aws4": "1.12.0", + "handlebars": "4.7.8", + "httpntlm": "1.8.13", + "jose": "4.14.4", + "js-sha512": "0.9.0", + "lodash": "4.17.21", + "mime-types": "2.1.35", + "node-forge": "1.3.1", + "node-oauth1": "1.3.0", + "performance-now": "2.1.0", + "postman-collection": "4.4.0", + "postman-request": "2.88.1-postman.33", + "postman-sandbox": "4.6.0", + "postman-url-encoder": "3.0.5", + "serialised-error": "1.1.3", + "strip-json-comments": "3.1.1", + "uuid": "8.3.2" }, "engines": { - "node": ">=4" + "node": ">=12" } }, - "node_modules/npm/node_modules/proc-log": { - "version": "2.0.1", - "inBundle": true, - "license": "ISC", + "node_modules/postman-sandbox": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/postman-sandbox/-/postman-sandbox-4.6.0.tgz", + "integrity": "sha512-+tCUEhiFAV6saqMEetRzLmSWt4/9kgVagtnrVgyqVgIGdPBIaq1p3aay54bOzYW7/QjIIz0xPF3YkJA8Olt3LQ==", + "dev": true, + "dependencies": { + "lodash": "4.17.21", + "postman-collection": "4.4.0", + "teleport-javascript": "1.0.0", + "uvm": "2.1.1" + }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/promise-all-reject-late": { - "version": "1.0.1", - "inBundle": true, - "license": "ISC", - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/npm/node_modules/promise-call-limit": { - "version": "1.0.1", - "inBundle": true, - "license": "ISC", - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">=10" } }, - "node_modules/npm/node_modules/promise-inflight": { - "version": "1.0.1", - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/promise-retry": { - "version": "2.0.1", - "inBundle": true, - "license": "MIT", + "node_modules/postman-url-encoder": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/postman-url-encoder/-/postman-url-encoder-3.0.5.tgz", + "integrity": "sha512-jOrdVvzUXBC7C+9gkIkpDJ3HIxOHTIqjpQ4C1EMt1ZGeMvSEpbFCKq23DEfgsj46vMnDgyQf+1ZLp2Wm+bKSsA==", + "dev": true, "dependencies": { - "err-code": "^2.0.2", - "retry": "^0.12.0" + "punycode": "^2.1.1" }, "engines": { "node": ">=10" } }, - "node_modules/npm/node_modules/promzard": { - "version": "0.3.0", - "inBundle": true, - "license": "ISC", + "node_modules/prebuild-install": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.2.tgz", + "integrity": "sha512-UnNke3IQb6sgarcZIDU3gbMeTp/9SSU1DAIkil7PrqG1vZlBtY5msYccSKSHDqa3hNg436IXK+SNImReuA1wEQ==", "dependencies": { - "read": "1" - } - }, - "node_modules/npm/node_modules/qrcode-terminal": { - "version": "0.12.0", - "inBundle": true, + "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": { - "qrcode-terminal": "bin/qrcode-terminal.js" + "prebuild-install": "bin.js" + }, + "engines": { + "node": ">=10" } }, - "node_modules/npm/node_modules/read": { - "version": "1.0.7", - "inBundle": true, - "license": "ISC", + "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/pretty-ms": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-7.0.1.tgz", + "integrity": "sha512-973driJZvxiGOQ5ONsFhOF/DtzPMOMtgC11kCpUrPGMTgqp2q/1gwzCquocrN33is0VZ5GFHXZYMM9l6h67v2Q==", + "dev": true, "dependencies": { - "mute-stream": "~0.0.4" + "parse-ms": "^2.1.0" }, "engines": { - "node": ">=0.8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/npm/node_modules/read-cmd-shim": { + "node_modules/proc-log": { "version": "3.0.0", - "inBundle": true, - "license": "ISC", + "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-3.0.0.tgz", + "integrity": "sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A==", "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/npm/node_modules/read-package-json": { - "version": "5.0.2", - "inBundle": true, - "license": "ISC", + "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/process-on-spawn": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/process-on-spawn/-/process-on-spawn-1.0.0.tgz", + "integrity": "sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg==", + "dev": true, "dependencies": { - "glob": "^8.0.1", - "json-parse-even-better-errors": "^2.3.1", - "normalize-package-data": "^4.0.0", - "npm-normalize-package-bin": "^2.0.0" + "fromentries": "^1.2.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=8" } }, - "node_modules/npm/node_modules/read-package-json-fast": { + "node_modules/process-warning": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-3.0.0.tgz", + "integrity": "sha512-mqn0kFRl0EoqhnL0GQ0veqFHyIN1yig9RHh/InzORTUiZHFRAur+aMtRkELNwGs9aNwKS6tg/An4NYBPGwvtzQ==" + }, + "node_modules/progress": { "version": "2.0.3", - "inBundle": true, - "license": "ISC", - "dependencies": { - "json-parse-even-better-errors": "^2.3.0", - "npm-normalize-package-bin": "^1.0.1" - }, + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", "engines": { - "node": ">=10" + "node": ">=0.4.0" } }, - "node_modules/npm/node_modules/read-package-json/node_modules/npm-normalize-package-bin": { - "version": "2.0.0", - "inBundle": true, - "license": "ISC", + "node_modules/promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==" + }, + "node_modules/promise-polyfill": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/promise-polyfill/-/promise-polyfill-2.1.4.tgz", + "integrity": "sha512-/DVUJXyaiYr7Pu0q2qPV/OtABpiukAHswJb9VV/tUVFsvC5iZUTyVPxfEr8cIVatGa5/Mxeli8QMyzAMBmoiYg==" + }, + "node_modules/promise-retry": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", + "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", + "dependencies": { + "err-code": "^2.0.2", + "retry": "^0.12.0" + }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=10" } }, - "node_modules/npm/node_modules/readable-stream": { - "version": "3.6.0", - "inBundle": true, - "license": "MIT", + "node_modules/prompts-ncu": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/prompts-ncu/-/prompts-ncu-3.0.0.tgz", + "integrity": "sha512-qyz9UxZ5MlPKWVhWrCmSZ1ahm2GVYdjLb8og2sg0IPth1KRuhcggHGuijz0e41dkx35p1t1q3GRISGH7QGALFA==", "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" + "kleur": "^4.0.1", + "sisteransi": "^1.0.5" }, "engines": { - "node": ">= 6" + "node": ">= 14" } }, - "node_modules/npm/node_modules/readdir-scoped-modules": { - "version": "1.1.0", - "inBundle": true, - "license": "ISC", + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "dev": true, "dependencies": { - "debuglog": "^1.0.1", - "dezalgo": "^1.0.0", - "graceful-fs": "^4.1.2", - "once": "^1.3.0" + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" } }, - "node_modules/npm/node_modules/retry": { - "version": "0.12.0", - "inBundle": true, - "license": "MIT", + "node_modules/prop-types/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": ">= 4" + "node": ">=0.10.0" } }, - "node_modules/npm/node_modules/rimraf": { - "version": "3.0.2", - "inBundle": true, - "license": "ISC", + "node_modules/proto-list": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", + "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==" + }, + "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": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "engines": { + "node": ">= 0.10" } }, - "node_modules/npm/node_modules/rimraf/node_modules/brace-expansion": { - "version": "1.1.11", - "inBundle": true, - "license": "MIT", + "node_modules/proxy-agent": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.4.0.tgz", + "integrity": "sha512-u0piLU+nCOHMgGjRbimiXmA9kM/L9EHh3zL81xCdp7m+Y2pHIsnmbdDoEDoAz5geaonNR6q6+yOPQs6n4T6sBQ==", + "optional": true, "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "agent-base": "^7.0.2", + "debug": "^4.3.4", + "http-proxy-agent": "^7.0.1", + "https-proxy-agent": "^7.0.3", + "lru-cache": "^7.14.1", + "pac-proxy-agent": "^7.0.1", + "proxy-from-env": "^1.1.0", + "socks-proxy-agent": "^8.0.2" + }, + "engines": { + "node": ">= 14" } }, - "node_modules/npm/node_modules/rimraf/node_modules/glob": { - "version": "7.2.3", - "inBundle": true, - "license": "ISC", + "node_modules/proxy-agent/node_modules/agent-base": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", + "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", + "optional": 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" + "debug": "^4.3.4" }, "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">= 14" } }, - "node_modules/npm/node_modules/rimraf/node_modules/minimatch": { - "version": "3.1.2", - "inBundle": true, - "license": "ISC", + "node_modules/proxy-agent/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "optional": true, "dependencies": { - "brace-expansion": "^1.1.7" + "ms": "2.1.2" }, "engines": { - "node": "*" - } - }, - "node_modules/npm/node_modules/safe-buffer": { - "version": "5.2.1", - "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": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true } - ], - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/safer-buffer": { - "version": "2.1.2", - "inBundle": true, - "license": "MIT", - "optional": true + } }, - "node_modules/npm/node_modules/semver": { - "version": "7.3.7", - "inBundle": true, - "license": "ISC", + "node_modules/proxy-agent/node_modules/http-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "optional": true, "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" + "agent-base": "^7.1.0", + "debug": "^4.3.4" }, "engines": { - "node": ">=10" + "node": ">= 14" } }, - "node_modules/npm/node_modules/semver/node_modules/lru-cache": { - "version": "6.0.0", - "inBundle": true, - "license": "ISC", + "node_modules/proxy-agent/node_modules/https-proxy-agent": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.4.tgz", + "integrity": "sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg==", + "optional": true, "dependencies": { - "yallist": "^4.0.0" + "agent-base": "^7.0.2", + "debug": "4" }, "engines": { - "node": ">=10" + "node": ">= 14" } }, - "node_modules/npm/node_modules/set-blocking": { - "version": "2.0.0", - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/signal-exit": { - "version": "3.0.7", - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/smart-buffer": { - "version": "4.2.0", - "inBundle": true, - "license": "MIT", + "node_modules/proxy-agent/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "optional": true, "engines": { - "node": ">= 6.0.0", - "npm": ">= 3.0.0" + "node": ">=12" } }, - "node_modules/npm/node_modules/socks": { - "version": "2.7.0", - "inBundle": true, - "license": "MIT", + "node_modules/proxy-agent/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==", + "optional": true + }, + "node_modules/proxy-agent/node_modules/socks-proxy-agent": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.3.tgz", + "integrity": "sha512-VNegTZKhuGq5vSD6XNKlbqWhyt/40CgoEw8XxD6dhnm8Jq9IEa3nIa4HwnM8XOqU0CdB0BwWVXusqiFXfHB3+A==", + "optional": true, "dependencies": { - "ip": "^2.0.0", - "smart-buffer": "^4.2.0" + "agent-base": "^7.1.1", + "debug": "^4.3.4", + "socks": "^2.7.1" }, "engines": { - "node": ">= 10.13.0", - "npm": ">= 3.0.0" + "node": ">= 14" } }, - "node_modules/npm/node_modules/socks-proxy-agent": { - "version": "7.0.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "agent-base": "^6.0.2", - "debug": "^4.3.3", - "socks": "^2.6.2" - }, + "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/psl": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", + "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==", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, "engines": { - "node": ">= 10" + "node": ">=6" } }, - "node_modules/npm/node_modules/spdx-correct": { - "version": "3.1.1", - "inBundle": true, - "license": "Apache-2.0", + "node_modules/pupa": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/pupa/-/pupa-3.1.0.tgz", + "integrity": "sha512-FLpr4flz5xZTSJxSeaheeMKN/EDzMdK7b8PTOC6a5PYFKTucWbdqjgqaEyH0shFiSJrVB1+Qqi4Tk19ccU6Aug==", "dependencies": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" + "escape-goat": "^4.0.0" + }, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/npm/node_modules/spdx-exceptions": { - "version": "2.3.0", - "inBundle": true, - "license": "CC-BY-3.0" - }, - "node_modules/npm/node_modules/spdx-expression-parse": { - "version": "3.0.1", - "inBundle": true, - "license": "MIT", + "node_modules/qs": { + "version": "6.12.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.12.1.tgz", + "integrity": "sha512-zWmv4RSuB9r2mYQw3zxQuHWeU+42aKi1wWig/j4ele4ygELZ7PEO6MM7rim9oAQH2A5MWfsAVf/jPvTPgCbvUQ==", "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" + "side-channel": "^1.0.6" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/npm/node_modules/spdx-license-ids": { - "version": "3.0.11", - "inBundle": true, - "license": "CC0-1.0" + "node_modules/querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", + "dev": true }, - "node_modules/npm/node_modules/ssri": { - "version": "9.0.1", - "inBundle": true, - "license": "ISC", - "dependencies": { - "minipass": "^3.1.1" + "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/quick-format-unescaped": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz", + "integrity": "sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==" + }, + "node_modules/quick-lru": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", + "engines": { + "node": ">=10" }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/random-bytes": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/random-bytes/-/random-bytes-1.0.0.tgz", + "integrity": "sha512-iv7LhNVO047HzYR3InF6pUcUsPQiHTM1Qal51DcGSuZFBil1aBBWG5eHPNek7bvILMaYJ/8RU1e8w1AMdHmLQQ==", "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">= 0.8" } }, - "node_modules/npm/node_modules/string_decoder": { - "version": "1.3.0", - "inBundle": true, - "license": "MIT", + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, "dependencies": { - "safe-buffer": "~5.2.0" + "safe-buffer": "^5.1.0" } }, - "node_modules/npm/node_modules/string-width": { - "version": "4.2.3", - "inBundle": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, + "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": ">=8" + "node": ">= 0.6" } }, - "node_modules/npm/node_modules/strip-ansi": { - "version": "6.0.1", - "inBundle": true, - "license": "MIT", + "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": { - "ansi-regex": "^5.0.1" + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" }, "engines": { - "node": ">=8" + "node": ">= 0.8" } }, - "node_modules/npm/node_modules/supports-color": { - "version": "7.2.0", - "inBundle": true, - "license": "MIT", + "node_modules/rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", "dependencies": { - "has-flag": "^4.0.0" + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" }, - "engines": { - "node": ">=8" + "bin": { + "rc": "cli.js" } }, - "node_modules/npm/node_modules/tar": { - "version": "6.1.11", - "inBundle": true, - "license": "ISC", + "node_modules/rc-config-loader": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/rc-config-loader/-/rc-config-loader-4.1.3.tgz", + "integrity": "sha512-kD7FqML7l800i6pS6pvLyIE2ncbk9Du8Q0gp/4hMPhJU6ZxApkoLcGD8ZeqgiAlfwZ6BlETq6qqe+12DUL207w==", "dependencies": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^3.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" + "debug": "^4.3.4", + "js-yaml": "^4.1.0", + "json5": "^2.2.2", + "require-from-string": "^2.0.2" + } + }, + "node_modules/rc-config-loader/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": ">= 10" + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "node_modules/npm/node_modules/text-table": { - "version": "0.2.0", - "inBundle": true, - "license": "MIT" + "node_modules/rc-config-loader/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/npm/node_modules/tiny-relative-date": { - "version": "1.3.0", - "inBundle": true, - "license": "MIT" + "node_modules/rc/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/npm/node_modules/treeverse": { - "version": "2.0.0", - "inBundle": true, - "license": "ISC", + "node_modules/rc/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": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=0.10.0" } }, - "node_modules/npm/node_modules/unique-filename": { - "version": "2.0.1", - "inBundle": true, - "license": "ISC", + "node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "dev": true + }, + "node_modules/read-package-json": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-6.0.4.tgz", + "integrity": "sha512-AEtWXYfopBj2z5N5PbkAOeNHRPUg5q+Nen7QLxV8M2zJq1ym6/lCz3fYNTCXe19puu2d06jfHhrP7v/S2PtMMw==", "dependencies": { - "unique-slug": "^3.0.0" + "glob": "^10.2.2", + "json-parse-even-better-errors": "^3.0.0", + "normalize-package-data": "^5.0.0", + "npm-normalize-package-bin": "^3.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/npm/node_modules/unique-slug": { - "version": "3.0.0", - "inBundle": true, - "license": "ISC", + "node_modules/read-package-json-fast": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-3.0.2.tgz", + "integrity": "sha512-0J+Msgym3vrLOUB3hzQCuZHII0xkNGCtz/HJH9xZshwv9DbDwkw1KaE3gx/e2J5rpEY5rtOy6cyhKOPrkP7FZw==", "dependencies": { - "imurmurhash": "^0.1.4" + "json-parse-even-better-errors": "^3.0.0", + "npm-normalize-package-bin": "^3.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/util-deprecate": { - "version": "1.0.2", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/validate-npm-package-license": { - "version": "3.0.4", - "inBundle": true, - "license": "Apache-2.0", - "dependencies": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/npm/node_modules/validate-npm-package-name": { - "version": "4.0.0", - "inBundle": true, - "license": "ISC", + "node_modules/read-package-json/node_modules/foreground-child": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", + "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", "dependencies": { - "builtins": "^5.0.0" + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/walk-up-path": { - "version": "1.0.0", - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/wcwidth": { - "version": "1.0.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "defaults": "^1.0.3" + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/npm/node_modules/which": { - "version": "2.0.2", - "inBundle": true, - "license": "ISC", + "node_modules/read-package-json/node_modules/glob": { + "version": "10.3.15", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.15.tgz", + "integrity": "sha512-0c6RlJt1TICLyvJYIApxb8GsXoai0KUP7AxKKAtsYXdgJR1mGEUa7DgwShbdk1nly0PYoZj01xd4hzbq3fsjpw==", "dependencies": { - "isexe": "^2.0.0" + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.6", + "minimatch": "^9.0.1", + "minipass": "^7.0.4", + "path-scurry": "^1.11.0" }, "bin": { - "node-which": "bin/node-which" + "glob": "dist/esm/bin.mjs" }, "engines": { - "node": ">= 8" + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/npm/node_modules/wide-align": { - "version": "1.1.5", - "inBundle": true, - "license": "ISC", - "dependencies": { - "string-width": "^1.0.2 || 2 || 3 || 4" + "node_modules/read-package-json/node_modules/minipass": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.1.tgz", + "integrity": "sha512-UZ7eQ+h8ywIRAW1hIEl2AqdwzJucU/Kp59+8kkZeSvafXhZjul247BvIJjEVFVeON6d7lM46XX1HXCduKAS8VA==", + "engines": { + "node": ">=16 || 14 >=14.17" } }, - "node_modules/npm/node_modules/wrappy": { - "version": "1.0.2", - "inBundle": true, - "license": "ISC" + "node_modules/read-package-json/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } }, - "node_modules/npm/node_modules/write-file-atomic": { - "version": "4.0.2", - "inBundle": true, - "license": "ISC", + "node_modules/read-pkg": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", + "integrity": "sha512-eFIBOPW7FGjzBuk3hdXEuNSiTZS/xEMlH49HxMyzb0hyPfu4EhVjT2DH32K1hSSmVq4sebAWnZuuY5auISUTGA==", + "dev": true, "dependencies": { - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.7" + "load-json-file": "^2.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^2.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=4" } }, - "node_modules/npm/node_modules/yallist": { - "version": "4.0.0", - "inBundle": true, - "license": "ISC" - }, - "node_modules/npmlog": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz", - "integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==", - "optional": true, + "node_modules/read-pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", + "integrity": "sha512-1orxQfbWGUiTn9XsPlChs6rLie/AV9jwZTGmu2NZw/CUDJQchXJFYE0Fq5j7+n558T1JhDWLdhyd1Zj+wLY//w==", + "dev": true, "dependencies": { - "are-we-there-yet": "^3.0.0", - "console-control-strings": "^1.1.0", - "gauge": "^4.0.3", - "set-blocking": "^2.0.0" + "find-up": "^2.0.0", + "read-pkg": "^2.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=4" } }, - "node_modules/nyc": { - "version": "15.0.0", - "resolved": "https://registry.npmjs.org/nyc/-/nyc-15.0.0.tgz", - "integrity": "sha512-qcLBlNCKMDVuKb7d1fpxjPR8sHeMVX0CHarXAVzrVWoFrigCkYR8xcrjfXSPi5HXM7EU78L6ywO7w1c5rZNCNg==", + "node_modules/read-pkg-up/node_modules/find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==", "dev": true, "dependencies": { - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "caching-transform": "^4.0.0", - "convert-source-map": "^1.7.0", - "decamelize": "^1.2.0", - "find-cache-dir": "^3.2.0", - "find-up": "^4.1.0", - "foreground-child": "^2.0.0", - "glob": "^7.1.6", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-hook": "^3.0.0", - "istanbul-lib-instrument": "^4.0.0", - "istanbul-lib-processinfo": "^2.0.2", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.0.0", - "js-yaml": "^3.13.1", - "make-dir": "^3.0.0", - "node-preload": "^0.2.0", - "p-map": "^3.0.0", - "process-on-spawn": "^1.0.0", - "resolve-from": "^5.0.0", - "rimraf": "^3.0.0", - "signal-exit": "^3.0.2", - "spawn-wrap": "^2.0.0", - "test-exclude": "^6.0.0", - "uuid": "^3.3.3", - "yargs": "^15.0.2" - }, - "bin": { - "nyc": "bin/nyc.js" + "locate-path": "^2.0.0" }, "engines": { - "node": ">=8.9" - } - }, - "node_modules/nyc/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==", - "dev": true, - "engines": { - "node": ">=8" + "node": ">=4" } }, - "node_modules/nyc/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/read-pkg-up/node_modules/locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==", "dev": true, "dependencies": { - "color-convert": "^2.0.1" + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "node": ">=4" } }, - "node_modules/nyc/node_modules/cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "node_modules/read-pkg-up/node_modules/p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", "dev": true, "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" + "p-try": "^1.0.0" + }, + "engines": { + "node": ">=4" } }, - "node_modules/nyc/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/read-pkg-up/node_modules/p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==", "dev": true, "dependencies": { - "color-name": "~1.1.4" + "p-limit": "^1.1.0" }, "engines": { - "node": ">=7.0.0" + "node": ">=4" } }, - "node_modules/nyc/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/nyc/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "node_modules/read-pkg-up/node_modules/p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==", "dev": true, - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, "engines": { - "node": ">=8" + "node": ">=4" } }, - "node_modules/nyc/node_modules/is-fullwidth-code-point": { + "node_modules/read-pkg-up/node_modules/path-exists": { "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==", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", "dev": true, "engines": { - "node": ">=8" + "node": ">=4" } }, - "node_modules/nyc/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "node_modules/read-pkg/node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true + }, + "node_modules/read-pkg/node_modules/load-json-file": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", + "integrity": "sha512-3p6ZOGNbiX4CdvEd1VcE6yi78UrGNpjHO33noGwHCnT/o2fyllJDepsm8+mFFv/DvtwFHht5HIHSyOy5a+ChVQ==", "dev": true, "dependencies": { - "p-locate": "^4.1.0" + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "strip-bom": "^3.0.0" }, "engines": { - "node": ">=8" + "node": ">=4" } }, - "node_modules/nyc/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "node_modules/read-pkg/node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", "dev": true, "dependencies": { - "p-try": "^2.0.0" + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/read-pkg/node_modules/parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==", + "dev": true, + "dependencies": { + "error-ex": "^1.2.0" }, "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=0.10.0" } }, - "node_modules/nyc/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "node_modules/read-pkg/node_modules/path-type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", + "integrity": "sha512-dUnb5dXUf+kzhC/W/F4e5/SkluXIFf5VUHolW1Eg1irn1hGWjPGdsRcvYJ1nD6lhk8Ir7VM0bHJKsYTx8Jx9OQ==", "dev": true, "dependencies": { - "p-limit": "^2.2.0" + "pify": "^2.0.0" }, "engines": { - "node": ">=8" + "node": ">=4" } }, - "node_modules/nyc/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "node_modules/read-pkg/node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", "dev": true, "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, - "node_modules/nyc/node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "node_modules/read-pkg/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, - "dependencies": { - "glob": "^7.1.3" - }, "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "semver": "bin/semver" } }, - "node_modules/nyc/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "node_modules/read-pkg/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, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, "engines": { - "node": ">=8" + "node": ">=4" } }, - "node_modules/nyc/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==", - "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": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" } }, - "node_modules/nyc/node_modules/wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", "dev": true, "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" + "picomatch": "^2.2.1" }, "engines": { - "node": ">=8" + "node": ">=8.10.0" } }, - "node_modules/nyc/node_modules/y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", - "dev": true - }, - "node_modules/nyc/node_modules/yargs": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", - "dev": true, - "dependencies": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.2" - }, + "node_modules/real-require": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/real-require/-/real-require-0.2.0.tgz", + "integrity": "sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==", "engines": { - "node": ">=8" + "node": ">= 12.13.0" } }, - "node_modules/nyc/node_modules/yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "node_modules/regexp.prototype.flags": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", + "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", "dev": true, "dependencies": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" + "call-bind": "^1.0.6", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "set-function-name": "^2.0.1" }, "engines": { - "node": ">=6" - } - }, - "node_modules/oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", - "engines": { - "node": "*" - } - }, - "node_modules/object-assign": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.0.1.tgz", - "integrity": "sha512-c6legOHWepAbWnp3j5SRUMpxCXBKI4rD7A5Osn9IzZ8w4O/KccXdW0lqdkQKbpk0eHGjNgKihgzY6WuEq99Tfw==", - "engines": { - "node": ">=0.10.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/object-hash": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-1.3.1.tgz", - "integrity": "sha512-OSuu/pU4ENM9kmREg0BdNrUDIl1heYa4mBZacJc+vVWz4GtAwu7jO8s4AIt2aGRUTqxykpWzI3Oqnsm13tTMDA==", + "node_modules/regexpp": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", + "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", "dev": true, "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/object-inspect": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", - "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=6.5.0" } }, - "node_modules/object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true, + "node_modules/registry-auth-token": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-5.0.2.tgz", + "integrity": "sha512-o/3ikDxtXaA59BmZuZrJZDJv8NMDGSj+6j6XaeBmHw8eY1i1qd9+6H+LjVvQXx3HN6aRCGa1cUdJ9RaJZUugnQ==", + "dependencies": { + "@pnpm/npm-conf": "^2.1.0" + }, "engines": { - "node": ">= 0.4" + "node": ">=14" } }, - "node_modules/object.assign": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", - "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", - "dev": true, + "node_modules/registry-url": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-6.0.1.tgz", + "integrity": "sha512-+crtS5QjFRqFCoQmvGduwYWEBng99ZvmFvF+cUJkGYF1L1BfU8C6Zp9T7f5vPAwyLkUExpvK+ANVZmGU49qi4Q==", "dependencies": { - "call-bind": "^1.0.5", - "define-properties": "^1.2.1", - "has-symbols": "^1.0.3", - "object-keys": "^1.1.1" + "rc": "1.2.8" }, "engines": { - "node": ">= 0.4" + "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/on-error": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/on-error/-/on-error-2.1.0.tgz", - "integrity": "sha512-wpKXxCW2wXLI+9DB9DDBVuOCN9C5rjyaP4GWwqhgrSd2ys1Vyc9yGaPmC5HSOdQ30x9zCLozi9mHx3lm01E+LQ==" - }, - "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==", + "node_modules/release-zalgo": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", + "integrity": "sha512-gUAyHVHPPC5wdqX/LG4LWtRYtgjxyX78oanFNTMMyFEfOqdC54s3eE82imuWKbOeqYht2CrNf64Qb8vgmmtZGA==", + "dev": true, "dependencies": { - "ee-first": "1.1.1" + "es6-error": "^4.0.1" }, "engines": { - "node": ">= 0.8" + "node": ">=4" } }, - "node_modules/on-headers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", - "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "node_modules/remote-git-tags": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/remote-git-tags/-/remote-git-tags-3.0.0.tgz", + "integrity": "sha512-C9hAO4eoEsX+OXA4rla66pXZQ+TLQ8T9dttgQj18yuKlPMTVkIkdYXvlMC55IuUsIkV6DpmQYi10JKFLaU+l7w==", "engines": { - "node": ">= 0.8" + "node": ">=8" } }, - "node_modules/once": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", - "integrity": "sha512-6vaNInhu+CHxtONf3zw3vq4SP2DOQhjBvIa3rNcG0+P7eKWlYH6Peu7rHizSloRU2EwMz6GraLieis9Ac9+p1w==", - "dependencies": { - "wrappy": "1" + "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/onetime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", - "integrity": "sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==", - "dev": true, - "dependencies": { - "mimic-fn": "^1.0.0" - }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", "engines": { - "node": ">=4" + "node": ">=0.10.0" } }, - "node_modules/optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "node_modules/require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true + }, + "node_modules/require-uncached": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", + "integrity": "sha512-Xct+41K3twrbBHdxAgMoOS+cNcoqIjfM2/VxBF4LL2hVph7YsF8VSKyQ3BDFZwEVbok9yeDl2le/qo0S77WG2w==", "dev": true, "dependencies": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" + "caller-path": "^0.1.0", + "resolve-from": "^1.0.0" }, "engines": { - "node": ">= 0.8.0" + "node": ">=0.10.0" } }, - "node_modules/os": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/os/-/os-0.1.1.tgz", - "integrity": "sha512-jg06S2xr5De63mLjZVJDf3/k37tpjppr2LR7MUOsxv8XuUCVpCnvbCksXCBcB5gQqQf/K0+87WGTRlAj5q7r1A==" - }, - "node_modules/os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", + "node_modules/require-uncached/node_modules/resolve-from": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz", + "integrity": "sha512-kT10v4dhrlLNcnO084hEjvXCI1wUG9qZLoz2RogxqDQQYy7IxjI/iMUkOtQTNEh6rzHxvdQWHsJyel1pKOVCxg==", "dev": true, "engines": { "node": ">=0.10.0" } }, - "node_modules/p-each-series": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-2.2.0.tgz", - "integrity": "sha512-ycIL2+1V32th+8scbpTvyHNaHe02z0sjgh91XXjAk+ZeXoPN4Z46DVUnzdso0aX4KckKw0FNNFHdjZ2UsZvxiA==", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } + "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==", + "dev": true }, - "node_modules/p-filter": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-filter/-/p-filter-2.1.0.tgz", - "integrity": "sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==", + "node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", "dependencies": { - "p-map": "^2.0.0" + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" }, - "engines": { - "node": ">=8" + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/p-filter/node_modules/p-map": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", - "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", - "engines": { - "node": ">=6" - } + "node_modules/resolve-alpn": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", + "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==" }, - "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==", + "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/p-is-promise": { + "node_modules/responselike": { "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/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, + "resolved": "https://registry.npmjs.org/responselike/-/responselike-3.0.0.tgz", + "integrity": "sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==", "dependencies": { - "yocto-queue": "^0.1.0" + "lowercase-keys": "^3.0.0" }, "engines": { - "node": ">=10" + "node": ">=14.16" }, "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==", + "node_modules/restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==", "dev": true, "dependencies": { - "p-limit": "^3.0.2" + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=4" } }, - "node_modules/p-map": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", - "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", - "dev": true, - "dependencies": { - "aggregate-error": "^3.0.0" - }, + "node_modules/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", "engines": { - "node": ">=8" + "node": ">= 4" } }, - "node_modules/p-reduce": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-reduce/-/p-reduce-2.1.0.tgz", - "integrity": "sha512-2USApvnsutq8uoxZBGbbWM0JIYLiEMJ9RlaN7fAzVNb9OZN0SHjjTTfIcb667XynS5Y1VhwDJVDa72TnPzAYWw==", - "engines": { - "node": ">=8" - } + "node_modules/retry-as-promised": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/retry-as-promised/-/retry-as-promised-7.0.4.tgz", + "integrity": "sha512-XgmCoxKWkDofwH8WddD0w85ZfqYz+ZHlr5yo+3YUCfycWawU56T5ckWXsScsj5B8tqUcIG67DxXByo3VUgiAdA==" }, - "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "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": { - "node": ">=6" + "iojs": ">=1.0.0", + "node": ">=0.10.0" } }, - "node_modules/pac-proxy-agent": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-7.0.1.tgz", - "integrity": "sha512-ASV8yU4LLKBAjqIPMbrgtaKIvxQri/yh2OpI+S6hVa9JRkUI3Y3NPFbfngDtY7oFtSMD3w31Xns89mDa3Feo5A==", - "optional": true, + "node_modules/rimraf": { + "version": "5.0.7", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.7.tgz", + "integrity": "sha512-nV6YcJo5wbLW77m+8KjH8aB/7/rxQy9SZ0HY5shnwULfS+9nmTtVXAJET5NdZmCzA4fPI/Hm1wo/Po/4mopOdg==", "dependencies": { - "@tootallnate/quickjs-emscripten": "^0.23.0", - "agent-base": "^7.0.2", - "debug": "^4.3.4", - "get-uri": "^6.0.1", - "http-proxy-agent": "^7.0.0", - "https-proxy-agent": "^7.0.2", - "pac-resolver": "^7.0.0", - "socks-proxy-agent": "^8.0.2" + "glob": "^10.3.7" }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/pac-proxy-agent/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "optional": true, - "dependencies": { - "ms": "2.1.2" + "bin": { + "rimraf": "dist/esm/bin.mjs" }, "engines": { - "node": ">=6.0" + "node": ">=14.18" }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/pac-proxy-agent/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==", - "optional": true - }, - "node_modules/pac-proxy-agent/node_modules/socks-proxy-agent": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.2.tgz", - "integrity": "sha512-8zuqoLv1aP/66PHF5TqwJ7Czm3Yv32urJQHrVyhD7mmA6d61Zv8cIXQYPTWwmg6qlupnPvs/QKDmfa4P/qct2g==", - "optional": true, + "node_modules/rimraf/node_modules/foreground-child": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", + "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", "dependencies": { - "agent-base": "^7.0.2", - "debug": "^4.3.4", - "socks": "^2.7.1" + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" }, "engines": { - "node": ">= 14" - } - }, - "node_modules/pac-resolver": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-7.0.1.tgz", - "integrity": "sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==", - "optional": true, - "dependencies": { - "degenerator": "^5.0.0", - "netmask": "^2.0.2" + "node": ">=14" }, - "engines": { - "node": ">= 14" + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/package-hash": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-4.0.0.tgz", - "integrity": "sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ==", - "dev": true, + "node_modules/rimraf/node_modules/glob": { + "version": "10.3.15", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.15.tgz", + "integrity": "sha512-0c6RlJt1TICLyvJYIApxb8GsXoai0KUP7AxKKAtsYXdgJR1mGEUa7DgwShbdk1nly0PYoZj01xd4hzbq3fsjpw==", "dependencies": { - "graceful-fs": "^4.1.15", - "hasha": "^5.0.0", - "lodash.flattendeep": "^4.4.0", - "release-zalgo": "^1.0.0" + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.6", + "minimatch": "^9.0.1", + "minipass": "^7.0.4", + "path-scurry": "^1.11.0" + }, + "bin": { + "glob": "dist/esm/bin.mjs" }, "engines": { - "node": ">=8" + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "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==", - "dependencies": { - "callsites": "^3.0.0" - }, + "node_modules/rimraf/node_modules/minipass": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.1.tgz", + "integrity": "sha512-UZ7eQ+h8ywIRAW1hIEl2AqdwzJucU/Kp59+8kkZeSvafXhZjul247BvIJjEVFVeON6d7lM46XX1HXCduKAS8VA==", "engines": { - "node": ">=6" + "node": ">=16 || 14 >=14.17" } }, - "node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, + "node_modules/rimraf/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", "engines": { - "node": ">=8" + "node": ">=14" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/parse-ms": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-2.1.0.tgz", - "integrity": "sha512-kHt7kzLoS9VBZfUsiKjv43mr91ea+U05EyKkEtqp7vNbHxmaVuEqN7XxeEVnGrMtYOAxGrDElSi96K7EgO1zCA==", + "node_modules/roarr": { + "version": "2.15.4", + "resolved": "https://registry.npmjs.org/roarr/-/roarr-2.15.4.tgz", + "integrity": "sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A==", "dev": true, + "dependencies": { + "boolean": "^3.0.1", + "detect-node": "^2.0.4", + "globalthis": "^1.0.1", + "json-stringify-safe": "^5.0.1", + "semver-compare": "^1.0.0", + "sprintf-js": "^1.1.2" + }, "engines": { - "node": ">=6" + "node": ">=8.0" } }, - "node_modules/parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "node_modules/run-async": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", + "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", + "dev": true, "engines": { - "node": ">= 0.8" + "node": ">=0.12.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==", + "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": { - "process": "^0.11.1", - "util": "^0.10.3" - } - }, - "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==", - "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" + "queue-microtask": "^1.2.2" } }, - "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==", - "dev": true - }, - "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==", + "node_modules/rxjs": { + "version": "5.5.12", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.5.12.tgz", + "integrity": "sha512-xx2itnL5sBbqeeiVgNPVuQQ1nC8Jp2WfNJhXWHmElW9YmrpS9UVnNzhP3EH3HFqexO5Tlp8GhYY+WEcqcVMvGw==", + "dev": true, + "dependencies": { + "symbol-observable": "1.0.1" + }, "engines": { - "node": ">=4" + "npm": ">=2.0.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==" - }, - "node_modules/path-scurry": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.1.tgz", - "integrity": "sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==", + "node_modules/safe-array-concat": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz", + "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==", "dev": true, "dependencies": { - "lru-cache": "^9.1.1 || ^10.0.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + "call-bind": "^1.0.7", + "get-intrinsic": "^1.2.4", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": ">=0.4" }, "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/path-scurry/node_modules/lru-cache": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.0.tgz", - "integrity": "sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==", - "dev": true, - "engines": { - "node": "14 || >=16.14" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/path-scurry/node_modules/minipass": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", - "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", - "dev": true, - "engines": { - "node": ">=16 || 14 >=14.17" - } + "node_modules/safe-array-concat/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true }, - "node_modules/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/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/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "node_modules/safe-regex-test": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", + "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-regex": "^1.1.4" + }, "engines": { - "node": ">=8" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/pathval": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", - "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", - "dev": true, + "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": "*" + "node": ">=10" } }, - "node_modules/pend": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", - "optional": true + "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/performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==" + "node_modules/secure-keys": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/secure-keys/-/secure-keys-1.0.0.tgz", + "integrity": "sha512-nZi59hW3Sl5P3+wOO89eHBAAGwmCPd2aE1+dLZV5MO+ItQctIvAqihzaAXIQhvtH4KJPxM080HsnqltR2y8cWg==" }, - "node_modules/pg-connection-string": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.6.2.tgz", - "integrity": "sha512-ch6OwaeaPYcova4kKZ15sbJ2hKb/VP48ZD2gE7i1J+L4MspCtBMAx8nMgz7bksc7IojCIIWuEhHibSMFH8m8oA==" + "node_modules/semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } }, - "node_modules/picocolors": { + "node_modules/semver-compare": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", + "integrity": "sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==", "dev": true }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "node_modules/semver-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-4.0.0.tgz", + "integrity": "sha512-0Ju4+6A8iOnpL/Thra7dZsSlOHYAHIeMxfhWQRI1/VLcT3WDBZKKtQt/QkBOsiIN9ZpuvHE6cGZ0x4glCMmfiA==", + "dependencies": { + "semver": "^7.3.5" + }, "engines": { - "node": ">=8.6" + "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/jonschlinkert" + "url": "https://github.com/sponsors/sindresorhus" } }, - "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/semver-utils": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/semver-utils/-/semver-utils-1.1.4.tgz", + "integrity": "sha512-EjnoLE5OGmDAVV/8YDoN5KiajNadjzIp9BAHOhYeQHt7j0UWxjmgsx4YD48wp4Ue1Qogq38F1GNUJNqF1kKKxA==" }, - "node_modules/pino": { - "version": "6.6.1", - "resolved": "https://registry.npmjs.org/pino/-/pino-6.6.1.tgz", - "integrity": "sha512-DOgm7rn6ctBkBYemHXSLj7+j3o3U1q1FWBXbHcprur8mA93QcJSycEkEqhqKiFB9Mx/3Qld2FGr6+9yfQza0kA==", + "node_modules/semver/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": { - "fast-redact": "^2.0.0", - "fast-safe-stringify": "^2.0.7", - "flatstr": "^1.0.12", - "pino-std-serializers": "^2.4.2", - "quick-format-unescaped": "^4.0.1", - "sonic-boom": "^1.0.2" + "yallist": "^4.0.0" }, - "bin": { - "pino": "bin.js" + "engines": { + "node": ">=10" } }, - "node_modules/pino-std-serializers": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-2.5.0.tgz", - "integrity": "sha512-wXqbqSrIhE58TdrxxlfLwU9eDhrzppQDvGhBEr1gYbzzM4KKo3Y63gSjiDXRKLVS2UOXdPNR2v+KnQgNrs+xUg==" - }, - "node_modules/pkg-conf": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/pkg-conf/-/pkg-conf-2.1.0.tgz", - "integrity": "sha512-C+VUP+8jis7EsQZIhDYmS5qlNtjv2yP4SNtjXK9AP1ZcTRlnSfuumaTnRfYZnYgUUYVIKqL0fRvmUGDV2fmp6g==", + "node_modules/send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", "dependencies": { - "find-up": "^2.0.0", - "load-json-file": "^4.0.0" + "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": ">=4" + "node": ">= 0.8.0" } }, - "node_modules/pkg-conf/node_modules/find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==", + "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/seq-queue": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/seq-queue/-/seq-queue-0.0.5.tgz", + "integrity": "sha512-hr3Wtp/GZIc/6DAGPDcV4/9WoZhjrkXsi5B/07QgX8tsdc6ilr7BFM6PM6rbdAX1kFSDYeZGLipIZZKyQP0O5Q==" + }, + "node_modules/sequelize": { + "version": "6.37.3", + "resolved": "https://registry.npmjs.org/sequelize/-/sequelize-6.37.3.tgz", + "integrity": "sha512-V2FTqYpdZjPy3VQrZvjTPnOoLm0KudCRXfGWp48QwhyPPp2yW8z0p0sCYZd/em847Tl2dVxJJ1DR+hF+O77T7A==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/sequelize" + } + ], "dependencies": { - "locate-path": "^2.0.0" + "@types/debug": "^4.1.8", + "@types/validator": "^13.7.17", + "debug": "^4.3.4", + "dottie": "^2.0.6", + "inflection": "^1.13.4", + "lodash": "^4.17.21", + "moment": "^2.29.4", + "moment-timezone": "^0.5.43", + "pg-connection-string": "^2.6.1", + "retry-as-promised": "^7.0.4", + "semver": "^7.5.4", + "sequelize-pool": "^7.1.0", + "toposort-class": "^1.0.1", + "uuid": "^8.3.2", + "validator": "^13.9.0", + "wkx": "^0.5.0" }, "engines": { - "node": ">=4" + "node": ">=10.0.0" + }, + "peerDependenciesMeta": { + "ibm_db": { + "optional": true + }, + "mariadb": { + "optional": true + }, + "mysql2": { + "optional": true + }, + "oracledb": { + "optional": true + }, + "pg": { + "optional": true + }, + "pg-hstore": { + "optional": true + }, + "snowflake-sdk": { + "optional": true + }, + "sqlite3": { + "optional": true + }, + "tedious": { + "optional": true + } } }, - "node_modules/pkg-conf/node_modules/locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==", + "node_modules/sequelize-cli": { + "version": "6.6.2", + "resolved": "https://registry.npmjs.org/sequelize-cli/-/sequelize-cli-6.6.2.tgz", + "integrity": "sha512-V8Oh+XMz2+uquLZltZES6MVAD+yEnmMfwfn+gpXcDiwE3jyQygLt4xoI0zG8gKt6cRcs84hsKnXAKDQjG/JAgg==", + "dev": true, "dependencies": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" + "cli-color": "^2.0.3", + "fs-extra": "^9.1.0", + "js-beautify": "^1.14.5", + "lodash": "^4.17.21", + "resolve": "^1.22.1", + "umzug": "^2.3.0", + "yargs": "^16.2.0" + }, + "bin": { + "sequelize": "lib/sequelize", + "sequelize-cli": "lib/sequelize" }, "engines": { - "node": ">=4" + "node": ">=10.0.0" } }, - "node_modules/pkg-conf/node_modules/p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "node_modules/sequelize-cli/node_modules/bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "dev": true + }, + "node_modules/sequelize-cli/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": { - "p-try": "^1.0.0" + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" }, "engines": { - "node": ">=4" + "node": ">=10" } }, - "node_modules/pkg-conf/node_modules/p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==", + "node_modules/sequelize-cli/node_modules/umzug": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/umzug/-/umzug-2.3.0.tgz", + "integrity": "sha512-Z274K+e8goZK8QJxmbRPhl89HPO1K+ORFtm6rySPhFKfKc5GHhqdzD0SGhSWHkzoXasqJuItdhorSvY7/Cgflw==", + "dev": true, "dependencies": { - "p-limit": "^1.1.0" + "bluebird": "^3.7.2" }, "engines": { - "node": ">=4" + "node": ">=6.0.0" } }, - "node_modules/pkg-conf/node_modules/p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==", + "node_modules/sequelize-cli/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, "engines": { - "node": ">=4" + "node": ">= 10.0.0" } }, - "node_modules/pkg-conf/node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "node_modules/sequelize-pool": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/sequelize-pool/-/sequelize-pool-7.1.0.tgz", + "integrity": "sha512-G9c0qlIWQSK29pR/5U2JF5dDQeqqHRragoyahj/Nx4KOOQ3CPPfzxnfqFPCSB7x5UgjOgnZ61nSxz+fjDpRlJg==", "engines": { - "node": ">=4" + "node": ">= 10.0.0" } }, - "node_modules/pkg-config": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/pkg-config/-/pkg-config-1.1.1.tgz", - "integrity": "sha512-ft/WI9YK6FuTuw4Ql+QUaNXtm/ASQNqDUUsZEgFZKyFpW6amyP8Gx01xrRs8KdiNbbqXfYxkOXplpq1euWbOjw==", - "dev": true, + "node_modules/sequelize/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dependencies": { - "debug-log": "^1.0.0", - "find-root": "^1.0.0", - "xtend": "^4.0.1" + "ms": "2.1.2" }, "engines": { - "node": ">=0.10" - } - }, - "node_modules/pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "dependencies": { - "find-up": "^4.0.0" + "node": ">=6.0" }, - "engines": { - "node": ">=8" + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "node_modules/pkg-dir/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "node_modules/sequelize/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/serialised-error": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/serialised-error/-/serialised-error-1.1.3.tgz", + "integrity": "sha512-vybp3GItaR1ZtO2nxZZo8eOo7fnVaNtP3XE2vJKgzkKR2bagCkdJ1EpYYhEMd3qu/80DwQk9KjsNSxE3fXWq0g==", "dev": true, "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" + "object-hash": "^1.1.2", + "stack-trace": "0.0.9", + "uuid": "^3.0.0" } }, - "node_modules/pkg-dir/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "node_modules/serialised-error/node_modules/uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", "dev": true, - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" + "bin": { + "uuid": "bin/uuid" } }, - "node_modules/pkg-dir/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "node_modules/serialize-error": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-7.0.1.tgz", + "integrity": "sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==", "dev": true, "dependencies": { - "p-try": "^2.0.0" + "type-fest": "^0.13.1" }, "engines": { - "node": ">=6" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/pkg-dir/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "node_modules/serialize-error/node_modules/type-fest": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", + "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==", "dev": true, - "dependencies": { - "p-limit": "^2.2.0" - }, "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/pluralize": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-7.0.0.tgz", - "integrity": "sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow==", + "node_modules/serialize-javascript": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", + "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", "dev": true, - "engines": { - "node": ">=4" + "dependencies": { + "randombytes": "^2.1.0" } }, - "node_modules/portscanner": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/portscanner/-/portscanner-2.2.0.tgz", - "integrity": "sha512-IFroCz/59Lqa2uBvzK3bKDbDDIEaAY8XJ1jFxcLWTqosrsc32//P4VuSB2vZXoHiHqOmx8B5L5hnKOxL/7FlPw==", + "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": { - "async": "^2.6.0", - "is-number-like": "^1.0.3" + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" }, "engines": { - "node": ">=0.4", - "npm": ">=1.0.0" - } - }, - "node_modules/portscanner/node_modules/async": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", - "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", - "dependencies": { - "lodash": "^4.17.14" + "node": ">= 0.8.0" } }, - "node_modules/possible-typed-array-names": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", - "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", - "dev": true, - "engines": { - "node": ">= 0.4" - } + "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/postman-collection": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/postman-collection/-/postman-collection-4.1.1.tgz", - "integrity": "sha512-ODpJtlf8r99DMcTU7gFmi/yvQYckFzcuE6zL/fWnyrFT34ugdCBFlX+DN7M+AnP6lmR822fv5s60H4DnL4+fAg==", - "dev": true, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", "dependencies": { - "faker": "5.5.3", - "file-type": "3.9.0", - "http-reasons": "0.1.0", - "iconv-lite": "0.6.3", - "liquid-json": "0.3.1", - "lodash": "4.17.21", - "mime-format": "2.0.1", - "mime-types": "2.1.34", - "postman-url-encoder": "3.0.5", - "semver": "7.3.5", - "uuid": "8.3.2" + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" }, "engines": { - "node": ">=10" + "node": ">= 0.4" } }, - "node_modules/postman-collection-transformer": { - "version": "4.1.6", - "resolved": "https://registry.npmjs.org/postman-collection-transformer/-/postman-collection-transformer-4.1.6.tgz", - "integrity": "sha512-xvdQb6sZoWcG9xZXUPSuxocjcd6WCZlINlGGiuHdSfxhgiwQhj9qhF0JRFbagZ8xB0+pYUairD5MiCENc6DEVA==", + "node_modules/set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", "dev": true, "dependencies": { - "commander": "8.3.0", - "inherits": "2.0.4", - "lodash": "4.17.21", - "semver": "7.3.5", - "strip-json-comments": "3.1.1" - }, - "bin": { - "postman-collection-transformer": "bin/transform-collection.js" + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" }, "engines": { - "node": ">=10" + "node": ">= 0.4" } }, - "node_modules/postman-collection-transformer/node_modules/commander": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", - "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", - "dev": true, - "engines": { - "node": ">= 12" - } + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" }, - "node_modules/postman-collection-transformer/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, + "node_modules/shallow-copy": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/shallow-copy/-/shallow-copy-0.0.1.tgz", + "integrity": "sha512-b6i4ZpVuUxB9h5gfCxPiusKYkqTMOjEbBs4wMaFbkfia4yFv92UKZ6Df8WXcKbn08JNL/abvg3FnMAOfakDvUw==" + }, + "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==", "dependencies": { - "yallist": "^4.0.0" + "shebang-regex": "^3.0.0" }, "engines": { - "node": ">=10" + "node": ">=8" } }, - "node_modules/postman-collection-transformer/node_modules/semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, + "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==", "engines": { - "node": ">=10" + "node": ">=8" } }, - "node_modules/postman-collection-transformer/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, + "node_modules/side-channel": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" + }, "engines": { - "node": ">=8" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/postman-collection/node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "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/sigstore": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/sigstore/-/sigstore-1.9.0.tgz", + "integrity": "sha512-0Zjz0oe37d08VeOtBIuB6cRriqXse2e8w+7yIy2XSXjshRKxbc2KkhXjL229jXSxEm7UbcjS76wcJDGQddVI9A==", "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" + "@sigstore/bundle": "^1.1.0", + "@sigstore/protobuf-specs": "^0.2.0", + "@sigstore/sign": "^1.0.0", + "@sigstore/tuf": "^1.0.3", + "make-fetch-happen": "^11.0.1" + }, + "bin": { + "sigstore": "bin/sigstore.js" }, "engines": { - "node": ">=0.10.0" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/postman-collection/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==", + "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/sinon": { + "version": "17.0.1", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-17.0.1.tgz", + "integrity": "sha512-wmwE19Lie0MLT+ZYNpDymasPHUKTaZHUH/pKEubRXIzySv9Atnlw+BUMGCzWgV7b7wO+Hw6f1TEOr0IUnmU8/g==", "dev": true, "dependencies": { - "yallist": "^4.0.0" + "@sinonjs/commons": "^3.0.0", + "@sinonjs/fake-timers": "^11.2.2", + "@sinonjs/samsam": "^8.0.0", + "diff": "^5.1.0", + "nise": "^5.1.5", + "supports-color": "^7.2.0" }, - "engines": { - "node": ">=10" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/sinon" } }, - "node_modules/postman-collection/node_modules/mime-db": { - "version": "1.51.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz", - "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==", + "node_modules/sinon-chai": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/sinon-chai/-/sinon-chai-3.7.0.tgz", + "integrity": "sha512-mf5NURdUaSdnatJx3uhoBOrY9dtL19fiOtAdT1Azxg3+lNJFiuN0uzaU3xX1LeAfL17kHQhTAJgpsfhbMJMY2g==", "dev": true, - "engines": { - "node": ">= 0.6" + "peerDependencies": { + "chai": "^4.0.0", + "sinon": ">=4.0.0" } }, - "node_modules/postman-collection/node_modules/mime-types": { - "version": "2.1.34", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz", - "integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==", + "node_modules/sinon/node_modules/diff": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz", + "integrity": "sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==", "dev": true, - "dependencies": { - "mime-db": "1.51.0" - }, "engines": { - "node": ">= 0.6" + "node": ">=0.3.1" } }, - "node_modules/postman-collection/node_modules/semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==" + }, + "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/slice-ansi": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-1.0.0.tgz", + "integrity": "sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==", "dev": true, "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" + "is-fullwidth-code-point": "^2.0.0" }, "engines": { - "node": ">=10" + "node": ">=4" } }, - "node_modules/postman-collection/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==", + "node_modules/slice-ansi/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==", "dev": true, - "bin": { - "uuid": "dist/bin/uuid" + "engines": { + "node": ">=4" } }, - "node_modules/postman-request": { - "version": "2.88.1-postman.31", - "resolved": "https://registry.npmjs.org/postman-request/-/postman-request-2.88.1-postman.31.tgz", - "integrity": "sha512-OJbYqP7ItxQ84yHyuNpDywCZB0HYbpHJisMQ9lb1cSL3N5H3Td6a2+3l/a74UMd3u82BiGC5yQyYmdOIETP/nQ==", + "node_modules/smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/snyk": { + "version": "1.1291.0", + "resolved": "https://registry.npmjs.org/snyk/-/snyk-1.1291.0.tgz", + "integrity": "sha512-CNm2VGBLMACNfmPcM1ByF9tpGlJUL7AlPFpwqqVKlLNnFIQk6o7EjmYJtQZzV6xbBy3+h2jWVh/OwfhFV/BeFg==", "dev": true, + "hasInstallScript": true, "dependencies": { - "@postman/form-data": "~3.1.1", - "@postman/tunnel-agent": "^0.6.3", - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "brotli": "~1.3.2", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "har-validator": "~5.1.3", - "http-signature": "~1.3.1", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "stream-length": "^1.0.2", - "tough-cookie": "~2.5.0", - "uuid": "^3.3.2" + "@sentry/node": "^7.36.0", + "global-agent": "^3.0.0" + }, + "bin": { + "snyk": "bin/snyk" }, "engines": { - "node": ">= 6" + "node": ">=12" } }, - "node_modules/postman-request/node_modules/qs": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", - "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", - "dev": true, + "node_modules/socks": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.3.tgz", + "integrity": "sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==", + "dependencies": { + "ip-address": "^9.0.5", + "smart-buffer": "^4.2.0" + }, "engines": { - "node": ">=0.6" + "node": ">= 10.0.0", + "npm": ">= 3.0.0" } }, - "node_modules/postman-request/node_modules/tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "dev": true, + "node_modules/socks-proxy-agent": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz", + "integrity": "sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==", "dependencies": { - "psl": "^1.1.28", - "punycode": "^2.1.1" + "agent-base": "^6.0.2", + "debug": "^4.3.3", + "socks": "^2.6.2" }, "engines": { - "node": ">=0.8" + "node": ">= 10" } }, - "node_modules/postman-runtime": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/postman-runtime/-/postman-runtime-7.29.0.tgz", - "integrity": "sha512-eXxHREE/fUpohkGPRgBY1YccSGx9cyW3mtGiPyIE4zD5fYzasgBHqW6kbEND3Xrd3yf/uht/YI1H8O7J1+A1+w==", - "dev": true, + "node_modules/socks-proxy-agent/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dependencies": { - "async": "3.2.3", - "aws4": "1.11.0", - "handlebars": "4.7.7", - "httpntlm": "1.7.7", - "js-sha512": "0.8.0", - "lodash": "4.17.21", - "mime-types": "2.1.34", - "node-oauth1": "1.3.0", - "performance-now": "2.1.0", - "postman-collection": "4.1.1", - "postman-request": "2.88.1-postman.31", - "postman-sandbox": "4.0.6", - "postman-url-encoder": "3.0.5", - "serialised-error": "1.1.3", - "tough-cookie": "3.0.1", - "uuid": "8.3.2" + "ms": "2.1.2" }, "engines": { - "node": ">=10" + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "node_modules/postman-runtime/node_modules/async": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.3.tgz", - "integrity": "sha512-spZRyzKL5l5BZQrr/6m/SqFdBN0q3OCI0f9rjfBzCMBIP4p75P620rR3gTmaksNOhmzgdxcaxdNfMy6anrbM0g==", - "dev": true + "node_modules/socks-proxy-agent/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/postman-runtime/node_modules/aws4": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", - "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==", - "dev": true + "node_modules/sonic-boom": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-4.0.1.tgz", + "integrity": "sha512-hTSD/6JMLyT4r9zeof6UtuBDpjJ9sO08/nmS5djaA9eozT9oOlNdpXSnzcgj4FTqpk3nkLrs61l4gip9r1HCrQ==", + "dependencies": { + "atomic-sleep": "^1.0.0" + } }, - "node_modules/postman-runtime/node_modules/mime-db": { - "version": "1.51.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz", - "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==", - "dev": true, + "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==", "engines": { - "node": ">= 0.6" + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/spawn-please": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/spawn-please/-/spawn-please-2.0.2.tgz", + "integrity": "sha512-KM8coezO6ISQ89c1BzyWNtcn2V2kAVtwIXd3cN/V5a0xPYc1F/vydrRc01wsKFEQ/p+V1a4sw4z2yMITIXrgGw==", + "dependencies": { + "cross-spawn": "^7.0.3" + }, + "engines": { + "node": ">=14" } }, - "node_modules/postman-runtime/node_modules/mime-types": { - "version": "2.1.34", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz", - "integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==", + "node_modules/spawn-wrap": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-2.0.0.tgz", + "integrity": "sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==", "dev": true, "dependencies": { - "mime-db": "1.51.0" + "foreground-child": "^2.0.0", + "is-windows": "^1.0.2", + "make-dir": "^3.0.0", + "rimraf": "^3.0.0", + "signal-exit": "^3.0.2", + "which": "^2.0.1" }, "engines": { - "node": ">= 0.6" + "node": ">=8" } }, - "node_modules/postman-runtime/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==", + "node_modules/spawn-wrap/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, - "bin": { - "uuid": "dist/bin/uuid" + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "node_modules/postman-sandbox": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/postman-sandbox/-/postman-sandbox-4.0.6.tgz", - "integrity": "sha512-PPRanSNEE4zy3kO7CeSBHmAfJnGdD9ecHY/Mjh26CQuZZarGkNO8c0U/n+xX3+5M1BRNc82UYq6YCtdsSDqcng==", + "node_modules/spawn-wrap/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": { - "lodash": "4.17.21", - "teleport-javascript": "1.0.0", - "uvm": "2.0.2" + "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": ">=10" + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/postman-url-encoder": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/postman-url-encoder/-/postman-url-encoder-3.0.5.tgz", - "integrity": "sha512-jOrdVvzUXBC7C+9gkIkpDJ3HIxOHTIqjpQ4C1EMt1ZGeMvSEpbFCKq23DEfgsj46vMnDgyQf+1ZLp2Wm+bKSsA==", + "node_modules/spawn-wrap/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": { - "punycode": "^2.1.1" + "brace-expansion": "^1.1.7" }, "engines": { - "node": ">=10" + "node": "*" } }, - "node_modules/prebuild-install": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.2.tgz", - "integrity": "sha512-UnNke3IQb6sgarcZIDU3gbMeTp/9SSU1DAIkil7PrqG1vZlBtY5msYccSKSHDqa3hNg436IXK+SNImReuA1wEQ==", + "node_modules/spawn-wrap/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": { - "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" + "glob": "^7.1.3" }, "bin": { - "prebuild-install": "bin.js" + "rimraf": "bin.js" }, - "engines": { - "node": ">=10" + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", - "dev": true, - "engines": { - "node": ">= 0.8.0" + "node_modules/spdx-correct": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" } }, - "node_modules/pretty-ms": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-7.0.1.tgz", - "integrity": "sha512-973driJZvxiGOQ5ONsFhOF/DtzPMOMtgC11kCpUrPGMTgqp2q/1gwzCquocrN33is0VZ5GFHXZYMM9l6h67v2Q==", - "dev": true, + "node_modules/spdx-exceptions": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", + "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==" + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", "dependencies": { - "parse-ms": "^2.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" } }, - "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==", + "node_modules/spdx-license-ids": { + "version": "3.0.17", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.17.tgz", + "integrity": "sha512-sh8PWc/ftMqAAdFiBu6Fy6JUOYjqDJBJvIhpfDMyHrr0Rbp5liZqd4TjtQ/RgfLjKFZb+LMx5hpml5qOWy0qvg==" + }, + "node_modules/split2": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", + "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", "engines": { - "node": ">= 0.6.0" + "node": ">= 10.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==" + "node_modules/sprintf-js": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", + "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==" }, - "node_modules/process-on-spawn": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/process-on-spawn/-/process-on-spawn-1.0.0.tgz", - "integrity": "sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg==", - "dev": true, + "node_modules/sqlite3": { + "version": "5.1.7", + "resolved": "https://registry.npmjs.org/sqlite3/-/sqlite3-5.1.7.tgz", + "integrity": "sha512-GGIyOiFaG+TUra3JIfkI/zGP8yZYLPQ0pl1bH+ODjiX57sPhrLU5sQJn1y9bDKZUFYkX1crlrPfSYt0BKKdkog==", + "hasInstallScript": true, "dependencies": { - "fromentries": "^1.2.0" + "bindings": "^1.5.0", + "node-addon-api": "^7.0.0", + "prebuild-install": "^7.1.1", + "tar": "^6.1.11" }, - "engines": { - "node": ">=8" + "optionalDependencies": { + "node-gyp": "8.x" + }, + "peerDependencies": { + "node-gyp": "8.x" + }, + "peerDependenciesMeta": { + "node-gyp": { + "optional": 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/sqlite3/node_modules/@npmcli/fs": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-1.1.1.tgz", + "integrity": "sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ==", + "optional": true, + "dependencies": { + "@gar/promisify": "^1.0.1", + "semver": "^7.3.5" } }, - "node_modules/promise-inflight": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", - "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", - "optional": true - }, - "node_modules/promise-polyfill": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/promise-polyfill/-/promise-polyfill-2.1.4.tgz", - "integrity": "sha512-/DVUJXyaiYr7Pu0q2qPV/OtABpiukAHswJb9VV/tUVFsvC5iZUTyVPxfEr8cIVatGa5/Mxeli8QMyzAMBmoiYg==" - }, - "node_modules/promise-retry": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", - "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", + "node_modules/sqlite3/node_modules/@npmcli/move-file": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.1.2.tgz", + "integrity": "sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==", + "deprecated": "This functionality has been moved to @npmcli/fs", "optional": true, "dependencies": { - "err-code": "^2.0.2", - "retry": "^0.12.0" + "mkdirp": "^1.0.4", + "rimraf": "^3.0.2" }, "engines": { "node": ">=10" } }, - "node_modules/prop-types": { - "version": "15.8.1", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", - "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", - "dev": true, - "dependencies": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" - } - }, - "node_modules/prop-types/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, + "node_modules/sqlite3/node_modules/@tootallnate/once": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", + "optional": true, "engines": { - "node": ">=0.10.0" + "node": ">= 6" } }, - "node_modules/proto-list": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", - "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==" - }, - "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==", + "node_modules/sqlite3/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==", + "optional": true, "dependencies": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - }, - "engines": { - "node": ">= 0.10" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "node_modules/proxy-agent": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.4.0.tgz", - "integrity": "sha512-u0piLU+nCOHMgGjRbimiXmA9kM/L9EHh3zL81xCdp7m+Y2pHIsnmbdDoEDoAz5geaonNR6q6+yOPQs6n4T6sBQ==", + "node_modules/sqlite3/node_modules/cacache": { + "version": "15.3.0", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.3.0.tgz", + "integrity": "sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==", "optional": true, "dependencies": { - "agent-base": "^7.0.2", - "debug": "^4.3.4", - "http-proxy-agent": "^7.0.1", - "https-proxy-agent": "^7.0.3", - "lru-cache": "^7.14.1", - "pac-proxy-agent": "^7.0.1", - "proxy-from-env": "^1.1.0", - "socks-proxy-agent": "^8.0.2" + "@npmcli/fs": "^1.0.0", + "@npmcli/move-file": "^1.0.1", + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "glob": "^7.1.4", + "infer-owner": "^1.0.4", + "lru-cache": "^6.0.0", + "minipass": "^3.1.1", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.2", + "mkdirp": "^1.0.3", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^8.0.1", + "tar": "^6.0.2", + "unique-filename": "^1.1.1" }, "engines": { - "node": ">= 14" + "node": ">= 10" } }, - "node_modules/proxy-agent/node_modules/debug": { + "node_modules/sqlite3/node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", @@ -14008,1899 +12975,194 @@ } } }, - "node_modules/proxy-agent/node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "node_modules/sqlite3/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==", "optional": true, + "dependencies": { + "minipass": "^3.0.0" + }, "engines": { - "node": ">=12" + "node": ">= 8" } }, - "node_modules/proxy-agent/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==", - "optional": true - }, - "node_modules/proxy-agent/node_modules/socks-proxy-agent": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.2.tgz", - "integrity": "sha512-8zuqoLv1aP/66PHF5TqwJ7Czm3Yv32urJQHrVyhD7mmA6d61Zv8cIXQYPTWwmg6qlupnPvs/QKDmfa4P/qct2g==", + "node_modules/sqlite3/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "optional": true, "dependencies": { - "agent-base": "^7.0.2", - "debug": "^4.3.4", - "socks": "^2.7.1" + "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": ">= 14" - } - }, - "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/psl": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", - "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==" - }, - "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/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "engines": { - "node": ">=6" - } - }, - "node_modules/q": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", - "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==", - "engines": { - "node": ">=0.6.0", - "teleport": ">=0.2.0" - } - }, - "node_modules/qs": { - "version": "6.10.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", - "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==", - "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==", - "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/quick-format-unescaped": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz", - "integrity": "sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==" - }, - "node_modules/quick-lru": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", - "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", - "engines": { - "node": ">=8" - } - }, - "node_modules/random-bytes": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/random-bytes/-/random-bytes-1.0.0.tgz", - "integrity": "sha512-iv7LhNVO047HzYR3InF6pUcUsPQiHTM1Qal51DcGSuZFBil1aBBWG5eHPNek7bvILMaYJ/8RU1e8w1AMdHmLQQ==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, - "dependencies": { - "safe-buffer": "^5.1.0" - } - }, - "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==", - "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/rc/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/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", - "dev": true - }, - "node_modules/read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", - "dependencies": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/read-pkg-up": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", - "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", - "dependencies": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/read-pkg-up/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/read-pkg-up/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/read-pkg-up/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/read-pkg-up/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/read-pkg/node_modules/hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==" - }, - "node_modules/read-pkg/node_modules/normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dependencies": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "node_modules/read-pkg/node_modules/type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", - "engines": { - "node": ">=8" - } - }, - "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/redent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", - "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", - "dependencies": { - "indent-string": "^4.0.0", - "strip-indent": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/redeyed": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/redeyed/-/redeyed-2.1.1.tgz", - "integrity": "sha512-FNpGGo1DycYAdnrKFxCMmKYgo/mILAqtRYbkdQD8Ep/Hk2PQ5+aEAEx+IU713RTDmuBaH0c8P5ZozurNu5ObRQ==", - "dependencies": { - "esprima": "~4.0.0" - } - }, - "node_modules/reduce-flatten": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-1.0.1.tgz", - "integrity": "sha512-j5WfFJfc9CoXv/WbwVLHq74i/hdTUpy+iNC534LxczMRP67vJeK3V9JOdnL0N1cIRbn9mYhE2yVjvvKXDxvNXQ==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/referrer-policy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/referrer-policy/-/referrer-policy-1.2.0.tgz", - "integrity": "sha512-LgQJIuS6nAy1Jd88DCQRemyE3mS+ispwlqMk3b0yjZ257fI1v9c+/p6SD5gP5FGyXUIgrNOAfmyioHwZtYv2VA==", - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/regenerator-runtime": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" - }, - "node_modules/regexp.prototype.flags": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", - "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.6", - "define-properties": "^1.2.1", - "es-errors": "^1.3.0", - "set-function-name": "^2.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/regexpp": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", - "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", - "dev": true, - "engines": { - "node": ">=6.5.0" - } - }, - "node_modules/registry-auth-token": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-5.0.2.tgz", - "integrity": "sha512-o/3ikDxtXaA59BmZuZrJZDJv8NMDGSj+6j6XaeBmHw8eY1i1qd9+6H+LjVvQXx3HN6aRCGa1cUdJ9RaJZUugnQ==", - "dependencies": { - "@pnpm/npm-conf": "^2.1.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/release-zalgo": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", - "integrity": "sha512-gUAyHVHPPC5wdqX/LG4LWtRYtgjxyX78oanFNTMMyFEfOqdC54s3eE82imuWKbOeqYht2CrNf64Qb8vgmmtZGA==", - "dev": true, - "dependencies": { - "es6-error": "^4.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/request": { - "version": "2.88.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", - "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", - "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", - "dependencies": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.0", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.4.3", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - }, - "engines": { - "node": ">= 4" - } - }, - "node_modules/request-promise": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/request-promise/-/request-promise-4.2.4.tgz", - "integrity": "sha512-8wgMrvE546PzbR5WbYxUQogUnUDfM0S7QIFZMID+J73vdFARkFy+HElj4T+MWYhpXwlLp0EQ8Zoj8xUA0he4Vg==", - "deprecated": "request-promise has been deprecated because it extends the now deprecated request package, see https://github.com/request/request/issues/3142", - "dependencies": { - "bluebird": "^3.5.0", - "request-promise-core": "1.1.2", - "stealthy-require": "^1.1.1", - "tough-cookie": "^2.3.3" - }, - "engines": { - "node": ">=0.10.0" - }, - "peerDependencies": { - "request": "^2.34" - } - }, - "node_modules/request-promise-core": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.2.tgz", - "integrity": "sha512-UHYyq1MO8GsefGEt7EprS8UrXsm1TxEvFUX1IMTuSLU2Rh7fTIdFtl8xD7JiEYiWU2dl+NYAjCTksTehQUxPag==", - "dependencies": { - "lodash": "^4.17.11" - }, - "engines": { - "node": ">=0.10.0" - }, - "peerDependencies": { - "request": "^2.34" - } - }, - "node_modules/request-promise/node_modules/tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "dependencies": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/request/node_modules/form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 0.12" - } - }, - "node_modules/request/node_modules/http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==", - "dependencies": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - }, - "engines": { - "node": ">=0.8", - "npm": ">=1.3.7" - } - }, - "node_modules/request/node_modules/jsprim": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", - "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", - "dependencies": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.4.0", - "verror": "1.10.0" - }, - "engines": { - "node": ">=0.6.0" - } - }, - "node_modules/request/node_modules/punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==" - }, - "node_modules/request/node_modules/qs": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", - "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/request/node_modules/tough-cookie": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", - "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", - "dependencies": { - "psl": "^1.1.24", - "punycode": "^1.4.1" - }, - "engines": { - "node": ">=0.8" - } - }, - "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/require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true - }, - "node_modules/require-uncached": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", - "integrity": "sha512-Xct+41K3twrbBHdxAgMoOS+cNcoqIjfM2/VxBF4LL2hVph7YsF8VSKyQ3BDFZwEVbok9yeDl2le/qo0S77WG2w==", - "dev": true, - "dependencies": { - "caller-path": "^0.1.0", - "resolve-from": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/require-uncached/node_modules/resolve-from": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz", - "integrity": "sha512-kT10v4dhrlLNcnO084hEjvXCI1wUG9qZLoz2RogxqDQQYy7IxjI/iMUkOtQTNEh6rzHxvdQWHsJyel1pKOVCxg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/resolve": { - "version": "1.22.8", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", - "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", - "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-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "engines": { - "node": ">=4" - } - }, - "node_modules/restore-cursor": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", - "integrity": "sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==", - "dev": true, - "dependencies": { - "onetime": "^2.0.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", - "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", - "optional": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/retry-as-promised": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/retry-as-promised/-/retry-as-promised-3.1.0.tgz", - "integrity": "sha512-g6T9rr5G4AfRVJZcnCbbmpcTDw8NJSnmVrvrJ9Pm9OWAzigocIcFp4+ItwHGJIr0wx0YzwlCJOvvEKQrZhzPOw==", - "dependencies": { - "any-promise": "^1.3.0" - } - }, - "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/rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - } - }, - "node_modules/roarr": { - "version": "2.15.4", - "resolved": "https://registry.npmjs.org/roarr/-/roarr-2.15.4.tgz", - "integrity": "sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A==", - "dev": true, - "dependencies": { - "boolean": "^3.0.1", - "detect-node": "^2.0.4", - "globalthis": "^1.0.1", - "json-stringify-safe": "^5.0.1", - "semver-compare": "^1.0.0", - "sprintf-js": "^1.1.2" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/roarr/node_modules/sprintf-js": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", - "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", - "dev": true - }, - "node_modules/run-async": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", - "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", - "dev": true, - "engines": { - "node": ">=0.12.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/rxjs": { - "version": "6.6.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", - "dev": true, - "dependencies": { - "tslib": "^1.9.0" - }, - "engines": { - "npm": ">=2.0.0" - } - }, - "node_modules/safe-array-concat": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.0.tgz", - "integrity": "sha512-ZdQ0Jeb9Ofti4hbt5lX3T2JcAamT9hfzYU1MNB+z/jaEbB6wfFfPIR/zEORmZqobkCCJhSjodobH6WHNmJ97dg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.5", - "get-intrinsic": "^1.2.2", - "has-symbols": "^1.0.3", - "isarray": "^2.0.5" - }, - "engines": { - "node": ">=0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/safe-array-concat/node_modules/isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/safe-regex-test": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", - "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.6", - "es-errors": "^1.3.0", - "is-regex": "^1.1.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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/secure-keys": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/secure-keys/-/secure-keys-1.0.0.tgz", - "integrity": "sha512-nZi59hW3Sl5P3+wOO89eHBAAGwmCPd2aE1+dLZV5MO+ItQctIvAqihzaAXIQhvtH4KJPxM080HsnqltR2y8cWg==" - }, - "node_modules/semantic-release": { - "version": "19.0.3", - "resolved": "https://registry.npmjs.org/semantic-release/-/semantic-release-19.0.3.tgz", - "integrity": "sha512-HaFbydST1cDKZHuFZxB8DTrBLJVK/AnDExpK0s3EqLIAAUAHUgnd+VSJCUtTYQKkAkauL8G9CucODrVCc7BuAA==", - "dependencies": { - "@semantic-release/commit-analyzer": "^9.0.2", - "@semantic-release/error": "^3.0.0", - "@semantic-release/github": "^8.0.0", - "@semantic-release/npm": "^9.0.0", - "@semantic-release/release-notes-generator": "^10.0.0", - "aggregate-error": "^3.0.0", - "cosmiconfig": "^7.0.0", - "debug": "^4.0.0", - "env-ci": "^5.0.0", - "execa": "^5.0.0", - "figures": "^3.0.0", - "find-versions": "^4.0.0", - "get-stream": "^6.0.0", - "git-log-parser": "^1.2.0", - "hook-std": "^2.0.0", - "hosted-git-info": "^4.0.0", - "lodash": "^4.17.21", - "marked": "^4.0.10", - "marked-terminal": "^5.0.0", - "micromatch": "^4.0.2", - "p-each-series": "^2.1.0", - "p-reduce": "^2.0.0", - "read-pkg-up": "^7.0.0", - "resolve-from": "^5.0.0", - "semver": "^7.3.2", - "semver-diff": "^3.1.1", - "signale": "^1.2.1", - "yargs": "^16.2.0" - }, - "bin": { - "semantic-release": "bin/semantic-release.js" - }, - "engines": { - "node": ">=16 || ^14.17" - } - }, - "node_modules/semantic-release/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==", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/semantic-release/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/semantic-release/node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "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/semantic-release/node_modules/figures": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", - "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", - "dependencies": { - "escape-string-regexp": "^1.0.5" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/semantic-release/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==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/semantic-release/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==", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/semantic-release/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/semantic-release/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==", - "engines": { - "node": ">=6" - } - }, - "node_modules/semantic-release/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/semantic-release/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==", - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/semantic-release/node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/semantic-release/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==", - "engines": { - "node": ">=8" - } - }, - "node_modules/semantic-release/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "engines": { - "node": ">=8" - } - }, - "node_modules/semantic-release/node_modules/semver": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", - "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/semantic-release/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==", - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/semantic-release/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==", - "engines": { - "node": ">=8" - } - }, - "node_modules/semantic-release/node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/semver": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", - "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==", - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/semver-compare": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", - "integrity": "sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==", - "dev": true - }, - "node_modules/semver-diff": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz", - "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==", - "dependencies": { - "semver": "^6.3.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/semver-diff/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/semver-regex": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/semver-regex/-/semver-regex-3.1.4.tgz", - "integrity": "sha512-6IiqeZNgq01qGf0TId0t3NvKzSvUsjcpdEO3AQNeIjR6A2+ckTnQlDpl4qu1bjRv0RzN3FP9hzFmws3lKqRWkA==", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/send": { - "version": "0.17.2", - "resolved": "https://registry.npmjs.org/send/-/send-0.17.2.tgz", - "integrity": "sha512-UJYB6wFSJE3G00nEivR5rgWp8c2xXvJ3OPWPhmuteU0IKj8nKbG3DrjiOmLwpnHGYWAVwA69zmTm++YG0Hmwww==", - "dependencies": { - "debug": "2.6.9", - "depd": "~1.1.2", - "destroy": "~1.0.4", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "1.8.1", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "~2.3.0", - "range-parser": "~1.2.1", - "statuses": "~1.5.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/send/node_modules/depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/send/node_modules/destroy": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "integrity": "sha512-3NdhDuEXnfun/z7x9GOElY49LoqVHoGScmOKwmxhsS8N5Y+Z8KyPPDnaSzqWgYt/ji4mqwfTS34Htrk0zPIXVg==" - }, - "node_modules/send/node_modules/http-errors": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", - "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", - "dependencies": { - "depd": "~1.1.2", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.1" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/send/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/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/send/node_modules/on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/seq-queue": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/seq-queue/-/seq-queue-0.0.5.tgz", - "integrity": "sha512-hr3Wtp/GZIc/6DAGPDcV4/9WoZhjrkXsi5B/07QgX8tsdc6ilr7BFM6PM6rbdAX1kFSDYeZGLipIZZKyQP0O5Q==" - }, - "node_modules/sequelize": { - "version": "6.29.0", - "resolved": "https://registry.npmjs.org/sequelize/-/sequelize-6.29.0.tgz", - "integrity": "sha512-m8Wi90rs3NZP9coXE52c7PL4Q078nwYZXqt1IxPvgki7nOFn0p/F0eKsYDBXCPw9G8/BCEa6zZNk0DQUAT4ypA==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/sequelize" - } - ], - "dependencies": { - "@types/debug": "^4.1.7", - "@types/validator": "^13.7.1", - "debug": "^4.3.3", - "dottie": "^2.0.2", - "inflection": "^1.13.2", - "lodash": "^4.17.21", - "moment": "^2.29.1", - "moment-timezone": "^0.5.35", - "pg-connection-string": "^2.5.0", - "retry-as-promised": "^7.0.3", - "semver": "^7.3.5", - "sequelize-pool": "^7.1.0", - "toposort-class": "^1.0.1", - "uuid": "^8.3.2", - "validator": "^13.7.0", - "wkx": "^0.5.0" - }, - "engines": { - "node": ">=10.0.0" - }, - "peerDependenciesMeta": { - "ibm_db": { - "optional": true - }, - "mariadb": { - "optional": true - }, - "mysql2": { - "optional": true - }, - "oracledb": { - "optional": true - }, - "pg": { - "optional": true - }, - "pg-hstore": { - "optional": true - }, - "snowflake-sdk": { - "optional": true - }, - "sqlite3": { - "optional": true - }, - "tedious": { - "optional": true - } - } - }, - "node_modules/sequelize-cli": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/sequelize-cli/-/sequelize-cli-5.5.0.tgz", - "integrity": "sha512-twVQ02alCpr2XvxNmpi32C48WZs6xHTH1OFTfTS5Meg3BVqOM8ghiZoml4FITFjlD8sAJSQjlAHTwqTbuolA6Q==", - "dev": true, - "dependencies": { - "bluebird": "^3.5.3", - "cli-color": "^1.4.0", - "fs-extra": "^7.0.1", - "js-beautify": "^1.8.8", - "lodash": "^4.17.5", - "resolve": "^1.5.0", - "umzug": "^2.1.0", - "yargs": "^13.1.0" - }, - "bin": { - "sequelize": "lib/sequelize" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/sequelize-cli/node_modules/ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/sequelize-cli/node_modules/cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", - "dev": true, - "dependencies": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" - } - }, - "node_modules/sequelize-cli/node_modules/emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "dev": true - }, - "node_modules/sequelize-cli/node_modules/find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "dependencies": { - "locate-path": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/sequelize-cli/node_modules/fs-extra": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", - "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - }, - "engines": { - "node": ">=6 <7 || >=8" - } - }, - "node_modules/sequelize-cli/node_modules/jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", - "dev": true, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/sequelize-cli/node_modules/locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "dependencies": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/sequelize-cli/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/sequelize-cli/node_modules/p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "dependencies": { - "p-limit": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/sequelize-cli/node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/sequelize-cli/node_modules/string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "dependencies": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/sequelize-cli/node_modules/strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "dependencies": { - "ansi-regex": "^4.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/sequelize-cli/node_modules/universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "dev": true, - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/sequelize-cli/node_modules/wrap-ansi": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", - "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/sequelize-cli/node_modules/y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", - "dev": true - }, - "node_modules/sequelize-cli/node_modules/yargs": { - "version": "13.3.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", - "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", - "dev": true, - "dependencies": { - "cliui": "^5.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^13.1.2" - } - }, - "node_modules/sequelize-cli/node_modules/yargs-parser": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", - "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", - "dev": true, - "dependencies": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - }, - "node_modules/sequelize-pool": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/sequelize-pool/-/sequelize-pool-7.1.0.tgz", - "integrity": "sha512-G9c0qlIWQSK29pR/5U2JF5dDQeqqHRragoyahj/Nx4KOOQ3CPPfzxnfqFPCSB7x5UgjOgnZ61nSxz+fjDpRlJg==", - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/sequelize/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/sequelize/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/sequelize/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/sequelize/node_modules/retry-as-promised": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/retry-as-promised/-/retry-as-promised-7.0.4.tgz", - "integrity": "sha512-XgmCoxKWkDofwH8WddD0w85ZfqYz+ZHlr5yo+3YUCfycWawU56T5ckWXsScsj5B8tqUcIG67DxXByo3VUgiAdA==" - }, - "node_modules/sequelize/node_modules/semver": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", - "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/sequelize/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/serialised-error": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/serialised-error/-/serialised-error-1.1.3.tgz", - "integrity": "sha512-vybp3GItaR1ZtO2nxZZo8eOo7fnVaNtP3XE2vJKgzkKR2bagCkdJ1EpYYhEMd3qu/80DwQk9KjsNSxE3fXWq0g==", - "dev": true, - "dependencies": { - "object-hash": "^1.1.2", - "stack-trace": "0.0.9", - "uuid": "^3.0.0" - } - }, - "node_modules/serialize-error": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-7.0.1.tgz", - "integrity": "sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==", - "dev": true, - "dependencies": { - "type-fest": "^0.13.1" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/serialize-error/node_modules/type-fest": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", - "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/serialize-javascript": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", - "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", - "dev": true, - "dependencies": { - "randombytes": "^2.1.0" - } - }, - "node_modules/serve-static": { - "version": "1.14.2", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.2.tgz", - "integrity": "sha512-+TMNA9AFxUEGuC0z2mevogSnn9MXKb4fa7ngeRMJaaGv8vTwnIEkKi+QGvPt33HSnf8pRS+WGM0EbMtCJLKMBQ==", - "dependencies": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.17.2" - }, - "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==", - "devOptional": true - }, - "node_modules/set-function-length": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.1.tgz", - "integrity": "sha512-j4t6ccc+VsKwYHso+kElc5neZpjtq9EnRICFZtWyBsLojhmeF/ZBd/elqm22WJh/BziDe/SBiOeAt0m2mfLD0g==", - "dependencies": { - "define-data-property": "^1.1.2", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.3", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/set-function-name": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", - "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", - "dev": true, - "dependencies": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "functions-have-names": "^1.2.3", - "has-property-descriptors": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" - }, - "node_modules/shallow-copy": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/shallow-copy/-/shallow-copy-0.0.1.tgz", - "integrity": "sha512-b6i4ZpVuUxB9h5gfCxPiusKYkqTMOjEbBs4wMaFbkfia4yFv92UKZ6Df8WXcKbn08JNL/abvg3FnMAOfakDvUw==" - }, - "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.6", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", - "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", - "dependencies": { - "call-bind": "^1.0.7", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4", - "object-inspect": "^1.13.1" - }, - "engines": { - "node": ">= 0.4" + "node": "*" }, "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/signale": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/signale/-/signale-1.4.0.tgz", - "integrity": "sha512-iuh+gPf28RkltuJC7W5MRi6XAjTDCAPC/prJUpQoG4vIP3MJZ+GTydVnodXA7pwvTKb2cA0m9OFZW/cdWy/I/w==", - "dependencies": { - "chalk": "^2.3.2", - "figures": "^2.0.0", - "pkg-conf": "^2.1.0" - }, - "engines": { - "node": ">=6" + "url": "https://github.com/sponsors/isaacs" } }, - "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": { + "node_modules/sqlite3/node_modules/http-proxy-agent": { "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/sinon": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/sinon/-/sinon-7.5.0.tgz", - "integrity": "sha512-AoD0oJWerp0/rY9czP/D6hDTTUYGpObhZjMpd7Cl/A6+j0xBE+ayL/ldfggkBXUs0IkvIiM1ljM8+WkOc5k78Q==", - "deprecated": "16.1.1", - "dev": true, - "dependencies": { - "@sinonjs/commons": "^1.4.0", - "@sinonjs/formatio": "^3.2.1", - "@sinonjs/samsam": "^3.3.3", - "diff": "^3.5.0", - "lolex": "^4.2.0", - "nise": "^1.5.2", - "supports-color": "^5.5.0" - } - }, - "node_modules/sinon-chai": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/sinon-chai/-/sinon-chai-3.3.0.tgz", - "integrity": "sha512-r2JhDY7gbbmh5z3Q62pNbrjxZdOAjpsqW/8yxAZRSqLZqowmfGZPGUZPFf3UX36NLis0cv8VEM5IJh9HgkSOAA==", - "dev": true, - "peerDependencies": { - "chai": "^4.0.0", - "sinon": ">=4.0.0 <8.0.0" - } - }, - "node_modules/sinon/node_modules/diff": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", - "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", - "dev": true, - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "engines": { - "node": ">=8" - } - }, - "node_modules/slice-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", - "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", - "dev": true, + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", + "optional": true, "dependencies": { - "ansi-styles": "^3.2.0", - "astral-regex": "^1.0.0", - "is-fullwidth-code-point": "^2.0.0" + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" }, "engines": { - "node": ">=6" - } - }, - "node_modules/smart-buffer": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", - "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", - "optional": true, - "engines": { - "node": ">= 6.0.0", - "npm": ">= 3.0.0" + "node": ">= 6" } }, - "node_modules/smtp-connection": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/smtp-connection/-/smtp-connection-2.3.2.tgz", - "integrity": "sha512-ORefDrSgddCYkJE7oH3jB6WRv2Z7laZLCMRYD4GFFB8oaZw/hnil7exDBP4yBYs3OgschOuvVdCauUQAblTWvQ==", + "node_modules/sqlite3/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==", + "optional": true, "dependencies": { - "nodemailer-shared": "1.0.4" + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" } }, - "node_modules/snyk": { - "version": "1.1281.0", - "resolved": "https://registry.npmjs.org/snyk/-/snyk-1.1281.0.tgz", - "integrity": "sha512-I+oVDXOF+nFTpFnRkP985x6xMlXzGzojHsC3F4YeT+NPfsn5mfmnx0NVY4tSXBoENqWGYzBw3M2adeLcbamx4Q==", - "dev": true, - "hasInstallScript": true, + "node_modules/sqlite3/node_modules/make-fetch-happen": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-9.1.0.tgz", + "integrity": "sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg==", + "optional": true, "dependencies": { - "@sentry/node": "^7.36.0", - "global-agent": "^3.0.0" - }, - "bin": { - "snyk": "bin/snyk" + "agentkeepalive": "^4.1.3", + "cacache": "^15.2.0", + "http-cache-semantics": "^4.1.0", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^6.0.0", + "minipass": "^3.1.3", + "minipass-collect": "^1.0.2", + "minipass-fetch": "^1.3.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.2", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^6.0.0", + "ssri": "^8.0.0" }, "engines": { - "node": ">=12" + "node": ">= 10" } }, - "node_modules/socks": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.1.tgz", - "integrity": "sha512-B6w7tkwNid7ToxjZ08rQMT8M9BJAf8DKx8Ft4NivzH0zBUfd6jldGcisJn/RLgxcX3FPNDdNQCUEMMT79b+oCQ==", + "node_modules/sqlite3/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "optional": true, "dependencies": { - "ip-address": "^9.0.5", - "smart-buffer": "^4.2.0" + "brace-expansion": "^1.1.7" }, "engines": { - "node": ">= 10.0.0", - "npm": ">= 3.0.0" + "node": "*" } }, - "node_modules/socks-proxy-agent": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-6.2.1.tgz", - "integrity": "sha512-a6KW9G+6B3nWZ1yB8G7pJwL3ggLy1uTzKAgCb7ttblwqdz9fMGJUuTy3uFzEP48FAs9FLILlmzDlE2JJhVQaXQ==", + "node_modules/sqlite3/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "optional": true, "dependencies": { - "agent-base": "^6.0.2", - "debug": "^4.3.3", - "socks": "^2.6.2" + "yallist": "^4.0.0" }, "engines": { - "node": ">= 10" + "node": ">=8" } }, - "node_modules/socks-proxy-agent/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==", + "node_modules/sqlite3/node_modules/minipass-fetch": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-1.4.1.tgz", + "integrity": "sha512-CGH1eblLq26Y15+Azk7ey4xh0J/XfJfrCox5LDJiKqI2Q2iwOLOKrlmIaODiSQS8d18jalF6y2K2ePUm0CmShw==", "optional": true, "dependencies": { - "debug": "4" + "minipass": "^3.1.0", + "minipass-sized": "^1.0.3", + "minizlib": "^2.0.0" }, "engines": { - "node": ">= 6.0.0" + "node": ">=8" + }, + "optionalDependencies": { + "encoding": "^0.1.12" } }, - "node_modules/socks-proxy-agent/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "node_modules/sqlite3/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", "optional": true, - "dependencies": { - "ms": "2.1.2" + "bin": { + "mkdirp": "bin/cmd.js" }, "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "node": ">=10" } }, - "node_modules/socks-proxy-agent/node_modules/ms": { + "node_modules/sqlite3/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==", "optional": true }, - "node_modules/sonic-boom": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-1.4.1.tgz", - "integrity": "sha512-LRHh/A8tpW7ru89lrlkU4AszXt1dbwSjVWguGrmlxE7tawVmDBlI1PILMkXAxJTwqhgsEeTHzj36D5CmHgQmNg==", + "node_modules/sqlite3/node_modules/node-gyp": { + "version": "8.4.1", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-8.4.1.tgz", + "integrity": "sha512-olTJRgUtAb/hOXG0E93wZDs5YiJlgbXxTwQAFHyNlRsXQnYzUaF2aGgujZbw+hR8aF4ZG/rST57bWMWD16jr9w==", + "optional": true, "dependencies": { - "atomic-sleep": "^1.0.0", - "flatstr": "^1.0.12" - } - }, - "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==", + "env-paths": "^2.2.0", + "glob": "^7.1.4", + "graceful-fs": "^4.2.6", + "make-fetch-happen": "^9.1.0", + "nopt": "^5.0.0", + "npmlog": "^6.0.0", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.2", + "which": "^2.0.2" + }, + "bin": { + "node-gyp": "bin/node-gyp.js" + }, "engines": { - "node": ">=0.10.0" + "node": ">= 10.12.0" } }, - "node_modules/spawn-error-forwarder": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/spawn-error-forwarder/-/spawn-error-forwarder-1.0.0.tgz", - "integrity": "sha512-gRjMgK5uFjbCvdibeGJuy3I5OYz6VLoVdsOJdA6wV0WlfQVLFueoqMxwwYD9RODdgb6oUIvlRlsyFSiQkMKu0g==" - }, - "node_modules/spawn-wrap": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-2.0.0.tgz", - "integrity": "sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==", - "dev": true, + "node_modules/sqlite3/node_modules/nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "optional": true, "dependencies": { - "foreground-child": "^2.0.0", - "is-windows": "^1.0.2", - "make-dir": "^3.0.0", - "rimraf": "^3.0.0", - "signal-exit": "^3.0.2", - "which": "^2.0.1" + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" }, "engines": { - "node": ">=8" + "node": ">=6" } }, - "node_modules/spawn-wrap/node_modules/rimraf": { + "node_modules/sqlite3/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, + "optional": true, "dependencies": { "glob": "^7.1.3" }, @@ -15911,115 +13173,48 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/spawn-wrap/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/spdx-correct": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", - "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", - "dependencies": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-exceptions": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", - "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==" - }, - "node_modules/spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-license-ids": { - "version": "3.0.17", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.17.tgz", - "integrity": "sha512-sh8PWc/ftMqAAdFiBu6Fy6JUOYjqDJBJvIhpfDMyHrr0Rbp5liZqd4TjtQ/RgfLjKFZb+LMx5hpml5qOWy0qvg==" - }, - "node_modules/split": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", - "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==", + "node_modules/sqlite3/node_modules/socks-proxy-agent": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-6.2.1.tgz", + "integrity": "sha512-a6KW9G+6B3nWZ1yB8G7pJwL3ggLy1uTzKAgCb7ttblwqdz9fMGJUuTy3uFzEP48FAs9FLILlmzDlE2JJhVQaXQ==", + "optional": true, "dependencies": { - "through": "2" + "agent-base": "^6.0.2", + "debug": "^4.3.3", + "socks": "^2.6.2" }, "engines": { - "node": "*" - } - }, - "node_modules/split2": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz", - "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==", - "dependencies": { - "readable-stream": "^3.0.0" + "node": ">= 10" } }, - "node_modules/split2/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==", + "node_modules/sqlite3/node_modules/ssri": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz", + "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==", + "optional": true, "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" + "minipass": "^3.1.1" }, "engines": { - "node": ">= 6" - } - }, - "node_modules/split2/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": ">= 8" } }, - "node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" - }, - "node_modules/sqlite3": { - "version": "5.1.7", - "resolved": "https://registry.npmjs.org/sqlite3/-/sqlite3-5.1.7.tgz", - "integrity": "sha512-GGIyOiFaG+TUra3JIfkI/zGP8yZYLPQ0pl1bH+ODjiX57sPhrLU5sQJn1y9bDKZUFYkX1crlrPfSYt0BKKdkog==", - "hasInstallScript": true, + "node_modules/sqlite3/node_modules/unique-filename": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", + "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", + "optional": true, "dependencies": { - "bindings": "^1.5.0", - "node-addon-api": "^7.0.0", - "prebuild-install": "^7.1.1", - "tar": "^6.1.11" - }, - "optionalDependencies": { - "node-gyp": "8.x" - }, - "peerDependencies": { - "node-gyp": "8.x" - }, - "peerDependenciesMeta": { - "node-gyp": { - "optional": true - } + "unique-slug": "^2.0.0" + } + }, + "node_modules/sqlite3/node_modules/unique-slug": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", + "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", + "optional": true, + "dependencies": { + "imurmurhash": "^0.1.4" } }, "node_modules/sqlstring": { @@ -16034,6 +13229,7 @@ "version": "1.18.0", "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.18.0.tgz", "integrity": "sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==", + "dev": true, "dependencies": { "asn1": "~0.2.3", "assert-plus": "^1.0.0", @@ -16057,18 +13253,26 @@ "node_modules/sshpk/node_modules/jsbn": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==" + "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==", + "dev": true }, "node_modules/ssri": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz", - "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==", - "optional": true, + "version": "10.0.6", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.6.tgz", + "integrity": "sha512-MGrFH9Z4NP9Iyhqn16sDtBpRRNJ0Y2hNa6D65h736fVSaPCHr4DM4sWUNvVaSuC+0OBGhwsrydQwmgfg5LncqQ==", "dependencies": { - "minipass": "^3.1.1" + "minipass": "^7.0.3" }, "engines": { - "node": ">= 8" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/ssri/node_modules/minipass": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.1.tgz", + "integrity": "sha512-UZ7eQ+h8ywIRAW1hIEl2AqdwzJucU/Kp59+8kkZeSvafXhZjul247BvIJjEVFVeON6d7lM46XX1HXCduKAS8VA==", + "engines": { + "node": ">=16 || 14 >=14.17" } }, "node_modules/stack-trace": { @@ -16115,6 +13319,15 @@ "pkg-conf": "^2.0.0" } }, + "node_modules/standard-engine/node_modules/get-stdin": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-6.0.0.tgz", + "integrity": "sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, "node_modules/standard/node_modules/acorn": { "version": "6.4.2", "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", @@ -16127,83 +13340,260 @@ "node": ">=0.4.0" } }, - "node_modules/standard/node_modules/chardet": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz", - "integrity": "sha512-j/Toj7f1z98Hh2cYo2BVr85EpIRWqUi7rtRSGxh/cqUjqrnJe9l9UE7IUGd2vQ2p+kSHLkSzObQPZPLUC6TQwg==", + "node_modules/standard/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==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/standard/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/standard/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/standard/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/standard/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/standard/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/standard/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", "dev": true }, - "node_modules/standard/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "node_modules/standard/node_modules/cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", "dev": true, "dependencies": { - "ms": "^2.1.1" + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "engines": { + "node": ">=4.8" } }, - "node_modules/standard/node_modules/doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "node_modules/standard/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/standard/node_modules/eslint": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-5.4.0.tgz", + "integrity": "sha512-UIpL91XGex3qtL6qwyCQJar2j3osKxK9e3ano3OcGEIRM4oWIpCkDg9x95AXEC2wMs7PnxzOkPZ2gq+tsMS9yg==", "dev": true, "dependencies": { - "esutils": "^2.0.2" + "ajv": "^6.5.0", + "babel-code-frame": "^6.26.0", + "chalk": "^2.1.0", + "cross-spawn": "^6.0.5", + "debug": "^3.1.0", + "doctrine": "^2.1.0", + "eslint-scope": "^4.0.0", + "eslint-utils": "^1.3.1", + "eslint-visitor-keys": "^1.0.0", + "espree": "^4.0.0", + "esquery": "^1.0.1", + "esutils": "^2.0.2", + "file-entry-cache": "^2.0.0", + "functional-red-black-tree": "^1.0.1", + "glob": "^7.1.2", + "globals": "^11.7.0", + "ignore": "^4.0.2", + "imurmurhash": "^0.1.4", + "inquirer": "^5.2.0", + "is-resolvable": "^1.1.0", + "js-yaml": "^3.11.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.3.0", + "lodash": "^4.17.5", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.1", + "natural-compare": "^1.4.0", + "optionator": "^0.8.2", + "path-is-inside": "^1.0.2", + "pluralize": "^7.0.0", + "progress": "^2.0.0", + "regexpp": "^2.0.0", + "require-uncached": "^1.0.3", + "semver": "^5.5.0", + "strip-ansi": "^4.0.0", + "strip-json-comments": "^2.0.1", + "table": "^4.0.3", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^6.14.0 || ^8.10.0 || >=9.10.0" + } + }, + "node_modules/standard/node_modules/eslint-config-standard": { + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-12.0.0.tgz", + "integrity": "sha512-COUz8FnXhqFitYj4DTqHzidjIL/t4mumGZto5c7DrBpvWoie+Sn3P4sLEzUGeYhRElWuFEf8K1S1EfvD1vixCQ==", + "dev": true, + "peerDependencies": { + "eslint": ">=5.0.0", + "eslint-plugin-import": ">=2.13.0", + "eslint-plugin-node": ">=7.0.0", + "eslint-plugin-promise": ">=4.0.0", + "eslint-plugin-standard": ">=4.0.0" + } + }, + "node_modules/standard/node_modules/eslint-config-standard-jsx": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/eslint-config-standard-jsx/-/eslint-config-standard-jsx-6.0.2.tgz", + "integrity": "sha512-D+YWAoXw+2GIdbMBRAzWwr1ZtvnSf4n4yL0gKGg7ShUOGXkSOLerI17K4F6LdQMJPNMoWYqepzQD/fKY+tXNSg==", + "dev": true, + "peerDependencies": { + "eslint": ">=5.0.0", + "eslint-plugin-react": ">=7.11.1" + } + }, + "node_modules/standard/node_modules/eslint-plugin-import": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.14.0.tgz", + "integrity": "sha512-FpuRtniD/AY6sXByma2Wr0TXvXJ4nA/2/04VPlfpmUDPOpOY264x+ILiwnrk/k4RINgDAyFZByxqPUbSQ5YE7g==", + "dev": true, + "dependencies": { + "contains-path": "^0.1.0", + "debug": "^2.6.8", + "doctrine": "1.5.0", + "eslint-import-resolver-node": "^0.3.1", + "eslint-module-utils": "^2.2.0", + "has": "^1.0.1", + "lodash": "^4.17.4", + "minimatch": "^3.0.3", + "read-pkg-up": "^2.0.0", + "resolve": "^1.6.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "2.x - 5.x" + } + }, + "node_modules/standard/node_modules/eslint-plugin-import/node_modules/doctrine": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", + "integrity": "sha512-lsGyRuYr4/PIB0txi+Fy2xOMI2dGaTguCaotzFGkVZuKR5usKfcRWIFKNM3QNrU7hh/+w2bwTW+ZeXPK5l8uVg==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2", + "isarray": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/standard/node_modules/eslint-plugin-react": { + "version": "7.11.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.11.1.tgz", + "integrity": "sha512-cVVyMadRyW7qsIUh3FHp3u6QHNhOgVrLQYdQEB1bPWBsgbNCHdFAeNMquBMCcZJu59eNthX053L70l7gRt4SCw==", + "dev": true, + "dependencies": { + "array-includes": "^3.0.3", + "doctrine": "^2.1.0", + "has": "^1.0.3", + "jsx-ast-utils": "^2.0.1", + "prop-types": "^15.6.2" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0" + } + }, + "node_modules/standard/node_modules/eslint-scope": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", + "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", + "dev": true, + "dependencies": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" }, "engines": { - "node": ">=0.10.0" + "node": ">=4.0.0" + } + }, + "node_modules/standard/node_modules/eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true, + "engines": { + "node": ">=4" } }, - "node_modules/standard/node_modules/eslint": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-5.4.0.tgz", - "integrity": "sha512-UIpL91XGex3qtL6qwyCQJar2j3osKxK9e3ano3OcGEIRM4oWIpCkDg9x95AXEC2wMs7PnxzOkPZ2gq+tsMS9yg==", + "node_modules/standard/node_modules/eslint/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": { - "ajv": "^6.5.0", - "babel-code-frame": "^6.26.0", - "chalk": "^2.1.0", - "cross-spawn": "^6.0.5", - "debug": "^3.1.0", - "doctrine": "^2.1.0", - "eslint-scope": "^4.0.0", - "eslint-utils": "^1.3.1", - "eslint-visitor-keys": "^1.0.0", - "espree": "^4.0.0", - "esquery": "^1.0.1", - "esutils": "^2.0.2", - "file-entry-cache": "^2.0.0", - "functional-red-black-tree": "^1.0.1", - "glob": "^7.1.2", - "globals": "^11.7.0", - "ignore": "^4.0.2", - "imurmurhash": "^0.1.4", - "inquirer": "^5.2.0", - "is-resolvable": "^1.1.0", - "js-yaml": "^3.11.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.3.0", - "lodash": "^4.17.5", - "minimatch": "^3.0.4", - "mkdirp": "^0.5.1", - "natural-compare": "^1.4.0", - "optionator": "^0.8.2", - "path-is-inside": "^1.0.2", - "pluralize": "^7.0.0", - "progress": "^2.0.0", - "regexpp": "^2.0.0", - "require-uncached": "^1.0.3", - "semver": "^5.5.0", - "strip-ansi": "^4.0.0", - "strip-json-comments": "^2.0.1", - "table": "^4.0.3", - "text-table": "^0.2.0" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^6.14.0 || ^8.10.0 || >=9.10.0" + "ms": "^2.1.1" } }, "node_modules/standard/node_modules/espree": { @@ -16220,18 +13610,13 @@ "node": ">=6.0.0" } }, - "node_modules/standard/node_modules/external-editor": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz", - "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==", + "node_modules/standard/node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", "dev": true, - "dependencies": { - "chardet": "^0.4.0", - "iconv-lite": "^0.4.17", - "tmp": "^0.0.33" - }, "engines": { - "node": ">=0.12" + "node": ">=4.0" } }, "node_modules/standard/node_modules/file-entry-cache": { @@ -16262,28 +13647,107 @@ "node": ">=0.10.0" } }, - "node_modules/standard/node_modules/inquirer": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-5.2.0.tgz", - "integrity": "sha512-E9BmnJbAKLPGonz0HeWHtbKf+EeSP93paWO3ZYoUpq/aowXvYGjjCSuashhXPpzbArIjBbji39THkxTz9ZeEUQ==", + "node_modules/standard/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": { - "ansi-escapes": "^3.0.0", - "chalk": "^2.0.0", - "cli-cursor": "^2.1.0", - "cli-width": "^2.0.0", - "external-editor": "^2.1.0", - "figures": "^2.0.0", - "lodash": "^4.3.0", - "mute-stream": "0.0.7", - "run-async": "^2.2.0", - "rxjs": "^5.5.2", - "string-width": "^2.1.0", - "strip-ansi": "^4.0.0", - "through": "^2.3.6" + "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": ">=6.0.0" + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/standard/node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/standard/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/standard/node_modules/ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/standard/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/standard/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/standard/node_modules/levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", + "dev": true, + "dependencies": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/standard/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/standard/node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" } }, "node_modules/standard/node_modules/ms": { @@ -16292,114 +13756,152 @@ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dev": true }, - "node_modules/standard/node_modules/rxjs": { - "version": "5.5.12", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.5.12.tgz", - "integrity": "sha512-xx2itnL5sBbqeeiVgNPVuQQ1nC8Jp2WfNJhXWHmElW9YmrpS9UVnNzhP3EH3HFqexO5Tlp8GhYY+WEcqcVMvGw==", + "node_modules/standard/node_modules/optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", "dev": true, "dependencies": { - "symbol-observable": "1.0.1" + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" }, "engines": { - "npm": ">=2.0.0" + "node": ">= 0.8.0" } }, - "node_modules/standard/node_modules/slice-ansi": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-1.0.0.tgz", - "integrity": "sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==", + "node_modules/standard/node_modules/path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", "dev": true, - "dependencies": { - "is-fullwidth-code-point": "^2.0.0" - }, "engines": { "node": ">=4" } }, - "node_modules/standard/node_modules/table": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/table/-/table-4.0.3.tgz", - "integrity": "sha512-S7rnFITmBH1EnyKcvxBh1LjYeQMmnZtCXSEbHcH6S0NoKit24ZuFO/T1vDcLdYsLQkM188PVVhQmzKIuThNkKg==", + "node_modules/standard/node_modules/prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/standard/node_modules/rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", "dev": true, "dependencies": { - "ajv": "^6.0.1", - "ajv-keywords": "^3.0.0", - "chalk": "^2.1.0", - "lodash": "^4.17.4", - "slice-ansi": "1.0.0", - "string-width": "^2.1.1" + "glob": "^7.1.3" }, - "engines": { - "node": ">=4.0.0" + "bin": { + "rimraf": "bin.js" } }, - "node_modules/standard/node_modules/write": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz", - "integrity": "sha512-CJ17OoULEKXpA5pef3qLj5AxTJ6mSt7g84he2WIskKwqFO4T97d5V7Tadl0DYDk7qyUOQD5WlUlOMChaYrhxeA==", + "node_modules/standard/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/standard/node_modules/shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", "dev": true, "dependencies": { - "mkdirp": "^0.5.1" + "shebang-regex": "^1.0.0" }, "engines": { "node": ">=0.10.0" } }, - "node_modules/statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "node_modules/standard/node_modules/shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/standard/node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true + }, + "node_modules/standard/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==", + "dev": true, + "dependencies": { + "ansi-regex": "^3.0.0" + }, "engines": { - "node": ">= 0.6" + "node": ">=4" } }, - "node_modules/stealthy-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", - "integrity": "sha512-ZnWpYnYugiOVEY5GkcuJK1io5V8QmNYChG62gSit9pQVGErXtrKuPC55ITaVSukmMta5qpMU7vqLt2Lnni4f/g==", + "node_modules/standard/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/stream-combiner2": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.1.1.tgz", - "integrity": "sha512-3PnJbYgS56AeWgtKF5jtJRT6uFJe56Z0Hc5Ngg/6sI6rIt8iiMBTa9cvdyFfpMQjaVHr8dusbNeFGIIonxOvKw==", + "node_modules/standard/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": { - "duplexer2": "~0.1.0", - "readable-stream": "^2.0.2" + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" } }, - "node_modules/stream-combiner2/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-combiner2/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==", + "node_modules/standard/node_modules/type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", + "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" + "prelude-ls": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" } }, - "node_modules/stream-combiner2/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/stream-combiner2/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==", + "node_modules/standard/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, "dependencies": { - "safe-buffer": "~5.1.0" + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "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-length": { @@ -16411,11 +13913,13 @@ "bluebird": "^2.6.2" } }, - "node_modules/stream-length/node_modules/bluebird": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-2.11.0.tgz", - "integrity": "sha512-UfFSr22dmHPQqPP9XWHRhq+gWnHCYguQGkXQlbyPtW5qTnhFWA8/iXg765tH0cAjy7l/zPJ1aBTO0g5XgA7kvQ==", - "dev": true + "node_modules/stream-read-all": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/stream-read-all/-/stream-read-all-3.0.1.tgz", + "integrity": "sha512-EWZT9XOceBPlVJRrYcykW8jyRSZYbkb/0ZK36uLEmoWVO5gxBOnntNTseNzfREsqxqdfEGQrD8SXQ3QWbBmq8A==", + "engines": { + "node": ">=10" + } }, "node_modules/streamsearch": { "version": "1.1.0", @@ -16430,22 +13934,30 @@ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==" }, + "node_modules/string-argv": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz", + "integrity": "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==", + "engines": { + "node": ">=0.6.19" + } + }, "node_modules/string-format": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/string-format/-/string-format-2.0.0.tgz", "integrity": "sha512-bbEs3scLeYNXLecRRuk6uJxdXUSj6le/8rNPHChIJTn2V79aXVTR1EH2OH5zLKKoz0V02fOUKZZcw01pLUShZA==" }, "node_modules/string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "devOptional": true, + "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": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" }, "engines": { - "node": ">=4" + "node": ">=8" } }, "node_modules/string-width-cjs": { @@ -16453,7 +13965,6 @@ "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -16463,45 +13974,16 @@ "node": ">=8" } }, - "node_modules/string-width-cjs/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==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width-cjs/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width-cjs/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==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/string.prototype.trim": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz", - "integrity": "sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==", + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz", + "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.0", + "es-object-atoms": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -16511,43 +13993,45 @@ } }, "node_modules/string.prototype.trimend": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz", - "integrity": "sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz", + "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/string.prototype.trimstart": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz", - "integrity": "sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "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==", - "devOptional": true, + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dependencies": { - "ansi-regex": "^3.0.0" + "ansi-regex": "^5.0.1" }, "engines": { - "node": ">=4" + "node": ">=8" } }, "node_modules/strip-ansi-cjs": { @@ -16555,7 +14039,6 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, "dependencies": { "ansi-regex": "^5.0.1" }, @@ -16563,24 +14046,6 @@ "node": ">=8" } }, - "node_modules/strip-ansi-cjs/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==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi/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==", - "devOptional": true, - "engines": { - "node": ">=4" - } - }, "node_modules/strip-bom": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", @@ -16598,164 +14063,100 @@ "node": ">=0.10.0" } }, - "node_modules/strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "engines": { - "node": ">=6" - } - }, - "node_modules/strip-indent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", - "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", - "dependencies": { - "min-indent": "^1.0.0" - }, - "engines": { - "node": ">=8" - } - }, "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/superagent": { - "version": "3.8.3", - "resolved": "https://registry.npmjs.org/superagent/-/superagent-3.8.3.tgz", - "integrity": "sha512-GLQtLMCoEIK4eDv6OGtkOoSMt3D+oq0y3dsxMuYuDvaNUvuT8eFBuLmfR0iYYzHC1e8hpzC6ZsxbuP6DIalMFA==", - "deprecated": "Please upgrade to v7.0.2+ of superagent. We have fixed numerous issues with streams, form-data, attach(), filesystem errors not bubbling up (ENOENT on attach()), and all tests are now passing. See the releases tab for more information at .", - "dev": true, - "dependencies": { - "component-emitter": "^1.2.0", - "cookiejar": "^2.1.0", - "debug": "^3.1.0", - "extend": "^3.0.0", - "form-data": "^2.3.1", - "formidable": "^1.2.0", - "methods": "^1.1.1", - "mime": "^1.4.1", - "qs": "^6.5.1", - "readable-stream": "^2.3.5" - }, - "engines": { - "node": ">= 4.0" - } - }, - "node_modules/superagent/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/superagent/node_modules/form-data": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", - "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", + "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, - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - }, "engines": { - "node": ">= 0.12" - } - }, - "node_modules/superagent/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/superagent/node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "dev": true, - "bin": { - "mime": "cli.js" + "node": ">=8" }, - "engines": { - "node": ">=4" - } - }, - "node_modules/superagent/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==", - "dev": true - }, - "node_modules/superagent/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" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/superagent/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/superagent/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==", + "node_modules/superagent": { + "version": "8.1.2", + "resolved": "https://registry.npmjs.org/superagent/-/superagent-8.1.2.tgz", + "integrity": "sha512-6WTxW1EB6yCxV5VFOIPQruWGHqc3yI7hEmZK6h+pyk69Lk/Ut7rLUY6W/ONF2MjBuGjvmMiIpsrVJ2vjrHlslA==", + "deprecated": "Please upgrade to v9.0.0+ as we have fixed a public vulnerability with formidable dependency. Note that v9.0.0+ requires Node.js v14.18.0+. See https://github.com/ladjs/superagent/pull/1800 for insight. This project is supported and maintained by the team at Forward Email @ https://forwardemail.net", "dev": true, "dependencies": { - "safe-buffer": "~5.1.0" + "component-emitter": "^1.3.0", + "cookiejar": "^2.1.4", + "debug": "^4.3.4", + "fast-safe-stringify": "^2.1.1", + "form-data": "^4.0.0", + "formidable": "^2.1.2", + "methods": "^1.1.2", + "mime": "2.6.0", + "qs": "^6.11.0", + "semver": "^7.3.8" + }, + "engines": { + "node": ">=6.4.0 <13 || >=14" } }, - "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==", + "node_modules/superagent/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": { - "has-flag": "^3.0.0" + "ms": "2.1.2" }, "engines": { - "node": ">=4" + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "node_modules/supports-hyperlinks": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz", - "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==", + "node_modules/superagent/node_modules/formidable": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/formidable/-/formidable-2.1.2.tgz", + "integrity": "sha512-CM3GuJ57US06mlpQ47YcunuUZ9jpm8Vx+P2CGt2j7HpgkKZO/DJYQ0Bobim8G6PFQmK5lOqOOdUXboU+h73A4g==", + "dev": true, "dependencies": { - "has-flag": "^4.0.0", - "supports-color": "^7.0.0" + "dezalgo": "^1.0.4", + "hexoid": "^1.0.0", + "once": "^1.4.0", + "qs": "^6.11.0" }, - "engines": { - "node": ">=8" + "funding": { + "url": "https://ko-fi.com/tunnckoCore/commissions" } }, - "node_modules/supports-hyperlinks/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==", + "node_modules/superagent/node_modules/mime": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "dev": true, + "bin": { + "mime": "cli.js" + }, "engines": { - "node": ">=8" + "node": ">=4.0.0" + } + }, + "node_modules/superagent/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/superagent/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/supports-hyperlinks/node_modules/supports-color": { + "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==", @@ -16778,16 +14179,16 @@ } }, "node_modules/swagger-ui-dist": { - "version": "5.11.9", - "resolved": "https://registry.npmjs.org/swagger-ui-dist/-/swagger-ui-dist-5.11.9.tgz", - "integrity": "sha512-e1x1x92wwjBWTjM+P9aH6qRurjFol/y5eCN0U2pK/nrS5mKxZuTsZUqdYya1W+JMom8fbw6/X8Ymp99lHRjBfw==" + "version": "5.17.10", + "resolved": "https://registry.npmjs.org/swagger-ui-dist/-/swagger-ui-dist-5.17.10.tgz", + "integrity": "sha512-fp8SYeEK216KS1/noDvursUOGojEbkvtckOpOmAGZUjlx/ma7VLD2PLQwyermjlzFrlHI5uCt1V+M1C3qBvRyQ==" }, "node_modules/swagger-ui-express": { - "version": "4.6.3", - "resolved": "https://registry.npmjs.org/swagger-ui-express/-/swagger-ui-express-4.6.3.tgz", - "integrity": "sha512-CDje4PndhTD2HkgyKH3pab+LKspDeB/NhPN2OF1j+piYIamQqBYwAXWESOT1Yju2xFg51bRW9sUng2WxDjzArw==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/swagger-ui-express/-/swagger-ui-express-5.0.0.tgz", + "integrity": "sha512-tsU9tODVvhyfkNSvf03E6FAk+z+5cU3lXAzMy6Pv4av2Gt2xA0++fogwC4qo19XuFf6hdxevPuVCSKFuMHJhFA==", "dependencies": { - "swagger-ui-dist": ">=4.11.0" + "swagger-ui-dist": ">=5.0.0" }, "engines": { "node": ">= v0.10.32" @@ -16806,80 +14207,176 @@ } }, "node_modules/table": { - "version": "5.4.6", - "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", - "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/table/-/table-4.0.3.tgz", + "integrity": "sha512-S7rnFITmBH1EnyKcvxBh1LjYeQMmnZtCXSEbHcH6S0NoKit24ZuFO/T1vDcLdYsLQkM188PVVhQmzKIuThNkKg==", "dev": true, "dependencies": { - "ajv": "^6.10.2", - "lodash": "^4.17.14", - "slice-ansi": "^2.1.0", - "string-width": "^3.0.0" + "ajv": "^6.0.1", + "ajv-keywords": "^3.0.0", + "chalk": "^2.1.0", + "lodash": "^4.17.4", + "slice-ansi": "1.0.0", + "string-width": "^2.1.1" }, "engines": { - "node": ">=6.0.0" + "node": ">=4.0.0" } }, "node_modules/table-layout": { - "version": "0.4.5", - "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-0.4.5.tgz", - "integrity": "sha512-zTvf0mcggrGeTe/2jJ6ECkJHAQPIYEwDoqsiqBjI24mvRmQbInK5jq33fyypaCBxX08hMkfmdOqj6haT33EqWw==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-3.0.2.tgz", + "integrity": "sha512-rpyNZYRw+/C+dYkcQ3Pr+rLxW4CfHpXjPDnG7lYhdRoUcZTUt+KEsX+94RGp/aVp/MQU35JCITv2T/beY4m+hw==", "dependencies": { - "array-back": "^2.0.0", - "deep-extend": "~0.6.0", - "lodash.padend": "^4.6.1", - "typical": "^2.6.1", - "wordwrapjs": "^3.0.0" + "@75lb/deep-merge": "^1.1.1", + "array-back": "^6.2.2", + "command-line-args": "^5.2.1", + "command-line-usage": "^7.0.0", + "stream-read-all": "^3.0.1", + "typical": "^7.1.1", + "wordwrapjs": "^5.1.0" + }, + "bin": { + "table-layout": "bin/cli.js" }, "engines": { - "node": ">=4.0.0" + "node": ">=12.17" + } + }, + "node_modules/table-layout/node_modules/array-back": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/array-back/-/array-back-6.2.2.tgz", + "integrity": "sha512-gUAZ7HPyb4SJczXAMUXMGAvI976JoK3qEx9v1FTmeYuJj0IBiaKttG1ydtGKdkfqWkIkouke7nG8ufGy77+Cvw==", + "engines": { + "node": ">=12.17" + } + }, + "node_modules/table-layout/node_modules/typical": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/typical/-/typical-7.1.1.tgz", + "integrity": "sha512-T+tKVNs6Wu7IWiAce5BgMd7OZfNYUndHwc5MknN+UHOudi7sGZzuHdCadllRuqJ3fPtgFtIH9+lt9qRv6lmpfA==", + "engines": { + "node": ">=12.17" } }, "node_modules/table/node_modules/ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", + "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", "dev": true, "engines": { - "node": ">=6" + "node": ">=4" } }, - "node_modules/table/node_modules/emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "node_modules/table/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/table/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/table/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/table/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", "dev": true }, + "node_modules/table/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/table/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/table/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==", + "dev": true, + "engines": { + "node": ">=4" + } + }, "node_modules/table/node_modules/string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", "dev": true, "dependencies": { - "emoji-regex": "^7.0.1", "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" + "strip-ansi": "^4.0.0" }, "engines": { - "node": ">=6" + "node": ">=4" } }, "node_modules/table/node_modules/strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", "dev": true, "dependencies": { - "ansi-regex": "^4.1.0" + "ansi-regex": "^3.0.0" }, "engines": { - "node": ">=6" + "node": ">=4" + } + }, + "node_modules/table/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/tar": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.0.tgz", - "integrity": "sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", + "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", "dependencies": { "chownr": "^2.0.0", "fs-minipass": "^2.0.0", @@ -16944,10 +14441,24 @@ "safe-buffer": "~5.2.0" } }, - "node_modules/tar/node_modules/minipass": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", - "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "node_modules/tar/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/tar/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" } @@ -17002,54 +14513,6 @@ "integrity": "sha512-j1llvWVFyEn/6XIFDfX5LAU43DXe0GCt3NfXDwJ8XpRRMkS+i50SAkonAONBy+vxwPFBd50MFU8a2uj8R/ccLg==", "dev": true }, - "node_modules/temp-dir": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz", - "integrity": "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/tempy": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/tempy/-/tempy-1.0.1.tgz", - "integrity": "sha512-biM9brNqxSc04Ee71hzFbryD11nX7VPhQQY32AdDmjFvodsRFz/3ufeoTZ6uYkRFfGo188tENcASNs3vTdsM0w==", - "dependencies": { - "del": "^6.0.0", - "is-stream": "^2.0.0", - "temp-dir": "^2.0.0", - "type-fest": "^0.16.0", - "unique-string": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/tempy/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==", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/tempy/node_modules/type-fest": { - "version": "0.16.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.16.0.tgz", - "integrity": "sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/test-exclude": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", @@ -17064,24 +14527,46 @@ "node": ">=8" } }, - "node_modules/test-value": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/test-value/-/test-value-3.0.0.tgz", - "integrity": "sha512-sVACdAWcZkSU9x7AOmJo5TqE+GyNJknHaHsMrR6ZnhjVlVN9Yx6FjHrsKZ3BjIpPCT68zYesPWkakrNupwfOTQ==", + "node_modules/test-exclude/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/test-exclude/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/test-exclude/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": { - "array-back": "^2.0.0", - "typical": "^2.6.1" + "brace-expansion": "^1.1.7" }, "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/text-extensions": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-1.9.0.tgz", - "integrity": "sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==", - "engines": { - "node": ">=0.10" + "node": "*" } }, "node_modules/text-table": { @@ -17090,39 +14575,19 @@ "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", "dev": true }, - "node_modules/through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==" - }, - "node_modules/through2": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", - "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", - "dependencies": { - "readable-stream": "3" - } - }, - "node_modules/through2/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==", + "node_modules/thread-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/thread-stream/-/thread-stream-3.0.0.tgz", + "integrity": "sha512-oUIFjxaUT6knhPtWgDMc29zF1FcSl0yXpapkyrQrCGEfYA2HUZXCilUtKyYIv6HkCyqSPAMkY+EG0GbyIrNDQg==", "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" + "real-require": "^0.2.0" } }, - "node_modules/through2/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/through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", + "dev": true }, "node_modules/timers-ext": { "version": "0.1.7", @@ -17179,49 +14644,45 @@ "resolved": "https://registry.npmjs.org/toposort-class/-/toposort-class-1.0.1.tgz", "integrity": "sha512-OsLcGGbYF3rMjPUf8oKktyvCiUxSbqMMS39m33MAjLTC1DVIH6x3WSt63/M77ihI09+Sdfk1AXvfhCEeUmC7mg==" }, - "node_modules/tough-cookie": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-3.0.1.tgz", - "integrity": "sha512-yQyJ0u4pZsv9D4clxO69OEjLWYw+jbgspjTue4lTQZLfV0c5l1VmK2y1JK8E9ahdpltPOaAThPcp5nKPUgSnsg==", - "dev": true, + "node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "optional": true + }, + "node_modules/tuf-js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/tuf-js/-/tuf-js-1.1.7.tgz", + "integrity": "sha512-i3P9Kgw3ytjELUfpuKVDNBJvk4u5bXL6gskv572mcevPbSKCV3zt3djhmlEQ65yERjIbOSncy7U4cQJaB1CBCg==", "dependencies": { - "ip-regex": "^2.1.0", - "psl": "^1.1.28", - "punycode": "^2.1.1" + "@tufjs/models": "1.0.4", + "debug": "^4.3.4", + "make-fetch-happen": "^11.1.1" }, "engines": { - "node": ">=6" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" - }, - "node_modules/traverse": { - "version": "0.6.8", - "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.6.8.tgz", - "integrity": "sha512-aXJDbk6SnumuaZSANd21XAo15ucCDE38H4fkqiGsc3MhCK+wOlZvLP9cB/TvpHT0mOyWgC4Z8EwRlzqYSUzdsA==", - "engines": { - "node": ">= 0.4" + "node_modules/tuf-js/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" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/trim-newlines": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", - "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==", "engines": { - "node": ">=8" + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true + "node_modules/tuf-js/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/tunnel-agent": { "version": "0.6.0", @@ -17237,7 +14698,8 @@ "node_modules/tweetnacl": { "version": "0.14.5", "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==" + "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", + "dev": true }, "node_modules/type": { "version": "2.7.2", @@ -17246,12 +14708,12 @@ "dev": true }, "node_modules/type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", + "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.1.2" + "prelude-ls": "^1.2.1" }, "engines": { "node": ">= 0.8.0" @@ -17270,6 +14732,7 @@ "version": "0.8.1", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true, "engines": { "node": ">=8" } @@ -17340,9 +14803,9 @@ } }, "node_modules/typed-array-length": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.5.tgz", - "integrity": "sha512-yMi0PlwuznKHxKmcpoOdeLwxBoVPkqZxd7q2FgMkmD3bNwvF5VW0+UlUQ1k1vmktTu4Yu13Q0RIxEP8+B+wloA==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz", + "integrity": "sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==", "dev": true, "dependencies": { "call-bind": "^1.0.7", @@ -17368,20 +14831,23 @@ "version": "3.1.5", "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "dev": true, "dependencies": { "is-typedarray": "^1.0.0" } }, "node_modules/typical": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/typical/-/typical-2.6.1.tgz", - "integrity": "sha512-ofhi8kjIje6npGozTip9Fr8iecmYfEbS06i0JnIg+rh51KakryWF4+jX8lLKZVhy6N+ID45WYSFCxPOdTWCzNg==" + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/typical/-/typical-4.0.0.tgz", + "integrity": "sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw==", + "engines": { + "node": ">=8" + } }, "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" @@ -17402,15 +14868,29 @@ } }, "node_modules/umzug": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/umzug/-/umzug-2.2.0.tgz", - "integrity": "sha512-xZLW76ax70pND9bx3wqwb8zqkFGzZIK8dIHD9WdNy/CrNfjWcwQgQkGCuUqcuwEBvUm+g07z+qWvY+pxDmMEEw==", + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/umzug/-/umzug-3.8.0.tgz", + "integrity": "sha512-FRBvdZxllW3eUzsqG3CIfgOVChUONrKNZozNOJfvmcfBn5pMKcJjICuMMEsDLHYa/aqd7a2NtXfYEG86XHe1lQ==", "dependencies": { - "babel-runtime": "^6.23.0", - "bluebird": "^3.5.3" + "@rushstack/ts-command-line": "^4.12.2", + "emittery": "^0.13.0", + "fast-glob": "^3.3.2", + "pony-cause": "^2.1.4", + "type-fest": "^4.0.0" }, "engines": { - "node": ">=6.0.0" + "node": ">=12" + } + }, + "node_modules/umzug/node_modules/type-fest": { + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.18.2.tgz", + "integrity": "sha512-+suCYpfJLAe4OXS6+PPXjW3urOS4IoP9waSiLuXfLgqZODKw/aWwASvzqE886wA0kQgGy0mIWyhd87VpqIy6Xg==", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/unbox-primitive": { @@ -17429,9 +14909,9 @@ } }, "node_modules/underscore": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.1.tgz", - "integrity": "sha512-hzSoAVtJF+3ZtiFX0VgfFPHEDRm7Y/QPjGyNo4TVdnDTdft3tr8hEkD25a1jC+TjTuE7tkHGKkhwCgs9dgBB2g==" + "version": "1.13.6", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.6.tgz", + "integrity": "sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==" }, "node_modules/undici-types": { "version": "5.26.5", @@ -17445,45 +14925,48 @@ "dev": true }, "node_modules/unique-filename": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", - "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", - "optional": true, + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-3.0.0.tgz", + "integrity": "sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g==", "dependencies": { - "unique-slug": "^2.0.0" + "unique-slug": "^4.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/unique-slug": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", - "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", - "optional": true, + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-4.0.0.tgz", + "integrity": "sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ==", "dependencies": { "imurmurhash": "^0.1.4" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/unique-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", - "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-3.0.0.tgz", + "integrity": "sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ==", "dependencies": { - "crypto-random-string": "^2.0.0" + "crypto-random-string": "^4.0.0" }, "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/universal-user-agent": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.1.tgz", - "integrity": "sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ==" - }, "node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", + "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", + "dev": true, "engines": { - "node": ">= 10.0.0" + "node": ">= 4.0.0" } }, "node_modules/unpipe": { @@ -17494,10 +14977,18 @@ "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==", + "engines": { + "node": ">=8" + } + }, "node_modules/update-browserslist-db": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", - "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.16.tgz", + "integrity": "sha512-KVbTxlBYlckhF5wgfyZXTWnMn7MMZjMu9XG8bPlliUOP9ThaF4QnhP8qrjrH7DRzHfSk0oQv1wToW+iA5GajEQ==", "dev": true, "funding": [ { @@ -17514,8 +15005,8 @@ } ], "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" + "escalade": "^3.1.2", + "picocolors": "^1.0.1" }, "bin": { "update-browserslist-db": "cli.js" @@ -17524,18 +15015,62 @@ "browserslist": ">= 4.21.0" } }, + "node_modules/update-notifier": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-6.0.2.tgz", + "integrity": "sha512-EDxhTEVPZZRLWYcJ4ZXjGFN0oP7qYvbXWzEgRm/Yql4dHX5wDbvh89YHP6PK1lzZJYrMtXUuZZz8XGK+U6U1og==", + "dependencies": { + "boxen": "^7.0.0", + "chalk": "^5.0.1", + "configstore": "^6.0.0", + "has-yarn": "^3.0.0", + "import-lazy": "^4.0.0", + "is-ci": "^3.0.1", + "is-installed-globally": "^0.4.0", + "is-npm": "^6.0.0", + "is-yarn-global": "^0.4.0", + "latest-version": "^7.0.0", + "pupa": "^3.1.0", + "semver": "^7.3.7", + "semver-diff": "^4.0.0", + "xdg-basedir": "^5.1.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/yeoman/update-notifier?sponsor=1" + } + }, + "node_modules/update-notifier/node_modules/chalk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, "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/url-join": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.1.tgz", - "integrity": "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==" + "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==", + "dev": true, + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } }, "node_modules/util": { "version": "0.10.4", @@ -17564,30 +15099,29 @@ } }, "node_modules/uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", "bin": { - "uuid": "bin/uuid" + "uuid": "dist/bin/uuid" } }, "node_modules/uvm": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/uvm/-/uvm-2.0.2.tgz", - "integrity": "sha512-Ra+aPiS5GXAbwXmyNExqdS42sTqmmx4XWEDF8uJlsTfOkKf9Rd9xNgav1Yckv4HfVEZg4iOFODWHFYuJ+9Fzfg==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/uvm/-/uvm-2.1.1.tgz", + "integrity": "sha512-BZ5w8adTpNNr+zczOBRpaX/hH8UPKAf7fmCnidrcsqt3bn8KT9bDIfuS7hgRU9RXgiN01su2pwysBONY6w8W5w==", "dev": true, "dependencies": { - "flatted": "3.1.1" + "flatted": "3.2.6" }, "engines": { "node": ">=10" } }, "node_modules/uvm/node_modules/flatted": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.1.1.tgz", - "integrity": "sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA==", + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.6.tgz", + "integrity": "sha512-0sQoMh9s0BYsm+12Huy/rkKxVu4R1+r96YX5cG44rHV0pQ6iC3Q+mkoMFaGWObMFYQxCVT+ssG1ksneA2MI9KQ==", "dev": true }, "node_modules/validate-npm-package-license": { @@ -17599,10 +15133,18 @@ "spdx-expression-parse": "^3.0.0" } }, + "node_modules/validate-npm-package-name": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-5.0.1.tgz", + "integrity": "sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, "node_modules/validator": { - "version": "13.11.0", - "resolved": "https://registry.npmjs.org/validator/-/validator-13.11.0.tgz", - "integrity": "sha512-Ii+sehpSfZy+At5nPdnyMhx78fEoPDkR2XW/zimHEL3MyGJQOCQ7WeP20jPYRz7ZCpcKLB21NxuXHF3bxjStBQ==", + "version": "13.12.0", + "resolved": "https://registry.npmjs.org/validator/-/validator-13.12.0.tgz", + "integrity": "sha512-c1Q0mCiPlgdTVVVIJIrBuxNicYE+t/7oKeI9MWLj3fh/uq2Pxh/3eeWbVZ4OcGW1TUf53At0njHw5SMdA3tmMg==", "engines": { "node": ">= 0.10" } @@ -17619,6 +15161,7 @@ "version": "1.10.0", "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", + "dev": true, "engines": [ "node >=0.6.0" ], @@ -17631,31 +15174,21 @@ "node_modules/verror/node_modules/core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==" - }, - "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" - } + "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", + "dev": true }, "node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dependencies": { "isexe": "^2.0.0" }, "bin": { - "which": "bin/which" + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" } }, "node_modules/which-boxed-primitive": { @@ -17681,16 +15214,16 @@ "dev": true }, "node_modules/which-typed-array": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.14.tgz", - "integrity": "sha512-VnXFiIW8yNn9kIHN88xvZ4yOWchftKDsRJ8fEPacX/wl1lOvBrhsJ/OeJCXq7B0AaijRuqgzSKalJoPk+D8MPg==", + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", + "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", "dev": true, "dependencies": { - "available-typed-arrays": "^1.0.6", - "call-bind": "^1.0.5", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", "for-each": "^0.3.3", "gopd": "^1.0.1", - "has-tostringtag": "^1.0.1" + "has-tostringtag": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -17703,11 +15236,70 @@ "version": "1.1.5", "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", - "optional": true, "dependencies": { "string-width": "^1.0.2 || 2 || 3 || 4" } }, + "node_modules/widest-line": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-4.0.1.tgz", + "integrity": "sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==", + "dependencies": { + "string-width": "^5.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/widest-line/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==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/widest-line/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==" + }, + "node_modules/widest-line/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==", + "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/widest-line/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==", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, "node_modules/wkx": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/wkx/-/wkx-0.5.0.tgz", @@ -17717,9 +15309,9 @@ } }, "node_modules/word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", "dev": true, "engines": { "node": ">=0.10.0" @@ -17728,37 +15320,34 @@ "node_modules/wordwrap": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==" + "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", + "dev": true }, "node_modules/wordwrapjs": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-3.0.0.tgz", - "integrity": "sha512-mO8XtqyPvykVCsrwj5MlOVWvSnCdT+C+QVbm6blradR7JExAhbkZ7hZ9A+9NUtwzSqrlUo9a67ws0EiILrvRpw==", - "dependencies": { - "reduce-flatten": "^1.0.1", - "typical": "^2.6.1" - }, + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-5.1.0.tgz", + "integrity": "sha512-JNjcULU2e4KJwUNv6CHgI46UvDGitb6dGryHajXTDiLgg1/RiGoPSDw4kZfYnwGtEXf2ZMeIewDQgFGzkCB2Sg==", "engines": { - "node": ">=4.0.0" + "node": ">=12.17" } }, "node_modules/workerpool": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.0.tgz", - "integrity": "sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz", + "integrity": "sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==", "dev": true }, "node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" }, "engines": { - "node": ">=10" + "node": ">=12" }, "funding": { "url": "https://github.com/chalk/wrap-ansi?sponsor=1" @@ -17769,7 +15358,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", @@ -17782,151 +15370,61 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/wrap-ansi-cjs/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==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi-cjs/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" - }, + "node_modules/wrap-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==", "engines": { - "node": ">=8" + "node": ">=12" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/wrap-ansi-cjs/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/wrap-ansi-cjs/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/wrap-ansi-cjs/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi-cjs/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==", - "dev": true, - "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-cjs/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==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "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" + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, "node_modules/wrap-ansi/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" - }, + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", "engines": { - "node": ">=8" + "node": ">=12" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/wrap-ansi/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/wrap-ansi/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/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/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" }, "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==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" }, "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "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==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", "dependencies": { - "ansi-regex": "^5.0.1" + "ansi-regex": "^6.0.1" }, "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, "node_modules/wrappy": { @@ -17935,22 +15433,21 @@ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" }, "node_modules/write": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", - "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz", + "integrity": "sha512-CJ17OoULEKXpA5pef3qLj5AxTJ6mSt7g84he2WIskKwqFO4T97d5V7Tadl0DYDk7qyUOQD5WlUlOMChaYrhxeA==", "dev": true, "dependencies": { "mkdirp": "^0.5.1" }, "engines": { - "node": ">=4" + "node": ">=0.10.0" } }, "node_modules/write-file-atomic": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", - "dev": true, "dependencies": { "imurmurhash": "^0.1.4", "is-typedarray": "^1.0.0", @@ -17958,12 +15455,27 @@ "typedarray-to-buffer": "^3.1.5" } }, - "node_modules/x-xss-protection": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/x-xss-protection/-/x-xss-protection-1.3.0.tgz", - "integrity": "sha512-kpyBI9TlVipZO4diReZMAHWtS0MMa/7Kgx8hwG/EuZLiA6sg4Ah/4TRdASHhRRN3boobzcYgFRUFSgHRge6Qhg==", + "node_modules/write/node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/xdg-basedir": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-5.1.0.tgz", + "integrity": "sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ==", "engines": { - "node": ">=4.0.0" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/xml": { @@ -18024,14 +15536,6 @@ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, - "node_modules/yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", - "engines": { - "node": ">= 6" - } - }, "node_modules/yargs": { "version": "16.2.0", "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", @@ -18096,55 +15600,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/yargs-unparser/node_modules/is-plain-obj": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", - "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "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/yauzl": { "version": "2.10.0", "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", @@ -18159,13 +15614,40 @@ "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" } + }, + "node_modules/z-schema": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/z-schema/-/z-schema-5.0.5.tgz", + "integrity": "sha512-D7eujBWkLa3p2sIpJA0d1pr7es+a7m0vFAnZLlCEKq/Ij2k0MLi9Br2UPxoxdYystm5K1yeBGzub0FlYUEWj2Q==", + "dependencies": { + "lodash.get": "^4.4.2", + "lodash.isequal": "^4.5.0", + "validator": "^13.7.0" + }, + "bin": { + "z-schema": "bin/z-schema" + }, + "engines": { + "node": ">=8.0.0" + }, + "optionalDependencies": { + "commander": "^9.4.1" + } + }, + "node_modules/z-schema/node_modules/commander": { + "version": "9.5.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", + "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", + "optional": true, + "engines": { + "node": "^12.20.0 || >=14" + } } } } diff --git a/package.json b/package.json index 5a1d07603..1494bc4ce 100644 --- a/package.json +++ b/package.json @@ -40,7 +40,6 @@ "lint": "npm run standard", "standard": "./node_modules/.bin/standard", "snyk": "./node_modules/.bin/snyk monitor", - "semantic-release": "semantic-release", "pretest": "npm run lint", "test": "node scripts/run-test.js test", "prepostman_test": "npm run lint", @@ -58,69 +57,68 @@ }, "dependencies": { "@datasance/ecn-viewer": "0.1.5", - "axios": "1.0.0-alpha.1", - "body-parser": "^1.20.1", + "axios": "1.6.8", + "body-parser": "^1.20.2", "child_process": "1.0.2", - "command-line-args": "5.0.2", - "command-line-usage": "5.0.5", + "command-line-args": "5.2.1", + "command-line-usage": "7.0.1", "concurrent-queue": "7.0.2", - "cookie-parser": "1.4.3", + "cookie-parser": "1.4.6", "cors": "2.8.5", "daemonize2": "0.4.2", - "ejs": "3.1.7", - "express": "4.17.3", + "ejs": "3.1.10", + "express": "4.19.2", "express-session": "1.18.0", - "formidable": "1.2.1", + "formidable": "3.5.1", "ftp": "0.3.10", - "helmet": "3.21.2", + "globally": "^0.0.0", + "helmet": "7.1.0", "https": "1.0.0", "is-elevated": "3.0.0", - "js-yaml": "3.14.1", - "jsonschema": "1.2.5", - "keycloak-connect": "24.0.1" , - "minimatch": "3.1.2", - "moment": "2.29.4", - "moment-timezone": "0.5.38", - "morgan": "1.9.1", + "js-yaml": "4.1.0", + "jsonschema": "1.4.1", + "keycloak-connect": "24.0.4", + "minimatch": "9.0.4", + "moment": "2.30.1", + "moment-timezone": "0.5.45", + "morgan": "1.10.0", "multer": "1.4.5-lts.1", - "mysql2": "3.2.2", - "nconf": "0.12.0", - "os": "0.1.1", + "mysql2": "3.9.7", + "nconf": "0.12.1", + "node-fetch-npm": "^2.0.4", + "npm-check-updates": "^16.14.20", + "os": "0.1.2", "path": "0.12.7", - "pino": "6.6.1", - "pino-std-serializers": "2.5.0", + "pino": "9.1.0", + "pino-std-serializers": "7.0.0", "portscanner": "2.2.0", - "qs": "6.10.3", - "request": "2.88.0", - "request-promise": "4.2.4", - "retry-as-promised": "3.1.0", - "semantic-release": "19.0.3", - "semver": "5.6.0", - "sequelize": "6.29.0", - "sqlite3": "^5.1.5", + "qs": "6.12.1", + "retry-as-promised": "7.0.4", + "sequelize": "6.37.3", + "sqlite3": "^5.1.7", "string-format": "2.0.0", - "swagger-ui-express": "^4.6.2", - "umzug": "2.2.0", - "underscore": "1.13.1", + "swagger-ui-express": "^5.0.0", + "umzug": "3.8.0", + "underscore": "1.13.6", "xss-clean": "0.1.1" }, "devDependencies": { - "acorn": "7.1.1", - "bdd-lazy-var": "2.5.2", - "chai": "4.2.0", - "chai-as-promised": "7.1.1", - "chai-http": "4.2.1", - "eslint": "5.14.1", - "eslint-config-google": "0.12.0", - "mocha": "9.2.2", - "mocha-junit-reporter": "2.0.0", - "newman": "5.3.2", + "acorn": "8.11.3", + "bdd-lazy-var": "2.6.1", + "chai": "5.1.1", + "chai-as-promised": "7.1.2", + "chai-http": "4.4.0", + "eslint": "9.2.0", + "eslint-config-google": "0.14.0", + "mocha": "10.4.0", + "mocha-junit-reporter": "2.2.1", + "newman": "6.1.2", "newman-reporter-junitfull": "1.1.1", - "nyc": "15.0.0", - "sequelize-cli": "5.5.0", - "sinon": "7.5.0", - "sinon-chai": "3.3.0", - "snyk": "^1.1064.0", + "nyc": "15.1.0", + "sequelize-cli": "6.6.2", + "sinon": "17.0.1", + "sinon-chai": "3.7.0", + "snyk": "^1.1291.0", "standard": "12.0.1" }, "files": [ diff --git a/scripts/postinstall.js b/scripts/postinstall.js index 8acb26bec..9884ab3b2 100644 --- a/scripts/postinstall.js +++ b/scripts/postinstall.js @@ -14,7 +14,7 @@ // const sqlite3 = require('sqlite3') // .verbose() //use verbose in dev to get stack traces const execSync = require('child_process').execSync const fs = require('fs') -const semver = require('semver') +const compareVersions = require('compare-versions') const config = require('../src/config') const currentVersion = require('../package').version @@ -34,16 +34,16 @@ function postinstall () { console.log(`previous version - ${prevVersion}`) console.log(`new version - ${currentVersion}`) - if (semver.satisfies(prevVersion, '<=1.0.0')) { + if (compareVersions(prevVersion, '<=1.0.0')) { console.log('upgrading from version <= 1.0.0 :') insertSeeds() } - if (semver.satisfies(prevVersion, '<=1.0.30')) { + if (compareVersions(prevVersion, '<=1.0.30')) { console.log('upgrading from version <= 1.0.30 :') updateEncryptionMethod() } - if (semver.satisfies(prevVersion, '<=1.0.37')) { + if (compareVersions(prevVersion, '<=1.0.37')) { console.log('upgrading from version <= 1.0.37 :') updateLogName() } @@ -56,8 +56,8 @@ function postinstall () { // init db const options = { env: { - 'NODE_ENV': 'production', - 'PATH': process.env.PATH + NODE_ENV: 'production', + PATH: process.env.PATH }, stdio: [process.stdin, process.stdout, process.stderr] } @@ -184,5 +184,5 @@ function updateLogName () { } module.exports = { - postinstall: postinstall + postinstall } diff --git a/src/main.js b/src/main.js index c79b59e2d..3bbd36938 100644 --- a/src/main.js +++ b/src/main.js @@ -17,7 +17,7 @@ const Cli = require('./cli') const daemon = require('./daemon') const config = require('./config') const isElevated = require('is-elevated') -const request = require('request-promise') +const fetch = require('node-fetch-npm') const isHTTPS = () => { const sslKey = config.get('Server:SslKey', '') @@ -27,10 +27,13 @@ const isHTTPS = () => { return !devMode && sslKey && sslCert && intermedKey } -const getJSONFromURL = async (uri) => request({ - uri, - json: true -}) +const getJSONFromURL = async (uri) => { + const response = await fetch(uri) + if (!response.ok) { + throw new Error(`HTTP error! Status: ${response.status}`) + } + return response.json() +} const apiPort = +(config.get('Server:Port', 51121)) const viewerPort = +(process.env.VIEWER_PORT || config.get('Viewer:Port', 80)) From 03d1ec3474767ba87ee5e1247a37b30364f245f6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emirhan=20Durmu=C5=9F?= Date: Tue, 21 May 2024 19:01:45 +0300 Subject: [PATCH 086/178] worflow edited --- .github/workflows/ci.yaml | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index b640804d1..40e5b9509 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -23,15 +23,7 @@ env: jobs: Build: - runs-on: ubuntu-20.04 - strategy: - matrix: - platform: - - linux/amd64 - - linux/386 - - linux/arm/v6 - - linux/arm/v7 - - linux/arm64 + runs-on: ubuntu-20.04 permissions: actions: write checks: write @@ -48,10 +40,10 @@ jobs: statuses: write name: Preflight steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - uses: actions/setup-node@v3 with: - node-version: 18 + node-version: 20 - name: Replace values shell: bash env: @@ -84,10 +76,10 @@ jobs: statuses: write name: Publish Controller steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - uses: actions/setup-node@v3 with: - node-version: 18 + node-version: 20 - name: Replace values shell: bash env: @@ -132,6 +124,12 @@ jobs: VERSION=${{ steps.previoustag.outputs.tag }} echo "VERSION=${VERSION:1}-${{ github.run_number }}" >> "${GITHUB_OUTPUT}" fi + + - name: Set up QEMU + uses: docker/setup-qemu-action@v3 + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + - name: Login to Github Container Registry uses: docker/login-action@v2 @@ -145,6 +143,8 @@ jobs: id: build_push_ghcr with: file: Dockerfile.dev + context: . + platforms: linux/amd64, linux/386, linux/arm/v7, linux/arm64 push: true outputs: type=image,name=target,annotation-index.org.opencontainers.image.description=Controller build-args: GITHUB_TOKEN=${{ secrets.PAT }} From cb7ee0e7a82e00b148745eaa50e7a98cd0c74acc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emirhan=20Durmu=C5=9F?= Date: Tue, 21 May 2024 19:05:12 +0300 Subject: [PATCH 087/178] workflow updated --- .github/workflows/ci.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 40e5b9509..a8a520db2 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -51,7 +51,7 @@ jobs: run: | sed -i.back "s|PAT|${PAT}|g" .npmrc - run: npm config set @datasance:registry https://npm.pkg.github.com/ - - run: npm install + - run: npm install --build-from-source --force - run: npm run standard - run: | npm i -g better-npm-audit @@ -124,7 +124,7 @@ jobs: VERSION=${{ steps.previoustag.outputs.tag }} echo "VERSION=${VERSION:1}-${{ github.run_number }}" >> "${GITHUB_OUTPUT}" fi - + - name: Set up QEMU uses: docker/setup-qemu-action@v3 - name: Set up Docker Buildx From 3ce2f1defe75a9d824074043676528c33e9d53a9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emirhan=20Durmu=C5=9F?= Date: Tue, 21 May 2024 19:08:41 +0300 Subject: [PATCH 088/178] workflow fixed --- .github/workflows/ci.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index a8a520db2..bda3d1620 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -87,7 +87,7 @@ jobs: run: | sed -i.back "s|PAT|${PAT}|g" .npmrc - run: npm config set @datasance:registry https://npm.pkg.github.com/ - - run: npm install + - run: npm install --build-from-source --force - name: npm version id: package-version From 005ce6fe7c82e91787e076e73b3413d01042ddaa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emirhan=20Durmu=C5=9F?= Date: Tue, 21 May 2024 19:21:52 +0300 Subject: [PATCH 089/178] pacakge version updated --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 1494bc4ce..7b35f5e8b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@datasance/iofogcontroller", - "version": "3.1.0", + "version": "3.2.0-beta1", "description": "ioFog Controller project for Eclipse IoFog @ iofog.org \\nCopyright (c) 2023 Datasance Teknoloji A.S.", "main": "./src/main.js", "author": "Emirhan Durmus", From 94acf332ac8701ef1ad5c3355c3292ee7fb8ebfe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emirhan=20Durmu=C5=9F?= Date: Tue, 21 May 2024 19:29:11 +0300 Subject: [PATCH 090/178] buildx platfrom edited on workflow --- .github/workflows/ci.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index bda3d1620..5ef18d545 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -144,7 +144,7 @@ jobs: with: file: Dockerfile.dev context: . - platforms: linux/amd64, linux/386, linux/arm/v7, linux/arm64 + platforms: linux/amd64, linux/arm/v7, linux/arm64 push: true outputs: type=image,name=target,annotation-index.org.opencontainers.image.description=Controller build-args: GITHUB_TOKEN=${{ secrets.PAT }} From 821a7148ef0322828e7d3b0f58c53c8f24a8990a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emirhan=20Durmu=C5=9F?= Date: Tue, 21 May 2024 23:06:32 +0300 Subject: [PATCH 091/178] workflow multi arch platform edited --- .github/workflows/ci.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 5ef18d545..bfd1aa366 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -144,7 +144,7 @@ jobs: with: file: Dockerfile.dev context: . - platforms: linux/amd64, linux/arm/v7, linux/arm64 + platforms: linux/amd64, linux/arm64 push: true outputs: type=image,name=target,annotation-index.org.opencontainers.image.description=Controller build-args: GITHUB_TOKEN=${{ secrets.PAT }} From 89211b4f84d1d5562f84445a9cd0e18a84049e2e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emirhan=20Durmu=C5=9F?= Date: Sat, 25 May 2024 16:16:27 +0300 Subject: [PATCH 092/178] req username info inserted into logger and all keycloak protected endpoints --- package.json | 5 ++- src/logger/index.js | 3 +- src/routes/application.js | 32 ++++++++-------- src/routes/applicationTemplate.js | 32 ++++++++-------- src/routes/catalog.js | 20 +++++----- src/routes/config.js | 12 +++--- src/routes/diagnostics.js | 19 ++++----- src/routes/edgeResource.js | 32 ++++++++-------- src/routes/flow.js | 20 +++++----- src/routes/iofog.js | 44 ++++++++++----------- src/routes/microservices.js | 64 +++++++++++++++---------------- src/routes/registries.js | 12 ++++-- src/routes/router.js | 8 ++-- src/routes/routing.js | 20 +++++----- src/routes/tunnel.js | 6 ++- src/routes/user.js | 4 +- 16 files changed, 171 insertions(+), 162 deletions(-) diff --git a/package.json b/package.json index 7b35f5e8b..682e5a370 100644 --- a/package.json +++ b/package.json @@ -1,13 +1,14 @@ { "name": "@datasance/iofogcontroller", - "version": "3.2.0-beta1", + "version": "3.2.0-beta2", "description": "ioFog Controller project for Eclipse IoFog @ iofog.org \\nCopyright (c) 2023 Datasance Teknoloji A.S.", "main": "./src/main.js", "author": "Emirhan Durmus", "contributors": [ "Emirhan Durmus ", "Oguzhan Herkiloglu ", - "Burak Vural " + "Burak Vural ", + "Alpaslan Doğan " ], "license": "EPL-2.0", "bugs": { diff --git a/src/logger/index.js b/src/logger/index.js index d2a10b0dc..453f83ede 100644 --- a/src/logger/index.js +++ b/src/logger/index.js @@ -53,7 +53,8 @@ const defaultFormat = { { params: log.req.params, query: log.req.query, - body: log.req.body + body: log.req.body, + username: log.req.kauth && log.req.kauth.grant && log.req.kauth.grant.access_token && log.req.kauth.grant.access_token.content && log.req.kauth.grant.access_token.content.preferred_username } ) } diff --git a/src/routes/application.js b/src/routes/application.js index 7d6a800ad..89da63f85 100644 --- a/src/routes/application.js +++ b/src/routes/application.js @@ -37,12 +37,12 @@ module.exports = [ // Add keycloak.protect() middleware to protect the route await keycloak.protect(['SRE', 'Developer', 'Viewer'])(req, res, async () => { const responseObject = await getApplicationsByUserEndPoint(req) - + const user = req.kauth.grant.access_token.content.preferred_username res .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, res: responseObject }) + logger.apiRes({ req: req, user: user, res: responseObject }) }) } }, @@ -70,12 +70,12 @@ module.exports = [ // Add keycloak.protect() middleware to protect the route await keycloak.protect(['SRE', 'Developer'])(req, res, async () => { const responseObject = await createApplicationEndPoint(req) - + const user = req.kauth.grant.access_token.content.preferred_username res .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, res: responseObject }) + logger.apiRes({ req: req, user: user, res: responseObject }) }) } }, @@ -103,12 +103,12 @@ module.exports = [ // Add keycloak.protect() middleware to protect the route await keycloak.protect(['SRE', 'Developer'])(req, res, async () => { const responseObject = await createApplicationEndPoint(req) - + const user = req.kauth.grant.access_token.content.preferred_username res .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, res: responseObject }) + logger.apiRes({ req: req, user: user, res: responseObject }) }) } }, @@ -135,12 +135,12 @@ module.exports = [ // Add keycloak.protect() middleware to protect the route await keycloak.protect(['SRE', 'Developer', 'Viewer'])(req, res, async () => { const responseObject = await getApplicationEndPoint(req) - + const user = req.kauth.grant.access_token.content.preferred_username res .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, res: responseObject }) + logger.apiRes({ req: req, user: user, res: responseObject }) return null }) } @@ -173,12 +173,12 @@ module.exports = [ // Add keycloak.protect() middleware to protect the route await keycloak.protect(['SRE', 'Developer'])(req, res, async () => { const responseObject = await updateApplicationEndPoint(req) - + const user = req.kauth.grant.access_token.content.preferred_username res .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, res: responseObject }) + logger.apiRes({ req: req, user: user, res: responseObject }) }) } }, @@ -210,12 +210,12 @@ module.exports = [ // Add keycloak.protect() middleware to protect the route await keycloak.protect(['SRE', 'Developer'])(req, res, async () => { const responseObject = await updateApplicationEndPoint(req) - + const user = req.kauth.grant.access_token.content.preferred_username res .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, res: responseObject }) + logger.apiRes({ req: req, user: user, res: responseObject }) }) } }, @@ -247,12 +247,12 @@ module.exports = [ // Add keycloak.protect() middleware to protect the route await keycloak.protect(['SRE', 'Developer'])(req, res, async () => { const responseObject = await updateApplicationEndPoint(req) - + const user = req.kauth.grant.access_token.content.preferred_username res .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, res: responseObject }) + logger.apiRes({ req: req, user: user, res: responseObject }) }) } }, @@ -279,12 +279,12 @@ module.exports = [ // Add keycloak.protect() middleware to protect the route await keycloak.protect(['SRE', 'Developer'])(req, res, async () => { const responseObject = await deleteApplicationEndPoint(req) - + const user = req.kauth.grant.access_token.content.preferred_username res .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, res: responseObject }) + logger.apiRes({ req: req, user: user, res: responseObject }) }) } } diff --git a/src/routes/applicationTemplate.js b/src/routes/applicationTemplate.js index 830b9074a..59cad674a 100644 --- a/src/routes/applicationTemplate.js +++ b/src/routes/applicationTemplate.js @@ -37,12 +37,12 @@ module.exports = [ // Add keycloak.protect() middleware to protect the route await keycloak.protect(['SRE', 'Developer', 'Viewer'])(req, res, async () => { const responseObject = await getApplicationTemplatesByUserEndPoint(req) - + const user = req.kauth.grant.access_token.content.preferred_username res .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, res: responseObject }) + logger.apiRes({ req: req, user: user, res: responseObject }) }) } }, @@ -69,12 +69,12 @@ module.exports = [ // Add keycloak.protect() middleware to protect the route await keycloak.protect(['SRE', 'Developer'])(req, res, async () => { const responseObject = await createApplicationTemplateEndPoint(req) - + const user = req.kauth.grant.access_token.content.preferred_username res .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, res: responseObject }) + logger.apiRes({ req: req, user: user, res: responseObject }) }) } }, @@ -102,12 +102,12 @@ module.exports = [ // Add keycloak.protect() middleware to protect the route await keycloak.protect(['SRE', 'Developer'])(req, res, async () => { const responseObject = await createApplicationTemplateEndPoint(req) - + const user = req.kauth.grant.access_token.content.preferred_username res .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, res: responseObject }) + logger.apiRes({ req: req, user: user, res: responseObject }) }) } }, @@ -134,12 +134,12 @@ module.exports = [ // Add keycloak.protect() middleware to protect the route await keycloak.protect(['SRE', 'Developer', 'Viewer'])(req, res, async () => { const responseObject = await getApplicationTemplateEndPoint(req) - + const user = req.kauth.grant.access_token.content.preferred_username res .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, res: responseObject }) + logger.apiRes({ req: req, user: user, res: responseObject }) }) } }, @@ -170,12 +170,12 @@ module.exports = [ // Add keycloak.protect() middleware to protect the route await keycloak.protect(['SRE', 'Developer'])(req, res, async () => { const responseObject = await patchApplicationTemplateEndPoint(req) - + const user = req.kauth.grant.access_token.content.preferred_username res .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, res: responseObject }) + logger.apiRes({ req: req, user: user, res: responseObject }) }) } }, @@ -207,12 +207,12 @@ module.exports = [ // Add keycloak.protect() middleware to protect the route await keycloak.protect(['SRE', 'Developer'])(req, res, async () => { const responseObject = await updateApplicationTemplateEndPoint(req) - + const user = req.kauth.grant.access_token.content.preferred_username res .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, res: responseObject }) + logger.apiRes({ req: req, user: user, res: responseObject }) }) } }, @@ -243,12 +243,12 @@ module.exports = [ // Add keycloak.protect() middleware to protect the route await keycloak.protect(['SRE', 'Developer'])(req, res, async () => { const responseObject = await updateApplicationTemplateEndPoint(req) - + const user = req.kauth.grant.access_token.content.preferred_username res .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, res: responseObject }) + logger.apiRes({ req: req, user: user, res: responseObject }) }) } }, @@ -275,12 +275,12 @@ module.exports = [ // Add keycloak.protect() middleware to protect the route await keycloak.protect(['SRE', 'Developer'])(req, res, async () => { const responseObject = await deleteApplicationTemplateEndPoint(req) - + const user = req.kauth.grant.access_token.content.preferred_username res .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, res: responseObject }) + logger.apiRes({ req: req, user: user, res: responseObject }) }) } } diff --git a/src/routes/catalog.js b/src/routes/catalog.js index ce39b0329..3bad359a2 100644 --- a/src/routes/catalog.js +++ b/src/routes/catalog.js @@ -41,12 +41,12 @@ module.exports = [ // Add keycloak.protect() middleware to protect the route await keycloak.protect(['SRE', 'Developer', 'Viewer'])(req, res, async () => { const responseObject = await listCatalogItemsEndPoint(req) - + const user = req.kauth.grant.access_token.content.preferred_username res .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, res: responseObject }) + logger.apiRes({ req: req, user: user, res: responseObject }) }) } }, @@ -82,12 +82,12 @@ module.exports = [ // Add keycloak.protect() middleware to protect the route await keycloak.protect(['SRE', 'Developer'])(req, res, async () => { const responseObject = await createCatalogItemEndpoint(req) - + const user = req.kauth.grant.access_token.content.preferred_username res .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req, res: responseObject }) + logger.apiRes({ req, user: user, res: responseObject }) }) } }, @@ -118,12 +118,12 @@ module.exports = [ // Add keycloak.protect() middleware to protect the route await keycloak.protect(['SRE', 'Developer', 'Viewer'])(req, res, async () => { const responseObject = await listCatalogItemEndPoint(req) - + const user = req.kauth.grant.access_token.content.preferred_username res .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req, res: responseObject }) + logger.apiRes({ req, user: user, res: responseObject }) }) } }, @@ -163,12 +163,12 @@ module.exports = [ // Add keycloak.protect() middleware to protect the route for SRE and Developer await keycloak.protect(['SRE', 'Developer'])(req, res, async () => { const responseObject = await updateCatalogItemEndpoint(req) - + const user = req.kauth.grant.access_token.content.preferred_username res .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req, res: responseObject }) + logger.apiRes({ req, user: user, res: responseObject }) }) } }, @@ -199,12 +199,12 @@ module.exports = [ // Add keycloak.protect() middleware to protect the route await keycloak.protect(['SRE', 'Developer'])(req, res, async () => { const responseObject = await deleteCatalogItemEndPoint(req) - + const user = req.kauth.grant.access_token.content.preferred_username res .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req, res: responseObject }) + logger.apiRes({ req, user: user, res: responseObject }) }) } } diff --git a/src/routes/config.js b/src/routes/config.js index b0a249d60..b4e2f208b 100644 --- a/src/routes/config.js +++ b/src/routes/config.js @@ -36,12 +36,12 @@ module.exports = [ await keycloak.protect(['SRE', 'Developer', 'Viewer'])(req, res, async () => { const getConfigEndpoint = ResponseDecorator.handleErrors(ConfigController.listConfigEndpoint, successCode, errorCodes) const responseObject = await getConfigEndpoint(req) - + const user = req.kauth.grant.access_token.content.preferred_username res .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, res: responseObject }) + logger.apiRes({ req: req, user: user, res: responseObject }) }) } }, @@ -67,12 +67,12 @@ module.exports = [ await keycloak.protect(['SRE', 'Developer', 'Viewer'])(req, res, async () => { const getConfigEndpoint = ResponseDecorator.handleErrors(ConfigController.getConfigEndpoint, successCode, errorCodes) const responseObject = await getConfigEndpoint(req) - + const user = req.kauth.grant.access_token.content.preferred_username res .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, res: responseObject }) + logger.apiRes({ req: req, user: user, res: responseObject }) }) } }, @@ -99,12 +99,12 @@ module.exports = [ await keycloak.protect(['SRE', 'Developer'])(req, res, async () => { const upsertConfigElementEndpoint = ResponseDecorator.handleErrors(ConfigController.upsertConfigElementEndpoint, successCode, errorCodes) const responseObject = await upsertConfigElementEndpoint(req) - + const user = req.kauth.grant.access_token.content.preferred_username res .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, res: responseObject }) + logger.apiRes({ req: req, user: user, res: responseObject }) }) } } diff --git a/src/routes/diagnostics.js b/src/routes/diagnostics.js index 8dab3ffaf..671000f51 100644 --- a/src/routes/diagnostics.js +++ b/src/routes/diagnostics.js @@ -45,12 +45,12 @@ module.exports = [ errorCodes ) const responseObject = await createMicroserviceImageSnapshotEndPoint(req) - + const user = req.kauth.grant.access_token.content.preferred_username res .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, res: responseObject }) + logger.apiRes({ req: req, user: user, res: responseObject }) }) } }, @@ -80,12 +80,13 @@ module.exports = [ errorCodes ) const responseObject = await getMicroserviceImageSnapshotEndPoint(req) + const user = req.kauth.grant.access_token.content.preferred_username if (responseObject.code !== successCode) { res .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, res: responseObject }) + logger.apiRes({ req: req, user: user, res: responseObject }) } else { res.writeHead(successCode, { 'Content-Length': responseObject.body['Content-Length'], @@ -127,12 +128,12 @@ module.exports = [ errorCodes ) const responseObject = await changeMicroserviceStraceStateEndPoint(req) - + const user = req.kauth.grant.access_token.content.preferred_username res .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, res: responseObject }) + logger.apiRes({ req: req, user: user, res: responseObject }) }) } }, @@ -162,12 +163,12 @@ module.exports = [ errorCodes ) const responseObject = await getMicroserviceStraceDataEndPoint(req) - + const user = req.kauth.grant.access_token.content.preferred_username res .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, res: responseObject }) + logger.apiRes({ req: req, user: user, res: responseObject }) }) } }, @@ -205,12 +206,12 @@ module.exports = [ errorCodes ) const responseObject = await postMicroserviceStraceDataToFtpEndPoint(req) - + const user = req.kauth.grant.access_token.content.preferred_username res .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, res: responseObject }) + logger.apiRes({ req: req, user: user, res: responseObject }) }) } } diff --git a/src/routes/edgeResource.js b/src/routes/edgeResource.js index ebdc65cbf..b6607e243 100644 --- a/src/routes/edgeResource.js +++ b/src/routes/edgeResource.js @@ -36,12 +36,12 @@ module.exports = [ await keycloak.protect(['SRE', 'Developer', 'Viewer'])(req, res, async () => { const getEdgeResourcesEndpoint = ResponseDecorator.handleErrors(EdgeResourceController.listEdgeResourcesEndpoint, successCode, errorCodes) const responseObject = await getEdgeResourcesEndpoint(req) - + const user = req.kauth.grant.access_token.content.preferred_username res .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, res: responseObject }) + logger.apiRes({ req: req, user: user, res: responseObject }) }) } }, @@ -67,12 +67,12 @@ module.exports = [ await keycloak.protect(['SRE', 'Developer', 'Viewer'])(req, res, async () => { const getEdgeResourceEndpoint = ResponseDecorator.handleErrors(EdgeResourceController.getEdgeResourceEndpoint, successCode, errorCodes) const responseObject = await getEdgeResourceEndpoint(req) - + const user = req.kauth.grant.access_token.content.preferred_username res .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, res: responseObject }) + logger.apiRes({ req: req, user: user, res: responseObject }) }) } }, @@ -98,12 +98,12 @@ module.exports = [ await keycloak.protect(['SRE', 'Developer', 'Viewer'])(req, res, async () => { const getEdgeResourceAllVersionsEndpoint = ResponseDecorator.handleErrors(EdgeResourceController.getEdgeResourceAllVersionsEndpoint, successCode, errorCodes) const responseObject = await getEdgeResourceAllVersionsEndpoint(req) - + const user = req.kauth.grant.access_token.content.preferred_username res .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, res: responseObject }) + logger.apiRes({ req: req, user: user, res: responseObject }) }) } }, @@ -134,12 +134,12 @@ module.exports = [ await keycloak.protect(['SRE'])(req, res, async () => { const updateEdgeResourceEndpoint = ResponseDecorator.handleErrors(EdgeResourceController.updateEdgeResourceEndpoint, successCode, errorCodes) const responseObject = await updateEdgeResourceEndpoint(req) - + const user = req.kauth.grant.access_token.content.preferred_username res .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, res: responseObject }) + logger.apiRes({ req: req, user: user, res: responseObject }) }) } }, @@ -169,12 +169,12 @@ module.exports = [ await keycloak.protect(['SRE'])(req, res, async () => { const deleteEdgeResourceEndpoint = ResponseDecorator.handleErrors(EdgeResourceController.deleteEdgeResourceEndpoint, successCode, errorCodes) const responseObject = await deleteEdgeResourceEndpoint(req) - + const user = req.kauth.grant.access_token.content.preferred_username res .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, res: responseObject }) + logger.apiRes({ req: req, user: user, res: responseObject }) }) } }, @@ -201,12 +201,12 @@ module.exports = [ await keycloak.protect(['SRE'])(req, res, async () => { const createEdgeResourceEndpoint = ResponseDecorator.handleErrors(EdgeResourceController.createEdgeResourceEndpoint, successCode, errorCodes) const responseObject = await createEdgeResourceEndpoint(req) - + const user = req.kauth.grant.access_token.content.preferred_username res .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, res: responseObject }) + logger.apiRes({ req: req, user: user, res: responseObject }) }) } }, @@ -232,12 +232,12 @@ module.exports = [ await keycloak.protect(['SRE'])(req, res, async () => { const linkEdgeResourceEndpoint = ResponseDecorator.handleErrors(EdgeResourceController.linkEdgeResourceEndpoint, successCode, errorCodes) const responseObject = await linkEdgeResourceEndpoint(req) - + const user = req.kauth.grant.access_token.content.preferred_username res .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, res: responseObject }) + logger.apiRes({ req: req, user: user, res: responseObject }) }) } }, @@ -263,12 +263,12 @@ module.exports = [ await keycloak.protect(['SRE'])(req, res, async () => { const unlinkEdgeResourceEndpoint = ResponseDecorator.handleErrors(EdgeResourceController.unlinkEdgeResourceEndpoint, successCode, errorCodes) const responseObject = await unlinkEdgeResourceEndpoint(req) - + const user = req.kauth.grant.access_token.content.preferred_username res .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, res: responseObject }) + logger.apiRes({ req: req, user: user, res: responseObject }) }) } } diff --git a/src/routes/flow.js b/src/routes/flow.js index 928cec737..e955df130 100644 --- a/src/routes/flow.js +++ b/src/routes/flow.js @@ -36,12 +36,12 @@ module.exports = [ await keycloak.protect(['SRE', 'Developer', 'Viewer'])(req, res, async () => { const getFlowsByUserEndPoint = ResponseDecorator.handleErrors(FlowController.getApplicationsByUserEndPoint, successCode, errorCodes) const responseObject = await getFlowsByUserEndPoint(req) - + const user = req.kauth.grant.access_token.content.preferred_username res .status(responseObject.code) .send({ flows: responseObject.body.applications }) - logger.apiRes({ req: req, res: responseObject }) + logger.apiRes({ req: req, user: user, res: responseObject }) }) } }, @@ -67,12 +67,12 @@ module.exports = [ await keycloak.protect(['SRE', 'Developer'])(req, res, async () => { const createFlowEndPoint = ResponseDecorator.handleErrors(FlowController.createApplicationEndPoint, successCode, errorCodes) const responseObject = await createFlowEndPoint(req) - + const user = req.kauth.grant.access_token.content.preferred_username res .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, res: responseObject }) + logger.apiRes({ req: req, user: user, res: responseObject }) }) } }, @@ -98,12 +98,12 @@ module.exports = [ await keycloak.protect(['SRE', 'Developer', 'Viewer'])(req, res, async () => { const getFlowEndPoint = ResponseDecorator.handleErrors(FlowController.getApplicationByIdEndPoint, successCode, errorCodes) const responseObject = await getFlowEndPoint(req) - + const user = req.kauth.grant.access_token.content.preferred_username res .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, res: responseObject }) + logger.apiRes({ req: req, user: user, res: responseObject }) }) } }, @@ -133,12 +133,12 @@ module.exports = [ await keycloak.protect(['SRE', 'Developer'])(req, res, async () => { const updateFlowEndPoint = ResponseDecorator.handleErrors(FlowController.patchApplicationByIdEndPoint, successCode, errorCodes) const responseObject = await updateFlowEndPoint(req) - + const user = req.kauth.grant.access_token.content.preferred_username res .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, res: responseObject }) + logger.apiRes({ req: req, user: user, res: responseObject }) }) } }, @@ -164,12 +164,12 @@ module.exports = [ await keycloak.protect(['SRE', 'Developer'])(req, res, async () => { const deleteFlowEndPoint = ResponseDecorator.handleErrors(FlowController.deleteApplicationByIdEndPoint, successCode, errorCodes) const responseObject = await deleteFlowEndPoint(req) - + const user = req.kauth.grant.access_token.content.preferred_username res .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, res: responseObject }) + logger.apiRes({ req: req, user: user, res: responseObject }) }) } } diff --git a/src/routes/iofog.js b/src/routes/iofog.js index 3271101d3..9431cc4b6 100644 --- a/src/routes/iofog.js +++ b/src/routes/iofog.js @@ -40,12 +40,12 @@ module.exports = [ await keycloak.protect(['SRE', 'Developer', 'Viewer'])(req, res, async () => { const getFogList = ResponseDecorator.handleErrors(FogController.getFogListEndPoint, successCode, errCodes) const responseObject = await getFogList(req) - + const user = req.kauth.grant.access_token.content.preferred_username res .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, res: responseObject }) + logger.apiRes({ req: req, user: user, res: responseObject }) }) } }, @@ -72,12 +72,12 @@ module.exports = [ await keycloak.protect('SRE')(req, res, async () => { const createFog = ResponseDecorator.handleErrors(FogController.createFogEndPoint, successCode, errCodes) const responseObject = await createFog(req) - + const user = req.kauth.grant.access_token.content.preferred_username res .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, res: responseObject }) + logger.apiRes({ req: req, user: user, res: responseObject }) }) } }, @@ -108,12 +108,12 @@ module.exports = [ await keycloak.protect('SRE')(req, res, async () => { const updateFog = ResponseDecorator.handleErrors(FogController.updateFogEndPoint, successCode, errCodes) const responseObject = await updateFog(req) - + const user = req.kauth.grant.access_token.content.preferred_username res .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, res: responseObject }) + logger.apiRes({ req: req, user: user, res: responseObject }) }) } }, @@ -139,12 +139,12 @@ module.exports = [ await keycloak.protect('SRE')(req, res, async () => { const deleteFog = ResponseDecorator.handleErrors(FogController.deleteFogEndPoint, successCode, errCodes) const responseObject = await deleteFog(req) - + const user = req.kauth.grant.access_token.content.preferred_username res .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, res: responseObject }) + logger.apiRes({ req: req, user: user, res: responseObject }) }) } }, @@ -170,12 +170,12 @@ module.exports = [ await keycloak.protect(['SRE', 'Developer', 'Viewer'])(req, res, async () => { const getFog = ResponseDecorator.handleErrors(FogController.getFogEndPoint, successCode, errCodes) const responseObject = await getFog(req) - + const user = req.kauth.grant.access_token.content.preferred_username res .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, res: responseObject }) + logger.apiRes({ req: req, user: user, res: responseObject }) }) } }, @@ -201,12 +201,12 @@ module.exports = [ const generateFogProvisioningKey = ResponseDecorator.handleErrors(FogController.generateProvisioningKeyEndPoint, successCode, errCodes) const responseObject = await generateFogProvisioningKey(req) - + const user = req.kauth.grant.access_token.content.preferred_username res .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, res: responseObject }) + logger.apiRes({ req: req, user: user, res: responseObject }) }) } }, @@ -236,12 +236,12 @@ module.exports = [ const setFogVersionCommand = ResponseDecorator.handleErrors(FogController.setFogVersionCommandEndPoint, successCode, errCodes) const responseObject = await setFogVersionCommand(req) - + const user = req.kauth.grant.access_token.content.preferred_username res .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, res: responseObject }) + logger.apiRes({ req: req, user: user, res: responseObject }) }) } }, @@ -271,12 +271,12 @@ module.exports = [ const setFogRebootCommand = ResponseDecorator.handleErrors(FogController.setFogRebootCommandEndPoint, successCode, errCodes) const responseObject = await setFogRebootCommand(req) - + const user = req.kauth.grant.access_token.content.preferred_username res .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, res: responseObject }) + logger.apiRes({ req: req, user: user, res: responseObject }) }) } }, @@ -302,12 +302,12 @@ module.exports = [ const getHalHardwareInfo = ResponseDecorator.handleErrors(FogController.getHalHardwareInfoEndPoint, successCode, errCodes) const responseObject = await getHalHardwareInfo(req) - + const user = req.kauth.grant.access_token.content.preferred_username res .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, res: responseObject }) + logger.apiRes({ req: req, user: user, res: responseObject }) }) } }, @@ -332,12 +332,12 @@ module.exports = [ await keycloak.protect(['SRE', 'Developer', 'Viewer'])(req, res, async () => { const getHalUsbInfo = ResponseDecorator.handleErrors(FogController.getHalUsbInfoEndPoint, successCode, errCodes) const responseObject = await getHalUsbInfo(req) - + const user = req.kauth.grant.access_token.content.preferred_username res .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, res: responseObject }) + logger.apiRes({ req: req, user: user, res: responseObject }) }) } }, @@ -367,12 +367,12 @@ module.exports = [ const setFogPruneCommand = ResponseDecorator.handleErrors(FogController.setFogPruneCommandEndPoint, successCode, errCodes) const responseObject = await setFogPruneCommand(req) - + const user = req.kauth.grant.access_token.content.preferred_username res .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, res: responseObject }) + logger.apiRes({ req: req, user: user, res: responseObject }) }) } } diff --git a/src/routes/microservices.js b/src/routes/microservices.js index 8a15a7438..0afc010fb 100644 --- a/src/routes/microservices.js +++ b/src/routes/microservices.js @@ -39,12 +39,12 @@ module.exports = [ errorCodes ) const responseObject = await listAllPublicPortsEndPoint(req) - + const user = req.kauth.grant.access_token.content.preferred_username res .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, res: responseObject }) + logger.apiRes({ req: req, user: user, res: responseObject }) }) } }, @@ -66,12 +66,12 @@ module.exports = [ const getMicroservicesByApplicationEndPoint = ResponseDecorator.handleErrors(MicroservicesController.getMicroservicesByApplicationEndPoint, successCode, errorCodes) const responseObject = await getMicroservicesByApplicationEndPoint(req) - + const user = req.kauth.grant.access_token.content.preferred_username res .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, res: responseObject }) + logger.apiRes({ req: req, user: user, res: responseObject }) }) } }, @@ -98,12 +98,12 @@ module.exports = [ const createMicroservicesOnFogEndPoint = ResponseDecorator.handleErrors( MicroservicesController.createMicroserviceOnFogEndPoint, successCode, errorCodes) const responseObject = await createMicroservicesOnFogEndPoint(req) - + const user = req.kauth.grant.access_token.content.preferred_username res .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, res: responseObject }) + logger.apiRes({ req: req, user: user, res: responseObject }) }) } }, @@ -131,12 +131,12 @@ module.exports = [ const createMicroservicesYAMLEndPoint = ResponseDecorator.handleErrors( MicroservicesController.createMicroserviceYAMLEndPoint, successCode, errorCodes) const responseObject = await createMicroservicesYAMLEndPoint(req) - + const user = req.kauth.grant.access_token.content.preferred_username res .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, res: responseObject }) + logger.apiRes({ req: req, user: user, res: responseObject }) }) } }, @@ -162,12 +162,12 @@ module.exports = [ const getMicroserviceEndPoint = ResponseDecorator.handleErrors(MicroservicesController.getMicroserviceEndPoint, successCode, errorCodes) const responseObject = await getMicroserviceEndPoint(req) - + const user = req.kauth.grant.access_token.content.preferred_username res .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, res: responseObject }) + logger.apiRes({ req: req, user: user, res: responseObject }) }) } }, @@ -198,12 +198,12 @@ module.exports = [ const updateMicroserviceEndPoint = ResponseDecorator.handleErrors(MicroservicesController.updateMicroserviceEndPoint, successCode, errorCodes) const responseObject = await updateMicroserviceEndPoint(req) - + const user = req.kauth.grant.access_token.content.preferred_username res .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, res: responseObject }) + logger.apiRes({ req: req, user: user, res: responseObject }) }) } }, @@ -236,12 +236,12 @@ module.exports = [ const updateMicroserviceYAMLEndPoint = ResponseDecorator.handleErrors(MicroservicesController.updateMicroserviceYAMLEndPoint, successCode, errorCodes) const responseObject = await updateMicroserviceYAMLEndPoint(req) - + const user = req.kauth.grant.access_token.content.preferred_username res .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, res: responseObject }) + logger.apiRes({ req: req, user: user, res: responseObject }) }) } }, @@ -267,12 +267,12 @@ module.exports = [ const deleteMicroserviceEndPoint = ResponseDecorator.handleErrors(MicroservicesController.deleteMicroserviceEndPoint, successCode, errorCodes) const responseObject = await deleteMicroserviceEndPoint(req) - + const user = req.kauth.grant.access_token.content.preferred_username res .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, res: responseObject }) + logger.apiRes({ req: req, user: user, res: responseObject }) }) } }, @@ -302,12 +302,12 @@ module.exports = [ const createMicroserviceRouteEndPoint = ResponseDecorator.handleErrors( MicroservicesController.createMicroserviceRouteEndPoint, successCode, errorCodes) const responseObject = await createMicroserviceRouteEndPoint(req) - + const user = req.kauth.grant.access_token.content.preferred_username res .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, res: responseObject }) + logger.apiRes({ req: req, user: user, res: responseObject }) }) } }, @@ -337,12 +337,12 @@ module.exports = [ const deleteMicroserviceRouteEndPoint = ResponseDecorator.handleErrors( MicroservicesController.deleteMicroserviceRouteEndPoint, successCode, errorCodes) const responseObject = await deleteMicroserviceRouteEndPoint(req) - + const user = req.kauth.grant.access_token.content.preferred_username res .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, res: responseObject }) + logger.apiRes({ req: req, user: user, res: responseObject }) }) } }, @@ -372,12 +372,12 @@ module.exports = [ const createMicroservicePortMappingEndPoint = ResponseDecorator.handleErrors( MicroservicesController.createMicroservicePortMappingEndPoint, successCode, errorCodes) const responseObject = await createMicroservicePortMappingEndPoint(req) - + const user = req.kauth.grant.access_token.content.preferred_username res .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, res: responseObject }) + logger.apiRes({ req: req, user: user, res: responseObject }) }) } }, @@ -403,12 +403,12 @@ module.exports = [ const deleteMicroservicePortMapping = ResponseDecorator.handleErrors( MicroservicesController.deleteMicroservicePortMappingEndPoint, successCode, errorCodes) const responseObject = await deleteMicroservicePortMapping(req) - + const user = req.kauth.grant.access_token.content.preferred_username res .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, res: responseObject }) + logger.apiRes({ req: req, user: user, res: responseObject }) }) } }, @@ -434,12 +434,12 @@ module.exports = [ const getMicroservicePortMapping = ResponseDecorator.handleErrors( MicroservicesController.getMicroservicePortMappingListEndPoint, successCode, errorCodes) const responseObject = await getMicroservicePortMapping(req) - + const user = req.kauth.grant.access_token.content.preferred_username res .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, res: responseObject }) + logger.apiRes({ req: req, user: user, res: responseObject }) }) } }, @@ -468,12 +468,12 @@ module.exports = [ errorCodes ) const responseObject = await listMicroserviceVolumeMappingEndPoint(req) - + const user = req.kauth.grant.access_token.content.preferred_username res .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, res: responseObject }) + logger.apiRes({ req: req, user: user, res: responseObject }) }) } }, @@ -506,12 +506,12 @@ module.exports = [ errorCodes ) const responseObject = await createMicroserviceVolumeMappingEndPoint(req) - + const user = req.kauth.grant.access_token.content.preferred_username res .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, res: responseObject }) + logger.apiRes({ req: req, user: user, res: responseObject }) }) } }, @@ -544,12 +544,12 @@ module.exports = [ errorCodes ) const responseObject = await deleteMicroserviceVolumeMappingEndPoint(req) - + const user = req.kauth.grant.access_token.content.preferred_username res .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, res: responseObject }) + logger.apiRes({ req: req, user: user, res: responseObject }) }) } } diff --git a/src/routes/registries.js b/src/routes/registries.js index e1369082c..f64b90827 100644 --- a/src/routes/registries.js +++ b/src/routes/registries.js @@ -40,11 +40,12 @@ module.exports = [ await keycloak.protect(['SRE', 'Developer'])(req, res, async () => { const registriesEndPoint = ResponseDecorator.handleErrors(RegistryController.createRegistryEndPoint, successCode, errorCodes) const responseObject = await registriesEndPoint(req) + const user = req.kauth.grant.access_token.content.preferred_username res .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, res: responseObject }) + logger.apiRes({ req: req, user: user, res: responseObject }) }) } }, @@ -69,11 +70,12 @@ module.exports = [ await keycloak.protect(['SRE', 'Developer', 'Viewer'])(req, res, async () => { const registriesEndPoint = ResponseDecorator.handleErrors(RegistryController.getRegistriesEndPoint, successCode, errorCodes) const responseObject = await registriesEndPoint(req) + const user = req.kauth.grant.access_token.content.preferred_username res .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, res: responseObject }) + logger.apiRes({ req: req, user: user, res: responseObject }) }) } }, @@ -102,11 +104,12 @@ module.exports = [ await keycloak.protect('SRE', 'Developer')(req, res, async () => { const registriesEndPoint = ResponseDecorator.handleErrors(RegistryController.deleteRegistryEndPoint, successCode, errorCodes) const responseObject = await registriesEndPoint(req) + const user = req.kauth.grant.access_token.content.preferred_username res .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, res: responseObject }) + logger.apiRes({ req: req, user: user, res: responseObject }) }) } }, @@ -137,11 +140,12 @@ module.exports = [ await keycloak.protect(['SRE', 'Developer'])(req, res, async () => { const updateRegistryEndPoint = ResponseDecorator.handleErrors(RegistryController.updateRegistryEndPoint, successCode, errorCodes) const responseObject = await updateRegistryEndPoint(req) + const user = req.kauth.grant.access_token.content.preferred_username res .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, res: responseObject }) + logger.apiRes({ req: req, user: user, res: responseObject }) }) } } diff --git a/src/routes/router.js b/src/routes/router.js index 88d42e43d..91b2526a8 100644 --- a/src/routes/router.js +++ b/src/routes/router.js @@ -44,12 +44,12 @@ module.exports = [ errorCodes ) const responseObject = await getRouterEndpoint(req) - + const user = req.kauth.grant.access_token.content.preferred_username res .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, res: responseObject }) + logger.apiRes({ req: req, user: user, res: responseObject }) }) } }, @@ -80,12 +80,12 @@ module.exports = [ errorCodes ) const responseObject = await upsertDefaultRouter(req) - + const user = req.kauth.grant.access_token.content.preferred_username res .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, res: responseObject }) + logger.apiRes({ req: req, user: user, res: responseObject }) }) } } diff --git a/src/routes/routing.js b/src/routes/routing.js index a850e685b..b4ef4cba6 100644 --- a/src/routes/routing.js +++ b/src/routes/routing.js @@ -44,12 +44,12 @@ module.exports = [ errorCodes ) const responseObject = await getRouterEndpoint(req) - + const user = req.kauth.grant.access_token.content.preferred_username res .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, res: responseObject }) + logger.apiRes({ req: req, user: user, res: responseObject }) }) } }, @@ -79,12 +79,12 @@ module.exports = [ errorCodes ) const responseObject = await getRouterEndpoint(req) - + const user = req.kauth.grant.access_token.content.preferred_username res .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, res: responseObject }) + logger.apiRes({ req: req, user: user, res: responseObject }) }) } }, @@ -123,12 +123,12 @@ module.exports = [ errorCodes ) const responseObject = await createRoutingEndpoint(req) - + const user = req.kauth.grant.access_token.content.preferred_username res .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, res: responseObject }) + logger.apiRes({ req: req, user: user, res: responseObject }) }) } }, @@ -163,12 +163,12 @@ module.exports = [ errorCodes ) const responseObject = await updateRoutingEndpoint(req) - + const user = req.kauth.grant.access_token.content.preferred_username res .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, res: responseObject }) + logger.apiRes({ req: req, user: user, res: responseObject }) }) } }, @@ -198,12 +198,12 @@ module.exports = [ errorCodes ) const responseObject = await deleteRoutingEndpoint(req) - + const user = req.kauth.grant.access_token.content.preferred_username res .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, res: responseObject }) + logger.apiRes({ req: req, user: user, res: responseObject }) }) } } diff --git a/src/routes/tunnel.js b/src/routes/tunnel.js index 823e630f8..3a3961ebf 100644 --- a/src/routes/tunnel.js +++ b/src/routes/tunnel.js @@ -48,11 +48,12 @@ module.exports = [ errorCodes ) const responseObject = await tunnelEndPoint(req) + const user = req.kauth.grant.access_token.content.preferred_username res .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, res: responseObject }) + logger.apiRes({ req: req, user: user, res: responseObject }) }) } }, @@ -82,11 +83,12 @@ module.exports = [ errorCodes ) const responseObject = await tunnelEndPoint(req) + const user = req.kauth.grant.access_token.content.preferred_username res .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, res: responseObject }) + logger.apiRes({ req: req, user: user, res: responseObject }) }) } } diff --git a/src/routes/user.js b/src/routes/user.js index 39d9dab86..6be5f155e 100644 --- a/src/routes/user.js +++ b/src/routes/user.js @@ -66,12 +66,12 @@ module.exports = [ errorCodes ) const responseObject = await getUserProfileEndPoint(req) - + const user = req.kauth.grant.access_token.content.preferred_username res .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, res: responseObject }) + logger.apiRes({ req: req, user: user, res: responseObject }) } }, { From a298a7e18f94974e43ff5030610768f3cabb5c59 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emirhan=20Durmu=C5=9F?= Date: Mon, 27 May 2024 19:51:19 +0300 Subject: [PATCH 093/178] cli config dev-mode fixed and package version updated for release --- package.json | 2 +- src/cli/config.js | 14 ++++++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index 682e5a370..e22ae6007 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@datasance/iofogcontroller", - "version": "3.2.0-beta2", + "version": "3.2.0", "description": "ioFog Controller project for Eclipse IoFog @ iofog.org \\nCopyright (c) 2023 Datasance Teknoloji A.S.", "main": "./src/main.js", "author": "Emirhan Durmus", diff --git a/src/cli/config.js b/src/cli/config.js index 748acf367..3c5af3cd9 100644 --- a/src/cli/config.js +++ b/src/cli/config.js @@ -79,6 +79,20 @@ class Config extends BaseCLIHandler { type: CliDataTypes.Integer, description: 'Log files count', group: constants.CMD_ADD + }, + { + name: 'on', + alias: 'o', + type: Boolean, + description: 'Enable', + group: [constants.CMD_DEV_MODE] + }, + { + name: 'off', + alias: 'f', + type: Boolean, + description: 'Disable', + group: [constants.CMD_DEV_MODE] } ] this.commands = { From 90f2be117de0cc1c03734f6d7c15192101498965 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emirhan=20Durmu=C5=9F?= Date: Sat, 15 Jun 2024 17:26:34 +0300 Subject: [PATCH 094/178] swagger yaml edited --- docs/swagger.yaml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/docs/swagger.yaml b/docs/swagger.yaml index 1cd9a0005..4784938ce 100755 --- a/docs/swagger.yaml +++ b/docs/swagger.yaml @@ -3826,6 +3826,9 @@ components: accessMode: type: string example: rw + type: + type: string + example: bind PortMappingsResponse: type: object properties: From a60eb01dd330ef8e149bf15dc6f04672ea32f943 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emirhan=20Durmu=C5=9F?= Date: Sat, 15 Jun 2024 17:31:26 +0300 Subject: [PATCH 095/178] viewer update --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index e22ae6007..2ce5cd98a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@datasance/iofogcontroller", - "version": "3.2.0", + "version": "3.2.1-beta", "description": "ioFog Controller project for Eclipse IoFog @ iofog.org \\nCopyright (c) 2023 Datasance Teknoloji A.S.", "main": "./src/main.js", "author": "Emirhan Durmus", @@ -57,7 +57,7 @@ "iofog-controller": "src/main.js" }, "dependencies": { - "@datasance/ecn-viewer": "0.1.5", + "@datasance/ecn-viewer": "0.1.6", "axios": "1.6.8", "body-parser": "^1.20.2", "child_process": "1.0.2", From 2eb4e760572da4ae51d1ecf1897690d0ee73d9f3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emirhan=20Durmu=C5=9F?= Date: Sat, 15 Jun 2024 17:52:10 +0300 Subject: [PATCH 096/178] package updates --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 2ce5cd98a..706f3cf22 100644 --- a/package.json +++ b/package.json @@ -84,7 +84,7 @@ "moment-timezone": "0.5.45", "morgan": "1.10.0", "multer": "1.4.5-lts.1", - "mysql2": "3.9.7", + "mysql2": "3.9.8", "nconf": "0.12.1", "node-fetch-npm": "^2.0.4", "npm-check-updates": "^16.14.20", @@ -99,7 +99,7 @@ "sqlite3": "^5.1.7", "string-format": "2.0.0", "swagger-ui-express": "^5.0.0", - "umzug": "3.8.0", + "umzug": "3.8.1", "underscore": "1.13.6", "xss-clean": "0.1.1" }, From c101d8e468590a1b5daa4a141bc22cb8e83845e0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emirhan=20Durmu=C5=9F?= Date: Sat, 15 Jun 2024 18:06:04 +0300 Subject: [PATCH 097/178] commit --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 706f3cf22..29f491ff7 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@datasance/iofogcontroller", - "version": "3.2.1-beta", + "version": "3.2.1-beta0", "description": "ioFog Controller project for Eclipse IoFog @ iofog.org \\nCopyright (c) 2023 Datasance Teknoloji A.S.", "main": "./src/main.js", "author": "Emirhan Durmus", From 395020243655b9977c4fa6863f328fc99aef1cb4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emirhan=20Durmu=C5=9F?= Date: Sat, 15 Jun 2024 18:16:36 +0300 Subject: [PATCH 098/178] commit --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 29f491ff7..fabd41db8 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@datasance/iofogcontroller", - "version": "3.2.1-beta0", + "version": "3.2.1-beta1", "description": "ioFog Controller project for Eclipse IoFog @ iofog.org \\nCopyright (c) 2023 Datasance Teknoloji A.S.", "main": "./src/main.js", "author": "Emirhan Durmus", From d962e94280aefaa33e6ba73aea9a5135a0f100ce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emirhan=20Durmu=C5=9F?= Date: Sat, 15 Jun 2024 18:53:45 +0300 Subject: [PATCH 099/178] package updates --- .github/workflows/ci.yaml | 4 ++-- .nsprc | 6 +++++- package-lock.json | 29 +++++++++++++++-------------- 3 files changed, 22 insertions(+), 17 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index bfd1aa366..94f9e403e 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -23,7 +23,7 @@ env: jobs: Build: - runs-on: ubuntu-20.04 + runs-on: ubuntu-22.04 permissions: actions: write checks: write @@ -59,7 +59,7 @@ jobs: Publish: needs: [Build] - runs-on: ubuntu-20.04 + runs-on: ubuntu-22.04 permissions: actions: write checks: write diff --git a/.nsprc b/.nsprc index 9e26dfeeb..b15291f0e 100644 --- a/.nsprc +++ b/.nsprc @@ -1 +1,5 @@ -{} \ No newline at end of file +{ + "1097496": { + "notes": "" + } + } \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 444a4b4d4..927a29eb4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,16 +1,16 @@ { "name": "@datasance/iofogcontroller", - "version": "3.1.0", + "version": "3.2.1-beta1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@datasance/iofogcontroller", - "version": "3.1.0", + "version": "3.2.1-beta1", "hasInstallScript": true, "license": "EPL-2.0", "dependencies": { - "@datasance/ecn-viewer": "0.1.5", + "@datasance/ecn-viewer": "0.1.6", "axios": "1.6.8", "body-parser": "^1.20.2", "child_process": "1.0.2", @@ -37,7 +37,7 @@ "moment-timezone": "0.5.45", "morgan": "1.10.0", "multer": "1.4.5-lts.1", - "mysql2": "3.9.7", + "mysql2": "3.9.8", "nconf": "0.12.1", "node-fetch-npm": "^2.0.4", "npm-check-updates": "^16.14.20", @@ -52,7 +52,7 @@ "sqlite3": "^5.1.7", "string-format": "2.0.0", "swagger-ui-express": "^5.0.0", - "umzug": "3.8.0", + "umzug": "3.8.1", "underscore": "1.13.6", "xss-clean": "0.1.1" }, @@ -576,9 +576,10 @@ } }, "node_modules/@datasance/ecn-viewer": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/@datasance/ecn-viewer/-/ecn-viewer-0.1.5.tgz", - "integrity": "sha512-6RtIBh9FX63+mA6pqlcnA5g91vNEkMIg2JMEQkPJYjmNUH/8Zk3qlf6kmsqnaPaAawkbECtwn+RFMLCVhd2Btw==" + "version": "0.1.6", + "resolved": "https://npm.pkg.github.com/download/@datasance/ecn-viewer/0.1.6/16b8ab2bb99ee23b0942e463639d7e924edcf036", + "integrity": "sha512-5DozJKJ00SQA4xLVtrjRbnD0/CnV1ch5f8dnJKOmiWPk06EeBy8ANH/VzbOaSzNYXHN93fCllJKEq9AK8/qZpQ==", + "license": "EPL-2.0" }, "node_modules/@eslint-community/eslint-utils": { "version": "4.4.0", @@ -8799,9 +8800,9 @@ "dev": true }, "node_modules/mysql2": { - "version": "3.9.7", - "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.9.7.tgz", - "integrity": "sha512-KnJT8vYRcNAZv73uf9zpXqNbvBG7DJrs+1nACsjZP1HMJ1TgXEy8wnNilXAn/5i57JizXKtrUtwDB7HxT9DDpw==", + "version": "3.9.8", + "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.9.8.tgz", + "integrity": "sha512-+5JKNjPuks1FNMoy9TYpl77f+5frbTklz7eb3XDwbpsERRLEeXiW2PDEkakYF50UuKU2qwfGnyXpKYvukv8mGA==", "dependencies": { "denque": "^2.1.0", "generate-function": "^2.3.1", @@ -14868,9 +14869,9 @@ } }, "node_modules/umzug": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/umzug/-/umzug-3.8.0.tgz", - "integrity": "sha512-FRBvdZxllW3eUzsqG3CIfgOVChUONrKNZozNOJfvmcfBn5pMKcJjICuMMEsDLHYa/aqd7a2NtXfYEG86XHe1lQ==", + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/umzug/-/umzug-3.8.1.tgz", + "integrity": "sha512-k0HjOc3b/s8vH24BUTvnaFiKhfWI9UQAGpqHDG+3866CGlBTB83Xs5wZ1io1mwYLj/GHvQ34AxKhbpYnWtkRJg==", "dependencies": { "@rushstack/ts-command-line": "^4.12.2", "emittery": "^0.13.0", From cfc92defb8e71613d895c36602b8a002bd1a67ee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emirhan=20Durmu=C5=9F?= Date: Sat, 29 Jun 2024 14:43:37 +0300 Subject: [PATCH 100/178] package versions updated --- .github/workflows/ci.yaml | 4 +- package-lock.json | 2577 +++---------------------------------- package.json | 13 +- 3 files changed, 179 insertions(+), 2415 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 94f9e403e..63cb78bc6 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -41,7 +41,7 @@ jobs: name: Preflight steps: - uses: actions/checkout@v4 - - uses: actions/setup-node@v3 + - uses: actions/setup-node@v4 with: node-version: 20 - name: Replace values @@ -77,7 +77,7 @@ jobs: name: Publish Controller steps: - uses: actions/checkout@v4 - - uses: actions/setup-node@v3 + - uses: actions/setup-node@v4 with: node-version: 20 - name: Replace values diff --git a/package-lock.json b/package-lock.json index 927a29eb4..29d0fd375 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,17 +1,17 @@ { "name": "@datasance/iofogcontroller", - "version": "3.2.1-beta1", + "version": "3.2.1-beta2", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@datasance/iofogcontroller", - "version": "3.2.1-beta1", + "version": "3.2.1-beta2", "hasInstallScript": true, "license": "EPL-2.0", "dependencies": { - "@datasance/ecn-viewer": "0.1.6", - "axios": "1.6.8", + "@datasance/ecn-viewer": "0.1.7", + "axios": "1.7.2", "body-parser": "^1.20.2", "child_process": "1.0.2", "command-line-args": "5.2.1", @@ -31,16 +31,15 @@ "is-elevated": "3.0.0", "js-yaml": "4.1.0", "jsonschema": "1.4.1", - "keycloak-connect": "24.0.4", + "keycloak-connect": "25.0.1", "minimatch": "9.0.4", "moment": "2.30.1", "moment-timezone": "0.5.45", "morgan": "1.10.0", "multer": "1.4.5-lts.1", - "mysql2": "3.9.8", + "mysql2": "3.10.1", "nconf": "0.12.1", "node-fetch-npm": "^2.0.4", - "npm-check-updates": "^16.14.20", "os": "0.1.2", "path": "0.12.7", "pino": "9.1.0", @@ -67,7 +66,7 @@ "chai-http": "4.4.0", "eslint": "9.2.0", "eslint-config-google": "0.14.0", - "mocha": "10.4.0", + "mocha": "10.5.2", "mocha-junit-reporter": "2.2.1", "newman": "6.1.2", "newman-reporter-junitfull": "1.1.1", @@ -570,15 +569,16 @@ "version": "1.5.0", "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", + "dev": true, "optional": true, "engines": { "node": ">=0.1.90" } }, "node_modules/@datasance/ecn-viewer": { - "version": "0.1.6", - "resolved": "https://npm.pkg.github.com/download/@datasance/ecn-viewer/0.1.6/16b8ab2bb99ee23b0942e463639d7e924edcf036", - "integrity": "sha512-5DozJKJ00SQA4xLVtrjRbnD0/CnV1ch5f8dnJKOmiWPk06EeBy8ANH/VzbOaSzNYXHN93fCllJKEq9AK8/qZpQ==", + "version": "0.1.7", + "resolved": "https://npm.pkg.github.com/download/@datasance/ecn-viewer/0.1.7/c8adebf78e1f9d6f51c94e6560c13e31057873c6", + "integrity": "sha512-51zzl9vPevuyW5APcCGgTmBrFYoKbZbSzJeNhKZ7HZSjfSWfEPrB58dj7myvMK0vSEtgGXgAXdrmmyHmc2InDQ==", "license": "EPL-2.0" }, "node_modules/@eslint-community/eslint-utils": { @@ -703,7 +703,8 @@ "node_modules/@gar/promisify": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", - "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==" + "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==", + "optional": true }, "node_modules/@humanwhocodes/config-array": { "version": "0.13.0", @@ -800,6 +801,7 @@ "version": "8.0.2", "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, "dependencies": { "string-width": "^5.1.2", "string-width-cjs": "npm:string-width@^4.2.0", @@ -816,6 +818,7 @@ "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" }, @@ -826,12 +829,14 @@ "node_modules/@isaacs/cliui/node_modules/emoji-regex": { "version": "9.2.2", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true }, "node_modules/@isaacs/cliui/node_modules/string-width": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", @@ -848,6 +853,7 @@ "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" }, @@ -1052,211 +1058,6 @@ "node": ">= 8" } }, - "node_modules/@npmcli/fs": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-3.1.1.tgz", - "integrity": "sha512-q9CRWjpHCMIh5sVyefoD1cA7PkvILqCZsnSOEUUivORLjxCO/Irmue2DprETiNgEqktDBZaM1Bi+jrarx1XdCg==", - "dependencies": { - "semver": "^7.3.5" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/git": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-4.1.0.tgz", - "integrity": "sha512-9hwoB3gStVfa0N31ymBmrX+GuDGdVA/QWShZVqE0HK2Af+7QGGrCTbZia/SW0ImUTjTne7SP91qxDmtXvDHRPQ==", - "dependencies": { - "@npmcli/promise-spawn": "^6.0.0", - "lru-cache": "^7.4.4", - "npm-pick-manifest": "^8.0.0", - "proc-log": "^3.0.0", - "promise-inflight": "^1.0.1", - "promise-retry": "^2.0.1", - "semver": "^7.3.5", - "which": "^3.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/git/node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "engines": { - "node": ">=12" - } - }, - "node_modules/@npmcli/git/node_modules/which": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/which/-/which-3.0.1.tgz", - "integrity": "sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/which.js" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/installed-package-contents": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-2.1.0.tgz", - "integrity": "sha512-c8UuGLeZpm69BryRykLuKRyKFZYJsZSCT4aVY5ds4omyZqJ172ApzgfKJ5eV/r3HgLdUYgFVe54KSFVjKoe27w==", - "dependencies": { - "npm-bundled": "^3.0.0", - "npm-normalize-package-bin": "^3.0.0" - }, - "bin": { - "installed-package-contents": "bin/index.js" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/move-file": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-2.0.1.tgz", - "integrity": "sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ==", - "deprecated": "This functionality has been moved to @npmcli/fs", - "dependencies": { - "mkdirp": "^1.0.4", - "rimraf": "^3.0.2" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/@npmcli/move-file/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/@npmcli/move-file/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/@npmcli/move-file/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/@npmcli/move-file/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/@npmcli/move-file/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/@npmcli/node-gyp": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-3.0.0.tgz", - "integrity": "sha512-gp8pRXC2oOxu0DUE1/M3bYtb1b3/DbJ5aM113+XJBgfXdussRAsX0YOrOhdd8WvnAR6auDBvJomGAkLKA5ydxA==", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/promise-spawn": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-6.0.2.tgz", - "integrity": "sha512-gGq0NJkIGSwdbUt4yhdF8ZrmkGKVz9vAdVzpOfnom+V8PLSmSOVhZwbNvZZS1EYcJN5hzzKBxmmVVAInM6HQLg==", - "dependencies": { - "which": "^3.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/promise-spawn/node_modules/which": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/which/-/which-3.0.1.tgz", - "integrity": "sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/which.js" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/run-script": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-6.0.2.tgz", - "integrity": "sha512-NCcr1uQo1k5U+SYlnIrbAh3cxy+OQT1VtqiAbxdymSlptbzBb62AjH2xXgjNCoP073hoa1CfCAcwoZ8k96C4nA==", - "dependencies": { - "@npmcli/node-gyp": "^3.0.0", - "@npmcli/promise-spawn": "^6.0.0", - "node-gyp": "^9.0.0", - "read-package-json-fast": "^3.0.0", - "which": "^3.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/run-script/node_modules/which": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/which/-/which-3.0.1.tgz", - "integrity": "sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/which.js" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, "node_modules/@one-ini/wasm": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/@one-ini/wasm/-/wasm-0.1.1.tgz", @@ -1267,48 +1068,12 @@ "version": "0.11.0", "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, "optional": true, "engines": { "node": ">=14" } }, - "node_modules/@pnpm/config.env-replace": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@pnpm/config.env-replace/-/config.env-replace-1.1.0.tgz", - "integrity": "sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==", - "engines": { - "node": ">=12.22.0" - } - }, - "node_modules/@pnpm/network.ca-file": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@pnpm/network.ca-file/-/network.ca-file-1.0.2.tgz", - "integrity": "sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==", - "dependencies": { - "graceful-fs": "4.2.10" - }, - "engines": { - "node": ">=12.22.0" - } - }, - "node_modules/@pnpm/network.ca-file/node_modules/graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" - }, - "node_modules/@pnpm/npm-conf": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/@pnpm/npm-conf/-/npm-conf-2.2.2.tgz", - "integrity": "sha512-UA91GwWPhFExt3IizW6bOeY/pQ0BkuNwKjk9iQW9KqxluGCrg4VenZ0/L+2Y0+ZOtme72EVvg6v0zo3AMQRCeA==", - "dependencies": { - "@pnpm/config.env-replace": "^1.1.0", - "@pnpm/network.ca-file": "^1.0.1", - "config-chain": "^1.1.11" - }, - "engines": { - "node": ">=12" - } - }, "node_modules/@postman/form-data": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/@postman/form-data/-/form-data-3.1.1.tgz", @@ -1559,61 +1324,6 @@ "node": ">=8" } }, - "node_modules/@sigstore/bundle": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@sigstore/bundle/-/bundle-1.1.0.tgz", - "integrity": "sha512-PFutXEy0SmQxYI4texPw3dd2KewuNqv7OuK1ZFtY2fM754yhvG2KdgwIhRnoEE2uHdtdGNQ8s0lb94dW9sELog==", - "dependencies": { - "@sigstore/protobuf-specs": "^0.2.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@sigstore/protobuf-specs": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.2.1.tgz", - "integrity": "sha512-XTWVxnWJu+c1oCshMLwnKvz8ZQJJDVOlciMfgpJBQbThVjKTCG8dwyhgLngBD2KN0ap9F/gOV8rFDEx8uh7R2A==", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@sigstore/sign": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@sigstore/sign/-/sign-1.0.0.tgz", - "integrity": "sha512-INxFVNQteLtcfGmcoldzV6Je0sbbfh9I16DM4yJPw3j5+TFP8X6uIiA18mvpEa9yyeycAKgPmOA3X9hVdVTPUA==", - "dependencies": { - "@sigstore/bundle": "^1.1.0", - "@sigstore/protobuf-specs": "^0.2.0", - "make-fetch-happen": "^11.0.1" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@sigstore/tuf": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@sigstore/tuf/-/tuf-1.0.3.tgz", - "integrity": "sha512-2bRovzs0nJZFlCN3rXirE4gwxCn97JNjMmwpecqlbgV9WcxX7WRuIrgzx/X7Ib7MYRbyUTpBYE0s2x6AmZXnlg==", - "dependencies": { - "@sigstore/protobuf-specs": "^0.2.0", - "tuf-js": "^1.1.7" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@sindresorhus/is": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-5.6.0.tgz", - "integrity": "sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g==", - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sindresorhus/is?sponsor=1" - } - }, "node_modules/@sinonjs/commons": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", @@ -1658,57 +1368,18 @@ "integrity": "sha512-sXXKG+uL9IrKqViTtao2Ws6dy0znu9sOaP1di/jKGW1M6VssO8vlpXCQcpZ+jisQ1tTFAC5Jo/EOzFbggBagFQ==", "dev": true }, - "node_modules/@szmarczak/http-timer": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz", - "integrity": "sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==", - "dependencies": { - "defer-to-connect": "^2.0.1" - }, - "engines": { - "node": ">=14.16" - } - }, "node_modules/@testim/chrome-version": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/@testim/chrome-version/-/chrome-version-1.1.4.tgz", "integrity": "sha512-kIhULpw9TrGYnHp/8VfdcneIcxKnLixmADtukQRtJUmsVlMg0niMkwV0xZmi8hqa57xqilIHjWFA0GKvEjVU5g==", "optional": true }, - "node_modules/@tootallnate/once": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", - "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", - "engines": { - "node": ">= 10" - } - }, "node_modules/@tootallnate/quickjs-emscripten": { "version": "0.23.0", "resolved": "https://registry.npmjs.org/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz", "integrity": "sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==", "optional": true }, - "node_modules/@tufjs/canonical-json": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@tufjs/canonical-json/-/canonical-json-1.0.0.tgz", - "integrity": "sha512-QTnf++uxunWvG2z3UFNzAoQPHxnSXOwtaI3iJ+AohhV+5vONuArPjJE7aPXPVXfXJsqrVbZBu9b81AJoSd09IQ==", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@tufjs/models": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@tufjs/models/-/models-1.0.4.tgz", - "integrity": "sha512-qaGV9ltJP0EO25YfFUPhxRVK0evXFIAGicsVXuRim4Ed9cjPxYhNnNJ49SFmbeLgtxpslIkX317IgpfcHPVj/A==", - "dependencies": { - "@tufjs/canonical-json": "1.0.0", - "minimatch": "^9.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, "node_modules/@types/argparse": { "version": "1.0.38", "resolved": "https://registry.npmjs.org/@types/argparse/-/argparse-1.0.38.tgz", @@ -1734,11 +1405,6 @@ "@types/ms": "*" } }, - "node_modules/@types/http-cache-semantics": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz", - "integrity": "sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==" - }, "node_modules/@types/ms": { "version": "0.7.34", "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz", @@ -1752,11 +1418,6 @@ "undici-types": "~5.26.4" } }, - "node_modules/@types/semver-utils": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@types/semver-utils/-/semver-utils-1.1.3.tgz", - "integrity": "sha512-T+YwkslhsM+CeuhYUxyAjWm7mJ5am/K10UX40RuA6k6Lc7eGtq8iY2xOzy7Vq0GOqhl/xZl5l2FwURZMTPTUww==" - }, "node_modules/@types/superagent": { "version": "4.1.13", "resolved": "https://registry.npmjs.org/@types/superagent/-/superagent-4.1.13.tgz", @@ -1784,7 +1445,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==", + "optional": true }, "node_modules/abort-controller": { "version": "3.0.0", @@ -1842,6 +1504,7 @@ "version": "6.0.2", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "optional": true, "dependencies": { "debug": "4" }, @@ -1853,6 +1516,7 @@ "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "optional": true, "dependencies": { "ms": "2.1.2" }, @@ -1868,12 +1532,14 @@ "node_modules/agent-base/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==", + "optional": true }, "node_modules/agentkeepalive": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.5.0.tgz", "integrity": "sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==", + "optional": true, "dependencies": { "humanize-ms": "^1.2.1" }, @@ -1885,6 +1551,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "devOptional": true, "dependencies": { "clean-stack": "^2.0.0", "indent-string": "^4.0.0" @@ -1918,14 +1585,6 @@ "ajv": "^6.9.1" } }, - "node_modules/ansi-align": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", - "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", - "dependencies": { - "string-width": "^4.1.0" - } - }, "node_modules/ansi-colors": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", @@ -1999,7 +1658,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==" + "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", + "optional": true }, "node_modules/archy": { "version": "1.0.0", @@ -2011,6 +1671,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz", "integrity": "sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==", + "optional": true, "dependencies": { "delegates": "^1.0.0", "readable-stream": "^3.6.0" @@ -2023,6 +1684,7 @@ "version": "3.6.2", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "optional": true, "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -2036,6 +1698,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==", + "optional": true, "dependencies": { "safe-buffer": "~5.2.0" } @@ -2094,14 +1757,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "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/arraybuffer.prototype.slice": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", @@ -2237,9 +1892,9 @@ "dev": true }, "node_modules/axios": { - "version": "1.6.8", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.8.tgz", - "integrity": "sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ==", + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.2.tgz", + "integrity": "sha512-2A8QhOMrbomlDuiLeK9XibIBzuHeRcqqNOHp0Cyp5EoJ1IFDh+XZH3A6BkXtv0K4gFGCI0Y4BM7B1wOEi0Rmgw==", "dependencies": { "follow-redirects": "^1.15.6", "form-data": "^4.0.0", @@ -2516,106 +2171,6 @@ "integrity": "sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==", "dev": true }, - "node_modules/boxen": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-7.1.1.tgz", - "integrity": "sha512-2hCgjEmP8YLWQ130n2FerGv7rYpfBmnmp9Uy2Le1vge6X3gZIfSmEzP5QTDElFxcvVcXlEn8Aq6MU/PZygIOog==", - "dependencies": { - "ansi-align": "^3.0.1", - "camelcase": "^7.0.1", - "chalk": "^5.2.0", - "cli-boxes": "^3.0.0", - "string-width": "^5.1.2", - "type-fest": "^2.13.0", - "widest-line": "^4.0.1", - "wrap-ansi": "^8.1.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/boxen/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==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/boxen/node_modules/camelcase": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-7.0.1.tgz", - "integrity": "sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==", - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/boxen/node_modules/chalk": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", - "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/boxen/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==" - }, - "node_modules/boxen/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==", - "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/boxen/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==", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/boxen/node_modules/type-fest": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", - "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/brace-expansion": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", @@ -2743,138 +2298,6 @@ "node": ">= 0.8" } }, - "node_modules/cacache": { - "version": "17.1.4", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-17.1.4.tgz", - "integrity": "sha512-/aJwG2l3ZMJ1xNAnqbMpA40of9dj/pIH3QfiuQSqjfPJF747VR0J/bHn+/KdNnHKc6XQcWt/AfRSBft82W1d2A==", - "dependencies": { - "@npmcli/fs": "^3.1.0", - "fs-minipass": "^3.0.0", - "glob": "^10.2.2", - "lru-cache": "^7.7.1", - "minipass": "^7.0.3", - "minipass-collect": "^1.0.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "p-map": "^4.0.0", - "ssri": "^10.0.0", - "tar": "^6.1.11", - "unique-filename": "^3.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/cacache/node_modules/foreground-child": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", - "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", - "dependencies": { - "cross-spawn": "^7.0.0", - "signal-exit": "^4.0.1" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/cacache/node_modules/glob": { - "version": "10.3.15", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.15.tgz", - "integrity": "sha512-0c6RlJt1TICLyvJYIApxb8GsXoai0KUP7AxKKAtsYXdgJR1mGEUa7DgwShbdk1nly0PYoZj01xd4hzbq3fsjpw==", - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^2.3.6", - "minimatch": "^9.0.1", - "minipass": "^7.0.4", - "path-scurry": "^1.11.0" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "engines": { - "node": ">=16 || 14 >=14.18" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/cacache/node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "engines": { - "node": ">=12" - } - }, - "node_modules/cacache/node_modules/minipass": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.1.tgz", - "integrity": "sha512-UZ7eQ+h8ywIRAW1hIEl2AqdwzJucU/Kp59+8kkZeSvafXhZjul247BvIJjEVFVeON6d7lM46XX1HXCduKAS8VA==", - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/cacache/node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/cacheable-lookup": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz", - "integrity": "sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==", - "engines": { - "node": ">=14.16" - } - }, - "node_modules/cacheable-request": { - "version": "10.2.14", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-10.2.14.tgz", - "integrity": "sha512-zkDT5WAF4hSSoUgyfg5tFIxz8XQK+25W/TLVojJTMKBaxevLBBtLxgqguAuVQB8PVW79FVjHcU+GJ9tVbDZ9mQ==", - "dependencies": { - "@types/http-cache-semantics": "^4.0.2", - "get-stream": "^6.0.1", - "http-cache-semantics": "^4.1.1", - "keyv": "^4.5.3", - "mimic-response": "^4.0.0", - "normalize-url": "^8.0.0", - "responselike": "^3.0.0" - }, - "engines": { - "node": ">=14.16" - } - }, - "node_modules/cacheable-request/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==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cacheable-request/node_modules/mimic-response": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-4.0.0.tgz", - "integrity": "sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/caching-transform": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-4.0.0.tgz", @@ -3179,20 +2602,6 @@ "node": ">=18" } }, - "node_modules/ci-info": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", - "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "engines": { - "node": ">=8" - } - }, "node_modules/circular-json": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz", @@ -3204,21 +2613,11 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "devOptional": true, "engines": { "node": ">=6" } }, - "node_modules/cli-boxes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-3.0.0.tgz", - "integrity": "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/cli-color": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/cli-color/-/cli-color-2.0.4.tgz", @@ -3263,6 +2662,7 @@ "version": "0.6.3", "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.3.tgz", "integrity": "sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==", + "dev": true, "dependencies": { "string-width": "^4.2.0" }, @@ -3325,6 +2725,7 @@ "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==", + "optional": true, "bin": { "color-support": "bin.js" } @@ -3492,6 +2893,7 @@ "version": "1.1.13", "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", + "dev": true, "dependencies": { "ini": "^1.3.4", "proto-list": "~1.2.1" @@ -3500,30 +2902,14 @@ "node_modules/config-chain/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/configstore": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/configstore/-/configstore-6.0.0.tgz", - "integrity": "sha512-cD31W1v3GqUlQvbBCGcXmd2Nj9SvLDOP1oQ0YFuLETufzSPaKp11rYBsSOm7rCsW3OnIRAFM3OxRhceaXNYHkA==", - "dependencies": { - "dot-prop": "^6.0.1", - "graceful-fs": "^4.2.6", - "unique-string": "^3.0.0", - "write-file-atomic": "^3.0.3", - "xdg-basedir": "^5.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/yeoman/configstore?sponsor=1" - } + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "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==" + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", + "optional": true }, "node_modules/contains-path": { "version": "0.1.0", @@ -3611,6 +2997,7 @@ "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", @@ -3629,31 +3016,6 @@ "node": "*" } }, - "node_modules/crypto-random-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-4.0.0.tgz", - "integrity": "sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==", - "dependencies": { - "type-fest": "^1.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/crypto-random-string/node_modules/type-fest": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", - "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/csv-parse": { "version": "4.16.3", "resolved": "https://registry.npmjs.org/csv-parse/-/csv-parse-4.16.3.tgz", @@ -3831,14 +3193,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/defer-to-connect": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", - "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", - "engines": { - "node": ">=10" - } - }, "node_modules/define-data-property": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", @@ -3967,7 +3321,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==", + "optional": true }, "node_modules/denque": { "version": "2.1.0", @@ -4036,17 +3391,6 @@ "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/doctrine": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", @@ -4059,20 +3403,6 @@ "node": ">=0.10.0" } }, - "node_modules/dot-prop": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-6.0.1.tgz", - "integrity": "sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==", - "dependencies": { - "is-obj": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/dottie": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/dottie/-/dottie-2.0.6.tgz", @@ -4081,7 +3411,8 @@ "node_modules/eastasianwidth": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true }, "node_modules/ecc-jsbn": { "version": "0.1.2", @@ -4243,6 +3574,7 @@ "version": "2.2.1", "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "optional": true, "engines": { "node": ">=6" } @@ -4250,7 +3582,8 @@ "node_modules/err-code": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", - "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==" + "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", + "optional": true }, "node_modules/error-ex": { "version": "1.3.2", @@ -4449,17 +3782,6 @@ "node": ">=6" } }, - "node_modules/escape-goat": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-4.0.0.tgz", - "integrity": "sha512-2Sd4ShcWxbx6OY1IHyla/CVNwvg7XwZVoXZHcSu9w9SReNP1EzzD5T8NWKIR38fIqEns9kDWKUQTXXAmlDrdPg==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", @@ -5046,11 +4368,6 @@ "node": ">=6" } }, - "node_modules/exponential-backoff": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.1.tgz", - "integrity": "sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==" - }, "node_modules/express": { "version": "4.19.2", "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz", @@ -5291,11 +4608,6 @@ "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", "dev": true }, - "node_modules/fast-memoize": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/fast-memoize/-/fast-memoize-2.5.2.tgz", - "integrity": "sha512-Ue0LwpDYErFbmNnZSF0UH6eImUwDmogUO1jyE+JbN2gsQz/jICm1Ve7t9QT0rNSsfJt+Hs4/S3GnsDVjL4HVrw==" - }, "node_modules/fast-redact": { "version": "3.5.0", "resolved": "https://registry.npmjs.org/fast-redact/-/fast-redact-3.5.0.tgz", @@ -5468,6 +4780,7 @@ "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" @@ -5570,14 +4883,6 @@ "node": ">= 6" } }, - "node_modules/form-data-encoder": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-2.1.4.tgz", - "integrity": "sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==", - "engines": { - "node": ">= 14.17" - } - }, "node_modules/formidable": { "version": "3.5.1", "resolved": "https://registry.npmjs.org/formidable/-/formidable-3.5.1.tgz", @@ -5607,14 +4912,6 @@ "node": ">= 0.6" } }, - "node_modules/fp-and-or": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/fp-and-or/-/fp-and-or-0.1.4.tgz", - "integrity": "sha512-+yRYRhpnFPWXSly/6V4Lw9IfOV26uu30kynGJ03PW+MnjOEQe45RZ141QcS0aJehYBYA50GfCDnsRbFJdhssRw==", - "engines": { - "node": ">=10" - } - }, "node_modules/fresh": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", @@ -5671,29 +4968,11 @@ "node": ">= 10.0.0" } }, - "node_modules/fs-minipass": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.3.tgz", - "integrity": "sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==", - "dependencies": { - "minipass": "^7.0.3" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/fs-minipass/node_modules/minipass": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.1.tgz", - "integrity": "sha512-UZ7eQ+h8ywIRAW1hIEl2AqdwzJucU/Kp59+8kkZeSvafXhZjul247BvIJjEVFVeON6d7lM46XX1HXCduKAS8VA==", - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, "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==" + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "devOptional": true }, "node_modules/fsevents": { "version": "2.3.3", @@ -5766,6 +5045,7 @@ "version": "4.0.4", "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz", "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==", + "optional": true, "dependencies": { "aproba": "^1.0.3 || ^2.0.0", "color-support": "^1.1.3", @@ -5841,17 +5121,6 @@ "node": ">=8.0.0" } }, - "node_modules/get-stdin": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-8.0.0.tgz", - "integrity": "sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/get-stream": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", @@ -5992,20 +5261,6 @@ "node": ">=10.0" } }, - "node_modules/global-dirs": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.1.tgz", - "integrity": "sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==", - "dependencies": { - "ini": "2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/globally": { "version": "0.0.0", "resolved": "https://registry.npmjs.org/globally/-/globally-0.0.0.tgz", @@ -6039,25 +5294,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "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/gopd": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", @@ -6069,41 +5305,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/got": { - "version": "12.6.1", - "resolved": "https://registry.npmjs.org/got/-/got-12.6.1.tgz", - "integrity": "sha512-mThBblvlAF1d4O5oqyvN+ZxLAYwIJK7bpMxgYqPD9okW0C3qm5FFn7k811QrcuEBwaogR3ngOFoCfs6mRv7teQ==", - "dependencies": { - "@sindresorhus/is": "^5.2.0", - "@szmarczak/http-timer": "^5.0.1", - "cacheable-lookup": "^7.0.0", - "cacheable-request": "^10.2.8", - "decompress-response": "^6.0.0", - "form-data-encoder": "^2.1.2", - "get-stream": "^6.0.1", - "http2-wrapper": "^2.1.10", - "lowercase-keys": "^3.0.0", - "p-cancelable": "^3.0.0", - "responselike": "^3.0.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sindresorhus/got?sponsor=1" - } - }, - "node_modules/got/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==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/graceful-fs": { "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", @@ -6251,18 +5452,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==" - }, - "node_modules/has-yarn": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-3.0.0.tgz", - "integrity": "sha512-IrsVwUHhEULx3R8f/aA8AHuEzAorplsab/v8HBzEiIukwq5i/EC+xmOW+HfP1OaDP+2JkgT1yILHN2O3UFIbcA==", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", + "optional": true }, "node_modules/hash.js": { "version": "1.1.7", @@ -6347,25 +5538,6 @@ "minimalistic-crypto-utils": "^1.0.1" } }, - "node_modules/hosted-git-info": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-5.2.1.tgz", - "integrity": "sha512-xIcQYMnhcx2Nr4JTjsFmwwnr9vldugPy9uVm0o87bjqqWMv9GaqsTeT+i99wTl0mk1uLxJtHxLb8kymqTENQsw==", - "dependencies": { - "lru-cache": "^7.5.1" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/hosted-git-info/node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "engines": { - "node": ">=12" - } - }, "node_modules/html-escaper": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", @@ -6375,7 +5547,8 @@ "node_modules/http-cache-semantics": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", - "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==" + "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", + "optional": true }, "node_modules/http-errors": { "version": "2.0.0", @@ -6392,40 +5565,6 @@ "node": ">= 0.8" } }, - "node_modules/http-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", - "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", - "dependencies": { - "@tootallnate/once": "2", - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/http-proxy-agent/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/http-proxy-agent/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/http-reasons": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/http-reasons/-/http-reasons-0.1.0.tgz", @@ -6446,18 +5585,6 @@ "node": ">=0.10" } }, - "node_modules/http2-wrapper": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.2.1.tgz", - "integrity": "sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==", - "dependencies": { - "quick-lru": "^5.1.1", - "resolve-alpn": "^1.2.0" - }, - "engines": { - "node": ">=10.19.0" - } - }, "node_modules/httpntlm": { "version": "1.8.13", "resolved": "https://registry.npmjs.org/httpntlm/-/httpntlm-1.8.13.tgz", @@ -6507,6 +5634,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==", + "optional": true, "dependencies": { "agent-base": "6", "debug": "4" @@ -6519,6 +5647,7 @@ "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "optional": true, "dependencies": { "ms": "2.1.2" }, @@ -6534,12 +5663,14 @@ "node_modules/https-proxy-agent/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==", + "optional": true }, "node_modules/humanize-ms": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", + "optional": true, "dependencies": { "ms": "^2.0.0" } @@ -6578,21 +5709,11 @@ "version": "5.3.1", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", + "dev": true, "engines": { "node": ">= 4" } }, - "node_modules/ignore-walk": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-6.0.5.tgz", - "integrity": "sha512-VuuG0wCnjhnylG1ABXT3dAuIpTNDs/G8jlpmwXY03fXoXy/8ZK8/T+hMzt8L4WnrLCJgdybqgPagnF/f97cg3A==", - "dependencies": { - "minimatch": "^9.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, "node_modules/immediate": { "version": "3.0.6", "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", @@ -6627,6 +5748,7 @@ "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "devOptional": true, "engines": { "node": ">=0.8.19" } @@ -6635,6 +5757,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "devOptional": true, "engines": { "node": ">=8" } @@ -6642,7 +5765,8 @@ "node_modules/infer-owner": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", - "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==" + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", + "optional": true }, "node_modules/inflection": { "version": "1.13.4", @@ -6656,6 +5780,7 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "devOptional": true, "dependencies": { "once": "^1.3.0", "wrappy": "1" @@ -6830,6 +5955,7 @@ "version": "9.0.5", "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==", + "optional": true, "dependencies": { "jsbn": "1.1.0", "sprintf-js": "^1.1.3" @@ -6946,17 +6072,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-ci": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz", - "integrity": "sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==", - "dependencies": { - "ci-info": "^3.2.0" - }, - "bin": { - "is-ci": "bin.js" - } - }, "node_modules/is-core-module": { "version": "2.13.1", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", @@ -7037,21 +6152,6 @@ "node": ">=0.10.0" } }, - "node_modules/is-installed-globally": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", - "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", - "dependencies": { - "global-dirs": "^3.0.0", - "is-path-inside": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/is-ip": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-ip/-/is-ip-2.0.0.tgz", @@ -7067,7 +6167,8 @@ "node_modules/is-lambda": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", - "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==" + "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==", + "optional": true }, "node_modules/is-negative-zero": { "version": "2.0.3", @@ -7081,17 +6182,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-npm": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-6.0.0.tgz", - "integrity": "sha512-JEjxbSmtPSt1c8XTkVrlujcXdKV1/tvuQ7GwKcAlyiVLeYFQ2VHat8xfrDJsIkhCdF/tZ7CiIR3sy141c6+gPQ==", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "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", @@ -7123,18 +6213,11 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", - "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", - "engines": { - "node": ">=8" - } - }, "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" } @@ -7260,7 +6343,8 @@ "node_modules/is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", + "dev": true }, "node_modules/is-unicode-supported": { "version": "0.1.0", @@ -7301,14 +6385,6 @@ "node": ">=0.10.0" } }, - "node_modules/is-yarn-global": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.4.1.tgz", - "integrity": "sha512-/kppl+R+LO5VmhYSEWARUFjodS25D68gvj8W7z0I7OWhUla5xWu8KL6CtB2V0R6yqhnRgbcaREMr4EEM6htLPQ==", - "engines": { - "node": ">=12" - } - }, "node_modules/is2": { "version": "2.0.9", "resolved": "https://registry.npmjs.org/is2/-/is2-2.0.9.tgz", @@ -7562,6 +6638,7 @@ "version": "2.3.6", "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", + "dev": true, "dependencies": { "@isaacs/cliui": "^8.0.2" }, @@ -7771,7 +6848,8 @@ "node_modules/jsbn": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz", - "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==" + "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==", + "optional": true }, "node_modules/jsesc": { "version": "2.5.2", @@ -7788,29 +6866,14 @@ "node_modules/json-buffer": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==" + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true }, "node_modules/json-parse-better-errors": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==" }, - "node_modules/json-parse-even-better-errors": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.2.tgz", - "integrity": "sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ==", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/json-parse-helpfulerror": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/json-parse-helpfulerror/-/json-parse-helpfulerror-1.0.3.tgz", - "integrity": "sha512-XgP0FGR77+QhUxjXkwOMkC94k3WtqEBfcnjWqhRd82qTat4SWKRE+9kUnynz/shm3I4ea2+qISvTIeGTNU7kJg==", - "dependencies": { - "jju": "^1.1.0" - } - }, "node_modules/json-schema": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", @@ -7839,6 +6902,7 @@ "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" }, @@ -7867,19 +6931,6 @@ "node": ">= 10.0.0" } }, - "node_modules/jsonlines": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsonlines/-/jsonlines-0.1.1.tgz", - "integrity": "sha512-ekDrAGso79Cvf+dtm+mL8OBI2bmAOt3gssYs833De/C9NmIpWDWyUO4zPgB5x2/OhY366dkhgfPMYfwZF7yOZA==" - }, - "node_modules/jsonparse": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", - "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", - "engines": [ - "node >= 0.2.0" - ] - }, "node_modules/jsonschema": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/jsonschema/-/jsonschema-1.4.1.tgz", @@ -7933,9 +6984,9 @@ } }, "node_modules/keycloak-connect": { - "version": "24.0.4", - "resolved": "https://registry.npmjs.org/keycloak-connect/-/keycloak-connect-24.0.4.tgz", - "integrity": "sha512-MaXcNEvvNM7z4QBw2oBAj7iAkH8BFMIO3REP6eXok5C6CfKC0ljS4byeXic6EQ0tBT5OtV9s4Xcv4aCqSWHtZA==", + "version": "25.0.1", + "resolved": "https://registry.npmjs.org/keycloak-connect/-/keycloak-connect-25.0.1.tgz", + "integrity": "sha512-RjVXo+c8ahOMC2QYt/MRLq5Qx9IavII+nwN9s1kyK8DcxWvi44sqJquGFMXqCXM181LxZ2yPmzJACSoO7pBQnA==", "dependencies": { "jwk-to-pem": "^2.0.0" }, @@ -7950,32 +7001,11 @@ "version": "4.5.4", "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, "dependencies": { "json-buffer": "3.0.1" } }, - "node_modules/kleur": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", - "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", - "engines": { - "node": ">=6" - } - }, - "node_modules/latest-version": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-7.0.0.tgz", - "integrity": "sha512-KvNT4XqAMzdcL6ka6Tl3i2lYeFDgXNCuIX+xNx6ZMVR1dFq+idXd9FLKNMOIx0t9mJ9/HudyX4oZWXZQ0UJHeg==", - "dependencies": { - "package-json": "^8.1.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/levn": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", @@ -8044,6 +7074,7 @@ "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" }, @@ -8138,17 +7169,6 @@ "get-func-name": "^2.0.1" } }, - "node_modules/lowercase-keys": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz", - "integrity": "sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/lru-cache": { "version": "8.0.5", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-8.0.5.tgz", @@ -8190,39 +7210,6 @@ "semver": "bin/semver.js" } }, - "node_modules/make-fetch-happen": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-11.1.1.tgz", - "integrity": "sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w==", - "dependencies": { - "agentkeepalive": "^4.2.1", - "cacache": "^17.0.0", - "http-cache-semantics": "^4.1.1", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.0", - "is-lambda": "^1.0.1", - "lru-cache": "^7.7.1", - "minipass": "^5.0.0", - "minipass-fetch": "^3.0.0", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.3", - "promise-retry": "^2.0.1", - "socks-proxy-agent": "^7.0.0", - "ssri": "^10.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/make-fetch-happen/node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "engines": { - "node": ">=12" - } - }, "node_modules/matcher": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/matcher/-/matcher-3.0.0.tgz", @@ -8406,6 +7393,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", + "optional": true, "dependencies": { "minipass": "^3.0.0" }, @@ -8417,6 +7405,7 @@ "version": "3.3.6", "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "optional": true, "dependencies": { "yallist": "^4.0.0" }, @@ -8424,36 +7413,13 @@ "node": ">=8" } }, - "node_modules/minipass-fetch": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.5.tgz", - "integrity": "sha512-2N8elDQAtSnFV0Dk7gt15KHsS0Fyz6CbYZ360h0WTYV1Ty46li3rAXVOQj1THMNLdmrD9Vt5pBPtWtVkpwGBqg==", + "node_modules/minipass-flush": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", + "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", + "optional": true, "dependencies": { - "minipass": "^7.0.3", - "minipass-sized": "^1.0.3", - "minizlib": "^2.1.2" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - }, - "optionalDependencies": { - "encoding": "^0.1.13" - } - }, - "node_modules/minipass-fetch/node_modules/minipass": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.1.tgz", - "integrity": "sha512-UZ7eQ+h8ywIRAW1hIEl2AqdwzJucU/Kp59+8kkZeSvafXhZjul247BvIJjEVFVeON6d7lM46XX1HXCduKAS8VA==", - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/minipass-flush": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", - "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", - "dependencies": { - "minipass": "^3.0.0" + "minipass": "^3.0.0" }, "engines": { "node": ">= 8" @@ -8463,26 +7429,7 @@ "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/minipass-json-stream": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minipass-json-stream/-/minipass-json-stream-1.0.1.tgz", - "integrity": "sha512-ODqY18UZt/I8k+b7rl2AENgbWE8IDYam+undIJONvigAz8KR5GWblsFTEfQs0WODsjbSXWlm+JHEv8Gr6Tfdbg==", - "dependencies": { - "jsonparse": "^1.3.1", - "minipass": "^3.0.0" - } - }, - "node_modules/minipass-json-stream/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "optional": true, "dependencies": { "yallist": "^4.0.0" }, @@ -8494,6 +7441,7 @@ "version": "1.2.4", "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", + "optional": true, "dependencies": { "minipass": "^3.0.0" }, @@ -8505,6 +7453,7 @@ "version": "3.3.6", "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "optional": true, "dependencies": { "yallist": "^4.0.0" }, @@ -8516,6 +7465,7 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", + "optional": true, "dependencies": { "minipass": "^3.0.0" }, @@ -8527,6 +7477,7 @@ "version": "3.3.6", "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "optional": true, "dependencies": { "yallist": "^4.0.0" }, @@ -8578,14 +7529,14 @@ "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==" }, "node_modules/mocha": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.4.0.tgz", - "integrity": "sha512-eqhGB8JKapEYcC4ytX/xrzKforgEc3j1pGlAXVy3eRwrtAy5/nIfT1SvgGzfN0XZZxeLq0aQWkOUAmqIJiv+bA==", + "version": "10.5.2", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.5.2.tgz", + "integrity": "sha512-9btlN3JKCefPf+vKd/kcKz2SXxi12z6JswkGfaAF0saQvnsqLJk504ZmbxhSoENge08E9dsymozKgFMTl5PQsA==", "dev": true, "dependencies": { "ansi-colors": "4.1.1", "browser-stdout": "1.3.1", - "chokidar": "3.5.3", + "chokidar": "^3.5.3", "debug": "4.3.4", "diff": "5.0.0", "escape-string-regexp": "4.0.0", @@ -8800,9 +7751,9 @@ "dev": true }, "node_modules/mysql2": { - "version": "3.9.8", - "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.9.8.tgz", - "integrity": "sha512-+5JKNjPuks1FNMoy9TYpl77f+5frbTklz7eb3XDwbpsERRLEeXiW2PDEkakYF50UuKU2qwfGnyXpKYvukv8mGA==", + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.10.1.tgz", + "integrity": "sha512-6zo1T3GILsXMCex3YEu7hCz2OXLUarxFsxvFcUHWMpkPtmZLeTTWgRdc1gWyNJiYt6AxITmIf9bZDRy/jAfWew==", "dependencies": { "denque": "^2.1.0", "generate-function": "^2.3.1", @@ -9028,276 +7979,6 @@ "node": ">= 6.13.0" } }, - "node_modules/node-gyp": { - "version": "9.4.1", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-9.4.1.tgz", - "integrity": "sha512-OQkWKbjQKbGkMf/xqI1jjy3oCTgMKJac58G2+bjZb3fza6gW2YrCSdMQYaoTb70crvE//Gngr4f0AgVHmqHvBQ==", - "dependencies": { - "env-paths": "^2.2.0", - "exponential-backoff": "^3.1.1", - "glob": "^7.1.4", - "graceful-fs": "^4.2.6", - "make-fetch-happen": "^10.0.3", - "nopt": "^6.0.0", - "npmlog": "^6.0.0", - "rimraf": "^3.0.2", - "semver": "^7.3.5", - "tar": "^6.1.2", - "which": "^2.0.2" - }, - "bin": { - "node-gyp": "bin/node-gyp.js" - }, - "engines": { - "node": "^12.13 || ^14.13 || >=16" - } - }, - "node_modules/node-gyp/node_modules/@npmcli/fs": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-2.1.2.tgz", - "integrity": "sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ==", - "dependencies": { - "@gar/promisify": "^1.1.3", - "semver": "^7.3.5" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/node-gyp/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/node-gyp/node_modules/cacache": { - "version": "16.1.3", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-16.1.3.tgz", - "integrity": "sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ==", - "dependencies": { - "@npmcli/fs": "^2.1.0", - "@npmcli/move-file": "^2.0.0", - "chownr": "^2.0.0", - "fs-minipass": "^2.1.0", - "glob": "^8.0.1", - "infer-owner": "^1.0.4", - "lru-cache": "^7.7.1", - "minipass": "^3.1.6", - "minipass-collect": "^1.0.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "mkdirp": "^1.0.4", - "p-map": "^4.0.0", - "promise-inflight": "^1.0.1", - "rimraf": "^3.0.2", - "ssri": "^9.0.0", - "tar": "^6.1.11", - "unique-filename": "^2.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/node-gyp/node_modules/cacache/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/node-gyp/node_modules/cacache/node_modules/glob": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", - "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/node-gyp/node_modules/cacache/node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/node-gyp/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/node-gyp/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/node-gyp/node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "engines": { - "node": ">=12" - } - }, - "node_modules/node-gyp/node_modules/make-fetch-happen": { - "version": "10.2.1", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-10.2.1.tgz", - "integrity": "sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w==", - "dependencies": { - "agentkeepalive": "^4.2.1", - "cacache": "^16.1.0", - "http-cache-semantics": "^4.1.0", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.0", - "is-lambda": "^1.0.1", - "lru-cache": "^7.7.1", - "minipass": "^3.1.6", - "minipass-collect": "^1.0.2", - "minipass-fetch": "^2.0.3", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.3", - "promise-retry": "^2.0.1", - "socks-proxy-agent": "^7.0.0", - "ssri": "^9.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/node-gyp/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/node-gyp/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/node-gyp/node_modules/minipass-fetch": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-2.1.2.tgz", - "integrity": "sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA==", - "dependencies": { - "minipass": "^3.1.6", - "minipass-sized": "^1.0.3", - "minizlib": "^2.1.2" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - }, - "optionalDependencies": { - "encoding": "^0.1.13" - } - }, - "node_modules/node-gyp/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/node-gyp/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/node-gyp/node_modules/ssri": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-9.0.1.tgz", - "integrity": "sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q==", - "dependencies": { - "minipass": "^3.1.1" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/node-gyp/node_modules/unique-filename": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-2.0.1.tgz", - "integrity": "sha512-ODWHtkkdx3IAR+veKxFV+VBkUMcN+FaqzUUd7IZzt+0zhDZFPFxhlqwPF3YQvMHx1TD0tdgYl+kuPnJ8E6ql7A==", - "dependencies": { - "unique-slug": "^3.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/node-gyp/node_modules/unique-slug": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-3.0.0.tgz", - "integrity": "sha512-8EyMynh679x/0gqE9fT9oilG+qEt+ibFyqjuVTsZn1+CMxH+XLlpvr2UZx4nVcCwTpx81nICr2JQFkM+HPLq4w==", - "dependencies": { - "imurmurhash": "^0.1.4" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, "node_modules/node-oauth1": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/node-oauth1/-/node-oauth1-1.3.0.tgz", @@ -9322,53 +8003,6 @@ "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", "dev": true }, - "node_modules/nopt": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-6.0.0.tgz", - "integrity": "sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==", - "dependencies": { - "abbrev": "^1.0.0" - }, - "bin": { - "nopt": "bin/nopt.js" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/normalize-package-data": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-5.0.0.tgz", - "integrity": "sha512-h9iPVIfrVZ9wVYQnxFgtw1ugSvGEMOlyPWWtm8BMJhnwyEL/FLbYbTY3V3PpjI/BUK67n9PEWDu6eHzu1fB15Q==", - "dependencies": { - "hosted-git-info": "^6.0.0", - "is-core-module": "^2.8.1", - "semver": "^7.3.5", - "validate-npm-package-license": "^3.0.4" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/normalize-package-data/node_modules/hosted-git-info": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-6.1.1.tgz", - "integrity": "sha512-r0EI+HBMcXadMrugk0GCQ+6BQV39PiWAZVfq7oIckeGiN7sjRGyQxPdft3nQekFTCQbYxLBH+/axZMeH8UX6+w==", - "dependencies": { - "lru-cache": "^7.5.1" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/normalize-package-data/node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "engines": { - "node": ">=12" - } - }, "node_modules/normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", @@ -9378,232 +8012,6 @@ "node": ">=0.10.0" } }, - "node_modules/normalize-url": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.0.1.tgz", - "integrity": "sha512-IO9QvjUMWxPQQhs60oOu10CRkWCiZzSUkzbXGGV9pviYl1fXYcvkzQ5jV9z8Y6un8ARoVRl4EtC6v6jNqbaJ/w==", - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/npm-bundled": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-3.0.1.tgz", - "integrity": "sha512-+AvaheE/ww1JEwRHOrn4WHNzOxGtVp+adrg2AeZS/7KuxGUYFuBta98wYpfHBbJp6Tg6j1NKSEVHNcfZzJHQwQ==", - "dependencies": { - "npm-normalize-package-bin": "^3.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm-check-updates": { - "version": "16.14.20", - "resolved": "https://registry.npmjs.org/npm-check-updates/-/npm-check-updates-16.14.20.tgz", - "integrity": "sha512-sYbIhun4DrjO7NFOTdvs11nCar0etEhZTsEjL47eM0TuiGMhmYughRCxG2SpGRmGAQ7AkwN7bw2lWzoE7q6yOQ==", - "dependencies": { - "@types/semver-utils": "^1.1.1", - "chalk": "^5.3.0", - "cli-table3": "^0.6.3", - "commander": "^10.0.1", - "fast-memoize": "^2.5.2", - "find-up": "5.0.0", - "fp-and-or": "^0.1.4", - "get-stdin": "^8.0.0", - "globby": "^11.0.4", - "hosted-git-info": "^5.1.0", - "ini": "^4.1.1", - "js-yaml": "^4.1.0", - "json-parse-helpfulerror": "^1.0.3", - "jsonlines": "^0.1.1", - "lodash": "^4.17.21", - "make-fetch-happen": "^11.1.1", - "minimatch": "^9.0.3", - "p-map": "^4.0.0", - "pacote": "15.2.0", - "parse-github-url": "^1.0.2", - "progress": "^2.0.3", - "prompts-ncu": "^3.0.0", - "rc-config-loader": "^4.1.3", - "remote-git-tags": "^3.0.0", - "rimraf": "^5.0.5", - "semver": "^7.5.4", - "semver-utils": "^1.1.4", - "source-map-support": "^0.5.21", - "spawn-please": "^2.0.2", - "strip-ansi": "^7.1.0", - "strip-json-comments": "^5.0.1", - "untildify": "^4.0.0", - "update-notifier": "^6.0.2" - }, - "bin": { - "ncu": "build/src/bin/cli.js", - "npm-check-updates": "build/src/bin/cli.js" - }, - "engines": { - "node": ">=14.14" - } - }, - "node_modules/npm-check-updates/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==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/npm-check-updates/node_modules/chalk": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", - "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/npm-check-updates/node_modules/commander": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", - "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", - "engines": { - "node": ">=14" - } - }, - "node_modules/npm-check-updates/node_modules/ini": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.2.tgz", - "integrity": "sha512-AMB1mvwR1pyBFY/nSevUX6y8nJWS63/SzUKD3JyQn97s4xgIdgQPT75IRouIiBAN4yLQBUShNYVW0+UG25daCw==", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm-check-updates/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==", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/npm-check-updates/node_modules/strip-json-comments": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-5.0.1.tgz", - "integrity": "sha512-0fk9zBqO67Nq5M/m45qHCJxylV/DhBlIOVExqgOMiCCrzrhU6tCibRXNqE3jwJLftzE9SNuZtYbpzcO+i9FiKw==", - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/npm-install-checks": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-6.3.0.tgz", - "integrity": "sha512-W29RiK/xtpCGqn6f3ixfRYGk+zRyr+Ew9F2E20BfXxT5/euLdA/Nm7fO7OeTGuAmTs30cpgInyJ0cYe708YTZw==", - "dependencies": { - "semver": "^7.1.1" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm-normalize-package-bin": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-3.0.1.tgz", - "integrity": "sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ==", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm-package-arg": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-10.1.0.tgz", - "integrity": "sha512-uFyyCEmgBfZTtrKk/5xDfHp6+MdrqGotX/VoOyEEl3mBwiEE5FlBaePanazJSVMPT7vKepcjYBY2ztg9A3yPIA==", - "dependencies": { - "hosted-git-info": "^6.0.0", - "proc-log": "^3.0.0", - "semver": "^7.3.5", - "validate-npm-package-name": "^5.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm-package-arg/node_modules/hosted-git-info": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-6.1.1.tgz", - "integrity": "sha512-r0EI+HBMcXadMrugk0GCQ+6BQV39PiWAZVfq7oIckeGiN7sjRGyQxPdft3nQekFTCQbYxLBH+/axZMeH8UX6+w==", - "dependencies": { - "lru-cache": "^7.5.1" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm-package-arg/node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "engines": { - "node": ">=12" - } - }, - "node_modules/npm-packlist": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-7.0.4.tgz", - "integrity": "sha512-d6RGEuRrNS5/N84iglPivjaJPxhDbZmlbTwTDX2IbcRHG5bZCdtysYMhwiPvcF4GisXHGn7xsxv+GQ7T/02M5Q==", - "dependencies": { - "ignore-walk": "^6.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm-pick-manifest": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-8.0.2.tgz", - "integrity": "sha512-1dKY+86/AIiq1tkKVD3l0WI+Gd3vkknVGAggsFeBkTvbhMQ1OND/LKkYv4JtXPKUJ8bOTCyLiqEg2P6QNdK+Gg==", - "dependencies": { - "npm-install-checks": "^6.0.0", - "npm-normalize-package-bin": "^3.0.0", - "npm-package-arg": "^10.0.0", - "semver": "^7.3.5" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm-registry-fetch": { - "version": "14.0.5", - "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-14.0.5.tgz", - "integrity": "sha512-kIDMIo4aBm6xg7jOttupWZamsZRkAqMqwqqbVXnUqstY5+tapvv6bkH/qMR76jdgV+YljEUCyWx3hRYMrJiAgA==", - "dependencies": { - "make-fetch-happen": "^11.0.0", - "minipass": "^5.0.0", - "minipass-fetch": "^3.0.0", - "minipass-json-stream": "^1.0.1", - "minizlib": "^2.1.2", - "npm-package-arg": "^10.0.0", - "proc-log": "^3.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.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", @@ -9627,6 +8035,7 @@ "version": "6.0.2", "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz", "integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==", + "optional": true, "dependencies": { "are-we-there-yet": "^3.0.0", "console-control-strings": "^1.1.0", @@ -10018,14 +8427,6 @@ "node": ">=0.10.0" } }, - "node_modules/p-cancelable": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz", - "integrity": "sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==", - "engines": { - "node": ">=12.20" - } - }, "node_modules/p-finally": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", @@ -10038,6 +8439,7 @@ "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" }, @@ -10052,6 +8454,7 @@ "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" }, @@ -10066,6 +8469,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "optional": true, "dependencies": { "aggregate-error": "^3.0.0" }, @@ -10194,65 +8598,17 @@ }, "node_modules/package-hash": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-4.0.0.tgz", - "integrity": "sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.15", - "hasha": "^5.0.0", - "lodash.flattendeep": "^4.4.0", - "release-zalgo": "^1.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/package-json": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/package-json/-/package-json-8.1.1.tgz", - "integrity": "sha512-cbH9IAIJHNj9uXi196JVsRlt7cHKak6u/e6AkL/bkRelZ7rlL3X1YKxsZwa36xipOEKAsdtmaG6aAJoM1fx2zA==", - "dependencies": { - "got": "^12.1.0", - "registry-auth-token": "^5.0.1", - "registry-url": "^6.0.0", - "semver": "^7.3.7" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pacote": { - "version": "15.2.0", - "resolved": "https://registry.npmjs.org/pacote/-/pacote-15.2.0.tgz", - "integrity": "sha512-rJVZeIwHTUta23sIZgEIM62WYwbmGbThdbnkt81ravBplQv+HjyroqnLRNH2+sLJHcGZmLRmhPwACqhfTcOmnA==", + "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-4.0.0.tgz", + "integrity": "sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ==", + "dev": true, "dependencies": { - "@npmcli/git": "^4.0.0", - "@npmcli/installed-package-contents": "^2.0.1", - "@npmcli/promise-spawn": "^6.0.1", - "@npmcli/run-script": "^6.0.0", - "cacache": "^17.0.0", - "fs-minipass": "^3.0.0", - "minipass": "^5.0.0", - "npm-package-arg": "^10.0.0", - "npm-packlist": "^7.0.0", - "npm-pick-manifest": "^8.0.0", - "npm-registry-fetch": "^14.0.0", - "proc-log": "^3.0.0", - "promise-retry": "^2.0.1", - "read-package-json": "^6.0.0", - "read-package-json-fast": "^3.0.0", - "sigstore": "^1.3.0", - "ssri": "^10.0.0", - "tar": "^6.1.11" - }, - "bin": { - "pacote": "lib/bin.js" + "graceful-fs": "^4.1.15", + "hasha": "^5.0.0", + "lodash.flattendeep": "^4.4.0", + "release-zalgo": "^1.0.0" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": ">=8" } }, "node_modules/parent-module": { @@ -10267,17 +8623,6 @@ "node": ">=6" } }, - "node_modules/parse-github-url": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/parse-github-url/-/parse-github-url-1.0.2.tgz", - "integrity": "sha512-kgBf6avCbO3Cn6+RnzRGLkUsv4ZVqv/VfAYkRsyBcgkshNvVBkRn1FEZcW0Jb+npXQWm2vHPnnOqFteZxRRGNw==", - "bin": { - "parse-github-url": "cli.js" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/parse-json": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", @@ -10321,6 +8666,7 @@ "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" } @@ -10329,6 +8675,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "devOptional": true, "engines": { "node": ">=0.10.0" } @@ -10343,6 +8690,7 @@ "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" } @@ -10356,6 +8704,7 @@ "version": "1.11.1", "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dev": true, "dependencies": { "lru-cache": "^10.2.0", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" @@ -10371,6 +8720,7 @@ "version": "10.2.2", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.2.tgz", "integrity": "sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==", + "dev": true, "engines": { "node": "14 || >=16.14" } @@ -10380,14 +8730,6 @@ "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/pathval": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.0.tgz", @@ -10990,14 +9332,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/proc-log": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-3.0.0.tgz", - "integrity": "sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A==", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, "node_modules/process": { "version": "0.11.10", "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", @@ -11032,6 +9366,7 @@ "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" } @@ -11039,7 +9374,8 @@ "node_modules/promise-inflight": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", - "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==" + "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", + "optional": true }, "node_modules/promise-polyfill": { "version": "2.1.4", @@ -11050,6 +9386,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", + "optional": true, "dependencies": { "err-code": "^2.0.2", "retry": "^0.12.0" @@ -11058,18 +9395,6 @@ "node": ">=10" } }, - "node_modules/prompts-ncu": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/prompts-ncu/-/prompts-ncu-3.0.0.tgz", - "integrity": "sha512-qyz9UxZ5MlPKWVhWrCmSZ1ahm2GVYdjLb8og2sg0IPth1KRuhcggHGuijz0e41dkx35p1t1q3GRISGH7QGALFA==", - "dependencies": { - "kleur": "^4.0.1", - "sisteransi": "^1.0.5" - }, - "engines": { - "node": ">= 14" - } - }, "node_modules/prop-types": { "version": "15.8.1", "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", @@ -11093,7 +9418,8 @@ "node_modules/proto-list": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", - "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==" + "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==", + "dev": true }, "node_modules/proxy-addr": { "version": "2.0.7", @@ -11239,20 +9565,6 @@ "node": ">=6" } }, - "node_modules/pupa": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/pupa/-/pupa-3.1.0.tgz", - "integrity": "sha512-FLpr4flz5xZTSJxSeaheeMKN/EDzMdK7b8PTOC6a5PYFKTucWbdqjgqaEyH0shFiSJrVB1+Qqi4Tk19ccU6Aug==", - "dependencies": { - "escape-goat": "^4.0.0" - }, - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/qs": { "version": "6.12.1", "resolved": "https://registry.npmjs.org/qs/-/qs-6.12.1.tgz", @@ -11297,17 +9609,6 @@ "resolved": "https://registry.npmjs.org/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz", "integrity": "sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==" }, - "node_modules/quick-lru": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", - "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/random-bytes": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/random-bytes/-/random-bytes-1.0.0.tgz", @@ -11361,38 +9662,6 @@ "rc": "cli.js" } }, - "node_modules/rc-config-loader": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/rc-config-loader/-/rc-config-loader-4.1.3.tgz", - "integrity": "sha512-kD7FqML7l800i6pS6pvLyIE2ncbk9Du8Q0gp/4hMPhJU6ZxApkoLcGD8ZeqgiAlfwZ6BlETq6qqe+12DUL207w==", - "dependencies": { - "debug": "^4.3.4", - "js-yaml": "^4.1.0", - "json5": "^2.2.2", - "require-from-string": "^2.0.2" - } - }, - "node_modules/rc-config-loader/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/rc-config-loader/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/rc/node_modules/ini": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", @@ -11412,87 +9681,6 @@ "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", "dev": true }, - "node_modules/read-package-json": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-6.0.4.tgz", - "integrity": "sha512-AEtWXYfopBj2z5N5PbkAOeNHRPUg5q+Nen7QLxV8M2zJq1ym6/lCz3fYNTCXe19puu2d06jfHhrP7v/S2PtMMw==", - "dependencies": { - "glob": "^10.2.2", - "json-parse-even-better-errors": "^3.0.0", - "normalize-package-data": "^5.0.0", - "npm-normalize-package-bin": "^3.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/read-package-json-fast": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-3.0.2.tgz", - "integrity": "sha512-0J+Msgym3vrLOUB3hzQCuZHII0xkNGCtz/HJH9xZshwv9DbDwkw1KaE3gx/e2J5rpEY5rtOy6cyhKOPrkP7FZw==", - "dependencies": { - "json-parse-even-better-errors": "^3.0.0", - "npm-normalize-package-bin": "^3.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/read-package-json/node_modules/foreground-child": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", - "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", - "dependencies": { - "cross-spawn": "^7.0.0", - "signal-exit": "^4.0.1" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/read-package-json/node_modules/glob": { - "version": "10.3.15", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.15.tgz", - "integrity": "sha512-0c6RlJt1TICLyvJYIApxb8GsXoai0KUP7AxKKAtsYXdgJR1mGEUa7DgwShbdk1nly0PYoZj01xd4hzbq3fsjpw==", - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^2.3.6", - "minimatch": "^9.0.1", - "minipass": "^7.0.4", - "path-scurry": "^1.11.0" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "engines": { - "node": ">=16 || 14 >=14.18" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/read-package-json/node_modules/minipass": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.1.tgz", - "integrity": "sha512-UZ7eQ+h8ywIRAW1hIEl2AqdwzJucU/Kp59+8kkZeSvafXhZjul247BvIJjEVFVeON6d7lM46XX1HXCduKAS8VA==", - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/read-package-json/node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/read-pkg": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", @@ -11729,31 +9917,6 @@ "node": ">=6.5.0" } }, - "node_modules/registry-auth-token": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-5.0.2.tgz", - "integrity": "sha512-o/3ikDxtXaA59BmZuZrJZDJv8NMDGSj+6j6XaeBmHw8eY1i1qd9+6H+LjVvQXx3HN6aRCGa1cUdJ9RaJZUugnQ==", - "dependencies": { - "@pnpm/npm-conf": "^2.1.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/registry-url": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-6.0.1.tgz", - "integrity": "sha512-+crtS5QjFRqFCoQmvGduwYWEBng99ZvmFvF+cUJkGYF1L1BfU8C6Zp9T7f5vPAwyLkUExpvK+ANVZmGU49qi4Q==", - "dependencies": { - "rc": "1.2.8" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/release-zalgo": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", @@ -11766,14 +9929,6 @@ "node": ">=4" } }, - "node_modules/remote-git-tags": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/remote-git-tags/-/remote-git-tags-3.0.0.tgz", - "integrity": "sha512-C9hAO4eoEsX+OXA4rla66pXZQ+TLQ8T9dttgQj18yuKlPMTVkIkdYXvlMC55IuUsIkV6DpmQYi10JKFLaU+l7w==", - "engines": { - "node": ">=8" - } - }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -11782,14 +9937,6 @@ "node": ">=0.10.0" } }, - "node_modules/require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/require-main-filename": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", @@ -11840,11 +9987,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/resolve-alpn": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", - "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==" - }, "node_modules/resolve-from": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", @@ -11854,20 +9996,6 @@ "node": ">=4" } }, - "node_modules/responselike": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-3.0.0.tgz", - "integrity": "sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==", - "dependencies": { - "lowercase-keys": "^3.0.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/restore-cursor": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", @@ -11885,6 +10013,7 @@ "version": "0.12.0", "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", + "optional": true, "engines": { "node": ">= 4" } @@ -11892,87 +10021,15 @@ "node_modules/retry-as-promised": { "version": "7.0.4", "resolved": "https://registry.npmjs.org/retry-as-promised/-/retry-as-promised-7.0.4.tgz", - "integrity": "sha512-XgmCoxKWkDofwH8WddD0w85ZfqYz+ZHlr5yo+3YUCfycWawU56T5ckWXsScsj5B8tqUcIG67DxXByo3VUgiAdA==" - }, - "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/rimraf": { - "version": "5.0.7", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.7.tgz", - "integrity": "sha512-nV6YcJo5wbLW77m+8KjH8aB/7/rxQy9SZ0HY5shnwULfS+9nmTtVXAJET5NdZmCzA4fPI/Hm1wo/Po/4mopOdg==", - "dependencies": { - "glob": "^10.3.7" - }, - "bin": { - "rimraf": "dist/esm/bin.mjs" - }, - "engines": { - "node": ">=14.18" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/rimraf/node_modules/foreground-child": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", - "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", - "dependencies": { - "cross-spawn": "^7.0.0", - "signal-exit": "^4.0.1" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/rimraf/node_modules/glob": { - "version": "10.3.15", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.15.tgz", - "integrity": "sha512-0c6RlJt1TICLyvJYIApxb8GsXoai0KUP7AxKKAtsYXdgJR1mGEUa7DgwShbdk1nly0PYoZj01xd4hzbq3fsjpw==", - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^2.3.6", - "minimatch": "^9.0.1", - "minipass": "^7.0.4", - "path-scurry": "^1.11.0" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "engines": { - "node": ">=16 || 14 >=14.18" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/rimraf/node_modules/minipass": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.1.tgz", - "integrity": "sha512-UZ7eQ+h8ywIRAW1hIEl2AqdwzJucU/Kp59+8kkZeSvafXhZjul247BvIJjEVFVeON6d7lM46XX1HXCduKAS8VA==", - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/rimraf/node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "integrity": "sha512-XgmCoxKWkDofwH8WddD0w85ZfqYz+ZHlr5yo+3YUCfycWawU56T5ckWXsScsj5B8tqUcIG67DxXByo3VUgiAdA==" + }, + "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": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "iojs": ">=1.0.0", + "node": ">=0.10.0" } }, "node_modules/roarr": { @@ -12133,25 +10190,6 @@ "integrity": "sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==", "dev": true }, - "node_modules/semver-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-4.0.0.tgz", - "integrity": "sha512-0Ju4+6A8iOnpL/Thra7dZsSlOHYAHIeMxfhWQRI1/VLcT3WDBZKKtQt/QkBOsiIN9ZpuvHE6cGZ0x4glCMmfiA==", - "dependencies": { - "semver": "^7.3.5" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/semver-utils": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/semver-utils/-/semver-utils-1.1.4.tgz", - "integrity": "sha512-EjnoLE5OGmDAVV/8YDoN5KiajNadjzIp9BAHOhYeQHt7j0UWxjmgsx4YD48wp4Ue1Qogq38F1GNUJNqF1kKKxA==" - }, "node_modules/semver/node_modules/lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", @@ -12424,7 +10462,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==", + "devOptional": true }, "node_modules/set-function-length": { "version": "1.2.2", @@ -12471,6 +10510,7 @@ "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" }, @@ -12482,6 +10522,7 @@ "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" } @@ -12508,24 +10549,6 @@ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" }, - "node_modules/sigstore": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/sigstore/-/sigstore-1.9.0.tgz", - "integrity": "sha512-0Zjz0oe37d08VeOtBIuB6cRriqXse2e8w+7yIy2XSXjshRKxbc2KkhXjL229jXSxEm7UbcjS76wcJDGQddVI9A==", - "dependencies": { - "@sigstore/bundle": "^1.1.0", - "@sigstore/protobuf-specs": "^0.2.0", - "@sigstore/sign": "^1.0.0", - "@sigstore/tuf": "^1.0.3", - "make-fetch-happen": "^11.0.1" - }, - "bin": { - "sigstore": "bin/sigstore.js" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, "node_modules/simple-concat": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", @@ -12606,19 +10629,6 @@ "node": ">=0.3.1" } }, - "node_modules/sisteransi": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==" - }, - "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/slice-ansi": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-1.0.0.tgz", @@ -12644,6 +10654,7 @@ "version": "4.2.0", "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "optional": true, "engines": { "node": ">= 6.0.0", "npm": ">= 3.0.0" @@ -12670,6 +10681,7 @@ "version": "2.8.3", "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.3.tgz", "integrity": "sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==", + "optional": true, "dependencies": { "ip-address": "^9.0.5", "smart-buffer": "^4.2.0" @@ -12679,40 +10691,6 @@ "npm": ">= 3.0.0" } }, - "node_modules/socks-proxy-agent": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz", - "integrity": "sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==", - "dependencies": { - "agent-base": "^6.0.2", - "debug": "^4.3.3", - "socks": "^2.6.2" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/socks-proxy-agent/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/socks-proxy-agent/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/sonic-boom": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-4.0.1.tgz", @@ -12725,30 +10703,11 @@ "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "devOptional": true, "engines": { "node": ">=0.10.0" } }, - "node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/spawn-please": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/spawn-please/-/spawn-please-2.0.2.tgz", - "integrity": "sha512-KM8coezO6ISQ89c1BzyWNtcn2V2kAVtwIXd3cN/V5a0xPYc1F/vydrRc01wsKFEQ/p+V1a4sw4z2yMITIXrgGw==", - "dependencies": { - "cross-spawn": "^7.0.3" - }, - "engines": { - "node": ">=14" - } - }, "node_modules/spawn-wrap": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-2.0.0.tgz", @@ -12827,6 +10786,7 @@ "version": "3.2.0", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", + "dev": true, "dependencies": { "spdx-expression-parse": "^3.0.0", "spdx-license-ids": "^3.0.0" @@ -12835,12 +10795,14 @@ "node_modules/spdx-exceptions": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", - "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==" + "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", + "dev": true }, "node_modules/spdx-expression-parse": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, "dependencies": { "spdx-exceptions": "^2.1.0", "spdx-license-ids": "^3.0.0" @@ -12849,7 +10811,8 @@ "node_modules/spdx-license-ids": { "version": "3.0.17", "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.17.tgz", - "integrity": "sha512-sh8PWc/ftMqAAdFiBu6Fy6JUOYjqDJBJvIhpfDMyHrr0Rbp5liZqd4TjtQ/RgfLjKFZb+LMx5hpml5qOWy0qvg==" + "integrity": "sha512-sh8PWc/ftMqAAdFiBu6Fy6JUOYjqDJBJvIhpfDMyHrr0Rbp5liZqd4TjtQ/RgfLjKFZb+LMx5hpml5qOWy0qvg==", + "dev": true }, "node_modules/split2": { "version": "4.2.0", @@ -12862,7 +10825,8 @@ "node_modules/sprintf-js": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", - "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==" + "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", + "devOptional": true }, "node_modules/sqlite3": { "version": "5.1.7", @@ -13257,25 +11221,6 @@ "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==", "dev": true }, - "node_modules/ssri": { - "version": "10.0.6", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.6.tgz", - "integrity": "sha512-MGrFH9Z4NP9Iyhqn16sDtBpRRNJ0Y2hNa6D65h736fVSaPCHr4DM4sWUNvVaSuC+0OBGhwsrydQwmgfg5LncqQ==", - "dependencies": { - "minipass": "^7.0.3" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/ssri/node_modules/minipass": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.1.tgz", - "integrity": "sha512-UZ7eQ+h8ywIRAW1hIEl2AqdwzJucU/Kp59+8kkZeSvafXhZjul247BvIJjEVFVeON6d7lM46XX1HXCduKAS8VA==", - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, "node_modules/stack-trace": { "version": "0.0.9", "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.9.tgz", @@ -13966,6 +11911,7 @@ "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -14040,6 +11986,7 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, "dependencies": { "ansi-regex": "^5.0.1" }, @@ -14651,40 +12598,6 @@ "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", "optional": true }, - "node_modules/tuf-js": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/tuf-js/-/tuf-js-1.1.7.tgz", - "integrity": "sha512-i3P9Kgw3ytjELUfpuKVDNBJvk4u5bXL6gskv572mcevPbSKCV3zt3djhmlEQ65yERjIbOSncy7U4cQJaB1CBCg==", - "dependencies": { - "@tufjs/models": "1.0.4", - "debug": "^4.3.4", - "make-fetch-happen": "^11.1.1" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/tuf-js/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/tuf-js/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/tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", @@ -14832,6 +12745,7 @@ "version": "3.1.5", "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "dev": true, "dependencies": { "is-typedarray": "^1.0.0" } @@ -14925,42 +12839,6 @@ "integrity": "sha512-Gw+zz50YNKPDKXs+9d+aKAjVwpjNwqzvNpLigIruT4HA9lMZNdMqs9x07kKHB/L9WRzqp4+DlTU5s4wG2esdoA==", "dev": true }, - "node_modules/unique-filename": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-3.0.0.tgz", - "integrity": "sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g==", - "dependencies": { - "unique-slug": "^4.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/unique-slug": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-4.0.0.tgz", - "integrity": "sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ==", - "dependencies": { - "imurmurhash": "^0.1.4" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/unique-string": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-3.0.0.tgz", - "integrity": "sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ==", - "dependencies": { - "crypto-random-string": "^4.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/universalify": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", @@ -14978,14 +12856,6 @@ "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==", - "engines": { - "node": ">=8" - } - }, "node_modules/update-browserslist-db": { "version": "1.0.16", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.16.tgz", @@ -15016,44 +12886,6 @@ "browserslist": ">= 4.21.0" } }, - "node_modules/update-notifier": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-6.0.2.tgz", - "integrity": "sha512-EDxhTEVPZZRLWYcJ4ZXjGFN0oP7qYvbXWzEgRm/Yql4dHX5wDbvh89YHP6PK1lzZJYrMtXUuZZz8XGK+U6U1og==", - "dependencies": { - "boxen": "^7.0.0", - "chalk": "^5.0.1", - "configstore": "^6.0.0", - "has-yarn": "^3.0.0", - "import-lazy": "^4.0.0", - "is-ci": "^3.0.1", - "is-installed-globally": "^0.4.0", - "is-npm": "^6.0.0", - "is-yarn-global": "^0.4.0", - "latest-version": "^7.0.0", - "pupa": "^3.1.0", - "semver": "^7.3.7", - "semver-diff": "^4.0.0", - "xdg-basedir": "^5.1.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/yeoman/update-notifier?sponsor=1" - } - }, - "node_modules/update-notifier/node_modules/chalk": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", - "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, "node_modules/uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", @@ -15129,19 +12961,12 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, "dependencies": { "spdx-correct": "^3.0.0", "spdx-expression-parse": "^3.0.0" } }, - "node_modules/validate-npm-package-name": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-5.0.1.tgz", - "integrity": "sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, "node_modules/validator": { "version": "13.12.0", "resolved": "https://registry.npmjs.org/validator/-/validator-13.12.0.tgz", @@ -15182,6 +13007,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "devOptional": true, "dependencies": { "isexe": "^2.0.0" }, @@ -15237,70 +13063,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==", + "optional": true, "dependencies": { "string-width": "^1.0.2 || 2 || 3 || 4" } }, - "node_modules/widest-line": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-4.0.1.tgz", - "integrity": "sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==", - "dependencies": { - "string-width": "^5.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/widest-line/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==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/widest-line/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==" - }, - "node_modules/widest-line/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==", - "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/widest-line/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==", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, "node_modules/wkx": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/wkx/-/wkx-0.5.0.tgz", @@ -15342,6 +13109,7 @@ "version": "8.1.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, "dependencies": { "ansi-styles": "^6.1.0", "string-width": "^5.0.1", @@ -15359,6 +13127,7 @@ "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", @@ -15375,6 +13144,7 @@ "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" }, @@ -15386,6 +13156,7 @@ "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" }, @@ -15396,12 +13167,14 @@ "node_modules/wrap-ansi/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==" + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true }, "node_modules/wrap-ansi/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", @@ -15418,6 +13191,7 @@ "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" }, @@ -15449,6 +13223,7 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "dev": true, "dependencies": { "imurmurhash": "^0.1.4", "is-typedarray": "^1.0.0", @@ -15468,17 +13243,6 @@ "mkdirp": "bin/cmd.js" } }, - "node_modules/xdg-basedir": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-5.1.0.tgz", - "integrity": "sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/xml": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/xml/-/xml-1.0.1.tgz", @@ -15615,6 +13379,7 @@ "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" }, diff --git a/package.json b/package.json index fabd41db8..2461822b4 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@datasance/iofogcontroller", - "version": "3.2.1-beta1", + "version": "3.2.1-beta2", "description": "ioFog Controller project for Eclipse IoFog @ iofog.org \\nCopyright (c) 2023 Datasance Teknoloji A.S.", "main": "./src/main.js", "author": "Emirhan Durmus", @@ -57,8 +57,8 @@ "iofog-controller": "src/main.js" }, "dependencies": { - "@datasance/ecn-viewer": "0.1.6", - "axios": "1.6.8", + "@datasance/ecn-viewer": "0.1.7", + "axios": "1.7.2", "body-parser": "^1.20.2", "child_process": "1.0.2", "command-line-args": "5.2.1", @@ -78,16 +78,15 @@ "is-elevated": "3.0.0", "js-yaml": "4.1.0", "jsonschema": "1.4.1", - "keycloak-connect": "24.0.4", + "keycloak-connect": "25.0.1", "minimatch": "9.0.4", "moment": "2.30.1", "moment-timezone": "0.5.45", "morgan": "1.10.0", "multer": "1.4.5-lts.1", - "mysql2": "3.9.8", + "mysql2": "3.10.1", "nconf": "0.12.1", "node-fetch-npm": "^2.0.4", - "npm-check-updates": "^16.14.20", "os": "0.1.2", "path": "0.12.7", "pino": "9.1.0", @@ -111,7 +110,7 @@ "chai-http": "4.4.0", "eslint": "9.2.0", "eslint-config-google": "0.14.0", - "mocha": "10.4.0", + "mocha": "10.5.2", "mocha-junit-reporter": "2.2.1", "newman": "6.1.2", "newman-reporter-junitfull": "1.1.1", From 843bab79478a2bc47ab8c5b3b5ff1c4ef5b6ab5d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emirhan=20Durmu=C5=9F?= Date: Tue, 2 Jul 2024 21:13:59 +0300 Subject: [PATCH 101/178] package version updated --- package.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index 2461822b4..fb55b8351 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@datasance/iofogcontroller", - "version": "3.2.1-beta2", + "version": "3.2.2-beta", "description": "ioFog Controller project for Eclipse IoFog @ iofog.org \\nCopyright (c) 2023 Datasance Teknoloji A.S.", "main": "./src/main.js", "author": "Emirhan Durmus", @@ -57,7 +57,7 @@ "iofog-controller": "src/main.js" }, "dependencies": { - "@datasance/ecn-viewer": "0.1.7", + "@datasance/ecn-viewer": "0.1.8", "axios": "1.7.2", "body-parser": "^1.20.2", "child_process": "1.0.2", @@ -110,7 +110,7 @@ "chai-http": "4.4.0", "eslint": "9.2.0", "eslint-config-google": "0.14.0", - "mocha": "10.5.2", + "mocha": "10.6.0", "mocha-junit-reporter": "2.2.1", "newman": "6.1.2", "newman-reporter-junitfull": "1.1.1", From 96f4f9e4ec806f0f5570fb5e3224d76de36a38dc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emirhan=20Durmu=C5=9F?= Date: Tue, 2 Jul 2024 21:18:56 +0300 Subject: [PATCH 102/178] version naming fixed --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index fb55b8351..faf979cbc 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@datasance/iofogcontroller", - "version": "3.2.2-beta", + "version": "3.2.1-beta3", "description": "ioFog Controller project for Eclipse IoFog @ iofog.org \\nCopyright (c) 2023 Datasance Teknoloji A.S.", "main": "./src/main.js", "author": "Emirhan Durmus", From 82c149d2575686e8a1e86987dc2526a23f462dcb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emirhan=20Durmu=C5=9F?= Date: Sat, 13 Jul 2024 19:36:24 +0300 Subject: [PATCH 103/178] router and proxy created as a system application --- docs/swagger.json | 254 +++++++++++++++++ docs/swagger.yaml | 244 ++++++++++++++++ package.json | 2 +- src/controllers/application-controller.js | 12 + src/controllers/microservices-controller.js | 38 +++ src/data/managers/microservice-manager.js | 13 + src/routes/application.js | 60 ++++ src/routes/microservices.js | 177 ++++++++++++ src/services/application-service.js | 36 ++- src/services/iofog-service.js | 2 + src/services/microservice-ports/default.js | 42 ++- src/services/microservice-ports/proxy.js | 2 +- src/services/microservices-service.js | 301 +++++++++++++++++++- src/services/router-service.js | 17 +- 14 files changed, 1184 insertions(+), 16 deletions(-) diff --git a/docs/swagger.json b/docs/swagger.json index bcf2f19d2..9f2bccfca 100644 --- a/docs/swagger.json +++ b/docs/swagger.json @@ -488,6 +488,71 @@ } } }, + "/application/system" : { + "get" : { + "tags" : [ "Application" ], + "summary" : "Lists all system applications", + "operationId" : "listSystemApplication", + "parameters" : [ ], + "security" : [ { + "userToken" : [ ] + } ], + "responses" : { + "200" : { + "description" : "Success", + "headers" : { + "X-Timestamp" : { + "description" : "FogController server timestamp" + } + } + }, + "400" : { + "description" : "Bad Request" + }, + "404" : { + "description" : "Not Found" + }, + "500" : { + "description" : "Internal Server Error" + } + } + } + }, + "/application/system/{name}" : { + "delete" : { + "tags" : [ "Application" ], + "summary" : "Deletes a system application", + "operationId" : "deleteSystemApplication", + "parameters" : [ { + "name" : "name", + "in" : "path", + "description" : "Application name", + "required" : true + } ], + "security" : [ { + "userToken" : [ ] + } ], + "responses" : { + "204" : { + "description" : "Success", + "headers" : { + "X-Timestamp" : { + "description" : "FogController server timestamp" + } + } + }, + "400" : { + "description" : "Bad Request" + }, + "404" : { + "description" : "Not Found" + }, + "500" : { + "description" : "Internal Server Error" + } + } + } + }, "/application/yaml" : { "post" : { "tags" : [ "Application" ], @@ -1750,6 +1815,36 @@ "description" : "Internal Server Error" } } + }, + "patch" : { + "tags" : [ "Microservices" ], + "summary" : "Updates a microservice", + "operationId" : "updateMicroservice", + "parameters" : [ { + "name" : "uuid", + "in" : "path", + "description" : "Microservice Uuid", + "required" : true + } ], + "security" : [ { + "userToken" : [ ] + } ] + } + }, + "/microservices/system/{uuid}\"" : { + "patch" : { + "tags" : [ "Microservices" ], + "summary" : "Updates a system microservice", + "operationId" : "updateSystemMicroservice", + "parameters" : [ { + "name" : "uuid", + "in" : "path", + "description" : "Microservice Uuid", + "required" : true + } ], + "security" : [ { + "userToken" : [ ] + } ] } }, "/microservices/yaml/{uuid}" : { @@ -1864,6 +1959,44 @@ } } }, + "/microservices/system/{uuid}/port-mapping" : { + "post" : { + "tags" : [ "Microservices" ], + "summary" : "Creates a port mapping for system microservice", + "operationId" : "createSystemMicroservicePortMapping", + "parameters" : [ { + "name" : "uuid", + "in" : "path", + "description" : "Microservice Uuid", + "required" : true + } ], + "security" : [ { + "userToken" : [ ] + } ], + "responses" : { + "201" : { + "description" : "Created", + "headers" : { + "X-Timestamp" : { + "description" : "FogController server timestamp" + } + } + }, + "400" : { + "description" : "Not Valid" + }, + "401" : { + "description" : "Not Authorized" + }, + "404" : { + "description" : "Not Found" + }, + "500" : { + "description" : "Internal Server Error" + } + } + } + }, "/microservices/{uuid}/port-mapping/{internalPort}" : { "delete" : { "tags" : [ "Microservices" ], @@ -1904,6 +2037,46 @@ } } }, + "/microservices/system/{uuid}/port-mapping/{internalPort}" : { + "delete" : { + "tags" : [ "Microservices" ], + "summary" : "Deletes a port mapping for system microservice", + "operationId" : "deleteSystemMicroservicePortMapping", + "parameters" : [ { + "name" : "uuid", + "in" : "path", + "description" : "Microservice Uuid", + "required" : true + }, { + "name" : "internalPort", + "in" : "path", + "description" : "Internal Port", + "required" : true + } ], + "security" : [ { + "userToken" : [ ] + } ], + "responses" : { + "204" : { + "description" : "Success", + "headers" : { + "X-Timestamp" : { + "description" : "FogController server timestamp" + } + } + }, + "401" : { + "description" : "Not Authorized" + }, + "404" : { + "description" : "Not Found" + }, + "500" : { + "description" : "Internal Server Error" + } + } + } + }, "/microservices/{uuid}/volume-mapping" : { "get" : { "tags" : [ "Microservices" ], @@ -1975,6 +2148,44 @@ } } }, + "/microservices/system/{uuid}/volume-mapping" : { + "post" : { + "tags" : [ "Microservices" ], + "summary" : "Creates a volume mapping for system microservice", + "operationId" : "createSystemMicroserviceVolumeMapping", + "parameters" : [ { + "name" : "uuid", + "in" : "path", + "description" : "Microservice Uuid", + "required" : true + } ], + "security" : [ { + "userToken" : [ ] + } ], + "responses" : { + "201" : { + "description" : "Created", + "headers" : { + "X-Timestamp" : { + "description" : "FogController server timestamp" + } + } + }, + "400" : { + "description" : "Not Valid" + }, + "401" : { + "description" : "Not Authorized" + }, + "404" : { + "description" : "Not Found" + }, + "500" : { + "description" : "Internal Server Error" + } + } + } + }, "/microservices/{uuid}/volume-mapping/{id}" : { "delete" : { "tags" : [ "Microservices" ], @@ -2018,6 +2229,49 @@ } } }, + "/microservices/system/{uuid}/volume-mapping/{id}" : { + "delete" : { + "tags" : [ "Microservices" ], + "summary" : "Deletes a volume mapping for system microservice", + "operationId" : "deleteSystemMicroserviceVolumeMapping", + "parameters" : [ { + "name" : "uuid", + "in" : "path", + "description" : "Microservice Uuid", + "required" : true + }, { + "name" : "id", + "in" : "path", + "description" : "Volume id", + "required" : true + } ], + "security" : [ { + "userToken" : [ ] + } ], + "responses" : { + "204" : { + "description" : "Success", + "headers" : { + "X-Timestamp" : { + "description" : "FogController server timestamp" + } + } + }, + "400" : { + "description" : "Not Valid" + }, + "401" : { + "description" : "Not Authorized" + }, + "404" : { + "description" : "Not Found" + }, + "500" : { + "description" : "Internal Server Error" + } + } + } + }, "/microservices/{uuid}/image-snapshot" : { "get" : { "tags" : [ "Diagnostics" ], diff --git a/docs/swagger.yaml b/docs/swagger.yaml index 4784938ce..3bda22b4b 100755 --- a/docs/swagger.yaml +++ b/docs/swagger.yaml @@ -409,6 +409,62 @@ paths: description: Not Found "500": description: Internal Server Error + /application/system: + get: + tags: + - Application + summary: Lists all system applications + operationId: listSystemApplication + security: + - userToken: [] + responses: + "200": + description: Success + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + content: + application/json: + schema: + $ref: "#/components/schemas/ApplicationListResponse" + "400": + description: Bad Request + "404": + description: Not Found + "500": + description: Internal Server Error + /application/system/{name}: + delete: + tags: + - Application + summary: Deletes a system application + operationId: deleteSystemApplication + parameters: + - in: path + name: name + description: Application name + required: true + schema: + type: string + security: + - userToken: [] + responses: + "204": + description: Success + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + "400": + description: Bad Request + "404": + description: Not Found + "500": + description: Internal Server Error + /application/yaml: post: tags: @@ -1613,6 +1669,35 @@ paths: description: Not Found "500": description: Internal Server Error + patch: + tags: + - Microservices + summary: Updates a microservice + operationId: updateMicroservice + parameters: + - in: path + name: uuid + description: Microservice Uuid + required: true + schema: + type: string + security: + - userToken: [] + /microservices/system/{uuid}": + patch: + tags: + - Microservices + summary: Updates a system microservice + operationId: updateSystemMicroservice + parameters: + - in: path + name: uuid + description: Microservice Uuid + required: true + schema: + type: string + security: + - userToken: [] /microservices/yaml/{uuid}: patch: tags: @@ -1730,6 +1815,48 @@ paths: description: Not Found "500": description: Internal Server Error + /microservices/system/{uuid}/port-mapping: + post: + tags: + - Microservices + summary: Creates a port mapping for system microservice + operationId: createSystemMicroservicePortMapping + parameters: + - in: path + name: uuid + description: Microservice Uuid + required: true + schema: + type: string + security: + - userToken: [] + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/PortMappingsRequest" + description: information about port mapping + required: true + responses: + "201": + description: Created + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + content: + application/json: + schema: + $ref: "#/components/schemas/PortMappingsPublicResponse" + "400": + description: Not Valid + "401": + description: Not Authorized + "404": + description: Not Found + "500": + description: Internal Server Error "/microservices/{uuid}/port-mapping/{internalPort}": delete: tags: @@ -1765,6 +1892,41 @@ paths: description: Not Found "500": description: Internal Server Error + /microservices/system/{uuid}/port-mapping/{internalPort}: + delete: + tags: + - Microservices + summary: Deletes a port mapping for system microservice + operationId: deleteSystemMicroservicePortMapping + parameters: + - in: path + name: uuid + description: Microservice Uuid + required: true + schema: + type: string + - in: path + name: internalPort + description: Internal Port + required: true + schema: + type: string + security: + - userToken: [] + responses: + "204": + description: Success + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + "401": + description: Not Authorized + "404": + description: Not Found + "500": + description: Internal Server Error "/microservices/{uuid}/volume-mapping": post: tags: @@ -1842,6 +2004,51 @@ paths: description: Not Found "500": description: Internal Server Error + "/microservices/system/{uuid}/volume-mapping": + post: + tags: + - Microservices + summary: Creates a volume mapping for system microservice + operationId: createSystemMicroserviceVolumeMapping + parameters: + - in: path + name: uuid + description: Microservice Uuid + required: true + schema: + type: string + security: + - userToken: [] + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/VolumeMapping" + description: information about volume mapping + required: true + responses: + "201": + description: Created + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + content: + application/json: + schema: + type: object + properties: + id: + type: number + "400": + description: Not Valid + "401": + description: Not Authorized + "404": + description: Not Found + "500": + description: Internal Server Error "/microservices/{uuid}/volume-mapping/{id}": delete: tags: @@ -1879,6 +2086,43 @@ paths: description: Not Found "500": description: Internal Server Error + "/microservices/system/{uuid}/volume-mapping/{id}": + delete: + tags: + - Microservices + summary: Deletes a volume mapping for system microservice + operationId: deleteSystemMicroserviceVolumeMapping + parameters: + - in: path + name: uuid + description: Microservice Uuid + required: true + schema: + type: string + - in: path + name: id + description: Volume id + required: true + schema: + type: string + security: + - userToken: [] + responses: + "204": + description: Success + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + "400": + description: Not Valid + "401": + description: Not Authorized + "404": + description: Not Found + "500": + description: Internal Server Error "/microservices/{uuid}/image-snapshot": post: tags: diff --git a/package.json b/package.json index faf979cbc..b11c3b331 100644 --- a/package.json +++ b/package.json @@ -57,7 +57,7 @@ "iofog-controller": "src/main.js" }, "dependencies": { - "@datasance/ecn-viewer": "0.1.8", + "@datasance/ecn-viewer": "0.1.9", "axios": "1.7.2", "body-parser": "^1.20.2", "child_process": "1.0.2", diff --git a/src/controllers/application-controller.js b/src/controllers/application-controller.js index 15676b7da..a0dc79bba 100644 --- a/src/controllers/application-controller.js +++ b/src/controllers/application-controller.js @@ -38,6 +38,10 @@ const getApplicationsByUserEndPoint = async function (req) { return ApplicationService.getUserApplicationsEndPoint(false) } +const getApplicationsBySystemEndPoint = async function (req) { + return ApplicationService.getSystemApplicationsEndPoint(false) +} + const getApplicationEndPoint = async function (req) { const name = req.params.name @@ -77,6 +81,12 @@ const deleteApplicationEndPoint = async function (req) { return ApplicationService.deleteApplicationEndPoint({ name }, false) } +const deleteSystemApplicationEndPoint = async function (req) { + const name = req.params.name + + return ApplicationService.deleteSystemApplicationEndPoint({ name }, false) +} + // Legacy const deleteApplicationByIdEndPoint = async function (req) { @@ -103,6 +113,7 @@ module.exports = { createApplicationEndPoint: (createApplicationEndPoint), createApplicationYAMLEndPoint: (createApplicationYAMLEndPoint), getApplicationsByUserEndPoint: (getApplicationsByUserEndPoint), + getApplicationsBySystemEndPoint: (getApplicationsBySystemEndPoint), getApplicationEndPoint: (getApplicationEndPoint), getApplicationByIdEndPoint: (getApplicationByIdEndPoint), updateApplicationEndPoint: (updateApplicationEndPoint), @@ -110,5 +121,6 @@ module.exports = { patchApplicationEndPoint: (patchApplicationEndPoint), patchApplicationByIdEndPoint: (patchApplicationByIdEndPoint), deleteApplicationEndPoint: (deleteApplicationEndPoint), + deleteSystemApplicationEndPoint: (deleteSystemApplicationEndPoint), deleteApplicationByIdEndPoint: (deleteApplicationByIdEndPoint) } diff --git a/src/controllers/microservices-controller.js b/src/controllers/microservices-controller.js index 367c3003e..98315be9a 100644 --- a/src/controllers/microservices-controller.js +++ b/src/controllers/microservices-controller.js @@ -38,6 +38,12 @@ const updateMicroserviceEndPoint = async function (req) { return MicroservicesService.updateMicroserviceEndPoint(microserviceUuid, microservice, false) } +const updateSystemMicroserviceEndPoint = async function (req) { + const microservice = req.body + const microserviceUuid = req.params.uuid + return MicroservicesService.updateSystemMicroserviceEndPoint(microserviceUuid, microservice, false) +} + const updateMicroserviceYAMLEndPoint = async function (req) { const microserviceUuid = req.params.uuid const fileContent = req.file.buffer.toString() @@ -78,12 +84,24 @@ const createMicroservicePortMappingEndPoint = async function (req) { return MicroservicesService.createPortMappingEndPoint(uuid, portMappingData, false) } +const createSystemMicroservicePortMappingEndPoint = async function (req) { + const uuid = req.params.uuid + const portMappingData = req.body + return MicroservicesService.createSystemPortMappingEndPoint(uuid, portMappingData, false) +} + const deleteMicroservicePortMappingEndPoint = async function (req) { const uuid = req.params.uuid const internalPort = req.params.internalPort return MicroservicesService.deletePortMappingEndPoint(uuid, internalPort, false) } +const deleteSystemMicroservicePortMappingEndPoint = async function (req) { + const uuid = req.params.uuid + const internalPort = req.params.internalPort + return MicroservicesService.deleteSystemPortMappingEndPoint(uuid, internalPort, false) +} + const listMicroservicePortMappingsEndPoint = async function (req) { const uuid = req.params.uuid const ports = await MicroservicesService.listMicroservicePortMappingsEndPoint(uuid, false) @@ -101,6 +119,15 @@ const createMicroserviceVolumeMappingEndPoint = async function (req) { } } +const createSystemMicroserviceVolumeMappingEndPoint = async function (req) { + const microserviceUuid = req.params.uuid + const volumeMappingData = req.body + const volumeMapping = await MicroservicesService.createSystemVolumeMappingEndPoint(microserviceUuid, volumeMappingData, false) + return { + id: volumeMapping.id + } +} + const listMicroserviceVolumeMappingsEndPoint = async function (req) { const uuid = req.params.uuid const volumeMappings = await MicroservicesService.listVolumeMappingsEndPoint(uuid, false) @@ -115,6 +142,12 @@ const deleteMicroserviceVolumeMappingEndPoint = async function (req) { return MicroservicesService.deleteVolumeMappingEndPoint(uuid, id, false) } +const deleteSystemMicroserviceVolumeMappingEndPoint = async function (req) { + const uuid = req.params.uuid + const id = req.params.id + return MicroservicesService.deleteSystemVolumeMappingEndPoint(uuid, id, false) +} + const listAllPublicPortsEndPoint = async function (req) { return MicroservicesService.listAllPublicPortsEndPoint() } @@ -123,16 +156,21 @@ module.exports = { createMicroserviceOnFogEndPoint: (createMicroserviceOnFogEndPoint), getMicroserviceEndPoint: (getMicroserviceEndPoint), updateMicroserviceEndPoint: (updateMicroserviceEndPoint), + updateSystemMicroserviceEndPoint: (updateSystemMicroserviceEndPoint), deleteMicroserviceEndPoint: (deleteMicroserviceEndPoint), getMicroservicesByApplicationEndPoint: (getMicroservicesByApplicationEndPoint), createMicroserviceRouteEndPoint: (createMicroserviceRouteEndPoint), deleteMicroserviceRouteEndPoint: (deleteMicroserviceRouteEndPoint), createMicroservicePortMappingEndPoint: (createMicroservicePortMappingEndPoint), + createSystemMicroservicePortMappingEndPoint: (createSystemMicroservicePortMappingEndPoint), deleteMicroservicePortMappingEndPoint: (deleteMicroservicePortMappingEndPoint), + deleteSystemMicroservicePortMappingEndPoint: (deleteSystemMicroservicePortMappingEndPoint), getMicroservicePortMappingListEndPoint: (listMicroservicePortMappingsEndPoint), createMicroserviceVolumeMappingEndPoint: (createMicroserviceVolumeMappingEndPoint), + createSystemMicroserviceVolumeMappingEndPoint: (createSystemMicroserviceVolumeMappingEndPoint), listMicroserviceVolumeMappingsEndPoint: (listMicroserviceVolumeMappingsEndPoint), deleteMicroserviceVolumeMappingEndPoint: (deleteMicroserviceVolumeMappingEndPoint), + deleteSystemMicroserviceVolumeMappingEndPoint: (deleteSystemMicroserviceVolumeMappingEndPoint), listAllPublicPortsEndPoint: (listAllPublicPortsEndPoint), createMicroserviceYAMLEndPoint: (createMicroserviceYAMLEndPoint), updateMicroserviceYAMLEndPoint: (updateMicroserviceYAMLEndPoint) diff --git a/src/data/managers/microservice-manager.js b/src/data/managers/microservice-manager.js index 1c8b1465c..47316fe54 100644 --- a/src/data/managers/microservice-manager.js +++ b/src/data/managers/microservice-manager.js @@ -346,6 +346,9 @@ class MicroserviceManager extends BaseManager { model: Application, as: 'application', required: true, + where: { + isSystem: false + }, attributes: ['id'] } ], @@ -366,6 +369,16 @@ class MicroserviceManager extends BaseManager { async findAllExcludeFields (where, transaction) { return Microservice.findAll({ + include: [ + { + model: Application, + as: 'application', + required: true, + where: { + isSystem: false + } + } + ], where: where, order: [ [ 'name', 'ASC' ] ], attributes: { diff --git a/src/routes/application.js b/src/routes/application.js index 89da63f85..437e46087 100644 --- a/src/routes/application.js +++ b/src/routes/application.js @@ -46,6 +46,34 @@ module.exports = [ }) } }, + { + method: 'get', + path: '/api/v1/application/system', + middleware: async (req, res) => { + logger.apiReq(req) + + const successCode = constants.HTTP_CODE_SUCCESS + const errorCodes = [ + { + code: constants.HTTP_CODE_UNAUTHORIZED, + errors: [Errors.AuthenticationError] + } + ] + + const getApplicationsBySystemEndPoint = ResponseDecorator.handleErrors(ApplicationController.getApplicationsBySystemEndPoint, successCode, errorCodes) + + // Add keycloak.protect() middleware to protect the route + await keycloak.protect(['SRE', 'Developer', 'Viewer'])(req, res, async () => { + const responseObject = await getApplicationsBySystemEndPoint(req) + const user = req.kauth.grant.access_token.content.preferred_username + res + .status(responseObject.code) + .send(responseObject.body) + + logger.apiRes({ req: req, user: user, res: responseObject }) + }) + } + }, { method: 'post', path: '/api/v1/application', @@ -284,6 +312,38 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) + logger.apiRes({ req: req, user: user, res: responseObject }) + }) + } + }, + { + method: 'delete', + path: '/api/v1/application/system/:name', + middleware: async (req, res) => { + logger.apiReq(req) + + const successCode = constants.HTTP_CODE_NO_CONTENT + const errorCodes = [ + { + code: constants.HTTP_CODE_UNAUTHORIZED, + errors: [Errors.AuthenticationError] + }, + { + code: constants.HTTP_CODE_NOT_FOUND, + errors: [Errors.NotFoundError] + } + ] + + const deleteSystemApplicationEndPoint = ResponseDecorator.handleErrors(ApplicationController.deleteSystemApplicationEndPoint, successCode, errorCodes) + + // Add keycloak.protect() middleware to protect the route + await keycloak.protect(['SRE'])(req, res, async () => { + const responseObject = await deleteSystemApplicationEndPoint(req) + const user = req.kauth.grant.access_token.content.preferred_username + res + .status(responseObject.code) + .send(responseObject.body) + logger.apiRes({ req: req, user: user, res: responseObject }) }) } diff --git a/src/routes/microservices.js b/src/routes/microservices.js index 0afc010fb..b3e33ab20 100644 --- a/src/routes/microservices.js +++ b/src/routes/microservices.js @@ -207,7 +207,42 @@ module.exports = [ }) } }, + { + method: 'patch', + path: '/api/v1/microservices/system/:uuid', + supportSubstitution: true, + middleware: async (req, res) => { + logger.apiReq(req) + const successCode = constants.HTTP_CODE_NO_CONTENT + const errorCodes = [ + { + code: constants.HTTP_CODE_BAD_REQUEST, + errors: [Errors.ValidationError] + }, + { + code: constants.HTTP_CODE_UNAUTHORIZED, + errors: [Errors.AuthenticationError] + }, + { + code: constants.HTTP_CODE_NOT_FOUND, + errors: [Errors.NotFoundError] + } + ] + + await keycloak.protect(['SRE'])(req, res, async () => { + const updateSystemMicroserviceEndPoint = ResponseDecorator.handleErrors(MicroservicesController.updateSystemMicroserviceEndPoint, + successCode, errorCodes) + const responseObject = await updateSystemMicroserviceEndPoint(req) + const user = req.kauth.grant.access_token.content.preferred_username + res + .status(responseObject.code) + .send(responseObject.body) + + logger.apiRes({ req: req, user: user, res: responseObject }) + }) + } + }, { method: 'patch', path: '/api/v1/microservices/yaml/:uuid', @@ -381,6 +416,41 @@ module.exports = [ }) } }, + { + method: 'post', + path: '/api/v1/microservices/sytem/:uuid/port-mapping', + middleware: async (req, res) => { + logger.apiReq(req) + + const successCode = constants.HTTP_CODE_CREATED + const errorCodes = [ + { + code: constants.HTTP_CODE_BAD_REQUEST, + errors: [Errors.ValidationError] + }, + { + code: constants.HTTP_CODE_UNAUTHORIZED, + errors: [Errors.AuthenticationError] + }, + { + code: constants.HTTP_CODE_NOT_FOUND, + errors: [Errors.NotFoundError] + } + ] + + await keycloak.protect(['SRE'])(req, res, async () => { + const createSystemMicroservicePortMappingEndPoint = ResponseDecorator.handleErrors( + MicroservicesController.createSystemMicroservicePortMappingEndPoint, successCode, errorCodes) + const responseObject = await createSystemMicroservicePortMappingEndPoint(req) + const user = req.kauth.grant.access_token.content.preferred_username + res + .status(responseObject.code) + .send(responseObject.body) + + logger.apiRes({ req: req, user: user, res: responseObject }) + }) + } + }, { method: 'delete', path: '/api/v1/microservices/:uuid/port-mapping/:internalPort', @@ -412,6 +482,37 @@ module.exports = [ }) } }, + { + method: 'delete', + path: '/api/v1/microservices/system/:uuid/port-mapping/:internalPort', + middleware: async (req, res) => { + logger.apiReq(req) + + const successCode = constants.HTTP_CODE_NO_CONTENT + const errorCodes = [ + { + code: constants.HTTP_CODE_UNAUTHORIZED, + errors: [Errors.AuthenticationError] + }, + { + code: constants.HTTP_CODE_NOT_FOUND, + errors: [Errors.NotFoundError] + } + ] + + await keycloak.protect(['SRE'])(req, res, async () => { + const deleteSystemMicroservicePortMapping = ResponseDecorator.handleErrors( + MicroservicesController.deleteMicroservicePortMappingEndPoint, successCode, errorCodes) + const responseObject = await deleteSystemMicroservicePortMapping(req) + const user = req.kauth.grant.access_token.content.preferred_username + res + .status(responseObject.code) + .send(responseObject.body) + + logger.apiRes({ req: req, user: user, res: responseObject }) + }) + } + }, { method: 'get', path: '/api/v1/microservices/:uuid/port-mapping', @@ -515,6 +616,44 @@ module.exports = [ }) } }, + { + method: 'post', + path: '/api/v1/microservices/system/:uuid/volume-mapping', + middleware: async (req, res) => { + logger.apiReq(req) + + const successCode = constants.HTTP_CODE_CREATED + const errorCodes = [ + { + code: constants.HTTP_CODE_BAD_REQUEST, + errors: [Errors.ValidationError] + }, + { + code: constants.HTTP_CODE_UNAUTHORIZED, + errors: [Errors.AuthenticationError] + }, + { + code: constants.HTTP_CODE_NOT_FOUND, + errors: [Errors.NotFoundError] + } + ] + + await keycloak.protect(['SRE'])(req, res, async () => { + const createSystemMicroserviceVolumeMappingEndPoint = ResponseDecorator.handleErrors( + MicroservicesController.createSystemMicroserviceVolumeMappingEndPoint, + successCode, + errorCodes + ) + const responseObject = await createSystemMicroserviceVolumeMappingEndPoint(req) + const user = req.kauth.grant.access_token.content.preferred_username + res + .status(responseObject.code) + .send(responseObject.body) + + logger.apiRes({ req: req, user: user, res: responseObject }) + }) + } + }, { method: 'delete', path: '/api/v1/microservices/:uuid/volume-mapping/:id', @@ -549,6 +688,44 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) + logger.apiRes({ req: req, user: user, res: responseObject }) + }) + } + }, + { + method: 'delete', + path: '/api/v1/microservices/system/:uuid/volume-mapping/:id', + middleware: async (req, res) => { + logger.apiReq(req) + + const successCode = constants.HTTP_CODE_NO_CONTENT + const errorCodes = [ + { + code: constants.HTTP_CODE_BAD_REQUEST, + errors: [Errors.ValidationError] + }, + { + code: constants.HTTP_CODE_UNAUTHORIZED, + errors: [Errors.AuthenticationError] + }, + { + code: constants.HTTP_CODE_NOT_FOUND, + errors: [Errors.NotFoundError] + } + ] + + await keycloak.protect(['SRE', 'Developer'])(req, res, async () => { + const deleteSystemMicroserviceVolumeMappingEndPoint = ResponseDecorator.handleErrors( + MicroservicesController.deleteSystemMicroserviceVolumeMappingEndPoint, + successCode, + errorCodes + ) + const responseObject = await deleteSystemMicroserviceVolumeMappingEndPoint(req) + const user = req.kauth.grant.access_token.content.preferred_username + res + .status(responseObject.code) + .send(responseObject.body) + logger.apiRes({ req: req, user: user, res: responseObject }) }) } diff --git a/src/services/application-service.js b/src/services/application-service.js index c337b9ec2..4b806ebc6 100644 --- a/src/services/application-service.js +++ b/src/services/application-service.js @@ -99,6 +99,23 @@ const deleteApplicationEndPoint = async function (conditions, isCLI, transaction } const where = AppHelper.deleteUndefinedFields(whereObj) + const application = await ApplicationManager.findOne({ ...conditions }, transaction) + + if (application.isSystem) { + throw new Errors.ValidationError('Cannot delete system application.') + } + + await _updateChangeTrackingsAndDeleteMicroservicesByApplicationId(conditions, true, transaction) + + await ApplicationManager.delete(where, transaction) +} + +const deleteSystemApplicationEndPoint = async function (conditions, isCLI, transaction) { + const whereObj = { + ...conditions + } + const where = AppHelper.deleteUndefinedFields(whereObj) + await _updateChangeTrackingsAndDeleteMicroservicesByApplicationId(conditions, true, transaction) await ApplicationManager.delete(where, transaction) @@ -283,6 +300,19 @@ const getUserApplicationsEndPoint = async function (isCLI, transaction) { } } +const getSystemApplicationsEndPoint = async function (isCLI, transaction) { + const application = { + isSystem: true + } + + const attributes = { exclude: ['created_at', 'updated_at'] } + const applications = await ApplicationManager.findAllPopulated(application, attributes, transaction) + + return { + applications: await Promise.all(applications.map(async (app) => _buildApplicationObject(app, transaction))) + } +} + const getAllApplicationsEndPoint = async function (isCLI, transaction) { const attributes = { exclude: ['created_at', 'updated_at'] } const applications = await ApplicationManager.findAllPopulated({}, attributes, transaction) @@ -302,8 +332,8 @@ async function _buildApplicationObject (application, transaction) { async function getApplication (conditions, isCLI, transaction) { const where = isCLI - ? { ...conditions } - : { ...conditions } + ? { ...conditions, isSystem: false } + : { ...conditions, isSystem: false } const attributes = { exclude: ['created_at', 'updated_at'] } const applicationRaw = await ApplicationManager.findOnePopulated(where, attributes, transaction) @@ -355,9 +385,11 @@ async function _updateChangeTrackingsAndDeleteMicroservicesByApplicationId (cond module.exports = { createApplicationEndPoint: TransactionDecorator.generateTransaction(createApplicationEndPoint), deleteApplicationEndPoint: TransactionDecorator.generateTransaction(deleteApplicationEndPoint), + deleteSystemApplicationEndPoint: TransactionDecorator.generateTransaction(deleteSystemApplicationEndPoint), updateApplicationEndPoint: TransactionDecorator.generateTransaction(updateApplicationEndPoint), patchApplicationEndPoint: TransactionDecorator.generateTransaction(patchApplicationEndPoint), getUserApplicationsEndPoint: TransactionDecorator.generateTransaction(getUserApplicationsEndPoint), + getSystemApplicationsEndPoint: TransactionDecorator.generateTransaction(getSystemApplicationsEndPoint), getAllApplicationsEndPoint: TransactionDecorator.generateTransaction(getAllApplicationsEndPoint), getApplicationEndPoint: TransactionDecorator.generateTransaction(getApplicationEndPoint), getApplication: getApplication diff --git a/src/services/iofog-service.js b/src/services/iofog-service.js index bc690d3cf..4a27ddb3a 100644 --- a/src/services/iofog-service.js +++ b/src/services/iofog-service.js @@ -24,6 +24,7 @@ const HWInfoManager = require('../data/managers/hw-info-manager') const USBInfoManager = require('../data/managers/usb-info-manager') const CatalogService = require('./catalog-service') const MicroserviceManager = require('../data/managers/microservice-manager') +const ApplicationManager = require('../data/managers/application-manager') const TagsManager = require('../data/managers/tags-manager') const MicroserviceService = require('./microservices-service') const EdgeResourceService = require('./edge-resource-service') @@ -352,6 +353,7 @@ async function _deleteFogRouter (fogData, transaction) { // Delete router msvc const routerCatalog = await CatalogService.getRouterCatalogItem(transaction) await MicroserviceManager.delete({ catalogItemId: routerCatalog.id, iofogUuid: fogData.uuid }, transaction) + await ApplicationManager.delete({ name: `system-${fogData.uuid.toLowerCase()}` }, transaction) } async function deleteFogEndPoint (fogData, isCLI, transaction) { diff --git a/src/services/microservice-ports/default.js b/src/services/microservice-ports/default.js index 57a4ed428..613b9053a 100644 --- a/src/services/microservice-ports/default.js +++ b/src/services/microservice-ports/default.js @@ -13,6 +13,8 @@ const MicroservicePortManager = require('../../data/managers/microservice-port-manager') const MicroserviceManager = require('../../data/managers/microservice-manager') +const MicroserviceStatusManager = require('../../data/managers/microservice-status-manager') +const ApplicationManager = require('../../data/managers/application-manager') const ConfigManager = require('../../data/managers/config-manager') const ChangeTrackingService = require('../change-tracking-service') const AppHelper = require('../../helpers/app-helper') @@ -244,7 +246,7 @@ async function _createOrUpdateProxyMicroservice (mapping, networkRouter, hostUui const proxyMicroserviceData = { uuid: AppHelper.generateRandomString(32), - name: 'Proxy', + name: `proxy-${hostUuid.toLowerCase()}`, config: JSON.stringify({ mappings: [mapping], networkRouter @@ -252,9 +254,13 @@ async function _createOrUpdateProxyMicroservice (mapping, networkRouter, hostUui catalogItemId: proxyCatalogId, iofogUuid: hostUuid, rootHostAccess: true, - registryId: 1 + registryId: 1, + configLastUpdated: Date.now() } + const application = await ApplicationManager.findOne({ name: `system-${hostUuid.toLowerCase()}` }, transaction) + proxyMicroserviceData.applicationId = application.id const res = await MicroserviceManager.create(proxyMicroserviceData, transaction) + await MicroserviceStatusManager.create({ microserviceUuid: proxyMicroserviceData.uuid }, transaction) await ChangeTrackingService.update(hostUuid, ChangeTrackingService.events.microserviceCommon, transaction) return res } @@ -265,7 +271,8 @@ async function _createPublicPortMapping (microservice, portMappingData, transact const localAgent = portMappingData.localAgent // This is populated by validating the ports const localAgentsRouter = localAgent.routerId ? await RouterManager.findOne({ id: localAgent.routerId }, transaction) : await RouterManager.findOne({ iofogUuid: localAgent.uuid }, transaction) const localNetworkRouter = { - host: localAgentsRouter.host, + // host: localAgentsRouter.host, + host: 'localhost', port: localAgentsRouter.messagingPort } @@ -288,7 +295,8 @@ async function _createPublicPortMapping (microservice, portMappingData, transact if (portMappingData.publicHost) { const hostRouter = portMappingData.publicHost.routerId ? await RouterManager.findOne({ id: portMappingData.publicHost.routerId }, transaction) : await RouterManager.findOne({ iofogUuid: portMappingData.publicHost.uuid }, transaction) const remoteNetworkRouter = { - host: hostRouter.host, + // host: hostRouter.host, + host: 'localhost', port: hostRouter.messagingPort } @@ -478,6 +486,31 @@ async function deletePortMapping (microserviceUuid, internalPort, isCLI, transac ? { uuid: microserviceUuid } : { uuid: microserviceUuid } + const microservice = await MicroserviceManager.findMicroserviceOnGet(where, transaction) + if (!microservice) { + throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.INVALID_MICROSERVICE_UUID, microserviceUuid)) + } + + if (!internalPort) { + throw new Errors.ValidationError(ErrorMessages.PORT_MAPPING_INTERNAL_PORT_NOT_PROVIDED) + } + + const msPorts = await MicroservicePortManager.findOne({ + microserviceUuid: microservice.uuid, + portInternal: internalPort + }, transaction) + if (!msPorts) { + throw new Errors.NotFoundError('port mapping not exists') + } + + await _deletePortMapping(microservice, msPorts, transaction) +} + +async function deleteSystemPortMapping (microserviceUuid, internalPort, isCLI, transaction) { + const where = isCLI + ? { uuid: microserviceUuid } + : { uuid: microserviceUuid } + const microservice = await MicroserviceManager.findOne(where, transaction) if (!microservice) { throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.INVALID_MICROSERVICE_UUID, microserviceUuid)) @@ -523,6 +556,7 @@ module.exports = { buildPublicPortMapping, listPortMappings, deletePortMapping, + deleteSystemPortMapping, deletePortMappings, getPortMappings, listAllPublicPorts diff --git a/src/services/microservice-ports/proxy.js b/src/services/microservice-ports/proxy.js index d16a31f63..0e4af1abf 100644 --- a/src/services/microservice-ports/proxy.js +++ b/src/services/microservice-ports/proxy.js @@ -44,7 +44,7 @@ async function _createOrUpdatePortRouterMicroservice (existingProxy, localPort, const proxyMicroserviceData = { uuid: AppHelper.generateRandomString(32), - name: 'Proxy', + name: `proxy-${hostUuid}`, config: JSON.stringify({ fetch_config_interval: 5, proxies: [proxyConfig] diff --git a/src/services/microservices-service.js b/src/services/microservices-service.js index 55156d1ce..1b6216508 100644 --- a/src/services/microservices-service.js +++ b/src/services/microservices-service.js @@ -346,6 +346,200 @@ async function _updateRelatedExtraHosts (updatedMicroservice, transaction) { } } +async function updateSystemMicroserviceEndPoint (microserviceUuid, microserviceData, isCLI, transaction, changeTrackingEnabled = true) { + await Validator.validate(microserviceData, Validator.schemas.microserviceUpdate) + let needStatusReset = false + const query = isCLI + ? { + uuid: microserviceUuid + } + : { + uuid: microserviceUuid + } + + // validate extraHosts + const extraHosts = microserviceData.extraHosts ? await _validateExtraHosts(microserviceData, transaction) : null + + const config = _validateMicroserviceConfig(microserviceData.config) + + const newFog = await _findFog(microserviceData, isCLI, transaction) || {} + const microserviceToUpdate = { + name: microserviceData.name, + config: config, + images: microserviceData.images, + catalogItemId: microserviceData.catalogItemId, + rebuild: microserviceData.rebuild, + iofogUuid: newFog.uuid, + rootHostAccess: microserviceData.rootHostAccess, + logSize: (microserviceData.logSize || constants.MICROSERVICE_DEFAULT_LOG_SIZE) * 1, + registryId: microserviceData.registryId, + volumeMappings: microserviceData.volumeMappings, + env: microserviceData.env, + cmd: microserviceData.cmd, + ports: microserviceData.ports + } + + const microserviceDataUpdate = AppHelper.deleteUndefinedFields(microserviceToUpdate) + + const microservice = await MicroserviceManager.findOneWithCategory(query, transaction) + + const microserviceImages = await CatalogItemImageManager.findAll({ + microservice_uuid: microserviceUuid + }, transaction) + + if (!microservice) { + throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.INVALID_MICROSERVICE_UUID, microserviceUuid)) + } + if (microserviceDataUpdate.registryId) { + const registry = await RegistryManager.findOne({ id: microserviceDataUpdate.registryId }, transaction) + if (!registry) { + throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.INVALID_REGISTRY_ID, microserviceDataUpdate.registryId)) + } + } else { + microserviceDataUpdate.registryId = microservice.registryId + } + + if (microserviceDataUpdate.ports) { + await _updateSystemPorts(microserviceDataUpdate.ports, microservice, transaction) + } + + if (microserviceDataUpdate.iofogUuid && microservice.iofogUuid !== microserviceDataUpdate.iofogUuid) { + // Moving to new agent + // make sure all ports are available + const ports = await microservice.getPorts() + const data = { + ports: [], + iofogUuid: microserviceDataUpdate.iofogUuid + } + + for (const port of ports) { + data.ports.push({ + internal: port.portInternal, + external: port.portExternal + }) + } + + if (data.ports.length) { + await MicroservicePortService.validatePortMappings(data, transaction) + } + needStatusReset = true + } + + // Validate images vs catalog item + + const iofogUuid = microserviceDataUpdate.iofogUuid || microservice.iofogUuid + if (microserviceDataUpdate.catalogItemId) { + const catalogItem = await CatalogService.getCatalogItem(microserviceDataUpdate.catalogItemId, isCLI, transaction) + _validateImagesAgainstCatalog(catalogItem, microserviceDataUpdate.images || []) + if (microserviceDataUpdate.catalogItemId !== undefined && microserviceDataUpdate.catalogItemId !== microservice.catalogItemId) { + // Catalog item changed or removed, set rebuild flag + microserviceDataUpdate.rebuild = true + // If catalog item is set, set registry and msvc images + if (microserviceDataUpdate.catalogItemId) { + await _deleteImages(microserviceUuid, transaction) + microserviceDataUpdate.registryId = catalogItem.registryId || 1 + } + } + } else if (!microservice.catalogItemId && microserviceDataUpdate.images && microserviceDataUpdate.images.length === 0) { + // No catalog, and no image + throw new Errors.ValidationError(AppHelper.formatMessage(ErrorMessages.MICROSERVICE_DOES_NOT_HAVE_IMAGES, microserviceData.name)) + } else if (microserviceDataUpdate.images && microserviceDataUpdate.images.length > 0 && !_checkIfMicroserviceImagesAreEqual(microserviceDataUpdate.images, microserviceImages)) { + // No catalog, and images + await _updateImages(microserviceDataUpdate.images, microserviceUuid, transaction) + // Images updated, set rebuild flag to true + microserviceDataUpdate.rebuild = true + } + + if (microserviceDataUpdate.name) { + await _checkForDuplicateName(microserviceDataUpdate.name, { id: microserviceUuid }, microservice.applicationId || microservice.application, transaction) + } + + // validate fog node + if (iofogUuid) { + const fog = await FogManager.findOne({ uuid: iofogUuid }, transaction) + if (!fog || fog.length === 0) { + throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.INVALID_IOFOG_UUID, iofogUuid)) + } + + // Validate image type + let images = [] + if (microserviceDataUpdate.catalogItemId) { + const catalogItem = await CatalogService.getCatalogItem(microserviceDataUpdate.catalogItemId, isCLI, transaction) + images = catalogItem.images + } else if (microserviceDataUpdate.images) { + images = microserviceDataUpdate.images + } else if (microservice.catalogItemId) { + const catalogItem = await CatalogService.getCatalogItem(microservice.catalogItemId, isCLI, transaction) + images = catalogItem.images + } else { + images = await microservice.getImages() + } + _validateImageFogType(microserviceData, fog, images) + } + + // Set rebuild flag if needed + microserviceDataUpdate.rebuild = microserviceDataUpdate.rebuild || !!( + (microserviceDataUpdate.rootHostAccess !== undefined && microservice.rootHostAccess !== microserviceDataUpdate.rootHostAccess) || + microserviceDataUpdate.env || + microserviceDataUpdate.cmd || + microserviceDataUpdate.volumeMappings || + microserviceDataUpdate.ports || + extraHosts + ) + const updatedMicroservice = await MicroserviceManager.updateAndFind(query, microserviceDataUpdate, transaction) + + if (extraHosts) { + await _updateExtraHosts(extraHosts, microserviceUuid, transaction) + } + + // Update extra hosts that reference this microservice + await _updateRelatedExtraHosts(updatedMicroservice, transaction) + + if (microserviceDataUpdate.volumeMappings) { + await _updateVolumeMappings(microserviceDataUpdate.volumeMappings, microserviceUuid, transaction) + } + + if (microserviceDataUpdate.env) { + await _updateEnv(microserviceDataUpdate.env, microserviceUuid, transaction) + } + + if (microserviceDataUpdate.cmd) { + await _updateArg(microserviceDataUpdate.cmd, microserviceUuid, transaction) + } + + if (microserviceDataUpdate.iofogUuid && microserviceDataUpdate.iofogUuid !== microservice.iofogUuid) { + await MicroservicePortService.movePublicPortsToNewFog(updatedMicroservice, transaction) + } + + if (needStatusReset) { + const microserviceStatus = { + status: MicroserviceStates.QUEUED, + operatingDuration: 0, + startTime: 0, + cpuUsage: 0, + memoryUsage: 0, + containerId: '', + percentage: 0, + errorMessage: '' + } + await MicroserviceStatusManager.update({ + microserviceUuid: microservice.uuid + }, microserviceStatus, transaction) + } + + if (changeTrackingEnabled) { + await ChangeTrackingService.update(microservice.iofogUuid, ChangeTrackingService.events.microserviceRouting, transaction) + await ChangeTrackingService.update(updatedMicroservice.iofogUuid, ChangeTrackingService.events.microserviceRouting, transaction) + await _updateChangeTracking(true, microservice.iofogUuid, transaction) + await _updateChangeTracking(true, updatedMicroservice.iofogUuid, transaction) + } else { + return { + microserviceIofogUuid: microservice.iofogUuid, + updatedMicroserviceIofogUuid: updatedMicroservice.iofogUuid + } + } +} + async function updateMicroserviceEndPoint (microserviceUuid, microserviceData, isCLI, transaction, changeTrackingEnabled = true) { await Validator.validate(microserviceData, Validator.schemas.microserviceUpdate) let needStatusReset = false @@ -596,11 +790,11 @@ async function deleteNotRunningMicroservices (fog, transaction) { async function createRouteEndPoint (sourceMicroserviceUuid, destMicroserviceUuid, isCLI, transaction) { // Print deprecated warning - const sourceMsvc = await MicroserviceManager.findOne({ uuid: sourceMicroserviceUuid }, transaction) + const sourceMsvc = await MicroserviceManager.findMicroserviceOnGet({ uuid: sourceMicroserviceUuid }, transaction) if (!sourceMsvc) { throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.INVALID_SOURCE_MICROSERVICE_UUID, sourceMicroserviceUuid)) } - const destMsvc = await MicroserviceManager.findOne({ uuid: destMicroserviceUuid }, transaction) + const destMsvc = await MicroserviceManager.findMicroserviceOnGet({ uuid: destMicroserviceUuid }, transaction) if (!destMsvc) { throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.INVALID_SOURCE_MICROSERVICE_UUID, destMsvc)) } @@ -630,6 +824,27 @@ async function deleteRouteEndPoint (sourceMicroserviceUuid, destMicroserviceUuid async function createPortMappingEndPoint (microserviceUuid, portMappingData, isCLI, transaction) { await Validator.validate(portMappingData, Validator.schemas.portsCreate) + const where = isCLI + ? { uuid: microserviceUuid } + : { uuid: microserviceUuid } + + const microservice = await MicroserviceManager.findMicroserviceOnGet(where, transaction) + if (!microservice) { + throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.INVALID_MICROSERVICE_UUID, microserviceUuid)) + } + + const agent = await FogManager.findOne({ uuid: microservice.iofogUuid }, transaction) + if (!agent) { + throw new Errors.ValidationError(AppHelper.formatMessage(ErrorMessages.INVALID_IOFOG_UUID, microservice.iofogUuid)) + } + await MicroservicePortService.validatePortMapping(agent, portMappingData, {}, transaction) + + return MicroservicePortService.createPortMapping(microservice, portMappingData, transaction) +} + +async function createSystemPortMappingEndPoint (microserviceUuid, portMappingData, isCLI, transaction) { + await Validator.validate(portMappingData, Validator.schemas.portsCreate) + const where = isCLI ? { uuid: microserviceUuid } : { uuid: microserviceUuid } @@ -690,6 +905,10 @@ async function deletePortMappingEndPoint (microserviceUuid, internalPort, isCLI, return MicroservicePortService.deletePortMapping(microserviceUuid, internalPort, isCLI, transaction) } +async function deleteSystemPortMappingEndPoint (microserviceUuid, internalPort, isCLI, transaction) { + return MicroservicePortService.deleteSystemPortMapping(microserviceUuid, internalPort, isCLI, transaction) +} + async function listPortMappingsEndPoint (microserviceUuid, isCLI, transaction) { return MicroservicePortService.listPortMappings(microserviceUuid, isCLI, transaction) } @@ -709,6 +928,43 @@ async function isMicroserviceConsumer (microservice, transaction) { async function createVolumeMappingEndPoint (microserviceUuid, volumeMappingData, isCLI, transaction) { await Validator.validate(volumeMappingData, Validator.schemas.volumeMappings) + const where = isCLI + ? { uuid: microserviceUuid } + : { uuid: microserviceUuid } + + const microservice = await MicroserviceManager.findMicroserviceOnGet(where, transaction) + if (!microservice) { + throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.INVALID_MICROSERVICE_UUID, microserviceUuid)) + } + + const type = volumeMappingData.type || VOLUME_MAPPING_DEFAULT + + const volumeMapping = await VolumeMappingManager.findOne({ + microserviceUuid: microserviceUuid, + hostDestination: volumeMappingData.hostDestination, + containerDestination: volumeMappingData.containerDestination, + type + }, transaction) + if (volumeMapping) { + throw new Errors.ValidationError(ErrorMessages.VOLUME_MAPPING_ALREADY_EXISTS) + } + + _validateVolumeMappings([volumeMappingData]) + + const volumeMappingObj = { + microserviceUuid: microserviceUuid, + hostDestination: volumeMappingData.hostDestination, + containerDestination: volumeMappingData.containerDestination, + accessMode: volumeMappingData.accessMode, + type + } + + return VolumeMappingManager.create(volumeMappingObj, transaction) +} + +async function createSystemVolumeMappingEndPoint (microserviceUuid, volumeMappingData, isCLI, transaction) { + await Validator.validate(volumeMappingData, Validator.schemas.volumeMappings) + const where = isCLI ? { uuid: microserviceUuid } : { uuid: microserviceUuid } @@ -764,6 +1020,27 @@ async function deleteVolumeMappingEndPoint (microserviceUuid, volumeMappingUuid, } } +async function deleteSystemVolumeMappingEndPoint (microserviceUuid, volumeMappingUuid, isCLI, transaction) { + const where = isCLI + ? { uuid: microserviceUuid } + : { uuid: microserviceUuid } + + const microservice = await MicroserviceManager.findMicroserviceOnGet(where, transaction) + if (!microservice) { + throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.INVALID_MICROSERVICE_UUID, microserviceUuid)) + } + + const volumeMappingWhere = { + uuid: volumeMappingUuid, + microserviceUuid: microserviceUuid + } + + const affectedRows = await VolumeMappingManager.delete(volumeMappingWhere, transaction) + if (affectedRows === 0) { + throw new Errors.ValidationError(AppHelper.formatMessage(ErrorMessages.INVALID_VOLUME_MAPPING_UUID, volumeMappingUuid)) + } +} + async function listVolumeMappingsEndPoint (microserviceUuid, isCLI, transaction) { const where = isCLI ? { uuid: microserviceUuid } @@ -836,15 +1113,15 @@ async function _validateApplication (name, isCLI, transaction) { // Force name conversion to string for PG const where = isCLI - ? { name: name.toString() } - : { name: name.toString() } + ? { name: name.toString(), isSystem: false } + : { name: name.toString(), isSystem: false } const application = await ApplicationManager.findOne(where, transaction) if (!application) { // Try with id const where = isCLI - ? { id: name } - : { id: name } + ? { id: name, isSystem: false } + : { id: name, isSystem: false } const application = await ApplicationManager.findOne(where, transaction) if (!application) { @@ -961,6 +1238,13 @@ async function _updatePorts (newPortMappings, microservice, transaction) { } } +async function _updateSystemPorts (newPortMappings, microservice, transaction) { + await MicroservicePortService.deletePortMappings(microservice, transaction) + for (const portMapping of newPortMappings) { + await createSystemPortMappingEndPoint(microservice.uuid, portMapping, false, transaction) + } +} + async function _updateChangeTracking (configUpdated, fogNodeUuid, transaction) { if (configUpdated) { await ChangeTrackingService.update(fogNodeUuid, ChangeTrackingService.events.microserviceCommon, transaction) @@ -1087,14 +1371,18 @@ function listAllPublicPortsEndPoint (transaction) { module.exports = { createMicroserviceEndPoint: TransactionDecorator.generateTransaction(createMicroserviceEndPoint), createPortMappingEndPoint: TransactionDecorator.generateTransaction(createPortMappingEndPoint), + createSystemPortMappingEndPoint: TransactionDecorator.generateTransaction(createSystemPortMappingEndPoint), createRouteEndPoint: TransactionDecorator.generateTransaction(createRouteEndPoint), createVolumeMappingEndPoint: TransactionDecorator.generateTransaction(createVolumeMappingEndPoint), + createSystemVolumeMappingEndPoint: TransactionDecorator.generateTransaction(createSystemVolumeMappingEndPoint), deleteMicroserviceEndPoint: TransactionDecorator.generateTransaction(deleteMicroserviceEndPoint), deleteMicroserviceWithRoutesAndPortMappings: deleteMicroserviceWithRoutesAndPortMappings, deleteNotRunningMicroservices: deleteNotRunningMicroservices, deletePortMappingEndPoint: TransactionDecorator.generateTransaction(deletePortMappingEndPoint), + deleteSystemPortMappingEndPoint: TransactionDecorator.generateTransaction(deleteSystemPortMappingEndPoint), deleteRouteEndPoint: TransactionDecorator.generateTransaction(deleteRouteEndPoint), deleteVolumeMappingEndPoint: TransactionDecorator.generateTransaction(deleteVolumeMappingEndPoint), + deleteSystemVolumeMappingEndPoint: TransactionDecorator.generateTransaction(deleteSystemVolumeMappingEndPoint), getMicroserviceEndPoint: TransactionDecorator.generateTransaction(getMicroserviceEndPoint), getReceiverMicroservices, isMicroserviceConsumer, @@ -1103,6 +1391,7 @@ module.exports = { listMicroservicesEndPoint: TransactionDecorator.generateTransaction(listMicroservicesEndPoint), listVolumeMappingsEndPoint: TransactionDecorator.generateTransaction(listVolumeMappingsEndPoint), updateMicroserviceEndPoint: TransactionDecorator.generateTransaction(updateMicroserviceEndPoint), + updateSystemMicroserviceEndPoint: TransactionDecorator.generateTransaction(updateSystemMicroserviceEndPoint), buildGetMicroserviceResponse: _buildGetMicroserviceResponse, updateChangeTracking: _updateChangeTracking } diff --git a/src/services/router-service.js b/src/services/router-service.js index 8c8dbdc52..162fb71d5 100644 --- a/src/services/router-service.js +++ b/src/services/router-service.js @@ -18,6 +18,8 @@ const Constants = require('../helpers/constants') const Errors = require('../helpers/errors') const ErrorMessages = require('../helpers/error-messages') const MicroserviceManager = require('../data/managers/microservice-manager') +const MicroserviceStatusManager = require('../data/managers/microservice-status-manager') +const ApplicationManager = require('../data/managers/application-manager') const MicroservicePortManager = require('../data/managers/microservice-port-manager') const RouterConnectionManager = require('../data/managers/router-connection-manager') const RouterManager = require('../data/managers/router-manager') @@ -219,9 +221,15 @@ function _createRouterPorts (routerMicroserviceUuid, port, transaction) { async function _createRouterMicroservice (isEdge, uuid, microserviceConfig, transaction) { const routerCatalog = await CatalogService.getRouterCatalogItem(transaction) + + const routerApplicationData = { + name: `system-${uuid.toLowerCase()}`, + isActivated: true, + isSystem: true + } const routerMicroserviceData = { uuid: AppHelper.generateRandomString(32), - name: `Router for Fog ${uuid}`, + name: `router-${uuid.toLowerCase()}`, config: JSON.stringify(microserviceConfig), catalogItemId: routerCatalog.id, iofogUuid: uuid, @@ -229,7 +237,12 @@ async function _createRouterMicroservice (isEdge, uuid, microserviceConfig, tran logSize: constants.MICROSERVICE_DEFAULT_LOG_SIZE, configLastUpdated: Date.now() } - return MicroserviceManager.create(routerMicroserviceData, transaction) + await ApplicationManager.create(routerApplicationData, transaction) + const application = await ApplicationManager.findOne({ name: routerApplicationData.name }, transaction) + routerMicroserviceData.applicationId = application.id + const routerMicroservice = await MicroserviceManager.create(routerMicroserviceData, transaction) + await MicroserviceStatusManager.create({ microserviceUuid: routerMicroserviceData.uuid }, transaction) + return routerMicroservice } function _getRouterConnectorConfig (isEdge, dest) { From 4ad05cebef0223dd75ec70a21df6cd2afafdac70 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emirhan=20Durmu=C5=9F?= Date: Sun, 14 Jul 2024 16:25:09 +0300 Subject: [PATCH 104/178] createPortMappingEndPoint fixed --- src/services/microservices-service.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/services/microservices-service.js b/src/services/microservices-service.js index 1b6216508..a3ed246df 100644 --- a/src/services/microservices-service.js +++ b/src/services/microservices-service.js @@ -823,12 +823,12 @@ async function deleteRouteEndPoint (sourceMicroserviceUuid, destMicroserviceUuid async function createPortMappingEndPoint (microserviceUuid, portMappingData, isCLI, transaction) { await Validator.validate(portMappingData, Validator.schemas.portsCreate) - + await _validateMicroserviceOnGet(microserviceUuid, transaction) const where = isCLI ? { uuid: microserviceUuid } : { uuid: microserviceUuid } - const microservice = await MicroserviceManager.findMicroserviceOnGet(where, transaction) + const microservice = await MicroserviceManager.findOne(where, transaction) if (!microservice) { throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.INVALID_MICROSERVICE_UUID, microserviceUuid)) } @@ -1277,7 +1277,7 @@ async function _checkForDuplicateName (name, item, applicationId, transaction) { async function _validateMicroserviceOnGet (microserviceUuid, transaction) { const where = { - 'uuid': microserviceUuid + uuid: microserviceUuid } const microservice = await MicroserviceManager.findMicroserviceOnGet(where, transaction) if (!microservice) { From aa4f5e85b53ed36e9ec4f052cda1cccdff7b6ca9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emirhan=20Durmu=C5=9F?= Date: Mon, 15 Jul 2024 13:30:18 +0300 Subject: [PATCH 105/178] swagger yaml update --- docs/swagger.json | 2 +- docs/swagger.yaml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/swagger.json b/docs/swagger.json index 9f2bccfca..88a597df3 100644 --- a/docs/swagger.json +++ b/docs/swagger.json @@ -1831,7 +1831,7 @@ } ] } }, - "/microservices/system/{uuid}\"" : { + "/microservices/system/{uuid}" : { "patch" : { "tags" : [ "Microservices" ], "summary" : "Updates a system microservice", diff --git a/docs/swagger.yaml b/docs/swagger.yaml index 3bda22b4b..f4b49af54 100755 --- a/docs/swagger.yaml +++ b/docs/swagger.yaml @@ -1683,7 +1683,7 @@ paths: type: string security: - userToken: [] - /microservices/system/{uuid}": + /microservices/system/{uuid}: patch: tags: - Microservices From 341a3ace0e535026dc26c39c7d207f27a39f2431 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emirhan=20Durmu=C5=9F?= Date: Mon, 15 Jul 2024 17:09:29 +0300 Subject: [PATCH 106/178] proxxy msvc default log size added --- src/services/microservice-ports/default.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/services/microservice-ports/default.js b/src/services/microservice-ports/default.js index 613b9053a..a24be57f2 100644 --- a/src/services/microservice-ports/default.js +++ b/src/services/microservice-ports/default.js @@ -29,7 +29,7 @@ const MicroserviceExtraHostManager = require('../../data/managers/microservice-e const controllerConfig = require('../../config') const Proxy = require('./proxy') -const { DEFAULT_ROUTER_NAME, DEFAULT_PROXY_HOST, RESERVED_PORTS } = require('../../helpers/constants') +const { MICROSERVICE_DEFAULT_LOG_SIZE, DEFAULT_ROUTER_NAME, DEFAULT_PROXY_HOST, RESERVED_PORTS } = require('../../helpers/constants') const lget = require('lodash/get') @@ -255,6 +255,7 @@ async function _createOrUpdateProxyMicroservice (mapping, networkRouter, hostUui iofogUuid: hostUuid, rootHostAccess: true, registryId: 1, + logSize: MICROSERVICE_DEFAULT_LOG_SIZE, configLastUpdated: Date.now() } const application = await ApplicationManager.findOne({ name: `system-${hostUuid.toLowerCase()}` }, transaction) From 6c760c5199743aa2b2f3588862654cdf9aa40718 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emirhan=20Durmu=C5=9F?= Date: Tue, 16 Jul 2024 19:10:03 +0300 Subject: [PATCH 107/178] microservice definition modified for WasmEdge integration --- docs/swagger.yaml | 68 +++++++++++++++++++++++++++ src/cli/microservice.js | 64 +++++++++++++++++++++++++ src/data/models/microservice.js | 12 +++++ src/data/models/microservicedev.js | 31 ++++++++++++ src/schemas/microservice.js | 16 ++++++- src/services/agent-service.js | 8 ++++ src/services/microservices-service.js | 20 ++++++++ 7 files changed, 217 insertions(+), 2 deletions(-) create mode 100644 src/data/models/microservicedev.js diff --git a/docs/swagger.yaml b/docs/swagger.yaml index f4b49af54..d9c825182 100755 --- a/docs/swagger.yaml +++ b/docs/swagger.yaml @@ -3249,6 +3249,16 @@ components: type: string value: type: string + runAsUser: + type: number + platform: + type: string + runtime: + type: string + devices: + type: array + items: + type: string cmd: type: array items: @@ -3372,6 +3382,16 @@ components: type: string value: type: string + runAsUser: + type: number + platform: + type: string + runtime: + type: string + devices: + type: array + items: + type: string cmd: type: array items: @@ -4020,6 +4040,16 @@ components: type: array items: $ref: "#/components/schemas/AgentEnvRequest" + runAsUser: + type: string + platform: + type: string + runtime: + type: string + devices: + type: array + items: + type: string cmd: type: array items: @@ -4351,6 +4381,16 @@ components: type: string value: type: string + runAsUser: + type: string + platform: + type: string + runtime: + type: string + devices: + type: array + items: + type: string cmd: type: array items: @@ -4413,6 +4453,20 @@ components: type: array items: $ref: "#/components/schemas/PortMappingsRequest" + runAsUser: + type: string + platform: + type: string + runtime: + type: string + devices: + type: array + items: + type: string + cmd: + type: array + items: + type: string UpdateMicroserviceRequest: type: object required: @@ -4444,6 +4498,20 @@ components: type: string fogTypeId: type: string + runAsUser: + type: string + platform: + type: string + runtime: + type: string + devices: + type: array + items: + type: string + cmd: + type: array + items: + type: string IOFogNodeTunnelStatusInfoResponse: type: object properties: diff --git a/src/cli/microservice.js b/src/cli/microservice.js index cce7264f5..75d624702 100644 --- a/src/cli/microservice.js +++ b/src/cli/microservice.js @@ -62,6 +62,18 @@ const JSON_SCHEMA_ADD = AppHelper.stringifyCliJsonSchema( ], cmd: [ 'string' + ], + devices: [ + 'string' + ], + runAsUser: [ + 'string' + ], + platform: [ + 'string' + ], + runtime: [ + 'string' ] } ) @@ -98,6 +110,18 @@ const JSON_SCHEMA_UPDATE = AppHelper.stringifyCliJsonSchema( ], cmd: [ 'string' + ], + devices: [ + 'string' + ], + runAsUser: [ + 'string' + ], + platform: [ + 'string' + ], + runtime: [ + 'string' ] } ) @@ -287,6 +311,38 @@ class Microservice extends BaseCLIHandler { description: 'Microservice container command and argument(s)', multiple: true, group: [constants.CMD_UPDATE, constants.CMD_ADD] + }, + { + name: 'devices', + alias: 'd', + type: String, + description: 'Map devices to microservice container', + multiple: true, + group: [constants.CMD_UPDATE, constants.CMD_ADD] + }, + { + name: 'user', + alias: 'u', + type: String, + description: 'Run Microservice as a user)', + multiple: true, + group: [constants.CMD_UPDATE, constants.CMD_ADD] + }, + { + name: 'platform', + alias: 'o', + type: String, + description: 'Microservice image platform to be used', + multiple: true, + group: [constants.CMD_UPDATE, constants.CMD_ADD] + }, + { + name: 'runtime', + alias: 'y', + type: String, + description: 'Microservice container runtime definition', + multiple: true, + group: [constants.CMD_UPDATE, constants.CMD_ADD] } ] this.commands = { @@ -585,6 +641,10 @@ const _updateMicroserviceObject = function (obj) { logSize: (obj.logSize || constants.MICROSERVICE_DEFAULT_LOG_SIZE) * 1, rebuild: obj.rebuild, cmd: obj.cmd, + devices: obj.devices, + runAsUser: obj.runAsUser, + platform: obj.platform, + runtime: obj.runtime, env, images: obj.images, catalogItemId: parseInt(obj.catalogItemId) || undefined, @@ -646,6 +706,10 @@ const _createMicroserviceObject = function (obj) { logSize: (obj.logSize || constants.MICROSERVICE_DEFAULT_LOG_SIZE) * 1, routes: obj.routes, cmd: obj.cmd, + devices: obj.devices, + runAsUser: obj.runAsUser, + platform: obj.platform, + runtime: obj.runtime, env, images: [] } diff --git a/src/data/models/microservice.js b/src/data/models/microservice.js index e3548c1e8..c43c5488e 100644 --- a/src/data/models/microservice.js +++ b/src/data/models/microservice.js @@ -42,6 +42,18 @@ module.exports = (sequelize, DataTypes) => { field: 'root_host_access', defaultValue: false }, + runAsUser: { + type: DataTypes.TEXT, + field: 'run_as_user' + }, + platform: { + type: DataTypes.TEXT, + field: 'platform' + }, + runtime: { + type: DataTypes.TEXT, + field: 'runtime' + }, logSize: { type: DataTypes.BIGINT, get () { diff --git a/src/data/models/microservicedev.js b/src/data/models/microservicedev.js new file mode 100644 index 000000000..ab3846f1b --- /dev/null +++ b/src/data/models/microservicedev.js @@ -0,0 +1,31 @@ +'use strict' +module.exports = (sequelize, DataTypes) => { + const MicroserviceDev = sequelize.define('MicroserviceDev', { + id: { + type: DataTypes.INTEGER, + primaryKey: true, + autoIncrement: true, + allowNull: false, + field: 'id' + }, + devices: { + type: DataTypes.TEXT, + field: 'devices' + } + }, { + tableName: 'MicroserviceDevs', + timestamps: false, + underscored: true + }) + MicroserviceArg.associate = function (models) { + MicroserviceArg.belongsTo(models.Microservice, { + foreignKey: { + name: 'microserviceUuid', + field: 'microservice_uuid' + }, + as: 'microservice', + onDelete: 'cascade' + }) + } + return MicroserviceDev +} diff --git a/src/schemas/microservice.js b/src/schemas/microservice.js index fd1637bc6..8eae561bb 100644 --- a/src/schemas/microservice.js +++ b/src/schemas/microservice.js @@ -49,7 +49,13 @@ const microserviceCreate = { 'items': { '$ref': '/env' } }, 'cmd': { 'type': 'array', - 'items': { 'type': 'string' } } + 'items': { 'type': 'string' } }, + 'devices': { + 'type': 'array', + 'items': { 'type': 'string' } }, + 'runAsUser': { 'type': 'string' }, + 'platform': { 'type': 'string' }, + 'runtime': { 'type': 'string' } }, 'required': ['name'], 'additionalProperties': true @@ -90,7 +96,13 @@ const microserviceUpdate = { 'items': { '$ref': '/env' } }, 'cmd': { 'type': 'array', - 'items': { 'type': 'string' } } + 'items': { 'type': 'string' } }, + 'devices': { + 'type': 'array', + 'items': { 'type': 'string' } }, + 'runAsUser': { 'type': 'string' }, + 'platform': { 'type': 'string' }, + 'runtime': { 'type': 'string' } }, 'additionalProperties': true } diff --git a/src/services/agent-service.js b/src/services/agent-service.js index c33bd4303..2a0e2c402 100644 --- a/src/services/agent-service.js +++ b/src/services/agent-service.js @@ -299,6 +299,14 @@ const getAgentMicroservices = async function (fog, transaction) { config: microservice.config, rebuild: microservice.rebuild, rootHostAccess: microservice.rootHostAccess, + devices: microservice.devices, + runAsUser: microservice.runAsUser, + platform: microservice.platform, + runtime: microservice.runtime, + devices: microservice.devices, + runAsUser: microservice.runAsUser, + platform: microservice.platform, + runtime: microservice.runtime, logSize: parseInt(microservice.logSize) || constants.MICROSERVICE_DEFAULT_LOG_SIZE, registryId, portMappings: microservice.ports, diff --git a/src/services/microservices-service.js b/src/services/microservices-service.js index a3ed246df..c7e6e12f7 100644 --- a/src/services/microservices-service.js +++ b/src/services/microservices-service.js @@ -371,6 +371,10 @@ async function updateSystemMicroserviceEndPoint (microserviceUuid, microserviceD rebuild: microserviceData.rebuild, iofogUuid: newFog.uuid, rootHostAccess: microserviceData.rootHostAccess, + devices: microserviceData.devices, + runAsUser: microserviceData.runAsUser, + platform: microserviceData.platform, + runtime: microserviceData.runtime, logSize: (microserviceData.logSize || constants.MICROSERVICE_DEFAULT_LOG_SIZE) * 1, registryId: microserviceData.registryId, volumeMappings: microserviceData.volumeMappings, @@ -482,6 +486,10 @@ async function updateSystemMicroserviceEndPoint (microserviceUuid, microserviceD (microserviceDataUpdate.rootHostAccess !== undefined && microservice.rootHostAccess !== microserviceDataUpdate.rootHostAccess) || microserviceDataUpdate.env || microserviceDataUpdate.cmd || + microserviceDataUpdate.devices || + microserviceDataUpdate.runAsUser || + microserviceDataUpdate.platform || + microserviceDataUpdate.runtime || microserviceDataUpdate.volumeMappings || microserviceDataUpdate.ports || extraHosts @@ -565,6 +573,10 @@ async function updateMicroserviceEndPoint (microserviceUuid, microserviceData, i rebuild: microserviceData.rebuild, iofogUuid: newFog.uuid, rootHostAccess: microserviceData.rootHostAccess, + devices: microserviceData.devices, + runAsUser: microserviceData.runAsUser, + platform: microserviceData.platform, + runtime: microserviceData.runtime, logSize: (microserviceData.logSize || constants.MICROSERVICE_DEFAULT_LOG_SIZE) * 1, registryId: microserviceData.registryId, volumeMappings: microserviceData.volumeMappings, @@ -680,6 +692,10 @@ async function updateMicroserviceEndPoint (microserviceUuid, microserviceData, i (microserviceDataUpdate.rootHostAccess !== undefined && microservice.rootHostAccess !== microserviceDataUpdate.rootHostAccess) || microserviceDataUpdate.env || microserviceDataUpdate.cmd || + microserviceDataUpdate.devices || + microserviceDataUpdate.runAsUser || + microserviceDataUpdate.platform || + microserviceDataUpdate.runtime || microserviceDataUpdate.volumeMappings || microserviceDataUpdate.ports || extraHosts @@ -1076,6 +1092,10 @@ async function _createMicroservice (microserviceData, isCLI, transaction) { catalogItemId: microserviceData.catalogItemId, iofogUuid: microserviceData.iofogUuid, rootHostAccess: microserviceData.rootHostAccess, + devices: microserviceData.devices, + runAsUser: microserviceData.runAsUser, + platform: microserviceData.platform, + runtime: microserviceData.runtime, registryId: microserviceData.registryId || 1, logSize: (microserviceData.logSize || constants.MICROSERVICE_DEFAULT_LOG_SIZE) * 1 } From e2274326656d543eec2c8525f29c3927c75a0ef6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emirhan=20Durmu=C5=9F?= Date: Wed, 17 Jul 2024 02:33:05 +0300 Subject: [PATCH 108/178] ecn viewer updated and microservice/system endpoint fixed --- package.json | 2 +- src/routes/microservices.js | 6 +++--- src/services/catalog-service.js | 16 ++++++++++++++++ src/services/microservices-service.js | 8 ++++---- 4 files changed, 24 insertions(+), 8 deletions(-) diff --git a/package.json b/package.json index b11c3b331..02a7c3beb 100644 --- a/package.json +++ b/package.json @@ -57,7 +57,7 @@ "iofog-controller": "src/main.js" }, "dependencies": { - "@datasance/ecn-viewer": "0.1.9", + "@datasance/ecn-viewer": "0.1.12", "axios": "1.7.2", "body-parser": "^1.20.2", "child_process": "1.0.2", diff --git a/src/routes/microservices.js b/src/routes/microservices.js index b3e33ab20..b3ddf1604 100644 --- a/src/routes/microservices.js +++ b/src/routes/microservices.js @@ -418,7 +418,7 @@ module.exports = [ }, { method: 'post', - path: '/api/v1/microservices/sytem/:uuid/port-mapping', + path: '/api/v1/microservices/system/:uuid/port-mapping', middleware: async (req, res) => { logger.apiReq(req) @@ -502,7 +502,7 @@ module.exports = [ await keycloak.protect(['SRE'])(req, res, async () => { const deleteSystemMicroservicePortMapping = ResponseDecorator.handleErrors( - MicroservicesController.deleteMicroservicePortMappingEndPoint, successCode, errorCodes) + MicroservicesController.deleteSystemMicroservicePortMappingEndPoint, successCode, errorCodes) const responseObject = await deleteSystemMicroservicePortMapping(req) const user = req.kauth.grant.access_token.content.preferred_username res @@ -714,7 +714,7 @@ module.exports = [ } ] - await keycloak.protect(['SRE', 'Developer'])(req, res, async () => { + await keycloak.protect(['SRE'])(req, res, async () => { const deleteSystemMicroserviceVolumeMappingEndPoint = ResponseDecorator.handleErrors( MicroservicesController.deleteSystemMicroserviceVolumeMappingEndPoint, successCode, diff --git a/src/services/catalog-service.js b/src/services/catalog-service.js index a6c0da298..a81a513e4 100644 --- a/src/services/catalog-service.js +++ b/src/services/catalog-service.js @@ -93,6 +93,21 @@ async function getCatalogItem (id, isCLI, transaction) { return item } +async function getSystemCatalogItem (id, isCLI, transaction) { + const where = { + id: id, + category: 'SYSTEM' + } + + const attributes = {} + + const item = await CatalogItemManager.findOneWithDependencies(where, attributes, transaction) + if (!item) { + throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.INVALID_CATALOG_ITEM_ID, id)) + } + return item +} + const getCatalogItemEndPoint = async function (id, isCLI, transaction) { return getCatalogItem(id, isCLI, transaction) } @@ -368,6 +383,7 @@ module.exports = { deleteCatalogItemEndPoint: TransactionDecorator.generateTransaction(deleteCatalogItemEndPoint), updateCatalogItemEndPoint: TransactionDecorator.generateTransaction(updateCatalogItemEndPoint), getCatalogItem: getCatalogItem, + getSystemCatalogItem: getSystemCatalogItem, getNetworkCatalogItem: getNetworkCatalogItem, getBluetoothCatalogItem: getBluetoothCatalogItem, getHalCatalogItem: getHalCatalogItem, diff --git a/src/services/microservices-service.js b/src/services/microservices-service.js index a3ed246df..17d5f629e 100644 --- a/src/services/microservices-service.js +++ b/src/services/microservices-service.js @@ -429,7 +429,7 @@ async function updateSystemMicroserviceEndPoint (microserviceUuid, microserviceD const iofogUuid = microserviceDataUpdate.iofogUuid || microservice.iofogUuid if (microserviceDataUpdate.catalogItemId) { - const catalogItem = await CatalogService.getCatalogItem(microserviceDataUpdate.catalogItemId, isCLI, transaction) + const catalogItem = await CatalogService.getSystemCatalogItem(microserviceDataUpdate.catalogItemId, isCLI, transaction) _validateImagesAgainstCatalog(catalogItem, microserviceDataUpdate.images || []) if (microserviceDataUpdate.catalogItemId !== undefined && microserviceDataUpdate.catalogItemId !== microservice.catalogItemId) { // Catalog item changed or removed, set rebuild flag @@ -464,12 +464,12 @@ async function updateSystemMicroserviceEndPoint (microserviceUuid, microserviceD // Validate image type let images = [] if (microserviceDataUpdate.catalogItemId) { - const catalogItem = await CatalogService.getCatalogItem(microserviceDataUpdate.catalogItemId, isCLI, transaction) + const catalogItem = await CatalogService.getSystemCatalogItem(microserviceDataUpdate.catalogItemId, isCLI, transaction) images = catalogItem.images } else if (microserviceDataUpdate.images) { images = microserviceDataUpdate.images } else if (microservice.catalogItemId) { - const catalogItem = await CatalogService.getCatalogItem(microservice.catalogItemId, isCLI, transaction) + const catalogItem = await CatalogService.getSystemCatalogItem(microservice.catalogItemId, isCLI, transaction) images = catalogItem.images } else { images = await microservice.getImages() @@ -1025,7 +1025,7 @@ async function deleteSystemVolumeMappingEndPoint (microserviceUuid, volumeMappin ? { uuid: microserviceUuid } : { uuid: microserviceUuid } - const microservice = await MicroserviceManager.findMicroserviceOnGet(where, transaction) + const microservice = await MicroserviceManager.findOne(where, transaction) if (!microservice) { throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.INVALID_MICROSERVICE_UUID, microserviceUuid)) } From 1d8e089446dc791eb55304bd720ee1916f691baf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emirhan=20Durmu=C5=9F?= Date: Thu, 18 Jul 2024 14:21:19 +0300 Subject: [PATCH 109/178] microservices updated --- docs/swagger.yaml | 12 ++--- src/cli/microservice.js | 12 ++--- .../microservice-cdi-device-manager.js | 35 +++++++++++++ src/data/managers/microservice-manager.js | 19 +++++++ src/data/models/microservice.js | 5 ++ ...croservicedev.js => microserviceCdiDev.js} | 14 ++--- src/schemas/microservice.js | 4 +- src/services/agent-service.js | 6 +-- src/services/microservices-service.js | 52 +++++++++++++++++-- 9 files changed, 128 insertions(+), 31 deletions(-) create mode 100644 src/data/managers/microservice-cdi-device-manager.js rename src/data/models/{microservicedev.js => microserviceCdiDev.js} (60%) diff --git a/docs/swagger.yaml b/docs/swagger.yaml index d9c825182..147c7a4d7 100755 --- a/docs/swagger.yaml +++ b/docs/swagger.yaml @@ -3255,7 +3255,7 @@ components: type: string runtime: type: string - devices: + cdiDevices: type: array items: type: string @@ -3388,7 +3388,7 @@ components: type: string runtime: type: string - devices: + cdiDevices: type: array items: type: string @@ -4046,7 +4046,7 @@ components: type: string runtime: type: string - devices: + cdiDevices: type: array items: type: string @@ -4387,7 +4387,7 @@ components: type: string runtime: type: string - devices: + cdiDevices: type: array items: type: string @@ -4459,7 +4459,7 @@ components: type: string runtime: type: string - devices: + cdiDevices: type: array items: type: string @@ -4504,7 +4504,7 @@ components: type: string runtime: type: string - devices: + cdiDevices: type: array items: type: string diff --git a/src/cli/microservice.js b/src/cli/microservice.js index 75d624702..79c56a2c8 100644 --- a/src/cli/microservice.js +++ b/src/cli/microservice.js @@ -63,7 +63,7 @@ const JSON_SCHEMA_ADD = AppHelper.stringifyCliJsonSchema( cmd: [ 'string' ], - devices: [ + cdiDevices: [ 'string' ], runAsUser: [ @@ -111,7 +111,7 @@ const JSON_SCHEMA_UPDATE = AppHelper.stringifyCliJsonSchema( cmd: [ 'string' ], - devices: [ + cdiDevices: [ 'string' ], runAsUser: [ @@ -313,10 +313,10 @@ class Microservice extends BaseCLIHandler { group: [constants.CMD_UPDATE, constants.CMD_ADD] }, { - name: 'devices', + name: 'cdiDevices', alias: 'd', type: String, - description: 'Map devices to microservice container', + description: 'Map CDI devices to microservice container', multiple: true, group: [constants.CMD_UPDATE, constants.CMD_ADD] }, @@ -641,7 +641,7 @@ const _updateMicroserviceObject = function (obj) { logSize: (obj.logSize || constants.MICROSERVICE_DEFAULT_LOG_SIZE) * 1, rebuild: obj.rebuild, cmd: obj.cmd, - devices: obj.devices, + cdiDevices: obj.cdiDevices, runAsUser: obj.runAsUser, platform: obj.platform, runtime: obj.runtime, @@ -706,7 +706,7 @@ const _createMicroserviceObject = function (obj) { logSize: (obj.logSize || constants.MICROSERVICE_DEFAULT_LOG_SIZE) * 1, routes: obj.routes, cmd: obj.cmd, - devices: obj.devices, + cdiDevices: obj.cdiDevices, runAsUser: obj.runAsUser, platform: obj.platform, runtime: obj.runtime, diff --git a/src/data/managers/microservice-cdi-device-manager.js b/src/data/managers/microservice-cdi-device-manager.js new file mode 100644 index 000000000..dc13ab60b --- /dev/null +++ b/src/data/managers/microservice-cdi-device-manager.js @@ -0,0 +1,35 @@ +/* + * ******************************************************************************* + * * Copyright (c) 2023 Datasance Teknoloji A.S. + * * + * * This program and the accompanying materials are made available under the + * * terms of the Eclipse Public License v. 2.0 which is available at + * * http://www.eclipse.org/legal/epl-2.0 + * * + * * SPDX-License-Identifier: EPL-2.0 + * ******************************************************************************* + * + */ + +const BaseManager = require('./base-manager') +const models = require('../models') +const MicroserviceCdiDev = models.MicroserviceCdiDev + +const MicroserviceCdiDevExcludedFields = [ + 'id', + 'microservice_uuid', + 'microserviceUuid' +] + +class MicroserviceCdiDevManager extends BaseManager { + getEntity () { + return MicroserviceCdiDev + } + + findAllExcludeFields (where, transaction) { + return this.findAllWithAttributes(where, { exclude: MicroserviceCdiDevExcludedFields }, transaction) + } +} + +const instance = new MicroserviceCdiDevManager() +module.exports = instance diff --git a/src/data/managers/microservice-manager.js b/src/data/managers/microservice-manager.js index 47316fe54..c8a54a058 100644 --- a/src/data/managers/microservice-manager.js +++ b/src/data/managers/microservice-manager.js @@ -18,6 +18,7 @@ const MicroservicePort = models.MicroservicePort const MicroserviceEnv = models.MicroserviceEnv const MicroserviceExtraHost = models.MicroserviceExtraHost const MicroserviceArg = models.MicroserviceArg +const MicroserviceCdiDev = models.MicroserviceCdiDev const VolumeMapping = models.VolumeMapping const StraceDiagnostics = models.StraceDiagnostics const CatalogItem = models.CatalogItem @@ -67,6 +68,12 @@ class MicroserviceManager extends BaseManager { required: false, attributes: ['cmd'] }, + { + model: MicroserviceCdiDev, + as: 'cdiDevices', + required: false, + attributes: ['cdiDevices'] + }, { model: MicroservicePort, as: 'ports', @@ -153,6 +160,12 @@ class MicroserviceManager extends BaseManager { required: false, attributes: ['cmd', 'id'] }, + { + model: MicroserviceCdiDev, + as: 'cdiDevices', + required: false, + attributes: ['cdiDevices'] + }, { model: MicroservicePort, as: 'ports', @@ -241,6 +254,12 @@ class MicroserviceManager extends BaseManager { required: false, attributes: ['cmd'] }, + { + model: MicroserviceCdiDev, + as: 'cdiDevices', + required: false, + attributes: ['cdiDevices'] + }, { model: MicroservicePort, as: 'ports', diff --git a/src/data/models/microservice.js b/src/data/models/microservice.js index c43c5488e..7ce25b690 100644 --- a/src/data/models/microservice.js +++ b/src/data/models/microservice.js @@ -160,6 +160,11 @@ module.exports = (sequelize, DataTypes) => { as: 'cmd' }) + Microservice.hasMany(models.MicroserviceCdiDev, { + foreignKey: 'microservice_uuid', + as: 'cdiDevices' + }) + Microservice.hasMany(models.MicroserviceExtraHost, { foreignKey: 'microservice_uuid', as: 'extraHosts' diff --git a/src/data/models/microservicedev.js b/src/data/models/microserviceCdiDev.js similarity index 60% rename from src/data/models/microservicedev.js rename to src/data/models/microserviceCdiDev.js index ab3846f1b..a47874a61 100644 --- a/src/data/models/microservicedev.js +++ b/src/data/models/microserviceCdiDev.js @@ -1,6 +1,6 @@ 'use strict' module.exports = (sequelize, DataTypes) => { - const MicroserviceDev = sequelize.define('MicroserviceDev', { + const MicroserviceCdiDev = sequelize.define('MicroserviceCdiDev', { id: { type: DataTypes.INTEGER, primaryKey: true, @@ -8,17 +8,17 @@ module.exports = (sequelize, DataTypes) => { allowNull: false, field: 'id' }, - devices: { + cdiDevices: { type: DataTypes.TEXT, - field: 'devices' + field: 'cdi_devices' } }, { - tableName: 'MicroserviceDevs', + tableName: 'MicroservicecdiDevices', timestamps: false, underscored: true }) - MicroserviceArg.associate = function (models) { - MicroserviceArg.belongsTo(models.Microservice, { + MicroserviceCdiDev.associate = function (models) { + MicroserviceCdiDev.belongsTo(models.Microservice, { foreignKey: { name: 'microserviceUuid', field: 'microservice_uuid' @@ -27,5 +27,5 @@ module.exports = (sequelize, DataTypes) => { onDelete: 'cascade' }) } - return MicroserviceDev + return MicroserviceCdiDev } diff --git a/src/schemas/microservice.js b/src/schemas/microservice.js index 8eae561bb..23b07f2f5 100644 --- a/src/schemas/microservice.js +++ b/src/schemas/microservice.js @@ -50,7 +50,7 @@ const microserviceCreate = { 'cmd': { 'type': 'array', 'items': { 'type': 'string' } }, - 'devices': { + 'cdiDevices': { 'type': 'array', 'items': { 'type': 'string' } }, 'runAsUser': { 'type': 'string' }, @@ -97,7 +97,7 @@ const microserviceUpdate = { 'cmd': { 'type': 'array', 'items': { 'type': 'string' } }, - 'devices': { + 'cdiDevices': { 'type': 'array', 'items': { 'type': 'string' } }, 'runAsUser': { 'type': 'string' }, diff --git a/src/services/agent-service.js b/src/services/agent-service.js index 2a0e2c402..5e2fe480a 100644 --- a/src/services/agent-service.js +++ b/src/services/agent-service.js @@ -299,11 +299,7 @@ const getAgentMicroservices = async function (fog, transaction) { config: microservice.config, rebuild: microservice.rebuild, rootHostAccess: microservice.rootHostAccess, - devices: microservice.devices, - runAsUser: microservice.runAsUser, - platform: microservice.platform, - runtime: microservice.runtime, - devices: microservice.devices, + cdiDevices: microservice.cdiDevices, runAsUser: microservice.runAsUser, platform: microservice.platform, runtime: microservice.runtime, diff --git a/src/services/microservices-service.js b/src/services/microservices-service.js index 1dd83ac2f..56ef51cd8 100644 --- a/src/services/microservices-service.js +++ b/src/services/microservices-service.js @@ -15,6 +15,7 @@ const TransactionDecorator = require('../decorators/transaction-decorator') const MicroserviceManager = require('../data/managers/microservice-manager') const MicroserviceStatusManager = require('../data/managers/microservice-status-manager') const MicroserviceArgManager = require('../data/managers/microservice-arg-manager') +const MicroserviceCdiDevManager = require('../data/managers/microservice-cdi-device-manager') const MicroserviceEnvManager = require('../data/managers/microservice-env-manager') const MicroservicePortService = require('../services/microservice-ports/factory') const CatalogItemImageManager = require('../data/managers/catalog-item-image-manager') @@ -286,6 +287,11 @@ async function createMicroserviceEndPoint (microserviceData, isCLI, transaction) await _createArg(microservice, arg, transaction) } } + if (microserviceData.cdiDevices) { + for (const cdiDevices of microserviceData.cdiDevices) { + await _createCdiDevices(microservice, cdiDevices, transaction) + } + } if (microserviceData.volumeMappings) { await _createVolumeMappings(microservice, microserviceData.volumeMappings, transaction) } @@ -371,7 +377,7 @@ async function updateSystemMicroserviceEndPoint (microserviceUuid, microserviceD rebuild: microserviceData.rebuild, iofogUuid: newFog.uuid, rootHostAccess: microserviceData.rootHostAccess, - devices: microserviceData.devices, + cdiDevices: microserviceData.cdiDevices, runAsUser: microserviceData.runAsUser, platform: microserviceData.platform, runtime: microserviceData.runtime, @@ -486,7 +492,7 @@ async function updateSystemMicroserviceEndPoint (microserviceUuid, microserviceD (microserviceDataUpdate.rootHostAccess !== undefined && microservice.rootHostAccess !== microserviceDataUpdate.rootHostAccess) || microserviceDataUpdate.env || microserviceDataUpdate.cmd || - microserviceDataUpdate.devices || + microserviceDataUpdate.cdiDevices || microserviceDataUpdate.runAsUser || microserviceDataUpdate.platform || microserviceDataUpdate.runtime || @@ -515,6 +521,10 @@ async function updateSystemMicroserviceEndPoint (microserviceUuid, microserviceD await _updateArg(microserviceDataUpdate.cmd, microserviceUuid, transaction) } + if (microserviceDataUpdate.cdiDevices) { + await _updateCdiDevices(microserviceDataUpdate.cdiDevices, microserviceUuid, transaction) + } + if (microserviceDataUpdate.iofogUuid && microserviceDataUpdate.iofogUuid !== microservice.iofogUuid) { await MicroservicePortService.movePublicPortsToNewFog(updatedMicroservice, transaction) } @@ -573,7 +583,7 @@ async function updateMicroserviceEndPoint (microserviceUuid, microserviceData, i rebuild: microserviceData.rebuild, iofogUuid: newFog.uuid, rootHostAccess: microserviceData.rootHostAccess, - devices: microserviceData.devices, + cdiDevices: microserviceData.cdiDevices, runAsUser: microserviceData.runAsUser, platform: microserviceData.platform, runtime: microserviceData.runtime, @@ -692,7 +702,7 @@ async function updateMicroserviceEndPoint (microserviceUuid, microserviceData, i (microserviceDataUpdate.rootHostAccess !== undefined && microservice.rootHostAccess !== microserviceDataUpdate.rootHostAccess) || microserviceDataUpdate.env || microserviceDataUpdate.cmd || - microserviceDataUpdate.devices || + microserviceDataUpdate.cdiDevices || microserviceDataUpdate.runAsUser || microserviceDataUpdate.platform || microserviceDataUpdate.runtime || @@ -721,6 +731,10 @@ async function updateMicroserviceEndPoint (microserviceUuid, microserviceData, i await _updateArg(microserviceDataUpdate.cmd, microserviceUuid, transaction) } + if (microserviceDataUpdate.cdiDevices) { + await _updateCdiDevices(microserviceDataUpdate.cdiDevices, microserviceUuid, transaction) + } + if (microserviceDataUpdate.iofogUuid && microserviceDataUpdate.iofogUuid !== microservice.iofogUuid) { await MicroservicePortService.movePublicPortsToNewFog(updatedMicroservice, transaction) } @@ -917,6 +931,20 @@ async function _createArg (microservice, arg, transaction) { await MicroservicePortService.switchOnUpdateFlagsForMicroservicesForPortMapping(microservice, false, transaction) } +async function _createCdiDevices (microservice, cdiDevices, transaction) { + if (!microservice.iofogUuid) { + throw new Errors.ValidationError(AppHelper.formatMessage(ErrorMessages.REQUIRED_FOG_NODE)) + } + + const mscdiDevicesData = { + cdiDevices: cdiDevices, + microserviceUuid: microservice.uuid + } + + await MicroserviceCdiDevManager.create(mscdiDevicesData, transaction) + await MicroservicePortService.switchOnUpdateFlagsForMicroservicesForPortMapping(microservice, false, transaction) +} + async function deletePortMappingEndPoint (microserviceUuid, internalPort, isCLI, transaction) { return MicroservicePortService.deletePortMapping(microserviceUuid, internalPort, isCLI, transaction) } @@ -1092,7 +1120,7 @@ async function _createMicroservice (microserviceData, isCLI, transaction) { catalogItemId: microserviceData.catalogItemId, iofogUuid: microserviceData.iofogUuid, rootHostAccess: microserviceData.rootHostAccess, - devices: microserviceData.devices, + cdiDevices: microserviceData.cdiDevices, runAsUser: microserviceData.runAsUser, platform: microserviceData.platform, runtime: microserviceData.runtime, @@ -1251,6 +1279,20 @@ async function _updateArg (arg, microserviceUuid, transaction) { } } +async function _updateCdiDevices (cdiDevices, microserviceUuid, transaction) { + await MicroserviceCdiDevManager.delete({ + microserviceUuid: microserviceUuid + }, transaction) + for (const cdiDevicesData of cdiDevices) { + const envObj = { + microserviceUuid: microserviceUuid, + cdiDevices: cdiDevicesData + } + + await MicroserviceCdiDevManager.create(envObj, transaction) + } +} + async function _updatePorts (newPortMappings, microservice, transaction) { await MicroservicePortService.deletePortMappings(microservice, transaction) for (const portMapping of newPortMappings) { From 7eff03da1e8710519160b855f29c8b8a082b01d5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emirhan=20Durmu=C5=9F?= Date: Thu, 18 Jul 2024 14:22:39 +0300 Subject: [PATCH 110/178] version updated --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 02a7c3beb..b4f5ff799 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@datasance/iofogcontroller", - "version": "3.2.1-beta3", + "version": "3.2.1", "description": "ioFog Controller project for Eclipse IoFog @ iofog.org \\nCopyright (c) 2023 Datasance Teknoloji A.S.", "main": "./src/main.js", "author": "Emirhan Durmus", From c86c40ee5b91227b02fc777f8dd554298d6dcf50 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emirhan=20Durmu=C5=9F?= Date: Thu, 18 Jul 2024 14:30:25 +0300 Subject: [PATCH 111/178] release --- .nsprc | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.nsprc b/.nsprc index b15291f0e..613f525df 100644 --- a/.nsprc +++ b/.nsprc @@ -1,5 +1,8 @@ { "1097496": { "notes": "" + }, + "1098094": { + "notes": "" } } \ No newline at end of file From f8f411f9dd6c2463bf0247335f1959a49bb619ed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emirhan=20Durmu=C5=9F?= Date: Thu, 18 Jul 2024 14:36:01 +0300 Subject: [PATCH 112/178] version updated --- .nsprc | 3 +++ package.json | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/.nsprc b/.nsprc index b15291f0e..613f525df 100644 --- a/.nsprc +++ b/.nsprc @@ -1,5 +1,8 @@ { "1097496": { "notes": "" + }, + "1098094": { + "notes": "" } } \ No newline at end of file diff --git a/package.json b/package.json index 02a7c3beb..0850610c8 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@datasance/iofogcontroller", - "version": "3.2.1-beta3", + "version": "3.2.2.alpha0", "description": "ioFog Controller project for Eclipse IoFog @ iofog.org \\nCopyright (c) 2023 Datasance Teknoloji A.S.", "main": "./src/main.js", "author": "Emirhan Durmus", From 4e6afe3f07be5197ec54a679e967963c61cb97a0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emirhan=20Durmu=C5=9F?= Date: Thu, 18 Jul 2024 15:03:22 +0300 Subject: [PATCH 113/178] microservice cdi devices table name fixed --- src/data/models/microserviceCdiDev.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/data/models/microserviceCdiDev.js b/src/data/models/microserviceCdiDev.js index a47874a61..38f85081b 100644 --- a/src/data/models/microserviceCdiDev.js +++ b/src/data/models/microserviceCdiDev.js @@ -13,7 +13,7 @@ module.exports = (sequelize, DataTypes) => { field: 'cdi_devices' } }, { - tableName: 'MicroservicecdiDevices', + tableName: 'MicroserviceCdiDevices', timestamps: false, underscored: true }) From 0cdd809429cb2a77084035bb947e199fb545e661 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emirhan=20Durmu=C5=9F?= Date: Sat, 20 Jul 2024 15:48:14 +0300 Subject: [PATCH 114/178] microservice response and get agent microservice edited --- docs/swagger.yaml | 2 +- src/services/agent-service.js | 4 ++-- src/services/microservices-service.js | 4 +++- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/docs/swagger.yaml b/docs/swagger.yaml index 147c7a4d7..136955969 100755 --- a/docs/swagger.yaml +++ b/docs/swagger.yaml @@ -3250,7 +3250,7 @@ components: value: type: string runAsUser: - type: number + type: string platform: type: string runtime: diff --git a/src/services/agent-service.js b/src/services/agent-service.js index 5e2fe480a..fee8ebc96 100644 --- a/src/services/agent-service.js +++ b/src/services/agent-service.js @@ -288,7 +288,7 @@ const getAgentMicroservices = async function (fog, transaction) { } }) const cmd = microservice.cmd && microservice.cmd.sort((a, b) => a.id - b.id).map((it) => it.cmd) - + const cdiDevices = microservice.cdiDevices && microservice.cdiDevices.sort((a, b) => a.id - b.id).map((it) => it.cdiDevices) const registryId = microservice.catalogItem && microservice.catalogItem.registry ? microservice.catalogItem.registry.id : microservice.registry.id const extraHosts = microservice.extraHosts ? microservice.extraHosts.map(_mapExtraHost) : [] @@ -299,7 +299,6 @@ const getAgentMicroservices = async function (fog, transaction) { config: microservice.config, rebuild: microservice.rebuild, rootHostAccess: microservice.rootHostAccess, - cdiDevices: microservice.cdiDevices, runAsUser: microservice.runAsUser, platform: microservice.platform, runtime: microservice.runtime, @@ -313,6 +312,7 @@ const getAgentMicroservices = async function (fog, transaction) { env, extraHosts, cmd, + cdiDevices, routes, isConsumer } diff --git a/src/services/microservices-service.js b/src/services/microservices-service.js index 56ef51cd8..191698b78 100644 --- a/src/services/microservices-service.js +++ b/src/services/microservices-service.js @@ -1395,6 +1395,8 @@ async function _buildGetMicroserviceResponse (microservice, transaction) { const env = await MicroserviceEnvManager.findAllExcludeFields({ microserviceUuid: microserviceUuid }, transaction) const cmd = await MicroserviceArgManager.findAllExcludeFields({ microserviceUuid: microserviceUuid }, transaction) const arg = cmd.map((it) => it.cmd) + const cdiDevices = await MicroserviceCdiDevManager.findAllExcludeFields({ microserviceUuid: microserviceUuid }, transaction) + const cdiDevs = cdiDevices.map((it) => it.cdiDevices) const status = await MicroserviceStatusManager.findAllExcludeFields({ microserviceUuid: microserviceUuid }, transaction) // build microservice response @@ -1409,9 +1411,9 @@ async function _buildGetMicroserviceResponse (microservice, transaction) { res.routes = routes.map((r) => r.destMicroserviceUuid) res.env = env res.cmd = arg + res.cdiDevices = cdiDevs res.extraHosts = extraHosts.map(eH => ({ name: eH.name, address: eH.template, value: eH.value })) res.images = images.map(i => ({ containerImage: i.containerImage, fogTypeId: i.fogTypeId })) - if (status && status.length) { res.status = status[0] } From 5235421ba1fc110baa8f998380bd432d491afb4d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emirhan=20Durmu=C5=9F?= Date: Mon, 22 Jul 2024 15:08:59 +0300 Subject: [PATCH 115/178] release name --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 0850610c8..80268a4f1 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@datasance/iofogcontroller", - "version": "3.2.2.alpha0", + "version": "3.3.0-beta", "description": "ioFog Controller project for Eclipse IoFog @ iofog.org \\nCopyright (c) 2023 Datasance Teknoloji A.S.", "main": "./src/main.js", "author": "Emirhan Durmus", From a1de6f97df606367033577fcec2784903047dd85 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emirhan=20Durmu=C5=9F?= Date: Wed, 24 Jul 2024 10:21:12 +0300 Subject: [PATCH 116/178] viewer version updated --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 80268a4f1..c04409747 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@datasance/iofogcontroller", - "version": "3.3.0-beta", + "version": "3.3.0", "description": "ioFog Controller project for Eclipse IoFog @ iofog.org \\nCopyright (c) 2023 Datasance Teknoloji A.S.", "main": "./src/main.js", "author": "Emirhan Durmus", @@ -57,7 +57,7 @@ "iofog-controller": "src/main.js" }, "dependencies": { - "@datasance/ecn-viewer": "0.1.12", + "@datasance/ecn-viewer": "0.2.0", "axios": "1.7.2", "body-parser": "^1.20.2", "child_process": "1.0.2", From e3fd85ba8240232043b7149c27625fa34d065285 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emirhan=20Durmu=C5=9F?= Date: Wed, 24 Jul 2024 11:14:30 +0300 Subject: [PATCH 117/178] viewer updated --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index c04409747..797c25e6c 100644 --- a/package.json +++ b/package.json @@ -57,7 +57,7 @@ "iofog-controller": "src/main.js" }, "dependencies": { - "@datasance/ecn-viewer": "0.2.0", + "@datasance/ecn-viewer": "0.2.1", "axios": "1.7.2", "body-parser": "^1.20.2", "child_process": "1.0.2", From 4bd27f2baae0f41de2af67ffbbe7649a912f5ed8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emirhan=20Durmu=C5=9F?= Date: Mon, 29 Jul 2024 17:59:09 +0300 Subject: [PATCH 118/178] viewer updated --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 797c25e6c..f66a69e93 100644 --- a/package.json +++ b/package.json @@ -57,7 +57,7 @@ "iofog-controller": "src/main.js" }, "dependencies": { - "@datasance/ecn-viewer": "0.2.1", + "@datasance/ecn-viewer": "0.2.2", "axios": "1.7.2", "body-parser": "^1.20.2", "child_process": "1.0.2", From 195ba6274c19abd7d65c311b8184a104f2363452 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emirhan=20Durmu=C5=9F?= Date: Mon, 29 Jul 2024 18:05:06 +0300 Subject: [PATCH 119/178] version updated --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index f66a69e93..1aaa2c6c3 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@datasance/iofogcontroller", - "version": "3.3.0", + "version": "3.3.1", "description": "ioFog Controller project for Eclipse IoFog @ iofog.org \\nCopyright (c) 2023 Datasance Teknoloji A.S.", "main": "./src/main.js", "author": "Emirhan Durmus", From 52ce828a745caf82d36cbd6930104bcb3c9f94ac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emirhan=20Durmu=C5=9F?= Date: Mon, 29 Jul 2024 21:36:33 +0300 Subject: [PATCH 120/178] viewer updated to 0.2.3 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 1aaa2c6c3..24fff87b0 100644 --- a/package.json +++ b/package.json @@ -57,7 +57,7 @@ "iofog-controller": "src/main.js" }, "dependencies": { - "@datasance/ecn-viewer": "0.2.2", + "@datasance/ecn-viewer": "0.2.3", "axios": "1.7.2", "body-parser": "^1.20.2", "child_process": "1.0.2", From 012e85e54221a99b67cff9ef83d488acc1d5525b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emirhan=20Durmu=C5=9F?= Date: Tue, 20 Aug 2024 12:51:11 +0300 Subject: [PATCH 121/178] viewer updated --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 24fff87b0..26b1ddbb7 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@datasance/iofogcontroller", - "version": "3.3.1", + "version": "3.3.2", "description": "ioFog Controller project for Eclipse IoFog @ iofog.org \\nCopyright (c) 2023 Datasance Teknoloji A.S.", "main": "./src/main.js", "author": "Emirhan Durmus", @@ -57,7 +57,7 @@ "iofog-controller": "src/main.js" }, "dependencies": { - "@datasance/ecn-viewer": "0.2.3", + "@datasance/ecn-viewer": "0.2.4", "axios": "1.7.2", "body-parser": "^1.20.2", "child_process": "1.0.2", From 78e40a18516b88aa498354ea18c968c1746e8ea9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emirhan=20Durmu=C5=9F?= Date: Thu, 22 Aug 2024 20:47:12 +0300 Subject: [PATCH 122/178] postgres db provider added and viewer version updated --- .dockerignore | 1 + .gitignore | 1 + package.json | 5 +++-- src/config/development.json | 7 +++++++ src/config/production.json | 7 +++++++ src/data/models/fog.js | 6 +++--- src/data/providers/postgres.js | 25 +++++++++++++++++++++++++ 7 files changed, 47 insertions(+), 5 deletions(-) create mode 100644 src/data/providers/postgres.js diff --git a/.dockerignore b/.dockerignore index 0e9dec078..10f384634 100644 --- a/.dockerignore +++ b/.dockerignore @@ -10,6 +10,7 @@ node_modules /src/data/providers/* !/src/data/providers/sqlite.js !/src/data/providers/mysql.js +!/src/data/providers/postgres.js !/src/data/providers/database-*.js /src/config/*-config.json .DS_Store diff --git a/.gitignore b/.gitignore index 427fc02a9..3524ddf39 100644 --- a/.gitignore +++ b/.gitignore @@ -10,6 +10,7 @@ node_modules /src/data/providers/* !/src/data/providers/sqlite.js !/src/data/providers/mysql.js +!/src/data/providers/postgres.js !/src/data/providers/database-*.js /src/config/*-config.json .DS_Store diff --git a/package.json b/package.json index 26b1ddbb7..5085e3568 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@datasance/iofogcontroller", - "version": "3.3.2", + "version": "3.4.0", "description": "ioFog Controller project for Eclipse IoFog @ iofog.org \\nCopyright (c) 2023 Datasance Teknoloji A.S.", "main": "./src/main.js", "author": "Emirhan Durmus", @@ -57,7 +57,7 @@ "iofog-controller": "src/main.js" }, "dependencies": { - "@datasance/ecn-viewer": "0.2.4", + "@datasance/ecn-viewer": "0.3.2", "axios": "1.7.2", "body-parser": "^1.20.2", "child_process": "1.0.2", @@ -92,6 +92,7 @@ "pino": "9.1.0", "pino-std-serializers": "7.0.0", "portscanner": "2.2.0", + "pg": "8.12.0", "qs": "6.12.1", "retry-as-promised": "7.0.4", "sequelize": "6.37.3", diff --git a/src/config/development.json b/src/config/development.json index 0fb8ec1a5..bef344843 100644 --- a/src/config/development.json +++ b/src/config/development.json @@ -50,6 +50,13 @@ "username": "", "password": "", "databaseName": "" + }, + "postgres": { + "host": "", + "port": "", + "username": "", + "password": "", + "databaseName": "" } } } diff --git a/src/config/production.json b/src/config/production.json index e8deb45f3..7c31289e8 100644 --- a/src/config/production.json +++ b/src/config/production.json @@ -42,6 +42,13 @@ "username": "", "password": "", "databaseName": "" + }, + "postgres": { + "host": "", + "port": "", + "username": "", + "password": "", + "databaseName": "" } } } diff --git a/src/data/models/fog.js b/src/data/models/fog.js index b3e131eb1..07e02c87e 100644 --- a/src/data/models/fog.js +++ b/src/data/models/fog.js @@ -94,18 +94,18 @@ module.exports = (sequelize, DataTypes) => { get () { return convertToInt(this.getDataValue('systemAvailableDisk')) }, - field: 'system-available-disk' + field: 'system_available_disk' }, systemAvailableMemory: { type: DataTypes.BIGINT, get () { return convertToInt(this.getDataValue('systemAvailableMemory')) }, - field: 'system-available-memory' + field: 'system_available_memory' }, systemTotalCpu: { type: DataTypes.FLOAT, - field: 'system-total-cpu' + field: 'system_total_cpu' }, securityStatus: { type: DataTypes.TEXT, diff --git a/src/data/providers/postgres.js b/src/data/providers/postgres.js new file mode 100644 index 000000000..b5e959f08 --- /dev/null +++ b/src/data/providers/postgres.js @@ -0,0 +1,25 @@ +const Sequelize = require('sequelize') + +const config = require('../../config') +const DatabaseProvider = require('./database-provider') + +class PostgresDatabaseProvider extends DatabaseProvider { + constructor () { + super() + + const postgresConfig = config.get('Database:Config:postgre', {}) + postgresConfig.dialect = 'postgres' + postgresConfig.host = process.env.DB_HOST || postgresConfig.host + postgresConfig.port = process.env.DB_PORT || postgresConfig.port + postgresConfig.username = process.env.DB_USERNAME || postgresConfig.username + postgresConfig.password = process.env.DB_PASSWORD || postgresConfig.password + postgresConfig.databaseName = process.env.DB_NAME || postgresConfig.database + + this.sequelize = new Sequelize(postgresConfig.databaseName, postgresConfig.username, postgresConfig.password, postgresConfig) + } + + async initDB () { + } +} + +module.exports = PostgresDatabaseProvider From 25db5be1eb21a1cba8afe9db0da6a16841bbcb0a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emirhan=20Durmu=C5=9F?= Date: Fri, 23 Aug 2024 11:28:32 +0300 Subject: [PATCH 123/178] vulnerable packages fixed --- .nsprc | 7 +- package-lock.json | 590 ++++++++++++++++++++++------------------------ package.json | 12 +- 3 files changed, 295 insertions(+), 314 deletions(-) diff --git a/.nsprc b/.nsprc index 613f525df..9c2174be1 100644 --- a/.nsprc +++ b/.nsprc @@ -1,8 +1,3 @@ { - "1097496": { - "notes": "" - }, - "1098094": { - "notes": "" - } + } \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 29d0fd375..8db5b3b39 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,21 +1,21 @@ { "name": "@datasance/iofogcontroller", - "version": "3.2.1-beta2", + "version": "3.4.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@datasance/iofogcontroller", - "version": "3.2.1-beta2", + "version": "3.4.0", "hasInstallScript": true, "license": "EPL-2.0", "dependencies": { - "@datasance/ecn-viewer": "0.1.7", - "axios": "1.7.2", + "@datasance/ecn-viewer": "0.3.2", + "axios": "1.7.4", "body-parser": "^1.20.2", "child_process": "1.0.2", "command-line-args": "5.2.1", - "command-line-usage": "7.0.1", + "command-line-usage": "7.0.3", "concurrent-queue": "7.0.2", "cookie-parser": "1.4.6", "cors": "2.8.5", @@ -31,8 +31,8 @@ "is-elevated": "3.0.0", "js-yaml": "4.1.0", "jsonschema": "1.4.1", - "keycloak-connect": "25.0.1", - "minimatch": "9.0.4", + "keycloak-connect": "25.0.4", + "minimatch": "10.0.1", "moment": "2.30.1", "moment-timezone": "0.5.45", "morgan": "1.10.0", @@ -42,6 +42,7 @@ "node-fetch-npm": "^2.0.4", "os": "0.1.2", "path": "0.12.7", + "pg": "8.12.0", "pino": "9.1.0", "pino-std-serializers": "7.0.0", "portscanner": "2.2.0", @@ -51,7 +52,7 @@ "sqlite3": "^5.1.7", "string-format": "2.0.0", "swagger-ui-express": "^5.0.0", - "umzug": "3.8.1", + "umzug": "^3.7.0", "underscore": "1.13.6", "xss-clean": "0.1.1" }, @@ -66,9 +67,9 @@ "chai-http": "4.4.0", "eslint": "9.2.0", "eslint-config-google": "0.14.0", - "mocha": "10.5.2", + "mocha": "10.6.0", "mocha-junit-reporter": "2.2.1", - "newman": "6.1.2", + "newman": "^6.2.0", "newman-reporter-junitfull": "1.1.1", "nyc": "15.1.0", "sequelize-cli": "6.6.2", @@ -78,26 +79,6 @@ "standard": "12.0.1" } }, - "node_modules/@75lb/deep-merge": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@75lb/deep-merge/-/deep-merge-1.1.1.tgz", - "integrity": "sha512-xvgv6pkMGBA6GwdyJbNAnDmfAIR/DfWhrj9jgWh3TY7gRm3KO46x/GPjRg6wJ0nOepwqrNxFfojebh0Df4h4Tw==", - "dependencies": { - "lodash.assignwith": "^4.2.0", - "typical": "^7.1.1" - }, - "engines": { - "node": ">=12.17" - } - }, - "node_modules/@75lb/deep-merge/node_modules/typical": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/typical/-/typical-7.1.1.tgz", - "integrity": "sha512-T+tKVNs6Wu7IWiAce5BgMd7OZfNYUndHwc5MknN+UHOudi7sGZzuHdCadllRuqJ3fPtgFtIH9+lt9qRv6lmpfA==", - "engines": { - "node": ">=12.17" - } - }, "node_modules/@ampproject/remapping": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", @@ -576,9 +557,9 @@ } }, "node_modules/@datasance/ecn-viewer": { - "version": "0.1.7", - "resolved": "https://npm.pkg.github.com/download/@datasance/ecn-viewer/0.1.7/c8adebf78e1f9d6f51c94e6560c13e31057873c6", - "integrity": "sha512-51zzl9vPevuyW5APcCGgTmBrFYoKbZbSzJeNhKZ7HZSjfSWfEPrB58dj7myvMK0vSEtgGXgAXdrmmyHmc2InDQ==", + "version": "0.3.2", + "resolved": "https://npm.pkg.github.com/download/@datasance/ecn-viewer/0.3.2/000fea7fc7fe1e3cbcd93c072be7defc778b30df", + "integrity": "sha512-yTcQxkue+hwvqVItzL26wJ7Pc23+dAWusMSL/7MyXZYfNHd9EwDFe+pNfhWuuOZRSQVwKAWjlFHJhA0JIoH9NQ==", "license": "EPL-2.0" }, "node_modules/@eslint-community/eslint-utils": { @@ -1030,6 +1011,7 @@ "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" @@ -1042,6 +1024,7 @@ "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" } @@ -1050,6 +1033,7 @@ "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" @@ -1104,9 +1088,9 @@ } }, "node_modules/@postman/tunnel-agent": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/@postman/tunnel-agent/-/tunnel-agent-0.6.3.tgz", - "integrity": "sha512-k57fzmAZ2PJGxfOA4SGR05ejorHbVAa/84Hxh/2nAztjNXc4ZjOm9NUIk6/Z6LCrBvJZqjRZbN8e/nROVUPVdg==", + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/@postman/tunnel-agent/-/tunnel-agent-0.6.4.tgz", + "integrity": "sha512-CJJlq8V7rNKhAw4sBfjixKpJW00SHqebqNUQKxMoepgeWZIbdPcD+rguRcivGhS4N12PymDcKgUgSD4rVC+RjQ==", "dev": true, "dependencies": { "safe-buffer": "^5.0.1" @@ -1586,9 +1570,9 @@ } }, "node_modules/ansi-colors": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", - "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", "dev": true, "engines": { "node": ">=6" @@ -1886,15 +1870,15 @@ } }, "node_modules/aws4": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz", - "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==", + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.13.1.tgz", + "integrity": "sha512-u5w79Rd7SU4JaIlA/zFqG+gOiuq25q5VLyZ8E+ijJeILuTxVzZgp2CaGw/UTw6pXYN9XMO9yiqj/nEHmhTG5CA==", "dev": true }, "node_modules/axios": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.2.tgz", - "integrity": "sha512-2A8QhOMrbomlDuiLeK9XibIBzuHeRcqqNOHp0Cyp5EoJ1IFDh+XZH3A6BkXtv0K4gFGCI0Y4BM7B1wOEi0Rmgw==", + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.4.tgz", + "integrity": "sha512-DukmaFRnY6AzAALSH4J2M3k6PkaC+MfaAGdEERRWcC9q3/TWQwLpHR8ZRLKTdQ3aBDL64EdluRDjJqKw+BPZEw==", "dependencies": { "follow-redirects": "^1.15.6", "form-data": "^4.0.0", @@ -2180,11 +2164,12 @@ } }, "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, "dependencies": { - "fill-range": "^7.0.1" + "fill-range": "^7.1.1" }, "engines": { "node": ">=8" @@ -2659,9 +2644,9 @@ } }, "node_modules/cli-table3": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.3.tgz", - "integrity": "sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==", + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.5.tgz", + "integrity": "sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==", "dev": true, "dependencies": { "string-width": "^4.2.0" @@ -2765,13 +2750,13 @@ } }, "node_modules/command-line-usage": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-7.0.1.tgz", - "integrity": "sha512-NCyznE//MuTjwi3y84QVUGEOT+P5oto1e1Pk/jFPVdPPfsG03qpTIl3yw6etR+v73d0lXsoojRpvbru2sqePxQ==", + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-7.0.3.tgz", + "integrity": "sha512-PqMLy5+YGwhMh1wS04mVG44oqDsgyLRSKJBdOo1bnYhMKBW65gZF1dRp2OZRhiTjgUHljy99qkO7bsctLaw35Q==", "dependencies": { "array-back": "^6.2.2", "chalk-template": "^0.4.0", - "table-layout": "^3.0.0", + "table-layout": "^4.1.0", "typical": "^7.1.1" }, "engines": { @@ -3383,9 +3368,9 @@ } }, "node_modules/diff": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", - "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz", + "integrity": "sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==", "dev": true, "engines": { "node": ">=0.3.1" @@ -3498,9 +3483,9 @@ "dev": true }, "node_modules/elliptic": { - "version": "6.5.5", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.5.tgz", - "integrity": "sha512-7EjbcmUm17NQFu4Pmgmq2olYMj8nwMnpcddByChSUjArp8F5DQWcIcpriwO4ZToLNAJig0yiyjswfyGNje/ixw==", + "version": "6.5.7", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.7.tgz", + "integrity": "sha512-ESVCtTwiA+XhY3wyh24QqRGBoP3rEdDUl3EDUUo9tft074fi19IrdpH7hLCMMP3CIj7jb3W96rn8lt/BqIlt5Q==", "dependencies": { "bn.js": "^4.11.9", "brorand": "^1.1.0", @@ -4570,32 +4555,6 @@ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", "dev": true }, - "node_modules/fast-glob": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", - "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", - "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/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-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", @@ -4626,6 +4585,7 @@ "version": "1.17.1", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "dev": true, "dependencies": { "reusify": "^1.0.4" } @@ -4706,18 +4666,19 @@ } }, "node_modules/filesize": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/filesize/-/filesize-10.1.0.tgz", - "integrity": "sha512-GTLKYyBSDz3nPhlLVPjPWZCnhkd9TrrRArNcy8Z+J2cqScB7h2McAzR6NBX6nYOoWafql0roY8hrocxnZBv9CQ==", + "version": "10.1.4", + "resolved": "https://registry.npmjs.org/filesize/-/filesize-10.1.4.tgz", + "integrity": "sha512-ryBwPIIeErmxgPnm6cbESAzXjuEFubs+yKYLBZvg3CaiNcmkJChoOGcBSrZ6IwkMwPABwPpVXE6IlNdGJJrvEg==", "dev": true, "engines": { "node": ">= 10.4.0" } }, "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==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, "dependencies": { "to-regex-range": "^5.0.1" }, @@ -4971,8 +4932,7 @@ "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==", - "devOptional": true + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" }, "node_modules/fsevents": { "version": "2.3.3", @@ -5205,7 +5165,6 @@ "version": "8.1.0", "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", - "dev": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -5236,7 +5195,6 @@ "version": "5.1.6", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "dev": true, "dependencies": { "brace-expansion": "^2.0.1" }, @@ -5780,7 +5738,6 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "devOptional": true, "dependencies": { "once": "^1.3.0", "wrappy": "1" @@ -6129,6 +6086,7 @@ "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" } @@ -6145,6 +6103,7 @@ "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" }, @@ -6186,6 +6145,7 @@ "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" } @@ -6695,9 +6655,9 @@ "integrity": "sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==" }, "node_modules/jose": { - "version": "4.14.4", - "resolved": "https://registry.npmjs.org/jose/-/jose-4.14.4.tgz", - "integrity": "sha512-j8GhLiKmUAh+dsFXlX1aJCbt5KMibuKb+d7j1JaOJG6s2UjX1PQlW+OKB/sD4a/5ZYF4RcmYmLSndOoU3Lt/3g==", + "version": "5.6.3", + "resolved": "https://registry.npmjs.org/jose/-/jose-5.6.3.tgz", + "integrity": "sha512-1Jh//hEEwMhNYPDDLwXHa2ePWgWiFNNUadVmguAAw2IJ6sj9mNxV5tGXJNqlMkJAybF6Lgw1mISDxTePP/187g==", "dev": true, "funding": { "url": "https://github.com/sponsors/panva" @@ -6771,6 +6731,21 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/js-beautify/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/js-beautify/node_modules/minipass": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.1.tgz", @@ -6984,9 +6959,9 @@ } }, "node_modules/keycloak-connect": { - "version": "25.0.1", - "resolved": "https://registry.npmjs.org/keycloak-connect/-/keycloak-connect-25.0.1.tgz", - "integrity": "sha512-RjVXo+c8ahOMC2QYt/MRLq5Qx9IavII+nwN9s1kyK8DcxWvi44sqJquGFMXqCXM181LxZ2yPmzJACSoO7pBQnA==", + "version": "25.0.4", + "resolved": "https://registry.npmjs.org/keycloak-connect/-/keycloak-connect-25.0.4.tgz", + "integrity": "sha512-njiyVQOjdxUq+hIVEnC64Uzz10J8ZwYySLp8KsFxeSIuijBXpWtSjMDPZZ3fb3UVmX8I6uVKNqD1Faasd1hnIQ==", "dependencies": { "jwk-to-pem": "^2.0.0" }, @@ -7090,11 +7065,6 @@ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, - "node_modules/lodash.assignwith": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.assignwith/-/lodash.assignwith-4.2.0.tgz", - "integrity": "sha512-ZznplvbvtjK2gMvnQ1BR/zqPFZmS6jbK4p+6Up4xcRYA7yMIwxHCfbTcrYxXKzzqLsQ05eJPVznEW3tuwV7k1g==" - }, "node_modules/lodash.camelcase": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", @@ -7262,14 +7232,6 @@ "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", @@ -7278,18 +7240,6 @@ "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", @@ -7360,14 +7310,14 @@ "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==" }, "node_modules/minimatch": { - "version": "9.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", - "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.0.1.tgz", + "integrity": "sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==", "dependencies": { "brace-expansion": "^2.0.1" }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": "20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -7529,31 +7479,31 @@ "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==" }, "node_modules/mocha": { - "version": "10.5.2", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.5.2.tgz", - "integrity": "sha512-9btlN3JKCefPf+vKd/kcKz2SXxi12z6JswkGfaAF0saQvnsqLJk504ZmbxhSoENge08E9dsymozKgFMTl5PQsA==", + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.6.0.tgz", + "integrity": "sha512-hxjt4+EEB0SA0ZDygSS015t65lJw/I2yRCS3Ae+SJ5FrbzrXgfYwJr96f0OvIXdj7h4lv/vLCrH3rkiuizFSvw==", "dev": true, "dependencies": { - "ansi-colors": "4.1.1", - "browser-stdout": "1.3.1", + "ansi-colors": "^4.1.3", + "browser-stdout": "^1.3.1", "chokidar": "^3.5.3", - "debug": "4.3.4", - "diff": "5.0.0", - "escape-string-regexp": "4.0.0", - "find-up": "5.0.0", - "glob": "8.1.0", - "he": "1.2.0", - "js-yaml": "4.1.0", - "log-symbols": "4.1.0", - "minimatch": "5.0.1", - "ms": "2.1.3", - "serialize-javascript": "6.0.0", - "strip-json-comments": "3.1.1", - "supports-color": "8.1.1", - "workerpool": "6.2.1", - "yargs": "16.2.0", - "yargs-parser": "20.2.4", - "yargs-unparser": "2.0.0" + "debug": "^4.3.5", + "diff": "^5.2.0", + "escape-string-regexp": "^4.0.0", + "find-up": "^5.0.0", + "glob": "^8.1.0", + "he": "^1.2.0", + "js-yaml": "^4.1.0", + "log-symbols": "^4.1.0", + "minimatch": "^5.1.6", + "ms": "^2.1.3", + "serialize-javascript": "^6.0.2", + "strip-json-comments": "^3.1.1", + "supports-color": "^8.1.1", + "workerpool": "^6.5.1", + "yargs": "^16.2.0", + "yargs-parser": "^20.2.9", + "yargs-unparser": "^2.0.0" }, "bin": { "_mocha": "bin/_mocha", @@ -7603,9 +7553,9 @@ "dev": true }, "node_modules/mocha/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", + "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", "dev": true, "dependencies": { "ms": "2.1.2" @@ -7626,9 +7576,9 @@ "dev": true }, "node_modules/mocha/node_modules/minimatch": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", - "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", "dev": true, "dependencies": { "brace-expansion": "^2.0.1" @@ -7847,29 +7797,29 @@ } }, "node_modules/newman": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/newman/-/newman-6.1.2.tgz", - "integrity": "sha512-VyaXFguIYM7QUWXHQlHtkj3axzZQFHgj9OYkhbKpq4iphKAJckHFstltacSBtgpeiGp5SKk9FBdCYVbJXcLvnQ==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/newman/-/newman-6.2.0.tgz", + "integrity": "sha512-CHo/wMv+Q9B3YcIJ18pdmY9XN9X8mc2hXso8yybeclV0BVPSFz1+P5vJELWg5DB/qJgxJOh+B+k+i9tTqfzcbw==", "dev": true, "dependencies": { "@postman/tough-cookie": "4.1.3-postman.1", "async": "3.2.5", "chardet": "2.0.0", "cli-progress": "3.12.0", - "cli-table3": "0.6.3", + "cli-table3": "0.6.5", "colors": "1.4.0", "commander": "11.1.0", "csv-parse": "4.16.3", - "filesize": "10.1.0", + "filesize": "10.1.4", "liquid-json": "0.3.1", "lodash": "4.17.21", "mkdirp": "3.0.1", - "postman-collection": "4.4.0", + "postman-collection": "4.5.0", "postman-collection-transformer": "4.1.8", - "postman-request": "2.88.1-postman.33", - "postman-runtime": "7.37.1", + "postman-request": "2.88.1-postman.39", + "postman-runtime": "7.41.2", "pretty-ms": "7.0.1", - "semver": "7.6.0", + "semver": "7.6.3", "serialised-error": "1.1.3", "word-wrap": "1.2.5", "xmlbuilder": "15.1.1" @@ -8751,11 +8701,87 @@ "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", "dev": true }, + "node_modules/pg": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/pg/-/pg-8.12.0.tgz", + "integrity": "sha512-A+LHUSnwnxrnL/tZ+OLfqR1SxLN3c/pgDztZ47Rpbsd4jUytsTtwQo/TLPRzPJMp/1pbhYVhH9cuSZLAajNfjQ==", + "dependencies": { + "pg-connection-string": "^2.6.4", + "pg-pool": "^3.6.2", + "pg-protocol": "^1.6.1", + "pg-types": "^2.1.0", + "pgpass": "1.x" + }, + "engines": { + "node": ">= 8.0.0" + }, + "optionalDependencies": { + "pg-cloudflare": "^1.1.1" + }, + "peerDependencies": { + "pg-native": ">=3.0.1" + }, + "peerDependenciesMeta": { + "pg-native": { + "optional": true + } + } + }, + "node_modules/pg-cloudflare": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pg-cloudflare/-/pg-cloudflare-1.1.1.tgz", + "integrity": "sha512-xWPagP/4B6BgFO+EKz3JONXv3YDgvkbVrGw2mTo3D6tVDQRh1e7cqVGvyR3BE+eQgAvx1XhW/iEASj4/jCWl3Q==", + "optional": true + }, "node_modules/pg-connection-string": { "version": "2.6.4", "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.6.4.tgz", "integrity": "sha512-v+Z7W/0EO707aNMaAEfiGnGL9sxxumwLl2fJvCQtMn9Fxsg+lPpPkdcyBSv/KFgpGdYkMfn+EI1Or2EHjpgLCA==" }, + "node_modules/pg-int8": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz", + "integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/pg-pool": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.6.2.tgz", + "integrity": "sha512-Htjbg8BlwXqSBQ9V8Vjtc+vzf/6fVUuak/3/XXKA9oxZprwW3IMDQTGHP+KDmVL7rtd+R1QjbnCFPuTHm3G4hg==", + "peerDependencies": { + "pg": ">=8.0" + } + }, + "node_modules/pg-protocol": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.6.1.tgz", + "integrity": "sha512-jPIlvgoD63hrEuihvIg+tJhoGjUsLPn6poJY9N5CnlPd91c2T18T/9zBtLxZSb1EhYxBRoZJtzScCaWlYLtktg==" + }, + "node_modules/pg-types": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz", + "integrity": "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==", + "dependencies": { + "pg-int8": "1.0.1", + "postgres-array": "~2.0.0", + "postgres-bytea": "~1.0.0", + "postgres-date": "~1.0.4", + "postgres-interval": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pgpass": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/pgpass/-/pgpass-1.0.5.tgz", + "integrity": "sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==", + "dependencies": { + "split2": "^4.1.0" + } + }, "node_modules/picocolors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", @@ -8766,6 +8792,7 @@ "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" }, @@ -9068,10 +9095,45 @@ "node": ">= 0.4" } }, + "node_modules/postgres-array": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz", + "integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==", + "engines": { + "node": ">=4" + } + }, + "node_modules/postgres-bytea": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.0.tgz", + "integrity": "sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postgres-date": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz", + "integrity": "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postgres-interval": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz", + "integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==", + "dependencies": { + "xtend": "^4.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/postman-collection": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/postman-collection/-/postman-collection-4.4.0.tgz", - "integrity": "sha512-2BGDFcUwlK08CqZFUlIC8kwRJueVzPjZnnokWPtJCd9f2J06HBQpGL7t2P1Ud1NEsK9NHq9wdipUhWLOPj5s/Q==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/postman-collection/-/postman-collection-4.5.0.tgz", + "integrity": "sha512-152JSW9pdbaoJihwjc7Q8lc3nPg/PC9lPTHdMk7SHnHhu/GBJB7b2yb9zG7Qua578+3PxkQ/HYBuXpDSvsf7GQ==", "dev": true, "dependencies": { "@faker-js/faker": "5.5.3", @@ -9083,7 +9145,7 @@ "mime-format": "2.0.1", "mime-types": "2.1.35", "postman-url-encoder": "3.0.5", - "semver": "7.5.4", + "semver": "7.6.3", "uuid": "8.3.2" }, "engines": { @@ -9157,42 +9219,15 @@ "node": ">=0.10.0" } }, - "node_modules/postman-collection/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/postman-collection/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/postman-request": { - "version": "2.88.1-postman.33", - "resolved": "https://registry.npmjs.org/postman-request/-/postman-request-2.88.1-postman.33.tgz", - "integrity": "sha512-uL9sCML4gPH6Z4hreDWbeinKU0p0Ke261nU7OvII95NU22HN6Dk7T/SaVPaj6T4TsQqGKIFw6/woLZnH7ugFNA==", + "version": "2.88.1-postman.39", + "resolved": "https://registry.npmjs.org/postman-request/-/postman-request-2.88.1-postman.39.tgz", + "integrity": "sha512-rsncxxDlbn1YpygXSgJqbJzIjGlHFcZjbYDzeBPTQHMDfLuSTzZz735JHV8i1+lOROuJ7MjNap4eaSD3UijHzQ==", "dev": true, "dependencies": { "@postman/form-data": "~3.1.1", "@postman/tough-cookie": "~4.1.3-postman.1", - "@postman/tunnel-agent": "^0.6.3", + "@postman/tunnel-agent": "^0.6.4", "aws-sign2": "~0.7.0", "aws4": "^1.12.0", "brotli": "^1.3.3", @@ -9214,7 +9249,7 @@ "uuid": "^8.3.2" }, "engines": { - "node": ">= 6" + "node": ">= 16" } }, "node_modules/postman-request/node_modules/qs": { @@ -9227,48 +9262,48 @@ } }, "node_modules/postman-runtime": { - "version": "7.37.1", - "resolved": "https://registry.npmjs.org/postman-runtime/-/postman-runtime-7.37.1.tgz", - "integrity": "sha512-yqKN/p6Ba8+yq9iZsxJLkMPko3lKvs3hixkiPy5O7bapFQWgX6jWhny4W2O8BzE5T8KzE8s1HAgT2gi7e2Y5Jg==", + "version": "7.41.2", + "resolved": "https://registry.npmjs.org/postman-runtime/-/postman-runtime-7.41.2.tgz", + "integrity": "sha512-efKnii+yBfqZMRjV5zFh4VXogLeZB58HmLkgT+/sZcjglth23wzp+QRlkl4nbgcL2SZX6e5cLI2/aG2Of3wMyg==", "dev": true, "dependencies": { "@postman/tough-cookie": "4.1.3-postman.1", "async": "3.2.5", - "aws4": "1.12.0", + "aws4": "1.13.1", "handlebars": "4.7.8", "httpntlm": "1.8.13", - "jose": "4.14.4", + "jose": "5.6.3", "js-sha512": "0.9.0", "lodash": "4.17.21", "mime-types": "2.1.35", "node-forge": "1.3.1", "node-oauth1": "1.3.0", "performance-now": "2.1.0", - "postman-collection": "4.4.0", - "postman-request": "2.88.1-postman.33", - "postman-sandbox": "4.6.0", + "postman-collection": "4.5.0", + "postman-request": "2.88.1-postman.39", + "postman-sandbox": "5.1.1", "postman-url-encoder": "3.0.5", "serialised-error": "1.1.3", "strip-json-comments": "3.1.1", "uuid": "8.3.2" }, "engines": { - "node": ">=12" + "node": ">=16" } }, "node_modules/postman-sandbox": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/postman-sandbox/-/postman-sandbox-4.6.0.tgz", - "integrity": "sha512-+tCUEhiFAV6saqMEetRzLmSWt4/9kgVagtnrVgyqVgIGdPBIaq1p3aay54bOzYW7/QjIIz0xPF3YkJA8Olt3LQ==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postman-sandbox/-/postman-sandbox-5.1.1.tgz", + "integrity": "sha512-RfCTMwz3OaqhYYgtoe3VlHGiQl9hEmJ9sPh/XOlNcuvd/km6ARSFkKXFvQaLFsTHyXcHaqpInKaQSJi23uTynA==", "dev": true, "dependencies": { "lodash": "4.17.21", - "postman-collection": "4.4.0", + "postman-collection": "4.5.0", "teleport-javascript": "1.0.0", - "uvm": "2.1.1" + "uvm": "3.0.0" }, "engines": { - "node": ">=10" + "node": ">=16" } }, "node_modules/postman-url-encoder": { @@ -9589,6 +9624,7 @@ "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", @@ -10027,6 +10063,7 @@ "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" @@ -10062,6 +10099,7 @@ "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", @@ -10171,12 +10209,9 @@ "integrity": "sha512-nZi59hW3Sl5P3+wOO89eHBAAGwmCPd2aE1+dLZV5MO+ItQctIvAqihzaAXIQhvtH4KJPxM080HsnqltR2y8cWg==" }, "node_modules/semver": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", - "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", - "dependencies": { - "lru-cache": "^6.0.0" - }, + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "bin": { "semver": "bin/semver.js" }, @@ -10190,17 +10225,6 @@ "integrity": "sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==", "dev": true }, - "node_modules/semver/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/send": { "version": "0.18.0", "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", @@ -10437,9 +10461,9 @@ } }, "node_modules/serialize-javascript": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", - "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", "dev": true, "dependencies": { "randombytes": "^2.1.0" @@ -10620,15 +10644,6 @@ "sinon": ">=4.0.0" } }, - "node_modules/sinon/node_modules/diff": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz", - "integrity": "sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==", - "dev": true, - "engines": { - "node": ">=0.3.1" - } - }, "node_modules/slice-ansi": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-1.0.0.tgz", @@ -11859,14 +11874,6 @@ "bluebird": "^2.6.2" } }, - "node_modules/stream-read-all": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/stream-read-all/-/stream-read-all-3.0.1.tgz", - "integrity": "sha512-EWZT9XOceBPlVJRrYcykW8jyRSZYbkb/0ZK36uLEmoWVO5gxBOnntNTseNzfREsqxqdfEGQrD8SXQ3QWbBmq8A==", - "engines": { - "node": ">=10" - } - }, "node_modules/streamsearch": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", @@ -12172,21 +12179,13 @@ } }, "node_modules/table-layout": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-3.0.2.tgz", - "integrity": "sha512-rpyNZYRw+/C+dYkcQ3Pr+rLxW4CfHpXjPDnG7lYhdRoUcZTUt+KEsX+94RGp/aVp/MQU35JCITv2T/beY4m+hw==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-4.1.1.tgz", + "integrity": "sha512-iK5/YhZxq5GO5z8wb0bY1317uDF3Zjpha0QFFLA8/trAoiLbQD0HUbMesEaxyzUgDxi2QlcbM8IvqOlEjgoXBA==", "dependencies": { - "@75lb/deep-merge": "^1.1.1", "array-back": "^6.2.2", - "command-line-args": "^5.2.1", - "command-line-usage": "^7.0.0", - "stream-read-all": "^3.0.1", - "typical": "^7.1.1", "wordwrapjs": "^5.1.0" }, - "bin": { - "table-layout": "bin/cli.js" - }, "engines": { "node": ">=12.17" } @@ -12199,14 +12198,6 @@ "node": ">=12.17" } }, - "node_modules/table-layout/node_modules/typical": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/typical/-/typical-7.1.1.tgz", - "integrity": "sha512-T+tKVNs6Wu7IWiAce5BgMd7OZfNYUndHwc5MknN+UHOudi7sGZzuHdCadllRuqJ3fPtgFtIH9+lt9qRv6lmpfA==", - "engines": { - "node": ">=12.17" - } - }, "node_modules/table/node_modules/ansi-regex": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", @@ -12572,6 +12563,7 @@ "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" }, @@ -12759,9 +12751,9 @@ } }, "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==", + "version": "3.19.2", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.2.tgz", + "integrity": "sha512-S8KA6DDI47nQXJSi2ctQ629YzwOVs+bQML6DAtvy0wgNdpi+0ySpQK0g2pxBq2xfF2z3YCscu7NNA8nXT9PlIQ==", "dev": true, "optional": true, "bin": { @@ -12783,13 +12775,13 @@ } }, "node_modules/umzug": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/umzug/-/umzug-3.8.1.tgz", - "integrity": "sha512-k0HjOc3b/s8vH24BUTvnaFiKhfWI9UQAGpqHDG+3866CGlBTB83Xs5wZ1io1mwYLj/GHvQ34AxKhbpYnWtkRJg==", + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/umzug/-/umzug-3.7.0.tgz", + "integrity": "sha512-r/L2Zlilgv3SKhmP2nkA9x2Xi1PKtu2K34/i/s7AYJ2mLjEO+IxETJAK7CKf6l3QOvoy5/ChykeX9qt6ykRz6Q==", "dependencies": { "@rushstack/ts-command-line": "^4.12.2", "emittery": "^0.13.0", - "fast-glob": "^3.3.2", + "glob": "^8.0.3", "pony-cause": "^2.1.4", "type-fest": "^4.0.0" }, @@ -12940,23 +12932,17 @@ } }, "node_modules/uvm": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/uvm/-/uvm-2.1.1.tgz", - "integrity": "sha512-BZ5w8adTpNNr+zczOBRpaX/hH8UPKAf7fmCnidrcsqt3bn8KT9bDIfuS7hgRU9RXgiN01su2pwysBONY6w8W5w==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/uvm/-/uvm-3.0.0.tgz", + "integrity": "sha512-dATVpxsNfFBpHNdq6sy4/CV2UnoRbV8tvvkK0VrUPnm+o7dK6fnir4LEm8czeDdpbw2KKDKjIPcRSZY4AEwEZA==", "dev": true, "dependencies": { - "flatted": "3.2.6" + "flatted": "3.3.1" }, "engines": { - "node": ">=10" + "node": ">=16" } }, - "node_modules/uvm/node_modules/flatted": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.6.tgz", - "integrity": "sha512-0sQoMh9s0BYsm+12Huy/rkKxVu4R1+r96YX5cG44rHV0pQ6iC3Q+mkoMFaGWObMFYQxCVT+ssG1ksneA2MI9KQ==", - "dev": true - }, "node_modules/validate-npm-package-license": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", @@ -13100,9 +13086,9 @@ } }, "node_modules/workerpool": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz", - "integrity": "sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==", + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.5.1.tgz", + "integrity": "sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA==", "dev": true }, "node_modules/wrap-ansi": { @@ -13319,9 +13305,9 @@ } }, "node_modules/yargs-parser": { - "version": "20.2.4", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", - "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", + "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" } diff --git a/package.json b/package.json index 5085e3568..f9a5a0dd8 100644 --- a/package.json +++ b/package.json @@ -58,11 +58,11 @@ }, "dependencies": { "@datasance/ecn-viewer": "0.3.2", - "axios": "1.7.2", + "axios": "1.7.4", "body-parser": "^1.20.2", "child_process": "1.0.2", "command-line-args": "5.2.1", - "command-line-usage": "7.0.1", + "command-line-usage": "7.0.3", "concurrent-queue": "7.0.2", "cookie-parser": "1.4.6", "cors": "2.8.5", @@ -78,8 +78,8 @@ "is-elevated": "3.0.0", "js-yaml": "4.1.0", "jsonschema": "1.4.1", - "keycloak-connect": "25.0.1", - "minimatch": "9.0.4", + "keycloak-connect": "25.0.4", + "minimatch": "10.0.1", "moment": "2.30.1", "moment-timezone": "0.5.45", "morgan": "1.10.0", @@ -89,10 +89,10 @@ "node-fetch-npm": "^2.0.4", "os": "0.1.2", "path": "0.12.7", + "pg": "8.12.0", "pino": "9.1.0", "pino-std-serializers": "7.0.0", "portscanner": "2.2.0", - "pg": "8.12.0", "qs": "6.12.1", "retry-as-promised": "7.0.4", "sequelize": "6.37.3", @@ -113,7 +113,7 @@ "eslint-config-google": "0.14.0", "mocha": "10.6.0", "mocha-junit-reporter": "2.2.1", - "newman": "6.1.2", + "newman": "^6.2.0", "newman-reporter-junitfull": "1.1.1", "nyc": "15.1.0", "sequelize-cli": "6.6.2", From f91472c552847413ebcea6636a9bccffee764222 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emirhan=20Durmu=C5=9F?= Date: Fri, 23 Aug 2024 12:07:51 +0300 Subject: [PATCH 124/178] viewer version updated --- package-lock.json | 8 ++++---- package.json | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 8db5b3b39..9754fabd0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,7 +10,7 @@ "hasInstallScript": true, "license": "EPL-2.0", "dependencies": { - "@datasance/ecn-viewer": "0.3.2", + "@datasance/ecn-viewer": "0.3.3", "axios": "1.7.4", "body-parser": "^1.20.2", "child_process": "1.0.2", @@ -557,9 +557,9 @@ } }, "node_modules/@datasance/ecn-viewer": { - "version": "0.3.2", - "resolved": "https://npm.pkg.github.com/download/@datasance/ecn-viewer/0.3.2/000fea7fc7fe1e3cbcd93c072be7defc778b30df", - "integrity": "sha512-yTcQxkue+hwvqVItzL26wJ7Pc23+dAWusMSL/7MyXZYfNHd9EwDFe+pNfhWuuOZRSQVwKAWjlFHJhA0JIoH9NQ==", + "version": "0.3.3", + "resolved": "https://npm.pkg.github.com/download/@datasance/ecn-viewer/0.3.3/0e490ba6f9412ce7ddb9bda71e971019951f07ff", + "integrity": "sha512-evdcUV6VRZKftBL84swNyD5sS9MoK926WPAhB2pN/MBPpbxsRpGqf94ylB1kCzZMrC2IfzQHnbq3Ci9cyIY/2g==", "license": "EPL-2.0" }, "node_modules/@eslint-community/eslint-utils": { diff --git a/package.json b/package.json index f9a5a0dd8..08a2ef04e 100644 --- a/package.json +++ b/package.json @@ -57,7 +57,7 @@ "iofog-controller": "src/main.js" }, "dependencies": { - "@datasance/ecn-viewer": "0.3.2", + "@datasance/ecn-viewer": "0.3.3", "axios": "1.7.4", "body-parser": "^1.20.2", "child_process": "1.0.2", @@ -99,7 +99,7 @@ "sqlite3": "^5.1.7", "string-format": "2.0.0", "swagger-ui-express": "^5.0.0", - "umzug": "3.8.1", + "umzug": "^3.7.0", "underscore": "1.13.6", "xss-clean": "0.1.1" }, From 862ac4c0c07823f6bf1b458e67b2b17a14e59236 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emirhan=20Durmu=C5=9F?= Date: Tue, 27 Aug 2024 15:16:38 +0300 Subject: [PATCH 125/178] viewer version upgraded --- package-lock.json | 8 ++++---- package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index 9754fabd0..f8c437db6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,7 +10,7 @@ "hasInstallScript": true, "license": "EPL-2.0", "dependencies": { - "@datasance/ecn-viewer": "0.3.3", + "@datasance/ecn-viewer": "0.3.4", "axios": "1.7.4", "body-parser": "^1.20.2", "child_process": "1.0.2", @@ -557,9 +557,9 @@ } }, "node_modules/@datasance/ecn-viewer": { - "version": "0.3.3", - "resolved": "https://npm.pkg.github.com/download/@datasance/ecn-viewer/0.3.3/0e490ba6f9412ce7ddb9bda71e971019951f07ff", - "integrity": "sha512-evdcUV6VRZKftBL84swNyD5sS9MoK926WPAhB2pN/MBPpbxsRpGqf94ylB1kCzZMrC2IfzQHnbq3Ci9cyIY/2g==", + "version": "0.3.4", + "resolved": "https://npm.pkg.github.com/download/@datasance/ecn-viewer/0.3.4/f3a25fdf56169abca8c907b39d8fda65566c9f5b", + "integrity": "sha512-WFcfNSen7adHZtaLpOIB3T6ZXEgR5/sVGxJnypwPvD3nvI9CbdLtVvZOACMmsuD2tiLrU8xJpShogydlZ1q2oA==", "license": "EPL-2.0" }, "node_modules/@eslint-community/eslint-utils": { diff --git a/package.json b/package.json index 08a2ef04e..78a7e1c9c 100644 --- a/package.json +++ b/package.json @@ -57,7 +57,7 @@ "iofog-controller": "src/main.js" }, "dependencies": { - "@datasance/ecn-viewer": "0.3.3", + "@datasance/ecn-viewer": "0.3.4", "axios": "1.7.4", "body-parser": "^1.20.2", "child_process": "1.0.2", From 204ba5cafc06ab2601b5e777f1f79b6cfc863f11 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emirhan=20Durmu=C5=9F?= Date: Tue, 27 Aug 2024 16:25:31 +0300 Subject: [PATCH 126/178] viewer upgraded to 0.3.5 --- package-lock.json | 8 ++++---- package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index f8c437db6..334bc2463 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,7 +10,7 @@ "hasInstallScript": true, "license": "EPL-2.0", "dependencies": { - "@datasance/ecn-viewer": "0.3.4", + "@datasance/ecn-viewer": "0.3.5", "axios": "1.7.4", "body-parser": "^1.20.2", "child_process": "1.0.2", @@ -557,9 +557,9 @@ } }, "node_modules/@datasance/ecn-viewer": { - "version": "0.3.4", - "resolved": "https://npm.pkg.github.com/download/@datasance/ecn-viewer/0.3.4/f3a25fdf56169abca8c907b39d8fda65566c9f5b", - "integrity": "sha512-WFcfNSen7adHZtaLpOIB3T6ZXEgR5/sVGxJnypwPvD3nvI9CbdLtVvZOACMmsuD2tiLrU8xJpShogydlZ1q2oA==", + "version": "0.3.5", + "resolved": "https://npm.pkg.github.com/download/@datasance/ecn-viewer/0.3.5/4cb0140be3ef162b1c097aad5136c477469e9733", + "integrity": "sha512-uxACCbIsj4kxpwkjlVAooAAOrzq7vSRY/+IdHmvH64LoqtAeNyLVeonJW6F9Za72+IFScQ8SfUoBbenoMoC+rQ==", "license": "EPL-2.0" }, "node_modules/@eslint-community/eslint-utils": { diff --git a/package.json b/package.json index 78a7e1c9c..84f5d4942 100644 --- a/package.json +++ b/package.json @@ -57,7 +57,7 @@ "iofog-controller": "src/main.js" }, "dependencies": { - "@datasance/ecn-viewer": "0.3.4", + "@datasance/ecn-viewer": "0.3.5", "axios": "1.7.4", "body-parser": "^1.20.2", "child_process": "1.0.2", From 2d8b01059ffa4707379bda9acc1535b0e439b341 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emirhan=20Durmu=C5=9F?= Date: Wed, 6 Nov 2024 18:27:30 +0300 Subject: [PATCH 127/178] api version updated to be in line with iofog community --- Dockerfile.dev | 2 +- docs/swagger.yaml | 4 +- package-lock.json | 178 ++-- package.json | 16 +- src/main.js | 2 +- src/routes/agent.js | 40 +- src/routes/application.js | 20 +- src/routes/applicationTemplate.js | 16 +- src/routes/capabilities.js | 4 +- src/routes/catalog.js | 10 +- src/routes/config.js | 6 +- src/routes/controller.js | 4 +- src/routes/diagnostics.js | 10 +- src/routes/edgeResource.js | 16 +- src/routes/flow.js | 10 +- src/routes/iofog.js | 22 +- src/routes/microservices.js | 42 +- src/routes/registries.js | 12 +- src/routes/router.js | 4 +- src/routes/routing.js | 10 +- src/routes/tunnel.js | 6 +- src/routes/user.js | 10 +- test/application-template-update.yaml | 2 +- test/application-template.yaml | 2 +- test/application-test.yaml | 6 +- test/application-update-test.yaml | 6 +- test/postman_collection.json | 1156 ++++++++++++------------- test/src/template/app.yml | 2 +- test/src/template/simple.yml | 2 +- 29 files changed, 810 insertions(+), 810 deletions(-) diff --git a/Dockerfile.dev b/Dockerfile.dev index 3695faa46..36e060e8b 100644 --- a/Dockerfile.dev +++ b/Dockerfile.dev @@ -42,7 +42,7 @@ RUN npm i -g /tmp/iofog-controller.tgz && \ rm -rf /tmp/iofog-controller.tgz && \ iofog-controller config dev-mode --on -LABEL org.opencontainers.image.description controller +LABEL org.opencontainers.image.description=controller LABEL org.opencontainers.image.source=https://github.com/datasance/controller LABEL org.opencontainers.image.licenses=EPL2.0 CMD [ "node", "/usr/local/lib/node_modules/@datasance/iofogcontroller/src/server.js" ] diff --git a/docs/swagger.yaml b/docs/swagger.yaml index 136955969..7aea9f6ce 100755 --- a/docs/swagger.yaml +++ b/docs/swagger.yaml @@ -3035,8 +3035,8 @@ tags: - name: User description: Manage your users servers: - - url: http://localhost:51121/api/v1 - - url: https://localhost:51121/api/v1 + - url: http://localhost:51121/api/v3 + - url: https://localhost:51121/api/v3 components: securitySchemes: userToken: diff --git a/package-lock.json b/package-lock.json index 334bc2463..56497bb73 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,28 +1,28 @@ { "name": "@datasance/iofogcontroller", - "version": "3.4.0", + "version": "3.4.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@datasance/iofogcontroller", - "version": "3.4.0", + "version": "3.4.1", "hasInstallScript": true, "license": "EPL-2.0", "dependencies": { - "@datasance/ecn-viewer": "0.3.5", + "@datasance/ecn-viewer": "0.3.8", "axios": "1.7.4", - "body-parser": "^1.20.2", + "body-parser": "^1.20.3", "child_process": "1.0.2", "command-line-args": "5.2.1", "command-line-usage": "7.0.3", "concurrent-queue": "7.0.2", - "cookie-parser": "1.4.6", + "cookie-parser": "1.4.7", "cors": "2.8.5", "daemonize2": "0.4.2", "ejs": "3.1.10", - "express": "4.19.2", - "express-session": "1.18.0", + "express": "4.21.1", + "express-session": "1.18.1", "formidable": "3.5.1", "ftp": "0.3.10", "globally": "^0.0.0", @@ -31,7 +31,7 @@ "is-elevated": "3.0.0", "js-yaml": "4.1.0", "jsonschema": "1.4.1", - "keycloak-connect": "25.0.4", + "keycloak-connect": "^26.0.5", "minimatch": "10.0.1", "moment": "2.30.1", "moment-timezone": "0.5.45", @@ -557,10 +557,9 @@ } }, "node_modules/@datasance/ecn-viewer": { - "version": "0.3.5", - "resolved": "https://npm.pkg.github.com/download/@datasance/ecn-viewer/0.3.5/4cb0140be3ef162b1c097aad5136c477469e9733", - "integrity": "sha512-uxACCbIsj4kxpwkjlVAooAAOrzq7vSRY/+IdHmvH64LoqtAeNyLVeonJW6F9Za72+IFScQ8SfUoBbenoMoC+rQ==", - "license": "EPL-2.0" + "version": "0.3.8", + "resolved": "https://npm.pkg.github.com/download/@datasance/ecn-viewer/0.3.8/ee97a29a58feb79a047c90cf19387581a237fc9d", + "integrity": "sha512-wyM86fnIkCG937beYgzWI5I07HrX7htT0EECTkyzSZDXqZCwjEQmFFKbIcb6kYSxtnMqVu6iiTew8P9DXDP3pQ==" }, "node_modules/@eslint-community/eslint-utils": { "version": "4.4.0", @@ -2113,9 +2112,9 @@ "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" }, "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==", + "version": "1.20.3", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", + "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", "dependencies": { "bytes": "3.1.2", "content-type": "~1.0.5", @@ -2125,7 +2124,7 @@ "http-errors": "2.0.0", "iconv-lite": "0.4.24", "on-finished": "2.4.1", - "qs": "6.11.0", + "qs": "6.13.0", "raw-body": "2.5.2", "type-is": "~1.6.18", "unpipe": "1.0.0" @@ -2136,11 +2135,11 @@ } }, "node_modules/body-parser/node_modules/qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", "dependencies": { - "side-channel": "^1.0.4" + "side-channel": "^1.0.6" }, "engines": { "node": ">=0.6" @@ -2931,19 +2930,19 @@ "dev": true }, "node_modules/cookie": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", - "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==", + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", "engines": { "node": ">= 0.6" } }, "node_modules/cookie-parser": { - "version": "1.4.6", - "resolved": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.4.6.tgz", - "integrity": "sha512-z3IzaNjdwUC2olLIB5/ITd0/setiaFMLYiZJle7xg5Fe9KWAceil7xszYfHHBtDFYLSgJduS2Ty0P1uJdPDJeA==", + "version": "1.4.7", + "resolved": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.4.7.tgz", + "integrity": "sha512-nGUvgXnotP3BsjiLX2ypbQnWoGUPIIfHQNZkkC668ntrzGWEZVW70HDEB1qnNGMicPje6EttlIgzo51YSwNQGw==", "dependencies": { - "cookie": "0.4.1", + "cookie": "0.7.2", "cookie-signature": "1.0.6" }, "engines": { @@ -3483,9 +3482,9 @@ "dev": true }, "node_modules/elliptic": { - "version": "6.5.7", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.7.tgz", - "integrity": "sha512-ESVCtTwiA+XhY3wyh24QqRGBoP3rEdDUl3EDUUo9tft074fi19IrdpH7hLCMMP3CIj7jb3W96rn8lt/BqIlt5Q==", + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.6.0.tgz", + "integrity": "sha512-dpwoQcLc/2WLQvJvLRHKZ+f9FgOdjnq11rurqwekGQygGPsYSK29OMMD2WalatiqQ+XGFDglTNixpPfI+lpaAA==", "dependencies": { "bn.js": "^4.11.9", "brorand": "^1.1.0", @@ -3513,9 +3512,9 @@ "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==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", "engines": { "node": ">= 0.8" } @@ -4354,36 +4353,36 @@ } }, "node_modules/express": { - "version": "4.19.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz", - "integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==", + "version": "4.21.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.21.1.tgz", + "integrity": "sha512-YSFlK1Ee0/GC8QaO91tHcDxJiE/X4FbpAyQWkxAvG6AXCuR65YzK8ua6D9hvi/TzUfZMpc+BwuM1IPw8fmQBiQ==", "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "1.20.2", + "body-parser": "1.20.3", "content-disposition": "0.5.4", "content-type": "~1.0.4", - "cookie": "0.6.0", + "cookie": "0.7.1", "cookie-signature": "1.0.6", "debug": "2.6.9", "depd": "2.0.0", - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "etag": "~1.8.1", - "finalhandler": "1.2.0", + "finalhandler": "1.3.1", "fresh": "0.5.2", "http-errors": "2.0.0", - "merge-descriptors": "1.0.1", + "merge-descriptors": "1.0.3", "methods": "~1.1.2", "on-finished": "2.4.1", "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", + "path-to-regexp": "0.1.10", "proxy-addr": "~2.0.7", - "qs": "6.11.0", + "qs": "6.13.0", "range-parser": "~1.2.1", "safe-buffer": "5.2.1", - "send": "0.18.0", - "serve-static": "1.15.0", + "send": "0.19.0", + "serve-static": "1.16.2", "setprototypeof": "1.2.0", "statuses": "2.0.1", "type-is": "~1.6.18", @@ -4395,11 +4394,11 @@ } }, "node_modules/express-session": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/express-session/-/express-session-1.18.0.tgz", - "integrity": "sha512-m93QLWr0ju+rOwApSsyso838LQwgfs44QtOP/WBiwtAgPIo/SAh1a5c6nn2BR6mFNZehTpqKDESzP+fRHVbxwQ==", + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/express-session/-/express-session-1.18.1.tgz", + "integrity": "sha512-a5mtTqEaZvBCL9A9aqkrtfz+3SMDhOVUnjafjo+s7A9Txkq+SVX2DLvSp1Zrv4uCXa3lMSK3viWnh9Gg07PBUA==", "dependencies": { - "cookie": "0.6.0", + "cookie": "0.7.2", "cookie-signature": "1.0.7", "debug": "2.6.9", "depd": "~2.0.0", @@ -4412,33 +4411,25 @@ "node": ">= 0.8.0" } }, - "node_modules/express-session/node_modules/cookie": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", - "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", - "engines": { - "node": ">= 0.6" - } - }, "node_modules/express-session/node_modules/cookie-signature": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.7.tgz", "integrity": "sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA==" }, "node_modules/express/node_modules/cookie": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", - "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", + "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", "engines": { "node": ">= 0.6" } }, "node_modules/express/node_modules/qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", "dependencies": { - "side-channel": "^1.0.4" + "side-channel": "^1.0.6" }, "engines": { "node": ">=0.6" @@ -4687,12 +4678,12 @@ } }, "node_modules/finalhandler": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", - "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", + "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", "dependencies": { "debug": "2.6.9", - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "on-finished": "2.4.1", "parseurl": "~1.3.3", @@ -6959,9 +6950,9 @@ } }, "node_modules/keycloak-connect": { - "version": "25.0.4", - "resolved": "https://registry.npmjs.org/keycloak-connect/-/keycloak-connect-25.0.4.tgz", - "integrity": "sha512-njiyVQOjdxUq+hIVEnC64Uzz10J8ZwYySLp8KsFxeSIuijBXpWtSjMDPZZ3fb3UVmX8I6uVKNqD1Faasd1hnIQ==", + "version": "26.0.5", + "resolved": "https://registry.npmjs.org/keycloak-connect/-/keycloak-connect-26.0.5.tgz", + "integrity": "sha512-CvPjSL+dqQg6jFgXuYO3v13SjxxNGwo1+s5I2gFfxf7Vh6krz3nHtihH+str2kfP7TqeZgXtqWq2AbWw6HWkLg==", "dependencies": { "jwk-to-pem": "^2.0.0" }, @@ -7228,9 +7219,12 @@ } }, "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==" + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, "node_modules/methods": { "version": "1.1.2", @@ -7882,9 +7876,9 @@ } }, "node_modules/nise/node_modules/path-to-regexp": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.2.2.tgz", - "integrity": "sha512-GQX3SSMokngb36+whdpRXE+3f9V8UzyAorlYvOGx87ufGHehNTn5lCxrKtLyZ4Yl/wEKnNnr98ZzOwwDZV5ogw==", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.3.0.tgz", + "integrity": "sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==", "dev": true }, "node_modules/node-abi": { @@ -8676,9 +8670,9 @@ } }, "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==" + "version": "0.1.10", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.10.tgz", + "integrity": "sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w==" }, "node_modules/pathval": { "version": "2.0.0", @@ -10226,9 +10220,9 @@ "dev": true }, "node_modules/send": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", - "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", + "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", "dependencies": { "debug": "2.6.9", "depd": "2.0.0", @@ -10248,6 +10242,14 @@ "node": ">= 0.8.0" } }, + "node_modules/send/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/send/node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", @@ -10470,14 +10472,14 @@ } }, "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==", + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", + "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", "dependencies": { - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "parseurl": "~1.3.3", - "send": "0.18.0" + "send": "0.19.0" }, "engines": { "node": ">= 0.8.0" diff --git a/package.json b/package.json index 84f5d4942..9c65f83cc 100644 --- a/package.json +++ b/package.json @@ -1,13 +1,11 @@ { "name": "@datasance/iofogcontroller", - "version": "3.4.0", + "version": "3.4.1", "description": "ioFog Controller project for Eclipse IoFog @ iofog.org \\nCopyright (c) 2023 Datasance Teknoloji A.S.", "main": "./src/main.js", "author": "Emirhan Durmus", "contributors": [ "Emirhan Durmus ", - "Oguzhan Herkiloglu ", - "Burak Vural ", "Alpaslan Doğan " ], "license": "EPL-2.0", @@ -57,19 +55,19 @@ "iofog-controller": "src/main.js" }, "dependencies": { - "@datasance/ecn-viewer": "0.3.5", + "@datasance/ecn-viewer": "0.3.8", "axios": "1.7.4", - "body-parser": "^1.20.2", + "body-parser": "^1.20.3", "child_process": "1.0.2", "command-line-args": "5.2.1", "command-line-usage": "7.0.3", "concurrent-queue": "7.0.2", - "cookie-parser": "1.4.6", + "cookie-parser": "1.4.7", "cors": "2.8.5", "daemonize2": "0.4.2", "ejs": "3.1.10", - "express": "4.19.2", - "express-session": "1.18.0", + "express": "4.21.1", + "express-session": "1.18.1", "formidable": "3.5.1", "ftp": "0.3.10", "globally": "^0.0.0", @@ -78,7 +76,7 @@ "is-elevated": "3.0.0", "js-yaml": "4.1.0", "jsonschema": "1.4.1", - "keycloak-connect": "25.0.4", + "keycloak-connect": "^26.0.5", "minimatch": "10.0.1", "moment": "2.30.1", "moment-timezone": "0.5.45", diff --git a/src/main.js b/src/main.js index 3bbd36938..4e4eb4bab 100644 --- a/src/main.js +++ b/src/main.js @@ -44,7 +44,7 @@ const isDaemonElevated = async () => { return false } const protocol = isHTTPS() ? 'https' : 'http' - return getJSONFromURL(`${protocol}://localhost:${apiPort}/api/v1/status`) + return getJSONFromURL(`${protocol}://localhost:${apiPort}/api/v3/status`) .then(result => { // The server is running but you couldn't see it, requires administrative privileges if (result.status === 'online') { diff --git a/src/routes/agent.js b/src/routes/agent.js index 97161bf4e..e2e86e273 100644 --- a/src/routes/agent.js +++ b/src/routes/agent.js @@ -21,7 +21,7 @@ const logger = require('../logger') module.exports = [ { method: 'post', - path: '/api/v1/agent/provision', + path: '/api/v3/agent/provision', middleware: async (req, res) => { logger.apiReq(req) @@ -53,7 +53,7 @@ module.exports = [ }, { method: 'post', - path: '/api/v1/agent/deprovision', + path: '/api/v3/agent/deprovision', middleware: async (req, res) => { logger.apiReq(req) @@ -82,7 +82,7 @@ module.exports = [ }, { method: 'get', - path: '/api/v1/agent/config', + path: '/api/v3/agent/config', middleware: async (req, res) => { logger.apiReq(req) @@ -106,7 +106,7 @@ module.exports = [ }, { method: 'patch', - path: '/api/v1/agent/config', + path: '/api/v3/agent/config', middleware: async (req, res) => { logger.apiReq(req) @@ -135,7 +135,7 @@ module.exports = [ }, { method: 'get', - path: '/api/v1/agent/config/changes', + path: '/api/v3/agent/config/changes', middleware: async (req, res) => { logger.apiReq(req) @@ -164,7 +164,7 @@ module.exports = [ }, { method: 'patch', - path: '/api/v1/agent/config/changes', + path: '/api/v3/agent/config/changes', middleware: async (req, res) => { logger.apiReq(req) @@ -193,7 +193,7 @@ module.exports = [ }, { method: 'put', - path: '/api/v1/agent/status', + path: '/api/v3/agent/status', middleware: async (req, res) => { logger.apiReq(req) @@ -222,7 +222,7 @@ module.exports = [ }, { method: 'get', - path: '/api/v1/agent/edgeResources', + path: '/api/v3/agent/edgeResources', middleware: async (req, res) => { logger.apiReq(req) @@ -247,7 +247,7 @@ module.exports = [ }, { method: 'get', - path: '/api/v1/agent/microservices', + path: '/api/v3/agent/microservices', middleware: async (req, res) => { logger.apiReq(req) @@ -272,7 +272,7 @@ module.exports = [ }, { method: 'get', - path: '/api/v1/agent/microservices/:microserviceUuid', + path: '/api/v3/agent/microservices/:microserviceUuid', middleware: async (req, res) => { logger.apiReq(req) @@ -301,7 +301,7 @@ module.exports = [ }, { method: 'get', - path: '/api/v1/agent/registries', + path: '/api/v3/agent/registries', middleware: async (req, res) => { logger.apiReq(req) @@ -326,7 +326,7 @@ module.exports = [ }, { method: 'get', - path: '/api/v1/agent/tunnel', + path: '/api/v3/agent/tunnel', middleware: async (req, res) => { logger.apiReq(req) @@ -355,7 +355,7 @@ module.exports = [ }, { method: 'get', - path: '/api/v1/agent/strace', + path: '/api/v3/agent/strace', middleware: async (req, res) => { logger.apiReq(req) @@ -384,7 +384,7 @@ module.exports = [ }, { method: 'put', - path: '/api/v1/agent/strace', + path: '/api/v3/agent/strace', middleware: async (req, res) => { logger.apiReq(req) @@ -417,7 +417,7 @@ module.exports = [ }, { method: 'get', - path: '/api/v1/agent/version', + path: '/api/v3/agent/version', middleware: async (req, res) => { logger.apiReq(req) @@ -446,7 +446,7 @@ module.exports = [ }, { method: 'put', - path: '/api/v1/agent/hal/hw', + path: '/api/v3/agent/hal/hw', middleware: async (req, res) => { logger.apiReq(req) @@ -475,7 +475,7 @@ module.exports = [ }, { method: 'put', - path: '/api/v1/agent/hal/usb', + path: '/api/v3/agent/hal/usb', middleware: async (req, res) => { logger.apiReq(req) @@ -504,7 +504,7 @@ module.exports = [ }, { method: 'delete', - path: '/api/v1/agent/delete-node', + path: '/api/v3/agent/delete-node', middleware: async (req, res) => { logger.apiReq(req) @@ -529,7 +529,7 @@ module.exports = [ }, { method: 'get', - path: '/api/v1/agent/image-snapshot', + path: '/api/v3/agent/image-snapshot', middleware: async (req, res) => { logger.apiReq(req) @@ -558,7 +558,7 @@ module.exports = [ }, { method: 'put', - path: '/api/v1/agent/image-snapshot', + path: '/api/v3/agent/image-snapshot', middleware: async (req, res) => { logger.apiReq(req) diff --git a/src/routes/application.js b/src/routes/application.js index 437e46087..d5bc48424 100644 --- a/src/routes/application.js +++ b/src/routes/application.js @@ -20,7 +20,7 @@ const keycloak = require('../config/keycloak.js').initKeycloak() module.exports = [ { method: 'get', - path: '/api/v1/application', + path: '/api/v3/application', middleware: async (req, res) => { logger.apiReq(req) @@ -48,7 +48,7 @@ module.exports = [ }, { method: 'get', - path: '/api/v1/application/system', + path: '/api/v3/application/system', middleware: async (req, res) => { logger.apiReq(req) @@ -76,7 +76,7 @@ module.exports = [ }, { method: 'post', - path: '/api/v1/application', + path: '/api/v3/application', supportSubstitution: true, middleware: async (req, res) => { logger.apiReq(req) @@ -109,7 +109,7 @@ module.exports = [ }, { method: 'post', - path: '/api/v1/application/yaml', + path: '/api/v3/application/yaml', fileInput: 'application', middleware: async (req, res) => { logger.apiReq(req) @@ -142,7 +142,7 @@ module.exports = [ }, { method: 'get', - path: '/api/v1/application/:name', + path: '/api/v3/application/:name', middleware: async (req, res) => { logger.apiReq(req) @@ -175,7 +175,7 @@ module.exports = [ }, { method: 'patch', - path: '/api/v1/application/:name', + path: '/api/v3/application/:name', supportSubstitution: true, middleware: async (req, res) => { logger.apiReq(req) @@ -212,7 +212,7 @@ module.exports = [ }, { method: 'put', - path: '/api/v1/application/yaml/:name', + path: '/api/v3/application/yaml/:name', fileInput: 'application', middleware: async (req, res) => { logger.apiReq(req) @@ -249,7 +249,7 @@ module.exports = [ }, { method: 'put', - path: '/api/v1/application/:name', + path: '/api/v3/application/:name', supportSubstitution: true, middleware: async (req, res) => { logger.apiReq(req) @@ -286,7 +286,7 @@ module.exports = [ }, { method: 'delete', - path: '/api/v1/application/:name', + path: '/api/v3/application/:name', middleware: async (req, res) => { logger.apiReq(req) @@ -318,7 +318,7 @@ module.exports = [ }, { method: 'delete', - path: '/api/v1/application/system/:name', + path: '/api/v3/application/system/:name', middleware: async (req, res) => { logger.apiReq(req) diff --git a/src/routes/applicationTemplate.js b/src/routes/applicationTemplate.js index 59cad674a..ff36626b2 100644 --- a/src/routes/applicationTemplate.js +++ b/src/routes/applicationTemplate.js @@ -20,7 +20,7 @@ const keycloak = require('../config/keycloak.js').initKeycloak() module.exports = [ { method: 'get', - path: '/api/v1/applicationTemplates', + path: '/api/v3/applicationTemplates', middleware: async (req, res) => { logger.apiReq(req) @@ -48,7 +48,7 @@ module.exports = [ }, { method: 'post', - path: '/api/v1/applicationTemplate', + path: '/api/v3/applicationTemplate', middleware: async (req, res) => { logger.apiReq(req) @@ -80,7 +80,7 @@ module.exports = [ }, { method: 'post', - path: '/api/v1/applicationTemplate/yaml', + path: '/api/v3/applicationTemplate/yaml', fileInput: 'template', middleware: async (req, res) => { logger.apiReq(req) @@ -113,7 +113,7 @@ module.exports = [ }, { method: 'get', - path: '/api/v1/applicationTemplate/:name', + path: '/api/v3/applicationTemplate/:name', middleware: async (req, res) => { logger.apiReq(req) @@ -145,7 +145,7 @@ module.exports = [ }, { method: 'patch', - path: '/api/v1/applicationTemplate/:name', + path: '/api/v3/applicationTemplate/:name', middleware: async (req, res) => { logger.apiReq(req) @@ -181,7 +181,7 @@ module.exports = [ }, { method: 'put', - path: '/api/v1/applicationTemplate/yaml/:name', + path: '/api/v3/applicationTemplate/yaml/:name', fileInput: 'template', middleware: async (req, res) => { logger.apiReq(req) @@ -218,7 +218,7 @@ module.exports = [ }, { method: 'put', - path: '/api/v1/applicationTemplate/:name', + path: '/api/v3/applicationTemplate/:name', middleware: async (req, res) => { logger.apiReq(req) @@ -254,7 +254,7 @@ module.exports = [ }, { method: 'delete', - path: '/api/v1/applicationTemplate/:name', + path: '/api/v3/applicationTemplate/:name', middleware: async (req, res) => { logger.apiReq(req) diff --git a/src/routes/capabilities.js b/src/routes/capabilities.js index 54eaa2b1c..f8b533e70 100644 --- a/src/routes/capabilities.js +++ b/src/routes/capabilities.js @@ -16,7 +16,7 @@ const keycloak = require('../config/keycloak.js').initKeycloak() module.exports = [ { method: 'head', - path: '/api/v1/capabilities/edgeResources', + path: '/api/v3/capabilities/edgeResources', middleware: async (req, res) => { logger.apiReq(req) @@ -28,7 +28,7 @@ module.exports = [ }, { method: 'head', - path: '/api/v1/capabilities/applicationTemplates', + path: '/api/v3/capabilities/applicationTemplates', middleware: async (req, res) => { logger.apiReq(req) diff --git a/src/routes/catalog.js b/src/routes/catalog.js index 3bad359a2..80134e44c 100644 --- a/src/routes/catalog.js +++ b/src/routes/catalog.js @@ -20,7 +20,7 @@ const keycloak = require('../config/keycloak.js').initKeycloak() module.exports = [ { method: 'get', - path: '/api/v1/catalog/microservices', + path: '/api/v3/catalog/microservices', middleware: async (req, res) => { logger.apiReq(req) @@ -52,7 +52,7 @@ module.exports = [ }, { method: 'post', - path: '/api/v1/catalog/microservices', + path: '/api/v3/catalog/microservices', supportSubstitution: true, middleware: async (req, res) => { logger.apiReq(req) @@ -93,7 +93,7 @@ module.exports = [ }, { method: 'get', - path: '/api/v1/catalog/microservices/:id', + path: '/api/v3/catalog/microservices/:id', middleware: async (req, res) => { logger.apiReq(req) @@ -129,7 +129,7 @@ module.exports = [ }, { method: 'patch', - path: '/api/v1/catalog/microservices/:id', + path: '/api/v3/catalog/microservices/:id', supportSubstitution: true, middleware: async (req, res) => { logger.apiReq(req) @@ -174,7 +174,7 @@ module.exports = [ }, { method: 'delete', - path: '/api/v1/catalog/microservices/:id', + path: '/api/v3/catalog/microservices/:id', middleware: async (req, res) => { logger.apiReq(req) diff --git a/src/routes/config.js b/src/routes/config.js index b4e2f208b..fba93b482 100644 --- a/src/routes/config.js +++ b/src/routes/config.js @@ -20,7 +20,7 @@ const keycloak = require('../config/keycloak.js').initKeycloak() module.exports = [ { method: 'get', - path: '/api/v1/config', + path: '/api/v3/config', middleware: async (req, res) => { logger.apiReq(req) @@ -47,7 +47,7 @@ module.exports = [ }, { method: 'get', - path: '/api/v1/config/:key', + path: '/api/v3/config/:key', middleware: async (req, res) => { logger.apiReq(req) @@ -78,7 +78,7 @@ module.exports = [ }, { method: 'put', - path: '/api/v1/config', + path: '/api/v3/config', supportSubstitution: true, middleware: async (req, res) => { logger.apiReq(req) diff --git a/src/routes/controller.js b/src/routes/controller.js index 5ccc2f6fb..3c41255ba 100644 --- a/src/routes/controller.js +++ b/src/routes/controller.js @@ -18,7 +18,7 @@ const logger = require('../logger') module.exports = [ { method: 'get', - path: '/api/v1/status', + path: '/api/v3/status', middleware: async (req, res) => { logger.apiReq(req) @@ -36,7 +36,7 @@ module.exports = [ }, { method: 'get', - path: '/api/v1/fog-types/', + path: '/api/v3/fog-types/', middleware: async (req, res) => { logger.apiReq(req) diff --git a/src/routes/diagnostics.js b/src/routes/diagnostics.js index 671000f51..5c9270a06 100644 --- a/src/routes/diagnostics.js +++ b/src/routes/diagnostics.js @@ -21,7 +21,7 @@ const keycloak = require('../config/keycloak.js').initKeycloak() module.exports = [ { method: 'post', - path: '/api/v1/microservices/:uuid/image-snapshot', + path: '/api/v3/microservices/:uuid/image-snapshot', middleware: async (req, res) => { logger.apiReq(req) @@ -56,7 +56,7 @@ module.exports = [ }, { method: 'get', - path: '/api/v1/microservices/:uuid/image-snapshot', + path: '/api/v3/microservices/:uuid/image-snapshot', middleware: async (req, res) => { logger.apiReq(req) @@ -100,7 +100,7 @@ module.exports = [ }, { method: 'patch', - path: '/api/v1/microservices/:uuid/strace', + path: '/api/v3/microservices/:uuid/strace', middleware: async (req, res) => { logger.apiReq(req) @@ -139,7 +139,7 @@ module.exports = [ }, { method: 'get', - path: '/api/v1/microservices/:uuid/strace', + path: '/api/v3/microservices/:uuid/strace', middleware: async (req, res) => { logger.apiReq(req) @@ -174,7 +174,7 @@ module.exports = [ }, { method: 'put', - path: '/api/v1/microservices/:uuid/strace', + path: '/api/v3/microservices/:uuid/strace', middleware: async (req, res) => { logger.apiReq(req) diff --git a/src/routes/edgeResource.js b/src/routes/edgeResource.js index b6607e243..55558160c 100644 --- a/src/routes/edgeResource.js +++ b/src/routes/edgeResource.js @@ -20,7 +20,7 @@ const keycloak = require('../config/keycloak.js').initKeycloak() module.exports = [ { method: 'get', - path: '/api/v1/edgeResources', + path: '/api/v3/edgeResources', middleware: async (req, res) => { logger.apiReq(req) @@ -47,7 +47,7 @@ module.exports = [ }, { method: 'get', - path: '/api/v1/edgeResource/:name/:version', + path: '/api/v3/edgeResource/:name/:version', middleware: async (req, res) => { logger.apiReq(req) @@ -78,7 +78,7 @@ module.exports = [ }, { method: 'get', - path: '/api/v1/edgeResource/:name', + path: '/api/v3/edgeResource/:name', middleware: async (req, res) => { logger.apiReq(req) @@ -109,7 +109,7 @@ module.exports = [ }, { method: 'put', - path: '/api/v1/edgeResource/:name/:version', + path: '/api/v3/edgeResource/:name/:version', supportSubstitution: true, middleware: async (req, res) => { logger.apiReq(req) @@ -145,7 +145,7 @@ module.exports = [ }, { method: 'delete', - path: '/api/v1/edgeResource/:name/:version', + path: '/api/v3/edgeResource/:name/:version', middleware: async (req, res) => { logger.apiReq(req) @@ -180,7 +180,7 @@ module.exports = [ }, { method: 'post', - path: '/api/v1/edgeResource', + path: '/api/v3/edgeResource', supportSubstitution: true, middleware: async (req, res) => { logger.apiReq(req) @@ -212,7 +212,7 @@ module.exports = [ }, { method: 'post', - path: '/api/v1/edgeResource/:name/:version/link', + path: '/api/v3/edgeResource/:name/:version/link', middleware: async (req, res) => { logger.apiReq(req) @@ -243,7 +243,7 @@ module.exports = [ }, { method: 'delete', - path: '/api/v1/edgeResource/:name/:version/link', + path: '/api/v3/edgeResource/:name/:version/link', middleware: async (req, res) => { logger.apiReq(req) diff --git a/src/routes/flow.js b/src/routes/flow.js index e955df130..d3e922dda 100644 --- a/src/routes/flow.js +++ b/src/routes/flow.js @@ -20,7 +20,7 @@ const keycloak = require('../config/keycloak.js').initKeycloak() module.exports = [ { method: 'get', - path: '/api/v1/flow', + path: '/api/v3/flow', middleware: async (req, res) => { logger.apiReq(req) @@ -47,7 +47,7 @@ module.exports = [ }, { method: 'post', - path: '/api/v1/flow', + path: '/api/v3/flow', middleware: async (req, res) => { logger.apiReq(req) @@ -78,7 +78,7 @@ module.exports = [ }, { method: 'get', - path: '/api/v1/flow/:id', + path: '/api/v3/flow/:id', middleware: async (req, res) => { logger.apiReq(req) @@ -109,7 +109,7 @@ module.exports = [ }, { method: 'patch', - path: '/api/v1/flow/:id', + path: '/api/v3/flow/:id', middleware: async (req, res) => { logger.apiReq(req) @@ -144,7 +144,7 @@ module.exports = [ }, { method: 'delete', - path: '/api/v1/flow/:id', + path: '/api/v3/flow/:id', middleware: async (req, res) => { logger.apiReq(req) diff --git a/src/routes/iofog.js b/src/routes/iofog.js index 9431cc4b6..ab7f132a5 100644 --- a/src/routes/iofog.js +++ b/src/routes/iofog.js @@ -20,7 +20,7 @@ const keycloak = require('../config/keycloak.js').initKeycloak() module.exports = [ { method: 'get', - path: '/api/v1/iofog-list', + path: '/api/v3/iofog-list', middleware: async (req, res) => { logger.apiReq(req) @@ -51,7 +51,7 @@ module.exports = [ }, { method: 'post', - path: '/api/v1/iofog', + path: '/api/v3/iofog', supportSubstitution: true, middleware: async (req, res) => { logger.apiReq(req) @@ -83,7 +83,7 @@ module.exports = [ }, { method: 'patch', - path: '/api/v1/iofog/:uuid', + path: '/api/v3/iofog/:uuid', supportSubstitution: true, middleware: async (req, res) => { logger.apiReq(req) @@ -119,7 +119,7 @@ module.exports = [ }, { method: 'delete', - path: '/api/v1/iofog/:uuid', + path: '/api/v3/iofog/:uuid', middleware: async (req, res) => { logger.apiReq(req) @@ -150,7 +150,7 @@ module.exports = [ }, { method: 'get', - path: '/api/v1/iofog/:uuid', + path: '/api/v3/iofog/:uuid', middleware: async (req, res) => { logger.apiReq(req) @@ -181,7 +181,7 @@ module.exports = [ }, { method: 'get', - path: '/api/v1/iofog/:uuid/provisioning-key', + path: '/api/v3/iofog/:uuid/provisioning-key', middleware: async (req, res) => { logger.apiReq(req) @@ -212,7 +212,7 @@ module.exports = [ }, { method: 'post', - path: '/api/v1/iofog/:uuid/version/:versionCommand', + path: '/api/v3/iofog/:uuid/version/:versionCommand', middleware: async (req, res) => { logger.apiReq(req) @@ -247,7 +247,7 @@ module.exports = [ }, { method: 'post', - path: '/api/v1/iofog/:uuid/reboot', + path: '/api/v3/iofog/:uuid/reboot', middleware: async (req, res) => { logger.apiReq(req) @@ -282,7 +282,7 @@ module.exports = [ }, { method: 'get', - path: '/api/v1/iofog/:uuid/hal/hw', + path: '/api/v3/iofog/:uuid/hal/hw', middleware: async (req, res) => { logger.apiReq(req) @@ -313,7 +313,7 @@ module.exports = [ }, { method: 'get', - path: '/api/v1/iofog/:uuid/hal/usb', + path: '/api/v3/iofog/:uuid/hal/usb', middleware: async (req, res) => { logger.apiReq(req) @@ -343,7 +343,7 @@ module.exports = [ }, { method: 'post', - path: '/api/v1/iofog/:uuid/prune', + path: '/api/v3/iofog/:uuid/prune', middleware: async (req, res) => { logger.apiReq(req) diff --git a/src/routes/microservices.js b/src/routes/microservices.js index b3ddf1604..c6bcd4d51 100644 --- a/src/routes/microservices.js +++ b/src/routes/microservices.js @@ -20,7 +20,7 @@ const keycloak = require('../config/keycloak.js').initKeycloak() module.exports = [ { method: 'get', - path: '/api/v1/microservices/public-ports', + path: '/api/v3/microservices/public-ports', middleware: async (req, res) => { logger.apiReq(req) @@ -50,7 +50,7 @@ module.exports = [ }, { method: 'get', - path: '/api/v1/microservices/', + path: '/api/v3/microservices/', middleware: async (req, res) => { logger.apiReq(req) @@ -77,7 +77,7 @@ module.exports = [ }, { method: 'post', - path: '/api/v1/microservices', + path: '/api/v3/microservices', supportSubstitution: true, middleware: async (req, res) => { logger.apiReq(req) @@ -109,7 +109,7 @@ module.exports = [ }, { method: 'post', - path: '/api/v1/microservices/yaml', + path: '/api/v3/microservices/yaml', supportSubstitution: true, fileInput: 'microservice', middleware: async (req, res) => { @@ -142,7 +142,7 @@ module.exports = [ }, { method: 'get', - path: '/api/v1/microservices/:uuid', + path: '/api/v3/microservices/:uuid', middleware: async (req, res) => { logger.apiReq(req) @@ -173,7 +173,7 @@ module.exports = [ }, { method: 'patch', - path: '/api/v1/microservices/:uuid', + path: '/api/v3/microservices/:uuid', supportSubstitution: true, middleware: async (req, res) => { logger.apiReq(req) @@ -209,7 +209,7 @@ module.exports = [ }, { method: 'patch', - path: '/api/v1/microservices/system/:uuid', + path: '/api/v3/microservices/system/:uuid', supportSubstitution: true, middleware: async (req, res) => { logger.apiReq(req) @@ -245,7 +245,7 @@ module.exports = [ }, { method: 'patch', - path: '/api/v1/microservices/yaml/:uuid', + path: '/api/v3/microservices/yaml/:uuid', supportSubstitution: true, fileInput: 'microservice', middleware: async (req, res) => { @@ -282,7 +282,7 @@ module.exports = [ }, { method: 'delete', - path: '/api/v1/microservices/:uuid', + path: '/api/v3/microservices/:uuid', middleware: async (req, res) => { logger.apiReq(req) @@ -313,7 +313,7 @@ module.exports = [ }, { method: 'post', - path: '/api/v1/microservices/:uuid/routes/:receiverUuid', + path: '/api/v3/microservices/:uuid/routes/:receiverUuid', middleware: async (req, res) => { logger.apiReq(req) @@ -348,7 +348,7 @@ module.exports = [ }, { method: 'delete', - path: '/api/v1/microservices/:uuid/routes/:receiverUuid', + path: '/api/v3/microservices/:uuid/routes/:receiverUuid', middleware: async (req, res) => { logger.apiReq(req) @@ -383,7 +383,7 @@ module.exports = [ }, { method: 'post', - path: '/api/v1/microservices/:uuid/port-mapping', + path: '/api/v3/microservices/:uuid/port-mapping', middleware: async (req, res) => { logger.apiReq(req) @@ -418,7 +418,7 @@ module.exports = [ }, { method: 'post', - path: '/api/v1/microservices/system/:uuid/port-mapping', + path: '/api/v3/microservices/system/:uuid/port-mapping', middleware: async (req, res) => { logger.apiReq(req) @@ -453,7 +453,7 @@ module.exports = [ }, { method: 'delete', - path: '/api/v1/microservices/:uuid/port-mapping/:internalPort', + path: '/api/v3/microservices/:uuid/port-mapping/:internalPort', middleware: async (req, res) => { logger.apiReq(req) @@ -484,7 +484,7 @@ module.exports = [ }, { method: 'delete', - path: '/api/v1/microservices/system/:uuid/port-mapping/:internalPort', + path: '/api/v3/microservices/system/:uuid/port-mapping/:internalPort', middleware: async (req, res) => { logger.apiReq(req) @@ -515,7 +515,7 @@ module.exports = [ }, { method: 'get', - path: '/api/v1/microservices/:uuid/port-mapping', + path: '/api/v3/microservices/:uuid/port-mapping', middleware: async (req, res) => { logger.apiReq(req) @@ -546,7 +546,7 @@ module.exports = [ }, { method: 'get', - path: '/api/v1/microservices/:uuid/volume-mapping', + path: '/api/v3/microservices/:uuid/volume-mapping', middleware: async (req, res) => { logger.apiReq(req) @@ -580,7 +580,7 @@ module.exports = [ }, { method: 'post', - path: '/api/v1/microservices/:uuid/volume-mapping', + path: '/api/v3/microservices/:uuid/volume-mapping', middleware: async (req, res) => { logger.apiReq(req) @@ -618,7 +618,7 @@ module.exports = [ }, { method: 'post', - path: '/api/v1/microservices/system/:uuid/volume-mapping', + path: '/api/v3/microservices/system/:uuid/volume-mapping', middleware: async (req, res) => { logger.apiReq(req) @@ -656,7 +656,7 @@ module.exports = [ }, { method: 'delete', - path: '/api/v1/microservices/:uuid/volume-mapping/:id', + path: '/api/v3/microservices/:uuid/volume-mapping/:id', middleware: async (req, res) => { logger.apiReq(req) @@ -694,7 +694,7 @@ module.exports = [ }, { method: 'delete', - path: '/api/v1/microservices/system/:uuid/volume-mapping/:id', + path: '/api/v3/microservices/system/:uuid/volume-mapping/:id', middleware: async (req, res) => { logger.apiReq(req) diff --git a/src/routes/registries.js b/src/routes/registries.js index f64b90827..5f80e3c60 100644 --- a/src/routes/registries.js +++ b/src/routes/registries.js @@ -20,10 +20,10 @@ const keycloak = require('../config/keycloak.js').initKeycloak() module.exports = [ { method: 'post', - path: '/api/v1/registries', + path: '/api/v3/registries', supportSubstitution: true, middleware: async (req, res) => { - logger.apiReq('POST /api/v1/registries') // don't use req as arg, because password not encrypted + logger.apiReq('POST /api/v3/registries') // don't use req as arg, because password not encrypted const successCode = constants.HTTP_CODE_CREATED const errorCodes = [ @@ -51,7 +51,7 @@ module.exports = [ }, { method: 'get', - path: '/api/v1/registries', + path: '/api/v3/registries', middleware: async (req, res) => { logger.apiReq(req) @@ -81,7 +81,7 @@ module.exports = [ }, { method: 'delete', - path: '/api/v1/registries/:id', + path: '/api/v3/registries/:id', middleware: async (req, res) => { logger.apiReq(req) @@ -115,10 +115,10 @@ module.exports = [ }, { method: 'patch', - path: '/api/v1/registries/:id', + path: '/api/v3/registries/:id', supportSubstitution: true, middleware: async (req, res) => { - logger.apiReq('PATCH /api/v1/registries') // don't use req as arg, because password not encrypted + logger.apiReq('PATCH /api/v3/registries') // don't use req as arg, because password not encrypted const successCode = constants.HTTP_CODE_NO_CONTENT const errorCodes = [ diff --git a/src/routes/router.js b/src/routes/router.js index 91b2526a8..12a64f9d2 100644 --- a/src/routes/router.js +++ b/src/routes/router.js @@ -20,7 +20,7 @@ const keycloak = require('../config/keycloak.js').initKeycloak() module.exports = [ { method: 'get', - path: '/api/v1/router', + path: '/api/v3/router', middleware: async (req, res) => { logger.apiReq(req) @@ -55,7 +55,7 @@ module.exports = [ }, { method: 'put', - path: '/api/v1/router', + path: '/api/v3/router', supportSubstitution: true, middleware: async (req, res) => { logger.apiReq(req) diff --git a/src/routes/routing.js b/src/routes/routing.js index b4ef4cba6..105e9add5 100644 --- a/src/routes/routing.js +++ b/src/routes/routing.js @@ -20,7 +20,7 @@ const keycloak = require('../config/keycloak.js').initKeycloak() module.exports = [ { method: 'get', - path: '/api/v1/routes', + path: '/api/v3/routes', middleware: async (req, res) => { logger.apiReq(req) @@ -55,7 +55,7 @@ module.exports = [ }, { method: 'get', - path: '/api/v1/routes/:appName/:name', + path: '/api/v3/routes/:appName/:name', middleware: async (req, res) => { logger.apiReq(req) @@ -90,7 +90,7 @@ module.exports = [ }, { method: 'post', - path: '/api/v1/routes', + path: '/api/v3/routes', supportSubstitution: true, middleware: async (req, res) => { logger.apiReq(req) @@ -134,7 +134,7 @@ module.exports = [ }, { method: 'patch', - path: '/api/v1/routes/:appName/:name', + path: '/api/v3/routes/:appName/:name', supportSubstitution: true, middleware: async (req, res) => { logger.apiReq(req) @@ -174,7 +174,7 @@ module.exports = [ }, { method: 'delete', - path: '/api/v1/routes/:appName/:name', + path: '/api/v3/routes/:appName/:name', middleware: async (req, res) => { logger.apiReq(req) diff --git a/src/routes/tunnel.js b/src/routes/tunnel.js index 3a3961ebf..e3021a462 100644 --- a/src/routes/tunnel.js +++ b/src/routes/tunnel.js @@ -20,9 +20,9 @@ const keycloak = require('../config/keycloak.js').initKeycloak() module.exports = [ { method: 'patch', - path: '/api/v1/iofog/:id/tunnel', + path: '/api/v3/iofog/:id/tunnel', middleware: async (req, res) => { - logger.apiReq('POST /api/v1/iofog/:id/tunnel') // don't use req as arg, because password not encrypted + logger.apiReq('POST /api/v3/iofog/:id/tunnel') // don't use req as arg, because password not encrypted const successCode = constants.HTTP_CODE_NO_CONTENT const errorCodes = [ @@ -59,7 +59,7 @@ module.exports = [ }, { method: 'get', - path: '/api/v1/iofog/:id/tunnel', + path: '/api/v3/iofog/:id/tunnel', middleware: async (req, res) => { logger.apiReq(req) diff --git a/src/routes/user.js b/src/routes/user.js index 6be5f155e..ed3bcb015 100644 --- a/src/routes/user.js +++ b/src/routes/user.js @@ -19,9 +19,9 @@ const logger = require('../logger') module.exports = [ { method: 'post', - path: '/api/v1/user/login', + path: '/api/v3/user/login', middleware: async (req, res) => { - logger.apiReq('POST /api/v1/user/login') // don't use req as arg, because password not encrypted + logger.apiReq('POST /api/v3/user/login') // don't use req as arg, because password not encrypted const successCode = constants.HTTP_CODE_SUCCESS const errorCodes = [ @@ -42,13 +42,13 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes('POST /api/v1/user/login', { args: { statusCode: responseObject.code } }) + logger.apiRes('POST /api/v3/user/login', { args: { statusCode: responseObject.code } }) // don't use req and responseObject as args, because they have password and token } }, { method: 'get', - path: '/api/v1/user/profile', + path: '/api/v3/user/profile', middleware: async (req, res) => { logger.apiReq(req) @@ -76,7 +76,7 @@ module.exports = [ }, { method: 'post', - path: '/api/v1/user/logout', + path: '/api/v3/user/logout', middleware: async (req, res) => { logger.apiReq(req) diff --git a/test/application-template-update.yaml b/test/application-template-update.yaml index fa96dcea0..5ae319646 100644 --- a/test/application-template-update.yaml +++ b/test/application-template-update.yaml @@ -1,5 +1,5 @@ kind: ApplicationTemplate -apiVersion: datasance.com/v1 +apiVersion: datasance.com/v3 metadata: name: 'app-template-from-yaml' spec: diff --git a/test/application-template.yaml b/test/application-template.yaml index 6d4dd682a..15ac7348d 100644 --- a/test/application-template.yaml +++ b/test/application-template.yaml @@ -1,5 +1,5 @@ kind: ApplicationTemplate -apiVersion: datasance.com/v1 +apiVersion: datasance.com/v3 metadata: name: 'app-template-from-yaml' spec: diff --git a/test/application-test.yaml b/test/application-test.yaml index 4c2484e26..ae1f589dd 100644 --- a/test/application-test.yaml +++ b/test/application-test.yaml @@ -1,5 +1,5 @@ kind: Application -apiVersion: datasance.com/v1 +apiVersion: datasance.com/v3 metadata: name: "healthcare-wearable-flow" spec: @@ -9,8 +9,8 @@ spec: agent: name: "{% assign agent = \"\" | findAgent | first %}{{ agent.name }}" images: - arm: "edgeworx/healthcare-heart-rate:arm-v1" - x86: "edgeworx/healthcare-heart-rate:x86-v1" + arm: "edgeworx/healthcare-heart-rate:arm-v3" + x86: "edgeworx/healthcare-heart-rate:x86-v3" container: rootHostAccess: false ports: [] diff --git a/test/application-update-test.yaml b/test/application-update-test.yaml index 6a560efce..0c7c35b8a 100644 --- a/test/application-update-test.yaml +++ b/test/application-update-test.yaml @@ -1,5 +1,5 @@ kind: Application -apiVersion: datasance.com/v1 +apiVersion: datasance.com/v3 metadata: name: "healthcare-wearable-flow" spec: @@ -9,8 +9,8 @@ spec: agent: name: "{% assign agent = \"\" | findAgent | first %}{{ agent.name }}" images: - arm: "edgeworx/healthcare-heart-rate:arm-v1" - x86: "edgeworx/healthcare-heart-rate:x86-v1" + arm: "edgeworx/healthcare-heart-rate:arm-v3" + x86: "edgeworx/healthcare-heart-rate:x86-v3" container: rootHostAccess: false ports: [] diff --git a/test/postman_collection.json b/test/postman_collection.json index 92fabe783..2a975f602 100644 --- a/test/postman_collection.json +++ b/test/postman_collection.json @@ -39,13 +39,13 @@ "raw": "{\n \"firstName\": \"John\",\n \"lastName\": \"Doe\",\n \"email\": \"user@domain.com\",\n \"password\": \"#Bugs4Fun\",\n \"subscriptionKey\": \"xxxx-xxxx-xxxx-xxxx\"\n}" }, "url": { - "raw": "{{host}}/api/v1/user/signup", + "raw": "{{host}}/api/v3/user/signup", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "user", "signup" ] @@ -83,13 +83,13 @@ "raw": "{\n \"activationCode\": \"string\"\n}" }, "url": { - "raw": "{{host}}/api/v1/user/activate", + "raw": "{{host}}/api/v3/user/activate", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "user", "activate" ] @@ -131,13 +131,13 @@ "raw": "{\n \"email\": \"user@domain.com\",\n \"password\": \"#Bugs4Fun\"\n}" }, "url": { - "raw": "{{host}}/api/v1/user/login", + "raw": "{{host}}/api/v3/user/login", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "user", "login" ] @@ -171,13 +171,13 @@ "raw": "" }, "url": { - "raw": "{{host}}/api/v1/user/logout", + "raw": "{{host}}/api/v3/user/logout", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "user", "logout" ] @@ -219,13 +219,13 @@ "raw": "{\n \"email\": \"user@domain.com\",\n \"password\": \"#Bugs4Fun\"\n}" }, "url": { - "raw": "{{host}}/api/v1/user/login", + "raw": "{{host}}/api/v3/user/login", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "user", "login" ] @@ -250,13 +250,13 @@ "method": "GET", "header": [], "url": { - "raw": "{{host}}/api/v1/user/signup/resend-activation?email=user@domain.com", + "raw": "{{host}}/api/v3/user/signup/resend-activation?email=user@domain.com", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "user", "signup", "resend-activation" @@ -297,13 +297,13 @@ } ], "url": { - "raw": "{{host}}/api/v1/user/profile", + "raw": "{{host}}/api/v3/user/profile", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "user", "profile" ] @@ -337,13 +337,13 @@ "raw": "{\n \"email\": \"user@domain.com\"\n}" }, "url": { - "raw": "{{host}}/api/v1/user/password", + "raw": "{{host}}/api/v3/user/password", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "user", "password" ] @@ -385,13 +385,13 @@ "raw": "{\n \"firstName\": \"Saeid\",\n \"lastName\": \"Rezaei\",\n \"subscriptionKey\": \"XXXX-XXXX-XXXX-XXXX\"\n}" }, "url": { - "raw": "{{host}}/api/v1/user/profile", + "raw": "{{host}}/api/v3/user/profile", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "user", "profile" ] @@ -429,13 +429,13 @@ "raw": "{\n \"oldPassword\": \"#Bugs4Fun\",\n \"newPassword\": \"#Bugs4Fun2\"\n}" }, "url": { - "raw": "{{host}}/api/v1/user/password", + "raw": "{{host}}/api/v3/user/password", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "user", "password" ] @@ -477,13 +477,13 @@ "raw": "{\n \"email\": \"user@domain.com\",\n \"password\": \"#Bugs4Fun2\"\n}" }, "url": { - "raw": "{{host}}/api/v1/user/login", + "raw": "{{host}}/api/v3/user/login", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "user", "login" ] @@ -521,13 +521,13 @@ "raw": "" }, "url": { - "raw": "{{host}}/api/v1/user/profile", + "raw": "{{host}}/api/v3/user/profile", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "user", "profile" ] @@ -582,13 +582,13 @@ "method": "GET", "header": [], "url": { - "raw": "{{host}}/api/v1/status", + "raw": "{{host}}/api/v3/status", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "status" ] } @@ -616,13 +616,13 @@ "method": "GET", "header": [], "url": { - "raw": "{{host}}/api/v1/email-activation", + "raw": "{{host}}/api/v3/email-activation", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "email-activation" ] } @@ -650,13 +650,13 @@ "method": "GET", "header": [], "url": { - "raw": "{{host}}/api/v1/fog-types", + "raw": "{{host}}/api/v3/fog-types", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "fog-types" ] } @@ -719,13 +719,13 @@ "raw": "{\n \"firstName\": \"John\",\n \"lastName\": \"Doe\",\n \"email\": \"user@domain.com\",\n \"password\": \"#Bugs4Fun\",\n \"subscriptionKey\": \"XXXX-XXXX-XXXX-XXXX\"\n}" }, "url": { - "raw": "{{host}}/api/v1/user/signup", + "raw": "{{host}}/api/v3/user/signup", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "user", "signup" ] @@ -767,13 +767,13 @@ "raw": "{\n \"email\": \"user@domain.com\",\n \"password\": \"#Bugs4Fun\"\n}" }, "url": { - "raw": "{{host}}/api/v1/user/login", + "raw": "{{host}}/api/v3/user/login", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "user", "login" ] @@ -819,13 +819,13 @@ "raw": "{\n \"name\": \"system node\",\n \"routerMode\": \"interior\",\n \"messagingPort\": 5672,\n \"edgeRouterPort\": 56722,\n \"interRouterPort\": 56721,\n \"host\": \"localhost\",\n \"isSystem\": true,\n \"location\": \"string\",\n \"latitude\": 0,\n \"longitude\": 0,\n \"description\": \"string\",\n \"dockerUrl\": \"string\",\n \"diskLimit\": 0,\n \"diskDirectory\": \"string\",\n \"memoryLimit\": 0,\n \"cpuLimit\": 0,\n \"logLimit\": 0,\n \"logDirectory\": \"string\",\n \"logFileCount\": 0,\n \"statusFrequency\": 0,\n \"changeFrequency\": 0,\n \"deviceScanFrequency\": 0,\n \"bluetoothEnabled\": false,\n \"watchdogEnabled\": true,\n \"abstractedHardwareEnabled\": false,\n \"fogType\": 1\n,\n \"host\": \"1.2.3.4\"\n}" }, "url": { - "raw": "{{host}}/api/v1/iofog", + "raw": "{{host}}/api/v3/iofog", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "iofog" ] } @@ -870,13 +870,13 @@ "raw": "{\n \"name\": \"string\",\n \"host\": \"1.2.3.4\",\n \"location\": \"string\",\n \"latitude\": 0,\n \"longitude\": 0,\n \"description\": \"string\",\n \"dockerUrl\": \"string\",\n \"diskLimit\": 0,\n \"diskDirectory\": \"string\",\n \"memoryLimit\": 0,\n \"cpuLimit\": 0,\n \"logLimit\": 0,\n \"logDirectory\": \"string\",\n \"logFileCount\": 0,\n \"statusFrequency\": 0,\n \"changeFrequency\": 0,\n \"deviceScanFrequency\": 0,\n \"bluetoothEnabled\": false,\n \"watchdogEnabled\": true,\n \"abstractedHardwareEnabled\": false,\n \"fogType\": 1\n,\n \"host\": \"1.2.3.4\"\n}" }, "url": { - "raw": "{{host}}/api/v1/iofog", + "raw": "{{host}}/api/v3/iofog", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "iofog" ] } @@ -917,13 +917,13 @@ } ], "url": { - "raw": "{{host}}/api/v1/iofog/{{node-id}}/provisioning-key", + "raw": "{{host}}/api/v3/iofog/{{node-id}}/provisioning-key", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "iofog", "{{node-id}}", "provisioning-key" @@ -964,13 +964,13 @@ "raw": "{\n\t\"type\": 1,\n\t\"key\":\"{{provisioning-key}}\"\n}" }, "url": { - "raw": "{{host}}/api/v1/agent/provision", + "raw": "{{host}}/api/v3/agent/provision", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "agent", "provision" ] @@ -1014,13 +1014,13 @@ } ], "url": { - "raw": "{{host}}/api/v1/agent/config", + "raw": "{{host}}/api/v3/agent/config", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "agent", "config" ] @@ -1059,13 +1059,13 @@ } ], "url": { - "raw": "{{host}}/api/v1/agent/image-snapshot", + "raw": "{{host}}/api/v3/agent/image-snapshot", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "agent", "image-snapshot" ] @@ -1104,13 +1104,13 @@ } ], "url": { - "raw": "{{host}}/api/v1/agent/microservices/abcedf", + "raw": "{{host}}/api/v3/agent/microservices/abcedf", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "agent", "microservices", "abcedf" @@ -1147,13 +1147,13 @@ } ], "url": { - "raw": "{{host}}/api/v1/agent/strace", + "raw": "{{host}}/api/v3/agent/strace", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "agent", "strace" ] @@ -1193,13 +1193,13 @@ "raw": "{\r\n \"info\": \"testData\"\r\n}" }, "url": { - "raw": "{{host}}/api/v1/agent/hal/hw", + "raw": "{{host}}/api/v3/agent/hal/hw", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "agent", "hal", "hw" @@ -1240,13 +1240,13 @@ "raw": "{\r\n \"info\": \"testData2\"\r\n}" }, "url": { - "raw": "{{host}}/api/v1/agent/hal/usb", + "raw": "{{host}}/api/v3/agent/hal/usb", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "agent", "hal", "usb" @@ -1290,13 +1290,13 @@ "raw": "{\r\n \"straceData\": [\r\n {\r\n \"microserviceUuid\": \"abcdef\",\r\n \"buffer\": \"test\"\r\n }\r\n ]\r\n}" }, "url": { - "raw": "{{host}}/api/v1/agent/strace", + "raw": "{{host}}/api/v3/agent/strace", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "agent", "strace" ] @@ -1336,13 +1336,13 @@ "raw": "{\r\n \"daemonStatus\": \"RUNNING\",\r\n \"daemonOperatingDuration\": 15,\r\n \"daemonLastStart\": 25,\r\n \"memoryUsage\": 16,\r\n \"diskUsage\": 14,\r\n \"cpuUsage\": 17,\r\n \"memoryViolation\": true,\r\n \"diskViolation\": true,\r\n \"cpuViolation\": true,\r\n \"microserviceStatus\": \"[]\",\r\n \"repositoryCount\": 5,\r\n \"repositoryStatus\": \"RUNNING\",\r\n \"systemTime\": 155,\r\n \"lastStatusTime\": 166,\r\n \"ipAddress\": \"192.168.0.1\",\r\n \"processedMessages\": 255,\r\n \"microserviceMessageCounts\": \"counts\",\r\n \"messageSpeed\": 52,\r\n \"lastCommandTime\": 57,\r\n \"tunnelStatus\": \"on\",\r\n \"version\": \"1\",\r\n \"isReadyToUpgrade\": true,\r\n \"isReadyToRollback\": true\r\n}" }, "url": { - "raw": "{{host}}/api/v1/agent/status", + "raw": "{{host}}/api/v3/agent/status", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "agent", "status" ] @@ -1385,13 +1385,13 @@ "raw": "{\r\n \"info\": \"testData2\"\r\n}" }, "url": { - "raw": "{{host}}/api/v1/agent/image-snapshot", + "raw": "{{host}}/api/v3/agent/image-snapshot", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "agent", "image-snapshot" ] @@ -1438,13 +1438,13 @@ "raw": "{\n \"name\": \"application-msvc-name\",\n \"isSystem\": false,\n \"description\": \"Description\",\n \"isActivated\": true,\n \"microservices\": [\n {\n \"name\": \"msvc-1\",\n \"config\": \"string\",\n \"images\": [\n {\n \"containerImage\": \"hello-world\",\n \"fogTypeId\": 1\n },\n {\n \"containerImage\": \"hello-world\",\n \"fogTypeId\": 2\n }\n ],\n \"registryId\": 1,\n \"application\": \"{{application-name-2}}\",\n \"iofogUuid\": \"{{node-id}}\",\n \"rootHostAccess\": true,\n \"logSize\": 0,\n \"volumeMappings\": [\n {\n \"hostDestination\": \"/var/dest\",\n \"containerDestination\": \"/var/dest\",\n \"accessMode\": \"rw\"\n }\n ],\n \"ports\": [{\n \"internal\": 81,\n \"external\": 5001\n }, {\n \"internal\": 80,\n \"external\": 5002,\n \"protocol\": \"udp\"\n }],\n \"routes\": [],\n \"env\": [\n {\n \"key\": \"KEY1\",\n \"value\": \"value1\"\n },\n {\n \"key\": \"KEY2\",\n \"value\": \"value2\"\n }\n ],\n \"cmd\": [\n \"test\",\n \"--arg1\",\n \"--arg2\"\n ]\n },\n {\n \"name\": \"msvc-2\",\n \"config\": \"string\",\n \"images\": [\n {\n \"containerImage\": \"hello-world\",\n \"fogTypeId\": 1\n },\n {\n \"containerImage\": \"hello-world\",\n \"fogTypeId\": 2\n }\n ],\n \"registryId\": 1,\n \"application\": \"{{application-name-2}}\",\n \"iofogUuid\": \"{{node-id}}\",\n \"rootHostAccess\": true,\n \"logSize\": 0,\n \"volumeMappings\": [\n {\n \"hostDestination\": \"/var/dest\",\n \"containerDestination\": \"/var/dest\",\n \"accessMode\": \"rw\"\n }\n ],\n \"ports\": [],\n \"routes\": [],\n \"env\": [\n {\n \"key\": \"KEY1\",\n \"value\": \"value1\"\n },\n {\n \"key\": \"KEY2\",\n \"value\": \"value2\"\n }\n ],\n \"cmd\": [\n \"test\",\n \"--arg1\",\n \"--arg2\"\n ]\n },\n {\n \"name\": \"msvc-3\",\n \"config\": \"string\",\n \"images\": [\n {\n \"containerImage\": \"hello-world\",\n \"fogTypeId\": 1\n },\n {\n \"containerImage\": \"hello-world\",\n \"fogTypeId\": 2\n }\n ],\n \"registryId\": 1,\n \"application\": \"{{application-name-2}}\",\n \"iofogUuid\": \"{{node-id}}\",\n \"rootHostAccess\": true,\n \"logSize\": 0,\n \"volumeMappings\": [\n {\n \"hostDestination\": \"/var/dest\",\n \"containerDestination\": \"/var/dest\",\n \"accessMode\": \"rw\"\n }\n ],\n \"ports\": [],\n \"routes\": [],\n \"env\": [\n {\n \"key\": \"KEY1\",\n \"value\": \"value1\"\n },\n {\n \"key\": \"KEY2\",\n \"value\": \"value2\"\n }\n ],\n \"cmd\": [\n \"test\",\n \"--arg1\",\n \"--arg2\"\n ]\n }\n ],\n \"routes\": [\n {\n \"from\": \"msvc-1\",\n \"to\": \"msvc-2\",\n \"name\": \"m1-2\"\n }\n ]\n}" }, "url": { - "raw": "{{host}}/api/v1/application", + "raw": "{{host}}/api/v3/application", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "application" ] } @@ -1483,13 +1483,13 @@ "raw": "{\r\n \"networkInterface\": \"wlan0\",\r\n \"dockerUrl\": \"http://google.com\",\r\n \"diskLimit\": 15,\r\n \"diskDirectory\": \"testDirectoryPath\",\r\n \"memoryLimit\": 150,\r\n \"cpuLimit\": 17,\r\n \"logLimit\": 16,\r\n \"logDirectory\": \"testLogPath\",\r\n \"logFileCount\": 7,\r\n \"statusFrequency\": 35,\r\n \"changeFrequency\": 36,\r\n \"deviceScanFrequency\": 37,\r\n \"watchdogEnabled\": true,\r\n \"latitude\": 22,\r\n \"longitude\": 66,\r\n \"gpsMode\": \"manual\",\r\n \"dockerPruningFrequency\": 35,\r\n \"availableDiskThreshold\": 95,\r\n \"logLevel\": \"INFO\"\r\n}" }, "url": { - "raw": "{{host}}/api/v1/agent/config", + "raw": "{{host}}/api/v3/agent/config", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "agent", "config" ] @@ -1531,13 +1531,13 @@ } ], "url": { - "raw": "{{host}}/api/v1/agent/config/changes", + "raw": "{{host}}/api/v3/agent/config/changes", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "agent", "config", "changes" @@ -1577,13 +1577,13 @@ } ], "url": { - "raw": "{{host}}/api/v1/agent/tunnel", + "raw": "{{host}}/api/v3/agent/tunnel", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "agent", "tunnel" ] @@ -1622,13 +1622,13 @@ } ], "url": { - "raw": "{{host}}/api/v1/agent/registries", + "raw": "{{host}}/api/v3/agent/registries", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "agent", "registries" ] @@ -1667,13 +1667,13 @@ } ], "url": { - "raw": "{{host}}/api/v1/agent/version", + "raw": "{{host}}/api/v3/agent/version", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "agent", "version" ] @@ -1720,13 +1720,13 @@ } ], "url": { - "raw": "{{host}}/api/v1/agent/microservices", + "raw": "{{host}}/api/v3/agent/microservices", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "agent", "microservices" ] @@ -1766,13 +1766,13 @@ "raw": "{\n\t\"type\": 1,\n\t\"key\":\"testtesttest\"\n}" }, "url": { - "raw": "{{host}}/api/v1/iofog/{{system-node-id}}", + "raw": "{{host}}/api/v3/iofog/{{system-node-id}}", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "iofog", "{{system-node-id}}" ] @@ -1812,13 +1812,13 @@ "raw": "" }, "url": { - "raw": "{{host}}/api/v1/iofog/{{node-id}}", + "raw": "{{host}}/api/v3/iofog/{{node-id}}", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "iofog", "{{node-id}}" ] @@ -1856,13 +1856,13 @@ "raw": "" }, "url": { - "raw": "{{host}}/api/v1/user/profile", + "raw": "{{host}}/api/v3/user/profile", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "user", "profile" ] @@ -1926,13 +1926,13 @@ "raw": "{\n \"firstName\": \"John\",\n \"lastName\": \"Doe\",\n \"email\": \"user@domain.com\",\n \"password\": \"#Bugs4Fun\",\n \"subscriptionKey\": \"XXXX-XXXX-XXXX-XXXX\"\n}" }, "url": { - "raw": "{{host}}/api/v1/user/signup", + "raw": "{{host}}/api/v3/user/signup", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "user", "signup" ] @@ -1974,13 +1974,13 @@ "raw": "{\n \"email\": \"user@domain.com\",\n \"password\": \"#Bugs4Fun\"\n}" }, "url": { - "raw": "{{host}}/api/v1/user/login", + "raw": "{{host}}/api/v3/user/login", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "user", "login" ] @@ -2026,13 +2026,13 @@ "raw": "{\n \"name\": \"system node\",\n \"routerMode\": \"interior\",\n \"messagingPort\": 5672,\n \"edgeRouterPort\": 56722,\n \"interRouterPort\": 56721,\n \"host\": \"localhost\",\n \"isSystem\": true,\n \"location\": \"string\",\n \"latitude\": 0,\n \"longitude\": 0,\n \"description\": \"string\",\n \"dockerUrl\": \"string\",\n \"diskLimit\": 0,\n \"diskDirectory\": \"string\",\n \"memoryLimit\": 0,\n \"cpuLimit\": 0,\n \"logLimit\": 0,\n \"logDirectory\": \"string\",\n \"logFileCount\": 0,\n \"statusFrequency\": 0,\n \"changeFrequency\": 0,\n \"deviceScanFrequency\": 0,\n \"bluetoothEnabled\": false,\n \"watchdogEnabled\": true,\n \"abstractedHardwareEnabled\": false,\n \"fogType\": 1\n,\n \"host\": \"1.2.3.4\"\n}" }, "url": { - "raw": "{{host}}/api/v1/iofog", + "raw": "{{host}}/api/v3/iofog", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "iofog" ] } @@ -2077,13 +2077,13 @@ "raw": "{\n \"name\": \"string\",\n \"host\": \"1.2.3.4\",\n \"location\": \"string\",\n \"latitude\": 0,\n \"longitude\": 0,\n \"description\": \"string\",\n \"dockerUrl\": \"string\",\n \"diskLimit\": 0,\n \"diskDirectory\": \"string\",\n \"memoryLimit\": 0,\n \"cpuLimit\": 0,\n \"logLimit\": 0,\n \"logDirectory\": \"string\",\n \"logFileCount\": 0,\n \"statusFrequency\": 0,\n \"changeFrequency\": 0,\n \"deviceScanFrequency\": 0,\n \"bluetoothEnabled\": false,\n \"watchdogEnabled\": true,\n \"abstractedHardwareEnabled\": false,\n \"fogType\": 1\n,\n \"host\": \"1.2.3.4\"\n}" }, "url": { - "raw": "{{host}}/api/v1/iofog", + "raw": "{{host}}/api/v3/iofog", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "iofog" ] } @@ -2127,13 +2127,13 @@ "raw": "{\n \"name\": \"application-name\",\n \"isSystem\": false,\n \"description\": \"Description\",\n \"isActivated\": true\n}" }, "url": { - "raw": "{{host}}/api/v1/application", + "raw": "{{host}}/api/v3/application", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "application" ] } @@ -2179,13 +2179,13 @@ "raw": "{\n \"name\": \"application-msvc-name\",\n \"isSystem\": false,\n \"description\": \"Description\",\n \"isActivated\": true,\n \"microservices\": [\n {\n \"name\": \"msvc-1\",\n \"config\": \"string\",\n \"images\": [\n {\n \"containerImage\": \"hello-world\",\n \"fogTypeId\": 1\n },\n {\n \"containerImage\": \"hello-world\",\n \"fogTypeId\": 2\n }\n ],\n \"registryId\": 1,\n \"application\": \"{{application-name-2}}\",\n \"iofogUuid\": \"{{node-id}}\",\n \"rootHostAccess\": true,\n \"logSize\": 0,\n \"volumeMappings\": [\n {\n \"hostDestination\": \"/var/dest\",\n \"containerDestination\": \"/var/dest\",\n \"accessMode\": \"rw\"\n }\n ],\n \"ports\": [],\n \"routes\": [],\n \"env\": [\n {\n \"key\": \"KEY1\",\n \"value\": \"value1\"\n },\n {\n \"key\": \"KEY2\",\n \"value\": \"value2\"\n }\n ],\n \"cmd\": [\n \"test\",\n \"--arg1\",\n \"--arg2\"\n ]\n },\n {\n \"name\": \"msvc-2\",\n \"config\": \"string\",\n \"images\": [\n {\n \"containerImage\": \"hello-world\",\n \"fogTypeId\": 1\n },\n {\n \"containerImage\": \"hello-world\",\n \"fogTypeId\": 2\n }\n ],\n \"registryId\": 1,\n \"application\": \"{{application-name-2}}\",\n \"iofogUuid\": \"{{node-id}}\",\n \"rootHostAccess\": true,\n \"logSize\": 0,\n \"volumeMappings\": [\n {\n \"hostDestination\": \"/var/dest\",\n \"containerDestination\": \"/var/dest\",\n \"accessMode\": \"rw\"\n }\n ],\n \"ports\": [],\n \"routes\": [],\n \"env\": [\n {\n \"key\": \"KEY1\",\n \"value\": \"value1\"\n },\n {\n \"key\": \"KEY2\",\n \"value\": \"value2\"\n }\n ],\n \"cmd\": [\n \"test\",\n \"--arg1\",\n \"--arg2\"\n ]\n },\n {\n \"name\": \"msvc-3\",\n \"config\": \"string\",\n \"images\": [\n {\n \"containerImage\": \"hello-world\",\n \"fogTypeId\": 1\n },\n {\n \"containerImage\": \"hello-world\",\n \"fogTypeId\": 2\n }\n ],\n \"registryId\": 1,\n \"application\": \"{{application-name-2}}\",\n \"iofogUuid\": \"{{node-id}}\",\n \"rootHostAccess\": true,\n \"logSize\": 0,\n \"volumeMappings\": [\n {\n \"hostDestination\": \"/var/dest\",\n \"containerDestination\": \"/var/dest\",\n \"accessMode\": \"rw\"\n }\n ],\n \"ports\": [],\n \"routes\": [],\n \"env\": [\n {\n \"key\": \"KEY1\",\n \"value\": \"value1\"\n },\n {\n \"key\": \"KEY2\",\n \"value\": \"value2\"\n }\n ],\n \"cmd\": [\n \"test\",\n \"--arg1\",\n \"--arg2\"\n ]\n }\n ],\n \"routes\": [\n {\n \"from\": \"msvc-1\",\n \"to\": \"msvc-2\",\n \"name\": \"m1-2\"\n }\n ]\n}" }, "url": { - "raw": "{{host}}/api/v1/application", + "raw": "{{host}}/api/v3/application", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "application" ] } @@ -2236,13 +2236,13 @@ ] }, "url": { - "raw": "{{host}}/api/v1/application/yaml", + "raw": "{{host}}/api/v3/application/yaml", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "application", "yaml" ] @@ -2282,13 +2282,13 @@ } ], "url": { - "raw": "{{host}}/api/v1/routes/{{application-msvc-name}}/{{application-route-name}}", + "raw": "{{host}}/api/v3/routes/{{application-msvc-name}}/{{application-route-name}}", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "routes", "{{application-msvc-name}}", "{{application-route-name}}" @@ -2330,13 +2330,13 @@ "raw": "{\n \"routes\": [\n {\n \"from\": \"msvc-1\",\n \"to\": \"msvc-3\",\n \"name\": \"m1-2\"\n },\n {\n \"from\": \"msvc-1\",\n \"to\": \"msvc-1\",\n \"name\": \"m1-1\"\n }\n ]\n}" }, "url": { - "raw": "{{host}}/api/v1/application/{{application-msvc-name}}", + "raw": "{{host}}/api/v3/application/{{application-msvc-name}}", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "application", "{{application-msvc-name}}" ] @@ -2377,13 +2377,13 @@ } ], "url": { - "raw": "{{host}}/api/v1/application/{{application-msvc-name}}", + "raw": "{{host}}/api/v3/application/{{application-msvc-name}}", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "application", "{{application-msvc-name}}" ] @@ -2423,13 +2423,13 @@ } ], "url": { - "raw": "{{host}}/api/v1/routes/{{application-msvc-name}}/{{application-route-name}}", + "raw": "{{host}}/api/v3/routes/{{application-msvc-name}}/{{application-route-name}}", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "routes", "{{application-msvc-name}}", "{{application-route-name}}" @@ -2479,13 +2479,13 @@ } ], "url": { - "raw": "{{host}}/api/v1/microservices?application={{application-msvc-name}}", + "raw": "{{host}}/api/v3/microservices?application={{application-msvc-name}}", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "microservices" ], "query": [ @@ -2529,13 +2529,13 @@ "raw": "{\n \"description\": \"Description\",\n \"microservices\": [\n {\n \"name\": \"msvc-1\",\n \"config\": \"string\",\n \"images\": [\n {\n \"containerImage\": \"hello-world\",\n \"fogTypeId\": 1\n },\n {\n \"containerImage\": \"hello-world\",\n \"fogTypeId\": 2\n }\n ],\n \"registryId\": 1,\n \"application\": \"{{application-name-2}}\",\n \"iofogUuid\": \"{{node-id}}\",\n \"rootHostAccess\": true,\n \"logSize\": 0,\n \"volumeMappings\": [\n {\n \"hostDestination\": \"/var/dest\",\n \"containerDestination\": \"/var/dest\",\n \"accessMode\": \"rw\"\n }\n ],\n \"ports\": [],\n \"routes\": [],\n \"env\": [\n {\n \"key\": \"KEY1\",\n \"value\": \"value1\"\n },\n {\n \"key\": \"KEY2\",\n \"value\": \"value2\"\n }\n ],\n \"cmd\": [\n \"test\",\n \"--arg1\",\n \"--arg2\"\n ]\n },\n {\n \"name\": \"msvc-2\",\n \"config\": \"string\",\n \"images\": [\n {\n \"containerImage\": \"hello-world\",\n \"fogTypeId\": 1\n },\n {\n \"containerImage\": \"hello-world\",\n \"fogTypeId\": 2\n }\n ],\n \"registryId\": 1,\n \"application\": \"{{application-name-2}}\",\n \"iofogUuid\": \"{{node-id}}\",\n \"rootHostAccess\": true,\n \"logSize\": 0,\n \"volumeMappings\": [\n {\n \"hostDestination\": \"/var/dest\",\n \"containerDestination\": \"/var/dest\",\n \"accessMode\": \"rw\"\n }\n ],\n \"ports\": [],\n \"routes\": [],\n \"env\": [\n {\n \"key\": \"KEY1\",\n \"value\": \"value1\"\n },\n {\n \"key\": \"KEY2\",\n \"value\": \"value2\"\n }\n ],\n \"cmd\": [\n \"test\",\n \"--arg1\",\n \"--arg2\"\n ]\n }\n ]\n}" }, "url": { - "raw": "{{host}}/api/v1/application/{{application-msvc-name}}", + "raw": "{{host}}/api/v3/application/{{application-msvc-name}}", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "application", "{{application-msvc-name}}" ] @@ -2580,13 +2580,13 @@ ] }, "url": { - "raw": "{{host}}/api/v1/application/yaml/{{application-yaml-name}}", + "raw": "{{host}}/api/v3/application/yaml/{{application-yaml-name}}", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "application", "yaml", "{{application-yaml-name}}" @@ -2645,13 +2645,13 @@ } ], "url": { - "raw": "{{host}}/api/v1/microservices?application={{application-yaml-name}}", + "raw": "{{host}}/api/v3/microservices?application={{application-yaml-name}}", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "microservices" ], "query": [ @@ -2705,13 +2705,13 @@ } ], "url": { - "raw": "{{host}}/api/v1/microservices?application={{application-msvc-name}}", + "raw": "{{host}}/api/v3/microservices?application={{application-msvc-name}}", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "microservices" ], "query": [ @@ -2755,13 +2755,13 @@ } ], "url": { - "raw": "{{host}}/api/v1/application", + "raw": "{{host}}/api/v3/application", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "application" ] } @@ -2799,13 +2799,13 @@ } ], "url": { - "raw": "{{host}}/api/v1/application/{{application-name}}", + "raw": "{{host}}/api/v3/application/{{application-name}}", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "application", "{{application-name}}" ] @@ -2845,13 +2845,13 @@ "raw": "{\n \"name\": \"application-name-22\",\n \"isSystem\": true,\n \"description\": \"Description\",\n \"isActivated\": true\n}" }, "url": { - "raw": "{{host}}/api/v1/application/{{application-name}}", + "raw": "{{host}}/api/v3/application/{{application-name}}", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "application", "{{application-name}}" ] @@ -2890,13 +2890,13 @@ } ], "url": { - "raw": "{{host}}/api/v1/application", + "raw": "{{host}}/api/v3/application", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "application" ] } @@ -2934,13 +2934,13 @@ "raw": "" }, "url": { - "raw": "{{host}}/api/v1/application/{{application-name}}", + "raw": "{{host}}/api/v3/application/{{application-name}}", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "application", "{{application-name}}" ] @@ -2979,13 +2979,13 @@ "raw": "" }, "url": { - "raw": "{{host}}/api/v1/application/{{application-msvc-name}}", + "raw": "{{host}}/api/v3/application/{{application-msvc-name}}", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "application", "{{application-msvc-name}}" ] @@ -3024,13 +3024,13 @@ "raw": "" }, "url": { - "raw": "{{host}}/api/v1/application/{{application-yaml-name}}", + "raw": "{{host}}/api/v3/application/{{application-yaml-name}}", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "application", "{{application-yaml-name}}" ] @@ -3069,13 +3069,13 @@ } ], "url": { - "raw": "{{host}}/api/v1/application", + "raw": "{{host}}/api/v3/application", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "application" ] } @@ -3116,13 +3116,13 @@ } ], "url": { - "raw": "{{host}}/api/v1/microservices", + "raw": "{{host}}/api/v3/microservices", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "microservices" ] } @@ -3156,13 +3156,13 @@ } ], "url": { - "raw": "{{host}}/api/v1/route/{{application-route-name}}", + "raw": "{{host}}/api/v3/route/{{application-route-name}}", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "route", "{{application-route-name}}" ] @@ -3202,13 +3202,13 @@ "raw": "{\n\t\"type\": 1,\n\t\"key\":\"testtesttest\"\n}" }, "url": { - "raw": "{{host}}/api/v1/iofog/{{system-node-id}}", + "raw": "{{host}}/api/v3/iofog/{{system-node-id}}", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "iofog", "{{system-node-id}}" ] @@ -3248,13 +3248,13 @@ "raw": "" }, "url": { - "raw": "{{host}}/api/v1/iofog/{{node-id}}", + "raw": "{{host}}/api/v3/iofog/{{node-id}}", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "iofog", "{{node-id}}" ] @@ -3292,13 +3292,13 @@ "raw": "" }, "url": { - "raw": "{{host}}/api/v1/user/profile", + "raw": "{{host}}/api/v3/user/profile", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "user", "profile" ] @@ -3362,13 +3362,13 @@ "raw": "{\n \"firstName\": \"John\",\n \"lastName\": \"Doe\",\n \"email\": \"user@domain.com\",\n \"password\": \"#Bugs4Fun\",\n \"subscriptionKey\": \"XXXX-XXXX-XXXX-XXXX\"\n }" }, "url": { - "raw": "{{host}}/api/v1/user/signup", + "raw": "{{host}}/api/v3/user/signup", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "user", "signup" ] @@ -3410,13 +3410,13 @@ "raw": "{\n \"email\": \"user@domain.com\",\n \"password\": \"#Bugs4Fun\"\n}" }, "url": { - "raw": "{{host}}/api/v1/user/login", + "raw": "{{host}}/api/v3/user/login", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "user", "login" ] @@ -3462,13 +3462,13 @@ "raw": "{\n \"name\": \"system node\",\n \"routerMode\": \"interior\",\n \"messagingPort\": 5672,\n \"edgeRouterPort\": 56722,\n \"interRouterPort\": 56721,\n \"host\": \"localhost\",\n \"isSystem\": true,\n \"location\": \"string\",\n \"latitude\": 0,\n \"longitude\": 0,\n \"description\": \"string\",\n \"dockerUrl\": \"string\",\n \"diskLimit\": 0,\n \"diskDirectory\": \"string\",\n \"memoryLimit\": 0,\n \"cpuLimit\": 0,\n \"logLimit\": 0,\n \"logDirectory\": \"string\",\n \"logFileCount\": 0,\n \"statusFrequency\": 0,\n \"changeFrequency\": 0,\n \"deviceScanFrequency\": 0,\n \"bluetoothEnabled\": false,\n \"watchdogEnabled\": true,\n \"abstractedHardwareEnabled\": false,\n \"fogType\": 1\n,\n \"host\": \"1.2.3.4\"\n}" }, "url": { - "raw": "{{host}}/api/v1/iofog", + "raw": "{{host}}/api/v3/iofog", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "iofog" ] } @@ -3513,13 +3513,13 @@ "raw": "{\n \"name\": \"string\",\n \"host\": \"1.2.3.4\",\n \"location\": \"string\",\n \"latitude\": 0,\n \"longitude\": 0,\n \"description\": \"string\",\n \"dockerUrl\": \"string\",\n \"diskLimit\": 0,\n \"diskDirectory\": \"string\",\n \"memoryLimit\": 0,\n \"cpuLimit\": 0,\n \"logLimit\": 0,\n \"logDirectory\": \"string\",\n \"logFileCount\": 0,\n \"statusFrequency\": 0,\n \"changeFrequency\": 0,\n \"deviceScanFrequency\": 0,\n \"bluetoothEnabled\": false,\n \"watchdogEnabled\": true,\n \"abstractedHardwareEnabled\": false,\n \"fogType\": 1\n,\n \"host\": \"1.2.3.4\"\n}" }, "url": { - "raw": "{{host}}/api/v1/iofog", + "raw": "{{host}}/api/v3/iofog", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "iofog" ] } @@ -3567,13 +3567,13 @@ "raw": "{\n \"name\": \"application-template-name\",\n \"variables\": [\n {\n \"key\": \"agent-1-name\",\n \"description\": \"Agent name for msvc-1\"\n },\n {\n \"key\": \"env-value-1\",\n \"description\": \"ENV variable value for KEY1\"\n },\n {\n \"key\": \"env-value-2\",\n \"description\": \"ENV variable value for KEY2\",\n \"defaultValue\": \"test42\"\n }\n ],\n \"application\": {\n \"microservices\": [\n {\n \"name\": \"msvc-1\",\n \"config\": \"string\",\n \"images\": [\n {\n \"containerImage\": \"hello-world\",\n \"fogTypeId\": 1\n },\n {\n \"containerImage\": \"hello-world\",\n \"fogTypeId\": 2\n }\n ],\n \"registryId\": 1,\n \"agentName\": \"{{ agent-1-name }}\",\n \"rootHostAccess\": true,\n \"logSize\": 0,\n \"volumeMappings\": [\n {\n \"hostDestination\": \"/var/dest\",\n \"containerDestination\": \"/var/dest\",\n \"accessMode\": \"rw\"\n }\n ],\n \"ports\": [],\n \"routes\": [],\n \"env\": [\n {\n \"key\": \"KEY1\",\n \"value\": \"{{ env-value-1 }}\"\n },\n {\n \"key\": \"KEY2\",\n \"value\": \"{{ env-value-2 }}\"\n }\n ],\n \"cmd\": [\n \"test\",\n \"--arg1\",\n \"--arg2\"\n ]\n },\n {\n \"name\": \"msvc-2\",\n \"config\": \"string\",\n \"images\": [\n {\n \"containerImage\": \"hello-world\",\n \"fogTypeId\": 1\n },\n {\n \"containerImage\": \"hello-world\",\n \"fogTypeId\": 2\n }\n ],\n \"registryId\": 1,\n \"application\": \"{{application-name-2}}\",\n \"iofogUuid\": \"{{node-id}}\",\n \"rootHostAccess\": true,\n \"logSize\": 0,\n \"volumeMappings\": [\n {\n \"hostDestination\": \"/var/dest\",\n \"containerDestination\": \"/var/dest\",\n \"accessMode\": \"rw\"\n }\n ],\n \"ports\": [],\n \"routes\": [],\n \"env\": [\n {\n \"key\": \"KEY1\",\n \"value\": \"value1\"\n },\n {\n \"key\": \"KEY2\",\n \"value\": \"value2\"\n }\n ],\n \"cmd\": [\n \"test\",\n \"--arg1\",\n \"--arg2\"\n ]\n },\n {\n \"name\": \"msvc-3\",\n \"config\": \"string\",\n \"images\": [\n {\n \"containerImage\": \"hello-world\",\n \"fogTypeId\": 1\n },\n {\n \"containerImage\": \"hello-world\",\n \"fogTypeId\": 2\n }\n ],\n \"registryId\": 1,\n \"application\": \"{{application-name-2}}\",\n \"iofogUuid\": \"{{node-id}}\",\n \"rootHostAccess\": true,\n \"logSize\": 0,\n \"volumeMappings\": [\n {\n \"hostDestination\": \"/var/dest\",\n \"containerDestination\": \"/var/dest\",\n \"accessMode\": \"rw\"\n }\n ],\n \"ports\": [],\n \"routes\": [],\n \"env\": [\n {\n \"key\": \"KEY1\",\n \"value\": \"value1\"\n },\n {\n \"key\": \"KEY2\",\n \"value\": \"value2\"\n }\n ],\n \"cmd\": [\n \"test\",\n \"--arg1\",\n \"--arg2\"\n ]\n }\n ],\n \"routes\": [\n {\n \"from\": \"msvc-1\",\n \"to\": \"msvc-2\",\n \"name\": \"m1-2\"\n }\n ]\n }\n}" }, "url": { - "raw": "{{host}}/api/v1/applicationTemplate", + "raw": "{{host}}/api/v3/applicationTemplate", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "applicationTemplate" ] } @@ -3627,13 +3627,13 @@ ] }, "url": { - "raw": "{{host}}/api/v1/applicationTemplate/yaml", + "raw": "{{host}}/api/v3/applicationTemplate/yaml", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "applicationTemplate", "yaml" ] @@ -3673,13 +3673,13 @@ "raw": "{\n \"variables\": [\n {\n \"key\": \"agent-1-name\",\n \"description\": \"Agent name for msvc-1\"\n },\n {\n \"key\": \"env-value-1\",\n \"description\": \"ENV variable value for KEY1\"\n },\n {\n \"key\": \"env-value-2\",\n \"description\": \"ENV variable value for KEY2\",\n \"defaultValue\": \"test42\"\n }\n ],\n \"application\": {\n \"microservices\": [\n {\n \"name\": \"msvc-1\",\n \"config\": \"string\",\n \"images\": [\n {\n \"containerImage\": \"hello-world\",\n \"fogTypeId\": 1\n },\n {\n \"containerImage\": \"hello-world\",\n \"fogTypeId\": 2\n }\n ],\n \"registryId\": 1,\n \"agentName\": \"{{ agent-1-name }}\",\n \"rootHostAccess\": true,\n \"logSize\": 0,\n \"volumeMappings\": [\n {\n \"hostDestination\": \"/var/dest\",\n \"containerDestination\": \"/var/dest\",\n \"accessMode\": \"rw\"\n }\n ],\n \"ports\": [],\n \"routes\": [],\n \"env\": [\n {\n \"key\": \"KEY1\",\n \"value\": \"{{ env-value-1 }}\"\n },\n {\n \"key\": \"KEY2\",\n \"value\": \"{{ env-value-2 }}\"\n }\n ],\n \"cmd\": [\n \"test\",\n \"--arg1\",\n \"--arg2\"\n ]\n },\n {\n \"name\": \"msvc-2\",\n \"config\": \"string\",\n \"images\": [\n {\n \"containerImage\": \"hello-world\",\n \"fogTypeId\": 1\n },\n {\n \"containerImage\": \"hello-world\",\n \"fogTypeId\": 2\n }\n ],\n \"registryId\": 1,\n \"application\": \"{{application-name-2}}\",\n \"iofogUuid\": \"{{node-id}}\",\n \"rootHostAccess\": true,\n \"logSize\": 0,\n \"volumeMappings\": [\n {\n \"hostDestination\": \"/var/dest\",\n \"containerDestination\": \"/var/dest\",\n \"accessMode\": \"rw\"\n }\n ],\n \"ports\": [],\n \"routes\": [],\n \"env\": [\n {\n \"key\": \"KEY1\",\n \"value\": \"value1\"\n },\n {\n \"key\": \"KEY2\",\n \"value\": \"value2\"\n }\n ],\n \"cmd\": [\n \"test\",\n \"--arg1\",\n \"--arg2\"\n ]\n }\n ],\n \"routes\": [\n {\n \"from\": \"msvc-1\",\n \"to\": \"msvc-2\",\n \"name\": \"m1-2\"\n }\n ]\n }\n}" }, "url": { - "raw": "{{host}}/api/v1/applicationTemplate/{{application-template-name}}", + "raw": "{{host}}/api/v3/applicationTemplate/{{application-template-name}}", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "applicationTemplate", "{{application-template-name}}" ] @@ -3725,13 +3725,13 @@ ] }, "url": { - "raw": "{{host}}/api/v1/applicationTemplate/yaml/{{application-template-from-yaml-name}}", + "raw": "{{host}}/api/v3/applicationTemplate/yaml/{{application-template-from-yaml-name}}", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "applicationTemplate", "yaml", "{{application-template-from-yaml-name}}" @@ -3774,13 +3774,13 @@ "raw": "{\n \"name\": \"application-template-22\",\n \"description\": \"Description\"\n}" }, "url": { - "raw": "{{host}}/api/v1/applicationTemplate/{{application-template-name}}", + "raw": "{{host}}/api/v3/applicationTemplate/{{application-template-name}}", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "applicationTemplate", "{{application-template-name}}" ] @@ -3822,13 +3822,13 @@ "raw": "{\n \"name\": \"application-template-from-yaml-22\",\n \"description\": \"Description\"\n}" }, "url": { - "raw": "{{host}}/api/v1/applicationTemplate/{{application-template-from-yaml-name}}", + "raw": "{{host}}/api/v3/applicationTemplate/{{application-template-from-yaml-name}}", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "applicationTemplate", "{{application-template-from-yaml-name}}" ] @@ -3867,13 +3867,13 @@ } ], "url": { - "raw": "{{host}}/api/v1/applicationTemplates", + "raw": "{{host}}/api/v3/applicationTemplates", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "applicationTemplates" ] } @@ -3920,13 +3920,13 @@ } ], "url": { - "raw": "{{host}}/api/v1/applicationTemplate/{{application-template-from-yaml-name}}", + "raw": "{{host}}/api/v3/applicationTemplate/{{application-template-from-yaml-name}}", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "applicationTemplate", "{{application-template-from-yaml-name}}" ] @@ -3975,13 +3975,13 @@ "raw": "{\n \"name\": \"application-name-2\",\n \"template\": {\n \"name\": \"{{application-template-from-yaml-name}}\",\n \"variables\": [\n {\n \"key\": \"agent-1-name\",\n \"value\": \"string\"\n },\n {\n \"key\": \"env-value-1\",\n \"value\": \"12345\"\n },\n {\n \"key\": \"agent-2-name\",\n \"value\": \"string\"\n }\n ]\n },\n \"isSystem\": false,\n \"isActivated\": true,\n \"description\": \"new application from template\"\n}" }, "url": { - "raw": "{{host}}/api/v1/application", + "raw": "{{host}}/api/v3/application", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "application" ] } @@ -4025,13 +4025,13 @@ } ], "url": { - "raw": "{{host}}/api/v1/application/{{application-name}}", + "raw": "{{host}}/api/v3/application/{{application-name}}", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "application", "{{application-name}}" ] @@ -4053,9 +4053,9 @@ "tests[\"Response validation passed\"] = data.hasOwnProperty('uuid') && data.name;", "", "if (tests[\"Response validation passed\"]) {", - " const env1 = data.env.find(e => e.key === \"KEY1\")", + " const env3 = data.env.find(e => e.key === \"KEY1\")", " const env2 = data.env.find(e => e.key === \"KEY2\")", - " tests[\"Env variable were parsed properly\"] = env1.value === \"12345\" && env2.value === \"test42\";", + " tests[\"Env variable were parsed properly\"] = env3.value === \"12345\" && env2.value === \"test42\";", "}" ], "type": "text/javascript" @@ -4076,13 +4076,13 @@ } ], "url": { - "raw": "{{host}}/api/v1/microservices/{{application-msvc-uuid}}", + "raw": "{{host}}/api/v3/microservices/{{application-msvc-uuid}}", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "microservices", "{{application-msvc-uuid}}" ] @@ -4121,13 +4121,13 @@ "raw": "" }, "url": { - "raw": "{{host}}/api/v1/application/{{application-name}}", + "raw": "{{host}}/api/v3/application/{{application-name}}", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "application", "{{application-name}}" ] @@ -4166,13 +4166,13 @@ "raw": "" }, "url": { - "raw": "{{host}}/api/v1/applicationTemplate/{{application-template-name}}", + "raw": "{{host}}/api/v3/applicationTemplate/{{application-template-name}}", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "applicationTemplate", "{{application-template-name}}" ] @@ -4211,13 +4211,13 @@ "raw": "" }, "url": { - "raw": "{{host}}/api/v1/applicationTemplate/{{application-template-from-yaml-name}}", + "raw": "{{host}}/api/v3/applicationTemplate/{{application-template-from-yaml-name}}", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "applicationTemplate", "{{application-template-from-yaml-name}}" ] @@ -4257,13 +4257,13 @@ "raw": "{\n\t\"type\": 1,\n\t\"key\":\"testtesttest\"\n}" }, "url": { - "raw": "{{host}}/api/v1/iofog/{{system-node-id}}", + "raw": "{{host}}/api/v3/iofog/{{system-node-id}}", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "iofog", "{{system-node-id}}" ] @@ -4303,13 +4303,13 @@ "raw": "" }, "url": { - "raw": "{{host}}/api/v1/iofog/{{node-id}}", + "raw": "{{host}}/api/v3/iofog/{{node-id}}", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "iofog", "{{node-id}}" ] @@ -4347,13 +4347,13 @@ "raw": "" }, "url": { - "raw": "{{host}}/api/v1/user/profile", + "raw": "{{host}}/api/v3/user/profile", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "user", "profile" ] @@ -4417,13 +4417,13 @@ "raw": "{\n \"firstName\": \"John\",\n \"lastName\": \"Doe\",\n \"email\": \"user@domain.com\",\n \"password\": \"#Bugs4Fun\",\n \"subscriptionKey\": \"XXXX-XXXX-XXXX-XXXX\"\n}" }, "url": { - "raw": "{{host}}/api/v1/user/signup", + "raw": "{{host}}/api/v3/user/signup", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "user", "signup" ] @@ -4465,13 +4465,13 @@ "raw": "{\n \"email\": \"user@domain.com\",\n \"password\": \"#Bugs4Fun\"\n}" }, "url": { - "raw": "{{host}}/api/v1/user/login", + "raw": "{{host}}/api/v3/user/login", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "user", "login" ] @@ -4517,13 +4517,13 @@ "raw": "{\n \"name\": \"system node\",\n \"routerMode\": \"interior\",\n \"messagingPort\": 5672,\n \"edgeRouterPort\": 56722,\n \"interRouterPort\": 56721,\n \"host\": \"localhost\",\n \"isSystem\": true,\n \"location\": \"string\",\n \"latitude\": 0,\n \"longitude\": 0,\n \"description\": \"string\",\n \"dockerUrl\": \"string\",\n \"diskLimit\": 0,\n \"diskDirectory\": \"string\",\n \"memoryLimit\": 0,\n \"cpuLimit\": 0,\n \"logLimit\": 0,\n \"logDirectory\": \"string\",\n \"logFileCount\": 0,\n \"statusFrequency\": 0,\n \"changeFrequency\": 0,\n \"deviceScanFrequency\": 0,\n \"bluetoothEnabled\": false,\n \"watchdogEnabled\": true,\n \"abstractedHardwareEnabled\": false,\n \"fogType\": 1\n,\n \"host\": \"1.2.3.4\"\n}" }, "url": { - "raw": "{{host}}/api/v1/iofog", + "raw": "{{host}}/api/v3/iofog", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "iofog" ] } @@ -4568,13 +4568,13 @@ "raw": "{\n \"name\": \"node1\",\n \"location\": \"string\",\n \"latitude\": 0,\n \"longitude\": 0,\n \"description\": \"string\",\n \"dockerUrl\": \"string\",\n \"diskLimit\": 0,\n \"diskDirectory\": \"string\",\n \"memoryLimit\": 0,\n \"cpuLimit\": 0,\n \"logLimit\": 0,\n \"logDirectory\": \"string\",\n \"logFileCount\": 0,\n \"statusFrequency\": 0,\n \"changeFrequency\": 0,\n \"deviceScanFrequency\": 0,\n \"bluetoothEnabled\": false,\n \"watchdogEnabled\": true,\n \"abstractedHardwareEnabled\": false,\n \"fogType\": 1,\n \"host\": \"1.2.3.4\"\n}" }, "url": { - "raw": "{{host}}/api/v1/iofog", + "raw": "{{host}}/api/v3/iofog", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "iofog" ] } @@ -4619,13 +4619,13 @@ "raw": "{\n \"name\": \"node2\",\n \"location\": \"string\",\n \"latitude\": 0,\n \"longitude\": 0,\n \"description\": \"string\",\n \"dockerUrl\": \"string\",\n \"diskLimit\": 0,\n \"diskDirectory\": \"string\",\n \"memoryLimit\": 0,\n \"cpuLimit\": 0,\n \"logLimit\": 0,\n \"logDirectory\": \"string\",\n \"logFileCount\": 0,\n \"statusFrequency\": 0,\n \"changeFrequency\": 0,\n \"deviceScanFrequency\": 0,\n \"bluetoothEnabled\": false,\n \"watchdogEnabled\": true,\n \"abstractedHardwareEnabled\": false,\n \"fogType\": 1,\n \"host\": \"1.2.3.5\"\n}" }, "url": { - "raw": "{{host}}/api/v1/iofog", + "raw": "{{host}}/api/v3/iofog", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "iofog" ] } @@ -4673,13 +4673,13 @@ "raw": "{\n \"name\": \"com.orange.smart-door\",\n \"version\": \"0.0.1\",\n \"description\": \"Orange Smart Door\",\n \"display\": {\n \"name\": \"Smart Door\",\n \"icon\": \"help\",\n \"color\": \"#ff0000\"\n },\n \"interfaceProtocol\": \"https\",\n \"interface\": {\n \"endpoints\": [\n {\n \"name\": \"liveness\",\n \"url\": \"https://localhost:91121\",\n \"method\": \"GET\"\n },\n {\n \"name\": \"version\",\n \"url\": \"https://localhost:91121/version\",\n \"method\": \"GET\"\n }\n ]\n },\n \"orchestrationTags\": [\n \"orange\",\n \"smart-door\"\n ]\n}" }, "url": { - "raw": "{{host}}/api/v1/edgeResource", + "raw": "{{host}}/api/v3/edgeResource", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "edgeResource" ] } @@ -4723,13 +4723,13 @@ "raw": "{\n \"name\": \"application-name-1\",\n \"isSystem\": false,\n \"description\": \"Description\",\n \"isActivated\": true,\n \"microservices\": [\n {\n \"name\": \"redistest\",\n \"config\": \"string\",\n \"images\": [\n {\n \"containerImage\": \"redis\",\n \"fogTypeId\": 1\n },\n {\n \"containerImage\": \"redis\",\n \"fogTypeId\": 2\n }\n ],\n \"registryId\": 1,\n \"application\": \"application-name-1\",\n \"iofogUuid\": \"{{node-id-1}}\",\n \"rootHostAccess\": false,\n \"logSize\": 0,\n \"volumeMappings\": [],\n \"ports\": [\n {\n \"internal\": 6379,\n \"external\": 6379,\n \"publicMode\": false\n }\n ]\n }\n ]\n}" }, "url": { - "raw": "{{host}}/api/v1/application", + "raw": "{{host}}/api/v3/application", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "application" ] } @@ -4776,13 +4776,13 @@ "raw": "{\n \"name\": \"application-msvc-name\",\n \"isSystem\": false,\n \"description\": \"Description\",\n \"isActivated\": true,\n \"microservices\": [\n {\n \"name\": \"msvc-1\",\n \"config\": \"string\",\n \"images\": [\n {\n \"containerImage\": \"hello-world\",\n \"fogTypeId\": 1\n },\n {\n \"containerImage\": \"hello-world\",\n \"fogTypeId\": 2\n }\n ],\n \"registryId\": 1,\n \"application\": \"application-msvc-name\",\n \"iofogUuid\": \"{{node-id-2}}\",\n \"rootHostAccess\": true,\n \"logSize\": 0,\n \"volumeMappings\": [\n {\n \"hostDestination\": \"/var/dest\",\n \"containerDestination\": \"/var/dest\",\n \"accessMode\": \"rw\"\n }\n ],\n \"ports\": [\n {\n \"internal\": 1881,\n \"external\": 1882\n }\n ],\n \"routes\": [],\n \"env\": [\n { \n \"key\": \"selfname\",\n \"value\": \"{{ self.name | upcase }}\"\n },\n {\n \"key\": \"sharedToken\",\n \"value\": \"sekrittoken\"\n },\n {\n \"key\": \"http_proxy\",\n \"value\": \"http://myproxy:8080/\"\n },\n {\n \"key\": \"https_proxy\",\n \"value\": \"{{ self.microservices | where: \\\"name\\\", \\\"msvc-1\\\" | first | map: \\\"env\\\" | first | where: \\\"key\\\" , \\\"http_proxy\\\" | first | map: \\\"value\\\" | first }}\"\n }\n ],\n \"cmd\": [\n \"test\",\n \"--arg1\",\n \"--arg2\"\n ]\n },\n {\n \"name\": \"msvc-2\",\n \"config\": \"string\",\n \"images\": [\n {\n \"containerImage\": \"hello-world\",\n \"fogTypeId\": 1\n },\n {\n \"containerImage\": \"hello-world\",\n \"fogTypeId\": 2\n }\n ],\n \"registryId\": 1,\n \"application\": \"application-msvc-name\",\n \"iofogUuid\": \"{{node-id-2}}\",\n \"rootHostAccess\": true,\n \"logSize\": 0,\n \"volumeMappings\": [\n {\n \"hostDestination\": \"/var/dest\",\n \"containerDestination\": \"/var/dest\",\n \"accessMode\": \"rw\"\n }\n ],\n \"ports\": [],\n \"routes\": [],\n \"env\": [\n { \n \"key\": \"selfname\",\n \"value\": \"{{ self.name | upcase }}\"\n },\n {\n \"key\": \"sharedToken\",\n \"value\": \"{{ self.microservices | where: \\\"name\\\", \\\"msvc-1\\\" | first | map: \\\"env\\\" | first | where: \\\"key\\\", \\\"sharedToken\\\" | first | map: \\\"value\\\" | first }}\"\n },\n {\n \"key\": \"http_proxy\",\n \"value\": \"{{ self.microservices | where: \\\"name\\\", \\\"msvc-1\\\" | first | map: \\\"env\\\" | first | where: \\\"key\\\" , \\\"http_proxy\\\" | first | map: \\\"value\\\" | first }}\"\n },\n {\n \"key\": \"https_proxy\",\n \"value\": \"{{ self.microservices | where: \\\"name\\\", \\\"msvc-1\\\" | first | map: \\\"env\\\" | first | where: \\\"key\\\" , \\\"http_proxy\\\" | first | map: \\\"value\\\" | first }}\"\n },\n {\n \"key\": \"rulesengineHOST\",\n \"value\": \"{% assign curmsvc= self.microservices | where: \\\"name\\\", \\\"msvc-1\\\" | first %}{{ curmsvc | findMicroserviceAgent | map: \\\"host\\\" | first }}\"\n },\n {\n \"key\": \"rulesenginePORT\",\n \"value\": \"{{ self.microservices | where: \\\"name\\\", \\\"msvc-1\\\" | first | map: \\\"ports\\\" | first | map: \\\"external\\\" | first | toString }}\"\n },\n {\n \"key\": \"redisHost\",\n \"value\": \"{% assign redisApp = \\\"application-name-1\\\" | findApplication %}{% assign redismsvc = redisApp.microservices | where: \\\"name\\\", \\\"redistest\\\" | first %}{{ redismsvc | findMicroserviceAgent | map: \\\"host\\\"}}:{{ redismsvc | map: \\\"ports\\\" | first | first | map: \\\"external\\\" | first | toString }}\"\n },\n {\n \"key\": \"edgeResLiveness\",\n \"value\": \"{{ \\\"com.orange.smart-door\\\" | findEdgeResource: \\\"0.0.1\\\" | map: \\\"interface\\\" | map: \\\"endpoints\\\" | first | where: \\\"name\\\", \\\"liveness\\\" | first | map: \\\"url\\\" | first }}\"\n },\n {\n \"key\": \"edgeResVersion\",\n \"value\": \"{{ \\\"com.orange.smart-door\\\" | findEdgeResource | map: \\\"interface\\\" | map: \\\"endpoints\\\" | first | where: \\\"name\\\", \\\"version\\\" | first | map: \\\"url\\\" | first }}\"\n }\n ],\n \"cmd\": [\n \"test\",\n \"--arg1\",\n \"--arg2\"\n ]\n },\n {\n \"name\": \"msvc-3\",\n \"config\": \"string\",\n \"images\": [\n {\n \"containerImage\": \"hello-world\",\n \"fogTypeId\": 1\n },\n {\n \"containerImage\": \"hello-world\",\n \"fogTypeId\": 2\n }\n ],\n \"registryId\": 1,\n \"application\": \"application-msvc-name\",\n \"iofogUuid\": \"{{node-id-2}}\",\n \"rootHostAccess\": true,\n \"logSize\": 0,\n \"volumeMappings\": [\n {\n \"hostDestination\": \"/var/dest\",\n \"containerDestination\": \"/var/dest\",\n \"accessMode\": \"rw\"\n }\n ],\n \"ports\": [],\n \"routes\": [],\n \"env\": [\n {\n \"key\": \"KEY1\",\n \"value\": \"value1\"\n },\n {\n \"key\": \"KEY2\",\n \"value\": \"value2\"\n }\n ],\n \"cmd\": [\n \"test\",\n \"--arg1\",\n \"--arg2\"\n ]\n }\n ],\n \"routes\": [\n {\n \"from\": \"msvc-1\",\n \"to\": \"msvc-2\",\n \"name\": \"m1-2\"\n }\n ]\n}" }, "url": { - "raw": "{{host}}/api/v1/application", + "raw": "{{host}}/api/v3/application", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "application" ] } @@ -4812,8 +4812,8 @@ "", "tests[\"Response returns microservice errorMessage\"] = data.microservices[0].status.hasOwnProperty('errorMessage');", "", - "tests[\"msv1 gets env application name\"]=data.microservices[0].env[0].value === pm.globals.get(\"application-msvc-name\").toUpperCase()", - "tests[\"msv1 sets env value from another\"]=data.microservices[0].env[3].value === data.microservices[0].env[2].value", + "tests[\"msv3 gets env application name\"]=data.microservices[0].env[0].value === pm.globals.get(\"application-msvc-name\").toUpperCase()", + "tests[\"msv3 sets env value from another\"]=data.microservices[0].env[3].value === data.microservices[0].env[2].value", "", "tests[\"msv2 gets env application name\"]=data.microservices[1].env[0].value === pm.globals.get(\"application-msvc-name\").toUpperCase()", "tests[\"msv2 sets env value from env service msvc1\"]=data.microservices[1].env[1].value === data.microservices[0].env[1].value", @@ -4844,13 +4844,13 @@ } ], "url": { - "raw": "{{host}}/api/v1/microservices?application={{application-msvc-name}}", + "raw": "{{host}}/api/v3/microservices?application={{application-msvc-name}}", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "microservices" ], "query": [ @@ -4894,13 +4894,13 @@ } ], "url": { - "raw": "{{host}}/api/v1/application", + "raw": "{{host}}/api/v3/application", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "application" ] } @@ -4938,13 +4938,13 @@ } ], "url": { - "raw": "{{host}}/api/v1/application/{{application-name-2}}", + "raw": "{{host}}/api/v3/application/{{application-name-2}}", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "application", "{{application-name-2}}" ] @@ -4984,13 +4984,13 @@ "raw": "{\n \"name\": \"application-name-22\",\n \"isSystem\": true,\n \"description\": \"Description\",\n \"isActivated\": true\n}" }, "url": { - "raw": "{{host}}/api/v1/application/{{application-name-1}}", + "raw": "{{host}}/api/v3/application/{{application-name-1}}", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "application", "{{application-name-1}}" ] @@ -5029,13 +5029,13 @@ } ], "url": { - "raw": "{{host}}/api/v1/application", + "raw": "{{host}}/api/v3/application", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "application" ] } @@ -5073,13 +5073,13 @@ "raw": "" }, "url": { - "raw": "{{host}}/api/v1/application/{{application-name-1}}", + "raw": "{{host}}/api/v3/application/{{application-name-1}}", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "application", "{{application-name-1}}" ] @@ -5118,13 +5118,13 @@ "raw": "" }, "url": { - "raw": "{{host}}/api/v1/application/{{application-msvc-name}}", + "raw": "{{host}}/api/v3/application/{{application-msvc-name}}", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "application", "{{application-msvc-name}}" ] @@ -5163,13 +5163,13 @@ } ], "url": { - "raw": "{{host}}/api/v1/application", + "raw": "{{host}}/api/v3/application", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "application" ] } @@ -5210,13 +5210,13 @@ } ], "url": { - "raw": "{{host}}/api/v1/microservices", + "raw": "{{host}}/api/v3/microservices", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "microservices" ] } @@ -5250,13 +5250,13 @@ } ], "url": { - "raw": "{{host}}/api/v1/route/{{application-route-name}}", + "raw": "{{host}}/api/v3/route/{{application-route-name}}", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "route", "{{application-route-name}}" ] @@ -5296,13 +5296,13 @@ "raw": "" }, "url": { - "raw": "{{host}}/api/v1/edgeResource/{{edge-resource-name}}/{{edge-resource-version}}", + "raw": "{{host}}/api/v3/edgeResource/{{edge-resource-name}}/{{edge-resource-version}}", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "edgeResource", "{{edge-resource-name}}", "{{edge-resource-version}}" @@ -5343,13 +5343,13 @@ "raw": "{\n\t\"type\": 1,\n\t\"key\":\"testtesttest\"\n}" }, "url": { - "raw": "{{host}}/api/v1/iofog/{{system-node-id}}", + "raw": "{{host}}/api/v3/iofog/{{system-node-id}}", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "iofog", "{{system-node-id}}" ] @@ -5389,13 +5389,13 @@ "raw": "" }, "url": { - "raw": "{{host}}/api/v1/iofog/{{node-id-2}}", + "raw": "{{host}}/api/v3/iofog/{{node-id-2}}", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "iofog", "{{node-id-2}}" ] @@ -5435,13 +5435,13 @@ "raw": "" }, "url": { - "raw": "{{host}}/api/v1/iofog/{{node-id-1}}", + "raw": "{{host}}/api/v3/iofog/{{node-id-1}}", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "iofog", "{{node-id-1}}" ] @@ -5479,13 +5479,13 @@ "raw": "" }, "url": { - "raw": "{{host}}/api/v1/user/profile", + "raw": "{{host}}/api/v3/user/profile", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "user", "profile" ] @@ -5549,13 +5549,13 @@ "raw": "{\n \"firstName\": \"John\",\n \"lastName\": \"Doe\",\n \"email\": \"user@domain.com\",\n \"password\": \"#Bugs4Fun\",\n \"subscriptionKey\": \"XXXX-XXXX-XXXX-XXXX\"\n}" }, "url": { - "raw": "{{host}}/api/v1/user/signup", + "raw": "{{host}}/api/v3/user/signup", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "user", "signup" ] @@ -5597,13 +5597,13 @@ "raw": "{\n \"email\": \"user@domain.com\",\n \"password\": \"#Bugs4Fun\"\n}" }, "url": { - "raw": "{{host}}/api/v1/user/login", + "raw": "{{host}}/api/v3/user/login", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "user", "login" ] @@ -5648,13 +5648,13 @@ "raw": "{\n \"name\": \"flow-name\",\n \"isSystem\": false,\n \"description\": \"Description\",\n \"isActivated\": true\n}" }, "url": { - "raw": "{{host}}/api/v1/flow", + "raw": "{{host}}/api/v3/flow", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "flow" ] } @@ -5692,13 +5692,13 @@ } ], "url": { - "raw": "{{host}}/api/v1/flow", + "raw": "{{host}}/api/v3/flow", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "flow" ] } @@ -5736,13 +5736,13 @@ } ], "url": { - "raw": "{{host}}/api/v1/flow/{{flow-id}}", + "raw": "{{host}}/api/v3/flow/{{flow-id}}", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "flow", "{{flow-id}}" ] @@ -5781,13 +5781,13 @@ "raw": "{\n \"name\": \"flow-name-22\",\n \"isSystem\": true,\n \"description\": \"Description\",\n \"isActivated\": true\n}" }, "url": { - "raw": "{{host}}/api/v1/flow/{{flow-id}}", + "raw": "{{host}}/api/v3/flow/{{flow-id}}", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "flow", "{{flow-id}}" ] @@ -5826,13 +5826,13 @@ } ], "url": { - "raw": "{{host}}/api/v1/flow", + "raw": "{{host}}/api/v3/flow", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "flow" ] } @@ -5870,13 +5870,13 @@ "raw": "" }, "url": { - "raw": "{{host}}/api/v1/flow/{{flow-id}}", + "raw": "{{host}}/api/v3/flow/{{flow-id}}", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "flow", "{{flow-id}}" ] @@ -5914,13 +5914,13 @@ "raw": "" }, "url": { - "raw": "{{host}}/api/v1/user/profile", + "raw": "{{host}}/api/v3/user/profile", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "user", "profile" ] @@ -5984,13 +5984,13 @@ "raw": "{\n \"firstName\": \"John\",\n \"lastName\": \"Doe\",\n \"email\": \"user@domain.com\",\n \"password\": \"#Bugs4Fun\",\n \"subscriptionKey\": \"XXXX-XXXX-XXXX-XXXX\"\n}" }, "url": { - "raw": "{{host}}/api/v1/user/signup", + "raw": "{{host}}/api/v3/user/signup", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "user", "signup" ] @@ -6032,13 +6032,13 @@ "raw": "{\n \"email\": \"user@domain.com\",\n \"password\": \"#Bugs4Fun\"\n}" }, "url": { - "raw": "{{host}}/api/v1/user/login", + "raw": "{{host}}/api/v3/user/login", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "user", "login" ] @@ -6084,13 +6084,13 @@ "raw": "{\n \"name\": \"system node\",\n \"routerMode\": \"interior\",\n \"messagingPort\": 5672,\n \"edgeRouterPort\": 56722,\n \"interRouterPort\": 56721,\n \"host\": \"localhost\",\n \"isSystem\": true,\n \"location\": \"string\",\n \"latitude\": 0,\n \"longitude\": 0,\n \"description\": \"string\",\n \"dockerUrl\": \"string\",\n \"diskLimit\": 0,\n \"diskDirectory\": \"string\",\n \"memoryLimit\": 0,\n \"cpuLimit\": 0,\n \"logLimit\": 0,\n \"logDirectory\": \"string\",\n \"logFileCount\": 0,\n \"statusFrequency\": 0,\n \"changeFrequency\": 0,\n \"deviceScanFrequency\": 0,\n \"bluetoothEnabled\": false,\n \"watchdogEnabled\": true,\n \"abstractedHardwareEnabled\": false,\n \"fogType\": 1\n,\n \"host\": \"1.2.3.4\"\n}" }, "url": { - "raw": "{{host}}/api/v1/iofog", + "raw": "{{host}}/api/v3/iofog", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "iofog" ] } @@ -6135,13 +6135,13 @@ "raw": "{\n \"name\": \"string\",\n \"host\": \"1.2.3.4\",\n \"location\": \"string\",\n \"latitude\": 0,\n \"longitude\": 0,\n \"description\": \"string\",\n \"dockerUrl\": \"string\",\n \"diskLimit\": 0,\n \"diskDirectory\": \"string\",\n \"memoryLimit\": 0,\n \"cpuLimit\": 0,\n \"logLimit\": 0,\n \"logDirectory\": \"string\",\n \"logFileCount\": 0,\n \"statusFrequency\": 0,\n \"changeFrequency\": 0,\n \"deviceScanFrequency\": 0,\n \"bluetoothEnabled\": false,\n \"watchdogEnabled\": true,\n \"abstractedHardwareEnabled\": false,\n \"fogType\": 1\n,\n \"host\": \"1.2.3.4\"\n}" }, "url": { - "raw": "{{host}}/api/v1/iofog", + "raw": "{{host}}/api/v3/iofog", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "iofog" ] } @@ -6186,13 +6186,13 @@ "raw": "{\n \"name\": \"flow-name\",\n \"description\": \"Description\",\n \"isActivated\": true\n}" }, "url": { - "raw": "{{host}}/api/v1/flow", + "raw": "{{host}}/api/v3/flow", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "flow" ] } @@ -6236,13 +6236,13 @@ "raw": "{\n \"name\": \"flow-name-second\",\n \"description\": \"Description\",\n \"isActivated\": true\n}" }, "url": { - "raw": "{{host}}/api/v1/flow", + "raw": "{{host}}/api/v3/flow", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "flow" ] } @@ -6286,13 +6286,13 @@ "raw": "{\n \"name\": \"string\",\n \"description\": \"string\",\n \"category\": \"string\",\n \"images\": [\n {\n \"containerImage\": \"x86 docker image name\",\n \"fogTypeId\": 1\n },\n {\n \"containerImage\": \"ARM docker image name\",\n \"fogTypeId\": 2\n }\n ],\n \"publisher\": \"string\",\n \"diskRequired\": 0,\n \"ramRequired\": 0,\n \"picture\": \"string\",\n \"isPublic\": true,\n \"registryId\": 1,\n \"inputType\": {\n \"infoType\": \"string\",\n \"infoFormat\": \"string\"\n },\n \"outputType\": {\n \"infoType\": \"string\",\n \"infoFormat\": \"string\"\n },\n \"configExample\": \"string\"\n}" }, "url": { - "raw": "{{host}}/api/v1/catalog/microservices", + "raw": "{{host}}/api/v3/catalog/microservices", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "catalog", "microservices" ] @@ -6337,13 +6337,13 @@ "raw": "{\n \"name\": \"name2\",\n \"config\": \"string\",\n \"catalogItemId\": {{item-id}},\n \"flowId\": {{flow-id}},\n \"iofogUuid\": \"{{node-id}}\",\n \"rootHostAccess\": true,\n \"logSize\": 0,\n \"volumeMappings\": [\n {\n \"hostDestination\": \"/var/dest\",\n \"containerDestination\": \"/var/dest\",\n \"accessMode\": \"rw\"\n }\n ],\n \"ports\": [\n {\n \"internal\": 1,\n \"external\": 1,\n \"publicMode\": false\n }\n ],\n \"routes\": [\n ],\n \"env\": [\n {\n \"key\": \"KEY1\",\n \"value\": \"value1\"\n },\n {\n \"key\": \"KEY2\",\n \"value\": \"value2\"\n }\n ],\n \"cmd\": [\n \t\"test\",\n \t\"--arg1\",\n \t\"--arg2\"\n ]\n}\n" }, "url": { - "raw": "{{host}}/api/v1/microservices", + "raw": "{{host}}/api/v3/microservices", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "microservices" ] } @@ -6385,13 +6385,13 @@ "raw": "{\n \"name\": \"namesec\",\n \"config\": \"string\",\n \"images\": [{\"containerImage\": \"hello-world\"\n,\"fogTypeId\": 1}, {\"containerImage\": \"hello-world\"\n,\"fogTypeId\": 2}]\n, \"registryId\": 1,\n \"flowId\": {{flow-id-2}},\n \"iofogUuid\": \"{{node-id}}\",\n \"rootHostAccess\": true,\n \"logSize\": 0,\n \"volumeMappings\": [\n {\n \"hostDestination\": \"/var/dest\",\n \"containerDestination\": \"/var/dest\",\n \"accessMode\": \"rw\"\n }\n ],\n \"ports\": [],\n \"routes\": [\n ],\n \"env\": [\n {\n \"key\": \"KEY1\",\n \"value\": \"value1\"\n },\n {\n \"key\": \"KEY2\",\n \"value\": \"value2\"\n }\n ],\n \"cmd\": [\n \t\"test\",\n \t\"--arg1\",\n \t\"--arg2\"\n ]\n}\n" }, "url": { - "raw": "{{host}}/api/v1/microservices", + "raw": "{{host}}/api/v3/microservices", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "microservices" ] } @@ -6435,13 +6435,13 @@ "raw": "{\n \"name\": \"name-without-catalog\",\n \"config\": \"string\",\n \"images\": [{\"containerImage\": \"hello-world\"\n,\"fogTypeId\": 1}, {\"containerImage\": \"hello-world\"\n,\"fogTypeId\": 2}]\n, \"registryId\": 1,\n \"flowId\": {{flow-id}},\n \"iofogUuid\": \"{{node-id}}\",\n \"rootHostAccess\": true,\n \"logSize\": 0,\n \"volumeMappings\": [\n {\n \"hostDestination\": \"/var/dest\",\n \"containerDestination\": \"/var/dest\",\n \"accessMode\": \"rw\"\n }\n ],\n \"ports\": [\n {\n \"internal\": 2,\n \"external\": 2,\n \"publicMode\": false\n }\n ],\n \"routes\": [\n ],\n \"env\": [\n {\n \"key\": \"KEY1\",\n \"value\": \"value1\"\n },\n {\n \"key\": \"KEY2\",\n \"value\": \"value2\"\n }\n ],\n \"cmd\": [\n \t\"test\",\n \t\"--arg1\",\n \t\"--arg2\"\n ]\n}\n" }, "url": { - "raw": "{{host}}/api/v1/microservices", + "raw": "{{host}}/api/v3/microservices", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "microservices" ] } @@ -6485,13 +6485,13 @@ "raw": "{\n \"name\": \"route-name\",\n \"sourceMicroserviceUuid\": \"{{ms-no-catalog-id}}\",\n \"destMicroserviceUuid\": \"{{ms-id}}\"\n}\n" }, "url": { - "raw": "{{host}}/api/v1/routes", + "raw": "{{host}}/api/v3/routes", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "routes" ] } @@ -6531,13 +6531,13 @@ "raw": "{\n \"name\": \"route-name-updated\",\n \"sourceMicroserviceUuid\": \"{{ms-no-catalog-id}}\",\n \"destMicroserviceUuid\": \"{{ms-id}}\"\n}\n" }, "url": { - "raw": "{{host}}/api/v1/routes/{{flow-name}}/{{route-name}}", + "raw": "{{host}}/api/v3/routes/{{flow-name}}/{{route-name}}", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "routes", "{{flow-name}}", "{{route-name}}" @@ -6577,13 +6577,13 @@ "raw": "" }, "url": { - "raw": "{{host}}/api/v1/routes/{{flow-name}}/{{route-name}}", + "raw": "{{host}}/api/v3/routes/{{flow-name}}/{{route-name}}", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "routes", "{{flow-name}}", "{{route-name}}" @@ -6629,13 +6629,13 @@ } ], "url": { - "raw": "{{host}}/api/v1/microservices", + "raw": "{{host}}/api/v3/microservices", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "microservices" ] } @@ -6683,13 +6683,13 @@ } ], "url": { - "raw": "{{host}}/api/v1/microservices?flowId={{flow-id}}", + "raw": "{{host}}/api/v3/microservices?flowId={{flow-id}}", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "microservices" ], "query": [ @@ -6733,13 +6733,13 @@ } ], "url": { - "raw": "{{host}}/api/v1/microservices/{{ms-id}}", + "raw": "{{host}}/api/v3/microservices/{{ms-id}}", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "microservices", "{{ms-id}}" ] @@ -6778,13 +6778,13 @@ } ], "url": { - "raw": "{{host}}/api/v1/microservices/{{ms-no-catalog-id}}", + "raw": "{{host}}/api/v3/microservices/{{ms-no-catalog-id}}", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "microservices", "{{ms-no-catalog-id}}" ] @@ -6823,13 +6823,13 @@ "raw": "{\n \"name\": \"name3\",\n \"config\": \"string\",\n \"rebuild\": true,\n \"iofogUuid\": \"{{node-id}}\",\n \"rootHostAccess\": true,\n \"logSize\": 0,\n \"volumeMappings\": [\n {\n \"hostDestination\": \"/var/dest\",\n \"containerDestination\": \"/var/dest\",\n \"accessMode\": \"rw\"\n }\n ]\n}" }, "url": { - "raw": "{{host}}/api/v1/microservices/{{ms-id}}", + "raw": "{{host}}/api/v3/microservices/{{ms-id}}", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "microservices", "{{ms-id}}" ] @@ -6868,13 +6868,13 @@ "raw": "{\n \"images\": [\n {\n \"containerImage\": \"hello-world-updated\",\n \"fogTypeId\": 1\n },\n {\n \"containerImage\": \"hello-world-updated\",\n \"fogTypeId\": 2\n }\n ],\n \"registryId\": 2,\n \"config\": \"string\",\n \"rebuild\": true,\n \"iofogUuid\": \"{{node-id}}\",\n \"rootHostAccess\": true,\n \"logSize\": 0,\n \"volumeMappings\": [\n {\n \"hostDestination\": \"/var/dest\",\n \"containerDestination\": \"/var/dest\",\n \"accessMode\": \"rw\"\n }\n ]\n}" }, "url": { - "raw": "{{host}}/api/v1/microservices/{{ms-no-catalog-id}}", + "raw": "{{host}}/api/v3/microservices/{{ms-no-catalog-id}}", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "microservices", "{{ms-no-catalog-id}}" ] @@ -6913,13 +6913,13 @@ } ], "url": { - "raw": "{{host}}/api/v1/microservices/{{ms-no-catalog-id}}", + "raw": "{{host}}/api/v3/microservices/{{ms-no-catalog-id}}", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "microservices", "{{ms-no-catalog-id}}" ] @@ -6958,13 +6958,13 @@ "raw": "{\n \"catalogItemId\": 14,\n \"config\": \"string\",\n \"rebuild\": true,\n \"iofogUuid\": \"{{node-id}}\",\n \"rootHostAccess\": true,\n \"logSize\": 0,\n \"volumeMappings\": [\n {\n \"hostDestination\": \"/var/dest\",\n \"containerDestination\": \"/var/dest\",\n \"accessMode\": \"rw\"\n }\n ]\n}" }, "url": { - "raw": "{{host}}/api/v1/microservices/{{ms-no-catalog-id}}", + "raw": "{{host}}/api/v3/microservices/{{ms-no-catalog-id}}", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "microservices", "{{ms-no-catalog-id}}" ] @@ -7003,13 +7003,13 @@ } ], "url": { - "raw": "{{host}}/api/v1/microservices/{{ms-no-catalog-id}}", + "raw": "{{host}}/api/v3/microservices/{{ms-no-catalog-id}}", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "microservices", "{{ms-no-catalog-id}}" ] @@ -7048,13 +7048,13 @@ "raw": "{\n \"images\": [\n {\n \"containerImage\": \"hello-world-updated\",\n \"fogTypeId\": 1\n },\n {\n \"containerImage\": \"hello-world-updated\",\n \"fogTypeId\": 2\n }\n ],\n \"registryId\": 2,\n \"catalogItemId\": null,\n \"config\": \"string\",\n \"rebuild\": true,\n \"iofogUuid\": \"{{node-id}}\",\n \"rootHostAccess\": true,\n \"logSize\": 0,\n \"volumeMappings\": [\n {\n \"hostDestination\": \"/var/dest\",\n \"containerDestination\": \"/var/dest\",\n \"accessMode\": \"rw\"\n }\n ]\n}" }, "url": { - "raw": "{{host}}/api/v1/microservices/{{ms-no-catalog-id}}", + "raw": "{{host}}/api/v3/microservices/{{ms-no-catalog-id}}", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "microservices", "{{ms-no-catalog-id}}" ] @@ -7093,13 +7093,13 @@ } ], "url": { - "raw": "{{host}}/api/v1/microservices/{{ms-no-catalog-id}}", + "raw": "{{host}}/api/v3/microservices/{{ms-no-catalog-id}}", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "microservices", "{{ms-no-catalog-id}}" ] @@ -7144,13 +7144,13 @@ "raw": "\n{\n\"sourceMicroserviceUuid\": \"{{ms-id}}\",\n \"destMicroserviceUuid\": \"{{ms-id}}\",\n \"name\": \"my-route\"\n}" }, "url": { - "raw": "{{host}}/api/v1/routes", + "raw": "{{host}}/api/v3/routes", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "routes" ] } @@ -7188,13 +7188,13 @@ "raw": "" }, "url": { - "raw": "{{host}}/api/v1/routes/{{flow-name}}/{{route-id}}", + "raw": "{{host}}/api/v3/routes/{{flow-name}}/{{route-id}}", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "routes", "{{flow-name}}", "{{route-id}}" @@ -7234,13 +7234,13 @@ "raw": "{\n \"internal\": 15,\n \"external\": 155,\n \"publicMode\": false\n}" }, "url": { - "raw": "{{host}}/api/v1/microservices/{{ms-id}}/port-mapping", + "raw": "{{host}}/api/v3/microservices/{{ms-id}}/port-mapping", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "microservices", "{{ms-id}}", "port-mapping" @@ -7280,13 +7280,13 @@ } ], "url": { - "raw": "{{host}}/api/v1/microservices/{{ms-id}}/port-mapping", + "raw": "{{host}}/api/v3/microservices/{{ms-id}}/port-mapping", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "microservices", "{{ms-id}}", "port-mapping" @@ -7326,13 +7326,13 @@ "raw": "" }, "url": { - "raw": "{{host}}/api/v1/microservices/{{ms-id}}/port-mapping/15", + "raw": "{{host}}/api/v3/microservices/{{ms-id}}/port-mapping/15", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "microservices", "{{ms-id}}", "port-mapping", @@ -7380,13 +7380,13 @@ "raw": " {\n \"hostDestination\": \"/var/dest7\",\n \"containerDestination\": \"/var/dest\",\n \"accessMode\": \"rw\"\n }" }, "url": { - "raw": "{{host}}/api/v1/microservices/{{ms-id}}/volume-mapping", + "raw": "{{host}}/api/v3/microservices/{{ms-id}}/volume-mapping", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "microservices", "{{ms-id}}", "volume-mapping" @@ -7421,13 +7421,13 @@ } ], "url": { - "raw": "{{host}}/api/v1/microservices/{{ms-id}}/volume-mapping", + "raw": "{{host}}/api/v3/microservices/{{ms-id}}/volume-mapping", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "microservices", "{{ms-id}}", "volume-mapping" @@ -7466,13 +7466,13 @@ "raw": "" }, "url": { - "raw": "{{host}}/api/v1/microservices/{{ms-id}}/volume-mapping/{{volume-id}}", + "raw": "{{host}}/api/v3/microservices/{{ms-id}}/volume-mapping/{{volume-id}}", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "microservices", "{{ms-id}}", "volume-mapping", @@ -7513,13 +7513,13 @@ "raw": "{\n\t\"withCleanup\": false\n}" }, "url": { - "raw": "{{host}}/api/v1/microservices/{{ms-id}}", + "raw": "{{host}}/api/v3/microservices/{{ms-id}}", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "microservices", "{{ms-id}}" ] @@ -7558,13 +7558,13 @@ "raw": "" }, "url": { - "raw": "{{host}}/api/v1/flow/{{flow-id}}", + "raw": "{{host}}/api/v3/flow/{{flow-id}}", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "flow", "{{flow-id}}" ] @@ -7604,13 +7604,13 @@ "raw": "" }, "url": { - "raw": "{{host}}/api/v1/catalog/microservices/{{item-id}}", + "raw": "{{host}}/api/v3/catalog/microservices/{{item-id}}", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "catalog", "microservices", "{{item-id}}" @@ -7651,13 +7651,13 @@ "raw": "{\n\t\"type\": 1,\n\t\"key\":\"testtesttest\"\n}" }, "url": { - "raw": "{{host}}/api/v1/iofog/{{system-node-id}}", + "raw": "{{host}}/api/v3/iofog/{{system-node-id}}", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "iofog", "{{system-node-id}}" ] @@ -7697,13 +7697,13 @@ "raw": "" }, "url": { - "raw": "{{host}}/api/v1/iofog/{{node-id}}", + "raw": "{{host}}/api/v3/iofog/{{node-id}}", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "iofog", "{{node-id}}" ] @@ -7741,13 +7741,13 @@ "raw": "" }, "url": { - "raw": "{{host}}/api/v1/user/profile", + "raw": "{{host}}/api/v3/user/profile", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "user", "profile" ] @@ -7811,13 +7811,13 @@ "raw": "{\n \"firstName\": \"John\",\n \"lastName\": \"Doe\",\n \"email\": \"user@domain.com\",\n \"password\": \"#Bugs4Fun\",\n \"subscriptionKey\": \"XXXX-XXXX-XXXX-XXXX\"\n}" }, "url": { - "raw": "{{host}}/api/v1/user/signup", + "raw": "{{host}}/api/v3/user/signup", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "user", "signup" ] @@ -7859,13 +7859,13 @@ "raw": "{\n \"email\": \"user@domain.com\",\n \"password\": \"#Bugs4Fun\"\n}" }, "url": { - "raw": "{{host}}/api/v1/user/login", + "raw": "{{host}}/api/v3/user/login", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "user", "login" ] @@ -7910,13 +7910,13 @@ "raw": "{\n \"name\": \"string\",\n \"description\": \"string\",\n \"category\": \"string\",\n \"images\": [\n {\n \"containerImage\": \"x86 docker image name\",\n \"fogTypeId\": 1\n },\n {\n \"containerImage\": \"ARM docker image name\",\n \"fogTypeId\": 2\n }\n ],\n \"publisher\": \"string\",\n \"diskRequired\": 0,\n \"ramRequired\": 0,\n \"picture\": \"string\",\n \"isPublic\": true,\n \"registryId\": 1,\n \"inputType\": {\n \"infoType\": \"string\",\n \"infoFormat\": \"string\"\n },\n \"outputType\": {\n \"infoType\": \"string\",\n \"infoFormat\": \"string\"\n },\n \"configExample\": \"string\"\n}" }, "url": { - "raw": "{{host}}/api/v1/catalog/microservices", + "raw": "{{host}}/api/v3/catalog/microservices", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "catalog", "microservices" ] @@ -7955,13 +7955,13 @@ } ], "url": { - "raw": "{{host}}/api/v1/catalog/microservices", + "raw": "{{host}}/api/v3/catalog/microservices", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "catalog", "microservices" ] @@ -8002,13 +8002,13 @@ } ], "url": { - "raw": "{{host}}/api/v1/catalog/microservices/{{item-id}}", + "raw": "{{host}}/api/v3/catalog/microservices/{{item-id}}", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "catalog", "microservices", "{{item-id}}" @@ -8049,13 +8049,13 @@ "raw": "{\n \"name\": \"string\",\n \"description\": \"string\",\n \"category\": \"string\",\n \"images\": [\n {\n \"containerImage\": \"x86 docker image name\",\n \"fogTypeId\": 1\n },\n {\n \"containerImage\": \"ARM docker image name\",\n \"fogTypeId\": 2\n }\n ],\n \"publisher\": \"string\",\n \"diskRequired\": 0,\n \"ramRequired\": 0,\n \"picture\": \"string\",\n \"isPublic\": true,\n \"registryId\": 1,\n \"inputType\": {\n \"infoType\": \"string\",\n \"infoFormat\": \"string\"\n },\n \"outputType\": {\n \"infoType\": \"string\",\n \"infoFormat\": \"string\"\n },\n \"configExample\": \"string\"\n}\n" }, "url": { - "raw": "{{host}}/api/v1/catalog/microservices/{{item-id}}", + "raw": "{{host}}/api/v3/catalog/microservices/{{item-id}}", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "catalog", "microservices", "{{item-id}}" @@ -8096,13 +8096,13 @@ "raw": "" }, "url": { - "raw": "{{host}}/api/v1/catalog/microservices/{{item-id}}", + "raw": "{{host}}/api/v3/catalog/microservices/{{item-id}}", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "catalog", "microservices", "{{item-id}}" @@ -8141,13 +8141,13 @@ "raw": "" }, "url": { - "raw": "{{host}}/api/v1/user/profile", + "raw": "{{host}}/api/v3/user/profile", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "user", "profile" ] @@ -8211,13 +8211,13 @@ "raw": "{\n \"firstName\": \"John\",\n \"lastName\": \"Doe\",\n \"email\": \"user@domain.com\",\n \"password\": \"#Bugs4Fun\",\n \"subscriptionKey\": \"XXXX-XXXX-XXXX-XXXX\"\n}" }, "url": { - "raw": "{{host}}/api/v1/user/signup", + "raw": "{{host}}/api/v3/user/signup", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "user", "signup" ] @@ -8259,13 +8259,13 @@ "raw": "{\n \"email\": \"user@domain.com\",\n \"password\": \"#Bugs4Fun\"\n}" }, "url": { - "raw": "{{host}}/api/v1/user/login", + "raw": "{{host}}/api/v3/user/login", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "user", "login" ] @@ -8311,13 +8311,13 @@ "raw": "{\n \"name\": \"system node\",\n \"routerMode\": \"interior\",\n \"messagingPort\": 5672,\n \"edgeRouterPort\": 56722,\n \"interRouterPort\": 56721,\n \"host\": \"localhost\",\n \"isSystem\": true,\n \"location\": \"string\",\n \"latitude\": 0,\n \"longitude\": 0,\n \"description\": \"string\",\n \"dockerUrl\": \"string\",\n \"diskLimit\": 0,\n \"diskDirectory\": \"string\",\n \"memoryLimit\": 0,\n \"cpuLimit\": 0,\n \"logLimit\": 0,\n \"logDirectory\": \"string\",\n \"logFileCount\": 0,\n \"statusFrequency\": 0,\n \"changeFrequency\": 0,\n \"deviceScanFrequency\": 0,\n \"bluetoothEnabled\": false,\n \"watchdogEnabled\": true,\n \"abstractedHardwareEnabled\": false,\n \"fogType\": 1\n,\n \"host\": \"1.2.3.4\"\n}" }, "url": { - "raw": "{{host}}/api/v1/iofog", + "raw": "{{host}}/api/v3/iofog", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "iofog" ] } @@ -8362,13 +8362,13 @@ "raw": "{\n \"name\": \"string\",\n \"host\": \"1.2.3.4\",\n \"location\": \"string\",\n \"latitude\": 0,\n \"longitude\": 0,\n \"description\": \"string\",\n \"dockerUrl\": \"string\",\n \"diskLimit\": 0,\n \"diskDirectory\": \"string\",\n \"memoryLimit\": 0,\n \"cpuLimit\": 0,\n \"logLimit\": 0,\n \"logDirectory\": \"string\",\n \"logFileCount\": 0,\n \"statusFrequency\": 0,\n \"changeFrequency\": 0,\n \"deviceScanFrequency\": 0,\n \"bluetoothEnabled\": false,\n \"watchdogEnabled\": true,\n \"abstractedHardwareEnabled\": false,\n \"fogType\": 1,\n \"dockerPruningFrequency\": 35,\n \"availableDiskThreshold\": 95,\n \"logLevel\": \"INFO\"\n,\n \"host\": \"1.2.3.4\"\n}" }, "url": { - "raw": "{{host}}/api/v1/iofog", + "raw": "{{host}}/api/v3/iofog", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "iofog" ] } @@ -8406,13 +8406,13 @@ "raw": "{\n \"action\": \"open\"\n}" }, "url": { - "raw": "{{host}}/api/v1/iofog/{{node-id}}/tunnel", + "raw": "{{host}}/api/v3/iofog/{{node-id}}/tunnel", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "iofog", "{{node-id}}", "tunnel" @@ -8448,13 +8448,13 @@ } ], "url": { - "raw": "{{host}}/api/v1/iofog/{{node-id}}/tunnel", + "raw": "{{host}}/api/v3/iofog/{{node-id}}/tunnel", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "iofog", "{{node-id}}", "tunnel" @@ -8494,13 +8494,13 @@ "raw": "{\n \"action\": \"close\"\n}" }, "url": { - "raw": "{{host}}/api/v1/iofog/{{node-id}}/tunnel", + "raw": "{{host}}/api/v3/iofog/{{node-id}}/tunnel", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "iofog", "{{node-id}}", "tunnel" @@ -8541,13 +8541,13 @@ "raw": "{\n\t\"type\": 1,\n\t\"key\":\"testtesttest\"\n}" }, "url": { - "raw": "{{host}}/api/v1/iofog/{{system-node-id}}", + "raw": "{{host}}/api/v3/iofog/{{system-node-id}}", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "iofog", "{{system-node-id}}" ] @@ -8587,13 +8587,13 @@ "raw": "" }, "url": { - "raw": "{{host}}/api/v1/iofog/{{node-id}}", + "raw": "{{host}}/api/v3/iofog/{{node-id}}", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "iofog", "{{node-id}}" ] @@ -8631,13 +8631,13 @@ "raw": "" }, "url": { - "raw": "{{host}}/api/v1/user/profile", + "raw": "{{host}}/api/v3/user/profile", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "user", "profile" ] @@ -8701,13 +8701,13 @@ "raw": "{\n \"firstName\": \"John\",\n \"lastName\": \"Doe\",\n \"email\": \"user@domain.com\",\n \"password\": \"#Bugs4Fun\",\n \"subscriptionKey\": \"XXXX-XXXX-XXXX-XXXX\"\n}" }, "url": { - "raw": "{{host}}/api/v1/user/signup", + "raw": "{{host}}/api/v3/user/signup", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "user", "signup" ] @@ -8749,13 +8749,13 @@ "raw": "{\n \"email\": \"user@domain.com\",\n \"password\": \"#Bugs4Fun\"\n}" }, "url": { - "raw": "{{host}}/api/v1/user/login", + "raw": "{{host}}/api/v3/user/login", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "user", "login" ] @@ -8801,13 +8801,13 @@ "raw": "{\n \"name\": \"system node\",\n \"routerMode\": \"interior\",\n \"messagingPort\": 5672,\n \"edgeRouterPort\": 56722,\n \"interRouterPort\": 56721,\n \"host\": \"localhost\",\n \"isSystem\": true,\n \"location\": \"string\",\n \"latitude\": 0,\n \"longitude\": 0,\n \"description\": \"string\",\n \"dockerUrl\": \"string\",\n \"diskLimit\": 0,\n \"diskDirectory\": \"string\",\n \"memoryLimit\": 0,\n \"cpuLimit\": 0,\n \"logLimit\": 0,\n \"logDirectory\": \"string\",\n \"logFileCount\": 0,\n \"statusFrequency\": 0,\n \"changeFrequency\": 0,\n \"deviceScanFrequency\": 0,\n \"bluetoothEnabled\": false,\n \"watchdogEnabled\": true,\n \"abstractedHardwareEnabled\": false,\n \"fogType\": 1\n,\n \"host\": \"1.2.3.4\"\n}" }, "url": { - "raw": "{{host}}/api/v1/iofog", + "raw": "{{host}}/api/v3/iofog", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "iofog" ] } @@ -8852,13 +8852,13 @@ "raw": "{\n \"name\": \"string\",\n \"host\": \"1.2.3.4\",\n \"location\": \"string\",\n \"latitude\": 0,\n \"longitude\": 0,\n \"description\": \"string\",\n \"dockerUrl\": \"string\",\n \"diskLimit\": 0,\n \"diskDirectory\": \"string\",\n \"memoryLimit\": 0,\n \"cpuLimit\": 0,\n \"logLimit\": 0,\n \"logDirectory\": \"string\",\n \"logFileCount\": 0,\n \"statusFrequency\": 0,\n \"changeFrequency\": 0,\n \"deviceScanFrequency\": 0,\n \"bluetoothEnabled\": false,\n \"watchdogEnabled\": true,\n \"abstractedHardwareEnabled\": false,\n \"fogType\": 1\n,\n \"host\": \"1.2.3.4\"\n}" }, "url": { - "raw": "{{host}}/api/v1/iofog", + "raw": "{{host}}/api/v3/iofog", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "iofog" ] } @@ -8902,13 +8902,13 @@ "raw": "{\n \"name\": \"application-name\",\n \"description\": \"Description\",\n \"isActivated\": true\n}" }, "url": { - "raw": "{{host}}/api/v1/application", + "raw": "{{host}}/api/v3/application", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "application" ] } @@ -8952,13 +8952,13 @@ "raw": "{\n \"name\": \"application-name-second\",\n \"description\": \"Description\",\n \"isActivated\": true\n}" }, "url": { - "raw": "{{host}}/api/v1/application", + "raw": "{{host}}/api/v3/application", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "application" ] } @@ -9002,13 +9002,13 @@ "raw": "{\n \"name\": \"string\",\n \"description\": \"string\",\n \"category\": \"string\",\n \"images\": [\n {\n \"containerImage\": \"x86 docker image name\",\n \"fogTypeId\": 1\n },\n {\n \"containerImage\": \"ARM docker image name\",\n \"fogTypeId\": 2\n }\n ],\n \"publisher\": \"string\",\n \"diskRequired\": 0,\n \"ramRequired\": 0,\n \"picture\": \"string\",\n \"isPublic\": true,\n \"registryId\": 1,\n \"inputType\": {\n \"infoType\": \"string\",\n \"infoFormat\": \"string\"\n },\n \"outputType\": {\n \"infoType\": \"string\",\n \"infoFormat\": \"string\"\n },\n \"configExample\": \"string\"\n}" }, "url": { - "raw": "{{host}}/api/v1/catalog/microservices", + "raw": "{{host}}/api/v3/catalog/microservices", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "catalog", "microservices" ] @@ -9054,13 +9054,13 @@ "raw": "{\n \"name\": \"name2\",\n \"config\": \"string\",\n \"catalogItemId\": {{item-id}},\n \"application\": \"{{application-name}}\",\n \"iofogUuid\": \"{{node-id}}\",\n \"rootHostAccess\": true,\n \"logSize\": 0,\n \"volumeMappings\": [\n {\n \"hostDestination\": \"/var/dest\",\n \"containerDestination\": \"/var/dest\",\n \"accessMode\": \"rw\"\n }\n ],\n \"ports\": [\n {\n \"internal\": 1,\n \"external\": 1,\n \"publicMode\": false\n }\n ],\n \"routes\": [\n ],\n \"env\": [\n {\n \"key\": \"KEY1\",\n \"value\": \"value1\"\n },\n {\n \"key\": \"KEY2\",\n \"value\": \"value2\"\n }\n ],\n \"cmd\": [\n \t\"test\",\n \t\"--arg1\",\n \t\"--arg2\"\n ]\n}\n" }, "url": { - "raw": "{{host}}/api/v1/microservices", + "raw": "{{host}}/api/v3/microservices", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "microservices" ] } @@ -9102,13 +9102,13 @@ "raw": "{\n \"name\": \"namesec\",\n \"config\": \"string\",\n \"images\": [{\"containerImage\": \"hello-world\"\n,\"fogTypeId\": 1}, {\"containerImage\": \"hello-world\"\n,\"fogTypeId\": 2}]\n, \"registryId\": 1,\n \"application\": \"{{application-name-2}}\",\n \"iofogUuid\": \"{{node-id}}\",\n \"rootHostAccess\": true,\n \"logSize\": 0,\n \"volumeMappings\": [\n {\n \"hostDestination\": \"/var/dest\",\n \"containerDestination\": \"/var/dest\",\n \"accessMode\": \"rw\"\n }\n ],\n \"ports\": [],\n \"routes\": [\n ],\n \"env\": [\n {\n \"key\": \"KEY1\",\n \"value\": \"value1\"\n },\n {\n \"key\": \"KEY2\",\n \"value\": \"value2\"\n }\n ],\n \"cmd\": [\n \t\"test\",\n \t\"--arg1\",\n \t\"--arg2\"\n ]\n}\n" }, "url": { - "raw": "{{host}}/api/v1/microservices", + "raw": "{{host}}/api/v3/microservices", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "microservices" ] } @@ -9153,13 +9153,13 @@ "raw": "{\n \"name\": \"name-without-catalog\",\n \"config\": \"string\",\n \"images\": [{\"containerImage\": \"hello-world\"\n,\"fogTypeId\": 1}, {\"containerImage\": \"hello-world\"\n,\"fogTypeId\": 2}]\n, \"registryId\": 1,\n \"application\": \"{{application-name}}\",\n \"iofogUuid\": \"{{node-id}}\",\n \"rootHostAccess\": true,\n \"logSize\": 0,\n \"volumeMappings\": [\n {\n \"hostDestination\": \"/var/dest\",\n \"containerDestination\": \"/var/dest\",\n \"accessMode\": \"rw\"\n }\n ],\n \"ports\": [\n {\n \"internal\": 2,\n \"external\": 2,\n \"publicMode\": false\n }\n ],\n \"routes\": [\n ],\n \"env\": [\n {\n \"key\": \"KEY1\",\n \"value\": \"value1\"\n },\n {\n \"key\": \"KEY2\",\n \"value\": \"value2\"\n }\n ],\n \"cmd\": [\n \t\"test\",\n \t\"--arg1\",\n \t\"--arg2\"\n ]\n}\n" }, "url": { - "raw": "{{host}}/api/v1/microservices", + "raw": "{{host}}/api/v3/microservices", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "microservices" ] } @@ -9203,13 +9203,13 @@ "raw": "{\n \"name\": \"route-name\",\n \"from\": \"{{ms-no-catalog-name}}\",\n \"to\": \"{{ms-name}}\",\n \"application\": \"{{application-name}}\"\n}\n" }, "url": { - "raw": "{{host}}/api/v1/routes", + "raw": "{{host}}/api/v3/routes", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "routes" ] } @@ -9249,13 +9249,13 @@ "raw": "{\n \"name\": \"route-name-updated\",\n \"from\": \"{{ms-no-catalog-name}}\",\n \"to\": \"{{ms-name}}\",\n \"application\": \"{{application-name}}\"\n}\n" }, "url": { - "raw": "{{host}}/api/v1/routes/{{application-name}}/{{route-name}}", + "raw": "{{host}}/api/v3/routes/{{application-name}}/{{route-name}}", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "routes", "{{application-name}}", "{{route-name}}" @@ -9295,13 +9295,13 @@ "raw": "" }, "url": { - "raw": "{{host}}/api/v1/routes/{{application-name}}/{{route-name}}", + "raw": "{{host}}/api/v3/routes/{{application-name}}/{{route-name}}", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "routes", "{{application-name}}", "{{route-name}}" @@ -9347,13 +9347,13 @@ } ], "url": { - "raw": "{{host}}/api/v1/microservices", + "raw": "{{host}}/api/v3/microservices", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "microservices" ] } @@ -9401,13 +9401,13 @@ } ], "url": { - "raw": "{{host}}/api/v1/microservices?application={{application-name}}", + "raw": "{{host}}/api/v3/microservices?application={{application-name}}", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "microservices" ], "query": [ @@ -9451,13 +9451,13 @@ } ], "url": { - "raw": "{{host}}/api/v1/microservices/{{ms-id}}", + "raw": "{{host}}/api/v3/microservices/{{ms-id}}", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "microservices", "{{ms-id}}" ] @@ -9496,13 +9496,13 @@ } ], "url": { - "raw": "{{host}}/api/v1/microservices/{{ms-no-catalog-id}}", + "raw": "{{host}}/api/v3/microservices/{{ms-no-catalog-id}}", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "microservices", "{{ms-no-catalog-id}}" ] @@ -9541,13 +9541,13 @@ "raw": "{\n \"images\": [{\"containerImage\": \"hello-world-updated\"\n,\"fogTypeId\": 1}, {\"containerImage\": \"hello-world-updated\"\n,\"fogTypeId\": 2}]\n, \"registryId\": 2,\n \"config\": \"string\",\n \"rebuild\": true,\n \"iofogUuid\": \"{{node-id}}\",\n \"rootHostAccess\": true,\n \"logSize\": 0,\n \"volumeMappings\": [\n {\n \"hostDestination\": \"/var/dest\",\n \"containerDestination\": \"/var/dest\",\n \"accessMode\": \"rw\"\n }\n ]\n}" }, "url": { - "raw": "{{host}}/api/v1/microservices/{{ms-no-catalog-id}}", + "raw": "{{host}}/api/v3/microservices/{{ms-no-catalog-id}}", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "microservices", "{{ms-no-catalog-id}}" ] @@ -9589,13 +9589,13 @@ "raw": "{\n \"name\": \"name3\",\n \"config\": \"string\",\n \"rebuild\": true,\n \"iofogUuid\": \"{{node-id}}\",\n \"rootHostAccess\": true,\n \"logSize\": 0,\n \"volumeMappings\": [\n {\n \"hostDestination\": \"/var/dest\",\n \"containerDestination\": \"/var/dest\",\n \"accessMode\": \"rw\"\n }\n ]\n}" }, "url": { - "raw": "{{host}}/api/v1/microservices/{{ms-no-catalog-id}}", + "raw": "{{host}}/api/v3/microservices/{{ms-no-catalog-id}}", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "microservices", "{{ms-no-catalog-id}}" ] @@ -9634,13 +9634,13 @@ } ], "url": { - "raw": "{{host}}/api/v1/microservices/{{ms-no-catalog-id}}", + "raw": "{{host}}/api/v3/microservices/{{ms-no-catalog-id}}", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "microservices", "{{ms-no-catalog-id}}" ] @@ -9679,13 +9679,13 @@ "raw": "{\n \"catalogItemId\": 14,\n \"config\": \"string\",\n \"rebuild\": true,\n \"iofogUuid\": \"{{node-id}}\",\n \"rootHostAccess\": true,\n \"logSize\": 0,\n \"volumeMappings\": [\n {\n \"hostDestination\": \"/var/dest\",\n \"containerDestination\": \"/var/dest\",\n \"accessMode\": \"rw\"\n }\n ]\n}" }, "url": { - "raw": "{{host}}/api/v1/microservices/{{ms-no-catalog-id}}", + "raw": "{{host}}/api/v3/microservices/{{ms-no-catalog-id}}", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "microservices", "{{ms-no-catalog-id}}" ] @@ -9724,13 +9724,13 @@ } ], "url": { - "raw": "{{host}}/api/v1/microservices/{{ms-no-catalog-id}}", + "raw": "{{host}}/api/v3/microservices/{{ms-no-catalog-id}}", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "microservices", "{{ms-no-catalog-id}}" ] @@ -9769,13 +9769,13 @@ "raw": "{\n \"images\": [{\"containerImage\": \"hello-world-updated\"\n,\"fogTypeId\": 1}, {\"containerImage\": \"hello-world-updated\"\n,\"fogTypeId\": 2}]\n, \"registryId\": 2,\n \"catalogItemId\": null,\n \"config\": \"string\",\n \"rebuild\": true,\n \"iofogUuid\": \"{{node-id}}\",\n \"rootHostAccess\": true,\n \"logSize\": 0,\n \"volumeMappings\": [\n {\n \"hostDestination\": \"/var/dest\",\n \"containerDestination\": \"/var/dest\",\n \"accessMode\": \"rw\"\n }\n ]\n}" }, "url": { - "raw": "{{host}}/api/v1/microservices/{{ms-no-catalog-id}}", + "raw": "{{host}}/api/v3/microservices/{{ms-no-catalog-id}}", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "microservices", "{{ms-no-catalog-id}}" ] @@ -9814,13 +9814,13 @@ } ], "url": { - "raw": "{{host}}/api/v1/microservices/{{ms-no-catalog-id}}", + "raw": "{{host}}/api/v3/microservices/{{ms-no-catalog-id}}", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "microservices", "{{ms-no-catalog-id}}" ] @@ -9865,13 +9865,13 @@ "raw": "{\n\"from\": \"{{ms-name}}\",\n \"to\": \"{{ms-name}}\",\n \"name\": \"my-route\",\n \"application\": \"{{application-name}}\"\n}" }, "url": { - "raw": "{{host}}/api/v1/routes", + "raw": "{{host}}/api/v3/routes", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "routes" ] } @@ -9909,13 +9909,13 @@ "raw": "" }, "url": { - "raw": "{{host}}/api/v1/routes/{{application-name}}/{{route-id}}", + "raw": "{{host}}/api/v3/routes/{{application-name}}/{{route-id}}", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "routes", "{{application-name}}", "{{route-id}}" @@ -9955,13 +9955,13 @@ "raw": "{\n \"internal\": 15,\n \"external\": 155,\n \"publicMode\": false\n}" }, "url": { - "raw": "{{host}}/api/v1/microservices/{{ms-id}}/port-mapping", + "raw": "{{host}}/api/v3/microservices/{{ms-id}}/port-mapping", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "microservices", "{{ms-id}}", "port-mapping" @@ -10001,13 +10001,13 @@ } ], "url": { - "raw": "{{host}}/api/v1/microservices/{{ms-id}}/port-mapping", + "raw": "{{host}}/api/v3/microservices/{{ms-id}}/port-mapping", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "microservices", "{{ms-id}}", "port-mapping" @@ -10047,13 +10047,13 @@ "raw": "" }, "url": { - "raw": "{{host}}/api/v1/microservices/{{ms-id}}/port-mapping/15", + "raw": "{{host}}/api/v3/microservices/{{ms-id}}/port-mapping/15", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "microservices", "{{ms-id}}", "port-mapping", @@ -10101,13 +10101,13 @@ "raw": " {\n \"hostDestination\": \"/var/dest7\",\n \"containerDestination\": \"/var/dest\",\n \"accessMode\": \"rw\"\n }" }, "url": { - "raw": "{{host}}/api/v1/microservices/{{ms-id}}/volume-mapping", + "raw": "{{host}}/api/v3/microservices/{{ms-id}}/volume-mapping", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "microservices", "{{ms-id}}", "volume-mapping" @@ -10142,13 +10142,13 @@ } ], "url": { - "raw": "{{host}}/api/v1/microservices/{{ms-id}}/volume-mapping", + "raw": "{{host}}/api/v3/microservices/{{ms-id}}/volume-mapping", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "microservices", "{{ms-id}}", "volume-mapping" @@ -10187,13 +10187,13 @@ "raw": "" }, "url": { - "raw": "{{host}}/api/v1/microservices/{{ms-id}}/volume-mapping/{{volume-id}}", + "raw": "{{host}}/api/v3/microservices/{{ms-id}}/volume-mapping/{{volume-id}}", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "microservices", "{{ms-id}}", "volume-mapping", @@ -10234,13 +10234,13 @@ "raw": "{\n\t\"withCleanup\": false\n}" }, "url": { - "raw": "{{host}}/api/v1/microservices/{{ms-id}}", + "raw": "{{host}}/api/v3/microservices/{{ms-id}}", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "microservices", "{{ms-id}}" ] @@ -10279,13 +10279,13 @@ "raw": "" }, "url": { - "raw": "{{host}}/api/v1/application/{{application-name}}", + "raw": "{{host}}/api/v3/application/{{application-name}}", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "application", "{{application-name}}" ] @@ -10325,13 +10325,13 @@ "raw": "" }, "url": { - "raw": "{{host}}/api/v1/catalog/microservices/{{item-id}}", + "raw": "{{host}}/api/v3/catalog/microservices/{{item-id}}", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "catalog", "microservices", "{{item-id}}" @@ -10372,13 +10372,13 @@ "raw": "" }, "url": { - "raw": "{{host}}/api/v1/iofog/{{system-node-id}}", + "raw": "{{host}}/api/v3/iofog/{{system-node-id}}", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "iofog", "{{system-node-id}}" ] @@ -10418,13 +10418,13 @@ "raw": "{\n\t\"type\": 1,\n\t\"key\":\"testtesttest\"\n}" }, "url": { - "raw": "{{host}}/api/v1/iofog/{{node-id}}", + "raw": "{{host}}/api/v3/iofog/{{node-id}}", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "iofog", "{{node-id}}" ] @@ -10462,13 +10462,13 @@ "raw": "" }, "url": { - "raw": "{{host}}/api/v1/user/profile", + "raw": "{{host}}/api/v3/user/profile", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "user", "profile" ] @@ -10532,13 +10532,13 @@ "raw": "{\n \"firstName\": \"John\",\n \"lastName\": \"Doe\",\n \"email\": \"user@domain.com\",\n \"password\": \"#Bugs4Fun\",\n \"subscriptionKey\": \"XXXX-XXXX-XXXX-XXXX\"\n}" }, "url": { - "raw": "{{host}}/api/v1/user/signup", + "raw": "{{host}}/api/v3/user/signup", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "user", "signup" ] @@ -10580,13 +10580,13 @@ "raw": "{\n \"email\": \"user@domain.com\",\n \"password\": \"#Bugs4Fun\"\n}" }, "url": { - "raw": "{{host}}/api/v1/user/login", + "raw": "{{host}}/api/v3/user/login", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "user", "login" ] @@ -10632,13 +10632,13 @@ "raw": "{\n \"name\": \"system node\",\n \"routerMode\": \"interior\",\n \"messagingPort\": 5672,\n \"edgeRouterPort\": 56722,\n \"interRouterPort\": 56721,\n \"host\": \"localhost\",\n \"isSystem\": true,\n \"location\": \"string\",\n \"latitude\": 0,\n \"longitude\": 0,\n \"description\": \"string\",\n \"dockerUrl\": \"string\",\n \"diskLimit\": 0,\n \"diskDirectory\": \"string\",\n \"memoryLimit\": 0,\n \"cpuLimit\": 0,\n \"logLimit\": 0,\n \"logDirectory\": \"string\",\n \"logFileCount\": 0,\n \"statusFrequency\": 0,\n \"changeFrequency\": 0,\n \"deviceScanFrequency\": 0,\n \"bluetoothEnabled\": false,\n \"watchdogEnabled\": true,\n \"abstractedHardwareEnabled\": false,\n \"fogType\": 1\n,\n \"host\": \"1.2.3.4\"\n}" }, "url": { - "raw": "{{host}}/api/v1/iofog", + "raw": "{{host}}/api/v3/iofog", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "iofog" ] } @@ -10683,13 +10683,13 @@ "raw": "{\n \"name\": \"string\",\n \"host\": \"1.2.3.4\",\n \"location\": \"string\",\n \"latitude\": 0,\n \"longitude\": 0,\n \"description\": \"string\",\n \"dockerUrl\": \"string\",\n \"diskLimit\": 0,\n \"diskDirectory\": \"string\",\n \"memoryLimit\": 0,\n \"cpuLimit\": 0,\n \"logLimit\": 0,\n \"logDirectory\": \"string\",\n \"logFileCount\": 0,\n \"statusFrequency\": 0,\n \"changeFrequency\": 0,\n \"deviceScanFrequency\": 0,\n \"bluetoothEnabled\": false,\n \"watchdogEnabled\": true,\n \"abstractedHardwareEnabled\": false,\n \"fogType\": 1\n,\n \"host\": \"1.2.3.4\"\n}" }, "url": { - "raw": "{{host}}/api/v1/iofog", + "raw": "{{host}}/api/v3/iofog", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "iofog" ] } @@ -10733,13 +10733,13 @@ "raw": "{\n \"name\": \"application-name\",\n \"description\": \"Description\",\n \"isActivated\": true\n}" }, "url": { - "raw": "{{host}}/api/v1/application", + "raw": "{{host}}/api/v3/application", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "application" ] } @@ -10783,13 +10783,13 @@ "raw": "{\n \"name\": \"string\",\n \"description\": \"string\",\n \"category\": \"string\",\n \"images\": [\n {\n \"containerImage\": \"x86 docker image name\",\n \"fogTypeId\": 1\n },\n {\n \"containerImage\": \"ARM docker image name\",\n \"fogTypeId\": 2\n }\n ],\n \"publisher\": \"string\",\n \"diskRequired\": 0,\n \"ramRequired\": 0,\n \"picture\": \"string\",\n \"isPublic\": true,\n \"registryId\": 1,\n \"inputType\": {\n \"infoType\": \"string\",\n \"infoFormat\": \"string\"\n },\n \"outputType\": {\n \"infoType\": \"string\",\n \"infoFormat\": \"string\"\n },\n \"configExample\": \"string\"\n}" }, "url": { - "raw": "{{host}}/api/v1/catalog/microservices", + "raw": "{{host}}/api/v3/catalog/microservices", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "catalog", "microservices" ] @@ -10834,13 +10834,13 @@ "raw": "{\n \"name\": \"name2\",\n \"config\": \"string\",\n \"catalogItemId\": {{item-id}},\n \"application\": \"{{application-name}}\",\n \"iofogUuid\": \"{{node-id}}\",\n \"rootHostAccess\": true,\n \"logSize\": 0,\n \"volumeMappings\": [\n {\n \"hostDestination\": \"/var/dest\",\n \"containerDestination\": \"/var/dest\",\n \"accessMode\": \"rw\"\n }\n ],\n \"ports\": [\n {\n \"internal\": 1,\n \"external\": 1,\n \"publicMode\": false\n }\n ],\n \"routes\": [\n ]\n}\n" }, "url": { - "raw": "{{host}}/api/v1/microservices", + "raw": "{{host}}/api/v3/microservices", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "microservices" ] } @@ -10878,13 +10878,13 @@ "raw": "" }, "url": { - "raw": "{{host}}/api/v1/microservices/{{ms-id}}/image-snapshot", + "raw": "{{host}}/api/v3/microservices/{{ms-id}}/image-snapshot", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "microservices", "{{ms-id}}", "image-snapshot" @@ -10924,13 +10924,13 @@ } ], "url": { - "raw": "{{host}}/api/v1/microservices/{{ms-id}}/image-snapshot", + "raw": "{{host}}/api/v3/microservices/{{ms-id}}/image-snapshot", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "microservices", "{{ms-id}}", "image-snapshot" @@ -10970,13 +10970,13 @@ "raw": "{\n \"enable\": true\n}" }, "url": { - "raw": "{{host}}/api/v1/microservices/{{ms-id}}/strace", + "raw": "{{host}}/api/v3/microservices/{{ms-id}}/strace", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "microservices", "{{ms-id}}", "strace" @@ -11016,13 +11016,13 @@ "raw": "{\n \"ftpHost\": \"string\",\n \"ftpPort\": 0,\n \"ftpUser\": \"string\",\n \"ftpPass\": \"string\",\n \"ftpDestDir\": \"string\"\n}" }, "url": { - "raw": "{{host}}/api/v1/microservices/{{ms-id}}/strace", + "raw": "{{host}}/api/v3/microservices/{{ms-id}}/strace", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "microservices", "{{ms-id}}", "strace" @@ -11063,13 +11063,13 @@ } ], "url": { - "raw": "{{host}}/api/v1/microservices/{{ms-id}}/strace?format=string", + "raw": "{{host}}/api/v3/microservices/{{ms-id}}/strace?format=string", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "microservices", "{{ms-id}}", "strace" @@ -11116,13 +11116,13 @@ "raw": "" }, "url": { - "raw": "{{host}}/api/v1/microservices/{{ms-id}}?withCleanUp=true", + "raw": "{{host}}/api/v3/microservices/{{ms-id}}?withCleanUp=true", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "microservices", "{{ms-id}}" ], @@ -11167,13 +11167,13 @@ "raw": "" }, "url": { - "raw": "{{host}}/api/v1/application/{{application-name}}", + "raw": "{{host}}/api/v3/application/{{application-name}}", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "application", "{{application-name}}" ] @@ -11213,13 +11213,13 @@ "raw": "" }, "url": { - "raw": "{{host}}/api/v1/catalog/microservices/{{item-id}}", + "raw": "{{host}}/api/v3/catalog/microservices/{{item-id}}", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "catalog", "microservices", "{{item-id}}" @@ -11260,13 +11260,13 @@ "raw": "{\n\t\"type\": 1,\n\t\"key\":\"testtesttest\"\n}" }, "url": { - "raw": "{{host}}/api/v1/iofog/{{node-id}}", + "raw": "{{host}}/api/v3/iofog/{{node-id}}", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "iofog", "{{node-id}}" ] @@ -11306,13 +11306,13 @@ "raw": "" }, "url": { - "raw": "{{host}}/api/v1/iofog/{{system-node-id}}", + "raw": "{{host}}/api/v3/iofog/{{system-node-id}}", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "iofog", "{{system-node-id}}" ] @@ -11350,13 +11350,13 @@ "raw": "" }, "url": { - "raw": "{{host}}/api/v1/user/profile", + "raw": "{{host}}/api/v3/user/profile", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "user", "profile" ] @@ -11420,13 +11420,13 @@ "raw": "{\n \"firstName\": \"John\",\n \"lastName\": \"Doe\",\n \"email\": \"user@domain.com\",\n \"password\": \"#Bugs4Fun\",\n \"subscriptionKey\": \"XXXX-XXXX-XXXX-XXXX\"\n}" }, "url": { - "raw": "{{host}}/api/v1/user/signup", + "raw": "{{host}}/api/v3/user/signup", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "user", "signup" ] @@ -11468,13 +11468,13 @@ "raw": "{\n \"email\": \"user@domain.com\",\n \"password\": \"#Bugs4Fun\"\n}" }, "url": { - "raw": "{{host}}/api/v1/user/login", + "raw": "{{host}}/api/v3/user/login", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "user", "login" ] @@ -11520,13 +11520,13 @@ "raw": "{\n \"name\": \"system node\",\n \"routerMode\": \"interior\",\n \"messagingPort\": 5672,\n \"edgeRouterPort\": 56722,\n \"interRouterPort\": 56721,\n \"host\": \"localhost\",\n \"isSystem\": true,\n \"location\": \"string\",\n \"latitude\": 0,\n \"longitude\": 0,\n \"description\": \"string\",\n \"dockerUrl\": \"string\",\n \"diskLimit\": 0,\n \"diskDirectory\": \"string\",\n \"memoryLimit\": 0,\n \"cpuLimit\": 0,\n \"logLimit\": 0,\n \"logDirectory\": \"string\",\n \"logFileCount\": 0,\n \"statusFrequency\": 0,\n \"changeFrequency\": 0,\n \"deviceScanFrequency\": 0,\n \"bluetoothEnabled\": false,\n \"watchdogEnabled\": true,\n \"abstractedHardwareEnabled\": false,\n \"fogType\": 1\n,\n \"host\": \"1.2.3.4\"\n}" }, "url": { - "raw": "{{host}}/api/v1/iofog", + "raw": "{{host}}/api/v3/iofog", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "iofog" ] } @@ -11571,13 +11571,13 @@ "raw": "{\n \"name\": \"string\",\n \"host\": \"1.2.3.4\",\n \"location\": \"string\",\n \"latitude\": 0,\n \"longitude\": 0,\n \"description\": \"string\",\n \"dockerUrl\": \"string\",\n \"diskLimit\": 0,\n \"diskDirectory\": \"string\",\n \"memoryLimit\": 0,\n \"cpuLimit\": 0,\n \"logLimit\": 0,\n \"logDirectory\": \"string\",\n \"logFileCount\": 0,\n \"statusFrequency\": 0,\n \"changeFrequency\": 0,\n \"deviceScanFrequency\": 0,\n \"bluetoothEnabled\": false,\n \"watchdogEnabled\": true,\n \"abstractedHardwareEnabled\": false,\n \"fogType\": 1\n,\n \"host\": \"1.2.3.4\"\n}" }, "url": { - "raw": "{{host}}/api/v1/iofog", + "raw": "{{host}}/api/v3/iofog", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "iofog" ] } @@ -11618,13 +11618,13 @@ } ], "url": { - "raw": "{{host}}/api/v1/iofog/{{node-id}}/provisioning-key", + "raw": "{{host}}/api/v3/iofog/{{node-id}}/provisioning-key", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "iofog", "{{node-id}}", "provisioning-key" @@ -11663,13 +11663,13 @@ } ], "url": { - "raw": "{{host}}/api/v1/iofog-list?filters[0][key]=uuid&filters[0][value]={{node-id}}&filters[0][condition]=equals", + "raw": "{{host}}/api/v3/iofog-list?filters[0][key]=uuid&filters[0][value]={{node-id}}&filters[0][condition]=equals", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "iofog-list" ], "query": [ @@ -11721,13 +11721,13 @@ "raw": "{\n \"name\": \"string\",\n \"isSystem\": false,\n \"location\": \"string\",\n \"latitude\": 0,\n \"longitude\": 0,\n \"description\": \"string\",\n \"dockerUrl\": \"string\",\n \"diskLimit\": 0,\n \"diskDirectory\": \"string\",\n \"memoryLimit\": 0,\n \"cpuLimit\": 0,\n \"logLimit\": 0,\n \"logDirectory\": \"string\",\n \"logFileCount\": 0,\n \"statusFrequency\": 0,\n \"changeFrequency\": 0,\n \"deviceScanFrequency\": 0,\n \"bluetoothEnabled\": false,\n \"watchdogEnabled\": true,\n \"abstractedHardwareEnabled\": false,\n \"fogType\": 1\n}" }, "url": { - "raw": "{{host}}/api/v1/iofog/{{node-id}}", + "raw": "{{host}}/api/v3/iofog/{{node-id}}", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "iofog", "{{node-id}}" ] @@ -11765,13 +11765,13 @@ } ], "url": { - "raw": "{{host}}/api/v1/iofog-list?system=true", + "raw": "{{host}}/api/v3/iofog-list?system=true", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "iofog-list" ], "query": [ @@ -11830,13 +11830,13 @@ } ], "url": { - "raw": "{{host}}/api/v1/iofog/{{node-id}}", + "raw": "{{host}}/api/v3/iofog/{{node-id}}", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "iofog", "{{node-id}}" ] @@ -11879,13 +11879,13 @@ "raw": "" }, "url": { - "raw": "{{host}}/api/v1/iofog/{{node-id}}/version/rollback", + "raw": "{{host}}/api/v3/iofog/{{node-id}}/version/rollback", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "iofog", "{{node-id}}", "version", @@ -11927,13 +11927,13 @@ "raw": "" }, "url": { - "raw": "{{host}}/api/v1/iofog/{{node-id}}/version/upgrade", + "raw": "{{host}}/api/v3/iofog/{{node-id}}/version/upgrade", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "iofog", "{{node-id}}", "version", @@ -11975,13 +11975,13 @@ "raw": "" }, "url": { - "raw": "{{host}}/api/v1/iofog/{{node-id}}/reboot", + "raw": "{{host}}/api/v3/iofog/{{node-id}}/reboot", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "iofog", "{{node-id}}", "reboot" @@ -12021,13 +12021,13 @@ "raw": "" }, "url": { - "raw": "{{host}}/api/v1/iofog/{{node-id}}/prune", + "raw": "{{host}}/api/v3/iofog/{{node-id}}/prune", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "iofog", "{{node-id}}", "prune" @@ -12063,13 +12063,13 @@ } ], "url": { - "raw": "{{host}}/api/v1/iofog/{{node-id}}/hal/hw", + "raw": "{{host}}/api/v3/iofog/{{node-id}}/hal/hw", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "iofog", "{{node-id}}", "hal", @@ -12106,13 +12106,13 @@ } ], "url": { - "raw": "{{host}}/api/v1/iofog/{{node-id}}/hal/usb", + "raw": "{{host}}/api/v3/iofog/{{node-id}}/hal/usb", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "iofog", "{{node-id}}", "hal", @@ -12154,13 +12154,13 @@ "raw": "{\n\t\"type\": 1,\n\t\"key\":\"testtesttest\"\n}" }, "url": { - "raw": "{{host}}/api/v1/iofog/{{system-node-id}}", + "raw": "{{host}}/api/v3/iofog/{{system-node-id}}", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "iofog", "{{system-node-id}}" ] @@ -12199,13 +12199,13 @@ "raw": "" }, "url": { - "raw": "{{host}}/api/v1/iofog/{{node-id}}", + "raw": "{{host}}/api/v3/iofog/{{node-id}}", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "iofog", "{{node-id}}" ] @@ -12243,13 +12243,13 @@ } ], "url": { - "raw": "{{host}}/api/v1/iofog-list?filters[0][key]=uuid&filters[0][value]={{node-id}}&filters[0][condition]=equals", + "raw": "{{host}}/api/v3/iofog-list?filters[0][key]=uuid&filters[0][value]={{node-id}}&filters[0][condition]=equals", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "iofog-list" ], "query": [ @@ -12300,13 +12300,13 @@ "raw": "" }, "url": { - "raw": "{{host}}/api/v1/user/profile", + "raw": "{{host}}/api/v3/user/profile", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "user", "profile" ] @@ -12370,13 +12370,13 @@ "raw": "{\n \"firstName\": \"John\",\n \"lastName\": \"Doe\",\n \"email\": \"user@domain.com\",\n \"password\": \"#Bugs4Fun\",\n \"subscriptionKey\": \"XXXX-XXXX-XXXX-XXXX\"\n}" }, "url": { - "raw": "{{host}}/api/v1/user/signup", + "raw": "{{host}}/api/v3/user/signup", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "user", "signup" ] @@ -12418,13 +12418,13 @@ "raw": "{\n \"email\": \"user@domain.com\",\n \"password\": \"#Bugs4Fun\"\n}" }, "url": { - "raw": "{{host}}/api/v1/user/login", + "raw": "{{host}}/api/v3/user/login", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "user", "login" ] @@ -12470,13 +12470,13 @@ "raw": "{\n \"url\": \"string\",\n \"isPublic\": true,\n \"username\": \"string\",\n \"password\": \"string\",\n \"email\": \"test@gmail.com\",\n \"requiresCert\": false,\n \"certificate\": \"string\"\n}" }, "url": { - "raw": "{{host}}/api/v1/registries", + "raw": "{{host}}/api/v3/registries", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "registries" ] } @@ -12514,13 +12514,13 @@ "raw": "{\n \"url\": \"string2\",\n \"isPublic\": true,\n \"username\": \"string3\",\n \"password\": \"string4\",\n \"email\": \"test2@gmail.com\",\n \"requiresCert\": true,\n \"certificate\": \"string6\"\n}" }, "url": { - "raw": "{{host}}/api/v1/registries/{{reg-id}}", + "raw": "{{host}}/api/v3/registries/{{reg-id}}", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "registries", "{{reg-id}}" ] @@ -12559,13 +12559,13 @@ } ], "url": { - "raw": "{{host}}/api/v1/registries", + "raw": "{{host}}/api/v3/registries", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "registries" ] } @@ -12603,13 +12603,13 @@ "raw": "" }, "url": { - "raw": "{{host}}/api/v1/registries/{{reg-id}}", + "raw": "{{host}}/api/v3/registries/{{reg-id}}", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "registries", "{{reg-id}}" ] @@ -12647,13 +12647,13 @@ "raw": "" }, "url": { - "raw": "{{host}}/api/v1/user/profile", + "raw": "{{host}}/api/v3/user/profile", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "user", "profile" ] @@ -12717,13 +12717,13 @@ "raw": "{\n \"firstName\": \"John\",\n \"lastName\": \"Doe\",\n \"email\": \"user@domain.com\",\n \"password\": \"#Bugs4Fun\",\n \"subscriptionKey\": \"XXXX-XXXX-XXXX-XXXX\"\n}" }, "url": { - "raw": "{{host}}/api/v1/user/signup", + "raw": "{{host}}/api/v3/user/signup", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "user", "signup" ] @@ -12765,13 +12765,13 @@ "raw": "{\n \"email\": \"user@domain.com\",\n \"password\": \"#Bugs4Fun\"\n}" }, "url": { - "raw": "{{host}}/api/v1/user/login", + "raw": "{{host}}/api/v3/user/login", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "user", "login" ] @@ -12817,13 +12817,13 @@ "raw": "{\n \"name\": \"system node\",\n \"routerMode\": \"interior\",\n \"messagingPort\": 5672,\n \"edgeRouterPort\": 56722,\n \"interRouterPort\": 56721,\n \"host\": \"localhost\",\n \"isSystem\": true,\n \"location\": \"string\",\n \"latitude\": 0,\n \"longitude\": 0,\n \"description\": \"string\",\n \"dockerUrl\": \"string\",\n \"diskLimit\": 0,\n \"diskDirectory\": \"string\",\n \"memoryLimit\": 0,\n \"cpuLimit\": 0,\n \"logLimit\": 0,\n \"logDirectory\": \"string\",\n \"logFileCount\": 0,\n \"statusFrequency\": 0,\n \"changeFrequency\": 0,\n \"deviceScanFrequency\": 0,\n \"bluetoothEnabled\": false,\n \"watchdogEnabled\": true,\n \"abstractedHardwareEnabled\": false,\n \"fogType\": 1\n,\n \"host\": \"1.2.3.4\"\n}" }, "url": { - "raw": "{{host}}/api/v1/iofog", + "raw": "{{host}}/api/v3/iofog", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "iofog" ] } @@ -12869,13 +12869,13 @@ "raw": "{\n \"name\": \"string\",\n \"host\": \"1.2.3.4\",\n \"location\": \"string\",\n \"latitude\": 0,\n \"longitude\": 0,\n \"description\": \"string\",\n \"dockerUrl\": \"string\",\n \"diskLimit\": 0,\n \"diskDirectory\": \"string\",\n \"memoryLimit\": 0,\n \"cpuLimit\": 0,\n \"logLimit\": 0,\n \"logDirectory\": \"string\",\n \"logFileCount\": 0,\n \"statusFrequency\": 0,\n \"changeFrequency\": 0,\n \"deviceScanFrequency\": 0,\n \"bluetoothEnabled\": false,\n \"watchdogEnabled\": true,\n \"abstractedHardwareEnabled\": false,\n \"fogType\": 1\n,\n \"host\": \"1.2.3.4\"\n}" }, "url": { - "raw": "{{host}}/api/v1/iofog", + "raw": "{{host}}/api/v3/iofog", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "iofog" ] } @@ -12916,13 +12916,13 @@ } ], "url": { - "raw": "{{host}}/api/v1/iofog/{{node-id}}/provisioning-key", + "raw": "{{host}}/api/v3/iofog/{{node-id}}/provisioning-key", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "iofog", "{{node-id}}", "provisioning-key" @@ -12963,13 +12963,13 @@ "raw": "{\n\t\"type\": 1,\n\t\"key\":\"{{provisioning-key}}\"\n}" }, "url": { - "raw": "{{host}}/api/v1/agent/provision", + "raw": "{{host}}/api/v3/agent/provision", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "agent", "provision" ] @@ -13018,13 +13018,13 @@ "raw": "{\n \"name\": \"com.orange.smart-door\",\n \"version\": \"0.0.1\",\n \"description\": \"Orange Smart Door\",\n \"display\": {\n \"name\": \"Smart Door\",\n \"icon\": \"help\",\n \"color\": \"#ff0000\"\n },\n \"interfaceProtocol\": \"https\",\n \"interface\": {\n \"endpoints\": [\n {\n \"name\": \"liveness\",\n \"url\": \"https://localhost:91121\",\n \"method\": \"GET\"\n }\n ]\n },\n \"orchestrationTags\": [\n \"orange\",\n \"smart-door\"\n ]\n}" }, "url": { - "raw": "{{host}}/api/v1/edgeResource", + "raw": "{{host}}/api/v3/edgeResource", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "edgeResource" ] } @@ -13063,13 +13063,13 @@ "raw": "{\n \"name\": \"com.orange.smart-door\",\n \"version\": \"0.0.2\",\n \"description\": \"Orange Smart Door\",\n \"display\": {\n \"name\": \"Smart Door\",\n \"icon\": \"help\",\n \"color\": \"#ff0000\"\n },\n \"interfaceProtocol\": \"https\",\n \"interface\": {\n \"endpoints\": [\n {\n \"name\": \"liveness\",\n \"url\": \"https://localhost:91121\",\n \"method\": \"GET\"\n }\n ]\n }\n}" }, "url": { - "raw": "{{host}}/api/v1/edgeResource/{{edge-resource-name}}/{{edge-resource-version}}", + "raw": "{{host}}/api/v3/edgeResource/{{edge-resource-name}}/{{edge-resource-version}}", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "edgeResource", "{{edge-resource-name}}", "{{edge-resource-version}}" @@ -13113,13 +13113,13 @@ "raw": "{\n \"name\": \"com.orange.smart-door2\",\n \"version\": \"0.0.1\",\n \"description\": \"Orange Smart Door\",\n \"display\": {\n \"name\": \"Smart Door\",\n \"icon\": \"help\",\n \"color\": \"#ff0000\"\n },\n \"interfaceProtocol\": \"https\",\n \"interface\": {\n \"endpoints\": [\n {\n \"name\": \"liveness\",\n \"url\": \"https://localhost:91121\",\n \"method\": \"GET\"\n },\n {\n \"name\": \"version\",\n \"url\": \"https://localhost:91121/version\",\n \"method\": \"GET\"\n }\n ]\n },\n \"orchestrationTags\": [\n \"orange\",\n \"smart-door\",\n \"smart-door-v0.0.1\"\n ]\n}" }, "url": { - "raw": "{{host}}/api/v1/edgeResource/{{edge-resource-name}}/{{edge-resource-version}}", + "raw": "{{host}}/api/v3/edgeResource/{{edge-resource-name}}/{{edge-resource-version}}", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "edgeResource", "{{edge-resource-name}}", "{{edge-resource-version}}" @@ -13164,13 +13164,13 @@ "raw": "{\n \"name\": \"com.orange.smart-door\"\n}" }, "url": { - "raw": "{{host}}/api/v1/edgeResource/{{edge-resource-name}}/{{edge-resource-version}}", + "raw": "{{host}}/api/v3/edgeResource/{{edge-resource-name}}/{{edge-resource-version}}", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "edgeResource", "{{edge-resource-name}}", "{{edge-resource-version}}" @@ -13209,13 +13209,13 @@ } ], "url": { - "raw": "{{host}}/api/v1/edgeResource/{{edge-resource-name}}/{{edge-resource-version}}", + "raw": "{{host}}/api/v3/edgeResource/{{edge-resource-name}}/{{edge-resource-version}}", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "edgeResource", "{{edge-resource-name}}", "{{edge-resource-version}}" @@ -13256,13 +13256,13 @@ "raw": "{\n \"uuid\": \"{{node-id}}\"\n}" }, "url": { - "raw": "{{host}}/api/v1/edgeResource/{{edge-resource-name}}/{{edge-resource-version}}/link", + "raw": "{{host}}/api/v3/edgeResource/{{edge-resource-name}}/{{edge-resource-version}}/link", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "edgeResource", "{{edge-resource-name}}", "{{edge-resource-version}}", @@ -13303,13 +13303,13 @@ } ], "url": { - "raw": "{{host}}/api/v1/agent/config/changes", + "raw": "{{host}}/api/v3/agent/config/changes", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "agent", "config", "changes" @@ -13356,13 +13356,13 @@ } ], "url": { - "raw": "{{host}}/api/v1/agent/edgeResources", + "raw": "{{host}}/api/v3/agent/edgeResources", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "agent", "edgeResources" ] @@ -13405,13 +13405,13 @@ } ], "url": { - "raw": "{{host}}/api/v1/iofog/{{node-id}}", + "raw": "{{host}}/api/v3/iofog/{{node-id}}", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "iofog", "{{node-id}}" ] @@ -13451,13 +13451,13 @@ "raw": "{\n \"uuid\": \"{{node-id}}\"\n}" }, "url": { - "raw": "{{host}}/api/v1/edgeResource/{{edge-resource-name}}/{{edge-resource-version}}/link", + "raw": "{{host}}/api/v3/edgeResource/{{edge-resource-name}}/{{edge-resource-version}}/link", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "edgeResource", "{{edge-resource-name}}", "{{edge-resource-version}}", @@ -13496,13 +13496,13 @@ } ], "url": { - "raw": "{{host}}/api/v1/iofog/{{node-id}}", + "raw": "{{host}}/api/v3/iofog/{{node-id}}", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "iofog", "{{node-id}}" ] @@ -13551,13 +13551,13 @@ "raw": "{\n \"name\": \"com.orange.smart-door\",\n \"version\": \"0.0.2\",\n \"description\": \"Orange Smart Door\",\n \"display\": {\n \"name\": \"Smart Door\",\n \"icon\": \"help\",\n \"color\": \"#ff0000\"\n },\n \"interfaceProtocol\": \"https\",\n \"interface\": {\n \"endpoints\": [\n {\n \"name\": \"liveness\",\n \"url\": \"https://localhost:91121\",\n \"method\": \"GET\"\n }\n ]\n }\n}" }, "url": { - "raw": "{{host}}/api/v1/edgeResource", + "raw": "{{host}}/api/v3/edgeResource", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "edgeResource" ] } @@ -13591,13 +13591,13 @@ } ], "url": { - "raw": "{{host}}/api/v1/edgeResources", + "raw": "{{host}}/api/v3/edgeResources", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "edgeResources" ] } @@ -13638,13 +13638,13 @@ } ], "url": { - "raw": "{{host}}/api/v1/edgeResource/{{edge-resource-name}}?=", + "raw": "{{host}}/api/v3/edgeResource/{{edge-resource-name}}?=", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "edgeResource", "{{edge-resource-name}}" ], @@ -13690,13 +13690,13 @@ "raw": "" }, "url": { - "raw": "{{host}}/api/v1/edgeResource/{{edge-resource-name}}/{{edge-resource-version-2}}", + "raw": "{{host}}/api/v3/edgeResource/{{edge-resource-name}}/{{edge-resource-version-2}}", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "edgeResource", "{{edge-resource-name}}", "{{edge-resource-version-2}}" @@ -13737,13 +13737,13 @@ "raw": "" }, "url": { - "raw": "{{host}}/api/v1/edgeResource/{{edge-resource-name}}/{{edge-resource-version}}", + "raw": "{{host}}/api/v3/edgeResource/{{edge-resource-name}}/{{edge-resource-version}}", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "edgeResource", "{{edge-resource-name}}", "{{edge-resource-version}}" @@ -13784,13 +13784,13 @@ "raw": "{\n\t\"type\": 1,\n\t\"key\":\"testtesttest\"\n}" }, "url": { - "raw": "{{host}}/api/v1/iofog/{{system-node-id}}", + "raw": "{{host}}/api/v3/iofog/{{system-node-id}}", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "iofog", "{{system-node-id}}" ] @@ -13829,13 +13829,13 @@ "raw": "" }, "url": { - "raw": "{{host}}/api/v1/iofog/{{node-id}}", + "raw": "{{host}}/api/v3/iofog/{{node-id}}", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "iofog", "{{node-id}}" ] @@ -13873,13 +13873,13 @@ "raw": "" }, "url": { - "raw": "{{host}}/api/v1/user/profile", + "raw": "{{host}}/api/v3/user/profile", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "user", "profile" ] @@ -13909,13 +13909,13 @@ "method": "HEAD", "header": [], "url": { - "raw": "{{host}}/api/v1/capabilities/edgeResources", + "raw": "{{host}}/api/v3/capabilities/edgeResources", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "capabilities", "edgeResources" ] @@ -13940,13 +13940,13 @@ "method": "HEAD", "header": [], "url": { - "raw": "{{host}}/api/v1/capabilities/applicationTemplates", + "raw": "{{host}}/api/v3/capabilities/applicationTemplates", "host": [ "{{host}}" ], "path": [ "api", - "v1", + "v3", "capabilities", "applicationTemplates" ] diff --git a/test/src/template/app.yml b/test/src/template/app.yml index 14d3fd98f..756d62eeb 100755 --- a/test/src/template/app.yml +++ b/test/src/template/app.yml @@ -1,6 +1,6 @@ --- -apiVersion: datasance.com/v1 +apiVersion: datasance.com/v3 kind: Application metadata: name: edai-smartbuilding-rules-engine diff --git a/test/src/template/simple.yml b/test/src/template/simple.yml index c009aab6f..a271b3855 100755 --- a/test/src/template/simple.yml +++ b/test/src/template/simple.yml @@ -1,6 +1,6 @@ --- -apiVersion: datasance.com/v1 +apiVersion: datasance.com/v3 kind: Application metadata: name: edai-smartbuilding-rules-engine From 7b5848073489e9240fbbf18923356e0c5f199b3a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emirhan=20Durmu=C5=9F?= Date: Fri, 8 Nov 2024 22:01:13 +0300 Subject: [PATCH 128/178] docker base image updated ubi with nonroot user, old version codebase cleaned --- .github/workflows/ci.yaml | 2 +- Dockerfile | 60 +++++ logrotate.conf | 4 +- package-lock.json | 4 +- package.json | 2 +- src/config/constants.js | 4 +- src/config/default.json | 12 +- src/config/development.json | 4 +- src/config/production.json | 4 +- src/data/constants.js | 3 +- .../managers/microservice-port-manager.js | 16 -- .../microservice-proxy-port-manager.js | 25 -- .../microservice-public-mode-manager.js | 25 -- src/data/models/microserviceProxyPort.js | 70 ------ src/data/models/microserviceport.js | 5 - src/data/models/microservicepublicmode.js | 54 ----- src/helpers/proxy-broker-client.js | 49 ---- src/services/catalog-service.js | 12 +- src/services/microservice-ports/default.js | 14 +- src/services/microservice-ports/factory.js | 22 -- src/services/microservice-ports/proxy.js | 220 ------------------ src/services/microservices-service.js | 2 +- .../services/microservices-service.test.js | 3 - 23 files changed, 80 insertions(+), 536 deletions(-) create mode 100644 Dockerfile delete mode 100644 src/data/managers/microservice-proxy-port-manager.js delete mode 100644 src/data/managers/microservice-public-mode-manager.js delete mode 100644 src/data/models/microserviceProxyPort.js delete mode 100644 src/data/models/microservicepublicmode.js delete mode 100644 src/helpers/proxy-broker-client.js delete mode 100644 src/services/microservice-ports/factory.js delete mode 100644 src/services/microservice-ports/proxy.js diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 63cb78bc6..710d3c332 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -142,7 +142,7 @@ jobs: uses: docker/build-push-action@v3 id: build_push_ghcr with: - file: Dockerfile.dev + file: Dockerfile context: . platforms: linux/amd64, linux/arm64 push: true diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 000000000..45aab3472 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,60 @@ +FROM node:iron-bookworm AS builder + +ARG PKG_VERSION +ARG GITHUB_TOKEN + +WORKDIR /tmp + +RUN npm i -g npm + +COPY package.json . + +COPY . . + +# Set GitHub npm registry with authentication token +RUN sed -i.back "s|PAT|${GITHUB_TOKEN}|g" .npmrc + +RUN npm config set @datasance:registry https://npm.pkg.github.com/ + +RUN npm i --build-from-source --force + +RUN npm version $PKG_VERSION --allow-same-version --no-git-tag-version + +RUN npm pack + +FROM registry.access.redhat.com/ubi9/nodejs-20-minimal:1-63.1726695170 + +USER root +# Install dependencies for logging and development +RUN microdnf install -y logrotate g++ make && microdnf clean all + +COPY logrotate.conf /etc/logrotate.conf + +# Install Python and pip +RUN microdnf install -y python3 && \ + ln -sf python3 /usr/bin/python && \ + python3 -m ensurepip && \ + pip3 install --no-cache --upgrade pip setuptools && \ + microdnf install shadow-utils && \ + microdnf clean all +RUN useradd --uid 10000 --create-home runner +USER 10000 +WORKDIR /home/runner + +ENV NPM_CONFIG_PREFIX=/home/runner/.npm-global +ENV NPM_CONFIG_CACHE=/home/runner/.npm +ENV PATH=$PATH:/home/runner/.npm-global/bin + +COPY --from=builder /tmp/datasance-iofogcontroller-*.tgz /home/runner/iofog-controller.tgz + +ENV PID_BASE=/home/runner + +RUN npm i -g /home/runner/iofog-controller.tgz && \ + rm -rf /home/runner/iofog-controller.tgz && \ + iofog-controller config dev-mode --on + +COPY LICENSE /licenses/LICENSE +LABEL org.opencontainers.image.description=controller +LABEL org.opencontainers.image.source=https://github.com/datasance/controller +LABEL org.opencontainers.image.licenses=EPL2.0 +CMD [ "node", "/home/runner/.npm-global/lib/node_modules/@datasance/iofogcontroller/src/server.js" ] diff --git a/logrotate.conf b/logrotate.conf index 219c0f9ba..bab19729b 100644 --- a/logrotate.conf +++ b/logrotate.conf @@ -1,10 +1,10 @@ -/var/log/iofog-controller/iofog-controller.log { +${PID_BASE}/iofog-controller.log { rotate 10 size 10m compress notifempty missingok postrotate - kill -HUP `cat /usr/local/lib/node_modules/@datasance/iofogcontroller/src/iofog-controller.pid` + kill -HUP `cat ${PID_BASE}/iofog-controller.pid` endscript } diff --git a/package-lock.json b/package-lock.json index 56497bb73..88bc355c4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@datasance/iofogcontroller", - "version": "3.4.1", + "version": "3.4.2", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@datasance/iofogcontroller", - "version": "3.4.1", + "version": "3.4.2", "hasInstallScript": true, "license": "EPL-2.0", "dependencies": { diff --git a/package.json b/package.json index 9c65f83cc..9ad9435af 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@datasance/iofogcontroller", - "version": "3.4.1", + "version": "3.4.2", "description": "ioFog Controller project for Eclipse IoFog @ iofog.org \\nCopyright (c) 2023 Datasance Teknoloji A.S.", "main": "./src/main.js", "author": "Emirhan Durmus", diff --git a/src/config/constants.js b/src/config/constants.js index 0d3d3ae8c..81d99eaa3 100644 --- a/src/config/constants.js +++ b/src/config/constants.js @@ -13,12 +13,12 @@ module.exports = { 'App:Name': 'iofog-controller', - 'Viewer:Port': 80, + 'Viewer:Port': 8008, 'Server:Port': 51121, 'Server:DevMode': false, - 'Service:LogsDirectory': '/var/log/iofog-controller', + 'Service:LogsDirectory': process.env.PID_BASE ? `${process.env.PID_BASE}/iofog-controller` : '/var/log/iofog-controller', 'Service:LogsFileSize': 10485760, 'Service:LogsFileCount': 10, diff --git a/src/config/default.json b/src/config/default.json index e76bd75b4..92898aa60 100644 --- a/src/config/default.json +++ b/src/config/default.json @@ -3,14 +3,14 @@ "Name": "iofog-controller" }, "Viewer": { - "Port": 80 + "Port": 8008 }, "Server": { "Port": 51121, "DevMode": false }, "Service": { - "LogsDirectory": "/var/log/iofog-controller", + "LogsDirectory": "${PID_BASE}/iofog-controller", "LogsFileSize": 10485760, "LogsFileCount": 10 }, @@ -24,9 +24,7 @@ "DiagnosticDir": "diagnostic" }, "PublicPorts": { - "Range": "6001-7999", - "ProxyBrokerUrl": "http://localhost:3000", - "ProxyBrokerToken": "" + "Range": "6001-7999" }, "SystemImages": { "Router": { @@ -36,10 +34,6 @@ "Proxy": { "1": "ghcr.io/datasance/proxy:latest", "2": "ghcr.io/datasance/proxy:latest" - }, - "PortRouter": { - "1": "iofog/port-router:latest", - "2": "iofog/port-router:latest" } } } diff --git a/src/config/development.json b/src/config/development.json index bef344843..ea43d5a4a 100644 --- a/src/config/development.json +++ b/src/config/development.json @@ -3,14 +3,14 @@ "Name": "iofog-controller-dev" }, "Viewer": { - "Port": 80 + "Port": 8008 }, "Server": { "Port": 51121, "DevMode": true }, "Service": { - "LogsDirectory": "/var/log/iofog-controller", + "LogsDirectory": "${PID_BASE}/iofog-controller", "LogsFileSize": 10485760, "LogsFileCount": 10 }, diff --git a/src/config/production.json b/src/config/production.json index 7c31289e8..8437d00d4 100644 --- a/src/config/production.json +++ b/src/config/production.json @@ -3,14 +3,14 @@ "Name": "iofog-controller" }, "Viewer": { - "Port": 80 + "Port": 8008 }, "Server": { "Port": 51121, "DevMode": true }, "Service": { - "LogsDirectory": "/var/log/iofog-controller", + "LogsDirectory": "${PID_BASE}/iofog-controller", "LogsFileSize": 10485760, "LogsFileCount": 10 }, diff --git a/src/data/constants.js b/src/data/constants.js index 83c9b7af6..3ba4ae4fa 100644 --- a/src/data/constants.js +++ b/src/data/constants.js @@ -1,5 +1,4 @@ module.exports = { ROUTER_CATALOG_NAME: 'Router', - PROXY_CATALOG_NAME: 'Proxy', - PORT_ROUTER_CATALOG_NAME: 'PortRouter' + PROXY_CATALOG_NAME: 'Proxy' } diff --git a/src/data/managers/microservice-port-manager.js b/src/data/managers/microservice-port-manager.js index d4764b6b4..deedb758d 100644 --- a/src/data/managers/microservice-port-manager.js +++ b/src/data/managers/microservice-port-manager.js @@ -15,7 +15,6 @@ const BaseManager = require('./base-manager') const models = require('../models') const MicroservicePort = models.MicroservicePort const MicroservicePublicPort = models.MicroservicePublicPort -const MicroserviceProxyPort = models.MicroserviceProxyPort class MicroservicePortManager extends BaseManager { getEntity () { @@ -36,21 +35,6 @@ class MicroservicePortManager extends BaseManager { attributes: ['microserviceUuid'] }, { transaction: transaction }) } - - findAllProxyPorts (transaction) { - return MicroservicePort.findAll({ - include: [ - { - model: MicroserviceProxyPort, - as: 'proxyPort', - required: true, - attributes: ['publicPort', 'protocol', 'host'] - } - ], - where: { isProxy: true }, - attributes: ['microserviceUuid'] - }, { transaction: transaction }) - } } const instance = new MicroservicePortManager() diff --git a/src/data/managers/microservice-proxy-port-manager.js b/src/data/managers/microservice-proxy-port-manager.js deleted file mode 100644 index 2d3c05b0f..000000000 --- a/src/data/managers/microservice-proxy-port-manager.js +++ /dev/null @@ -1,25 +0,0 @@ -/* - * ******************************************************************************* - * * Copyright (c) 2023 Datasance Teknoloji A.S. - * * - * * This program and the accompanying materials are made available under the - * * terms of the Eclipse Public License v. 2.0 which is available at - * * http://www.eclipse.org/legal/epl-2.0 - * * - * * SPDX-License-Identifier: EPL-2.0 - * ******************************************************************************* - * - */ - -const BaseManager = require('./base-manager') -const models = require('../models') -const MicroserviceProxyPort = models.MicroserviceProxyPort - -class MicroserviceProxyPortManager extends BaseManager { - getEntity () { - return MicroserviceProxyPort - } -} - -const instance = new MicroserviceProxyPortManager() -module.exports = instance diff --git a/src/data/managers/microservice-public-mode-manager.js b/src/data/managers/microservice-public-mode-manager.js deleted file mode 100644 index 8990f042a..000000000 --- a/src/data/managers/microservice-public-mode-manager.js +++ /dev/null @@ -1,25 +0,0 @@ -/* - * ******************************************************************************* - * * Copyright (c) 2023 Datasance Teknoloji A.S. - * * - * * This program and the accompanying materials are made available under the - * * terms of the Eclipse Public License v. 2.0 which is available at - * * http://www.eclipse.org/legal/epl-2.0 - * * - * * SPDX-License-Identifier: EPL-2.0 - * ******************************************************************************* - * - */ - -const BaseManager = require('./base-manager') -const models = require('../models') -const MicroservicePublicMode = models.MicroservicePublicMode - -class MicroservicePublicModeManager extends BaseManager { - getEntity () { - return MicroservicePublicMode - } -} - -const instance = new MicroservicePublicModeManager() -module.exports = instance diff --git a/src/data/models/microserviceProxyPort.js b/src/data/models/microserviceProxyPort.js deleted file mode 100644 index 2bf9e8345..000000000 --- a/src/data/models/microserviceProxyPort.js +++ /dev/null @@ -1,70 +0,0 @@ -'use strict' - -module.exports = (sequelize, DataTypes) => { - const MicroserviceProxyPort = sequelize.define('MicroserviceProxyPort', { - id: { - type: DataTypes.INTEGER, - primaryKey: true, - autoIncrement: true, - allowNull: false, - field: 'id' - }, - portId: { - type: DataTypes.INTEGER, - field: 'port_id' - }, - host: { - type: DataTypes.TEXT, - field: 'host' - }, - localProxyId: { - type: DataTypes.TEXT, - field: 'local_proxy_id' - }, - publicPort: { - type: DataTypes.INTEGER, - field: 'public_port' - }, - adminPort: { - type: DataTypes.INTEGER, - field: 'admin_port' - }, - protocol: { - type: DataTypes.TEXT, - field: 'protocol' - }, - proxyToken: { - type: DataTypes.TEXT, - field: 'proxy_token' - }, - portUUID: { - type: DataTypes.TEXT, - field: 'port_uuid' - }, - serverToken: { - type: DataTypes.TEXT, - field: 'server_token' - } - }, { - tableName: 'MicroserviceProxyPorts', - timestamps: true, - underscored: true - }) - MicroserviceProxyPort.associate = function (models) { - MicroserviceProxyPort.belongsTo(models.MicroservicePort, { - foreignKey: { - name: 'portId', - field: 'port_id' - }, - as: 'port', - onDelete: 'cascade' - }) - - MicroserviceProxyPort.hasOne(models.Microservice, { - foreignKey: 'uuid', - as: 'localProxy' - }) - } - - return MicroserviceProxyPort -} diff --git a/src/data/models/microserviceport.js b/src/data/models/microserviceport.js index 405532fed..a6cee0b28 100644 --- a/src/data/models/microserviceport.js +++ b/src/data/models/microserviceport.js @@ -47,11 +47,6 @@ module.exports = (sequelize, DataTypes) => { foreignKey: 'port_id', as: 'publicPort' }) - - MicroservicePort.hasOne(models.MicroserviceProxyPort, { - foreignKey: 'port_id', - as: 'proxyPort' - }) } return MicroservicePort } diff --git a/src/data/models/microservicepublicmode.js b/src/data/models/microservicepublicmode.js deleted file mode 100644 index 0fe2daee1..000000000 --- a/src/data/models/microservicepublicmode.js +++ /dev/null @@ -1,54 +0,0 @@ -'use strict' -module.exports = (sequelize, DataTypes) => { - const MicroservicePublicMode = sequelize.define('MicroservicePublicMode', { - id: { - type: DataTypes.INTEGER, - primaryKey: true, - autoIncrement: true, - allowNull: false, - field: 'id' - } - }, { - tableName: 'MicroservicePublicModes', - timestamps: false, - underscored: true - }) - MicroservicePublicMode.associate = function (models) { - MicroservicePublicMode.belongsTo(models.Microservice, { - foreignKey: { - name: 'microserviceUuid', - field: 'microservice_uuid' - }, - as: 'microservice', - onDelete: 'cascade' - }) - - MicroservicePublicMode.belongsTo(models.Microservice, { - foreignKey: { - name: 'networkMicroserviceUuid', - field: 'network_microservice_uuid' - }, - as: 'networkMicroservice', - onDelete: 'set null' - }) - - MicroservicePublicMode.belongsTo(models.Fog, { - foreignKey: { - name: 'iofogUuid', - field: 'iofog_uuid' - }, - as: 'iofog', - onDelete: 'set null' - }) - - MicroservicePublicMode.belongsTo(models.MicroservicePort, { - foreignKey: { - name: 'microservicePortId', - field: 'microservice_port_id' - }, - as: 'microservicePort', - onDelete: 'set null' - }) - } - return MicroservicePublicMode -} diff --git a/src/helpers/proxy-broker-client.js b/src/helpers/proxy-broker-client.js deleted file mode 100644 index 053837489..000000000 --- a/src/helpers/proxy-broker-client.js +++ /dev/null @@ -1,49 +0,0 @@ -const axios = require('axios') - -const controllerConfig = require('../config') - -const brokerUrl = process.env.PROXY_BROKER_URL || controllerConfig.get('PublicPorts:ProxyBrokerUrl', '') -const brokerToken = process.env.PROXY_BROKER_TOKEN || controllerConfig.get('PublicPorts:ProxyBrokerToken', '') - -function allocatePort (serverToken) { - var options = { - method: 'POST', - url: `${brokerUrl}/port`, - headers: { 'X-Api-Key': brokerToken }, - data: { token: serverToken } - } - - return axios(options) - .then(response => { - return response.data - }) - .catch(err => { - return err - }) -} - -function deallocatePort (portUUID) { - var options = { - method: 'DELETE', - url: `${brokerUrl}/port/${portUUID}`, - headers: { 'X-Api-Key': brokerToken } - } - - return axios(options) -} - -function revokeServerToken (token) { - var options = { - method: 'DELETE', - url: `${brokerUrl}/server-token/${token}`, - headers: { 'X-Api-Key': brokerToken } - } - - return axios(options) -} - -module.exports = { - allocatePort: allocatePort, - deallocatePort: deallocatePort, - revokeServerToken: revokeServerToken -} diff --git a/src/services/catalog-service.js b/src/services/catalog-service.js index a81a513e4..dee5aa6cb 100644 --- a/src/services/catalog-service.js +++ b/src/services/catalog-service.js @@ -161,15 +161,6 @@ async function getProxyCatalogItem (transaction) { }, transaction) } -async function getPortRouterCatalogItem (transaction) { - return CatalogItemManager.findOne({ - name: DBConstants.PORT_ROUTER_CATALOG_NAME, - category: 'SYSTEM', - publisher: 'Eclipse ioFog', - registry_id: 1 - }, transaction) -} - async function getBluetoothCatalogItem (transaction) { return CatalogItemManager.findOne({ name: 'RESTBlue', @@ -388,6 +379,5 @@ module.exports = { getBluetoothCatalogItem: getBluetoothCatalogItem, getHalCatalogItem: getHalCatalogItem, getRouterCatalogItem: getRouterCatalogItem, - getProxyCatalogItem: getProxyCatalogItem, - getPortRouterCatalogItem: getPortRouterCatalogItem + getProxyCatalogItem: getProxyCatalogItem } diff --git a/src/services/microservice-ports/default.js b/src/services/microservice-ports/default.js index a24be57f2..83c2d0e7b 100644 --- a/src/services/microservice-ports/default.js +++ b/src/services/microservice-ports/default.js @@ -27,7 +27,6 @@ const RouterManager = require('../../data/managers/router-manager') const MicroservicePublicPortManager = require('../../data/managers/microservice-public-port-manager') const MicroserviceExtraHostManager = require('../../data/managers/microservice-extra-host-manager') const controllerConfig = require('../../config') -const Proxy = require('./proxy') const { MICROSERVICE_DEFAULT_LOG_SIZE, DEFAULT_ROUTER_NAME, DEFAULT_PROXY_HOST, RESERVED_PORTS } = require('../../helpers/constants') @@ -185,10 +184,7 @@ async function validatePublicPortAppHostTemplate (extraHost, templateArgs, msvc, async function movePublicPortsToNewFog (updatedMicroservice, transaction) { const portMappings = await updatedMicroservice.getPorts() for (const portMapping of portMappings) { - if (portMapping.isProxy) { - Proxy.moveProxyPortsToNewFog(updatedMicroservice, portMapping, transaction) - continue - } else if (!portMapping.isPublic) { + if (!portMapping.isPublic) { continue } @@ -226,8 +222,6 @@ async function createPortMapping (microservice, portMappingData, transaction) { if (portMappingData.public) { return _createPublicPortMapping(microservice, portMappingData, transaction) - } else if (portMappingData.proxy) { - return Proxy.createProxyPortMapping(microservice, portMappingData, transaction) } else { return _createSimplePortMapping(microservice, portMappingData, transaction) } @@ -347,8 +341,6 @@ async function _createPublicPortMapping (microservice, portMappingData, transact async function _deletePortMapping (microservice, portMapping, transaction) { if (portMapping.isPublic) { await _deletePublicPortMapping(microservice, portMapping, transaction) - } else if (portMapping.isProxy) { - return Proxy.deleteProxyPortMapping(microservice, portMapping, transaction) } else { await _deleteSimplePortMapping(microservice, portMapping, transaction) } @@ -429,9 +421,7 @@ function _buildLink (protocol, host, port) { } async function buildPublicPortMapping (pm, mapping, transaction) { - if (pm.isProxy) { - return Proxy.buildProxyPortMapping(pm, mapping, transaction) - } else if (!pm.isPublic) { + if (!pm.isPublic) { return } diff --git a/src/services/microservice-ports/factory.js b/src/services/microservice-ports/factory.js deleted file mode 100644 index e07b1c192..000000000 --- a/src/services/microservice-ports/factory.js +++ /dev/null @@ -1,22 +0,0 @@ -/* - * ******************************************************************************* - * * Copyright (c) 2023 Datasance Teknoloji A.S. - * * - * * This program and the accompanying materials are made available under the - * * terms of the Eclipse Public License v. 2.0 which is available at - * * http://www.eclipse.org/legal/epl-2.0 - * * - * * SPDX-License-Identifier: EPL-2.0 - * ******************************************************************************* - * - */ - -const config = require('../../config') - -function createMicroservicePortProvider () { - let provider = process.env.MSVC_PORT_PROVIDER || config.get('PublicPorts:Provider', 'default') - - return require(`./${provider}`) -} - -module.exports = createMicroservicePortProvider() diff --git a/src/services/microservice-ports/proxy.js b/src/services/microservice-ports/proxy.js deleted file mode 100644 index 0e4af1abf..000000000 --- a/src/services/microservice-ports/proxy.js +++ /dev/null @@ -1,220 +0,0 @@ -/* only "[a-zA-Z0-9][a-zA-Z0-9_.-]" are allowed - * ******************************************************************************* - * * Copyright (c) 2023 Datasance Teknoloji A.S. - * * - * * This program and the accompanying materials are made available under the - * * terms of the Eclipse Public License v. 2.0 which is available at - * * http://www.eclipse.org/legal/epl-2.0 - * * - * * SPDX-License-Identifier: EPL-2.0 - * ******************************************************************************* - * - */ -const crypto = require('crypto') - -const AppHelper = require('../../helpers/app-helper') -const CatalogService = require('../catalog-service') -const ChangeTrackingService = require('../change-tracking-service') -const MicroserviceManager = require('../../data/managers/microservice-manager') -const MicroservicePortManager = require('../../data/managers/microservice-port-manager') -const MicroserviceProxyPortManager = require('../../data/managers/microservice-proxy-port-manager') -const ProxyBrokerClient = require('../../helpers/proxy-broker-client') - -async function _createOrUpdatePortRouterMicroservice (existingProxy, localPort, protocol, portRouterServerConfig, hostUuid, portRouterCatalogId, microserviceUuid, transaction) { - const proxyConfig = { - name: `${microserviceUuid}_${localPort}`, - server_addr: portRouterServerConfig.host, - server_port: portRouterServerConfig.adminPort, - local_port: localPort, - remote_port: portRouterServerConfig.proxyPort, - type: protocol, - proxy_token: portRouterServerConfig.proxyToken, - server_token: portRouterServerConfig.serverToken, - port_uuid: portRouterServerConfig.portUUID - } - - if (existingProxy) { - const config = JSON.parse(existingProxy.config || '{}') - config.proxies = (config.proxies || []).concat(proxyConfig) - existingProxy.config = JSON.stringify(config) - await MicroserviceManager.updateIfChanged({ uuid: existingProxy.uuid }, { config: JSON.stringify(config) }, transaction) - await ChangeTrackingService.update(hostUuid, ChangeTrackingService.events.microserviceConfig, transaction) - return existingProxy - } - - const proxyMicroserviceData = { - uuid: AppHelper.generateRandomString(32), - name: `proxy-${hostUuid}`, - config: JSON.stringify({ - fetch_config_interval: 5, - proxies: [proxyConfig] - }), - catalogItemId: portRouterCatalogId, - iofogUuid: hostUuid, - rootHostAccess: true, - registryId: 1 - } - const res = await MicroserviceManager.create(proxyMicroserviceData, transaction) - await ChangeTrackingService.update(hostUuid, ChangeTrackingService.events.microserviceCommon, transaction) - return res -} - -async function createProxyPortMapping (microservice, portMappingData, transaction) { - const protocol = portMappingData.protocol || 'tcp' - - // create proxy microservices - const portRouterCatalog = await CatalogService.getPortRouterCatalogItem(transaction) - - const existingProxy = await MicroserviceManager.findOne({ catalogItemId: portRouterCatalog.id, iofogUuid: microservice.iofogUuid }, transaction) - let serverToken = crypto.randomUUID() - if (existingProxy) { - const config = JSON.parse(existingProxy.config || '{}') - serverToken = config.proxies[0].server_token - } - - const portRouterServerConfig = await _portRouterServerConfig(serverToken) - - const localPortRouter = await _createOrUpdatePortRouterMicroservice( - existingProxy, - portMappingData.external, - protocol, - portRouterServerConfig, - microservice.iofogUuid, - portRouterCatalog.id, - microservice.uuid, - transaction) - - const mappingData = { - isPublic: false, - isProxy: true, - portInternal: portMappingData.internal, - portExternal: portMappingData.external, - isUdp: protocol === 'udp', - microserviceUuid: microservice.uuid - } - const port = await MicroservicePortManager.create(mappingData, transaction) - - const publicPort = { - portId: port.id, - host: portRouterServerConfig.host, - adminPort: portRouterServerConfig.adminPort, - localProxyId: localPortRouter.uuid, - publicPort: portRouterServerConfig.proxyPort, - proxyToken: portRouterServerConfig.proxyToken, - portUUID: portRouterServerConfig.portUUID, - serverToken: portRouterServerConfig.serverToken, - protocol - } - await MicroserviceProxyPortManager.create(publicPort, transaction) - - return { - proxy: { - host: publicPort.host, - port: publicPort.publicPort, - protocol: publicPort.protocol - } - } -} - -async function buildProxyPortMapping (pm, mapping, transaction) { - const proxyPortMapping = await pm.getProxyPort() - if (!proxyPortMapping) { - return - } - - mapping.proxy = { - host: proxyPortMapping.host, - port: proxyPortMapping.publicPort, - protocol: proxyPortMapping.protocol - } -} - -async function deleteProxyPortMapping (microservice, portMapping, transaction) { - const proxyPort = await portMapping.getProxyPort() - if (proxyPort) { - await _updateOrDeleteProxyMicroservice(proxyPort, false, transaction) - } - - await MicroservicePortManager.delete({ id: portMapping.id }, transaction) -} - -async function _updateOrDeleteProxyMicroservice (proxyPort, isMove, transaction) { - const proxy = await MicroserviceManager.findOne({ uuid: proxyPort.localProxyId }, transaction) - if (!proxy) { - return - } - - const config = JSON.parse(proxy.config || '{}') - config.proxies = (config.proxies || []).filter(mapping => mapping.remote_port !== proxyPort.publicPort) - const removeServerToken = config.proxies.length === 0 - - if (!isMove) { - await ProxyBrokerClient.deallocatePort(proxyPort.portUUID) - if (removeServerToken) { - await ProxyBrokerClient.revokeServerToken(proxyPort.serverToken) - } - } - - if (config.proxies.length === 0) { - await MicroserviceManager.delete({ uuid: proxy.uuid }, transaction) - await ChangeTrackingService.update(proxy.iofogUuid, ChangeTrackingService.events.microserviceConfig, transaction) - } else { - await MicroserviceManager.updateIfChanged({ uuid: proxy.uuid }, { config: JSON.stringify(config) }, transaction) - await ChangeTrackingService.update(proxy.iofogUuid, ChangeTrackingService.events.microserviceCommon, transaction) - } -} - -async function moveProxyPortsToNewFog (updatedMicroservice, portMapping, transaction) { - const proxyPort = await portMapping.getProxyPort() - const localProxy = await MicroserviceManager.findOne({ uuid: proxyPort.localProxyId }, transaction) - await _updateOrDeleteProxyMicroservice(proxyPort, true, transaction) - - const existingProxy = await MicroserviceManager.findOne({ catalogItemId: localProxy.catalogItemId, iofogUuid: updatedMicroservice.iofogUuid }, transaction) - let serverToken = crypto.randomUUID() - if (existingProxy) { - const config = JSON.parse(existingProxy.config || '{}') - serverToken = config.proxies[0].server_token - } - - const portRouterServerConfig = { - host: proxyPort.host, - adminPort: proxyPort.adminPort, - serverToken, - proxyPort: proxyPort.proxyPort, - proxyToken: proxyPort.proxyToken, - portUUID: proxyPort.portUUID - } - - const newProxy = await _createOrUpdatePortRouterMicroservice( - existingProxy, - portMapping.external, - portMapping.protocol, - portRouterServerConfig, - updatedMicroservice.iofogUuid, - localProxy.catalogItemId, - updatedMicroservice.uuid, - transaction) - - proxyPort.localProxyId = newProxy.uuid - proxyPort.serverToken = portRouterServerConfig.serverToken - await MicroserviceProxyPortManager.updateOrCreate({ id: proxyPort.id }, proxyPort.toJSON(), transaction) -} - -async function _portRouterServerConfig (serverToken) { - const allocatedPort = await ProxyBrokerClient.allocatePort(serverToken) - return { - host: allocatedPort.serverAddr, - adminPort: allocatedPort.serverPort, - serverToken, - proxyPort: allocatedPort.proxyPort, - proxyToken: allocatedPort.proxyToken, - portUUID: allocatedPort.portUUID - } -} - -module.exports = { - createProxyPortMapping: createProxyPortMapping, - deleteProxyPortMapping: deleteProxyPortMapping, - buildProxyPortMapping: buildProxyPortMapping, - moveProxyPortsToNewFog: moveProxyPortsToNewFog -} diff --git a/src/services/microservices-service.js b/src/services/microservices-service.js index 191698b78..c5f3e971c 100644 --- a/src/services/microservices-service.js +++ b/src/services/microservices-service.js @@ -17,7 +17,7 @@ const MicroserviceStatusManager = require('../data/managers/microservice-status- const MicroserviceArgManager = require('../data/managers/microservice-arg-manager') const MicroserviceCdiDevManager = require('../data/managers/microservice-cdi-device-manager') const MicroserviceEnvManager = require('../data/managers/microservice-env-manager') -const MicroservicePortService = require('../services/microservice-ports/factory') +const MicroservicePortService = require('../services/microservice-ports/default') const CatalogItemImageManager = require('../data/managers/catalog-item-image-manager') const RegistryManager = require('../data/managers/registry-manager') const MicroserviceStates = require('../enums/microservice-state') diff --git a/test/src/services/microservices-service.test.js b/test/src/services/microservices-service.test.js index cfe2d9ef9..a6744122a 100644 --- a/test/src/services/microservices-service.test.js +++ b/test/src/services/microservices-service.test.js @@ -20,7 +20,6 @@ const MicroserviceEnvManager = require('../../../src/data/managers/microservice- const MicroserviceArgManager = require('../../../src/data/managers/microservice-arg-manager') const RegistryManager = require('../../../src/data/managers/registry-manager') const Op = require('sequelize').Op -const MicroservicePublicModeManager = require('../../../src/data/managers/microservice-public-mode-manager') const MicroservicePublicPortManager = require('../../../src/data/managers/microservice-public-port-manager') const ioFogManager = require('../../../src/data/managers/iofog-manager') const ioFogService = require('../../../src/services/iofog-service') @@ -118,7 +117,6 @@ describe('Microservices Service', () => { $sandbox.stub(MicroserviceExtraHostManager, 'findAll').returns($findExtraHostsResponse) $sandbox.stub(MicroserviceEnvManager, 'findAllExcludeFields').returns($envResponse) $sandbox.stub(MicroserviceArgManager, 'findAllExcludeFields').returns($cmdResponse) - $sandbox.stub(MicroservicePublicModeManager, 'findAll').returns($publicModeResponse) $sandbox.stub(CatalogItemImageManager, 'findAll').returns($imgResponse) $sandbox.stub(MicroserviceStatusManager, 'findAllExcludeFields').returns($statusResponse) $sandbox.stub(ApplicationManager, 'findOne').returns(Promise.resolve(application)) @@ -198,7 +196,6 @@ describe('Microservices Service', () => { $sandbox.stub(MicroserviceExtraHostManager, 'findAll').returns($findExtraHostsResponse) $sandbox.stub(MicroserviceEnvManager, 'findAllExcludeFields').returns($envResponse) $sandbox.stub(MicroserviceArgManager, 'findAllExcludeFields').returns($cmdResponse) - $sandbox.stub(MicroservicePublicModeManager, 'findAll').returns($publicModeResponse) $sandbox.stub(CatalogItemImageManager, 'findAll').returns($imgResponse) $sandbox.stub(MicroserviceStatusManager, 'findAllExcludeFields').returns($statusResponse) $sandbox.stub(ApplicationManager, 'findOne').returns(Promise.resolve(application)) From 56fed80da490632d531ffc2e52b0683b3b5a7a70 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emirhan=20Durmu=C5=9F?= Date: Wed, 13 Nov 2024 19:55:25 +0300 Subject: [PATCH 129/178] docker base image updated and starting of 1st phase of sqlite scripts --- Dockerfile | 2 +- .../migrations/20241111145836-create-flow.js | 48 +++ .../20241111145901-create-registry.js | 49 +++ .../20241111145917-create-catalog-item.js | 77 +++++ .../20241111150318-create-fog-types.js | 47 +++ ...0241111150428-create-catalog-item-image.js | 33 ++ ...11150828-create-catalog-item-input-type.js | 31 ++ ...1150853-create-catalog-item-output-type.js | 31 ++ .../migrations/20241111150954-create-fog.js | 283 ++++++++++++++++++ 9 files changed, 600 insertions(+), 1 deletion(-) create mode 100644 src/data/migrations/20241111145836-create-flow.js create mode 100644 src/data/migrations/20241111145901-create-registry.js create mode 100644 src/data/migrations/20241111145917-create-catalog-item.js create mode 100644 src/data/migrations/20241111150318-create-fog-types.js create mode 100644 src/data/migrations/20241111150428-create-catalog-item-image.js create mode 100644 src/data/migrations/20241111150828-create-catalog-item-input-type.js create mode 100644 src/data/migrations/20241111150853-create-catalog-item-output-type.js create mode 100644 src/data/migrations/20241111150954-create-fog.js diff --git a/Dockerfile b/Dockerfile index 45aab3472..2c098afb8 100644 --- a/Dockerfile +++ b/Dockerfile @@ -22,7 +22,7 @@ RUN npm version $PKG_VERSION --allow-same-version --no-git-tag-version RUN npm pack -FROM registry.access.redhat.com/ubi9/nodejs-20-minimal:1-63.1726695170 +FROM registry.access.redhat.com/ubi9/nodejs-20-minimal:9.5-1730525319 USER root # Install dependencies for logging and development diff --git a/src/data/migrations/20241111145836-create-flow.js b/src/data/migrations/20241111145836-create-flow.js new file mode 100644 index 000000000..6a2eb5ae2 --- /dev/null +++ b/src/data/migrations/20241111145836-create-flow.js @@ -0,0 +1,48 @@ +'use strict' +module.exports = { + up: (queryInterface, Sequelize) => { + return queryInterface.createTable('Flows', { + id: { + type: Sequelize.INTEGER, + primaryKey: true, + autoIncrement: true, + allowNull: false, + field: 'id' + + }, + name: { + type: Sequelize.TEXT, + field: 'name', + defaultValue: 'New Application' + }, + description: { + type: Sequelize.TEXT, + field: 'description', + defaultValue: '' + }, + isActivated: { + type: Sequelize.BOOLEAN, + field: 'is_activated', + defaultValue: false + }, + isSystem: { + type: Sequelize.BOOLEAN, + field: 'is_system', + defaultValue: false + }, + createdAt: { + allowNull: false, + type: Sequelize.DATE, + field: 'created_at' + }, + updatedAt: { + allowNull: false, + type: Sequelize.DATE, + field: 'updated_at' + } + }) + }, + down: (queryInterface, Sequelize) => { + return queryInterface.dropTable('Flows') + } +} diff --git a/src/data/migrations/20241111145901-create-registry.js b/src/data/migrations/20241111145901-create-registry.js new file mode 100644 index 000000000..a6cfd9e41 --- /dev/null +++ b/src/data/migrations/20241111145901-create-registry.js @@ -0,0 +1,49 @@ +'use strict' +module.exports = { + up: (queryInterface, Sequelize) => { + return queryInterface.createTable('Registries', { + id: { + type: Sequelize.INTEGER, + primaryKey: true, + autoIncrement: true, + allowNull: false, + field: 'id' + }, + url: { + type: Sequelize.TEXT, + field: 'url' + }, + isPublic: { + type: Sequelize.BOOLEAN, + field: 'is_public' + }, + secure: { + type: Sequelize.BOOLEAN, + field: 'secure' + }, + certificate: { + type: Sequelize.TEXT, + field: 'certificate' + }, + requiresCert: { + type: Sequelize.BOOLEAN, + field: 'requires_cert' + }, + username: { + type: Sequelize.TEXT, + field: 'user_name' + }, + password: { + type: Sequelize.TEXT, + field: 'password' + }, + userEmail: { + type: Sequelize.TEXT, + field: 'user_email' + } + }) + }, + down: (queryInterface, Sequelize) => { + return queryInterface.dropTable('Registries') + } +} diff --git a/src/data/migrations/20241111145917-create-catalog-item.js b/src/data/migrations/20241111145917-create-catalog-item.js new file mode 100644 index 000000000..934fd85f3 --- /dev/null +++ b/src/data/migrations/20241111145917-create-catalog-item.js @@ -0,0 +1,77 @@ +'use strict' + +const { convertToInt } = require('../../helpers/app-helper') + +module.exports = { + up: (queryInterface, Sequelize) => { + return queryInterface.createTable('CatalogItems', { + id: { + type: Sequelize.INTEGER, + primaryKey: true, + autoIncrement: true, + allowNull: false, + field: 'id' + }, + name: { + type: Sequelize.TEXT, + field: 'name', + defaultValue: 'New Catalog Item' + }, + description: { + type: Sequelize.TEXT, + field: 'description', + defaultValue: '' + }, + category: { + type: Sequelize.TEXT, + field: 'category' + }, + configExample: { + type: Sequelize.TEXT, + field: 'config_example', + defaultValue: '{}' + }, + publisher: { + type: Sequelize.TEXT, + field: 'publisher' + }, + diskRequired: { + type: Sequelize.BIGINT, + get () { + return convertToInt(this.getDataValue('diskRequired')) + }, + field: 'disk_required', + defaultValue: 0 + }, + ramRequired: { + type: Sequelize.BIGINT, + get () { + return convertToInt(this.getDataValue('ramRequired')) + }, + field: 'ram_required', + defaultValue: 0 + }, + picture: { + type: Sequelize.TEXT, + field: 'picture', + defaultValue: 'images/shared/default.png' + }, + isPublic: { + type: Sequelize.BOOLEAN, + field: 'is_public', + defaultValue: false + }, + registryId: { + type: Sequelize.INTEGER, + field: 'registry_id', + as: 'registryId', + references: { model: 'Registries', key: 'id' }, + onDelete: 'set null', + defaultValue: 1 + } + }) + }, + down: (queryInterface, Sequelize) => { + return queryInterface.dropTable('CatalogItems') + } +} diff --git a/src/data/migrations/20241111150318-create-fog-types.js b/src/data/migrations/20241111150318-create-fog-types.js new file mode 100644 index 000000000..8a9607648 --- /dev/null +++ b/src/data/migrations/20241111150318-create-fog-types.js @@ -0,0 +1,47 @@ +'use strict' +module.exports = { + up: (queryInterface, Sequelize) => { + return queryInterface.createTable('FogTypes', { + id: { + type: Sequelize.INTEGER, + primaryKey: true, + autoIncrement: true, + allowNull: false, + field: 'id' + }, + name: { + type: Sequelize.TEXT, + field: 'name' + }, + image: { + type: Sequelize.TEXT, + field: 'image' + }, + description: { + type: Sequelize.TEXT, + field: 'description' + }, + networkCatalogItemId: { + type: Sequelize.INTEGER, + field: 'network_catalog_item_id', + references: { model: 'CatalogItems', key: 'id' }, + onDelete: 'cascade' + }, + halCatalogItemId: { + type: Sequelize.INTEGER, + field: 'hal_catalog_item_id', + references: { model: 'CatalogItems', key: 'id' }, + onDelete: 'cascade' + }, + bluetoothCatalogItemId: { + type: Sequelize.INTEGER, + field: 'bluetooth_catalog_item_id', + references: { model: 'CatalogItems', key: 'id' }, + onDelete: 'cascade' + } + }) + }, + down: (queryInterface, Sequelize) => { + return queryInterface.dropTable('FogTypes') + } +} diff --git a/src/data/migrations/20241111150428-create-catalog-item-image.js b/src/data/migrations/20241111150428-create-catalog-item-image.js new file mode 100644 index 000000000..b69109136 --- /dev/null +++ b/src/data/migrations/20241111150428-create-catalog-item-image.js @@ -0,0 +1,33 @@ +'use strict' +module.exports = { + up: (queryInterface, Sequelize) => { + return queryInterface.createTable('CatalogItemImages', { + id: { + type: Sequelize.INTEGER, + primaryKey: true, + autoIncrement: true, + allowNull: false, + field: 'id' + }, + containerImage: { + type: Sequelize.TEXT, + field: 'container_image' + }, + catalogItemId: { + type: Sequelize.INTEGER, + field: 'catalog_item_id', + references: { model: 'CatalogItems', key: 'id' }, + onDelete: 'cascade' + }, + fogTypeId: { + type: Sequelize.INTEGER, + field: 'fog_type_id', + references: { model: 'FogTypes', key: 'id' }, + onDelete: 'cascade' + } + }) + }, + down: (queryInterface, Sequelize) => { + return queryInterface.dropTable('CatalogItemImages') + } +} diff --git a/src/data/migrations/20241111150828-create-catalog-item-input-type.js b/src/data/migrations/20241111150828-create-catalog-item-input-type.js new file mode 100644 index 000000000..0606561b2 --- /dev/null +++ b/src/data/migrations/20241111150828-create-catalog-item-input-type.js @@ -0,0 +1,31 @@ +'use strict' +module.exports = { + up: (queryInterface, Sequelize) => { + return queryInterface.createTable('CatalogItemInputTypes', { + id: { + type: Sequelize.INTEGER, + primaryKey: true, + autoIncrement: true, + allowNull: false, + field: 'id' + }, + infoType: { + type: Sequelize.TEXT, + field: 'info_type' + }, + infoFormat: { + type: Sequelize.TEXT, + field: 'info_format' + }, + catalogItemId: { + type: Sequelize.INTEGER, + field: 'catalog_item_id', + references: { model: 'CatalogItems', key: 'id' }, + onDelete: 'cascade' + } + }) + }, + down: (queryInterface, Sequelize) => { + return queryInterface.dropTable('CatalogItemInputTypes') + } +} diff --git a/src/data/migrations/20241111150853-create-catalog-item-output-type.js b/src/data/migrations/20241111150853-create-catalog-item-output-type.js new file mode 100644 index 000000000..5b1a8d0ee --- /dev/null +++ b/src/data/migrations/20241111150853-create-catalog-item-output-type.js @@ -0,0 +1,31 @@ +'use strict' +module.exports = { + up: (queryInterface, Sequelize) => { + return queryInterface.createTable('CatalogItemOutputTypes', { + id: { + type: Sequelize.INTEGER, + primaryKey: true, + autoIncrement: true, + allowNull: false, + field: 'id' + }, + infoType: { + type: Sequelize.TEXT, + field: 'info_type' + }, + infoFormat: { + type: Sequelize.TEXT, + field: 'info_format' + }, + catalogItemId: { + type: Sequelize.INTEGER, + field: 'catalog_item_id', + references: { model: 'CatalogItems', key: 'id' }, + onDelete: 'cascade' + } + }) + }, + down: (queryInterface, Sequelize) => { + return queryInterface.dropTable('CatalogItemOutputTypes') + } +} diff --git a/src/data/migrations/20241111150954-create-fog.js b/src/data/migrations/20241111150954-create-fog.js new file mode 100644 index 000000000..612700a5e --- /dev/null +++ b/src/data/migrations/20241111150954-create-fog.js @@ -0,0 +1,283 @@ +'use strict' + +const { convertToInt } = require('../../helpers/app-helper') + +module.exports = { + up: (queryInterface, Sequelize) => { + return queryInterface.createTable('Fogs', { + uuid: { + type: Sequelize.STRING(32), + primaryKey: true, + allowNull: false, + field: 'uuid' + }, + name: { + type: Sequelize.TEXT, + defaultValue: 'Unnamed ioFog 1', + field: 'name' + }, + location: { + type: Sequelize.TEXT, + field: 'location' + }, + gpsMode: { + type: Sequelize.TEXT, + field: 'gps_mode' + }, + latitude: { + type: Sequelize.FLOAT, + field: 'latitude' + }, + longitude: { + type: Sequelize.FLOAT, + field: 'longitude' + }, + description: { + type: Sequelize.TEXT, + field: 'description' + }, + lastactive: { + type: Sequelize.BIGINT, + get () { + return convertToInt(this.getDataValue('lastactive')) + }, + field: 'last_active' + }, + daemonStatus: { + type: Sequelize.TEXT, + defaultValue: 'UNKNOWN', + field: 'daemon_status' + }, + daemonOperatingDuration: { + type: Sequelize.BIGINT, + get () { + return convertToInt(this.getDataValue('daemonOperatingDuration')) + }, + defaultValue: 0, + field: 'daemon_operating_duration' + }, + daemonLastStart: { + type: Sequelize.BIGINT, + get () { + return convertToInt(this.getDataValue('daemonLastStart')) + }, + field: 'daemon_last_start' + }, + memoryUsage: { + type: Sequelize.FLOAT, + defaultValue: 0.000, + field: 'memory_usage' + }, + diskUsage: { + type: Sequelize.FLOAT, + defaultValue: 0.000, + field: 'disk_usage' + }, + cpuUsage: { + type: Sequelize.FLOAT, + defaultValue: 0.00, + field: 'cpu_usage' + }, + memoryViolation: { + type: Sequelize.TEXT, + field: 'memory_violation' + }, + diskViolation: { + type: Sequelize.TEXT, + field: 'disk_violation' + }, + cpuViolation: { + type: Sequelize.TEXT, + field: 'cpu_violation' + }, + cpuViolation: { + type: Sequelize.TEXT, + field: 'cpu_violation' + }, + cpuViolation: { + type: Sequelize.TEXT, + field: 'cpu_violation' + }, + cpuViolation: { + type: Sequelize.TEXT, + field: 'cpu_violation' + }, + catalogItemStatus: { + type: Sequelize.TEXT, + field: 'catalog_item_status' + }, + repositoryCount: { + type: Sequelize.BIGINT, + get () { + return convertToInt(this.getDataValue('repositoryCount')) + }, + field: 'repository_count' + }, + repositoryStatus: { + type: Sequelize.TEXT, + field: 'repository_status' + }, + systemTime: { + type: Sequelize.BIGINT, + get () { + return convertToInt(this.getDataValue('systemTime')) + }, + field: 'system_time' + }, + lastStatusTime: { + type: Sequelize.BIGINT, + get () { + return convertToInt(this.getDataValue('lastStatusTime')) + }, + field: 'last_status_time' + }, + ipAddress: { + type: Sequelize.TEXT, + defaultValue: '0.0.0.0', + field: 'ip_address' + }, + processedMessages: { + type: Sequelize.BIGINT, + get () { + return convertToInt(this.getDataValue('processedMessages')) + }, + defaultValue: 0, + field: 'processed_messages' + }, + catalogItemMessageCounts: { + type: Sequelize.TEXT, + field: 'catalog_item_message_counts' + }, + messageSpeed: { + type: Sequelize.BIGINT, + get () { + return convertToInt(this.getDataValue('messageSpeed')) + }, + field: 'message_speed' + }, + lastCommandTime: { + type: Sequelize.BIGINT, + get () { + return convertToInt(this.getDataValue('lastCommandTime')) + }, + field: 'last_command_time' + }, + networkInterface: { + type: Sequelize.TEXT, + defaultValue: 'eth0', + field: 'network_interface' + }, + dockerUrl: { + type: Sequelize.TEXT, + defaultValue: 'unix:///var/run/docker.sock', + field: 'docker_url' + }, + diskLimit: { + type: Sequelize.FLOAT, + defaultValue: 50, + field: 'disk_limit' + }, + diskDirectory: { + type: Sequelize.TEXT, + defaultValue: '/var/lib/iofog/', + field: 'disk_directory' + }, + memoryLimit: { + type: Sequelize.FLOAT, + defaultValue: 4096, + field: 'memory_limit' + }, + cpuLimit: { + type: Sequelize.FLOAT, + defaultValue: 80, + field: 'cpu_limit' + }, + logLimit: { + type: Sequelize.FLOAT, + defaultValue: 10, + field: 'log_limit' + }, + logDirectory: { + type: Sequelize.TEXT, + defaultValue: '/var/log/iofog/', + field: 'log_directory' + }, + bluetoothEnabled: { + type: Sequelize.BOOLEAN, + defaultValue: false, + field: 'bluetooth' + }, + abstractedHardwareEnabled: { + type: Sequelize.BOOLEAN, + defaultValue: false, + field: 'hal' + }, + logFileCount: { + type: Sequelize.BIGINT, + get () { + return convertToInt(this.getDataValue('logFileCount')) + }, + defaultValue: 10, + field: 'log_file_count' + }, + version: { + type: Sequelize.TEXT, + field: 'version' + }, + isReadyToUpgrade: { + type: Sequelize.BOOLEAN, + defaultValue: true, + field: 'is_ready_to_upgrade' + }, + isReadyToRollback: { + type: Sequelize.BOOLEAN, + defaultValue: false, + field: 'is_ready_to_rollback' + }, + statusFrequency: { + type: Sequelize.INTEGER, + defaultValue: 10, + field: 'status_frequency' + }, + changeFrequency: { + type: Sequelize.INTEGER, + defaultValue: 20, + field: 'change_frequency' + }, + deviceScanFrequency: { + type: Sequelize.INTEGER, + defaultValue: 20, + field: 'device_scan_frequency' + }, + tunnel: { + type: Sequelize.TEXT, + defaultValue: '', + field: 'tunnel' + }, + watchdogEnabled: { + type: Sequelize.BOOLEAN, + defaultValue: true, + field: 'isolated_docker_container' + }, + createdAt: { + allowNull: false, + type: Sequelize.DATE, + field: 'created_at' + }, + updatedAt: { + allowNull: false, + type: Sequelize.DATE, + field: 'updated_at' + }, + fogTypeId: { + type: Sequelize.INTEGER, + field: 'fog_type_id', + references: { model: 'FogTypes', key: 'id' }, + onDelete: 'set null' + } + }) + }, + down: (queryInterface, Sequelize) => { + return queryInterface.dropTable('Fogs') + } +} From 40b5b87e85f20a815d571d358f62df24ffb1f31a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emirhan=20Durmu=C5=9F?= Date: Wed, 13 Nov 2024 20:00:52 +0300 Subject: [PATCH 130/178] docker base image updated --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 45aab3472..2c098afb8 100644 --- a/Dockerfile +++ b/Dockerfile @@ -22,7 +22,7 @@ RUN npm version $PKG_VERSION --allow-same-version --no-git-tag-version RUN npm pack -FROM registry.access.redhat.com/ubi9/nodejs-20-minimal:1-63.1726695170 +FROM registry.access.redhat.com/ubi9/nodejs-20-minimal:9.5-1730525319 USER root # Install dependencies for logging and development From 509636ebfdb1990bd5b21c7f52ef215367aa6f39 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emirhan=20Durmu=C5=9F?= Date: Wed, 13 Nov 2024 20:06:59 +0300 Subject: [PATCH 131/178] version updated --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 88bc355c4..1b3f30595 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@datasance/iofogcontroller", - "version": "3.4.2", + "version": "3.4.3", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@datasance/iofogcontroller", - "version": "3.4.2", + "version": "3.4.3", "hasInstallScript": true, "license": "EPL-2.0", "dependencies": { diff --git a/package.json b/package.json index 9ad9435af..ff3570561 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@datasance/iofogcontroller", - "version": "3.4.2", + "version": "3.4.3", "description": "ioFog Controller project for Eclipse IoFog @ iofog.org \\nCopyright (c) 2023 Datasance Teknoloji A.S.", "main": "./src/main.js", "author": "Emirhan Durmus", From b9a8876a1920368969d84bfafdc61183c5d62094 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emirhan=20Durmu=C5=9F?= Date: Thu, 14 Nov 2024 17:44:25 +0300 Subject: [PATCH 132/178] isconsumer fixed, old version data models cleaning --- Dockerfile | 2 +- package-lock.json | 4 +- package.json | 2 +- src/data/managers/microservice-manager.js | 8 +--- .../migrations/20241111150954-create-fog.js | 12 ------ src/data/models/microservice.js | 5 --- src/data/models/routing.js | 41 ------------------- src/services/microservices-service.js | 2 +- 8 files changed, 7 insertions(+), 69 deletions(-) diff --git a/Dockerfile b/Dockerfile index 2c098afb8..bfd09abfc 100644 --- a/Dockerfile +++ b/Dockerfile @@ -22,7 +22,7 @@ RUN npm version $PKG_VERSION --allow-same-version --no-git-tag-version RUN npm pack -FROM registry.access.redhat.com/ubi9/nodejs-20-minimal:9.5-1730525319 +FROM registry.access.redhat.com/ubi9/nodejs-20-minimal:latest USER root # Install dependencies for logging and development diff --git a/package-lock.json b/package-lock.json index 88bc355c4..1b3f30595 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@datasance/iofogcontroller", - "version": "3.4.2", + "version": "3.4.3", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@datasance/iofogcontroller", - "version": "3.4.2", + "version": "3.4.3", "hasInstallScript": true, "license": "EPL-2.0", "dependencies": { diff --git a/package.json b/package.json index 9ad9435af..ff3570561 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@datasance/iofogcontroller", - "version": "3.4.2", + "version": "3.4.3", "description": "ioFog Controller project for Eclipse IoFog @ iofog.org \\nCopyright (c) 2023 Datasance Teknoloji A.S.", "main": "./src/main.js", "author": "Emirhan Durmus", diff --git a/src/data/managers/microservice-manager.js b/src/data/managers/microservice-manager.js index c8a54a058..559ad59bf 100644 --- a/src/data/managers/microservice-manager.js +++ b/src/data/managers/microservice-manager.js @@ -35,7 +35,6 @@ const microserviceExcludedFields = [ 'created_at', 'updated_at', 'updatedBy', - 'isNetwork', 'rebuild', 'deleteWithCleanUp', 'imageSnapshot', @@ -131,8 +130,7 @@ class MicroserviceManager extends BaseManager { attributes: ['uuid'] }], attributes: { exclude: ['id', 'source_microservice_uuid', - 'sourceMicroserviceUuid', 'destMicroserviceUuid', 'sourceNetworkMicroserviceUuid', - 'destNetworkMicroserviceUuid', 'sourceIofogUuid', 'destIofogUuid'] } + 'sourceMicroserviceUuid', 'destMicroserviceUuid'] } } ], where: where, @@ -317,9 +315,7 @@ class MicroserviceManager extends BaseManager { attributes: ['uuid'] }], attributes: { exclude: ['id', - 'sourceMicroserviceUuid', 'destMicroserviceUuid', - 'sourceNetworkMicroserviceUuid', 'destNetworkMicroserviceUuid', - 'sourceIofogUuid', 'destIofogUuid'] } + 'sourceMicroserviceUuid', 'destMicroserviceUuid'] } } ], where: where, diff --git a/src/data/migrations/20241111150954-create-fog.js b/src/data/migrations/20241111150954-create-fog.js index 612700a5e..cb97959e7 100644 --- a/src/data/migrations/20241111150954-create-fog.js +++ b/src/data/migrations/20241111150954-create-fog.js @@ -90,18 +90,6 @@ module.exports = { type: Sequelize.TEXT, field: 'cpu_violation' }, - cpuViolation: { - type: Sequelize.TEXT, - field: 'cpu_violation' - }, - cpuViolation: { - type: Sequelize.TEXT, - field: 'cpu_violation' - }, - cpuViolation: { - type: Sequelize.TEXT, - field: 'cpu_violation' - }, catalogItemStatus: { type: Sequelize.TEXT, field: 'catalog_item_status' diff --git a/src/data/models/microservice.js b/src/data/models/microservice.js index 7ce25b690..a3c080cf7 100644 --- a/src/data/models/microservice.js +++ b/src/data/models/microservice.js @@ -27,11 +27,6 @@ module.exports = (sequelize, DataTypes) => { }, field: 'config_last_updated' }, - isNetwork: { - type: DataTypes.BOOLEAN, - field: 'is_network', - defaultValue: false - }, rebuild: { type: DataTypes.BOOLEAN, field: 'rebuild', diff --git a/src/data/models/routing.js b/src/data/models/routing.js index be63e3f09..3f748ae77 100644 --- a/src/data/models/routing.js +++ b/src/data/models/routing.js @@ -12,11 +12,6 @@ module.exports = (sequelize, DataTypes) => { type: DataTypes.TEXT, allowNull: false, field: 'name' - }, - isNetworkConnection: { - type: DataTypes.BOOLEAN, - defaultValue: false, - field: 'is_network_connection' } }, { tableName: 'Routings', @@ -42,42 +37,6 @@ module.exports = (sequelize, DataTypes) => { onDelete: 'cascade' }) - Routing.belongsTo(models.Microservice, { - foreignKey: { - name: 'sourceNetworkMicroserviceUuid', - field: 'source_network_microservice_uuid' - }, - as: 'sourceNetworkMicroservice', - onDelete: 'set null' - }) - - Routing.belongsTo(models.Microservice, { - foreignKey: { - name: 'destNetworkMicroserviceUuid', - field: 'dest_network_microservice_uuid' - }, - as: 'destNetworkMicroservice', - onDelete: 'set null' - }) - - Routing.belongsTo(models.Fog, { - foreignKey: { - name: 'sourceIofogUuid', - field: 'source_iofog_uuid' - }, - as: 'sourceIofog', - onDelete: 'set null' - }) - - Routing.belongsTo(models.Fog, { - foreignKey: { - name: 'destIofogUuid', - field: 'dest_iofog_uuid' - }, - as: 'destIofog', - onDelete: 'set null' - }) - Routing.belongsTo(models.Application, { foreignKey: { name: 'applicationId', diff --git a/src/services/microservices-service.js b/src/services/microservices-service.js index c5f3e971c..c919d2770 100644 --- a/src/services/microservices-service.js +++ b/src/services/microservices-service.js @@ -966,7 +966,7 @@ async function getReceiverMicroservices (microservice, transaction) { async function isMicroserviceConsumer (microservice, transaction) { const routes = await RoutingManager.findAll({ destMicroserviceUuid: microservice.uuid }, transaction) - return !!(routes && routes.length > 0) + return Boolean(routes.length) } async function createVolumeMappingEndPoint (microserviceUuid, volumeMappingData, isCLI, transaction) { From 14493aafd25578e919f0eb3337fa47f0efbbde9d Mon Sep 17 00:00:00 2001 From: Alpaslan DOGAN Date: Thu, 14 Nov 2024 17:45:49 +0300 Subject: [PATCH 133/178] Swagger feature added. --- package-lock.json | 229 +++++++++++++++++++++++++++++++++++++++++++++- package.json | 4 +- src/server.js | 47 +++++++++- swagger.js | 22 +++++ 4 files changed, 296 insertions(+), 6 deletions(-) create mode 100644 swagger.js diff --git a/package-lock.json b/package-lock.json index 1b3f30595..d8720fcf0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -51,10 +51,12 @@ "sequelize": "6.37.3", "sqlite3": "^5.1.7", "string-format": "2.0.0", + "swagger-jsdoc": "^6.2.8", "swagger-ui-express": "^5.0.0", "umzug": "^3.7.0", "underscore": "1.13.6", - "xss-clean": "0.1.1" + "xss-clean": "0.1.1", + "yamljs": "^0.3.0" }, "bin": { "iofog-controller": "src/main.js" @@ -92,6 +94,46 @@ "node": ">=6.0.0" } }, + "node_modules/@apidevtools/json-schema-ref-parser": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-9.1.2.tgz", + "integrity": "sha512-r1w81DpR+KyRWd3f+rk6TNqMgedmAxZP5v5KWlXQWlgMUUtyEJch0DKEci1SorPMiSeM8XPl7MZ3miJ60JIpQg==", + "dependencies": { + "@jsdevtools/ono": "^7.1.3", + "@types/json-schema": "^7.0.6", + "call-me-maybe": "^1.0.1", + "js-yaml": "^4.1.0" + } + }, + "node_modules/@apidevtools/openapi-schemas": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@apidevtools/openapi-schemas/-/openapi-schemas-2.1.0.tgz", + "integrity": "sha512-Zc1AlqrJlX3SlpupFGpiLi2EbteyP7fXmUOGup6/DnkRgjP9bgMM/ag+n91rsv0U1Gpz0H3VILA/o3bW7Ua6BQ==", + "engines": { + "node": ">=10" + } + }, + "node_modules/@apidevtools/swagger-methods": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@apidevtools/swagger-methods/-/swagger-methods-3.0.2.tgz", + "integrity": "sha512-QAkD5kK2b1WfjDS/UQn/qQkbwF31uqRjPTrsCs5ZG9BQGAkjwvqGFjjPqAuzac/IYzpPtRzjCP1WrTuAIjMrXg==" + }, + "node_modules/@apidevtools/swagger-parser": { + "version": "10.0.3", + "resolved": "https://registry.npmjs.org/@apidevtools/swagger-parser/-/swagger-parser-10.0.3.tgz", + "integrity": "sha512-sNiLY51vZOmSPFZA5TF35KZ2HbgYklQnTSDnkghamzLb3EkNtcQnrBQEj5AOCxHpTtXpqMCRM1CrmV2rG6nw4g==", + "dependencies": { + "@apidevtools/json-schema-ref-parser": "^9.0.6", + "@apidevtools/openapi-schemas": "^2.0.4", + "@apidevtools/swagger-methods": "^3.0.2", + "@jsdevtools/ono": "^7.1.3", + "call-me-maybe": "^1.0.1", + "z-schema": "^5.0.1" + }, + "peerDependencies": { + "openapi-types": ">=7" + } + }, "node_modules/@babel/code-frame": { "version": "7.24.2", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.2.tgz", @@ -1006,6 +1048,11 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, + "node_modules/@jsdevtools/ono": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/@jsdevtools/ono/-/ono-7.1.3.tgz", + "integrity": "sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==" + }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -1388,6 +1435,11 @@ "@types/ms": "*" } }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==" + }, "node_modules/@types/ms": { "version": "0.7.34", "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz", @@ -2315,6 +2367,11 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/call-me-maybe": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.2.tgz", + "integrity": "sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ==" + }, "node_modules/caller-path": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", @@ -4209,7 +4266,6 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "devOptional": true, "engines": { "node": ">=0.10.0" } @@ -7088,6 +7144,11 @@ "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "dev": true }, + "node_modules/lodash.mergewith": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.2.tgz", + "integrity": "sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==" + }, "node_modules/log-symbols": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", @@ -8619,7 +8680,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "devOptional": true, "engines": { "node": ">=0.10.0" } @@ -12135,6 +12195,95 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/swagger-jsdoc": { + "version": "6.2.8", + "resolved": "https://registry.npmjs.org/swagger-jsdoc/-/swagger-jsdoc-6.2.8.tgz", + "integrity": "sha512-VPvil1+JRpmJ55CgAtn8DIcpBs0bL5L3q5bVQvF4tAW/k/9JYSj7dCpaYCAv5rufe0vcCbBRQXGvzpkWjvLklQ==", + "dependencies": { + "commander": "6.2.0", + "doctrine": "3.0.0", + "glob": "7.1.6", + "lodash.mergewith": "^4.6.2", + "swagger-parser": "^10.0.3", + "yaml": "2.0.0-1" + }, + "bin": { + "swagger-jsdoc": "bin/swagger-jsdoc.js" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/swagger-jsdoc/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/swagger-jsdoc/node_modules/commander": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.0.tgz", + "integrity": "sha512-zP4jEKbe8SHzKJYQmq8Y9gYjtO/POJLgIdKgV7B9qNmABVFVc+ctqSX6iXh4mCpJfRBOabiZ2YKPg8ciDw6C+Q==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/swagger-jsdoc/node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/swagger-jsdoc/node_modules/glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/swagger-jsdoc/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/swagger-parser": { + "version": "10.0.3", + "resolved": "https://registry.npmjs.org/swagger-parser/-/swagger-parser-10.0.3.tgz", + "integrity": "sha512-nF7oMeL4KypldrQhac8RyHerJeGPD1p2xDh900GPvc+Nk7nWP6jX2FcC7WmkinMoAmoO774+AFXcWsW8gMWEIg==", + "dependencies": { + "@apidevtools/swagger-parser": "10.0.3" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/swagger-ui-dist": { "version": "5.17.10", "resolved": "https://registry.npmjs.org/swagger-ui-dist/-/swagger-ui-dist-5.17.10.tgz", @@ -13289,6 +13438,80 @@ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, + "node_modules/yaml": { + "version": "2.0.0-1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.0.0-1.tgz", + "integrity": "sha512-W7h5dEhywMKenDJh2iX/LABkbFnBxasD27oyXWDS/feDsxiw0dD5ncXdYXgkvAsXIY2MpW/ZKkr9IU30DBdMNQ==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/yamljs": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/yamljs/-/yamljs-0.3.0.tgz", + "integrity": "sha512-C/FsVVhht4iPQYXOInoxUM/1ELSf9EsgKH34FofQOp6hwCPrW4vG4w5++TED3xRUo8gD7l0P1J1dLlDYzODsTQ==", + "dependencies": { + "argparse": "^1.0.7", + "glob": "^7.0.5" + }, + "bin": { + "json2yaml": "bin/json2yaml", + "yaml2json": "bin/yaml2json" + } + }, + "node_modules/yamljs/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/yamljs/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/yamljs/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "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/yamljs/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/yamljs/node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" + }, "node_modules/yargs": { "version": "16.2.0", "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", diff --git a/package.json b/package.json index ff3570561..6e04eda77 100644 --- a/package.json +++ b/package.json @@ -96,10 +96,12 @@ "sequelize": "6.37.3", "sqlite3": "^5.1.7", "string-format": "2.0.0", + "swagger-jsdoc": "^6.2.8", "swagger-ui-express": "^5.0.0", "umzug": "^3.7.0", "underscore": "1.13.6", - "xss-clean": "0.1.1" + "xss-clean": "0.1.1", + "yamljs": "^0.3.0" }, "devDependencies": { "acorn": "8.11.3", diff --git a/src/server.js b/src/server.js index 15a12acd3..4dd15989e 100755 --- a/src/server.js +++ b/src/server.js @@ -28,7 +28,27 @@ const { renderFile } = require('ejs') const xss = require('xss-clean') const { substitutionMiddleware } = require('./helpers/template-helper') const swaggerUi = require('swagger-ui-express') -const swaggerFile = require('../docs/swagger.json') +const yaml = require('yamljs') +const swaggerDocument = yaml.load('/home/runner/.npm-global/lib/node_modules/@datasance/iofogcontroller/docs/swagger.yaml') + +if (!swaggerDocument.components) { + swaggerDocument.components = {} +} + +swaggerDocument.components.securitySchemes = { + userToken: { + type: 'http', + scheme: 'bearer', + bearerFormat: 'JWT' + } +} + +swaggerDocument.security = [ + { + userToken: [] + } +] + const multer = require('multer') const multerMemStorage = multer.memoryStorage() const uploadFile = (fileName) => multer({ @@ -235,4 +255,27 @@ initState() startHttpServer({ api: app, viewer: viewerApp }, { api: apiPort, viewer: viewerPort }, jobs) } }) -app.use('/docs', swaggerUi.serve, swaggerUi.setup(swaggerFile)) +app.use('/docs', swaggerUi.serve) + +app.use('/docs', (req, res, next) => { + const userToken = req.query && req.query.userToken ? req.query.userToken : '' + + const options = { + swaggerOptions: { + authAction: { + userToken: { + name: 'userToken', + schema: { + type: 'http', + in: 'header', + name: 'Authorization', + description: 'Bearer Token (User Token)' + }, + value: `${userToken}` + } + } + } + } + + swaggerUi.setup(swaggerDocument, options)(req, res, next) +}) diff --git a/swagger.js b/swagger.js new file mode 100644 index 000000000..cd25b89e8 --- /dev/null +++ b/swagger.js @@ -0,0 +1,22 @@ +// swagger.js +const swaggerJsDoc = require('swagger-jsdoc') + +const swaggerOptions = { + swaggerDefinition: { + openapi: '3.0.0', + info: { + title: 'API Documentation', + version: '1.0.0', + description: 'Datasancae API Documentation' + }, + servers: [ + { + url: 'http://localhost:3000' + } + ] + }, + apis: ['./routes/*.js'] +} + +const swaggerDocs = swaggerJsDoc(swaggerOptions) +module.exports = swaggerDocs From c48a29ec57d400f5e9127418635b5cc8e878ba1e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emirhan=20Durmu=C5=9F?= Date: Wed, 27 Nov 2024 13:44:56 +0300 Subject: [PATCH 134/178] sqli migration and seeder scripts added, user refresh token endpoint created, proxy host configured --- .gitignore | 3 +- docs/swagger.json | 26 +- docs/swagger.yaml | 47 +- src/controllers/user-controller.js | 13 + .../migrations/20241111145836-create-flow.js | 48 -- .../20241111145901-create-registry.js | 49 -- .../20241111145917-create-catalog-item.js | 77 --- .../20241111150318-create-fog-types.js | 47 -- ...0241111150428-create-catalog-item-image.js | 33 - ...11150828-create-catalog-item-input-type.js | 31 - ...1150853-create-catalog-item-output-type.js | 31 - .../migrations/20241111150954-create-fog.js | 271 --------- src/data/migrations/db_migration_v1.0.2.sql | 567 ++++++++++++++++++ src/data/models/index.js | 14 + src/data/providers/database-provider.js | 153 ++++- src/data/seeders/db_seeder_v1.0.1.sql | 91 +++ src/routes/user.js | 29 + src/schemas/user.js | 12 +- src/services/microservice-ports/default.js | 2 +- src/services/user-service.js | 46 +- 20 files changed, 977 insertions(+), 613 deletions(-) delete mode 100644 src/data/migrations/20241111145836-create-flow.js delete mode 100644 src/data/migrations/20241111145901-create-registry.js delete mode 100644 src/data/migrations/20241111145917-create-catalog-item.js delete mode 100644 src/data/migrations/20241111150318-create-fog-types.js delete mode 100644 src/data/migrations/20241111150428-create-catalog-item-image.js delete mode 100644 src/data/migrations/20241111150828-create-catalog-item-input-type.js delete mode 100644 src/data/migrations/20241111150853-create-catalog-item-output-type.js delete mode 100644 src/data/migrations/20241111150954-create-fog.js create mode 100644 src/data/migrations/db_migration_v1.0.2.sql create mode 100644 src/data/seeders/db_seeder_v1.0.1.sql diff --git a/.gitignore b/.gitignore index 3524ddf39..a80448af3 100644 --- a/.gitignore +++ b/.gitignore @@ -16,4 +16,5 @@ node_modules .DS_Store iofogcontroller-*.tgz diagnostic/ -iofog-iofogcontroller-*.tgz \ No newline at end of file +iofog-iofogcontroller-*.tgz +.npmrc \ No newline at end of file diff --git a/docs/swagger.json b/docs/swagger.json index 88a597df3..a90060f22 100644 --- a/docs/swagger.json +++ b/docs/swagger.json @@ -2,7 +2,7 @@ "openapi" : "3.0.0", "info" : { "version" : "1.0.0", - "title" : "Datasance PoT-ioFog Controller" + "title" : "Datasance PoT Controller" }, "tags" : [ { "name" : "Controller", @@ -2672,6 +2672,30 @@ } } }, + "/user/refresh" : { + "post" : { + "tags" : [ "Refresh" ], + "summary" : "Refresh accessToken with refreshToken", + "operationId" : "refresh", + "parameters" : [ ], + "responses" : { + "200" : { + "description" : "Success", + "headers" : { + "X-Timestamp" : { + "description" : "FogController server timestamp" + } + } + }, + "400" : { + "description" : "bad request" + }, + "401" : { + "description" : "incorrect credentials" + } + } + } + }, "/user/logout" : { "post" : { "tags" : [ "User" ], diff --git a/docs/swagger.yaml b/docs/swagger.yaml index 7aea9f6ce..52a2e1106 100755 --- a/docs/swagger.yaml +++ b/docs/swagger.yaml @@ -1,7 +1,7 @@ openapi : "3.0.0" info: version: 1.0.0 - title: Datasance PoT-ioFog Controller + title: Datasance PoT Controller paths: /status: get: @@ -2524,6 +2524,34 @@ paths: description: bad request "401": description: incorrect credentials + /user/refresh: + post: + tags: + - Refresh + summary: Refresh accessToken with refreshToken + operationId: refresh + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/RefreshRequest" + required: true + responses: + "200": + description: Success + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + content: + application/json: + schema: + $ref: "#/components/schemas/RefreshSuccessResponse" + "400": + description: bad request + "401": + description: incorrect credentials /user/logout: post: tags: @@ -4531,6 +4559,10 @@ components: - email - password - totp + RefreshRequest: + type: string + required: + - refreshToken properties: email: type: string @@ -4542,9 +4574,22 @@ components: type: object required: - accessToken + - refreshToken properties: accessToken: type: string + refreshToken: + type: string + RefreshSuccessResponse: + type: object + required: + - accessToken + - refreshToken + properties: + accessToken: + type: string + refreshToken: + type: string UserProfileDetailsResponse: type: object properties: diff --git a/src/controllers/user-controller.js b/src/controllers/user-controller.js index 5291dc5ec..9cff77445 100644 --- a/src/controllers/user-controller.js +++ b/src/controllers/user-controller.js @@ -28,6 +28,18 @@ const userLoginEndPoint = async function (req) { return UserService.login(credentials, false) } +const refreshTokenEndPoint = async function (req) { + const token = req.body + + await Validator.validate(token, Validator.schemas.refresh) + + const credentials = { + refreshToken: token.refreshToken + + } + return UserService.refresh(credentials, false) +} + const getUserProfileEndPoint = async function (req) { return UserService.profile(req, false) } @@ -38,6 +50,7 @@ const userLogoutEndPoint = async function (req) { module.exports = { userLoginEndPoint: userLoginEndPoint, + refreshTokenEndPoint: refreshTokenEndPoint, getUserProfileEndPoint: getUserProfileEndPoint, userLogoutEndPoint: userLogoutEndPoint } diff --git a/src/data/migrations/20241111145836-create-flow.js b/src/data/migrations/20241111145836-create-flow.js deleted file mode 100644 index 6a2eb5ae2..000000000 --- a/src/data/migrations/20241111145836-create-flow.js +++ /dev/null @@ -1,48 +0,0 @@ -'use strict' -module.exports = { - up: (queryInterface, Sequelize) => { - return queryInterface.createTable('Flows', { - id: { - type: Sequelize.INTEGER, - primaryKey: true, - autoIncrement: true, - allowNull: false, - field: 'id' - - }, - name: { - type: Sequelize.TEXT, - field: 'name', - defaultValue: 'New Application' - }, - description: { - type: Sequelize.TEXT, - field: 'description', - defaultValue: '' - }, - isActivated: { - type: Sequelize.BOOLEAN, - field: 'is_activated', - defaultValue: false - }, - isSystem: { - type: Sequelize.BOOLEAN, - field: 'is_system', - defaultValue: false - }, - createdAt: { - allowNull: false, - type: Sequelize.DATE, - field: 'created_at' - }, - updatedAt: { - allowNull: false, - type: Sequelize.DATE, - field: 'updated_at' - } - }) - }, - down: (queryInterface, Sequelize) => { - return queryInterface.dropTable('Flows') - } -} diff --git a/src/data/migrations/20241111145901-create-registry.js b/src/data/migrations/20241111145901-create-registry.js deleted file mode 100644 index a6cfd9e41..000000000 --- a/src/data/migrations/20241111145901-create-registry.js +++ /dev/null @@ -1,49 +0,0 @@ -'use strict' -module.exports = { - up: (queryInterface, Sequelize) => { - return queryInterface.createTable('Registries', { - id: { - type: Sequelize.INTEGER, - primaryKey: true, - autoIncrement: true, - allowNull: false, - field: 'id' - }, - url: { - type: Sequelize.TEXT, - field: 'url' - }, - isPublic: { - type: Sequelize.BOOLEAN, - field: 'is_public' - }, - secure: { - type: Sequelize.BOOLEAN, - field: 'secure' - }, - certificate: { - type: Sequelize.TEXT, - field: 'certificate' - }, - requiresCert: { - type: Sequelize.BOOLEAN, - field: 'requires_cert' - }, - username: { - type: Sequelize.TEXT, - field: 'user_name' - }, - password: { - type: Sequelize.TEXT, - field: 'password' - }, - userEmail: { - type: Sequelize.TEXT, - field: 'user_email' - } - }) - }, - down: (queryInterface, Sequelize) => { - return queryInterface.dropTable('Registries') - } -} diff --git a/src/data/migrations/20241111145917-create-catalog-item.js b/src/data/migrations/20241111145917-create-catalog-item.js deleted file mode 100644 index 934fd85f3..000000000 --- a/src/data/migrations/20241111145917-create-catalog-item.js +++ /dev/null @@ -1,77 +0,0 @@ -'use strict' - -const { convertToInt } = require('../../helpers/app-helper') - -module.exports = { - up: (queryInterface, Sequelize) => { - return queryInterface.createTable('CatalogItems', { - id: { - type: Sequelize.INTEGER, - primaryKey: true, - autoIncrement: true, - allowNull: false, - field: 'id' - }, - name: { - type: Sequelize.TEXT, - field: 'name', - defaultValue: 'New Catalog Item' - }, - description: { - type: Sequelize.TEXT, - field: 'description', - defaultValue: '' - }, - category: { - type: Sequelize.TEXT, - field: 'category' - }, - configExample: { - type: Sequelize.TEXT, - field: 'config_example', - defaultValue: '{}' - }, - publisher: { - type: Sequelize.TEXT, - field: 'publisher' - }, - diskRequired: { - type: Sequelize.BIGINT, - get () { - return convertToInt(this.getDataValue('diskRequired')) - }, - field: 'disk_required', - defaultValue: 0 - }, - ramRequired: { - type: Sequelize.BIGINT, - get () { - return convertToInt(this.getDataValue('ramRequired')) - }, - field: 'ram_required', - defaultValue: 0 - }, - picture: { - type: Sequelize.TEXT, - field: 'picture', - defaultValue: 'images/shared/default.png' - }, - isPublic: { - type: Sequelize.BOOLEAN, - field: 'is_public', - defaultValue: false - }, - registryId: { - type: Sequelize.INTEGER, - field: 'registry_id', - as: 'registryId', - references: { model: 'Registries', key: 'id' }, - onDelete: 'set null', - defaultValue: 1 - } - }) - }, - down: (queryInterface, Sequelize) => { - return queryInterface.dropTable('CatalogItems') - } -} diff --git a/src/data/migrations/20241111150318-create-fog-types.js b/src/data/migrations/20241111150318-create-fog-types.js deleted file mode 100644 index 8a9607648..000000000 --- a/src/data/migrations/20241111150318-create-fog-types.js +++ /dev/null @@ -1,47 +0,0 @@ -'use strict' -module.exports = { - up: (queryInterface, Sequelize) => { - return queryInterface.createTable('FogTypes', { - id: { - type: Sequelize.INTEGER, - primaryKey: true, - autoIncrement: true, - allowNull: false, - field: 'id' - }, - name: { - type: Sequelize.TEXT, - field: 'name' - }, - image: { - type: Sequelize.TEXT, - field: 'image' - }, - description: { - type: Sequelize.TEXT, - field: 'description' - }, - networkCatalogItemId: { - type: Sequelize.INTEGER, - field: 'network_catalog_item_id', - references: { model: 'CatalogItems', key: 'id' }, - onDelete: 'cascade' - }, - halCatalogItemId: { - type: Sequelize.INTEGER, - field: 'hal_catalog_item_id', - references: { model: 'CatalogItems', key: 'id' }, - onDelete: 'cascade' - }, - bluetoothCatalogItemId: { - type: Sequelize.INTEGER, - field: 'bluetooth_catalog_item_id', - references: { model: 'CatalogItems', key: 'id' }, - onDelete: 'cascade' - } - }) - }, - down: (queryInterface, Sequelize) => { - return queryInterface.dropTable('FogTypes') - } -} diff --git a/src/data/migrations/20241111150428-create-catalog-item-image.js b/src/data/migrations/20241111150428-create-catalog-item-image.js deleted file mode 100644 index b69109136..000000000 --- a/src/data/migrations/20241111150428-create-catalog-item-image.js +++ /dev/null @@ -1,33 +0,0 @@ -'use strict' -module.exports = { - up: (queryInterface, Sequelize) => { - return queryInterface.createTable('CatalogItemImages', { - id: { - type: Sequelize.INTEGER, - primaryKey: true, - autoIncrement: true, - allowNull: false, - field: 'id' - }, - containerImage: { - type: Sequelize.TEXT, - field: 'container_image' - }, - catalogItemId: { - type: Sequelize.INTEGER, - field: 'catalog_item_id', - references: { model: 'CatalogItems', key: 'id' }, - onDelete: 'cascade' - }, - fogTypeId: { - type: Sequelize.INTEGER, - field: 'fog_type_id', - references: { model: 'FogTypes', key: 'id' }, - onDelete: 'cascade' - } - }) - }, - down: (queryInterface, Sequelize) => { - return queryInterface.dropTable('CatalogItemImages') - } -} diff --git a/src/data/migrations/20241111150828-create-catalog-item-input-type.js b/src/data/migrations/20241111150828-create-catalog-item-input-type.js deleted file mode 100644 index 0606561b2..000000000 --- a/src/data/migrations/20241111150828-create-catalog-item-input-type.js +++ /dev/null @@ -1,31 +0,0 @@ -'use strict' -module.exports = { - up: (queryInterface, Sequelize) => { - return queryInterface.createTable('CatalogItemInputTypes', { - id: { - type: Sequelize.INTEGER, - primaryKey: true, - autoIncrement: true, - allowNull: false, - field: 'id' - }, - infoType: { - type: Sequelize.TEXT, - field: 'info_type' - }, - infoFormat: { - type: Sequelize.TEXT, - field: 'info_format' - }, - catalogItemId: { - type: Sequelize.INTEGER, - field: 'catalog_item_id', - references: { model: 'CatalogItems', key: 'id' }, - onDelete: 'cascade' - } - }) - }, - down: (queryInterface, Sequelize) => { - return queryInterface.dropTable('CatalogItemInputTypes') - } -} diff --git a/src/data/migrations/20241111150853-create-catalog-item-output-type.js b/src/data/migrations/20241111150853-create-catalog-item-output-type.js deleted file mode 100644 index 5b1a8d0ee..000000000 --- a/src/data/migrations/20241111150853-create-catalog-item-output-type.js +++ /dev/null @@ -1,31 +0,0 @@ -'use strict' -module.exports = { - up: (queryInterface, Sequelize) => { - return queryInterface.createTable('CatalogItemOutputTypes', { - id: { - type: Sequelize.INTEGER, - primaryKey: true, - autoIncrement: true, - allowNull: false, - field: 'id' - }, - infoType: { - type: Sequelize.TEXT, - field: 'info_type' - }, - infoFormat: { - type: Sequelize.TEXT, - field: 'info_format' - }, - catalogItemId: { - type: Sequelize.INTEGER, - field: 'catalog_item_id', - references: { model: 'CatalogItems', key: 'id' }, - onDelete: 'cascade' - } - }) - }, - down: (queryInterface, Sequelize) => { - return queryInterface.dropTable('CatalogItemOutputTypes') - } -} diff --git a/src/data/migrations/20241111150954-create-fog.js b/src/data/migrations/20241111150954-create-fog.js deleted file mode 100644 index cb97959e7..000000000 --- a/src/data/migrations/20241111150954-create-fog.js +++ /dev/null @@ -1,271 +0,0 @@ -'use strict' - -const { convertToInt } = require('../../helpers/app-helper') - -module.exports = { - up: (queryInterface, Sequelize) => { - return queryInterface.createTable('Fogs', { - uuid: { - type: Sequelize.STRING(32), - primaryKey: true, - allowNull: false, - field: 'uuid' - }, - name: { - type: Sequelize.TEXT, - defaultValue: 'Unnamed ioFog 1', - field: 'name' - }, - location: { - type: Sequelize.TEXT, - field: 'location' - }, - gpsMode: { - type: Sequelize.TEXT, - field: 'gps_mode' - }, - latitude: { - type: Sequelize.FLOAT, - field: 'latitude' - }, - longitude: { - type: Sequelize.FLOAT, - field: 'longitude' - }, - description: { - type: Sequelize.TEXT, - field: 'description' - }, - lastactive: { - type: Sequelize.BIGINT, - get () { - return convertToInt(this.getDataValue('lastactive')) - }, - field: 'last_active' - }, - daemonStatus: { - type: Sequelize.TEXT, - defaultValue: 'UNKNOWN', - field: 'daemon_status' - }, - daemonOperatingDuration: { - type: Sequelize.BIGINT, - get () { - return convertToInt(this.getDataValue('daemonOperatingDuration')) - }, - defaultValue: 0, - field: 'daemon_operating_duration' - }, - daemonLastStart: { - type: Sequelize.BIGINT, - get () { - return convertToInt(this.getDataValue('daemonLastStart')) - }, - field: 'daemon_last_start' - }, - memoryUsage: { - type: Sequelize.FLOAT, - defaultValue: 0.000, - field: 'memory_usage' - }, - diskUsage: { - type: Sequelize.FLOAT, - defaultValue: 0.000, - field: 'disk_usage' - }, - cpuUsage: { - type: Sequelize.FLOAT, - defaultValue: 0.00, - field: 'cpu_usage' - }, - memoryViolation: { - type: Sequelize.TEXT, - field: 'memory_violation' - }, - diskViolation: { - type: Sequelize.TEXT, - field: 'disk_violation' - }, - cpuViolation: { - type: Sequelize.TEXT, - field: 'cpu_violation' - }, - catalogItemStatus: { - type: Sequelize.TEXT, - field: 'catalog_item_status' - }, - repositoryCount: { - type: Sequelize.BIGINT, - get () { - return convertToInt(this.getDataValue('repositoryCount')) - }, - field: 'repository_count' - }, - repositoryStatus: { - type: Sequelize.TEXT, - field: 'repository_status' - }, - systemTime: { - type: Sequelize.BIGINT, - get () { - return convertToInt(this.getDataValue('systemTime')) - }, - field: 'system_time' - }, - lastStatusTime: { - type: Sequelize.BIGINT, - get () { - return convertToInt(this.getDataValue('lastStatusTime')) - }, - field: 'last_status_time' - }, - ipAddress: { - type: Sequelize.TEXT, - defaultValue: '0.0.0.0', - field: 'ip_address' - }, - processedMessages: { - type: Sequelize.BIGINT, - get () { - return convertToInt(this.getDataValue('processedMessages')) - }, - defaultValue: 0, - field: 'processed_messages' - }, - catalogItemMessageCounts: { - type: Sequelize.TEXT, - field: 'catalog_item_message_counts' - }, - messageSpeed: { - type: Sequelize.BIGINT, - get () { - return convertToInt(this.getDataValue('messageSpeed')) - }, - field: 'message_speed' - }, - lastCommandTime: { - type: Sequelize.BIGINT, - get () { - return convertToInt(this.getDataValue('lastCommandTime')) - }, - field: 'last_command_time' - }, - networkInterface: { - type: Sequelize.TEXT, - defaultValue: 'eth0', - field: 'network_interface' - }, - dockerUrl: { - type: Sequelize.TEXT, - defaultValue: 'unix:///var/run/docker.sock', - field: 'docker_url' - }, - diskLimit: { - type: Sequelize.FLOAT, - defaultValue: 50, - field: 'disk_limit' - }, - diskDirectory: { - type: Sequelize.TEXT, - defaultValue: '/var/lib/iofog/', - field: 'disk_directory' - }, - memoryLimit: { - type: Sequelize.FLOAT, - defaultValue: 4096, - field: 'memory_limit' - }, - cpuLimit: { - type: Sequelize.FLOAT, - defaultValue: 80, - field: 'cpu_limit' - }, - logLimit: { - type: Sequelize.FLOAT, - defaultValue: 10, - field: 'log_limit' - }, - logDirectory: { - type: Sequelize.TEXT, - defaultValue: '/var/log/iofog/', - field: 'log_directory' - }, - bluetoothEnabled: { - type: Sequelize.BOOLEAN, - defaultValue: false, - field: 'bluetooth' - }, - abstractedHardwareEnabled: { - type: Sequelize.BOOLEAN, - defaultValue: false, - field: 'hal' - }, - logFileCount: { - type: Sequelize.BIGINT, - get () { - return convertToInt(this.getDataValue('logFileCount')) - }, - defaultValue: 10, - field: 'log_file_count' - }, - version: { - type: Sequelize.TEXT, - field: 'version' - }, - isReadyToUpgrade: { - type: Sequelize.BOOLEAN, - defaultValue: true, - field: 'is_ready_to_upgrade' - }, - isReadyToRollback: { - type: Sequelize.BOOLEAN, - defaultValue: false, - field: 'is_ready_to_rollback' - }, - statusFrequency: { - type: Sequelize.INTEGER, - defaultValue: 10, - field: 'status_frequency' - }, - changeFrequency: { - type: Sequelize.INTEGER, - defaultValue: 20, - field: 'change_frequency' - }, - deviceScanFrequency: { - type: Sequelize.INTEGER, - defaultValue: 20, - field: 'device_scan_frequency' - }, - tunnel: { - type: Sequelize.TEXT, - defaultValue: '', - field: 'tunnel' - }, - watchdogEnabled: { - type: Sequelize.BOOLEAN, - defaultValue: true, - field: 'isolated_docker_container' - }, - createdAt: { - allowNull: false, - type: Sequelize.DATE, - field: 'created_at' - }, - updatedAt: { - allowNull: false, - type: Sequelize.DATE, - field: 'updated_at' - }, - fogTypeId: { - type: Sequelize.INTEGER, - field: 'fog_type_id', - references: { model: 'FogTypes', key: 'id' }, - onDelete: 'set null' - } - }) - }, - down: (queryInterface, Sequelize) => { - return queryInterface.dropTable('Fogs') - } -} diff --git a/src/data/migrations/db_migration_v1.0.2.sql b/src/data/migrations/db_migration_v1.0.2.sql new file mode 100644 index 000000000..8321a99d8 --- /dev/null +++ b/src/data/migrations/db_migration_v1.0.2.sql @@ -0,0 +1,567 @@ + +CREATE TABLE IF NOT EXISTS Flows ( + id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, + name VARCHAR(255) UNIQUE, + description VARCHAR(255) DEFAULT '', + is_activated BOOLEAN DEFAULT false, + is_system BOOLEAN DEFAULT false, + created_at DATETIME, + updated_at DATETIME +); + +CREATE TABLE IF NOT EXISTS Registries ( + id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, + url VARCHAR(255), + is_public BOOLEAN, + secure BOOLEAN, + certificate TEXT, + requires_cert BOOLEAN, + user_name TEXT, + password TEXT, + user_email TEXT +); + + +CREATE TABLE IF NOT EXISTS CatalogItems ( + id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, + name VARCHAR(255) UNIQUE, + description VARCHAR(255), + category TEXT, + config_example VARCHAR(255) DEFAULT '{}', + publisher TEXT, + disk_required BIGINT DEFAULT 0, + ram_required BIGINT DEFAULT 0, + picture VARCHAR(255) DEFAULT 'images/shared/default.png', + is_public BOOLEAN DEFAULT false, + registry_id INT, + FOREIGN KEY (registry_id) REFERENCES Registries (id) ON DELETE SET NULL +); + +CREATE INDEX idx_catalog_item_registry_id ON CatalogItems (registry_id); + + +CREATE TABLE IF NOT EXISTS FogTypes ( + id INT PRIMARY KEY, + name TEXT, + image TEXT, + description TEXT, + network_catalog_item_id INT, + hal_catalog_item_id INT, + bluetooth_catalog_item_id INT, + FOREIGN KEY (network_catalog_item_id) REFERENCES CatalogItems (id) ON DELETE CASCADE, + FOREIGN KEY (hal_catalog_item_id) REFERENCES CatalogItems (id) ON DELETE CASCADE, + FOREIGN KEY (bluetooth_catalog_item_id) REFERENCES CatalogItems (id) ON DELETE CASCADE +); + +CREATE INDEX idx_fog_type_network_catalog_item_id ON FogTypes (network_catalog_item_id); +CREATE INDEX idx_fog_type_hal_catalog_item_id ON FogTypes (hal_catalog_item_id); +CREATE INDEX idx_fog_type_bluetooth_catalog_item_id ON FogTypes (bluetooth_catalog_item_id); + + +CREATE TABLE IF NOT EXISTS Fogs ( + uuid VARCHAR(32) PRIMARY KEY NOT NULL, + name VARCHAR(255) DEFAULT 'Unnamed ioFog 1', + location TEXT, + gps_mode TEXT, + latitude FLOAT, + longitude FLOAT, + description TEXT, + last_active BIGINT, + daemon_status VARCHAR(32) DEFAULT 'UNKNOWN', + daemon_operating_duration BIGINT DEFAULT 0, + daemon_last_start BIGINT, + memory_usage FLOAT DEFAULT 0.000, + disk_usage FLOAT DEFAULT 0.000, + cpu_usage FLOAT DEFAULT 0.00, + memory_violation TEXT, + disk_violation TEXT, + cpu_violation TEXT, + system_available_disk BIGINT, + system_available_memory BIGINT, + system_total_cpu FLOAT, + security_status VARCHAR(32) DEFAULT 'OK', + security_violation_info VARCHAR(32) DEFAULT 'No violation', + catalog_item_status TEXT, + repository_count BIGINT DEFAULT 0, + repository_status TEXT, + system_time BIGINT, + last_status_time BIGINT, + ip_address VARCHAR(32) DEFAULT '0.0.0.0', + ip_address_external VARCHAR(32) DEFAULT '0.0.0.0', + host VARCHAR(32), + processed_messages BIGINT DEFAULT 0, + catalog_item_message_counts TEXT, + message_speed FLOAT DEFAULT 0.000, + last_command_time BIGINT, + network_interface VARCHAR(32) DEFAULT 'eth0', + docker_url VARCHAR(255) DEFAULT 'unix:///var/run/docker.sock', + disk_limit FLOAT DEFAULT 50, + disk_directory VARCHAR(255) DEFAULT '/var/lib/iofog/', + memory_limit FLOAT DEFAULT 4096, + cpu_limit FLOAT DEFAULT 80, + log_limit FLOAT DEFAULT 10, + log_directory VARCHAR(255) DEFAULT '/var/log/iofog/', + bluetooth BOOLEAN DEFAULT FALSE, + hal BOOLEAN DEFAULT FALSE, + log_file_count BIGINT DEFAULT 10, + `version` TEXT, + is_ready_to_upgrade BOOLEAN DEFAULT TRUE, + is_ready_to_rollback BOOLEAN DEFAULT FALSE, + status_frequency INT DEFAULT 10, + change_frequency INT DEFAULT 20, + device_scan_frequency INT DEFAULT 20, + tunnel VARCHAR(255) DEFAULT '', + isolated_docker_container BOOLEAN DEFAULT TRUE, + docker_pruning_freq INT DEFAULT 1, + available_disk_threshold FLOAT DEFAULT 20, + log_level VARCHAR(10) DEFAULT 'INFO', + is_system BOOLEAN DEFAULT FALSE, + router_id INT DEFAULT 0, + time_zone VARCHAR(32) DEFAULT 'Etc/UTC', + created_at DATETIME, + updated_at DATETIME, + fog_type_id INT DEFAULT 0, + FOREIGN KEY (fog_type_id) REFERENCES FogTypes (id) +); + +CREATE INDEX idx_fog_fog_type_id ON Fogs (fog_type_id); + +CREATE TABLE IF NOT EXISTS ChangeTrackings ( + id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, + microservice_config BOOLEAN DEFAULT false, + reboot BOOLEAN DEFAULT false, + deletenode BOOLEAN DEFAULT false, + version BOOLEAN DEFAULT false, + microservice_list BOOLEAN DEFAULT false, + config BOOLEAN DEFAULT false, + routing BOOLEAN DEFAULT false, + registries BOOLEAN DEFAULT false, + tunnel BOOLEAN DEFAULT false, + diagnostics BOOLEAN DEFAULT false, + router_changed BOOLEAN DEFAULT false, + image_snapshot BOOLEAN DEFAULT false, + prune BOOLEAN DEFAULT false, + linked_edge_resources BOOLEAN DEFAULT false, + last_updated VARCHAR(255) DEFAULT false, + iofog_uuid VARCHAR(32), + FOREIGN KEY (iofog_uuid) REFERENCES Fogs (uuid) ON DELETE CASCADE +); + +CREATE INDEX idx_change_tracking_iofog_uuid ON ChangeTrackings (iofog_uuid); + +CREATE TABLE IF NOT EXISTS FogAccessTokens ( + id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, + expiration_time BIGINT, + token TEXT, + iofog_uuid VARCHAR(32), + FOREIGN KEY (iofog_uuid) REFERENCES Fogs (uuid) ON DELETE CASCADE +); + +CREATE INDEX idx_fog_access_tokens_iofogUuid ON FogAccessTokens (iofog_uuid); + +CREATE TABLE IF NOT EXISTS FogProvisionKeys ( + id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, + provisioning_string VARCHAR(100), + expiration_time BIGINT, + iofog_uuid VARCHAR(32), + FOREIGN KEY (iofog_uuid) REFERENCES Fogs (uuid) ON DELETE CASCADE +); + +CREATE INDEX idx_fog_provision_keys_iofogUuid ON FogProvisionKeys (iofog_uuid); + +CREATE TABLE IF NOT EXISTS FogVersionCommands ( + id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, + version_command VARCHAR(100), + iofog_uuid VARCHAR(32), + FOREIGN KEY (iofog_uuid) REFERENCES Fogs (uuid) ON DELETE CASCADE +); + +CREATE INDEX idx_fog_version_commands_iofogUuid ON FogVersionCommands (iofog_uuid); + +CREATE TABLE IF NOT EXISTS HWInfos ( + id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, + info TEXT, + created_at DATETIME, + updated_at DATETIME, + iofog_uuid VARCHAR(32), + FOREIGN KEY (iofog_uuid) REFERENCES Fogs (uuid) ON DELETE CASCADE +); + +CREATE INDEX idx_hw_infos_iofogUuid ON HWInfos (iofog_uuid); + +CREATE TABLE IF NOT EXISTS USBInfos ( + id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, + info TEXT, + created_at DATETIME, + updated_at DATETIME, + iofog_uuid VARCHAR(32), + FOREIGN KEY (iofog_uuid) REFERENCES Fogs (uuid) ON DELETE CASCADE +); + +CREATE INDEX idx_usb_infos_iofogUuid ON USBInfos (iofog_uuid); + +CREATE TABLE IF NOT EXISTS Tunnels ( + id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, + username TEXT, + password TEXT, + host TEXT, + remote_port INT, + local_port INT DEFAULT 22, + rsa_key TEXT, + closed BOOLEAN DEFAULT false, + iofog_uuid VARCHAR(32), + FOREIGN KEY (iofog_uuid) REFERENCES Fogs (uuid) ON DELETE CASCADE +); + +CREATE INDEX idx_tunnels_iofogUuid ON Tunnels (iofog_uuid); + +CREATE TABLE IF NOT EXISTS Microservices ( + uuid VARCHAR(32) PRIMARY KEY NOT NULL, + config TEXT, + name VARCHAR(255) DEFAULT 'New Microservice', + config_last_updated BIGINT, + rebuild BOOLEAN DEFAULT false, + root_host_access BOOLEAN DEFAULT false, + log_size BIGINT DEFAULT 0, + image_snapshot VARCHAR(255) DEFAULT '', + `delete` BOOLEAN DEFAULT false, + delete_with_cleanup BOOLEAN DEFAULT false, + created_at DATETIME, + updated_at DATETIME, + catalog_item_id INT, + registry_id INT DEFAULT 1, + iofog_uuid VARCHAR(32), + application_id INT, + run_as_user TEXT, + platform TEXT, + runtime TEXT, + FOREIGN KEY (catalog_item_id) REFERENCES CatalogItems (id) ON DELETE CASCADE, + FOREIGN KEY (registry_id) REFERENCES Registries (id) ON DELETE SET NULL, + FOREIGN KEY (iofog_uuid) REFERENCES Fogs (uuid) ON DELETE CASCADE, + FOREIGN KEY (application_id) REFERENCES Flows (id) ON DELETE CASCADE +); + +CREATE INDEX idx_microservices_catalogItemId ON Microservices (catalog_item_id); +CREATE INDEX idx_microservices_registryId ON Microservices (registry_id); +CREATE INDEX idx_microservices_iofogUuid ON Microservices (iofog_uuid); +CREATE INDEX idx_microservices_applicationId ON Microservices (application_id); + +CREATE TABLE IF NOT EXISTS MicroserviceArgs ( + id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, + cmd TEXT, + microservice_uuid VARCHAR(32), + FOREIGN KEY (microservice_uuid) REFERENCES Microservices (uuid) ON DELETE CASCADE +); + +CREATE INDEX idx_microservice_args_microserviceUuid ON MicroserviceArgs (microservice_uuid); + +CREATE TABLE IF NOT EXISTS MicroserviceEnvs ( + id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, + `key` TEXT, + `value` TEXT, + microservice_uuid VARCHAR(32), + FOREIGN KEY (microservice_uuid) REFERENCES Microservices (uuid) ON DELETE CASCADE +); + +CREATE INDEX idx_microservice_envs_microserviceUuid ON MicroserviceEnvs (microservice_uuid); + +CREATE TABLE IF NOT EXISTS MicroserviceExtraHost ( + id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, + template_type TEXT, + name TEXT, + public_port INT, + template TEXT, + `value` TEXT, + microservice_uuid VARCHAR(32), + target_microservice_uuid VARCHAR(32), + target_fog_uuid VARCHAR(32), + FOREIGN KEY (microservice_uuid) REFERENCES Microservices (uuid) ON DELETE CASCADE, + FOREIGN KEY (target_microservice_uuid) REFERENCES Microservices (uuid) ON DELETE CASCADE, + FOREIGN KEY (target_fog_uuid) REFERENCES Fogs (uuid) ON DELETE CASCADE +); + +CREATE INDEX idx_microservice_extra_host_microserviceUuid ON MicroserviceExtraHost (microservice_uuid); +CREATE INDEX idx_microservice_extra_host_targetMicroserviceUuid ON MicroserviceExtraHost (target_microservice_uuid); +CREATE INDEX idx_microservice_extra_host_targetFogUuid ON MicroserviceExtraHost (target_fog_uuid); + +CREATE TABLE IF NOT EXISTS MicroservicePorts ( + id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, + port_internal INT, + port_external INT, + is_udp BOOLEAN, + is_public BOOLEAN, + is_proxy BOOLEAN, + created_at DATETIME, + updated_at DATETIME, + microservice_uuid VARCHAR(32), + FOREIGN KEY (microservice_uuid) REFERENCES Microservices (uuid) ON DELETE CASCADE +); + +CREATE INDEX idx_microservice_port_microserviceUuid ON MicroservicePorts (microservice_uuid); + +CREATE TABLE IF NOT EXISTS MicroservicePublicPorts ( + id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, + port_id INT UNIQUE, + host_id VARCHAR(255) UNIQUE, + local_proxy_id TEXT, + remote_proxy_id TEXT, + public_port INT, + queue_name TEXT, + schemes VARCHAR(255) DEFAULT '["https"]', + is_tcp BOOLEAN DEFAULT false, + created_at DATETIME, + updated_at DATETIME, + protocol VARCHAR(255) AS (CASE WHEN is_tcp THEN 'tcp' ELSE 'http' END) VIRTUAL, + FOREIGN KEY (port_id) REFERENCES MicroservicePorts (id) ON DELETE CASCADE, + FOREIGN KEY (host_id) REFERENCES Fogs (uuid) ON DELETE CASCADE +); + +CREATE INDEX idx_microservice_public_port_portId ON MicroservicePublicPorts (port_id); +CREATE INDEX idx_microservice_public_port_hostId ON MicroservicePublicPorts (host_id); + + +CREATE TABLE IF NOT EXISTS MicroserviceStatuses ( + id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, + status VARCHAR(255) DEFAULT 'QUEUED', + operating_duration BIGINT DEFAULT 0, + start_time BIGINT DEFAULT 0, + cpu_usage FLOAT DEFAULT 0.000, + memory_usage BIGINT DEFAULT 0, + container_id VARCHAR(255) DEFAULT '', + percentage FLOAT DEFAULT 0.00, + error_message VARCHAR(255) DEFAULT '', + microservice_uuid VARCHAR(32), + created_at DATETIME, + updated_at DATETIME, + FOREIGN KEY (microservice_uuid) REFERENCES Microservices (uuid) ON DELETE CASCADE +); + +CREATE INDEX idx_microservice_status_microserviceUuid ON MicroserviceStatuses (microservice_uuid); + +CREATE TABLE IF NOT EXISTS StraceDiagnostics ( + id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, + strace_run BOOLEAN, + buffer VARCHAR(255) DEFAULT '', + microservice_uuid VARCHAR(32), + FOREIGN KEY (microservice_uuid) REFERENCES Microservices (uuid) ON DELETE CASCADE +); + +CREATE INDEX idx_strace_diagnostics_microserviceUuid ON StraceDiagnostics (microservice_uuid); + +CREATE TABLE IF NOT EXISTS VolumeMappings ( + uuid INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, + host_destination TEXT, + container_destination TEXT, + access_mode TEXT, + type TEXT, + microservice_uuid VARCHAR(32), + FOREIGN KEY (microservice_uuid) REFERENCES Microservices (uuid) ON DELETE CASCADE +); + +CREATE INDEX idx_volume_mappings_microserviceUuid ON VolumeMappings (microservice_uuid); + + +CREATE TABLE IF NOT EXISTS CatalogItemImages ( + id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, + container_image TEXT, + catalog_item_id INT, + microservice_uuid VARCHAR(32), + fog_type_id INT, + FOREIGN KEY (catalog_item_id) REFERENCES CatalogItems (id) ON DELETE CASCADE, + FOREIGN KEY (microservice_uuid) REFERENCES Microservices (uuid) ON DELETE CASCADE, + FOREIGN KEY (fog_type_id) REFERENCES FogTypes (id) ON DELETE CASCADE +); + +CREATE INDEX idx_catalog_item_image_catalog_item_id ON CatalogItemImages (catalog_item_id); +CREATE INDEX idx_catalog_item_image_microservice_uuid ON CatalogItemImages (microservice_uuid); +CREATE INDEX idx_catalog_item_image_fog_type_id ON CatalogItemImages (fog_type_id); + +CREATE TABLE IF NOT EXISTS CatalogItemInputTypes ( + id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, + info_type TEXT, + info_format TEXT, + catalog_item_id INT, + FOREIGN KEY (catalog_item_id) REFERENCES CatalogItems (id) ON DELETE CASCADE +); + +CREATE INDEX idx_catalog_item_input_type_catalog_item_id ON CatalogItemInputTypes (catalog_item_id); + +CREATE TABLE IF NOT EXISTS CatalogItemOutputTypes ( + id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, + info_type TEXT, + info_format TEXT, + catalog_item_id INT, + FOREIGN KEY (catalog_item_id) REFERENCES CatalogItems (id) ON DELETE CASCADE +); + +CREATE INDEX idx_catalog_item_output_type_catalog_item_id ON CatalogItemOutputTypes (catalog_item_id); + + +CREATE TABLE IF NOT EXISTS Routings ( + id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, + name TEXT NOT NULL, + source_microservice_uuid VARCHAR(32), + dest_microservice_uuid VARCHAR(32), + application_id INT, + FOREIGN KEY (source_microservice_uuid) REFERENCES Microservices (uuid) ON DELETE CASCADE, + FOREIGN KEY (dest_microservice_uuid) REFERENCES Microservices (uuid) ON DELETE CASCADE, + FOREIGN KEY (application_id) REFERENCES Flows (id) ON DELETE CASCADE +); + +CREATE INDEX idx_routing_sourceMicroserviceUuid ON Routings (source_microservice_uuid); +CREATE INDEX idx_routing_destMicroserviceUuid ON Routings (dest_microservice_uuid); +CREATE INDEX idx_routing_applicationId ON Routings (application_id); + +CREATE TABLE IF NOT EXISTS Routers ( + id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, + is_edge BOOLEAN DEFAULT true, + messaging_port INT DEFAULT 5672, + edge_router_port INT, + inter_router_port INT, + host TEXT, + is_default BOOLEAN DEFAULT false, + iofog_uuid VARCHAR(32), + created_at DATETIME, + updated_at DATETIME, + FOREIGN KEY (iofog_uuid) REFERENCES Fogs (uuid) ON DELETE CASCADE + +); + +CREATE INDEX idx_router_iofogUuid ON Routers (iofog_uuid); + + +CREATE TABLE RouterConnections ( + id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, + source_router INT, + dest_router INT, + created_at DATETIME NOT NULL, + updated_at DATETIME NOT NULL, + FOREIGN KEY (source_router) REFERENCES Routers(id) ON DELETE CASCADE, + FOREIGN KEY (dest_router) REFERENCES Routers(id) ON DELETE CASCADE +); + +CREATE INDEX idx_routerconnections_sourceRouter ON RouterConnections (source_router); +CREATE INDEX idx_routerconnections_destRouter ON RouterConnections (dest_router); + + + +CREATE TABLE IF NOT EXISTS Config ( + id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, + `key` VARCHAR(255) NOT NULL UNIQUE, + value VARCHAR(255) NOT NULL, + created_at DATETIME, + updated_at DATETIME +); + +CREATE INDEX idx_config_key ON Config (`key`); + + +CREATE TABLE IF NOT EXISTS Tags ( + id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, + value VARCHAR(255) UNIQUE NOT NULL +); + +CREATE TABLE IF NOT EXISTS IofogTags ( + id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, + fog_uuid VARCHAR(32), + tag_id INT, + FOREIGN KEY (fog_uuid) REFERENCES Fogs (uuid) ON DELETE CASCADE, + FOREIGN KEY (tag_id) REFERENCES Tags (id) ON DELETE CASCADE +); + +CREATE INDEX idx_iofogtags_fog_uuid ON IofogTags (fog_uuid); +CREATE INDEX idx_iofogtags_tag_id ON IofogTags (tag_id); + +CREATE TABLE IF NOT EXISTS EdgeResources ( + id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, + name VARCHAR(255) NOT NULL, + version TEXT, + description TEXT, + display_name TEXT, + display_color TEXT, + display_icon TEXT, + interface_protocol TEXT, + interface_id INT, + custom TEXT +); + + +CREATE TABLE IF NOT EXISTS AgentEdgeResources ( + id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, + fog_uuid VARCHAR(32), + edge_resource_id INT, + FOREIGN KEY (fog_uuid) REFERENCES Fogs (uuid) ON DELETE CASCADE, + FOREIGN KEY (edge_resource_id) REFERENCES EdgeResources (id) ON DELETE CASCADE +); + +CREATE TABLE IF NOT EXISTS EdgeResourceOrchestrationTags ( + id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, + edge_resource_id INT, + tag_id INT, + FOREIGN KEY (edge_resource_id) REFERENCES EdgeResources (id) ON DELETE CASCADE, + FOREIGN KEY (tag_id) REFERENCES Tags (id) ON DELETE CASCADE +); + +CREATE INDEX idx_agentedgeresources_fog_id ON AgentEdgeResources (fog_uuid); +CREATE INDEX idx_agentedgeresources_edge_resource_id ON AgentEdgeResources (edge_resource_id); +CREATE INDEX idx_edgeresourceorchestrationtags_edge_resource_id ON EdgeResourceOrchestrationTags (edge_resource_id); +CREATE INDEX idx_edgeresourceorchestrationtags_tag_id ON EdgeResourceOrchestrationTags (tag_id); + +CREATE TABLE IF NOT EXISTS HTTPBasedResourceInterfaces ( + id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, + edge_resource_id INT, + FOREIGN KEY (edge_resource_id) REFERENCES EdgeResources (id) ON DELETE CASCADE +); + +CREATE TABLE IF NOT EXISTS HTTPBasedResourceInterfaceEndpoints ( + id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, + interface_id INT, + name TEXT, + description TEXT, + `method` TEXT, + url TEXT, + requestType TEXT, + responseType TEXT, + requestPayloadExample TEXT, + responsePayloadExample TEXT, + FOREIGN KEY (interface_id) REFERENCES HTTPBasedResourceInterfaces (id) ON DELETE CASCADE +); + +CREATE INDEX idx_httpbasedresourceinterfaces_edge_resource_id ON HTTPBasedResourceInterfaces (edge_resource_id); +CREATE INDEX idx_httpbasedresourceinterfaceendpoints_interface_id ON HTTPBasedResourceInterfaceEndpoints (interface_id); + + +CREATE TABLE IF NOT EXISTS ApplicationTemplates ( + id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, + name VARCHAR(255) UNIQUE NOT NULL DEFAULT 'new-application', + description VARCHAR(255) DEFAULT '', + schema_version VARCHAR(255) DEFAULT '', + application_json LONGTEXT, + created_at DATETIME, + updated_at DATETIME + +); + + +CREATE TABLE IF NOT EXISTS ApplicationTemplateVariables ( + id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, + application_template_id INT NOT NULL, + `key` TEXT, + description VARCHAR(255) DEFAULT '', + default_value VARCHAR(255), + created_at DATETIME, + updated_at DATETIME, + FOREIGN KEY (application_template_id) REFERENCES ApplicationTemplates (id) ON DELETE CASCADE +); + +CREATE INDEX idx_applicationtemplatevariables_application_template_id ON ApplicationTemplateVariables (application_template_id); + +CREATE TABLE IF NOT EXISTS MicroserviceCdiDevices ( + id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, + cdi_devices TEXT, + microservice_uuid VARCHAR(32), + FOREIGN KEY (microservice_uuid) REFERENCES Microservices (uuid) ON DELETE CASCADE +); + +CREATE INDEX idx_microservice_cdiDevices_microserviceUuid ON MicroserviceCdiDevices (microservice_uuid); + diff --git a/src/data/models/index.js b/src/data/models/index.js index 9c74bfd34..5a2886c83 100644 --- a/src/data/models/index.js +++ b/src/data/models/index.js @@ -47,6 +47,20 @@ db.initDB = async (isStart) => { await databaseProvider.initDB(isStart) if (isStart) { + if (databaseProvider instanceof require('../providers/sqlite')) { + const sqliteDbPath = databaseProvider.sequelize.options.storage + + // Check if the database file exists + if (fs.existsSync(sqliteDbPath)) { + console.log('Database file exists. Running migrations only...') + await databaseProvider.runMigration(sqliteDbPath) // Ensure migration finishes before moving on + } else { + console.log('Database file does not exist. Running migrations and seeders...') + await databaseProvider.runMigration(sqliteDbPath) // Wait for migration to finish + await databaseProvider.runSeeder(sqliteDbPath) // Wait for seeding to finish + } + } + // Configure system images const fogTypes = await db.FogType.findAll({}) await configureImage(db, constants.ROUTER_CATALOG_NAME, fogTypes, config.get('SystemImages:Router', {})) diff --git a/src/data/providers/database-provider.js b/src/data/providers/database-provider.js index 067946283..dbc1e61d6 100644 --- a/src/data/providers/database-provider.js +++ b/src/data/providers/database-provider.js @@ -1,36 +1,149 @@ const path = require('path') -const Sequelize = require('sequelize') -const Umzug = require('umzug') +const fs = require('fs') +const sqlite3 = require('sqlite3').verbose() class DatabaseProvider { constructor () { this.basename = path.basename(__filename) } - async initDB () { - throw new Error('Not Implemented') + // Async function for the migration process + async runMigration (dbName) { + const migrationSqlPath = path.resolve(__dirname, '../migrations/db_migration_v1.0.2.sql') + + if (!fs.existsSync(migrationSqlPath)) { + console.error(`Migration file not found: ${migrationSqlPath}`) + throw new Error('Migration file not found') + } + + const migrationSql = fs.readFileSync(migrationSqlPath).toString() + const dataArr = migrationSql.split(';') // Split by semicolon + + let db = new sqlite3.Database(dbName, (err) => { + if (err) { + console.error(err.message) + throw err + } + console.log('Connected to the SQLite database for migration.') + }) + + try { + db.serialize(() => { + db.run('PRAGMA foreign_keys=OFF;') // Disable foreign key checks during migration + db.run('BEGIN TRANSACTION;') // Start transaction + }) + + for (let query of dataArr) { + if (query.trim()) { + query = query.trim() + ';' // Ensure semicolon is added back + console.log(`Running migration query: ${query}`) + + // Run each query sequentially + await new Promise((resolve, reject) => { + db.run(query, (err) => { + if (err) { + if ( + err.message.includes('already exists') || + err.message.includes('duplicate') + ) { + console.warn(`Ignored error: ${err.message}`) + resolve() // Ignore specific errors + } else { + db.run('ROLLBACK;') // Rollback transaction on error + reject(err) // Reject on other errors + } + } else { + resolve() + } + }) + }) + } + } + + // Commit the transaction if all queries succeed + db.run('COMMIT;') + console.log('Migration completed successfully.') + } catch (err) { + console.error('Migration failed:', err) + throw err + } finally { + db.close((err) => { + if (err) { + console.error('Error closing database connection:', err.message) + } else { + console.log('Database connection closed after migration.') + } + }) + } } - createUmzug (path) { - if (!this.sequelize) { - throw new Error('Sequelize is not initialized') + // Async function for the seeding process + async runSeeder (dbName) { + const seederSqlPath = path.resolve(__dirname, '../seeders/db_seeder_v1.0.1.sql') + + if (!fs.existsSync(seederSqlPath)) { + console.error(`Seeder file not found: ${seederSqlPath}`) + throw new Error('Seeder file not found') } - return new Umzug({ - storage: 'sequelize', - storageOptions: { - sequelize: this.sequelize - }, - logging: false, - migrations: { - params: [ - this.sequelize.getQueryInterface(), - Sequelize - ], - path, - pattern: /\.js$/ + const seederSql = fs.readFileSync(seederSqlPath).toString() + const dataArr = seederSql.split(';') // Split by semicolon + + let db = new sqlite3.Database(dbName, (err) => { + if (err) { + console.error(err.message) + throw err } + console.log('Connected to the SQLite database for seeding.') }) + + try { + db.serialize(() => { + db.run('BEGIN TRANSACTION;') // Start transaction + }) + + for (let query of dataArr) { + if (query.trim()) { + query = query.trim() + ';' // Ensure semicolon is added back + console.log(`Running seeder query: ${query}`) + + // Run each query sequentially + await new Promise((resolve, reject) => { + db.run(query, (err) => { + if (err) { + if ( + err.message.includes('already exists') || + err.message.includes('duplicate') + ) { + console.warn(`Ignored error: ${err.message}`) + resolve() // Ignore specific errors + } else { + db.run('ROLLBACK;') // Rollback transaction on error + reject(err) // Reject on other errors + } + } else { + resolve() + } + }) + }) + } + } + + // Commit the transaction if all queries succeed + db.run('COMMIT;') + console.log('Seeding completed successfully.') + } catch (err) { + console.error('Seeding failed:', err) + throw err + } finally { + db.close((err) => { + if (err) { + console.error('Error closing database connection:', err.message) + } else { + console.log('Database connection closed after seeding.') + } + }) + } } } diff --git a/src/data/seeders/db_seeder_v1.0.1.sql b/src/data/seeders/db_seeder_v1.0.1.sql new file mode 100644 index 000000000..14f97371b --- /dev/null +++ b/src/data/seeders/db_seeder_v1.0.1.sql @@ -0,0 +1,91 @@ + +INSERT INTO "Registries" (url, is_public, secure, certificate, requires_cert, user_name, password, user_email) +VALUES + ('registry.hub.docker.com', true, true, '', false, '', '', ''), + ('from_cache', true, true, '', false, '', '', ''); + + +INSERT INTO "CatalogItems" (name, description, category, publisher, disk_required, ram_required, picture, config_example, is_public, registry_id) +VALUES + ('Networking Tool', 'The built-in networking tool for Eclipse ioFog.', 'SYSTEM', 'Eclipse ioFog', 0, 0, 'none.png', NULL, false, 1), + ('RESTBlue', 'REST API for Bluetooth Low Energy layer.', 'SYSTEM', 'Eclipse ioFog', 0, 0, 'none.png', NULL, false, 1), + ('HAL', 'REST API for Hardware Abstraction layer.', 'SYSTEM', 'Eclipse ioFog', 0, 0, 'none.png', NULL, false, 1), + ('Diagnostics', '0', 'UTILITIES', 'Eclipse ioFog', 0, 0, 'images/build/580.png', NULL, true, 1), + ('Hello Web Demo', 'A simple web server to test Eclipse ioFog.', 'UTILITIES', 'Eclipse ioFog', 0, 0, 'images/build/4.png', NULL, true, 1), + ('Open Weather Map Data', 'A stream of data from the Open Weather Map API in JSON format', 'SENSORS', 'Eclipse ioFog', 0, 0, 'images/build/8.png', NULL, true, 1), + ('JSON REST API', 'A configurable REST API that gives JSON output', 'UTILITIES', 'Eclipse ioFog', 0, 0, 'images/build/49.png', NULL, true, 1), + ('Temperature Converter', 'A simple temperature format converter', 'UTILITIES', 'Eclipse ioFog', 0, 0, 'images/build/58.png', NULL, true, 1), + ('JSON Sub-Select', 'Performs sub-selection and transform operations on any JSON messages', 'UTILITIES', 'Eclipse ioFog', 0, 0, 'images/build/59.png', NULL, true, 1), + ('Humidity Sensor Simulator', 'Humidity Sensor Simulator for Eclipse ioFog', 'SIMULATOR', 'Eclipse ioFog', 0, 0, 'images/build/simulator.png', NULL, true, 1), + ('Seismic Sensor Simulator', 'Seismic Sensor Simulator for Eclipse ioFog', 'SIMULATOR', 'Eclipse ioFog', 0, 0, 'images/build/simulator.png', NULL, true, 1), + ('Temperature Sensor Simulator', 'Temperature Sensor Simulator for Eclipse ioFog', 'SIMULATOR', 'Eclipse ioFog', 0, 0, 'images/build/simulator.png', NULL, true, 1), + ('Common Logging', 'Container which gathers logs and provides REST API for adding and querying logs from containers', 'UTILITIES', 'Eclipse ioFog', 0, 0, 'none.png', '{"access_tokens": ["Some_Access_Token"], "cleanfrequency": "1h40m", "ttl": "24h"}', false, 1), + ('JSON Generator', 'Container generates ioMessages with contentdata as complex JSON object.', 'UTILITIES', 'Eclipse ioFog', 0, 0, 'none.png', '{}', true, 1), + ('Router', 'The built-in router for Datasance PoT.', 'SYSTEM', 'Eclipse ioFog', 0, 0, 'none.png', NULL, false, 1), + ('Proxy', 'The built-in proxy for Datasance PoT.', 'SYSTEM', 'Eclipse ioFog', 0, 0, 'none.png', NULL, false, 1); + + + +INSERT INTO "FogTypes" (id, name, image, description, network_catalog_item_id, hal_catalog_item_id, bluetooth_catalog_item_id) +VALUES + (0, 'Unspecified', 'iointegrator0.png', 'Unspecified device. Fog Type will be selected on provision', 1, 3, 2), + (1, 'Standard Linux (x86)', 'iointegrator1.png', 'A standard Linux server of at least moderate processing power and capacity. Compatible with common Linux types such as Ubuntu, Red Hat, and CentOS.', 1, 3, 2), + (2, 'ARM Linux', 'iointegrator2.png', 'A version of ioFog meant to run on Linux systems with ARM processors. Microservices for this ioFog type will be tailored to ARM systems.', 1, 3, 2); + +UPDATE "Fogs" +SET fog_type_id = 0 +WHERE fog_type_id IS NULL; + + +INSERT INTO "CatalogItemImages" (catalog_item_id, fog_type_id, container_image) +VALUES + (1, 1, 'iofog/core-networking'), + (1, 2, 'iofog/core-networking-arm'), + (2, 1, 'iofog/restblue'), + (2, 2, 'iofog/restblue-arm'), + (3, 1, 'ghcr.io/datasance/hal'), + (3, 2, 'ghcr.io/datasance/hal-arm'), + (4, 1, 'iofog/diagnostics'), + (4, 2, 'iofog/diagnostics-arm'), + (5, 1, 'iofog/hello-web'), + (5, 2, 'iofog/hello-web-arm'), + (6, 1, 'iofog/open-weather-map'), + (6, 2, 'iofog/open-weather-map-arm'), + (7, 1, 'iofog/json-rest-api'), + (7, 2, 'iofog/json-rest-api-arm'), + (8, 1, 'iofog/temperature-conversion'), + (8, 2, 'iofog/temperature-conversion-arm'), + (9, 1, 'iofog/json-subselect'), + (9, 2, 'iofog/json-subselect-arm'), + (10, 1, 'iofog/humidity-sensor-simulator'), + (10, 2, 'iofog/humidity-sensor-simulator-arm'), + (11, 1, 'iofog/seismic-sensor-simulator'), + (11, 2, 'iofog/seismic-sensor-simulator-arm'), + (12, 1, 'iofog/temperature-sensor-simulator'), + (12, 2, 'iofog/temperature-sensor-simulator-arm'), + (13, 1, 'iofog/common-logging'), + (13, 2, 'iofog/common-logging-arm'), + (14, 1, 'iofog/json-generatorg'), + (14, 2, 'iofog/json-generator-arm'), + (15, 1, 'ghcr.io/datasance/router:3.2.0'), + (15, 2, 'ghcr.io/datasance/router:3.2.0'), + (16, 1, 'ghcr.io/datasance/proxy:3.0.2'), + (16, 2, 'ghcr.io/datasance/proxy:3.0.2'); + + +UPDATE "CatalogItems" +SET config_example = '{"citycode":"5391997","apikey":"6141811a6136148a00133488eadff0fb","frequency":1000}' +WHERE name = 'Open Weather Map Data'; + +UPDATE "CatalogItems" +SET config_example = '{"buffersize":3,"contentdataencoding":"utf8","contextdataencoding":"utf8","outputfields":{"publisher":"source","contentdata":"temperature","timestamp":"time"}}' +WHERE name = 'JSON REST API'; + +UPDATE "CatalogItems" +SET config_example = '{}' +WHERE name = 'JSON Sub-Select'; + +UPDATE "CatalogItems" +SET is_public = true +WHERE name = 'Common Logging'; + diff --git a/src/routes/user.js b/src/routes/user.js index ed3bcb015..93eaa1f84 100644 --- a/src/routes/user.js +++ b/src/routes/user.js @@ -46,6 +46,35 @@ module.exports = [ // don't use req and responseObject as args, because they have password and token } }, + { + method: 'post', + path: '/api/v3/user/refresh', + middleware: async (req, res) => { + logger.apiReq('POST /api/v3/user/refresh') // don't use req as arg, because password not encrypted + + const successCode = constants.HTTP_CODE_SUCCESS + const errorCodes = [ + { + code: constants.HTTP_CODE_BAD_REQUEST, + errors: [Errors.ValidationError] + }, + { + code: constants.HTTP_CODE_UNAUTHORIZED, + errors: [Errors.InvalidCredentialsError] + } + ] + + const refreshTokenEndPoint = ResponseDecorator.handleErrors(UserController.refreshTokenEndPoint, successCode, errorCodes) + const responseObject = await refreshTokenEndPoint(req) + + res + .status(responseObject.code) + .send(responseObject.body) + + logger.apiRes('POST /api/v3/user/refresh', { args: { statusCode: responseObject.code } }) + // don't use req and responseObject as args, because they have password and token + } + }, { method: 'get', path: '/api/v3/user/profile', diff --git a/src/schemas/user.js b/src/schemas/user.js index 304068b66..d069afebd 100644 --- a/src/schemas/user.js +++ b/src/schemas/user.js @@ -27,7 +27,17 @@ const login = { additionalProperties: true } +const refresh = { + id: '/refresh', + type: 'object', + properties: { + refreshToken: { type: 'string' } + }, + required: ['refreshToken'], + additionalProperties: true +} + module.exports = { - mainSchemas: [login], + mainSchemas: [login, refresh], innerSchemas: [] } diff --git a/src/services/microservice-ports/default.js b/src/services/microservice-ports/default.js index 83c2d0e7b..a80eca2d0 100644 --- a/src/services/microservice-ports/default.js +++ b/src/services/microservice-ports/default.js @@ -196,7 +196,7 @@ async function movePublicPortsToNewFog (updatedMicroservice, transaction) { const destAgent = await FogManager.findOne({ uuid: updatedMicroservice.iofogUuid }, transaction) const destAgentsRouter = destAgent.routerId ? await RouterManager.findOne({ id: destAgent.routerId }, transaction) : await RouterManager.findOne({ iofogUuid: destAgent.uuid }, transaction) const networkRouter = { - host: destAgentsRouter.host, + host: 'localhost', port: destAgentsRouter.messagingPort } const newProxy = await _createOrUpdateProxyMicroservice(localMapping, networkRouter, updatedMicroservice.iofogUuid, localProxy.catalogItemId, transaction) diff --git a/src/services/user-service.js b/src/services/user-service.js index 50638b1a1..fcbed54d4 100644 --- a/src/services/user-service.js +++ b/src/services/user-service.js @@ -49,8 +49,51 @@ const login = async function (credentials, isCLI, transaction) { // Extract the access token from the response const accessToken = response.data.access_token + const refreshToken = response.data.refresh_token return { - accessToken + accessToken, + refreshToken + } + } catch (error) { + console.error('Error during login:', error) + throw new Errors.InvalidCredentialsError() + } +} + +const refresh = async function (credentials, isCLI, transaction) { + try { + const data = qs.stringify({ + grant_type: 'refresh_token', + refresh_token: credentials.refreshToken, + client_id: process.env.KC_CLIENT, + client_secret: process.env.KC_CLIENT_SECRET + }) + + const agent = new https.Agent({ + rejectUnauthorized: false // Ignore SSL certificate errors + }) + + const config = { + method: 'post', + maxBodyLength: Infinity, + url: `${process.env.KC_URL}realms/${process.env.KC_REALM}/protocol/openid-connect/token`, + headers: { + 'Cache-Control': 'no-cache', + 'Content-Type': 'application/x-www-form-urlencoded' + }, + data, + httpsAgent: agent + } + + // Make a POST request to Keycloak token endpoint + const response = await axios.request(config) + + // Extract the access token from the response + const accessToken = response.data.access_token + const refreshToken = response.data.refresh_token + return { + accessToken, + refreshToken } } catch (error) { console.error('Error during login:', error) @@ -120,6 +163,7 @@ const logout = async function (req, isCLI, transaction) { module.exports = { login: TransactionDecorator.generateTransaction(login), + refresh: TransactionDecorator.generateTransaction(refresh), profile: TransactionDecorator.generateTransaction(profile), logout: TransactionDecorator.generateTransaction(logout) } From 3a5d122205077d37a5ca1bdcc3140afbe6633c8c Mon Sep 17 00:00:00 2001 From: Alpaslan DOGAN Date: Thu, 5 Dec 2024 17:17:33 +0300 Subject: [PATCH 135/178] custom swagger ui x custom baseurl --- docs/swagger.yaml | 1 - src/public/datasance-logo-white.png | Bin 0 -> 31664 bytes src/server.js | 54 +++++++++++++++++++++++++--- 3 files changed, 50 insertions(+), 5 deletions(-) create mode 100644 src/public/datasance-logo-white.png diff --git a/docs/swagger.yaml b/docs/swagger.yaml index 52a2e1106..e2bfc97e3 100755 --- a/docs/swagger.yaml +++ b/docs/swagger.yaml @@ -3064,7 +3064,6 @@ tags: description: Manage your users servers: - url: http://localhost:51121/api/v3 - - url: https://localhost:51121/api/v3 components: securitySchemes: userToken: diff --git a/src/public/datasance-logo-white.png b/src/public/datasance-logo-white.png new file mode 100644 index 0000000000000000000000000000000000000000..15e92a20d79abacdfd8b534a6725b5cf63334f02 GIT binary patch literal 31664 zcmeEu_ghoR8}CWz9YKl|!3IiK=_Ry9MWssb!Xmv$M+k`^u!@L^6agtB5PI(|h=2=1 zsM1N0UW2p%fpE`m*n9tl`@@&#@eya{E%SNHymMy8m-@PQndo`w0RUjqzW0YA0MH-- zfKr~88f;k}YSRS&qVv9I?h616?En0M04ZtQU?arW@U8|>(#N*~{)5sPA73_30CTUad(Q+$1LWw95#c3w=+oFCu8fng@MIW$^DW;mP!uMgGbc zd_a{r4NuM`odRG znSrC7%wS6pihF*4)~n>`Q)iGhOQdAlZANlWAUnXKPmk~&!E1X@Yh9?6CK+8j>#_yA zUUy?-cgtyCV1^DfBc;eB4#L32x93TuGzqVW=v4;;{^O9AT(yI<$=m%wiKck>6)Ry4 z%X!M@-Xj)Usn1X5h`tBvd6^3Bw6c9`EMZDS(UdwvN$H;g8vu|dbVwS($kuqjL+&&FJPP=pRsQ2O#c$8ZBU|VO!`PCe2nTP)M31RjQ>>f z0FY^T%E0Ww#@I1rW<-I|Z98t1HgY6mrO&~Erb*Q34Bf|H9b!xl zvh~=Sx_DKC^$fIhIwVUWi^XW9;2BaX3iQlERN-AK+ksL-aGs&;?Ck%%$x;Y_m7Rwo z?kDB7jqSQL-B;fdBP(F{pb80VQVqYkI(Q(Tfx+esfP0sJe%zk}2U~p+HKe5KHq0JfN&=eB2%7O7KhA-`ne#jLAH3*anNK^fL(JD({H zKw0nx0Mkv<%i@r(RbueSBD1QCw|0ta^LkTs>6-N6JH_ctg_6qx^| zm12Y9qQ0mdxQO-9ZF(No?v9c|`A$_#>nsmPTk7|hB+@jkvTJWplCF_OIi~~3u?e!n z!ShlFjne5K)>g4jW=H*OJpXoQ21D&?Jg*7%73XJsSgTO{*uFA!a4izOM21r>o)W#T zLl>2i_*;`UlEpDa11ERZ<4cL=Gg7Fnd*HxknkChkREV_A5&SR2ouhzcb?xWgCA8@; z)Pe+#yd}t)LG2MGn$g0AS4DfS%V*@)vqm4PEzu7wLSAUV^-j{VnMjvdknPC3Ho2qM+gH?s!aOm!!ArMU5!NJ$&wkbD+u^2kXFyQj0T|sx)VHKLIoibjLx=hgfRUGt z@-+HCQb9`emf8*4uy+!zQ9I9XUm}|X4bUQI-x;!o@_@0|$X#n|NP8?x#zUSPBIW+P zrvFq?`_dMX+=c_Wlxf|dP5;u<$Q>xNrFVl8#zOAe-$X#%b?9MEF3Q>ng~c6jY>wcu z3%Rc>Pz3q-?tRPUxSM^hxE|^B9I2-N$nH={t>0r-y=%o3n%3FH7EXq-Oc)bj2!uBj9D&;}B_wBxopby1xEMzx8+t4B(#~IQp>m)6??B2W>55}3>nOI+_-540< z82fY3jIN-xT-F0=a?jWeC!igYqwfbsuY+=W62SLwJCdIjXn&r=8WgPS$+gk=aLydY zu5d=7D4scsHspSGE+(%@zSG3X4YWvba$v|*?jOMp z&^dTc>Kxg{P0=46#lJSccw` zN5};-Z{=6Fky)2-TvgFYvdz}{Z&c7#@l3Fl51uMfYJV=VX0az2eTHrX9Wv_{Xype< zO9M}6kNsd7wHCAFz%28%P}9sY)IXB8hIM}Ssgc1v>Q^~Sr?QuUs8>0xbun7BQ(Bfs zW@$82_6fKD)dAh-3}NDU0C5qB3FwDcGpCuxSTH1>4_z`_Q<}945X^~my zu2GWCdwilxvs6h#k6#%A>(le1tpc+xVOFJ%A9BDAU+5NK> zvhE$g&6A{o19Q4>RhHh|$N%`q4MBN$lD-ZO`2`DjEDy?)YY)Kl3zYkg9V}z%wx4S5 zZ|T*fLWD2Je@Q4*i%ROXn#;%IM`9M&M1$6!gG*A6|{~L2JFkHva^Tch*q~ zy7?c5w4q@9{=qww@bf2m66c|I+#kfn^{bCTS0g*H(s^ zOjwd<_d1>4j=MDUqPKv5k9g*PtF0{xh&q>wS<)L?cr=VZ92giloAe!BP){>@9k6sv zLS=~9{VNm+0{1QH{=XI1YA!w5p}AEcQg116p^2WJRMT3`Pi_EV7s)DK0X_GvrMhiy zPa$gZD%H3oSrfZ&MgYa>eaPyh-=V_lNS+i?n>_yY2YNf4?G0tnM`KW?dH?ah&4EUn z8X_k;ektSTQ1NHF*j0gCY_(@yG9DKF8(^G5RfUtpS7pd%L%th;^3)B5!cIR(=w<5)-}oMOwr*U>f^yek zBn?XA$!c<+gGhPj{j=r|PtrfTm4Oi^hl~`Pg&GCn{-xEY4WYVo@~gKWT-ra2Y;FiR zhh{_MvyY&%y8l;MR)E3{%(0VxAGJQ6)qZGNFi47ujRwPBAI;M*3g^5h2XLmj2=aM# z4&a|Cv1E`D8u0tf;L@O-%HAD@&gAsunY}2GsecIBuO;i#F9iy{WBAuZUXPbS#@uGtfzIWnk@FHf(vk`tMl z10_1)0mLdvB3^oXuhGZ)P4ud1r>%?Ce5>yBaV@mW%Eh$Yo;6gD*fi!W31r@c;$9WK zXx1A#xWsu04-=L2_4j6ee)`ZM@l-L=87}3@VG2PM{^I{v0q0mC2z|dSv3-Wi<(NCJ zaCJH%=GIJ}ln3W)!yIF@*Px2hnW>||?MCj47KJVNg_y0{+=6Z^9fb#T%2aOnhyhd; zy}W6eDmk4Y{~39i${E~zC~%6WySe3r#Pd;SM0ex<8Fx@mWG73032p=KkNn9D*UOIW zC&+@ew=~K7iFcz&F_a`e9iMk*5L(C<s!Fd#a5bC zb#ag+(!TswII)^ZuuG%vHFlE%`1v?gz_WlKEt2`A(Tx6UU+5u z=4uubd1>rtglxU}!YXFUK}xy9RaB_wkn**TpguBqavC^Xy`s)b&efT87HVGRE`+o~ z0o4~@7ugrZV_gLn6xKeS`D%NT@RLeE1@S9FFQ z*~s%rUd>z5sSN6GFM~L3g+_8LWLiLRObI66G6sXr@qKkU;tw5UYv5Tj;L0GE5}B@G|Cj#X zF3yL_l(u0k8n{^{Ma71DN#?_v{~-bnk)cD-y-FrN{<`;afYF_%pMla&hp~|ZFx)?cYW!{0}4%kS#gN{5^%l=0viWq{Fl{!&ynKHE?YKdFLvyPPO9bAp-XlXzJn=Cu=XflE2@H46{ZS;{1 zCD8;_>8zYH${hb^{L*bDTk0arNd*Evtj=(jfat|dfx^WGSsM27?BT%PU;s~vY2*BCl@&GVG_=aO$`U`HCmNYIgRMl3bvlDvQpl?ROp4YJ_+2c&;p;! zes-Lq-+$x9O#oGmE4D`|Ab6ck&h3ow?! zFdxsEo2PC3TI(1;CbZlbojZ8e7T~W=kUe2Sz|FzR;n=$55Ywz>Z71d#w7KZCQR@XcRvf?nvqv@6sU10e)3&FjaaOe=&C3yyq)J%8z@i!N*S9v- z9qD$DPR?l6{BEu~Cc>@Ya=~1)xDu5$uZbp}r!roRy*ilFo`l&jY(ydmfZ1gCx3GFC z;#E#|qC|<1d}IIg_NbglOauG^BKLQ_Rpfa!<8J%Y)jHCT=?>q(xzm~5Q(qbB9){bM z(h@_r13A5Q8f>?f?G?iQn(n)_>GQ~LKjBth-CrHyF$z>lz8(-2)wSNrtXm7d$}c;d z0uNP2J3M7??#=pszgX=4b8_W`pEpd>QLZWG;9;5n=+8fP{Qc8^cBB_g;YYE0+eCua zmh;_#zx*m64lX#L160a+pAtllj$yS2mKnFoGrk$`^_B?jN52)m7p$>+R}4xoNlBr< zS&uQukXs>rq*ne~&Gq+)R)RHE6EVP`Q!G}s`NJE%kF{YLoiTL{wU%XRkLIb8^jwY| zXL{hC=4!3JS2VPKR9;A^$hzV6XUew`rJbz3r!x4X_NJKV>v-WFqLQt!0seU7D72SI zORzBKvhEw-wjJHNVAhOvDo1e#w0hkG7z5c4Hl72?9(9j3ZhuJn2~X{?_wm~dv%W4F zDrt|{KAkBw$k>q%i>pbqESio@i2T6!LgmJ2;@2|&1)>{g3 zJtwPDrikeq#hZ|xxhFm^3zi)b#d;k!iX*y4woiU`{UTm(t^Dz0r(Vb0$;#6?`48fg zryTFCgM=^CM#&XDfr~9V%(RYP1)>^ND!-S9K<#9oiu*Yie-517X84_?FFD<~bkmT- zbbdQ1ebUk{qW8{`nb`gGkD5P=f9Q4b9L+2g7Tm*()g(K4{pnB9j}J#}`=Tqoe1M(h{yK|ujw!HtL8oB*(B=x z&>*~9onqbB{i;m7*{8u;%>l)2xJvCdYYW8SKg%sz&6RJf>?<}^PC0SP;$<9jx=*hD zz$PAy!RnH{){@C^Ccwy-dl{80BD`F?dQ0md2gI@meBQFv7LKx}Dp9cxbe zSyl)Lt9xfeELjr^C8gNU)Uao7oHvb0==)1GI^;B~&%XRZ$Oqm>RA}$$tPPxd0#FAR zZPN@pXY45Z&}m?qp+ey+DpnS#IZzFP(}uI;hQekdwLWMjN3PY1)na_58{_qJG zqk%wQcH=;IXZOPGR_GuVz^%YaLN=Cpx=KL<$ z3*7n%#WmGUQn`1DsQ~FTN=dNBV0(fam!B1t&Vp}QfjA3x$QF~w zuCRK{5i7mB_2KdS&M(~vi`|>Qqz)!JyN{>jFrGu^V+X!hAX^(R94rUAe(`6qP+yzI z9x6$eG6l4;_72MLlvG%UW7XwjqL%&y*F^#Q-{F*#TOmid#*BSIctBpcSu$_cO&T;5 zYXBb2;*?zBVj_A^+FB{ma-yGx zeB>7|l=BCd?8(a4-LmZ=>|aHx3ruLLrZA~Q#ABPWRR_&mtfT`BXCm}3ojy3WO`oS12ept9Yao{WrRh1KvB|EGH& z57H2&;&9nP)d%SgOZ5TiP8lzP_s76}hBRhTLV;E93L;~{fl>KN&5~(Gb9*<$?2vyR z|5aN*MuL;qq%{-~>@;pQ-XFh&7}~NDcy%0dP~GI^H}Li+)b2U|o*o~KYH)cBPjG%rSeY+633Fwz@d#{fI-p88+Q zE6v=Wq);~EDgy;`232WVhcZp9#ljGWpB6p|9)uk_{i%t;`IiTcIzNffcY}BffPPjc ziKWzh^7vKGQ0SBfMNF}jSx#)?&(=Q=%~Lb#`%0$OY>@OZFCC;_YVG~KRIx1oQgM8@ z-7wt=aSJ0PYAxpDpM3jLAinAc|5!vt`K9R1hN`M72(M2sUg4AymKt0M&mQ(f4M~Xn zQ%fy{O=R%c_z<~E&Cv-~vHJtR&aV%P;a+h@x`{B<3AZJSaq+uZHxc^&E(m4L4c`B& z*eH6%zT8$=12-+IexDib?&Gy6^m@r5> zfb!LtqesPb+dNOsZB^$-erTja-1Xx0X9Ijc1@GU>XI83X=iLl&S|DwP|MY+ApSX%@ zhkKM$Qy;oo zJO2qU2%}jUotT6(Ytfx-FH&b6)%m;3vj*{8(U;wG_MgcOeR7;P0RqnrV4xQ1+Avt8Y?hIPus-R5x+`{rC0Xf=co&o4O|%v;x}5e z=y6*8Z9zpkGSQGS8@bzVu2YZCYvcAeP^X=81wt=wc~{zHG@vvEjxTuEK9c-iCId&& z&Ut3L>m|21=?->`?}$}bWICt!!gU{58jC#QjH(VTNz&vgu(<*=G#OY9@9oruA+FrEhT({(E zAEo)&d#}_V*FOHdAi?}}WyFs*!8Js;o6!P<3Ms2U8 z+J{wJ2Js@-Cqseed>i0Cv@&?VtT>IJ#AI>vRsGN07p+CJVmyyFLogJc+f|{bEcbgL zWtrhR3;UQ#J1-GM(cKI?ZSFS3Cc*ZAAJCt-qtxtpycYQC~(lwO=;$v;h^-kt~X!F6v^qrED1d zxF+kJzcfGX2P*$AhO&Z=O8x2+C+o#=iYhkJ&x(Ohy$A{(1uMtvc|1hj55 z)nTQlCF8mON(86AgWPLo+AmJz%7&S-MO8}tGx7AsqQZrLl?3mZpgMXR(+NdA$|1?H zNZ(aUxuae#QC@zWgpToPqLiK|S_t-GX`xMqA4m#l0qxjpq5Po*ioMH!Waq+J){;RH zB=(8R%ryQva@E$efAx+RL@HIEN?AEfV56sXE}lC-VQaLx51x`w5+}f8J~@pQAE)ts zgAYBU^3E-mT$5*D&WcgoZR47FSCKX6Bg+bUDRQrxoAx0^%g=cOy#?+uwMb!4QaTU^ppCkaX z`b4?K{SQa8kK3B)gciRe*92eW__ySU>+&D|e%lu?m9&dFR!sBieP*FZl*1CN(d{P| zeLAYir!k!i)>SLf$ChHSGVgd7Z`$gIeAV{E(k7|B%XTWZHg9=tiy}YW@EwOW1y!{0 z(MmtPW86T{v$rCU97CIf>m^6$>RfBbI_i2qdmK({63+kJ8&>9JzFZpp!~SY_s5_5$ zYhnRn=iL)U4>2*U0eBPVWno|%)jD~q8ib`OA#qsE3y61MYb>S`SfsCDsj?rl%F^p$!xXa$=H$J3W zR`Vp`P3B?qf_Z(-j5W^XurIk2^7=AhLiK}x#tk1LC4yXAaQd3N{q@7A_$_aduVcek zMOY}if2oP`-`$4(4(4giyE)kz{xmpxrANSN^mNZHMpW;Y>(iV?JNa6K=d+6`r-y@h z39Nu@X=Mr5O8TKAqxyNq@7qcNoEtq$8ArPI{Jln}opqZ;WyJTp4vPx=hb2qw3#|xF zQ4D5#=GM!OMq3yuFJ}KZjikV`ec{3bD(`(+BgjrQjMM24UvAJ#VN|vQZ$8k-|4e7T z*wM)=n}7|;HK^tMiiL6Fv+xA|zNxCZ_X)RA4Q66ir>y>wUyDsoB^I1WSM5}KdT%*F z)*tPR5EiDe5_KhUTFx~^Z`VypBzR)iv-z4j>>W#SAIp3ae>=RD5sry2(>0y3?Cbf< zr|(F+ii3IyCP}c-9vD> zjsZPnA-n^HO9`#sF33s_6K$eqBwx07X`y5x^9?9rg%Q>qx7 z=1w?%F^Auw=2mLn z^7*LtcuFtZ8Z6OJY5YuezW0KodmVzQgGIBB)!(=(zB+d!=8p_b4yl;^$9mxr*Oh`{ zcc=#8w+fc#8wT-GdVfWQGXHS>{+1%@cpbx_7yK(M`1?zjkNS(+#H%GDUY&xcQ?0QS z*Hw2gZQLqeIorz9UG-Nw-ez#Yj{}8|w=qf4p>1NbKUaNgW1b#}pG*~6qwlqXDs6s- zRZ828G||>nnEPI!)%&%ztuZna_(MR$eEAtyd-W8mGIWN;C0*rPNT9$reokA|Bh$@7 z(rz~;c(ktMSMZqZZn=Do1MA4UQKqWYo_O#ZbEWgna*nx}Y+m1ILnf-W5X_f5T<-G} zN#Nwp39q#8!{q;Z1&a=L!dBu`yI<_|Z|g|M ze^X9eX~rH6OOTvQMeu&iZsVZ}k06kHxi}2JwAbMBx+l}(m**;a+RA6oYj0$W!yO&+ zm$}hJ@L=d3Yttwp_lmQt`nUV zIUPA#TxIV1wCi!eTdsMZ*3C+Ll~er4!Ma&kr^U9VOQ1!wN}!FINx;d41kVz4)1&%D zj4MnskjmkLkBE_F?h;T~0P9MNUf5kosc z?L-Ex2GF!}dP{`VDK>(~1H9tsqH7~*#?5}n-@zCkq4MSlFOQkh#!ygAsZ-x|%hZ&I zZ)Q-OEK$xF2A;Uz4+?D)C(E(}zQ9ARU8H#Dma1n3gU%c8akNUu2{oYxm_;v_N*=Qu zDQ8;Wz|$yruYVRd?sF7zZRxi%jgRrpLGdmuP~J$0H29Wu~$#j+_0)9*9ybW(BU+t}AxzN$1W z3LcN=A=dF6t*O^X+Je*f9h70b`C-#l<%j5H`i~-{lMRo#nbVG-g`e{AWo{l1kGQcH zI5mxW>}>+hO*zJAU@CqIvOLD8Y%>I<{Fr|=uKe6Bhey8EE{$r7^{`%P9EWY>LsSjY zhm39u{bdNB=)R0*G000Ez5fw{Uyd_LL}^iu9=))*`y5R8Hkp_tB2_+Fwn07kDG%v{KpR zD=zxS(39Bnz4M5DiPc0zo@#9QU-?C;iz2&L>*hl{2l6MUVfAr3CD}~KopyKBmL$?%<(0eRHlCK<@SyiCl}FBVkwrONe~#52TYZ|^BACjJ zhX(H-F^AM8Bz@=9z#ZEkR^>7QIn%-7N9D%3o&`T3m|w2%p0cHWx*I4vxHP{02H|mG z9{l2_zR8-n*&7;HErlV$aNT0DJJK`w9fgJpy5*`DZNdXH19u8tr`-t&h9{F+sdq*; zgV{&F;v_hCs*d4f#lHm*>{nGO!FJHQ?4KVMPf(8YB|Fy-CXP2TDMxwNW4e%7i&t5a{LWWdwkg?zk3UEiJHcoDh->_ zD!*)4l(8Om;4CWs!Gh`eE5Qy|B6XmA2jy;tcNi#l=afBIHv&H?W%zHnX$Jdt6x#jR zCcrmSr2g8k>5;1AD>tz8|JjhfxOBG{vslsB@4DwjdU!k!UkMwP-O%~9*~{C!idA23 zH;}e1I**xG{aN9u_;*INH6rm&2=$iX$N8n(xeb}dhYwb?y}c7YE!=LX?7Von^?I`N zx~b#R<(b?SU*spq4~dZ$v{9;I?9q+YMA7Sobd(}W(T5-RS0@c%Zof5rz;&z&_ zt-H4|_=0%UWc&mclLk2!tVCsQT{`j9bNJ1V;Pc3T274POc^G&rc7OhJX+C~1x-na% z?xoDoE+%QzqXG3u;4Aj@y18w-=5U2)irlVh9RHE+YpX-HgB#Aqq?65E&2M*fKVL*p z6K)O2|8@Myn8@%jMyd6&q?p~hsre7$wN=@d4Z{`Jrx*~m!lz=sqBG!qG}Xm^xoFDl znb#}92-e{A>ATZHZD#XMe=yhiET1+-xi$@k%c(9AoqMi|jND_GN^QEaLyyggdpmkO zC@;#py&W}ZF6~2kf58JoWF^fwUt3$tW{zjG!2ejLz!klVyx+<)>Dzi&J z!O3F7shAe|-1S38xA}14!ue!d_b39ebmC~ytRN|=}##@#ijt&u* zynFGr!UKtXq;x8!Aq``Hi|nv-dttUMY^0ge^8q8<%&kMWW2n%g+ms?r-)nzOd6u>X zpW8c7u{&^Oz9IzCe@6{{o&v>5tY+p2RuwJ=*Tg1zbh{;B9uzLYc=SmMuBCOh1wPr< z3*z2hmyaE-m6)aiu5&ehqH)Vd1qlVNr+j-ui##o?mc8mQd{-&{d*U(oUfH=9ZH3CO zm!X+3=<}21&&*IeXQPds_3jChZ|$-5&I6c0bJXoHIb+gCi{;KBtCgjapPY4a=SUTa zgIN{1mveG#$|ob{U!$T3HJ_&A!K3c`ycCzbn~%)aUsVa-7F_7@XY;Rf|K0KGiLqs| zO*#WGf>LG$?>G~W01Fe}>mWeMIlqgHq^jL{JlqRbKVQz7D2kD70tGzhX~(Vymz58C ze2$8pQYyU91z_zK#ON>CTOWDT9_j0RzF2_B|J!_+Xq}_Nub*upH{;h<17}z3d18Q9 zp3Kc?5HAe7Ti#+!FK>Z@mTdSEe5+>VjNiGVIzvulo91S_?-anIHiAq&GO5tDtWeWD zmRbDU5x<)79Yp?}VDl3Hp|9}(3S&N;|LW(91pnv*S>%(1;C&)09;mZ{zs_DIG#q0r ziAQc+38*@%O@FSHN*|uG-20-~>adwNJZ~7L|MoQpLZf$QyJJ?tYYl6f2TEoM)rdYL z;8CiDoH%$&Snvq?9OTbX^Y?|+{+1ooBd+1=rfo3Zxe1d6UWvq(m}gb2q-yCwY*B`n6-4%bENTR>&M}*%h@nXd!6a74#eQW#~gn#&dR; zGhgD8Y3r=hc?!j^nh*LBjEq$=7R`6KnF*g);#Qxz;g2Mq2m&O^OWxpak(B7kzE^fC zDWe#tn4bo9-Lo9l)*7p704z+`e&JHWuS;0KRD0ByEk+t}zcO;r6NDv19wHy1^q9<1_f_z2f6&gGFz#ZX-(5 zL)=?(vZTpakzhJm-+I)?di%x+LGdtH1Zc^Ymgjvl%zUKfO)nXRJ^dIBmvNmioi9$3 z6fs%*dX@c=TCuB@^b@`BD=I9R{?%_P8#9d-t4mD%+jLeE2uxK7*yzzm;`a_38GrnW zuVtu^N!$KKmv_IvEENC;=~3~Hyhmk{H>}g*cJQC*jpWOWP9F3gq2i^WC}V-We8&MD zfxR(ChZ!e`w5TLo$xYN+I9sz+seiNbO!vIa>WQh9@1@7?Xe z>nB$jDdLT8kp$Nnlxw9Ah(cb&Ix2miC6*uwgKy5;J(bbb4QS&F1kd#F=|9b zuVNjK*%nrFt?I;q^!_a=MFH5wD26?={FEc!)K8|xHT1NjV&co$Fri#z3LSFEVCNgY za@O&LVC6_rmCaI@A+T+Asdkjc7nM)7=~#eJxT7=D+N}KN&Bp7Ke~J^S(CiOH-$%`f z?R#VqaS{RV3d4MFz&Ln>nq&<|yG2+`EoNKj%8FpCk2C=*;*OZktrHQ-sN7wH3<>#a zE)fJ?0zR^vTF>2U#j1?9$1xfUk1P8wzpd}*KCGK6Q*{R>Fm-q-ZjyZP0;_qeFK#l78{ zg_p;=%3EGNlgB1i$N1<3%+Mp9WL+7GtvgzCj5${b?N$T=qQN$jt?E(s$TWhy837|EU&= zqnfYjpBzi_%qw%*h}Vk75!8>Goe5JPJcc{$*mMgSkk2l(_vJ0Zk)=MI#G3vaj3plB zSBuj3v!~ibXYp5$?C!^JT&pkhKtFYzIIW$RsxZFR>KkzL9Aqn8VuR&av&c*B%7KSj z3F$-vbPVSgFK-|_KtGdM?O&z5C&#y>Kx@Lm=%4RF(xBSfo?*oQi3z`vESYAab7?GD z?X|;*-zGjhCxH(@z(!2KAYuQmzST2uv8~a0(o=qr)M85;mRj@j$mUixf*QDvk(l_| z(Pi9LxN9W*nhl*Z@=oH*n)|#28{kF zZ~t;+CsHjTrNkm{!{vXEcv@3Kr7M1))U5g!9W9dKsWZ!`!th6eRu0@#EM0{MbrZEL zDRK`DKWV{5=@E3eVK8@^#p?+7A?sX;h6bFm|wRw)t3j4UPZt zsS5FgzWQ}`WNY4z>4(A?x?{QPx;DSl-+Y%m&bMyMzK+lOME&Oq_1+Wtuu4P65!XVJ z4tV<(-4M#TcMs34=g=&Bcn|*qzK&%X`kks($+nW-AgcY;#&^r;gp97<^rrfACawrE}LLhF7GRB$G@D zTsN~guk`x%P-9fUcP@|5L+?7Vjb*f42QP+oXVREBZc``U;o3VFbu%($Q=pYPZ}4ut z(BCKE#n}tSGy>3BzuOOlHIw4bGb7RwB<0P3%8;Zum;hn{Bc0zL@)XA-V{)2KQ}s8T z2buUKFrB9>#dq>sYhlFDzK{~$9epo_#YZpG1d4MRu1olqikt(TC21jdV13Co*sCG-z0eYu~0cf%eE#c_O}Ezw6R44b|C-5DNT!z8I-ZRMx7ye%LA zYvnu1wyw(S=2FhI$&QSgW0rO)O_98#D&RN3nKl1o`y$e1c81XA;qmLUqP&jK2`BM4 zUIKS7IPH_)(;azY$@F(uyELYr)$HED{cHXP8P;g&me-232)*m#$>PD7L+O23fI%t1 zU6%x^A8)EYvi|Fdk;m+K8JA6i-H`B&?xQo>KFegUQul-=n-}}Cfmx3Tby(y+gJ!*DBG_j0* zHoxP}PRt}oJs*!OgV=Ef|3a{H#keyQtmQv8i4e8M7!J&==S>EJ6Nssy$Dft@j^>{R zG;|?2I>&+H)z7e2>WA4eieJh{&Cw$b@;({%;Qev|7s(ol)ty_{O=dC{C&%>EJT#U8 zsnmh_)9gB0;NkHjkr0R;-T*duqQ*T{*MweblIkK6E}gfBs4|OMcGWC8U%*Me=|*cKTabRY@Thf^Nc?EKA7GHU*~$%V)*eD;z!NzO_xKu@t*;N_2ZKE2M_DdO^{o85 z%%}_5>X|+0Jvj1vT?whv&Jp((zvUn@6Mc!;3e-hD-U{L*%D$JWAmB9&ft!5)w^bYahP2&he*Ja@{PcK?}xyucgqJ_u%w?~e+ka$lGt-%6NQ8WUQl z0flKqy7)mn4sN{xUxFNbu`=FOUahM18b3BlhloAc<8n(RP?Q9RPQ0qDb3WJ1|Hd{7 z-#NeW4OGjFjsp#_vxD%w6XI(?4FyZ_vKsTG}4uq#VK|-$@L!(*i{%~sl?Z$JPxr@+N{H3EdIPJt2Wdp&H3Q`NpV=38h znbLtzpz2K0y*I%J4+tlzH1_-r=Yl(9AfP-{5Y8zylMn5&rvB$%5L-fpDpi|Y58eh0 zh@y8}Tz1r;tKCni4b!b@`_qT^sk0^x`UfS%TTYWUjq|=T?FPkzkx0RV`P{o$^9jKpVI@{h*ct?>%k3qqa~jBz;1opdP%y56`-#TnUC7 zwEZ3sp|_SAh}(RPnSVN!vxH}Kz2bJFkgCK$kt3kBlSZbF6vnCVYR`J1)F{jzdO}h* z8?Ax(zemvd*LLH}x0m2Ag#Ud0F?OFiOp4Dd;=M}G2-;fOUb?U5I~zdSKtRxrck$pIY3fdPHkn5!A&cYXbWL0Hf=P%_4#4@g za3YM^BV+bYL(Apadn4#@T*Zl5$b;pk-o9)ADA~~hyg!1kb>!P$d>fk0-cQ&oK*YTj z&aucZ0j{S65cN6Ly*UgYEMs?0Dn)|RnwbEcPzDu{M2CD%bo&#Fo!9o33_kta11S5D zbm=(q7j1Y{8T zQ2kmb0dn5$Jf$k%8*Badp7LQOS#0ugl?W#ADLU~`=?!?nZ_hOcx}xQ6JEo3QJefn0VPSHyOs%ztGZ$dpza}qGj4O+#z@>qu$fzE@d(!! z<%<(D%7Tck_zz?KDNKZ8WuoWY4}PciUu-y^`dG};or@PF2JE14zLi!;(S6O3mi_jp z7pKfiG(s+3#s9LGF-CM`j0jm{p+eUmGE>N^Z*LC1+cn6O2rVsq$HkwX=TMg`*S<9F z9my+9syt3zVMWtMlYXEM z=5$C1>}MAx__~zsFmi9y*+GAVt6`!w=up|Y{Mz&-yMrr;O)*x0{@rH1b=6WCT8JNy zZ!Xr^Z_k_eB`Jeh%zC{&E3X`zmw1>%NU5sZdwf3gck@i(<1{Ay_|?vZ6@}HquYWWp z4Ti&n1VPgsC`^1rO4z^8Gn{n3tIF5P*pwUAIu_JLWjzg8t=R1Z z>x^eIZzhN2S3H0&MfaDc5wPyS0_>9HO$hj~Q39{ICpOW~($#}&sWB*>_D*vhm_n+K|Pc%Q~Pod5~rOv(I7o5DKR8xS!=lv>p5hmXkg+IyK;zIopT21>l#?%!t zn@;@WfMMwV+}P~BY4^bZp?v#2?e$WHH?^_s7dppRY)(Cfg(I6)8JFfFLT%^~kO_l1 zm1c(IJ333Pkt{#%1B|geLYEC4)gO#h6sX2kzC8M3g25ilJio6J*YG82UO2c-M*v;q z!yTI5j+3+(pw0_e)2JhA8>9198{W<|HlQ9Tjv8(iHnOQji11?qAwwt^Fi1GMEiU>>WZRAN zx(v7@oP=)mM(+@+CnmJyf)hnmaSid<6f(4&ebE~IniAcgJhe&~buNs2@e^|wCH2?6 z;^i8Meku4qNtLf4EK4x|zX& z>lqWsn~}RJVxe{>;FrsL*|T_1cJ?PN6&q(Q8fl!7$347=F%>N$%dUOzFrdoIyMQ^2 zkGN_#l4=@qzDLn`&lRS^f?q=y#g#c2dBokg8$P*9!n)F zph>~Qgox)7%8h$uPIP*#+8>@%h}m4Tie^Gh=9mmbOC5L=StfP0Ru&eW?6d=R9!IFS zfVzh{xgt0n^g~LtetlFs*0&fbT>erqje+?5&affV{$=Eo*I*uW@}_?=^tC~*T=zj_ zMJg)dsVrI%+{RjP4jHzjaB3BVI>|!qP-gA3UIIe7d6)kJ%)W0~=}LN9f6(Iwm>!H0 zyuYj|Z*ZkqXyr)-ajlgP!`7?U37%<8Wx6r}REJhdRzll>!93EyweDTYb zzuiBFhSO$pR2NN+9Q~hmzVolC?fE+NCZHmqvVX5=8+4feX?M9WK&KkPbD0$;MO zrT8Xi51!PFnB<|~7=L(R=r9Wn9lm7DoO@Z(n1!6Fd;KWIS4;|zlR9@Byru#&D+llo zooLRk5lvO2raOXkGDctiP^!Ui-DTngOy1=be6*%d=aj4Pm|!Xm0!oPAd6G5l?Fr9u z5%qa(o^;KhkI(HsEr?}tFDzoJ>+*jFaNJ&>VMr(2gHNiI&juw<3^6^)w>>2YP_yZ3 z^f);@eJnw+pT;eY{Z_8awfysd(VjpxZ`LSDrQ?!9Dj7!EU#5ZXZ~*JDW5uNXXo@l| zB$Bxy5)jk2+Du70C$-H!g9w2_Q0S+ek-j#~0#*-)_dlno^8%0+AP3F!?LVf{b*yEH zNQQoj0$r4pc`OMB!>lyw2dw^CLjG%F;IrAzKi{3&~={7~t# z#w2Ps_Qlx%K_I=7(}{Jm{FRH{s$F9EYBBSyXhgnG&dpV0+~qD+feuKGA7mJYDhN5_ z36A~pw3D8!*CyF*{+@R1PU`#%w7Vb=(dx*PXNoQ&x&F5zUL#JZbf8@iw!Xs4_{lzX6OI44UZ{7Cp=xq&j08LTSJeIUEcHpu`MNAf7PVhMRP< zh6~{$YJClwVCnaHt1Z^U?VTFAE7sMAG#xoWV?fvI<4oCwcV00Q6ZbHw^%1RC0VxT) ztYdVqov_FR&gC4WA+-M6x5L!0+AIi#7=ph6VXhIn*v|wSa^T+$T18>6G`u=g;ZA%B zx~S)Lu{pbn%XN%Qon;}C?OZMj`O|&O=GZKZXJg|LZ@%SHBtjorIjP<_9co1P+%r(5 zuIf1^mgC2)6TOXM*wofR2eG3fZ3F?ax1K+414#@nnV2Z_QaOa|`F&UHMC5!Xka(8a z2wNDG$)>WhRXAAkEQwVPYNx`H2uR}a$)7Q6dW#w+e>N#;6ktx848?s)%yd8jEecQ# z;x|vnlLFf_u0RduAm_jJsJC*Ij#`dAbVBt2CYPr3R)y%za1l#Pq%7L+F?VhIdVwv6 zh~1!?TtJ_qC|>(I2&#mu%c-hK3au|hf^CX=KScun`Oc~-nlw6A9by%WRuo~eX!|}i zAGx}a=NoPTnyQkfpH-xv4Z6rrPr2{G(1@*TG~w;EG!EH>D|mL50dfxI2E$~?NDlaI zbgdzf-WtoiYAC6p6bn`Ay{m_ib8*W1Xz>r$-zziB$0)(4FvUt(UKEn}@I`R%wi$t@ z()Z=_16GGu&nKW6D4pMG`<@}Pg` z`W1zr^Na`v;y zp7;ZKV;iGJVakZbZc@X=R>F2V$srv&LQtP(g(;G75{gO``R<9>kdOYYujpX z_|)7=4m8m*Jm*1e@3(#{FyUPZm^)GU$*xs6I+bUeM&=J`WMF|NDU8By7YWWCMRy|h?V1FWwma{;%CfyU_LpC zv*I46Xxl)^!;BUAw9canDMoKoliRPJ8dT?B=Fv*n8j`)0Bd`(gT^%M{s>q=|syUs? zT%;`xG2tQ@PRv}1#OL}Y_&Hj#hA)k%s~#q5>XO{t)5*R4RT~kCw5&2_Q)$$peV%bZ&;D&YDwV7`jRn_@@n@BlTF_xcsNIozRWiUGUG4Mz zL5V{v!F$($e{_h`8=ElXa{6HX2H69u|b=u&^Y5!+EYeFVw!GXvqrG~w0jBKn@^a&Yx&c|Mh! zju(!;tPvBDyIOo2z)TenBw)D`7{&gmZ6zFFsFV%V>ik1rfPmpTpwqqqtS78l&O0|D zp+!sB;5axA3Jtfxns1g=(SA%OYJz>0p7&V04=oY^XZyZTYP1|`1g{#4aCVSWgQ>CR zlc@l{B>gsxLAsH>#?Mi0Ht{eBx`@%dY@t(zOCAHaW z-KkOu09$(oY=GD0YTK{CXF(kcLgDeIdtZW!i!V4N+FSIsqb<_HXGb9{p3($qBM^Dl z0NlH!17Mp_(8!v4MK1OjmX8ZJudT>kG2%FRow6jjSTUHq0$t5rMKRy8AalT;0dt@#-t7a>RZw`E6ZTse1&$m2x%!VxE4uK~`E-rB4y zriwldzqSd_8(CCu1c+qBwR1aXw3RHnzD?kJ6BAC*{pHx-Q*6CVQM4Rx2L<#*I zm4|+EKW8#?w-|SL(UDw2mhBl?p_^618aJ~{ssKTg>g{VUsi^4YJJ#NyT|_^leisX# z@pR6}Tin#(5H+0K_OW!cLnmG1f5smAv{5Jc=!aTZG#U#a!VH}>VVgS1~HO9A~QEW!F=<2NGAi%y)VY%l{Ja+Pi}T8Rk9{ryJT%(W>DJ#wh=~M&-=*j+p}heZnolY6N>;U6C#8UAUGy_i zj_(=1$u-bo)Cdo-OYX^=N_p%7N(D0|$e-bWbL5fASYtYl(5ET=?A$Hn4V7~zCTk^m zqkf#RPqMfe)n58lnlPyVP|@w(UW2tE&D>(h?@{A~G^(RgHu|6!4JMK8fc)^p^6TG( z%lGe%Z|P7VUGIC|mycP4F~vYXP31^;k;};y-Be(I-`Pk8B6m9~@FbgHJ8o4xZZaRs6JSKIJqEYZx_fA^Gvq zx~{>bbnW0hg&BEIHd>y1PS%zd)7{jJWx?+WdRl)Doq0&B8-v>qzV9LLyx+VJz|vVl zdpaTf{v29x9FApadbt-acznD$K)~xA!qBe{vQHOvhw`z<4}Z43roP9Uh;V%A8gT#X z+lL4F&@GgQV%p)DDMvP~6G~>Aj8W0h3bq-pdz1-oimmNvK@I&@6b$XIDoeX-*(TNr z-J`YSa``N^E$PekU>29AP0Ku2k{9cBPBsS=G5k?l1R5oHN?enki)tK2~|3lj>; z4IYPdomdUd?Krkkw{Ab%Neg|kz+xN3TI}!-2Czr;?2dE&-EACz*E}AGps3%7Ej(!Y z$lR24nX@WM1Uuh&6T_vAge7~IS1RZf7G=fkRdzh0PVAiDdLk=k8k&<}ZQt^#B+Pz( ziBw{cJMGnQ=`GyFO68Nd&VWc6F4LntZ7I;8^E4B^(r}y+$9A8zjtTsWqSKp0>k6sp|Z@t^EETG2fmOCv}l zIKsDUR8Y|?!Vq87TBeBe$wEu=^BHDwSw|xxlF#I5MiWe9@dg`7lU@5-BmKc~X$g?* z;;L{^O&r^tNp?Xg%dOZUZ)H9gQhDfh-qC^#2E5WV$;5Jvr8##d+F5dCK~*aAE99() zSO0nzkqUFHj;4ACw?kJ)JJ7`5b$og4MMrBLP{U<9N(Ezc?qFZy`bB4z>Tb_9^T}_EjrblVzN;G-fM_?|<6oHe>O!5n( zR6(%j%~4&{nVUJS?j~&5!2=T|IZh-+FZAHIE7Y1Qsku+d+xE_$2YGlz(7H-Yx%m~4 z)jLoCFk~>;X&)*3>{k5ASO7K)P9hb(ovWj{qv1+N(2|MPr89fQaLQ=r!<>^w) zMGxrG{aBNs*7;Jn4tqGp+$EDVka;14toqd>d*kmgNj4MAibD?{O+yiPRj`JXW9Z*OR;{Khi zr{*&vZGpXPzrSf#@%3F0=iW0P|6cz$YMp9nHqVqg_*3fffPcfQD&Yc8LN!tFB#Aaw zVo19JMcmw@3R}G0a~uDze)ofJ4ICMKU4qB!Be5{i^z&uw2cW5Tbjh^OL-dHy+br|( zw}=rD1e`5IP_|(1#dSCPK-YjKj7#!ylk$9`)|8IasXPGedU@CK?o1%&zQydsVEC9k z7)T9Ek@DC1lj@S*gA!u}jJ;Vy65_0ez@s$+iNRVtPm;_MpkUk&Od@shsITB^u}6mD ziN8=d0XnO=BswqA{#De@Dxe&@JMGVXe}g3u{1tg)^5q)2oWX$yQm!`G7TP6UqbT-E}#og-!s3=MN~KwM+S*gK~L>?OSe;bw1er$08Pn; z?@qzIqLG(dYxm6cY!oe($<-Ss1ZRHr3Zf@gG~3N_HWHCL+J0onTE_OF%?`f*a@88L zH~5OLT13)Dl|Zcn`npcP<$XxDLG31Vj+3Rr*SeD$*!NHAA@Sie721%EFa@DWVt}fU zGxtCR+;BDH)LXHqmD9&L`WPLBzY%LXxIwR2nHGLNB$Yqs_lg53?c4tu#Dv3klh&>2 zK>~4UzBtk%mx~uzpFcnWpAa&Wdu)a+{Oe0#Y!#Rv^xRQtc4NRLQb&~Bn-D(Z^X<#G z-SV@0sR+0bcXV_D+sbYbZ*zVloA#|>!R1m4b8*gL!mE^mL+Y#wDBboziKb|Sh?blc zTi8B{4t2W0NTZ~^Bd+b-vZZ?ks<8{avsJ;;1_4_sUebv@D{XZAA)5)*rg|mn9P>>tgtVH3 zS@^ZRl8LA&1&VY5=F^yb7eFw$w;gHw>vE%XZlfP|!y=JSaIv*Mmu_3zyhAnV+dF-Z z<*xa??%wDtm1eN@T$;pV=vEo5B4m+}%3(a2KOSe4sQeoR9O@@+o4f?i+ zGSe1wp1bpd8WJAZZ0iVJd6OcN8gv79SDTDkocx3U-{IQ=q^M;W@%gRPvquFx3(6}k z2Z}|Hz7eDq#+Zwg&U`iwFcqu(%?@DjBMW?b<>y&tZ#3?}&y4;-QNeQyc^}D?UW29swLKbnQ5F zPl2OIqQ)Rqf=8nw3&+m#yCK(`vQzhu8B!%Lf;SbInDvJr;pupYv&8}H@?roxQy}jW}%>(drC*ga`AfU|C1 zj&5H3RMV3gHhO*_(Nj?*dQ*DJ3d~`A{1&j}%FzO!(XqFz?ZZm0Q9OGE^L%hk!u;UD z?f7eF^PUu(47gyP)k^t%zSqz9d2Po)OCq6qp)5T^&p8=YHJ>eX@5WXpj9eX)v$R6W zVJNw_aG(SThIOQ5aAU@~>ehF?7IP?!hAKc9vqUzN28?Jc+-LesD5S$&t7a+4~5#t zUbpNw9P$qG1z$#xZkFA;t1r;8+aj=Amez)D_~M@r#GvBtP5l z8;C6w3J1G?PqZkgU@Owr-pg1hKbvV8Xh=hrR`hO<28o5^h$)k&Z$3LuchOFvZzN)mY@=SNBQR&E6XS5~4P`R5m zwEK_ptbM&A5(^p;H62ehlj?<5WSYNG(fTTe3AAo+-MXXNcp<1NVJXVv#zO4{Msj%N za#k4MIzWezl=y9n@dsKjpXMC{3K;i<+z7O0g3w;He?rCbq*(Lrcsn}e>5%Vb5VRS7 zdi0zR0e>z!eYr>5>0EO`HW%YWYMkv9B%9mhioRNqmf1*zVpxBdji}e9!!dm`w+Oq1 z&W}FR+4lSuZv33?sP~YtR=e&G+3m0@6FRed?Dw~x%Sid{Z4Rck9Stiimcru+Qk9Wb z(U$8=JR}kAf?cds zzjMwT5iRdfpU%Egf1Xic!#GvNd37eSaIBG(GLo_CF9^EX)zqvjS@7Ha)fWB81^OhC z^Aj-dg+FYe`s@FkjG+B}WwUzA`Go!v$lbgS3C1eZ_AR61t^28oLtH_Z#Dycq1=q6u z3~YiS9-bE%b2}flAdUxo_ph3=$!W2M+$QrQmR7G~E$Q?gUL1+B48Ya#3^)H?u?HWS z7yq4g#zyTC z`1*}OTg36M=F)I<)Cj0uAj&p1dSNn3X}xnEY4dsM&!#ob(!zpa80871=97%B-ih-8 zvl&_|>;1Qr+EC4@u^|JPiq6m7&^?BI&&;#63~f)%Lhb-ti1&2wGPz7p=+%sUU7!B2 z-VDj|(PG05ytX1dp&CqJ&TC!{lsI#v7s`k)uc`1FuC*>6Dl0p51piNVECrB|d-9;X7cyTJ>nU87FZ*jf4Q!OS?7O7BJAPOi>48EJX)HywWp$%rwn~90 zeP)vX60G@ZMQ2@tPh(CMp8L7nU%aC>C&h#4^`>S=jn&HN`S4pgLG-DobPDZ1!;SJwwVGpaVOhRaFP&}zZ}m7= zS`slpS;)FWIU4{G&UEPT7$i>+5s%^Aqoge26=8zLU30zcwT!(RH?N3zt?!OM`89Ma@bCw{{Ye01`+ifoaJl5f=j(hp2~r3bXo zW&|5qeA|}%%eZChXCsDrJnGnHA~JxMv&r(Pm$s4q2RZkgEIji86KYAa(J~iOh?mF-&-@ z0CeC~U6`jVF(fj$Gvbf#I?KGX&49Y)4~AFPBSVl#`33$+=-#LUyNuo?b}AD2CWlmF z7U)a9AdqKPVVB@CzqWCf*}wmp?;;U)+{6)~73UoTEGW;Ht`C}Q4tjhU&fkIEMF=Ha zb9Ni)I5{{#6Dw*ZHL%7CNP~BScAG;T=%f9U{`)RNF==SOE{>z#`?*mHGI={-!kGK9;K(I1k9CkZhw*IdT4s0jGhX)j&#GAq_hR;_>nX7&G z1kB#_+aB`qh8GJO_y7Z$HAgv0u13zR*HnS=KQ(yEjJ`5$ zkH2_qZ*8>=$A=I$NOMhVOk5sbD-+n7$wYCb7~cBr430HoMleUWhMiEHT zA4^T2eA~u#cyzG2MVx+VIPDFa{o+b2>F=G<(t8ZD0J*2@OHTV#1pF&(n$AW)OFxeq zM{~xD?fk27nXUz7MtSt9DSiKncZMzk8RUEF^nogLFL*AXp13cCVn_We&1l9z=XL+Z z+5K_KAA2wB{4VN0Xq(Xr?SF!pHtLMcQJ2(aw}~X$th`|}O@1$f3@!-y-@|w5yuu=z zN6+v7s{`813H(|>Z8o8;W6-R+`ap4=H2JR-C&&ws5^dQ^Z3c+6+fL>M>l-97%JCJ{ zMBD%LMK?7-7B!-bn=f$g75(RfgmzBiFec;wQ;`R@z|`&nBZl9>l#z-oGbIxawvVkj zg8p5FjTQYYJEtw>*?xemkaaukjGiX{_VV^pMvwyP1hrB^z_17W`^#AXsN?J!ZndB0 zJl(Gk3Az09Ux)plwB>&v|9Rj)5B%qW|2*)Y2mbTGe;)YH1OLByAk^;&ewDQ { const userToken = req.query && req.query.userToken ? req.query.userToken : '' + const baseUrl = req.query && req.query.baseUrl ? req.query.baseUrl : 'http://localhost:51121/api/v3' + + const customCss = ` + .swagger-ui .topbar { + background-color: #10253dff; + } + .swagger-ui .topbar img { + content: none; + } + .swagger-ui .topbar a { + background-image: url('/datasance-logo-white.png'); + background-size: contain; + background-repeat: no-repeat; + width: 150px; + height: 50px; + display: block; + text-indent: -9999px; + overflow: hidden; + } +` + + const swaggerFilePath = path.normalize('/home/runner/.npm-global/lib/node_modules/@datasance/iofogcontroller/docs/swagger.yaml') + let swaggerDocumentCustom + + try { + const fileContent = fs.readFileSync(swaggerFilePath, 'utf8') + swaggerDocumentCustom = yaml.load(fileContent) + } catch (error) { + console.error('Swagger YAML dosyası okunamadı:', error.message) + return res.status(500).send(`Swagger dosyası yüklenirken bir hata oluştu: ${error.message}`) + } + + const swaggerDocumentWithBaseUrl = { + ...swaggerDocumentCustom, + servers: [ + { + url: `${baseUrl}` + } + ] + } const options = { + customCss, swaggerOptions: { + persistAuthorization: true, authAction: { userToken: { name: 'userToken', @@ -277,5 +323,5 @@ app.use('/docs', (req, res, next) => { } } - swaggerUi.setup(swaggerDocument, options)(req, res, next) + swaggerUi.setup(swaggerDocumentWithBaseUrl, options)(req, res, next) }) From 5a0a4d055e6f4fd917c368295302a07edc2b0ae6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emirhan=20Durmu=C5=9F?= Date: Thu, 5 Dec 2024 18:18:10 +0300 Subject: [PATCH 136/178] release prep and ecn viewer version updated. system apps endpoint roles edited --- package-lock.json | 457 +++++++++++------------- package.json | 9 +- src/data/providers/database-provider.js | 2 - src/routes/application.js | 2 +- 4 files changed, 211 insertions(+), 259 deletions(-) diff --git a/package-lock.json b/package-lock.json index d8720fcf0..de7c2f3fd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,16 +1,16 @@ { "name": "@datasance/iofogcontroller", - "version": "3.4.3", + "version": "3.4.4", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@datasance/iofogcontroller", - "version": "3.4.3", + "version": "3.4.4", "hasInstallScript": true, "license": "EPL-2.0", "dependencies": { - "@datasance/ecn-viewer": "0.3.8", + "@datasance/ecn-viewer": "0.3.9", "axios": "1.7.4", "body-parser": "^1.20.3", "child_process": "1.0.2", @@ -55,8 +55,7 @@ "swagger-ui-express": "^5.0.0", "umzug": "^3.7.0", "underscore": "1.13.6", - "xss-clean": "0.1.1", - "yamljs": "^0.3.0" + "xss-clean": "0.1.1" }, "bin": { "iofog-controller": "src/main.js" @@ -67,7 +66,7 @@ "chai": "5.1.1", "chai-as-promised": "7.1.2", "chai-http": "4.4.0", - "eslint": "9.2.0", + "eslint": "9.16.0", "eslint-config-google": "0.14.0", "mocha": "10.6.0", "mocha-junit-reporter": "2.2.1", @@ -599,9 +598,9 @@ } }, "node_modules/@datasance/ecn-viewer": { - "version": "0.3.8", - "resolved": "https://npm.pkg.github.com/download/@datasance/ecn-viewer/0.3.8/ee97a29a58feb79a047c90cf19387581a237fc9d", - "integrity": "sha512-wyM86fnIkCG937beYgzWI5I07HrX7htT0EECTkyzSZDXqZCwjEQmFFKbIcb6kYSxtnMqVu6iiTew8P9DXDP3pQ==" + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@datasance/ecn-viewer/-/ecn-viewer-0.3.9.tgz", + "integrity": "sha512-G/12I6CEh/cHQv3h0yYwRlVZ/ff+F5wSM2i/IXCBW7NKcgJT4pd4IhPChB36gwv1dKq08RHR+Ngh9NrYWUQM4w==" }, "node_modules/@eslint-community/eslint-utils": { "version": "4.4.0", @@ -631,18 +630,86 @@ } }, "node_modules/@eslint-community/regexpp": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", - "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", + "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", "dev": true, "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, + "node_modules/@eslint/config-array": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.19.0.tgz", + "integrity": "sha512-zdHg2FPIFNKPdcHWtiNT+jEFCHYVplAXRDlQDyqy0zGx/q2parwh7brGJSiTxRk/TSMkbM//zt/f5CHgyTyaSQ==", + "dev": true, + "dependencies": { + "@eslint/object-schema": "^2.1.4", + "debug": "^4.3.1", + "minimatch": "^3.1.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/config-array/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/@eslint/config-array/node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@eslint/config-array/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/@eslint/config-array/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==", + "dev": true + }, + "node_modules/@eslint/core": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.9.0.tgz", + "integrity": "sha512-7ATR9F0e4W85D/0w7cU0SNj7qkAexMG+bAHEZOjo9akvGuhHE2m7umzWzfnpa0XAg5Kxc1BWmtPMV67jJ+9VUg==", + "dev": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, "node_modules/@eslint/eslintrc": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.0.2.tgz", - "integrity": "sha512-wV19ZEGEMAC1eHgrS7UQPqsdEiCIbTKTasEfcXAigzoXICcqZSjBZEHlZwNVvKg6UBCjSlos84XiLqsRJnIcIg==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.2.0.tgz", + "integrity": "sha512-grOjVNN8P3hjJn/eIETF1wwd12DdnwFDoyceUJLYYdkpbwq3nLi+4fqrTAONx7XDALqlL220wC/RHSC/QTI/0w==", "dev": true, "dependencies": { "ajv": "^6.12.4", @@ -673,12 +740,12 @@ } }, "node_modules/@eslint/eslintrc/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", "dev": true, "dependencies": { - "ms": "2.1.2" + "ms": "^2.1.3" }, "engines": { "node": ">=6.0" @@ -702,20 +769,41 @@ } }, "node_modules/@eslint/eslintrc/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==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dev": true }, "node_modules/@eslint/js": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.2.0.tgz", - "integrity": "sha512-ESiIudvhoYni+MdsI8oD7skpprZ89qKocwRM2KEvhhBJ9nl5MRh7BXU5GTod7Mdygq+AUl+QzId6iWJKR/wABA==", + "version": "9.16.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.16.0.tgz", + "integrity": "sha512-tw2HxzQkrbeuvyj1tG2Yqq+0H9wGoI2IMk4EOsQeX+vmd75FtJAzf+gTA69WF+baUKRYQ3x2kbLE08js5OsTVg==", + "dev": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/object-schema": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.4.tgz", + "integrity": "sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ==", "dev": true, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, + "node_modules/@eslint/plugin-kit": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.3.tgz", + "integrity": "sha512-2b/g5hRmpbb1o4GnTZax9N9m0FXzz9OV42ZzI4rDDMDuHUqigAiQCEWChBWCY4ztAGVRjoWT19v0yMmc5/L5kA==", + "dev": true, + "dependencies": { + "levn": "^0.4.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, "node_modules/@faker-js/faker": { "version": "5.5.3", "resolved": "https://registry.npmjs.org/@faker-js/faker/-/faker-5.5.3.tgz", @@ -728,65 +816,41 @@ "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==", "optional": true }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", - "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", + "node_modules/@humanfs/core": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", + "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", "dev": true, - "dependencies": { - "@humanwhocodes/object-schema": "^2.0.3", - "debug": "^4.3.1", - "minimatch": "^3.0.5" - }, "engines": { - "node": ">=10.10.0" + "node": ">=18.18.0" } }, - "node_modules/@humanwhocodes/config-array/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==", + "node_modules/@humanfs/node": { + "version": "0.16.6", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz", + "integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==", "dev": true, "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/@humanwhocodes/config-array/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" + "@humanfs/core": "^0.19.1", + "@humanwhocodes/retry": "^0.3.0" }, "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "node": ">=18.18.0" } }, - "node_modules/@humanwhocodes/config-array/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "node_modules/@humanfs/node/node_modules/@humanwhocodes/retry": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz", + "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==", "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, "engines": { - "node": "*" + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" } }, - "node_modules/@humanwhocodes/config-array/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/@humanwhocodes/module-importer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", @@ -800,16 +864,10 @@ "url": "https://github.com/sponsors/nzakas" } }, - "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", - "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", - "dev": true - }, "node_modules/@humanwhocodes/retry": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.2.4.tgz", - "integrity": "sha512-Ttl/jHpxfS3st5sxwICYfk4pOH0WrLI1SpW283GgQL7sCWU7EHIOhX4b4fkIxr3tkfzwg8+FNojtzsIEE7Ecgg==", + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.1.tgz", + "integrity": "sha512-c7hNEllBlenFTHBky65mhq8WD2kbN9Q6gk0bTk8lSBvc554jpXSkST1iePudpt7+A/AQvuHs9EMqjHDXMY1lrA==", "dev": true, "engines": { "node": ">=18.18" @@ -1053,41 +1111,6 @@ "resolved": "https://registry.npmjs.org/@jsdevtools/ono/-/ono-7.1.3.tgz", "integrity": "sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==" }, - "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/@one-ini/wasm": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/@one-ini/wasm/-/wasm-0.1.1.tgz", @@ -1435,6 +1458,12 @@ "@types/ms": "*" } }, + "node_modules/@types/estree": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", + "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", + "dev": true + }, "node_modules/@types/json-schema": { "version": "7.0.15", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", @@ -3035,9 +3064,9 @@ } }, "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==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dev": true, "dependencies": { "path-key": "^3.1.0", @@ -3862,28 +3891,32 @@ } }, "node_modules/eslint": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.2.0.tgz", - "integrity": "sha512-0n/I88vZpCOzO+PQpt0lbsqmn9AsnsJAQseIqhZFI8ibQT0U1AkEKRxA3EVMos0BoHSXDQvCXY25TUjB5tr8Og==", + "version": "9.16.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.16.0.tgz", + "integrity": "sha512-whp8mSQI4C8VXd+fLgSM0lh3UlmcFtVwUQjyKCFfsp+2ItAIYhlq/hqGahGqHE6cv9unM41VlqKk2VtKYR2TaA==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^3.0.2", - "@eslint/js": "9.2.0", - "@humanwhocodes/config-array": "^0.13.0", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.19.0", + "@eslint/core": "^0.9.0", + "@eslint/eslintrc": "^3.2.0", + "@eslint/js": "9.16.0", + "@eslint/plugin-kit": "^0.2.3", + "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", - "@humanwhocodes/retry": "^0.2.3", - "@nodelib/fs.walk": "^1.2.8", + "@humanwhocodes/retry": "^0.4.1", + "@types/estree": "^1.0.6", + "@types/json-schema": "^7.0.15", "ajv": "^6.12.4", "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", + "cross-spawn": "^7.0.5", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^8.0.1", - "eslint-visitor-keys": "^4.0.0", - "espree": "^10.0.1", - "esquery": "^1.4.2", + "eslint-scope": "^8.2.0", + "eslint-visitor-keys": "^4.2.0", + "espree": "^10.3.0", + "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^8.0.0", @@ -3892,15 +3925,11 @@ "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", "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" + "optionator": "^0.9.3" }, "bin": { "eslint": "bin/eslint.js" @@ -3909,7 +3938,15 @@ "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://opencollective.com/eslint" + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } } }, "node_modules/eslint-config-google": { @@ -4091,9 +4128,9 @@ } }, "node_modules/eslint-scope": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.0.1.tgz", - "integrity": "sha512-pL8XjgP4ZOmmwfFE8mEhSxA7ZY4C+LWyqjQ3o4yWkkmD0qcMT9kkW3zWHOczhWcjTSgqycYAgwSlXvZltv65og==", + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.2.0.tgz", + "integrity": "sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A==", "dev": true, "dependencies": { "esrecurse": "^4.3.0", @@ -4128,9 +4165,9 @@ } }, "node_modules/eslint-visitor-keys": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.0.0.tgz", - "integrity": "sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", + "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", "dev": true, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -4200,14 +4237,14 @@ } }, "node_modules/espree": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-10.0.1.tgz", - "integrity": "sha512-MWkrWZbJsL2UwnjxTX3gG8FneachS/Mwg7tdGXce011sJd5b0JG54vat5KHnfSBODZ3Wvzd2WnjxyzsRoVv+ww==", + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.3.0.tgz", + "integrity": "sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==", "dev": true, "dependencies": { - "acorn": "^8.11.3", + "acorn": "^8.14.0", "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^4.0.0" + "eslint-visitor-keys": "^4.2.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -4216,6 +4253,18 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/espree/node_modules/acorn": { + "version": "8.14.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", + "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/esprima": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", @@ -4340,9 +4389,9 @@ } }, "node_modules/execa/node_modules/cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "version": "6.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.6.tgz", + "integrity": "sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw==", "dependencies": { "nice-try": "^1.0.4", "path-key": "^2.0.1", @@ -4628,15 +4677,6 @@ "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==", "dev": true }, - "node_modules/fastq": { - "version": "1.17.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", - "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", - "dev": true, - "dependencies": { - "reusify": "^1.0.4" - } - }, "node_modules/fd-slicer": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", @@ -5711,9 +5751,9 @@ ] }, "node_modules/ignore": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", - "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", "dev": true, "engines": { "node": ">= 4" @@ -6220,15 +6260,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "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-plain-obj": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", @@ -10113,16 +10144,6 @@ "resolved": "https://registry.npmjs.org/retry-as-promised/-/retry-as-promised-7.0.4.tgz", "integrity": "sha512-XgmCoxKWkDofwH8WddD0w85ZfqYz+ZHlr5yo+3YUCfycWawU56T5ckWXsScsj5B8tqUcIG67DxXByo3VUgiAdA==" }, - "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/roarr": { "version": "2.15.4", "resolved": "https://registry.npmjs.org/roarr/-/roarr-2.15.4.tgz", @@ -11433,9 +11454,9 @@ "dev": true }, "node_modules/standard/node_modules/cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "version": "6.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.6.tgz", + "integrity": "sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw==", "dev": true, "dependencies": { "nice-try": "^1.0.4", @@ -13446,72 +13467,6 @@ "node": ">= 6" } }, - "node_modules/yamljs": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/yamljs/-/yamljs-0.3.0.tgz", - "integrity": "sha512-C/FsVVhht4iPQYXOInoxUM/1ELSf9EsgKH34FofQOp6hwCPrW4vG4w5++TED3xRUo8gD7l0P1J1dLlDYzODsTQ==", - "dependencies": { - "argparse": "^1.0.7", - "glob": "^7.0.5" - }, - "bin": { - "json2yaml": "bin/json2yaml", - "yaml2json": "bin/yaml2json" - } - }, - "node_modules/yamljs/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/yamljs/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/yamljs/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "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/yamljs/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/yamljs/node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" - }, "node_modules/yargs": { "version": "16.2.0", "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", diff --git a/package.json b/package.json index 6e04eda77..68c5cff1c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@datasance/iofogcontroller", - "version": "3.4.3", + "version": "3.4.4", "description": "ioFog Controller project for Eclipse IoFog @ iofog.org \\nCopyright (c) 2023 Datasance Teknoloji A.S.", "main": "./src/main.js", "author": "Emirhan Durmus", @@ -55,7 +55,7 @@ "iofog-controller": "src/main.js" }, "dependencies": { - "@datasance/ecn-viewer": "0.3.8", + "@datasance/ecn-viewer": "0.3.9", "axios": "1.7.4", "body-parser": "^1.20.3", "child_process": "1.0.2", @@ -100,8 +100,7 @@ "swagger-ui-express": "^5.0.0", "umzug": "^3.7.0", "underscore": "1.13.6", - "xss-clean": "0.1.1", - "yamljs": "^0.3.0" + "xss-clean": "0.1.1" }, "devDependencies": { "acorn": "8.11.3", @@ -109,7 +108,7 @@ "chai": "5.1.1", "chai-as-promised": "7.1.2", "chai-http": "4.4.0", - "eslint": "9.2.0", + "eslint": "9.16.0", "eslint-config-google": "0.14.0", "mocha": "10.6.0", "mocha-junit-reporter": "2.2.1", diff --git a/src/data/providers/database-provider.js b/src/data/providers/database-provider.js index dbc1e61d6..23a53f11b 100644 --- a/src/data/providers/database-provider.js +++ b/src/data/providers/database-provider.js @@ -36,7 +36,6 @@ class DatabaseProvider { for (let query of dataArr) { if (query.trim()) { query = query.trim() + ';' // Ensure semicolon is added back - console.log(`Running migration query: ${query}`) // Run each query sequentially await new Promise((resolve, reject) => { @@ -105,7 +104,6 @@ class DatabaseProvider { for (let query of dataArr) { if (query.trim()) { query = query.trim() + ';' // Ensure semicolon is added back - console.log(`Running seeder query: ${query}`) // Run each query sequentially await new Promise((resolve, reject) => { diff --git a/src/routes/application.js b/src/routes/application.js index d5bc48424..5185cbfbc 100644 --- a/src/routes/application.js +++ b/src/routes/application.js @@ -63,7 +63,7 @@ module.exports = [ const getApplicationsBySystemEndPoint = ResponseDecorator.handleErrors(ApplicationController.getApplicationsBySystemEndPoint, successCode, errorCodes) // Add keycloak.protect() middleware to protect the route - await keycloak.protect(['SRE', 'Developer', 'Viewer'])(req, res, async () => { + await keycloak.protect(['SRE'])(req, res, async () => { const responseObject = await getApplicationsBySystemEndPoint(req) const user = req.kauth.grant.access_token.content.preferred_username res From bc642804e148be044c8185a8deea37f7d8730790 Mon Sep 17 00:00:00 2001 From: Alpaslan DOGAN Date: Tue, 10 Dec 2024 18:04:44 +0300 Subject: [PATCH 137/178] swagger ui removed controller side. --- docs/swagger.json | 2 +- docs/swagger.yaml | 2 +- package.json | 2 -- src/server.js | 92 ----------------------------------------------- 4 files changed, 2 insertions(+), 96 deletions(-) diff --git a/docs/swagger.json b/docs/swagger.json index a90060f22..98745d609 100644 --- a/docs/swagger.json +++ b/docs/swagger.json @@ -2674,7 +2674,7 @@ }, "/user/refresh" : { "post" : { - "tags" : [ "Refresh" ], + "tags" : [ "User" ], "summary" : "Refresh accessToken with refreshToken", "operationId" : "refresh", "parameters" : [ ], diff --git a/docs/swagger.yaml b/docs/swagger.yaml index e2bfc97e3..180cf9c1b 100755 --- a/docs/swagger.yaml +++ b/docs/swagger.yaml @@ -2527,7 +2527,7 @@ paths: /user/refresh: post: tags: - - Refresh + - User summary: Refresh accessToken with refreshToken operationId: refresh requestBody: diff --git a/package.json b/package.json index 68c5cff1c..93b53a1d5 100644 --- a/package.json +++ b/package.json @@ -96,8 +96,6 @@ "sequelize": "6.37.3", "sqlite3": "^5.1.7", "string-format": "2.0.0", - "swagger-jsdoc": "^6.2.8", - "swagger-ui-express": "^5.0.0", "umzug": "^3.7.0", "underscore": "1.13.6", "xss-clean": "0.1.1" diff --git a/src/server.js b/src/server.js index 4a75065a4..5c91faacc 100755 --- a/src/server.js +++ b/src/server.js @@ -27,32 +27,6 @@ const path = require('path') const { renderFile } = require('ejs') const xss = require('xss-clean') const { substitutionMiddleware } = require('./helpers/template-helper') -const swaggerUi = require('swagger-ui-express') -const yaml = require('js-yaml') -const swaggerDocument = yaml.load(fs.readFileSync('/home/runner/.npm-global/lib/node_modules/@datasance/iofogcontroller/docs/swagger.yaml')) - -if (!swaggerDocument.components) { - swaggerDocument.components = {} -} - -if (!swaggerDocument.components.securitySchemes) { - swaggerDocument.components.securitySchemes = {} -} - -swaggerDocument.components.securitySchemes = { - userToken: { - type: 'http', - scheme: 'bearer', - bearerFormat: 'JWT' - } -} - -swaggerDocument.security = [ - { - userToken: [] - } -] - const multer = require('multer') const multerMemStorage = multer.memoryStorage() const uploadFile = (fileName) => multer({ @@ -259,69 +233,3 @@ initState() startHttpServer({ api: app, viewer: viewerApp }, { api: apiPort, viewer: viewerPort }, jobs) } }) -app.use('/datasance-logo-white.png', express.static(path.normalize('/home/runner/.npm-global/lib/node_modules/@datasance/iofogcontroller/src/public/datasance-logo-white.png'))) -app.use('/docs', swaggerUi.serve) -app.use('/docs', (req, res, next) => { - const userToken = req.query && req.query.userToken ? req.query.userToken : '' - const baseUrl = req.query && req.query.baseUrl ? req.query.baseUrl : 'http://localhost:51121/api/v3' - - const customCss = ` - .swagger-ui .topbar { - background-color: #10253dff; - } - .swagger-ui .topbar img { - content: none; - } - .swagger-ui .topbar a { - background-image: url('/datasance-logo-white.png'); - background-size: contain; - background-repeat: no-repeat; - width: 150px; - height: 50px; - display: block; - text-indent: -9999px; - overflow: hidden; - } -` - - const swaggerFilePath = path.normalize('/home/runner/.npm-global/lib/node_modules/@datasance/iofogcontroller/docs/swagger.yaml') - let swaggerDocumentCustom - - try { - const fileContent = fs.readFileSync(swaggerFilePath, 'utf8') - swaggerDocumentCustom = yaml.load(fileContent) - } catch (error) { - console.error('Swagger YAML dosyası okunamadı:', error.message) - return res.status(500).send(`Swagger dosyası yüklenirken bir hata oluştu: ${error.message}`) - } - - const swaggerDocumentWithBaseUrl = { - ...swaggerDocumentCustom, - servers: [ - { - url: `${baseUrl}` - } - ] - } - - const options = { - customCss, - swaggerOptions: { - persistAuthorization: true, - authAction: { - userToken: { - name: 'userToken', - schema: { - type: 'http', - in: 'header', - name: 'Authorization', - description: 'Bearer Token (User Token)' - }, - value: `${userToken}` - } - } - } - } - - swaggerUi.setup(swaggerDocumentWithBaseUrl, options)(req, res, next) -}) From e2296e22efdc3718ed2838c47098b27d6199dc97 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emirhan=20Durmu=C5=9F?= Date: Tue, 10 Dec 2024 22:37:16 +0300 Subject: [PATCH 138/178] viewer updated --- package-lock.json | 206 +++++----------------------------------------- package.json | 4 +- 2 files changed, 22 insertions(+), 188 deletions(-) diff --git a/package-lock.json b/package-lock.json index de7c2f3fd..646a1ed52 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,7 +10,7 @@ "hasInstallScript": true, "license": "EPL-2.0", "dependencies": { - "@datasance/ecn-viewer": "0.3.9", + "@datasance/ecn-viewer": "0.3.11", "axios": "1.7.4", "body-parser": "^1.20.3", "child_process": "1.0.2", @@ -21,7 +21,7 @@ "cors": "2.8.5", "daemonize2": "0.4.2", "ejs": "3.1.10", - "express": "4.21.1", + "express": "4.21.2", "express-session": "1.18.1", "formidable": "3.5.1", "ftp": "0.3.10", @@ -51,8 +51,6 @@ "sequelize": "6.37.3", "sqlite3": "^5.1.7", "string-format": "2.0.0", - "swagger-jsdoc": "^6.2.8", - "swagger-ui-express": "^5.0.0", "umzug": "^3.7.0", "underscore": "1.13.6", "xss-clean": "0.1.1" @@ -93,46 +91,6 @@ "node": ">=6.0.0" } }, - "node_modules/@apidevtools/json-schema-ref-parser": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-9.1.2.tgz", - "integrity": "sha512-r1w81DpR+KyRWd3f+rk6TNqMgedmAxZP5v5KWlXQWlgMUUtyEJch0DKEci1SorPMiSeM8XPl7MZ3miJ60JIpQg==", - "dependencies": { - "@jsdevtools/ono": "^7.1.3", - "@types/json-schema": "^7.0.6", - "call-me-maybe": "^1.0.1", - "js-yaml": "^4.1.0" - } - }, - "node_modules/@apidevtools/openapi-schemas": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@apidevtools/openapi-schemas/-/openapi-schemas-2.1.0.tgz", - "integrity": "sha512-Zc1AlqrJlX3SlpupFGpiLi2EbteyP7fXmUOGup6/DnkRgjP9bgMM/ag+n91rsv0U1Gpz0H3VILA/o3bW7Ua6BQ==", - "engines": { - "node": ">=10" - } - }, - "node_modules/@apidevtools/swagger-methods": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@apidevtools/swagger-methods/-/swagger-methods-3.0.2.tgz", - "integrity": "sha512-QAkD5kK2b1WfjDS/UQn/qQkbwF31uqRjPTrsCs5ZG9BQGAkjwvqGFjjPqAuzac/IYzpPtRzjCP1WrTuAIjMrXg==" - }, - "node_modules/@apidevtools/swagger-parser": { - "version": "10.0.3", - "resolved": "https://registry.npmjs.org/@apidevtools/swagger-parser/-/swagger-parser-10.0.3.tgz", - "integrity": "sha512-sNiLY51vZOmSPFZA5TF35KZ2HbgYklQnTSDnkghamzLb3EkNtcQnrBQEj5AOCxHpTtXpqMCRM1CrmV2rG6nw4g==", - "dependencies": { - "@apidevtools/json-schema-ref-parser": "^9.0.6", - "@apidevtools/openapi-schemas": "^2.0.4", - "@apidevtools/swagger-methods": "^3.0.2", - "@jsdevtools/ono": "^7.1.3", - "call-me-maybe": "^1.0.1", - "z-schema": "^5.0.1" - }, - "peerDependencies": { - "openapi-types": ">=7" - } - }, "node_modules/@babel/code-frame": { "version": "7.24.2", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.2.tgz", @@ -598,9 +556,9 @@ } }, "node_modules/@datasance/ecn-viewer": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@datasance/ecn-viewer/-/ecn-viewer-0.3.9.tgz", - "integrity": "sha512-G/12I6CEh/cHQv3h0yYwRlVZ/ff+F5wSM2i/IXCBW7NKcgJT4pd4IhPChB36gwv1dKq08RHR+Ngh9NrYWUQM4w==" + "version": "0.3.11", + "resolved": "https://registry.npmjs.org/@datasance/ecn-viewer/-/ecn-viewer-0.3.11.tgz", + "integrity": "sha512-COtxGA1kCQdPyzXXqTTcLvozB46Ot2UGTjrU4m3WP+sIxM46T6AR6RCr1CBKpbVuRC5MYABoBPof+MsMI+AHjg==" }, "node_modules/@eslint-community/eslint-utils": { "version": "4.4.0", @@ -1106,11 +1064,6 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "node_modules/@jsdevtools/ono": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/@jsdevtools/ono/-/ono-7.1.3.tgz", - "integrity": "sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==" - }, "node_modules/@one-ini/wasm": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/@one-ini/wasm/-/wasm-0.1.1.tgz", @@ -1467,7 +1420,8 @@ "node_modules/@types/json-schema": { "version": "7.0.15", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==" + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true }, "node_modules/@types/ms": { "version": "0.7.34", @@ -2396,11 +2350,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/call-me-maybe": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.2.tgz", - "integrity": "sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ==" - }, "node_modules/caller-path": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", @@ -4315,6 +4264,7 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "devOptional": true, "engines": { "node": ">=0.10.0" } @@ -4458,9 +4408,9 @@ } }, "node_modules/express": { - "version": "4.21.1", - "resolved": "https://registry.npmjs.org/express/-/express-4.21.1.tgz", - "integrity": "sha512-YSFlK1Ee0/GC8QaO91tHcDxJiE/X4FbpAyQWkxAvG6AXCuR65YzK8ua6D9hvi/TzUfZMpc+BwuM1IPw8fmQBiQ==", + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", + "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", @@ -4481,7 +4431,7 @@ "methods": "~1.1.2", "on-finished": "2.4.1", "parseurl": "~1.3.3", - "path-to-regexp": "0.1.10", + "path-to-regexp": "0.1.12", "proxy-addr": "~2.0.7", "qs": "6.13.0", "range-parser": "~1.2.1", @@ -4496,6 +4446,10 @@ }, "engines": { "node": ">= 0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/express-session": { @@ -7175,11 +7129,6 @@ "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "dev": true }, - "node_modules/lodash.mergewith": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.2.tgz", - "integrity": "sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==" - }, "node_modules/log-symbols": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", @@ -8711,6 +8660,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "devOptional": true, "engines": { "node": ">=0.10.0" } @@ -8761,9 +8711,9 @@ } }, "node_modules/path-to-regexp": { - "version": "0.1.10", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.10.tgz", - "integrity": "sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w==" + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", + "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==" }, "node_modules/pathval": { "version": "2.0.0", @@ -12216,114 +12166,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/swagger-jsdoc": { - "version": "6.2.8", - "resolved": "https://registry.npmjs.org/swagger-jsdoc/-/swagger-jsdoc-6.2.8.tgz", - "integrity": "sha512-VPvil1+JRpmJ55CgAtn8DIcpBs0bL5L3q5bVQvF4tAW/k/9JYSj7dCpaYCAv5rufe0vcCbBRQXGvzpkWjvLklQ==", - "dependencies": { - "commander": "6.2.0", - "doctrine": "3.0.0", - "glob": "7.1.6", - "lodash.mergewith": "^4.6.2", - "swagger-parser": "^10.0.3", - "yaml": "2.0.0-1" - }, - "bin": { - "swagger-jsdoc": "bin/swagger-jsdoc.js" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/swagger-jsdoc/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/swagger-jsdoc/node_modules/commander": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.0.tgz", - "integrity": "sha512-zP4jEKbe8SHzKJYQmq8Y9gYjtO/POJLgIdKgV7B9qNmABVFVc+ctqSX6iXh4mCpJfRBOabiZ2YKPg8ciDw6C+Q==", - "engines": { - "node": ">= 6" - } - }, - "node_modules/swagger-jsdoc/node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/swagger-jsdoc/node_modules/glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/swagger-jsdoc/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/swagger-parser": { - "version": "10.0.3", - "resolved": "https://registry.npmjs.org/swagger-parser/-/swagger-parser-10.0.3.tgz", - "integrity": "sha512-nF7oMeL4KypldrQhac8RyHerJeGPD1p2xDh900GPvc+Nk7nWP6jX2FcC7WmkinMoAmoO774+AFXcWsW8gMWEIg==", - "dependencies": { - "@apidevtools/swagger-parser": "10.0.3" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/swagger-ui-dist": { - "version": "5.17.10", - "resolved": "https://registry.npmjs.org/swagger-ui-dist/-/swagger-ui-dist-5.17.10.tgz", - "integrity": "sha512-fp8SYeEK216KS1/noDvursUOGojEbkvtckOpOmAGZUjlx/ma7VLD2PLQwyermjlzFrlHI5uCt1V+M1C3qBvRyQ==" - }, - "node_modules/swagger-ui-express": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/swagger-ui-express/-/swagger-ui-express-5.0.0.tgz", - "integrity": "sha512-tsU9tODVvhyfkNSvf03E6FAk+z+5cU3lXAzMy6Pv4av2Gt2xA0++fogwC4qo19XuFf6hdxevPuVCSKFuMHJhFA==", - "dependencies": { - "swagger-ui-dist": ">=5.0.0" - }, - "engines": { - "node": ">= v0.10.32" - }, - "peerDependencies": { - "express": ">=4.0.0 || >=5.0.0-beta" - } - }, "node_modules/symbol-observable": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.0.1.tgz", @@ -13459,14 +13301,6 @@ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, - "node_modules/yaml": { - "version": "2.0.0-1", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.0.0-1.tgz", - "integrity": "sha512-W7h5dEhywMKenDJh2iX/LABkbFnBxasD27oyXWDS/feDsxiw0dD5ncXdYXgkvAsXIY2MpW/ZKkr9IU30DBdMNQ==", - "engines": { - "node": ">= 6" - } - }, "node_modules/yargs": { "version": "16.2.0", "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", diff --git a/package.json b/package.json index 93b53a1d5..7290d889d 100644 --- a/package.json +++ b/package.json @@ -55,7 +55,7 @@ "iofog-controller": "src/main.js" }, "dependencies": { - "@datasance/ecn-viewer": "0.3.9", + "@datasance/ecn-viewer": "0.3.11", "axios": "1.7.4", "body-parser": "^1.20.3", "child_process": "1.0.2", @@ -66,7 +66,7 @@ "cors": "2.8.5", "daemonize2": "0.4.2", "ejs": "3.1.10", - "express": "4.21.1", + "express": "4.21.2", "express-session": "1.18.1", "formidable": "3.5.1", "ftp": "0.3.10", From a5884eafd19d1e02af13e32f765813fdfdf91334 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emirhan=20Durmu=C5=9F?= Date: Wed, 11 Dec 2024 18:50:41 +0300 Subject: [PATCH 139/178] ecn viewer version updated --- package-lock.json | 8 ++++---- package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index 646a1ed52..e2d48ef7f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,7 +10,7 @@ "hasInstallScript": true, "license": "EPL-2.0", "dependencies": { - "@datasance/ecn-viewer": "0.3.11", + "@datasance/ecn-viewer": "0.3.13", "axios": "1.7.4", "body-parser": "^1.20.3", "child_process": "1.0.2", @@ -556,9 +556,9 @@ } }, "node_modules/@datasance/ecn-viewer": { - "version": "0.3.11", - "resolved": "https://registry.npmjs.org/@datasance/ecn-viewer/-/ecn-viewer-0.3.11.tgz", - "integrity": "sha512-COtxGA1kCQdPyzXXqTTcLvozB46Ot2UGTjrU4m3WP+sIxM46T6AR6RCr1CBKpbVuRC5MYABoBPof+MsMI+AHjg==" + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@datasance/ecn-viewer/-/ecn-viewer-0.3.13.tgz", + "integrity": "sha512-nR6bDO24A8LFccR9LrQrsy5OquSOBBqn5UTcztsgVfNoq/fDjVFo0zPZzV7G9/rXiQT6/IbZjm+LTO37Vy3ysg==" }, "node_modules/@eslint-community/eslint-utils": { "version": "4.4.0", diff --git a/package.json b/package.json index 7290d889d..f61618cc4 100644 --- a/package.json +++ b/package.json @@ -55,7 +55,7 @@ "iofog-controller": "src/main.js" }, "dependencies": { - "@datasance/ecn-viewer": "0.3.11", + "@datasance/ecn-viewer": "0.3.13", "axios": "1.7.4", "body-parser": "^1.20.3", "child_process": "1.0.2", From b982e937f30c370a03a37669f981d72004895ced Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emirhan=20Durmu=C5=9F?= Date: Fri, 27 Dec 2024 23:18:31 +0300 Subject: [PATCH 140/178] iofog service system agen query fixed, db colum altering for mscv status --- package-lock.json | 4 ++-- package.json | 2 +- src/data/migrations/db_migration_v1.0.2.sql | 2 +- src/services/iofog-service.js | 8 ++++---- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index e2d48ef7f..85f8b1986 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@datasance/iofogcontroller", - "version": "3.4.4", + "version": "3.4.5", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@datasance/iofogcontroller", - "version": "3.4.4", + "version": "3.4.5", "hasInstallScript": true, "license": "EPL-2.0", "dependencies": { diff --git a/package.json b/package.json index f61618cc4..9202f7019 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@datasance/iofogcontroller", - "version": "3.4.4", + "version": "3.4.5", "description": "ioFog Controller project for Eclipse IoFog @ iofog.org \\nCopyright (c) 2023 Datasance Teknoloji A.S.", "main": "./src/main.js", "author": "Emirhan Durmus", diff --git a/src/data/migrations/db_migration_v1.0.2.sql b/src/data/migrations/db_migration_v1.0.2.sql index 8321a99d8..0779e09cc 100644 --- a/src/data/migrations/db_migration_v1.0.2.sql +++ b/src/data/migrations/db_migration_v1.0.2.sql @@ -329,7 +329,7 @@ CREATE TABLE IF NOT EXISTS MicroserviceStatuses ( memory_usage BIGINT DEFAULT 0, container_id VARCHAR(255) DEFAULT '', percentage FLOAT DEFAULT 0.00, - error_message VARCHAR(255) DEFAULT '', + error_message TEXT, microservice_uuid VARCHAR(32), created_at DATETIME, updated_at DATETIME, diff --git a/src/services/iofog-service.js b/src/services/iofog-service.js index 4a27ddb3a..1b2353d5a 100644 --- a/src/services/iofog-service.js +++ b/src/services/iofog-service.js @@ -454,10 +454,10 @@ async function getFogEndPoint (fogData, isCLI, transaction) { async function getFogListEndPoint (filters, isCLI, isSystem, transaction) { await Validator.validate(filters, Validator.schemas.iofogFilters) - // If listing system agent through REST API, make sure user is authenticated - if (isSystem && !isCLI && !lget('id')) { - throw new Errors.AuthenticationError('Unauthorized') - } + // // If listing system agent through REST API, make sure user is authenticated + // if (isSystem && !isCLI && !lget('id')) { + // throw new Errors.AuthenticationError('Unauthorized') + // } const queryFogData = isSystem ? { isSystem } : (isCLI ? {} : { isSystem: false }) From 2710c7b24d86dd30fbc2509064d7d09ae22cfed6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emirhan=20Durmu=C5=9F?= Date: Sun, 29 Dec 2024 16:18:03 +0300 Subject: [PATCH 141/178] logoptions and cli fixed --- Dockerfile | 7 ++- logrotate.conf | 12 ++-- package-lock.json | 4 +- package.json | 2 +- src/cli/application.js | 24 ++++---- src/cli/catalog.js | 16 +++--- src/cli/controller.js | 8 +-- src/cli/diagnostics.js | 12 ++-- src/cli/index.js | 1 - src/cli/iofog.js | 60 ++++++++++---------- src/cli/microservice.js | 108 ++++++++++++++++-------------------- src/cli/registry.js | 22 ++++---- src/cli/tunnel.js | 12 ++-- src/config/constants.js | 4 +- src/config/default.json | 4 +- src/config/development.json | 4 +- src/config/production.json | 4 +- src/logger/index.js | 2 +- 18 files changed, 151 insertions(+), 155 deletions(-) diff --git a/Dockerfile b/Dockerfile index f547f56fb..e55366136 100644 --- a/Dockerfile +++ b/Dockerfile @@ -29,7 +29,7 @@ USER root # Install dependencies for logging and development RUN microdnf install -y logrotate g++ make && microdnf clean all -COPY logrotate.conf /etc/logrotate.conf +COPY logrotate.conf /etc/logrotate.d/iofog-controller # Install Python and pip RUN microdnf install -y python3 && \ @@ -39,6 +39,9 @@ RUN microdnf install -y python3 && \ microdnf install shadow-utils && \ microdnf clean all RUN useradd --uid 10000 --create-home runner +RUN mkdir -p /var/log/iofog-controller && \ + chown runner:runner /var/log/iofog-controller && \ + chmod 755 /var/log/iofog-controller USER 10000 WORKDIR /home/runner @@ -54,6 +57,8 @@ RUN npm i -g /home/runner/iofog-controller.tgz && \ rm -rf /home/runner/iofog-controller.tgz && \ iofog-controller config dev-mode --on +RUN rm -rf /home/runner/.npm-global/lib/node_modules/@datasance/iofogcontroller/src/data/sqlite_files/* + COPY LICENSE /licenses/LICENSE LABEL org.opencontainers.image.description=controller LABEL org.opencontainers.image.source=https://github.com/datasance/controller diff --git a/logrotate.conf b/logrotate.conf index bab19729b..7656fa264 100644 --- a/logrotate.conf +++ b/logrotate.conf @@ -1,10 +1,14 @@ -${PID_BASE}/iofog-controller.log { +/var/log/iofog-controller/iofog-controller.log { rotate 10 - size 10m + size 100m compress notifempty missingok postrotate - kill -HUP `cat ${PID_BASE}/iofog-controller.pid` + if [ -f /home/runner/iofog-controller.pid ]; then + kill -HUP `cat /home/runner/iofog-controller.pid`; + elif [ -f /opt/iofog/controller/lib/node_modules/@datasance/iofogcontroller/src/iofog-controller.pid ]; then + kill -HUP `cat /opt/iofog/controller/lib/node_modules/@datasance/iofogcontroller/src/iofog-controller.pid`; + fi endscript -} +} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 85f8b1986..d2ca71734 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@datasance/iofogcontroller", - "version": "3.4.5", + "version": "3.4.6", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@datasance/iofogcontroller", - "version": "3.4.5", + "version": "3.4.6", "hasInstallScript": true, "license": "EPL-2.0", "dependencies": { diff --git a/package.json b/package.json index 9202f7019..df5caed82 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@datasance/iofogcontroller", - "version": "3.4.5", + "version": "3.4.6", "description": "ioFog Controller project for Eclipse IoFog @ iofog.org \\nCopyright (c) 2023 Datasance Teknoloji A.S.", "main": "./src/main.js", "author": "Emirhan Durmus", diff --git a/src/cli/application.js b/src/cli/application.js index db8ae7901..e5997dd81 100644 --- a/src/cli/application.js +++ b/src/cli/application.js @@ -90,19 +90,19 @@ class Application extends BaseCLIHandler { switch (command) { case constants.CMD_ADD: - await _executeCase(applicationCommand, constants.CMD_ADD, _createApplication, true) + await _executeCase(applicationCommand, constants.CMD_ADD, _createApplication) break case constants.CMD_UPDATE: - await _executeCase(applicationCommand, constants.CMD_UPDATE, _updateApplication, true) + await _executeCase(applicationCommand, constants.CMD_UPDATE, _updateApplication) break case constants.CMD_REMOVE: - await _executeCase(applicationCommand, constants.CMD_REMOVE, _deleteApplication, true) + await _executeCase(applicationCommand, constants.CMD_REMOVE, _deleteApplication) break case constants.CMD_LIST: - await _executeCase(applicationCommand, constants.CMD_LIST, _getAllApplications, false) + await _executeCase(applicationCommand, constants.CMD_LIST, _getAllApplications) break case constants.CMD_INFO: - await _executeCase(applicationCommand, constants.CMD_INFO, _getApplication, false) + await _executeCase(applicationCommand, constants.CMD_INFO, _getApplication) break case constants.CMD_HELP: default: @@ -126,7 +126,7 @@ class Application extends BaseCLIHandler { } } -const _executeCase = async function (applicationCommand, commandName, f, isUserRequired) { +const _executeCase = async function (applicationCommand, commandName, f) { try { const item = applicationCommand[commandName] await f(item) @@ -135,33 +135,33 @@ const _executeCase = async function (applicationCommand, commandName, f, isUserR } } -const _createApplication = async function (applicationData, user) { +const _createApplication = async function (applicationData) { const application = applicationData.file ? JSON.parse(fs.readFileSync(applicationData.file, 'utf8')) : _createApplicationObject(applicationData) logger.cliReq('application add', { args: application }) - const createdApplication = await ApplicationService.createApplicationEndPoint(application, user, true) + const createdApplication = await ApplicationService.createApplicationEndPoint(application, true) logger.cliRes(JSON.stringify({ id: createdApplication.id, name: createdApplication.name }, null, 2)) } -const _updateApplication = async function (applicationData, user) { +const _updateApplication = async function (applicationData) { const application = applicationData.file ? JSON.parse(fs.readFileSync(applicationData.file, 'utf8')) : _createApplicationObject(applicationData) const name = applicationData.name logger.cliReq('application update', { args: application }) - await ApplicationService.patchApplicationEndPoint(application, { name }, user, true) + await ApplicationService.patchApplicationEndPoint(application, { name }, true) logger.cliRes('Application updated successfully.') } -const _deleteApplication = async function (applicationData, user) { +const _deleteApplication = async function (applicationData) { const name = applicationData.name logger.cliReq('application remove', { args: { name } }) - await ApplicationService.deleteApplicationEndPoint({ name }, user, true) + await ApplicationService.deleteApplicationEndPoint({ name }, true) logger.cliRes('Application removed successfully.') } diff --git a/src/cli/catalog.js b/src/cli/catalog.js index c4df259ec..9f15b4519 100644 --- a/src/cli/catalog.js +++ b/src/cli/catalog.js @@ -212,19 +212,19 @@ class Catalog extends BaseCLIHandler { switch (command) { case constants.CMD_ADD: - await _executeCase(catalogCommand, constants.CMD_ADD, _createCatalogItem, true) + await _executeCase(catalogCommand, constants.CMD_ADD, _createCatalogItem) break case constants.CMD_UPDATE: - await _executeCase(catalogCommand, constants.CMD_UPDATE, _updateCatalogItem, false) + await _executeCase(catalogCommand, constants.CMD_UPDATE, _updateCatalogItem) break case constants.CMD_REMOVE: - await _executeCase(catalogCommand, constants.CMD_REMOVE, _deleteCatalogItem, false) + await _executeCase(catalogCommand, constants.CMD_REMOVE, _deleteCatalogItem) break case constants.CMD_LIST: - await _executeCase(catalogCommand, constants.CMD_LIST, _listCatalogItems, false) + await _executeCase(catalogCommand, constants.CMD_LIST, _listCatalogItems) break case constants.CMD_INFO: - await _executeCase(catalogCommand, constants.CMD_INFO, _getCatalogItem, false) + await _executeCase(catalogCommand, constants.CMD_INFO, _getCatalogItem) break case constants.CMD_HELP: default: @@ -248,7 +248,7 @@ class Catalog extends BaseCLIHandler { } } -const _executeCase = async function (catalogCommand, commandName, f, isUserRequired) { +const _executeCase = async function (catalogCommand, commandName, f) { try { const item = catalogCommand[commandName] await f(item) @@ -257,13 +257,13 @@ const _executeCase = async function (catalogCommand, commandName, f, isUserRequi } } -const _createCatalogItem = async function (obj, user) { +const _createCatalogItem = async function (obj) { const item = obj.file ? JSON.parse(fs.readFileSync(obj.file, 'utf8')) : _createCatalogItemObject(obj) logger.cliReq('catalog add', { args: item }) - const catalogItemIdObject = await CatalogItemService.createCatalogItemEndPoint(item, user) + const catalogItemIdObject = await CatalogItemService.createCatalogItemEndPoint(item) logger.cliRes(JSON.stringify({ id: catalogItemIdObject.id }, null, 2)) diff --git a/src/cli/controller.js b/src/cli/controller.js index d5f98d4f6..9ae8561ca 100644 --- a/src/cli/controller.js +++ b/src/cli/controller.js @@ -46,13 +46,13 @@ class Controller extends BaseCLIHandler { switch (command) { case constants.CMD_STATUS: - await _executeCase(controllerCommand, constants.CMD_STATUS, _getStatus, false) + await _executeCase(controllerCommand, constants.CMD_STATUS, _getStatus) break case constants.CMD_FOG_TYPES: - await _executeCase(controllerCommand, constants.CMD_FOG_TYPES, _getFogTypes, false) + await _executeCase(controllerCommand, constants.CMD_FOG_TYPES, _getFogTypes) break case constants.CMD_VERSION: - await _executeCase(controllerCommand, constants.CMD_VERSION, _getVersion, false) + await _executeCase(controllerCommand, constants.CMD_VERSION, _getVersion) break case constants.CMD_HELP: default: @@ -64,7 +64,7 @@ class Controller extends BaseCLIHandler { } } -const _executeCase = async function (userCommand, commandName, f, isUserRequired) { +const _executeCase = async function (userCommand, commandName, f) { try { const item = userCommand[commandName] await f(item) diff --git a/src/cli/diagnostics.js b/src/cli/diagnostics.js index ab716cb4b..165c55ed6 100644 --- a/src/cli/diagnostics.js +++ b/src/cli/diagnostics.js @@ -113,19 +113,19 @@ class Diagnostics extends BaseCLIHandler { switch (command) { case constants.CMD_STRACE_UPDATE: - await _executeCase(diagnosticCommand, constants.CMD_STRACE_UPDATE, _changeMicroserviceStraceState, false) + await _executeCase(diagnosticCommand, constants.CMD_STRACE_UPDATE, _changeMicroserviceStraceState) break case constants.CMD_STRACE_INFO: - await _executeCase(diagnosticCommand, constants.CMD_STRACE_INFO, _getMicroserviceStraceData, false) + await _executeCase(diagnosticCommand, constants.CMD_STRACE_INFO, _getMicroserviceStraceData) break case constants.CMD_STRACE_FTP_POST: - await _executeCase(diagnosticCommand, constants.CMD_STRACE_FTP_POST, _postMicroserviceStraceDataToFtp, false) + await _executeCase(diagnosticCommand, constants.CMD_STRACE_FTP_POST, _postMicroserviceStraceDataToFtp) break case constants.CMD_IMAGE_SNAPSHOT_CREATE: - await _executeCase(diagnosticCommand, constants.CMD_IMAGE_SNAPSHOT_CREATE, _postMicroserviceImageSnapshotCreate, false) + await _executeCase(diagnosticCommand, constants.CMD_IMAGE_SNAPSHOT_CREATE, _postMicroserviceImageSnapshotCreate) break case constants.CMD_IMAGE_SNAPSHOT_GET: - await _executeCase(diagnosticCommand, constants.CMD_IMAGE_SNAPSHOT_GET, _getMicroserviceImageSnapshot, false) + await _executeCase(diagnosticCommand, constants.CMD_IMAGE_SNAPSHOT_GET, _getMicroserviceImageSnapshot) break case constants.CMD_HELP: default: @@ -137,7 +137,7 @@ class Diagnostics extends BaseCLIHandler { } } -const _executeCase = async function (diagnosticCommand, commandName, f, isUserRequired) { +const _executeCase = async function (diagnosticCommand, commandName, f) { try { const item = diagnosticCommand[commandName] await f(item) diff --git a/src/cli/index.js b/src/cli/index.js index 56961ddb9..a905bf1dd 100644 --- a/src/cli/index.js +++ b/src/cli/index.js @@ -37,7 +37,6 @@ class Cli extends BaseCLIHandler { // [constants.CMD_INIT_DB]: 'Init sqlite db for iofog-controller.', [constants.CMD_CONTROLLER]: 'Display iofog-controller service information.', [constants.CMD_HELP]: 'Display usage information.', - [constants.CMD_USER]: 'User operations.', [constants.CMD_CONFIG]: 'Set/Display iofog-controller service config.', [constants.CMD_TUNNEL]: 'Tunnel operations.', [constants.CMD_IOFOG]: 'ioFog nodes operations.', diff --git a/src/cli/iofog.js b/src/cli/iofog.js index 8ac4d0081..8ea90aae2 100644 --- a/src/cli/iofog.js +++ b/src/cli/iofog.js @@ -301,37 +301,37 @@ class IOFog extends BaseCLIHandler { switch (command) { case constants.CMD_ADD: - await _executeCase(iofogCommand, constants.CMD_ADD, _createFog, true) + await _executeCase(iofogCommand, constants.CMD_ADD, _createFog) break case constants.CMD_UPDATE: - await _executeCase(iofogCommand, constants.CMD_UPDATE, _updateFog, true) + await _executeCase(iofogCommand, constants.CMD_UPDATE, _updateFog) break case constants.CMD_REMOVE: - await _executeCase(iofogCommand, constants.CMD_REMOVE, _deleteFog, true) + await _executeCase(iofogCommand, constants.CMD_REMOVE, _deleteFog) break case constants.CMD_LIST: - await _executeCase(iofogCommand, constants.CMD_LIST, _getFogList, false) + await _executeCase(iofogCommand, constants.CMD_LIST, _getFogList) break case constants.CMD_INFO: - await _executeCase(iofogCommand, constants.CMD_INFO, _getFog, false) + await _executeCase(iofogCommand, constants.CMD_INFO, _getFog) break case constants.CMD_PROVISIONING_KEY: - await _executeCase(iofogCommand, constants.CMD_PROVISIONING_KEY, _generateProvision, false) + await _executeCase(iofogCommand, constants.CMD_PROVISIONING_KEY, _generateProvision) break case constants.CMD_IOFOG_REBOOT: - await _executeCase(iofogCommand, constants.CMD_IOFOG_REBOOT, _setFogRebootCommand, false) + await _executeCase(iofogCommand, constants.CMD_IOFOG_REBOOT, _setFogRebootCommand) break case constants.CMD_VERSION: - await _executeCase(iofogCommand, constants.CMD_VERSION, _setFogVersionCommand, false) + await _executeCase(iofogCommand, constants.CMD_VERSION, _setFogVersionCommand) break case constants.CMD_HAL_HW: - await _executeCase(iofogCommand, constants.CMD_HAL_HW, _getHalHardwareInfo, false) + await _executeCase(iofogCommand, constants.CMD_HAL_HW, _getHalHardwareInfo) break case constants.CMD_HAL_USB: - await _executeCase(iofogCommand, constants.CMD_HAL_USB, _getHalUsbInfo, false) + await _executeCase(iofogCommand, constants.CMD_HAL_USB, _getHalUsbInfo) break case constants.CMD_IOFOG_PRUNE: - await _executeCase(iofogCommand, constants.CMD_IOFOG_PRUNE, _setFogPruneCommand, false) + await _executeCase(iofogCommand, constants.CMD_IOFOG_PRUNE, _setFogPruneCommand) break case constants.CMD_HELP: default: @@ -354,7 +354,7 @@ class IOFog extends BaseCLIHandler { } } -async function _executeCase (commands, commandName, f, isUserRequired) { +async function _executeCase (commands, commandName, f) { try { const obj = commands[commandName] await f(obj) @@ -363,19 +363,19 @@ async function _executeCase (commands, commandName, f, isUserRequired) { } } -async function _createFog (obj, user) { +async function _createFog (obj) { const fog = obj.file ? JSON.parse(fs.readFileSync(obj.file, 'utf8')) : _createFogObject(obj) logger.cliReq('fog add', { args: fog }) - const result = await FogService.createFogEndPoint(fog, user, true) + const result = await FogService.createFogEndPoint(fog, true) logger.cliRes(JSON.stringify({ uuid: result.uuid }, null, 2)) } -async function _updateFog (obj, user) { +async function _updateFog (obj) { const fog = obj.file ? JSON.parse(fs.readFileSync(obj.file, 'utf8')) : _createFogObject(obj) @@ -383,52 +383,52 @@ async function _updateFog (obj, user) { fog.uuid = obj.iofogUuid logger.cliReq('fog update', { args: fog }) - await FogService.updateFogEndPoint(fog, user, true) + await FogService.updateFogEndPoint(fog, true) logger.cliRes('ioFog node has been updated successfully.') } -async function _deleteFog (obj, user) { +async function _deleteFog (obj) { const fog = _createFogObject(obj) logger.cliReq('fog remove', { args: fog }) - await FogService.deleteFogEndPoint(fog, user, true) + await FogService.deleteFogEndPoint(fog, true) logger.cliRes('ioFog node has been removed successfully') } -async function _getFogList (obj, user) { +async function _getFogList (obj) { logger.cliReq('fog list') const emptyFilters = [] - const list = await FogService.getFogListEndPoint(emptyFilters, user, true, false) + const list = await FogService.getFogListEndPoint(emptyFilters, true, false) logger.cliRes(JSON.stringify(list, null, 2)) } -async function _getFog (obj, user) { +async function _getFog (obj) { const fog = _createFogObject(obj) logger.cliReq('fog info', { args: fog }) - const res = await FogService.getFogEndPoint(fog, user, true) + const res = await FogService.getFogEndPoint(fog, true) logger.cliRes(JSON.stringify(res, null, 2)) } -async function _generateProvision (obj, user) { +async function _generateProvision (obj) { const fog = _createFogObject(obj) logger.cliReq('fog provisioning-key', { args: fog }) - const response = await FogService.generateProvisioningKeyEndPoint(fog, user, true) + const response = await FogService.generateProvisioningKeyEndPoint(fog, true) logger.cliRes(JSON.stringify(response), null, 2) } -async function _setFogRebootCommand (obj, user) { +async function _setFogRebootCommand (obj) { const fog = _createFogObject(obj) logger.cliReq('fog reboot', { args: fog }) - await FogService.setFogRebootCommandEndPoint(fog, user, true) + await FogService.setFogRebootCommandEndPoint(fog, true) logger.cliRes('ioFog reboot command has been set successfully') } -async function _setFogVersionCommand (obj, user) { +async function _setFogVersionCommand (obj) { const fog = { uuid: obj.iofogUuid, versionCommand: obj.versionCommand } logger.cliReq('fog version', { args: fog }) - await FogService.setFogVersionCommandEndPoint(fog, user, true) + await FogService.setFogVersionCommandEndPoint(fog, true) logger.cliRes('ioFog version command has been set successfully') } @@ -462,10 +462,10 @@ async function _getHalUsbInfo (obj) { } } -async function _setFogPruneCommand (obj, user) { +async function _setFogPruneCommand (obj) { const fog = _createFogObject(obj) logger.cliReq('fog prune', { args: fog }) - await FogService.setFogPruneCommandEndPoint(fog, user, true) + await FogService.setFogPruneCommandEndPoint(fog, true) logger.cliRes('ioFog prune command has been set successfully') } diff --git a/src/cli/microservice.js b/src/cli/microservice.js index 79c56a2c8..7ccdf6173 100644 --- a/src/cli/microservice.js +++ b/src/cli/microservice.js @@ -66,15 +66,9 @@ const JSON_SCHEMA_ADD = AppHelper.stringifyCliJsonSchema( cdiDevices: [ 'string' ], - runAsUser: [ - 'string' - ], - platform: [ - 'string' - ], - runtime: [ - 'string' - ] + runAsUser: 'string', + platform: 'string', + runtime: 'string' } ) @@ -114,15 +108,9 @@ const JSON_SCHEMA_UPDATE = AppHelper.stringifyCliJsonSchema( cdiDevices: [ 'string' ], - runAsUser: [ - 'string' - ], - platform: [ - 'string' - ], - runtime: [ - 'string' - ] + runAsUser: 'string', + platform: 'string', + runtime: 'string' } ) @@ -314,7 +302,7 @@ class Microservice extends BaseCLIHandler { }, { name: 'cdiDevices', - alias: 'd', + alias: 'D', type: String, description: 'Map CDI devices to microservice container', multiple: true, @@ -322,7 +310,7 @@ class Microservice extends BaseCLIHandler { }, { name: 'user', - alias: 'u', + alias: 'U', type: String, description: 'Run Microservice as a user)', multiple: true, @@ -330,7 +318,7 @@ class Microservice extends BaseCLIHandler { }, { name: 'platform', - alias: 'o', + alias: 'L', type: String, description: 'Microservice image platform to be used', multiple: true, @@ -372,43 +360,43 @@ class Microservice extends BaseCLIHandler { switch (command) { case constants.CMD_ADD: - await _executeCase(microserviceCommand, constants.CMD_ADD, _createMicroservice, true) + await _executeCase(microserviceCommand, constants.CMD_ADD, _createMicroservice) break case constants.CMD_UPDATE: - await _executeCase(microserviceCommand, constants.CMD_UPDATE, _updateMicroservice, false) + await _executeCase(microserviceCommand, constants.CMD_UPDATE, _updateMicroservice) break case constants.CMD_REMOVE: - await _executeCase(microserviceCommand, constants.CMD_REMOVE, _removeMicroservice, false) + await _executeCase(microserviceCommand, constants.CMD_REMOVE, _removeMicroservice) break case constants.CMD_LIST: - await _executeCase(microserviceCommand, constants.CMD_LIST, _listMicroservices, false) + await _executeCase(microserviceCommand, constants.CMD_LIST, _listMicroservices) break case constants.CMD_INFO: - await _executeCase(microserviceCommand, constants.CMD_INFO, _getMicroservice, false) + await _executeCase(microserviceCommand, constants.CMD_INFO, _getMicroservice) break case constants.CMD_ROUTE_CREATE: - await _executeCase(microserviceCommand, constants.CMD_ROUTE_CREATE, _createRoute, false) + await _executeCase(microserviceCommand, constants.CMD_ROUTE_CREATE, _createRoute) break case constants.CMD_ROUTE_REMOVE: - await _executeCase(microserviceCommand, constants.CMD_ROUTE_REMOVE, _removeRoute, false) + await _executeCase(microserviceCommand, constants.CMD_ROUTE_REMOVE, _removeRoute) break case constants.CMD_PORT_MAPPING_CREATE: - await _executeCase(microserviceCommand, constants.CMD_PORT_MAPPING_CREATE, _createPortMapping, false) + await _executeCase(microserviceCommand, constants.CMD_PORT_MAPPING_CREATE, _createPortMapping) break case constants.CMD_PORT_MAPPING_REMOVE: - await _executeCase(microserviceCommand, constants.CMD_PORT_MAPPING_REMOVE, _removePortMapping, false) + await _executeCase(microserviceCommand, constants.CMD_PORT_MAPPING_REMOVE, _removePortMapping) break case constants.CMD_PORT_MAPPING_LIST: - await _executeCase(microserviceCommand, constants.CMD_PORT_MAPPING_LIST, _listPortMappings, false) + await _executeCase(microserviceCommand, constants.CMD_PORT_MAPPING_LIST, _listPortMappings) break case constants.CMD_VOLUME_MAPPING_CREATE: - await _executeCase(microserviceCommand, constants.CMD_VOLUME_MAPPING_CREATE, _createVolumeMapping, false) + await _executeCase(microserviceCommand, constants.CMD_VOLUME_MAPPING_CREATE, _createVolumeMapping) break case constants.CMD_VOLUME_MAPPING_REMOVE: - await _executeCase(microserviceCommand, constants.CMD_VOLUME_MAPPING_REMOVE, _removeVolumeMapping, false) + await _executeCase(microserviceCommand, constants.CMD_VOLUME_MAPPING_REMOVE, _removeVolumeMapping) break case constants.CMD_VOLUME_MAPPING_LIST: - await _executeCase(microserviceCommand, constants.CMD_VOLUME_MAPPING_LIST, _listVolumeMappings, false) + await _executeCase(microserviceCommand, constants.CMD_VOLUME_MAPPING_LIST, _listVolumeMappings) break case constants.CMD_HELP: default: @@ -485,7 +473,7 @@ class Microservice extends BaseCLIHandler { } } -async function _executeCase (commands, commandName, f, isUserRequired) { +async function _executeCase (commands, commandName, f) { try { const obj = commands[commandName] await f(obj) @@ -494,13 +482,13 @@ async function _executeCase (commands, commandName, f, isUserRequired) { } } -const _createRoute = async function (obj, user) { +const _createRoute = async function (obj) { try { const arr = obj.route.split(':') const sourceMicroserviceUuid = arr[0] const destMicroserviceUuid = arr[1] logger.cliReq('microservice route-create', { args: { source: sourceMicroserviceUuid, dest: destMicroserviceUuid } }) - await MicroserviceService.createRouteEndPoint(sourceMicroserviceUuid, destMicroserviceUuid, user, true) + await MicroserviceService.createRouteEndPoint(sourceMicroserviceUuid, destMicroserviceUuid, true) logger.cliRes(`Microservice route with source microservice ${sourceMicroserviceUuid} and dest microservice ${destMicroserviceUuid} has been created successfully.`) } catch (e) { @@ -508,13 +496,13 @@ const _createRoute = async function (obj, user) { } } -const _removeRoute = async function (obj, user) { +const _removeRoute = async function (obj) { try { const arr = obj.route.split(':') const sourceMicroserviceUuid = arr[0] const destMicroserviceUuid = arr[1] logger.cliReq('microservice route-remove', { args: { source: sourceMicroserviceUuid, dest: destMicroserviceUuid } }) - await MicroserviceService.deleteRouteEndPoint(sourceMicroserviceUuid, destMicroserviceUuid, user, true) + await MicroserviceService.deleteRouteEndPoint(sourceMicroserviceUuid, destMicroserviceUuid, true) logger.cliRes('Microservice route with source microservice ' + sourceMicroserviceUuid + ' and dest microservice ' + destMicroserviceUuid + 'has been removed successfully.') } catch (e) { @@ -522,83 +510,83 @@ const _removeRoute = async function (obj, user) { } } -const _createPortMapping = async function (obj, user) { +const _createPortMapping = async function (obj) { const mapping = parsePortMappingObject(obj.mapping, ErrorMessages.CLI.INVALID_PORT_MAPPING) logger.cliReq('microservice port-mapping-create', { args: mapping }) - await MicroserviceService.createPortMappingEndPoint(obj.microserviceUuid, mapping, user, true) + await MicroserviceService.createPortMappingEndPoint(obj.microserviceUuid, mapping, true) logger.cliRes('Port mapping has been created successfully.') } -const _createVolumeMapping = async function (obj, user) { +const _createVolumeMapping = async function (obj) { const mapping = parseVolumeMappingObject(obj.mapping, ErrorMessages.CLI.INVALID_VOLUME_MAPPING) logger.cliReq('microservice volume-mapping-create', { args: mapping }) - const result = await MicroserviceService.createVolumeMappingEndPoint(obj.microserviceUuid, mapping, user, true) + const result = await MicroserviceService.createVolumeMappingEndPoint(obj.microserviceUuid, mapping, true) logger.cliRes(JSON.stringify({ id: result.id }, null, 2)) } -const _removePortMapping = async function (obj, user) { +const _removePortMapping = async function (obj) { try { logger.cliReq('microservice port-mapping-remove', { args: obj }) - await MicroserviceService.deletePortMappingEndPoint(obj.microserviceUuid, obj.internalPort, user, true) + await MicroserviceService.deletePortMappingEndPoint(obj.microserviceUuid, obj.internalPort, true) logger.cliRes('Port mapping has been removed successfully.') } catch (e) { logger.error(e.message) } } -const _removeVolumeMapping = async function (obj, user) { +const _removeVolumeMapping = async function (obj) { try { logger.cliReq('microservice volume-mapping-remove', { args: obj }) - await MicroserviceService.deleteVolumeMappingEndPoint(obj.microserviceUuid, obj.mappingId, user, true) + await MicroserviceService.deleteVolumeMappingEndPoint(obj.microserviceUuid, obj.mappingId, true) logger.cliRes('Volume mapping has been deleted successfully.') } catch (e) { logger.error(e.message) } } -const _listPortMappings = async function (obj, user) { +const _listPortMappings = async function (obj) { logger.cliReq('microservice port-mapping-list', { args: { microserviceUuid: obj.microserviceUuid } }) - const result = await MicroserviceService.listMicroservicePortMappingsEndPoint(obj.microserviceUuid, user, true) + const result = await MicroserviceService.listMicroservicePortMappingsEndPoint(obj.microserviceUuid, true) logger.cliRes(JSON.stringify(result, null, 2)) } -const _listVolumeMappings = async function (obj, user) { +const _listVolumeMappings = async function (obj) { logger.cliReq('microservice volume-mapping-list', { args: { microserviceUuid: obj.microserviceUuid } }) - const result = await MicroserviceService.listVolumeMappingsEndPoint(obj.microserviceUuid, user, true) + const result = await MicroserviceService.listVolumeMappingsEndPoint(obj.microserviceUuid, true) logger.cliRes(JSON.stringify(result, null, 2)) } -const _removeMicroservice = async function (obj, user) { +const _removeMicroservice = async function (obj) { const microserviceData = { withCleanup: obj.cleanup } logger.cliReq('microservice remove', { args: { microserviceUuid: obj.microserviceUuid, withCleanup: obj.cleanup } }) - await MicroserviceService.deleteMicroserviceEndPoint(obj.microserviceUuid, microserviceData, user, true) + await MicroserviceService.deleteMicroserviceEndPoint(obj.microserviceUuid, microserviceData, true) logger.cliRes('Microservice has been removed successfully.') } const _listMicroservices = async function () { logger.cliReq('microservice list') - const result = await MicroserviceService.listMicroservicesEndPoint('', {}, true) + const result = await MicroserviceService.listMicroservicesEndPoint('', true) logger.cliRes(JSON.stringify(result, null, 2)) } -const _getMicroservice = async function (obj, user) { +const _getMicroservice = async function (obj) { logger.cliReq('microservice info', { args: { microserviceUuid: obj.microserviceUuid } }) - const result = await MicroserviceService.getMicroserviceEndPoint(obj.microserviceUuid, user, true) + const result = await MicroserviceService.getMicroserviceEndPoint(obj.microserviceUuid, true) logger.cliRes(JSON.stringify(result, null, 2)) } -const _createMicroservice = async function (obj, user) { +const _createMicroservice = async function (obj) { const microservice = obj.file ? JSON.parse(fs.readFileSync(obj.file, 'utf8')) : _createMicroserviceObject(obj) logger.cliReq('microservice add', { args: microservice }) - const result = await MicroserviceService.createMicroserviceEndPoint(microservice, user, true) + const result = await MicroserviceService.createMicroserviceEndPoint(microservice, true) const output = { uuid: result.uuid } @@ -609,13 +597,13 @@ const _createMicroservice = async function (obj, user) { logger.cliRes(JSON.stringify(output, null, 2)) } -const _updateMicroservice = async function (obj, user) { +const _updateMicroservice = async function (obj) { const microservice = obj.file ? JSON.parse(fs.readFileSync(obj.file, 'utf8')) : _updateMicroserviceObject(obj) logger.cliReq('microservice update', { args: microservice }) - await MicroserviceService.updateMicroserviceEndPoint(obj.microserviceUuid, microservice, user, true) + await MicroserviceService.updateMicroserviceEndPoint(obj.microserviceUuid, microservice, true) logger.cliRes('Microservice has been updated successfully.') } diff --git a/src/cli/registry.js b/src/cli/registry.js index 4afae2bf2..046bdbc12 100644 --- a/src/cli/registry.js +++ b/src/cli/registry.js @@ -111,16 +111,16 @@ class Registry extends BaseCLIHandler { switch (command) { case constants.CMD_ADD: - await _executeCase(registryCommand, constants.CMD_ADD, _createRegistry, true) + await _executeCase(registryCommand, constants.CMD_ADD, _createRegistry) break case constants.CMD_REMOVE: - await _executeCase(registryCommand, constants.CMD_REMOVE, _deleteRegistry, false) + await _executeCase(registryCommand, constants.CMD_REMOVE, _deleteRegistry) break case constants.CMD_UPDATE: - await _executeCase(registryCommand, constants.CMD_UPDATE, _updateRegistry, false) + await _executeCase(registryCommand, constants.CMD_UPDATE, _updateRegistry) break case constants.CMD_LIST: - await _executeCase(registryCommand, constants.CMD_LIST, _getRegistries, false) + await _executeCase(registryCommand, constants.CMD_LIST, _getRegistries) break case constants.CMD_HELP: default: @@ -132,28 +132,28 @@ class Registry extends BaseCLIHandler { } } -async function _createRegistry (obj, user) { +async function _createRegistry (obj) { const registry = _createRegistryObject(obj) const logRegistry = Object.assign({}, registry) delete logRegistry.password logger.cliReq('registry add', { args: logRegistry }) - const response = await RegistryService.createRegistry(registry, user) + const response = await RegistryService.createRegistry(registry) logger.cliRes(JSON.stringify({ id: response.id }, null, 2)) } -async function _getRegistries (obj, user) { +async function _getRegistries (obj) { logger.cliReq('registry list') - const result = await RegistryService.findRegistries(user, true) + const result = await RegistryService.findRegistries(true) logger.cliRes(JSON.stringify(result, null, 2)) } -async function _deleteRegistry (obj, user) { +async function _deleteRegistry (obj) { logger.cliReq('registry remove', { args: { id: obj.itemId } }) - await RegistryService.deleteRegistry({ id: obj.itemId }, user, true) + await RegistryService.deleteRegistry({ id: obj.itemId }, true) logger.cliRes('Registry has been removed successfully.') } @@ -168,7 +168,7 @@ async function _updateRegistry (obj) { logger.cliRes('Registry has been updated successfully.') } -async function _executeCase (commands, commandName, f, isUserRequired) { +async function _executeCase (commands, commandName, f) { try { const obj = commands[commandName] await f(obj) diff --git a/src/cli/tunnel.js b/src/cli/tunnel.js index 287b391ec..75efe9ff8 100644 --- a/src/cli/tunnel.js +++ b/src/cli/tunnel.js @@ -98,10 +98,10 @@ class Tunnel extends BaseCLIHandler { switch (command) { case constants.CMD_UPDATE: - await _executeCase(tunnelCommand, constants.CMD_UPDATE, _updateTunnel, false) + await _executeCase(tunnelCommand, constants.CMD_UPDATE, _updateTunnel) break case constants.CMD_LIST: - await _executeCase(tunnelCommand, constants.CMD_LIST, _tunnelList, false) + await _executeCase(tunnelCommand, constants.CMD_LIST, _tunnelList) break default: return this.help([]) @@ -112,7 +112,7 @@ class Tunnel extends BaseCLIHandler { } } -async function _updateTunnel (obj, user) { +async function _updateTunnel (obj) { const action = obj.action const tunnel = _createTunnelObject(obj) @@ -126,10 +126,10 @@ async function _updateTunnel (obj, user) { switch (action) { case 'open': - await TunnelService.openTunnel(tunnel, user, true) + await TunnelService.openTunnel(tunnel, true) break case 'close': - await TunnelService.closeTunnel({ iofogUuid: tunnel.iofogUuid }, user) + await TunnelService.closeTunnel({ iofogUuid: tunnel.iofogUuid }) break default: throw new Errors.ValidationError(ErrorMessages.INVALID_ACTION_PROPERTY) @@ -143,7 +143,7 @@ async function _tunnelList () { logger.cliRes(JSON.stringify(tunnels, null, 2)) } -async function _executeCase (commands, commandName, f, isUserRequired) { +async function _executeCase (commands, commandName, f) { try { const obj = commands[commandName] await f(obj) diff --git a/src/config/constants.js b/src/config/constants.js index 81d99eaa3..1167cf99f 100644 --- a/src/config/constants.js +++ b/src/config/constants.js @@ -18,8 +18,8 @@ module.exports = { 'Server:Port': 51121, 'Server:DevMode': false, - 'Service:LogsDirectory': process.env.PID_BASE ? `${process.env.PID_BASE}/iofog-controller` : '/var/log/iofog-controller', - 'Service:LogsFileSize': 10485760, + 'Service:LogsDirectory': '/var/log/iofog-controller', + 'Service:LogsFileSize': 104857600, 'Service:LogsFileCount': 10, 'Settings:DefaultJobIntervalSeconds': 120, diff --git a/src/config/default.json b/src/config/default.json index 92898aa60..ff9ea9676 100644 --- a/src/config/default.json +++ b/src/config/default.json @@ -10,8 +10,8 @@ "DevMode": false }, "Service": { - "LogsDirectory": "${PID_BASE}/iofog-controller", - "LogsFileSize": 10485760, + "LogsDirectory": "/var/log/iofog-controller", + "LogsFileSize": 104857600, "LogsFileCount": 10 }, "Settings": { diff --git a/src/config/development.json b/src/config/development.json index ea43d5a4a..0fed88803 100644 --- a/src/config/development.json +++ b/src/config/development.json @@ -10,8 +10,8 @@ "DevMode": true }, "Service": { - "LogsDirectory": "${PID_BASE}/iofog-controller", - "LogsFileSize": 10485760, + "LogsDirectory": "/var/log/iofog-controller", + "LogsFileSize": 104857600, "LogsFileCount": 10 }, "Settings": { diff --git a/src/config/production.json b/src/config/production.json index 8437d00d4..82bd77082 100644 --- a/src/config/production.json +++ b/src/config/production.json @@ -10,8 +10,8 @@ "DevMode": true }, "Service": { - "LogsDirectory": "${PID_BASE}/iofog-controller", - "LogsFileSize": 10485760, + "LogsDirectory": "/var/log/iofog-controller", + "LogsFileSize": 104857600, "LogsFileCount": 10 }, "Settings": { diff --git a/src/logger/index.js b/src/logger/index.js index 453f83ede..03bc2d2df 100644 --- a/src/logger/index.js +++ b/src/logger/index.js @@ -81,7 +81,7 @@ try { fileLogger = pino( { ...defaultFormat, - level: 'warn' + level: 'apiRes' }, logDestination) process.on('SIGHUP', () => logDestination.reopen()) From 3a4f2f74d1fbc91374ce2b29780fe0acf890de73 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emirhan=20Durmu=C5=9F?= Date: Mon, 6 Jan 2025 01:15:43 +0300 Subject: [PATCH 142/178] catalog updated --- package-lock.json | 4 +- package.json | 2 +- src/data/providers/database-provider.js | 2 +- src/data/seeders/db_seeder_v1.0.1.sql | 91 ------------------------- src/data/seeders/db_seeder_v1.0.2.sql | 38 +++++++++++ src/services/catalog-service.js | 14 ++-- 6 files changed, 49 insertions(+), 102 deletions(-) delete mode 100644 src/data/seeders/db_seeder_v1.0.1.sql create mode 100644 src/data/seeders/db_seeder_v1.0.2.sql diff --git a/package-lock.json b/package-lock.json index d2ca71734..27e6ab6b6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@datasance/iofogcontroller", - "version": "3.4.6", + "version": "3.4.7", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@datasance/iofogcontroller", - "version": "3.4.6", + "version": "3.4.7", "hasInstallScript": true, "license": "EPL-2.0", "dependencies": { diff --git a/package.json b/package.json index df5caed82..9541d57b4 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@datasance/iofogcontroller", - "version": "3.4.6", + "version": "3.4.7", "description": "ioFog Controller project for Eclipse IoFog @ iofog.org \\nCopyright (c) 2023 Datasance Teknoloji A.S.", "main": "./src/main.js", "author": "Emirhan Durmus", diff --git a/src/data/providers/database-provider.js b/src/data/providers/database-provider.js index 23a53f11b..67fd47dfa 100644 --- a/src/data/providers/database-provider.js +++ b/src/data/providers/database-provider.js @@ -78,7 +78,7 @@ class DatabaseProvider { // Async function for the seeding process async runSeeder (dbName) { - const seederSqlPath = path.resolve(__dirname, '../seeders/db_seeder_v1.0.1.sql') + const seederSqlPath = path.resolve(__dirname, '../seeders/db_seeder_v1.0.2.sql') if (!fs.existsSync(seederSqlPath)) { console.error(`Seeder file not found: ${seederSqlPath}`) diff --git a/src/data/seeders/db_seeder_v1.0.1.sql b/src/data/seeders/db_seeder_v1.0.1.sql deleted file mode 100644 index 14f97371b..000000000 --- a/src/data/seeders/db_seeder_v1.0.1.sql +++ /dev/null @@ -1,91 +0,0 @@ - -INSERT INTO "Registries" (url, is_public, secure, certificate, requires_cert, user_name, password, user_email) -VALUES - ('registry.hub.docker.com', true, true, '', false, '', '', ''), - ('from_cache', true, true, '', false, '', '', ''); - - -INSERT INTO "CatalogItems" (name, description, category, publisher, disk_required, ram_required, picture, config_example, is_public, registry_id) -VALUES - ('Networking Tool', 'The built-in networking tool for Eclipse ioFog.', 'SYSTEM', 'Eclipse ioFog', 0, 0, 'none.png', NULL, false, 1), - ('RESTBlue', 'REST API for Bluetooth Low Energy layer.', 'SYSTEM', 'Eclipse ioFog', 0, 0, 'none.png', NULL, false, 1), - ('HAL', 'REST API for Hardware Abstraction layer.', 'SYSTEM', 'Eclipse ioFog', 0, 0, 'none.png', NULL, false, 1), - ('Diagnostics', '0', 'UTILITIES', 'Eclipse ioFog', 0, 0, 'images/build/580.png', NULL, true, 1), - ('Hello Web Demo', 'A simple web server to test Eclipse ioFog.', 'UTILITIES', 'Eclipse ioFog', 0, 0, 'images/build/4.png', NULL, true, 1), - ('Open Weather Map Data', 'A stream of data from the Open Weather Map API in JSON format', 'SENSORS', 'Eclipse ioFog', 0, 0, 'images/build/8.png', NULL, true, 1), - ('JSON REST API', 'A configurable REST API that gives JSON output', 'UTILITIES', 'Eclipse ioFog', 0, 0, 'images/build/49.png', NULL, true, 1), - ('Temperature Converter', 'A simple temperature format converter', 'UTILITIES', 'Eclipse ioFog', 0, 0, 'images/build/58.png', NULL, true, 1), - ('JSON Sub-Select', 'Performs sub-selection and transform operations on any JSON messages', 'UTILITIES', 'Eclipse ioFog', 0, 0, 'images/build/59.png', NULL, true, 1), - ('Humidity Sensor Simulator', 'Humidity Sensor Simulator for Eclipse ioFog', 'SIMULATOR', 'Eclipse ioFog', 0, 0, 'images/build/simulator.png', NULL, true, 1), - ('Seismic Sensor Simulator', 'Seismic Sensor Simulator for Eclipse ioFog', 'SIMULATOR', 'Eclipse ioFog', 0, 0, 'images/build/simulator.png', NULL, true, 1), - ('Temperature Sensor Simulator', 'Temperature Sensor Simulator for Eclipse ioFog', 'SIMULATOR', 'Eclipse ioFog', 0, 0, 'images/build/simulator.png', NULL, true, 1), - ('Common Logging', 'Container which gathers logs and provides REST API for adding and querying logs from containers', 'UTILITIES', 'Eclipse ioFog', 0, 0, 'none.png', '{"access_tokens": ["Some_Access_Token"], "cleanfrequency": "1h40m", "ttl": "24h"}', false, 1), - ('JSON Generator', 'Container generates ioMessages with contentdata as complex JSON object.', 'UTILITIES', 'Eclipse ioFog', 0, 0, 'none.png', '{}', true, 1), - ('Router', 'The built-in router for Datasance PoT.', 'SYSTEM', 'Eclipse ioFog', 0, 0, 'none.png', NULL, false, 1), - ('Proxy', 'The built-in proxy for Datasance PoT.', 'SYSTEM', 'Eclipse ioFog', 0, 0, 'none.png', NULL, false, 1); - - - -INSERT INTO "FogTypes" (id, name, image, description, network_catalog_item_id, hal_catalog_item_id, bluetooth_catalog_item_id) -VALUES - (0, 'Unspecified', 'iointegrator0.png', 'Unspecified device. Fog Type will be selected on provision', 1, 3, 2), - (1, 'Standard Linux (x86)', 'iointegrator1.png', 'A standard Linux server of at least moderate processing power and capacity. Compatible with common Linux types such as Ubuntu, Red Hat, and CentOS.', 1, 3, 2), - (2, 'ARM Linux', 'iointegrator2.png', 'A version of ioFog meant to run on Linux systems with ARM processors. Microservices for this ioFog type will be tailored to ARM systems.', 1, 3, 2); - -UPDATE "Fogs" -SET fog_type_id = 0 -WHERE fog_type_id IS NULL; - - -INSERT INTO "CatalogItemImages" (catalog_item_id, fog_type_id, container_image) -VALUES - (1, 1, 'iofog/core-networking'), - (1, 2, 'iofog/core-networking-arm'), - (2, 1, 'iofog/restblue'), - (2, 2, 'iofog/restblue-arm'), - (3, 1, 'ghcr.io/datasance/hal'), - (3, 2, 'ghcr.io/datasance/hal-arm'), - (4, 1, 'iofog/diagnostics'), - (4, 2, 'iofog/diagnostics-arm'), - (5, 1, 'iofog/hello-web'), - (5, 2, 'iofog/hello-web-arm'), - (6, 1, 'iofog/open-weather-map'), - (6, 2, 'iofog/open-weather-map-arm'), - (7, 1, 'iofog/json-rest-api'), - (7, 2, 'iofog/json-rest-api-arm'), - (8, 1, 'iofog/temperature-conversion'), - (8, 2, 'iofog/temperature-conversion-arm'), - (9, 1, 'iofog/json-subselect'), - (9, 2, 'iofog/json-subselect-arm'), - (10, 1, 'iofog/humidity-sensor-simulator'), - (10, 2, 'iofog/humidity-sensor-simulator-arm'), - (11, 1, 'iofog/seismic-sensor-simulator'), - (11, 2, 'iofog/seismic-sensor-simulator-arm'), - (12, 1, 'iofog/temperature-sensor-simulator'), - (12, 2, 'iofog/temperature-sensor-simulator-arm'), - (13, 1, 'iofog/common-logging'), - (13, 2, 'iofog/common-logging-arm'), - (14, 1, 'iofog/json-generatorg'), - (14, 2, 'iofog/json-generator-arm'), - (15, 1, 'ghcr.io/datasance/router:3.2.0'), - (15, 2, 'ghcr.io/datasance/router:3.2.0'), - (16, 1, 'ghcr.io/datasance/proxy:3.0.2'), - (16, 2, 'ghcr.io/datasance/proxy:3.0.2'); - - -UPDATE "CatalogItems" -SET config_example = '{"citycode":"5391997","apikey":"6141811a6136148a00133488eadff0fb","frequency":1000}' -WHERE name = 'Open Weather Map Data'; - -UPDATE "CatalogItems" -SET config_example = '{"buffersize":3,"contentdataencoding":"utf8","contextdataencoding":"utf8","outputfields":{"publisher":"source","contentdata":"temperature","timestamp":"time"}}' -WHERE name = 'JSON REST API'; - -UPDATE "CatalogItems" -SET config_example = '{}' -WHERE name = 'JSON Sub-Select'; - -UPDATE "CatalogItems" -SET is_public = true -WHERE name = 'Common Logging'; - diff --git a/src/data/seeders/db_seeder_v1.0.2.sql b/src/data/seeders/db_seeder_v1.0.2.sql new file mode 100644 index 000000000..9a2cdccda --- /dev/null +++ b/src/data/seeders/db_seeder_v1.0.2.sql @@ -0,0 +1,38 @@ +INSERT INTO `Registries` (url, is_public, secure, certificate, requires_cert, user_name, password, user_email) +VALUES + ('registry.hub.docker.com', true, true, '', false, '', '', ''), + ('from_cache', true, true, '', false, '', '', ''); + +INSERT INTO `CatalogItems` (name, description, category, publisher, disk_required, ram_required, picture, config_example, is_public, registry_id) +VALUES + ('NATs', 'NATs server microservice for Datasance PoT', 'UTILITIES', 'Datasance', 0, 0, 'none.png', NULL, true, 1), + ('RESTBlue', 'REST API for Bluetooth Low Energy layer.', 'SYSTEM', 'Datasance', 0, 0, 'none.png', NULL, true, 1), + ('HAL', 'REST API for Hardware Abstraction layer.', 'SYSTEM', 'Datasance', 0, 0, 'none.png', NULL, true, 1), + ('EdgeGuard', 'Security and monitoring component for edge devices running ioFog Agents.', 'UTILITIES', 'Datasance', 0, 0, 'none.png', NULL, true, 1), + ('Router', 'The built-in router for Datasance PoT.', 'SYSTEM', 'Datasance', 0, 0, 'none.png', NULL, false, 1), + ('Proxy', 'The built-in proxy for Datasance PoT.', 'SYSTEM', 'Datasance', 0, 0, 'none.png', NULL, false, 1); + +INSERT INTO `FogTypes` (id, name, image, description, network_catalog_item_id, hal_catalog_item_id, bluetooth_catalog_item_id) +VALUES + (0, 'Unspecified', 'iointegrator0.png', 'Unspecified device. Fog Type will be selected on provision', 1, 3, 2), + (1, 'Standard Linux (x86)', 'iointegrator1.png', 'A standard Linux server of at least moderate processing power and capacity. Compatible with common Linux types such as Ubuntu, Red Hat, and CentOS.', 1, 3, 2), + (2, 'ARM Linux', 'iointegrator2.png', 'A version of ioFog meant to run on Linux systems with ARM processors. Microservices for this ioFog type will be tailored to ARM systems.', 1, 3, 2); + +UPDATE `Fogs` +SET fog_type_id = 0 +WHERE fog_type_id IS NULL; + +INSERT INTO `CatalogItemImages` (catalog_item_id, fog_type_id, container_image) +VALUES + (1, 1, 'ghcr.io/datasance/nats:latest'), + (1, 2, 'ghcr.io/datasance/nats:latest'), + (2, 1, 'ghcr.io/datasance/restblue:latest'), + (2, 2, 'ghcr.io/datasance/restblue:latest'), + (3, 1, 'ghcr.io/datasance/hal:latest'), + (3, 2, 'ghcr.io/datasance/hal:latest'), + (4, 1, 'ghcr.io/datasance/edge-guard:latest'), + (4, 2, 'ghcr.io/datasance/edge-guard:latest'), + (5, 1, 'ghcr.io/datasance/router:latest'), + (5, 2, 'ghcr.io/datasance/router:latest'), + (6, 1, 'ghcr.io/datasance/proxy:latest'), + (6, 2, 'ghcr.io/datasance/proxy:latest'); diff --git a/src/services/catalog-service.js b/src/services/catalog-service.js index dee5aa6cb..8bd9e568f 100644 --- a/src/services/catalog-service.js +++ b/src/services/catalog-service.js @@ -136,9 +136,9 @@ const deleteCatalogItemEndPoint = async function (id, isCLI, transaction) { async function getNetworkCatalogItem (transaction) { return CatalogItemManager.findOne({ - name: 'Networking Tool', - category: 'SYSTEM', - publisher: 'Eclipse ioFog', + name: 'NATs', + category: 'UTILITIES', + publisher: 'Datasance', registry_id: 1 }, transaction) } @@ -147,7 +147,7 @@ async function getRouterCatalogItem (transaction) { return CatalogItemManager.findOne({ name: DBConstants.ROUTER_CATALOG_NAME, category: 'SYSTEM', - publisher: 'Eclipse ioFog', + publisher: 'Datasance', registry_id: 1 }, transaction) } @@ -156,7 +156,7 @@ async function getProxyCatalogItem (transaction) { return CatalogItemManager.findOne({ name: DBConstants.PROXY_CATALOG_NAME, category: 'SYSTEM', - publisher: 'Eclipse ioFog', + publisher: 'Datasance', registry_id: 1 }, transaction) } @@ -165,7 +165,7 @@ async function getBluetoothCatalogItem (transaction) { return CatalogItemManager.findOne({ name: 'RESTBlue', category: 'SYSTEM', - publisher: 'Eclipse ioFog', + publisher: 'Datasance', registry_id: 1 }, transaction) } @@ -174,7 +174,7 @@ async function getHalCatalogItem (transaction) { return CatalogItemManager.findOne({ name: 'HAL', category: 'SYSTEM', - publisher: 'Eclipse ioFog', + publisher: 'Dataance', registry_id: 1 }, transaction) } From 0b3b6e6dea4db1495a9db758463f3cede7979f28 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emirhan=20Durmu=C5=9F?= <51929176+emirhandurmus@users.noreply.github.com> Date: Mon, 6 Jan 2025 02:14:50 +0300 Subject: [PATCH 143/178] Update README.md --- README.md | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index ad333414f..da3e8d7c6 100644 --- a/README.md +++ b/README.md @@ -2,32 +2,30 @@ ### Status -![](https://img.shields.io/github/release/iofog/controller.svg?style=flat) +![](https://img.shields.io/github/release/datasance/controller.svg?style=flat) -![](https://img.shields.io/github/repo-size/iofog/controller.svg?style=flat) -![](https://img.shields.io/github/last-commit/iofog/controller.svg?style=flat) -![](https://img.shields.io/github/contributors/iofog/controller.svg?style=flat) -![](https://img.shields.io/github/issues/iofog/controller.svg?style=flat) +![](https://img.shields.io/github/repo-size/datasance/controller.svg?style=flat) +![](https://img.shields.io/github/last-commit/datasance/controller.svg?style=flat) +![](https://img.shields.io/github/contributors/datasance/controller.svg?style=flat) +![](https://img.shields.io/github/issues/datasance/controller.svg?style=flat) ![Supports amd64 Architecture][amd64-shield] ![Supports aarch64 Architecture][arm64-shield] -![Supports armhf Architecture][arm-shield] [arm64-shield]: https://img.shields.io/badge/aarch64-yes-green.svg [amd64-shield]: https://img.shields.io/badge/amd64-yes-green.svg -[arm-shield]: https://img.shields.io/badge/armhf-yes-green.svg [![JavaScript Style Guide](https://img.shields.io/badge/code_style-standard-brightgreen.svg)](https://standardjs.com) ## Install -The entire ioFog platform is best deployed through the unified CLI: `iofogctl`. +The entire Datasance PoT platform is best deployed through the unified CLI: `potctl`. -Go to [iofog.org](https://iofog.org/docs/) to learn how to deploy the ioFog Control Plane and Agents. +Go to [Datasance Docs](https://docs.datasance.com) to learn how to deploy the ioFog Control Plane and Agents. ## Usage ``` iofog-controller ``` -For full installation and usage, visit [iofog.org](https://iofog.org/docs/). +For full installation and usage, visit [Datasance Docs](https://docs.datasance.com). From 21efbe254175b3902596c0d01cc9a2bac55e4723 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emirhan=20Durmu=C5=9F?= Date: Sat, 11 Jan 2025 23:27:17 +0300 Subject: [PATCH 144/178] hal and restble catalog edited --- package-lock.json | 4 ++-- package.json | 2 +- src/services/catalog-service.js | 2 +- src/services/iofog-service.js | 15 +++++++++++++-- 4 files changed, 17 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 27e6ab6b6..3b0751b8f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@datasance/iofogcontroller", - "version": "3.4.7", + "version": "3.4.8", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@datasance/iofogcontroller", - "version": "3.4.7", + "version": "3.4.8", "hasInstallScript": true, "license": "EPL-2.0", "dependencies": { diff --git a/package.json b/package.json index 9541d57b4..fb77e0271 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@datasance/iofogcontroller", - "version": "3.4.7", + "version": "3.4.8", "description": "ioFog Controller project for Eclipse IoFog @ iofog.org \\nCopyright (c) 2023 Datasance Teknoloji A.S.", "main": "./src/main.js", "author": "Emirhan Durmus", diff --git a/src/services/catalog-service.js b/src/services/catalog-service.js index 8bd9e568f..5c0b7883c 100644 --- a/src/services/catalog-service.js +++ b/src/services/catalog-service.js @@ -174,7 +174,7 @@ async function getHalCatalogItem (transaction) { return CatalogItemManager.findOne({ name: 'HAL', category: 'SYSTEM', - publisher: 'Dataance', + publisher: 'Datasance', registry_id: 1 }, transaction) } diff --git a/src/services/iofog-service.js b/src/services/iofog-service.js index 1b2353d5a..c2505bf0f 100644 --- a/src/services/iofog-service.js +++ b/src/services/iofog-service.js @@ -30,6 +30,7 @@ const MicroserviceService = require('./microservices-service') const EdgeResourceService = require('./edge-resource-service') const RouterManager = require('../data/managers/router-manager') const MicroserviceExtraHostManager = require('../data/managers/microservice-extra-host-manager') +const MicroserviceStatusManager = require('../data/managers/microservice-status-manager') const RouterConnectionManager = require('../data/managers/router-connection-manager') const RouterService = require('./router-service') const Constants = require('../helpers/constants') @@ -607,7 +608,7 @@ async function _createHalMicroserviceForFog (fogData, oldFog, transaction) { const halMicroserviceData = { uuid: AppHelper.generateRandomString(32), - name: `Hal for Fog ${fogData.uuid}`, + name: `hal-${fogData.uuid.toLowerCase()}`, config: '{}', catalogItemId: halItem.id, iofogUuid: fogData.uuid, @@ -616,7 +617,10 @@ async function _createHalMicroserviceForFog (fogData, oldFog, transaction) { configLastUpdated: Date.now() } + const application = await ApplicationManager.findOne({ name: `system-${fogData.uuid.toLowerCase()}` }, transaction) + halMicroserviceData.applicationId = application.id await MicroserviceManager.create(halMicroserviceData, transaction) + await MicroserviceStatusManager.create({ microserviceUuid: halMicroserviceData.uuid }, transaction) } async function _deleteHalMicroserviceByFog (fogData, transaction) { @@ -626,6 +630,8 @@ async function _deleteHalMicroserviceByFog (fogData, transaction) { catalogItemId: halItem.id } + const application = await ApplicationManager.findOne({ name: `system-${fogData.uuid.toLowerCase()}` }, transaction) + deleteHalMicroserviceData.applicationId = application.id await MicroserviceManager.delete(deleteHalMicroserviceData, transaction) } @@ -634,7 +640,7 @@ async function _createBluetoothMicroserviceForFog (fogData, oldFog, transaction) const bluetoothMicroserviceData = { uuid: AppHelper.generateRandomString(32), - name: `Bluetooth for Fog ${fogData.uuid}`, + name: `ble-${fogData.uuid.toLowerCase()}`, config: '{}', catalogItemId: bluetoothItem.id, iofogUuid: fogData.uuid, @@ -643,7 +649,10 @@ async function _createBluetoothMicroserviceForFog (fogData, oldFog, transaction) configLastUpdated: Date.now() } + const application = await ApplicationManager.findOne({ name: `system-${fogData.uuid.toLowerCase()}` }, transaction) + bluetoothMicroserviceData.applicationId = application.id await MicroserviceManager.create(bluetoothMicroserviceData, transaction) + await MicroserviceStatusManager.create({ microserviceUuid: bluetoothMicroserviceData.uuid }, transaction) } async function _deleteBluetoothMicroserviceByFog (fogData, transaction) { @@ -652,6 +661,8 @@ async function _deleteBluetoothMicroserviceByFog (fogData, transaction) { iofogUuid: fogData.uuid, catalogItemId: bluetoothItem.id } + const application = await ApplicationManager.findOne({ name: `system-${fogData.uuid.toLowerCase()}` }, transaction) + deleteBluetoothMicroserviceData.applicationId = application.id await MicroserviceManager.delete(deleteBluetoothMicroserviceData, transaction) } From 376dd1b08a28004c585e3eb88780ec1344a4b768 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emirhan=20Durmu=C5=9F?= Date: Mon, 3 Feb 2025 16:32:25 +0300 Subject: [PATCH 145/178] agent router ssl configuration options added, public extrahosts fixed, microservice dynamic routing based on pub and sub tags added, agent networkinterface config added, new controller rest api endpoint for listing microservices based on pub and sub tags added --- Dockerfile | 2 + docs/swagger.yaml | 260 ++++++++++++++++++-- package-lock.json | 12 +- package.json | 4 +- src/controllers/microservices-controller.js | 12 + src/data/managers/microservice-manager.js | 55 ++++- src/data/migrations/db_migration_v1.0.2.sql | 30 ++- src/data/models/fog.js | 2 +- src/data/models/microservice.js | 3 + src/data/models/microservicePubTags.js | 9 + src/data/models/microserviceSubTags.js | 9 + src/data/models/router.js | 28 +++ src/data/models/tags.js | 2 + src/helpers/error-messages.js | 6 +- src/public/datasance-logo-white.png | Bin 31664 -> 61421 bytes src/routes/microservices.js | 62 +++++ src/schemas/iofog.js | 23 ++ src/schemas/microservice.js | 25 +- src/services/iofog-service.js | 11 +- src/services/microservice-ports/default.js | 21 +- src/services/microservices-service.js | 194 ++++++++++++++- src/services/router-service.js | 59 ++++- src/services/yaml-parser-service.js | 3 + 23 files changed, 761 insertions(+), 71 deletions(-) create mode 100644 src/data/models/microservicePubTags.js create mode 100644 src/data/models/microserviceSubTags.js diff --git a/Dockerfile b/Dockerfile index e55366136..4ac88738f 100644 --- a/Dockerfile +++ b/Dockerfile @@ -38,6 +38,8 @@ RUN microdnf install -y python3 && \ pip3 install --no-cache --upgrade pip setuptools && \ microdnf install shadow-utils && \ microdnf clean all +RUN microdnf reinstall -y tzdata && microdnf clean all +RUN microdnf -y remove microdnf RUN useradd --uid 10000 --create-home runner RUN mkdir -p /var/log/iofog-controller && \ chown runner:runner /var/log/iofog-controller && \ diff --git a/docs/swagger.yaml b/docs/swagger.yaml index 180cf9c1b..a39a8195e 100755 --- a/docs/swagger.yaml +++ b/docs/swagger.yaml @@ -1,6 +1,6 @@ openapi : "3.0.0" info: - version: 1.0.0 + version: 3.4.9 title: Datasance PoT Controller paths: /status: @@ -1683,6 +1683,68 @@ paths: type: string security: - userToken: [] + /microservices/pub/{tag}: + get: + tags: + - Microservices + summary: Get list of microservices with filtered pub tag + operationId: listMicroserviceInfoByPubTag + parameters: + - in: path + name: tag + description: Microservice Pub Tags + required: true + schema: + type: string + security: + - userToken: [] + responses: + "200": + description: Success + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + content: + application/json: + schema: + $ref: "#/components/schemas/GetMicroservicesResponse" + "401": + description: Not Authorized + "500": + description: Internal Server Error + /microservices/sub/{tag}: + get: + tags: + - Microservices + summary: Get list of microservices with filtered sub tag + operationId: listMicroserviceInfoBySubTag + parameters: + - in: path + name: tag + description: Microservice Pub Tags + required: true + schema: + type: string + security: + - userToken: [] + responses: + "200": + description: Success + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + content: + application/json: + schema: + $ref: "#/components/schemas/GetMicroservicesResponse" + "401": + description: Not Authorized + "500": + description: Internal Server Error /microservices/system/{uuid}: patch: tags: @@ -3294,6 +3356,14 @@ components: type: array items: $ref: "#/components/schemas/PortMappingsRequest" + pubTags: + type: array + items: + type: string + subTags: + type: array + items: + type: string routes: type: array items: @@ -3427,6 +3497,14 @@ components: type: array items: $ref: "#/components/schemas/PortMappingsRequest" + pubTags: + type: array + items: + type: string + subTags: + type: array + items: + type: string routes: type: array items: @@ -3741,6 +3819,20 @@ components: type: number edgeRouterPort: type: number + requireSsl: + type: string + sslProfile: + type: string + saslMechanisms: + type: string + authenticatePeer: + type: string + caCert: + type: string + tlsCert: + type: string + tlsKey: + type: string host: type: string tags: @@ -4140,14 +4232,37 @@ components: protocol: type: string enum: - - tcp - - udp - proxy: - type: boolean + - tcp + - udp + public: + type: object + properties: + enabled: + type: boolean + schemes: + type: array + items: + type: string + protocol: + type: string + enum: + - tcp + - http + router: + type: object + properties: + host: + type: string + port: + type: number + required: [] + required: + - schemes + - protocol required: - - internal - - external - - protocol + - internal + - external + - protocol PortMappingsRequest: type: object properties: @@ -4158,20 +4273,77 @@ components: protocol: type: string enum: - - tcp - - udp - proxy: - type: boolean + - tcp + - udp + public: + type: object + properties: + enabled: + type: boolean + schemes: + type: array + items: + type: string + protocol: + type: string + enum: + - tcp + - http + router: + type: object + properties: + host: + type: string + port: + type: number + required: [] + required: + - schemes + - protocol required: - - internal - - external + - internal + - external PortMappingsPublicResponse: type: object properties: - publicIp: - type: string - publicPort: + internal: type: number + external: + type: number + protocol: + type: string + enum: + - tcp + - udp + public: + type: object + properties: + enabled: + type: boolean + schemes: + type: array + items: + type: string + protocol: + type: string + enum: + - tcp + - http + router: + type: object + properties: + host: + type: string + port: + type: number + required: [] + required: + - schemes + - protocol + required: + - internal + - external + - protocol PortMappingsListResponse: type: object properties: @@ -4186,12 +4358,40 @@ components: type: number external: type: number - publicMode: - type: boolean - publicIp: + protocol: type: string - publicPort: - type: number + enum: + - tcp + - udp + public: + type: object + properties: + enabled: + type: boolean + schemes: + type: array + items: + type: string + protocol: + type: string + enum: + - tcp + - http + router: + type: object + properties: + host: + type: string + port: + type: number + required: [] + required: + - schemes + - protocol + required: + - internal + - external + - protocol PortMappingAgentRequest: type: object properties: @@ -4494,6 +4694,14 @@ components: type: array items: type: string + pubTags: + type: array + items: + type: string + subTags: + type: array + items: + type: string UpdateMicroserviceRequest: type: object required: @@ -4539,6 +4747,14 @@ components: type: array items: type: string + pubTags: + type: array + items: + type: string + subTags: + type: array + items: + type: string IOFogNodeTunnelStatusInfoResponse: type: object properties: diff --git a/package-lock.json b/package-lock.json index 3b0751b8f..0c5f9d408 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,16 +1,16 @@ { "name": "@datasance/iofogcontroller", - "version": "3.4.8", + "version": "3.4.9", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@datasance/iofogcontroller", - "version": "3.4.8", + "version": "3.4.9", "hasInstallScript": true, "license": "EPL-2.0", "dependencies": { - "@datasance/ecn-viewer": "0.3.13", + "@datasance/ecn-viewer": "0.4.1", "axios": "1.7.4", "body-parser": "^1.20.3", "child_process": "1.0.2", @@ -556,9 +556,9 @@ } }, "node_modules/@datasance/ecn-viewer": { - "version": "0.3.13", - "resolved": "https://registry.npmjs.org/@datasance/ecn-viewer/-/ecn-viewer-0.3.13.tgz", - "integrity": "sha512-nR6bDO24A8LFccR9LrQrsy5OquSOBBqn5UTcztsgVfNoq/fDjVFo0zPZzV7G9/rXiQT6/IbZjm+LTO37Vy3ysg==" + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@datasance/ecn-viewer/-/ecn-viewer-0.4.1.tgz", + "integrity": "sha512-RTcAH8/5dJNdOriw1D8WragMscqus2kpHgiPb9Bh/QgmBwdkv6/ZElyFIIKAYctcKmWLggrKpuX4sik+iZLo2g==" }, "node_modules/@eslint-community/eslint-utils": { "version": "4.4.0", diff --git a/package.json b/package.json index fb77e0271..3f3804162 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@datasance/iofogcontroller", - "version": "3.4.8", + "version": "3.4.9", "description": "ioFog Controller project for Eclipse IoFog @ iofog.org \\nCopyright (c) 2023 Datasance Teknoloji A.S.", "main": "./src/main.js", "author": "Emirhan Durmus", @@ -55,7 +55,7 @@ "iofog-controller": "src/main.js" }, "dependencies": { - "@datasance/ecn-viewer": "0.3.13", + "@datasance/ecn-viewer": "0.4.1", "axios": "1.7.4", "body-parser": "^1.20.3", "child_process": "1.0.2", diff --git a/src/controllers/microservices-controller.js b/src/controllers/microservices-controller.js index 98315be9a..6b35b3e1a 100644 --- a/src/controllers/microservices-controller.js +++ b/src/controllers/microservices-controller.js @@ -32,6 +32,16 @@ const getMicroserviceEndPoint = async function (req) { return MicroservicesService.getMicroserviceEndPoint(microserviceUuid, false) } +const listMicroserviceByPubTagEndPoint = async function (req) { + const pubTag = req.params.tag + return MicroservicesService.listMicroserviceByPubTagEndPoint(pubTag) +} + +const listMicroserviceBySubTagEndPoint = async function (req) { + const subTag = req.params.tag + return MicroservicesService.listMicroserviceBySubTagEndPoint(subTag) +} + const updateMicroserviceEndPoint = async function (req) { const microservice = req.body const microserviceUuid = req.params.uuid @@ -155,6 +165,8 @@ const listAllPublicPortsEndPoint = async function (req) { module.exports = { createMicroserviceOnFogEndPoint: (createMicroserviceOnFogEndPoint), getMicroserviceEndPoint: (getMicroserviceEndPoint), + listMicroserviceByPubTagEndPoint: (listMicroserviceByPubTagEndPoint), + listMicroserviceBySubTagEndPoint: (listMicroserviceBySubTagEndPoint), updateMicroserviceEndPoint: (updateMicroserviceEndPoint), updateSystemMicroserviceEndPoint: (updateSystemMicroserviceEndPoint), deleteMicroserviceEndPoint: (deleteMicroserviceEndPoint), diff --git a/src/data/managers/microservice-manager.js b/src/data/managers/microservice-manager.js index 559ad59bf..00320b391 100644 --- a/src/data/managers/microservice-manager.js +++ b/src/data/managers/microservice-manager.js @@ -24,6 +24,7 @@ const StraceDiagnostics = models.StraceDiagnostics const CatalogItem = models.CatalogItem const CatalogItemImage = models.CatalogItemImage const Fog = models.Fog +const Tags = models.Tags const Application = models.Application const Routing = models.Routing const Registry = models.Registry @@ -213,6 +214,18 @@ class MicroserviceManager extends BaseManager { as: 'application', required: false, attributes: ['isActivated'] + }, + { + model: Tags, + as: 'pubTags', + attributes: ['value'], + through: { attributes: [] } + }, + { + model: Tags, + as: 'subTags', + attributes: ['value'], + through: { attributes: [] } } ], where: { @@ -374,12 +387,25 @@ class MicroserviceManager extends BaseManager { async findOneExcludeFields (where, transaction) { return Microservice.findOne({ + include: [ + { + model: Tags, + as: 'pubTags', + attributes: ['value'], + through: { attributes: [] } + }, + { + model: Tags, + as: 'subTags', + attributes: ['value'], + through: { attributes: [] } + } + ], where: where, attributes: { exclude: microserviceExcludedFields - } }, { - transaction: transaction - }) + } + }, { transaction: transaction }) } async findAllExcludeFields (where, transaction) { @@ -389,18 +415,27 @@ class MicroserviceManager extends BaseManager { model: Application, as: 'application', required: true, - where: { - isSystem: false - } + where: { isSystem: false } + }, + { + model: Tags, + as: 'pubTags', + attributes: ['value'], + through: { attributes: [] } + }, + { + model: Tags, + as: 'subTags', + attributes: ['value'], + through: { attributes: [] } } ], where: where, - order: [ [ 'name', 'ASC' ] ], + order: [['name', 'ASC']], attributes: { exclude: microserviceExcludedFields - } }, { - transaction: transaction - }) + } + }, { transaction: transaction }) } findOneWithCategory (where, transaction) { diff --git a/src/data/migrations/db_migration_v1.0.2.sql b/src/data/migrations/db_migration_v1.0.2.sql index 0779e09cc..769defbee 100644 --- a/src/data/migrations/db_migration_v1.0.2.sql +++ b/src/data/migrations/db_migration_v1.0.2.sql @@ -93,7 +93,7 @@ CREATE TABLE IF NOT EXISTS Fogs ( catalog_item_message_counts TEXT, message_speed FLOAT DEFAULT 0.000, last_command_time BIGINT, - network_interface VARCHAR(32) DEFAULT 'eth0', + network_interface VARCHAR(32) DEFAULT 'dynamic', docker_url VARCHAR(255) DEFAULT 'unix:///var/run/docker.sock', disk_limit FLOAT DEFAULT 50, disk_directory VARCHAR(255) DEFAULT '/var/lib/iofog/', @@ -565,3 +565,31 @@ CREATE TABLE IF NOT EXISTS MicroserviceCdiDevices ( CREATE INDEX idx_microservice_cdiDevices_microserviceUuid ON MicroserviceCdiDevices (microservice_uuid); +ALTER TABLE Routers ADD COLUMN require_ssl TEXT; +ALTER TABLE Routers ADD COLUMN ssl_profile TEXT; +ALTER TABLE Routers ADD COLUMN sasl_mechanisms TEXT; +ALTER TABLE Routers ADD COLUMN authenticate_peer TEXT; +ALTER TABLE Routers ADD COLUMN ca_cert TEXT; +ALTER TABLE Routers ADD COLUMN tls_cert TEXT; +ALTER TABLE Routers ADD COLUMN tls_key TEXT; + +CREATE TABLE IF NOT EXISTS MicroservicePubTags ( + id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, + microservice_uuid VARCHAR(32), + tag_id INT, + FOREIGN KEY (microservice_uuid) REFERENCES Microservices (uuid) ON DELETE CASCADE, + FOREIGN KEY (tag_id) REFERENCES Tags (id) ON DELETE CASCADE +); + +CREATE TABLE IF NOT EXISTS MicroserviceSubTags ( + id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, + microservice_uuid VARCHAR(32), + tag_id INT, + FOREIGN KEY (microservice_uuid) REFERENCES Microservices (uuid) ON DELETE CASCADE, + FOREIGN KEY (tag_id) REFERENCES Tags (id) ON DELETE CASCADE +); + +CREATE INDEX idx_microservicepubtags_microservice_uuid ON MicroservicePubTags (microservice_uuid); +CREATE INDEX idx_microservicesubtags_microservice_uuid ON MicroservicesubTags (microservice_uuid); +CREATE INDEX idx_microservicepubtags_tag_id ON MicroservicePubTags (tag_id); +CREATE INDEX idx_microservicesubtags_tag_id ON MicroservicesubTags (tag_id); diff --git a/src/data/models/fog.js b/src/data/models/fog.js index 07e02c87e..df198da4d 100644 --- a/src/data/models/fog.js +++ b/src/data/models/fog.js @@ -185,7 +185,7 @@ module.exports = (sequelize, DataTypes) => { }, networkInterface: { type: DataTypes.TEXT, - defaultValue: 'eth0', + defaultValue: 'dynamic', field: 'network_interface' }, dockerUrl: { diff --git a/src/data/models/microservice.js b/src/data/models/microservice.js index a3c080cf7..1856805d0 100644 --- a/src/data/models/microservice.js +++ b/src/data/models/microservice.js @@ -164,6 +164,9 @@ module.exports = (sequelize, DataTypes) => { foreignKey: 'microservice_uuid', as: 'extraHosts' }) + + Microservice.belongsToMany(models.Tags, { as: 'pubTags', through: 'MicroservicePubTags' }) + Microservice.belongsToMany(models.Tags, { as: 'subTags', through: 'MicroserviceSubTags' }) } return Microservice diff --git a/src/data/models/microservicePubTags.js b/src/data/models/microservicePubTags.js new file mode 100644 index 000000000..1cd759355 --- /dev/null +++ b/src/data/models/microservicePubTags.js @@ -0,0 +1,9 @@ +'use strict' +module.exports = (sequelize, DataTypes) => { + const MicroservicePubTags = sequelize.define('MicroservicePubTags', {}, { + tableName: 'MicroservicePubTags', + timestamps: false, + underscored: true + }) + return MicroservicePubTags +} diff --git a/src/data/models/microserviceSubTags.js b/src/data/models/microserviceSubTags.js new file mode 100644 index 000000000..7de19bd48 --- /dev/null +++ b/src/data/models/microserviceSubTags.js @@ -0,0 +1,9 @@ +'use strict' +module.exports = (sequelize, DataTypes) => { + const MicroserviceSubTags = sequelize.define('MicroserviceSubTags', {}, { + tableName: 'MicroserviceSubTags', + timestamps: false, + underscored: true + }) + return MicroserviceSubTags +} diff --git a/src/data/models/router.js b/src/data/models/router.js index a033f1f57..97d75e940 100644 --- a/src/data/models/router.js +++ b/src/data/models/router.js @@ -35,6 +35,34 @@ module.exports = (sequelize, DataTypes) => { type: DataTypes.BOOLEAN, field: 'is_default', defaultValue: false + }, + requireSsl: { + type: DataTypes.TEXT, + field: 'require_ssl' + }, + sslProfile: { + type: DataTypes.TEXT, + field: 'ssl_profile' + }, + saslMechanisms: { + type: DataTypes.TEXT, + field: 'sasl_mechanisms' + }, + authenticatePeer: { + type: DataTypes.TEXT, + field: 'authenticate_peer' + }, + caCert: { + type: DataTypes.TEXT, + field: 'ca_cert' + }, + tlsCert: { + type: DataTypes.TEXT, + field: 'tls_cert' + }, + tlsKey: { + type: DataTypes.TEXT, + field: 'tls_key' } }, { tableName: 'Routers', diff --git a/src/data/models/tags.js b/src/data/models/tags.js index 585703a18..356cf4624 100644 --- a/src/data/models/tags.js +++ b/src/data/models/tags.js @@ -22,6 +22,8 @@ module.exports = (sequelize, DataTypes) => { Tags.associate = function (models) { Tags.belongsToMany(models.Fog, { through: 'IofogTags', as: 'iofogs' }) Tags.belongsToMany(models.EdgeResource, { through: 'EdgeResourceOrchestrationTags', as: 'edgeResources' }) + Tags.belongsToMany(models.Microservice, { through: 'MicroservicePubTags', as: 'pubMicroservices' }) + Tags.belongsToMany(models.Microservice, { through: 'MicroserviceSubTags', as: 'subMicroservices' }) } return Tags } diff --git a/src/helpers/error-messages.js b/src/helpers/error-messages.js index cc4818f3f..3eac8674f 100644 --- a/src/helpers/error-messages.js +++ b/src/helpers/error-messages.js @@ -110,5 +110,9 @@ module.exports = { INVALID_APPLICATION_TEMPLATE_NAME: 'Could not find Application Template {}', APPLICATION_TEMPLATE_INVALID: 'Application Tempalte {} is invalid', WRONG_PUBLIC_LINK_PROTOCOL: 'Public port {} has a scheme of {} and cannot use protocol {}', - NO_AVAILABLE_PUBLIC_PORT: 'No public port available in range for {}' + NO_AVAILABLE_PUBLIC_PORT: 'No public port available in range for {}', + INVALID_MICROSERVICE_PUB_TAG: 'Invalid microservice Pub Tag \'{}\'', + INVALID_MICROSERVICE_SUB_TAG: 'Invalid microservice Sub Tag \'{}\'', + NOTFOUND_MICROSERVICE_PUB_TAG: 'No microservice found for Pub Tag \'{}\'', + NOTFOUND_MICROSERVICE_SUB_TAG: 'No microservice found for Sub Tag \'{}\'' } diff --git a/src/public/datasance-logo-white.png b/src/public/datasance-logo-white.png index 15e92a20d79abacdfd8b534a6725b5cf63334f02..759c70e2ad2bcd352a2eb0ec65865b9b166d3a41 100644 GIT binary patch literal 61421 zcmYIw2UJsc`!Hgut%$z93J5aPGPF#^0FmV=BC=epgeeF@OppW!k!gK}DoYb&hM;0W zfg~6pA%vxraRrhpBSIKrA`t=vg6#EO{|)`_Ii4QV-|xB4efIRhC1*Q@ovJ%!WMmZV zFZ^~zM&_p(85vpBPd|dcoV#?F*h585t$*?|-)0U(o_j$ZW%0u{$e6VXKXU zfB7N!jMEtznb#TeYyNUFGUDIue>-z6dfVjCj+$GpII|h7Ovn-0D?jX|{;~5T%Wr#( z`(*2X15ynDWk~B^H&4<}7PY>7p!52CfYWa+={`LlD-OBs|10H+;&}a(xN#7}SG>zx z=*-QXTeaeBdSW|I5#xw}i0eUt;ms-fPShNN{x*PW-e zEX6QXM^OE@Ec>F>yf>cV<=YrW7Yv;Z!5^VEP%JTOwNo%DNEHZypMeJe0N?=Vl+do| zvOD-q-=C&I6-E7Dyt&9i|3bleAX3D&J%t>6wepQr>kdIhU9T{%OD(uS@Dg(2< zSn+Z=x-)vses$&M$x{sJ%|z{IiOI~K$RS9XIIl987KUyXL;+odGDT4la(&tO0Vf$+_uMrDynrl;ib#$GRKxR_yr3C3D^H?=)}I*P!MYfeZKOX z1fp2vATPagAXQc)=v}mYc|oaB57Q3K6J!CVE&Apq;K8hO1S4Ht@HAx$ErsWa$=cjV zZ&5L3Q?LM#@rr<3i>0{@)EXK~+>?I3s8CUQw1T~V#@LlVRe>T6Li&xE4m3DZN!eEP z7v`FTET|A500xo;%FF*f?#}Oj*w-8B&1#KuS#a6ysA0Te($NM0$%H3>GGX8OqW3qp zj;=kF)%cMcIaI8&;G~ghsn7JJ;m-8h_F{!N7s-9WPeV8x>A8x|qo4fmMS3%kNo{T;A;N_}ZziWRQ%z$Z z+XDC_$W5Qtf+&q#OJk-By88Fgg4|fc<=c|n_cyCbrKkMP9Q))?uBGrG&3A$At$d1H zH|DHldBS2&?UZU-yywgp1)!kzsb=2dIP$$e~m=GIsQq>zKJ!dT3 zKQog6iV(Ni2RH+4I#8|}vz#4=@pb)5aOs&&6FJMOw*>|!mO8kzG+&zQo3)$X(G8F4 zAh^YwCu?iAFiSuB$+Hy%)p9DsQ6t}r<+oAbwY~t`gsP@BY~f|RWB-i42`Kg1qdves z!gf6JVK3W(t(wtz!P(x~iG9J@#o2-F$ks^kJ;-qyE*PXGg?mUkCs>EPe_;mAQ{OLS zcccT(d@sz}y1S7Z>nQXj4kLO0{$_;#wtw(wN*yToPy*4g)pR)+Y-`|4{u<;e;R{{} zY6LrgJ!M88K=lkhsTwJ|lMH19_asU_+IVoqT>*?Eb#ytHo+PBj(o92m2hade{P1L$ zkEzSF4SN>qV#HZ`L*x}IZ&BrddbHBVni_r*V1h4k_x<`>t?EdDua3>D24f*8eT467 zP#Nk6<>-}(gHHahS)#V5{O%Vh{WHm}y%LLF6%+%c-mn6?7bT_diO>Kj!=z^zN`dF> z-5ITPjT^bxIWsAkuKp;eN>%!@L}tvEH!v)j!cMPUjC=w5=?shF#nZESr~XG5zPS zO_egBoar<-<4bf_x!3C`WQTX*y~-1@f393F=<^l|K<0RMJ;F^jRa&D{Ev}6`6GkBf zcdE^86Q@*Tkdjg2=G=E5@%<^ju!96O9hM!R1?2Jdp&JF6Ro8PkT7^#Og?*+TUe$HG zOKvQ^HE+a=sERX#x=i@|{Q$kt_@Qv3=9e0utXV6H)jxn_ifutiC#P$==`we2bYb8B z1ptfq3|C*{@atXAzWjYR*jr#Zc&NFakbJH2J}(N==%#ISaTtP7FO&lCu-q9vc7Yo? zHGk*2WKd8HNvNG*{Izmg!W6JTo0yu1*%=)VX9I33DEK-KcZ-JY62{K03pDYY*V?!L z1ElH2(NDSiyt!89&Az&f(q;4+$pgVvet7TAlM|tLL3Lpfi`;HUWeehg0>TucA=YY{ zCwNq6t-NLBc3s%U*>w;*7}BDaK&+A_IfYtRkzY4ljw>l>#`BfPH-nvaM)wUZqLF|EUFC?m(KW$6Ab^1AJ%Q(Y_bUY7F!%*J zOeW~+6sq~2oBKQkkhV;rJ_)pL7dK8YYx3jBpFYb2CIkaS?!^9?T}RsDy98K*QPkY! zPK>{#G_Y;ULyY-yBjH+{i_YUgBUrr6MM`032i<31_pwhZUR>o*SLUmVUWr+Y49i$MRP)5M&FUF3uXiz z%)-jhZ4q(ryS716o6$bI%T)*ggZj+|1Pg65rzj^1$t#DLsg@gSupCO-)P_8o%fWrl)bU2_?EL>K70CMUA}JU!fR-#h4ID zy}+n1s&Vcq{L^kroHb9&#c{)o`4qk?TIm&pObJ8%reO9PPeoL~bLcvy;9i1*+kUAG z8MA0LHWMpHlDljBdv-#GbIY&VJ&hgl0fK84K&x#5X{(hp_yk~>NVFrvKizry@;>}( zLx7}kXi}+h{RHj`dVY(rK@Lja!U(bT`A%i{Y;8EXZB{Ll$V1lkRSQBP$+dENAefIQ zac+!-bPGgx{KkFA8RljIL8xsr6?9dk6w$o}D9eW%X8Y|O%G4sMd~)S1k<6XTfh9k# zMrK!A4-;-(!4$*mWJzv+MTVFWh1h-Z-k43eR>s$r-*Y{?*0Bm%8T>| zM=X}Z&ESU9D@fY(lhjbFFTo23N80}Od2;JA<^}wzEXi^spw>SHTRXeHZtrwPBbXpy z12Ke@+I~qIrBHs1azWuAU@~KFN)ycsF2C>ran9cv0^TqM#;f%YgdPXr~ia1r|e-H}7u`b3(Zu zJhnKiJQS!-x&_BPhZAK_

~@!-8ts`NnKD-{w1)oZ8ee&Qw=N zFE&Q6{f?hg+Xk)<8Txbe;%|~wCN5=SL{GW*!+_bcBfG<)mAa+f9jUUUv`o20MHTC; zx~i3QRfjLX3qA>~0TVDBdJU-vA8qLhJvC5`OTMm3DIBaR4&Vw-LAFaYmg6N=gLMw` z;?a)K@mtw-FIUcztfb*y;tktvob&BxSJzEqp-lG^rGL&139ul*Gk`zvV&~o{mnh0O z6M0;LoEV&vm+sV>VP+zUhg#xJqpU5LFB*_7bPGEN(T#tt?fQom6^BP}!IXUUk4Vh|#>*DrQ?{>pFXyg+;9D=D6!mNZ& zOB3?jU!`o#0>x)OQ*Pe-M65N=*}$7yAWu-%F#{d7_| zX%)Z9*Gee#y5>;iy~=TR3u1e|J90(}tN8TYzwWf3y(8)jcSI+{PKhZEw}py82*f*B zOUV7Ee?vL*iy$?R5@Iuarz1v`DlkIN72E55W!7Z1#shnEV>Gq`M16fZOVObeA@_n$ zW`3A6{nekdLxM8^->&F=Mreo{yxX8*$?dp88#iLTYV5aRgk5m7mt;l|Q+*ON^oxPJ z@A&7ZNd0Hx{i4KRgI0J@y$Q~q=IS(p18lTbGtL*C!*_%}5WMEFZ$~(B%u+&b%0b$C zBZ!2xnz0Kp9BoaYYdhY(FM@T6JbnXcOc!cNzf$QBSyI`f`;vN-SZ&;GgES)@hDzG` z1ZzW5u3U0ogc>2hnx0cb6#51(U2|$Pn~M(aReLvQ4Z-=$^FrgEWt|uO_^rCrX?064 zQskKa7^Yib)g8cr39X@a=QI$LKFuNa7_1y*cnc3lrFxle{}yY>C| z>k4=N4-~B-TmRa7zx3b?!O+l$PUWfNJg;h}t*GdE``INnV56-Z+0FPB7fQ43s{wx&@XHv7wS+(404Xbx%hy=NJR@z#efL!z)HhjL$BwZ8 zJF_o zY$7m%tImMnHtM4PVC+Ra^a`x;y$(f#cKgbx~~snh?kkOaQiEp3cBG6ZU*rPG}7B zN)Hz9%5X%Pu{GvJe5lp3Kl(Sx;|XfFL+CFN>kGHToQszSe6rR&B?Fe5|E9Y^XSiV@ zb4jRL!wVb5@K*TG2DPZW7Bl*J6ftdX0<})BK6MJ`hMHA`^&f9bA@JHA0inU`bH#9Ue$N_j$9^Yc>yI^D7`CaK;@~8IJt=a zszgdjP$4jVC1>LEXoD*7hp5}>#DEr0bHDMv6MH6!{;KM)Hz+^ip#qi)DnGWmm_G_M z3cU;lh0>Qb)p@?W&(r@cEO!(F6osA|&Q*JKf6-)Tj`pI1DHUMFj1{OO4&^#Hvu}?G zwnNmBlvtOo_r6df&%GVdaiNSy$4PcP#QN!2RTT%U3W6X{XNi*kO{DBKDg$Byxsg;A z<6L&xk;XpIw8As&e^xA9fowyj+xukYXE+pJ)?Xr0 zL_V4Nuwc`F?k46kJiD0srkiJy63PJ!6I`@XkIhxg^}z>$yuh;AY_@|l=eXCEj!W#e zmn#Mt6w)nNoY|k17;82~4$r?u#W}nJD&!1qXhV-0lAo|q zqLbidbTOV(_gac;P9D?n6YzY2V6t}3X_$lGG~3f+0o9EOGC#@;MiT_E`FuIc;IWwW z&S($GUA6Al)lKMfa?R&qU^~G=i>1Tsp{Bsu?-tjz`0j*7E#ExG^hMmp)O>xMq$03U z@MEv?vFfu~4rK{LF71oe0c#!(>9a(b7x~hw`lRj&Et6T1HkE5Pw_cB^-vO`ZTWB5f1p`Igw1Kw!4^P|5IOPbgTa|? zE)8M4Sxj9G@Aj11)D?N1wuov$4(d*PWAV`p>>S0YBDc!4jdD~9y{1n8sIMLvgyWER zW5s#lxO9$#;e@G=-VeB_E~Z+uHSm7O*gAi*Vs{1;#2+RfEwReiEgVmpB?OMZjG@I` zY&Rw)k7hYG4A>6|)U$8-N+DOklaj#EOfH6!)Rr9G>R;?B#6gxEo0!x64Z0 zfU;U()gImU9b@c8wkQdUVu|xiyc_@Q;j)0}ZkR^Q4Krf3;>_ArGZniCQO%8ymhG=o z@%vc7YB%gGZVeu_PK1O|x1xftE9B=oQ%eFmgfCHJ*f(&U*bF=wkuF%aZpp#X( zKEHO4YWBn_W?;CpnB2_lK3QPavgjcFT<@0x{H?1FB)7+?)-z)IK4~CsojcXWd*6b5l zX$#|dd3!jHI_q9x1(WU$!gRjl6^mq-mvWC6=kBX$MF&TIE*UHxN6JU?xG9$yO8{(Ewm4Y2eYeV0U&Z&7>;- z;hSCl5`fw)ck9O{l#aD+54|((Rw*t9*bsFGTHK{!d2;kk7>_lT*~Y6>x-dMF99(l1 zeGN%8#GR9T8x-Dv+>_K<=Z%8ZaR@X&)m`bt@f;xuljYl`k%&Yr+rj>ya@9H6Ut0s*GYM3@v_IkiCTy^_tiN3 za(84s>@-;E5eRCR1F04WC7Yti|>06Ka{v zppsOxviKO9DXP#bM=d)Rx_n;3kKJ5`1h-;%bLiC7z*s-0^D*LecMX0Nu8zNza4DEx zm9zBx38j8_7*3d4lT-^vJ#RPEjCG$ZTuizJIf=~fiEvt-%?oMVt=xCw5%iO?inRs% zd8m4_HEHm*4u1fEpTLgj3M=)btTk;fM?RZ>E+9dmcDj3V`JW5Mgb=Hep2^i4PTVR@ zD)e=+=*9KJffS2hn%4=MTtSt=p3Udd%OCwrt~PZ?4o#U@HtLiZ1lmC52j+Z;Gevo% zfY61w#^RF5;@rT)e?1A2vsCW+rUutf?ZlM?M_+NG9}-h}Zm=!w_%Zi^EJ=Tjj`SEV zxaC6#ca{w52X2OSHBx)N#a0LT^8PzT%S)#k*)A4a2Jy~{4now)m%g@Nf0in2P}U+0 zjFol`i95U+5L=2o9Q5aQ7v3oZCy(fUW7}$1^#SWgL{JMJlB_|KOcgDw>?V&#+Zhyu zcsCYupjMS0=6vW(3k0f%SKeanT#2Z5WJ*W$C@_e=^WfQZ;RtAp7GoDj)&r&bjpj^-DKHpo%y-cvdfb?b@`sck8$>p}SCwt%GZ#; zLCHu8IYFx!N*Pczdow5+NCZw7WMY^8`A^Jq1ze+fQ-WqJKJhO2~$ ziY^RW^v1lbALDc5FW5LNz&rR9(EOndG9pE@7}YBl!JJa<%(jtZOwdsHMe@&}{9Dtx`*nyHXU^IsUy9JD>39wBgBcXsZF?7uIOi>cF$_X^dWN zL$u#dv6|l zQVR8Sztjb0OT#X|g{rf61&u6V`MOz&dZ6iV>5(i!{ZMO&ty*$~{NLj*L{w^9RNQP+ ztNAfz?nraaLrGZOI}SAA9m_uO4WesJ zCh>zJt*|N6PIs1eG*xh%+COh=u8ciMQ8cuwJ@6a*OPZNv-XmXkO9(4}k!P}W+M)<^ z-(aoiHI^>NsewBW-{bv6Q!63&malxN$fDk|T*SC}D#1X=|0YNSHmXUr+P{ACd5d_dIXuzPG&W%c3ruZTYXh>A9Vn%a>I`QLF~|tT+a$8{5@8L*b0-}LrdZLfqNI7 zR7fzwEJg6WAxL{(AUYUSWB1_{;DuQG(oHDTD(u9aD$aUL%s`$PG-KM*0%$kTC^TB~ zMSy|oX7~K~b>(^f_Rs^#UvO$32M=)qx_4piVSBIef+i+_`@k{aF%XOy3GVrCJBFv- zoS==Rjz$1i(T-uqOfPbkBh-nOFLn4%xPq+6yW0N_A$bzs(-UK2UcWz)Oe!3`475O0Hi-!TN~r{WVmSVpShCWx%IgWNJ1oyBJnH9W z)u>~^odk>PRu9v%nBU}8hCK-3A_1^v#=hO~j}r<~Q76(b(2atw_~geCgt|L)ZR`!z z8c{+mn~T;tmW(*xuGefOn0siff@AZuf@#Bh?YKe6va^}WRHfg)@>@&uSX}`%(RtdZ zlUQeny=a~1Mc1GTS6NU40hm*Hy;9@YV7tT5(4LQZrTY^Er+{rh5kWVtjiqA|xgPbu z?r4pvS)*wkzRi}bjss_>)Cmq?v=w*!sw6KJ@2(?^JXq|lmw>+oR$H$&Vg9UbaOkVD ztQxyUT7}d$9PGuie6gjqbt!nNF2|8h{<$Ndj-H>oVBHw7WixP|Plqg*(Pk=Tcydba zV{SmQU6zkEa8@wtZ4;o$NG;@Wv})LaV1D2w+(M{BV@fEyNR z_OtI+RJXzTODTc>H1LYI(nd7MEced;>9>Yuk0#)Gy~Y|uwG+VSABvwxK49K);-DaQ z=(rK%W;48vi)q<>WdPW=(PI``A!JXqk@7}y5S3LS&StCEy!2$=`=pO9|80tWWb@Jm zr7W8(`!al)rjVo3k< zvEL{ni@>Gm^*izXm&iA#yP1t6z^b4OQZXoe!xZoNGIlOBn!}0P#A@)jy6E4F%W?5$ zD!STS%FkfbdQ0PR>~r{PlUcJG;`Lt)LCRg;D_F6xLPUJ2D%U@2IvVcWuOpB z{!|@Szz0jUwdsV}&228+NQ>a5g1l5A*rk*YJ;eV#-|au&eh<8Mkg`76j5qpXjeYs$ z3l?!o<637yoiA&bFL}J?<;s!9+}?TKrd5NENUYOyUzoa!`Vv^0V@Lf@YCKMuMeHDz zXj$~lSm($IT(}iJ@Hk=eGxi%~>Bw}52=-$ueA`fMG2aJQSMU(`jcV^sz&x;cE~%WYqn*1tA)BcgX` zCwO<910xWaw+Y2;Hzo*-_AQz>`vmo+K^|j7ClgCBtv`&bd&96(!(I!$Zz}AaA(4c2 zTcK6ftHa7TUerZi-^}pi`+Uvb)2#&oK355ICAif5-p?$Q6F2f9Zhk_rmPe#&CHLLp zY4=wa2Q&t9^AbB-Y}hlysy=!@uB}VC=2843*ptJK;4UkOdsG|BI2giED0%=I=V{O| z75cpfzAF%{%MwSC5S3u9#{9OL@*ud#BeFU#-R(v6y*wg){*xS}PB>QiuZ#6aN}6bz z13P=F!#2VG8|A7Ol#&_c;}N);#hRBPkG)~vi}V2=2?c6y&7rmyoP)G;+#j4?{K9sv ziE?U>c8(8MpmuQ*yrhEM@%MSGdIPh^>3xcZ|rc|31{ zfBfnDo8RVkWt5ISjE0@zYL3Nk){iy2LA>GI!209MJ_=%B*|EPt3NtJB@Tr-#%e1Qs zVu&ZP@nuq^D37$G@A|6!y!xf$(YLew<86}o4cjDLtsUG}sP*za!ANL4(YG7&z<{#B zsgdU-^vu9Yp4&+6Q{s)FqMgzIH)hct8a;Ax*sGak>%>8ZzFt2GeO1h7fxVlGUaUkDD{aIjk^Askx|Meink`K+Gwm|GK>wme`iUxHkGviQy}^pu?C z4ws_n5*1Bu2YSvMQf`H5#CEMG{LA3GY5iwK8KKc+Uh829w5|7BdFhu?Ti_T(Wh#EN z%I|pHvlaGPLPV%!G>?+e8#u-iMtC#+_U@Dlh#L=VS?ZTg=Z`*B9WK-T7+11<*@=S< zRcRN^&+js_H!Sn7UX2Nw-u(Ex+#|$tiOR++9Z@xo$VWVsLkb7I(k?=^t=@ z0P^MzlCDmEU&X-lxkhea9KBe0uR6Bw*mAO}v)(Z74cO-{{JrG^J%7c`>AarmT0Tsb z%=+6CQciE-i=`o7(}{{1rN*rFT2 z9A=J#mq+lcjwA}TsQMnpxWX#Y>g!(4-gBY6?bbE*%7~u@;YREk2BfZJ%p|yM%NE=| z_~C8|5`pegb%S@thd8y#hf0PCa#L3kxxn$wfTSILN!SC>BTT#L66E%XkTBSGQtlVnJ!kpf7g# zYEwD$Xy>j!)Hv}f*1pa0=TEMtS}03Z=ut~QH?leZx3;86XjZUxc2qNrUVzQ2tegIx zr|4%D)J?N=jV`8NG_1uV_(VawK-=4Q$pj;*Gj$m5R&cp2?Xp$;-N)SSqI8MDo~aMC zRS<1}5jMa22ehM6`^<-d3i4luVlhGai-+N_K|VgKT_#mW{y??`IIvo&q+5`Np;|dG z7Kw`Ko}Ds9(a*z@pVfyRDA5s@H#EPS@Pfsal$!b&Z@^YDy!gqw@BuDIW5l|0#n3L8 zr6F{nbVMPmon5Ey)JD;6%u_=|9`oR&R9!KGmxZ$bazKMLx*byP3N%0$=A;D&zinif zZJb|D)HNnm|H_=bqNpOsfsL~75zKU0JxL+=_j4RJaDB>s!rq#XW2(SHukv8kt!%H# zmEZGCQC1r(ZhUe5imESy0YChgDgSj`+*gD6AXmMG5V=F-nbE;;wr0W(uz?|)%>yROGB!|h%DN< z_L@&)pY+WW^!O=+5qneLHq9_wunOk$cy;;uYd0u|9OI<-+|xS{Lk>)y{rKS_ny#6E zWX;ypUI^}h&?wZs>oKvB@4J&i#qZ@?nda00y|2(XqDdP+gg=|j=QVoq#qh&_%i#*W zy!7kp*x3TrWyWA^q(X^eKAi)$>;BRHrn9h;-IkuI$QC7CSKkZAGwC@A_w*Mw%7cDO z$JizXYwyr8BkK*rL^Xnaz1XQ`XVT`MEfb%K>SZGf!QAjD)lD2{g5iUZgOa05yzSuo zJI?5Bgs3OL_PX#iCUtuolby@souSCJ`KZ-Ec)USU=MJ;ZnXU=>g`^LZG<8fGajV5F zALK0`t&ul+4^n=v@;@=uyvxur`b_NlgvFbaWKsL;4&-cfow~DV_`}1R0n-4MHn*(d zsIV271|lc8!k7 z#8?Cat9J&t(+Z+t&p*~9UJF`nPk|F`W4+1-Q`XLUeIe=*uyAL+&;2j_#;Z{7LY-i( z5^%0fSIfpJo)~Kbg}ImaKf-<4P_c$JuS81{>sr0H{MMstrJ2CJbmaZ2U;FEly6GML zzob-T@86frtxz1Ed<=H|&djSvxMAOi$XSpt1h;dQvo7+2ULoK2(#H^T*5nvY=`43( zs_@uMZhE-CpM{v!dmFZ+D*p?_aw|1ZY7Y|4SS^;1rdU{)MhAO%>W@5M0STR7RxjeV zKx14RTYA|5#6ekI37%huGH2%vWWm7^ysL9Qo`{4?c9d9s`FiEmjBn#bZDlxnGNadrh38Qmy`Z0Qui zN#0{8`4Xzdd{HfdtT<21TAbvRihD3O=kHs!P4vy>xAJbrl_wc|3MsVT<2>vmb-41^ zk?PUIxuf9_q640HGle1a4tQ&dJE3v^R(Jo_YKKAjhEtigiJyE+HcbW4Tc%Qr7<<*TNbDxw{+;moZZ^!3)u_BkG zGrEa#w_Vlu4qO*KYO&}lQL2yDP3cAQ$}C)cUt)OSbR$3LKs*ty?V^z|wbZ$f{785Z zba2Y^#2n@<4R#tzk#FPORPb!VkOhXl%0Egay0gCQ*H5@>3gYhS)3l@Ykx5o~3#~<$ zY1fC5iDmRv^F1DXgiTkhWIh!fRUGQc0Ovwls?Dv5b>&I(e_v^m+CTk2$_CDsMJCro zDhO)=skjk|mhgscQt~z5ipnq=f)=uE7ypBxXM!=fatRz^w3{1#ri&3?RzZ0+hse1w zIJj|XRltw!?Z3@M2?oFXt`rRA*&UUCuegJmwFV_?bO9(R6Vot^z+~AR3ZYEgId^}8 zF|;yKr+6;NIu4hl+;f}lw7|xhZ-rxHgHIG^ETPT$2#*~>&*m%g{GrnZC(2(ocnF&& zQm`n{Ps>z3Q=DGYTD~sn7w7@6bA64-Dp||(iK_7(Wg}hTjYU#H`9Dx=?n!NZx7p57 zU1vp1NIqa=xdz}v%C71R(lhMUwmRz{|?Ud&ank1xiJZsO^#s1B_@NF zNf>l`7*}c%b1?bdZ@3iqW+m}S&2nwi>5ZAc1peT}J@TO~CLZmK?ps>$T%pQwsPzgSN=)TO#>d56t9pc8Mwe-e&UUZQT7|%wgdl3J9y|n3U`9;|}3M zDb?MGhiEdn^Y&>4eud@ccEnkUSAtP9Jk*@LG+r|ye~+%m<8;y7uJzF?RxU_p1v6d< z5$vYvA6^OMzo&vBJ*rU;>6O2?QVjjNhxF<6I z75zV(m9xy;JICBkKV?bj)Uo2*-HzfghbBL>{Wxz^`qI>8a*s>^bHxiEs#9Y z_EMu2zvk+6DES`Sj39Pxlo>wtvdVT9LyJyu2FFK*AHw%?412McRNq#j3(2e9JVfq6 zY~LM>0xx$W63Q6)UXrXra$)Hgtm$JTX^c)DWkpo17(Pju%pa^+Ia28Ta2|3IWy99P zq}x21tp>6sFt01k=H)9#-aOk$rN3;baoD!!A1sX-hQ3W09+(tevT88BqV$+|eeEh< z_gZ7uZqZmBxM~xB4NT7$U}{$E+3sKe_Eg3h1`8tN{ZR4rB<61T;kR&fAyf387mADV zL>H;DF9Ru|557bqZ4c>YU;-thkWFi9oZbv8ex8@)%~-+Qz6U{x1~I)bY!SF3a*Z8q z(J1ENHt!&b^p@e$i4;`Qhq2TQX<@#JSR1>IGZpGF0$dMsKX@pm1s-f}yj(9B{*%Xk z5&}O!9-b&woTwsGV6WMw6Y?*e)x$hb&PgmeY|+Nc!L{EMuHOD|ioJ%Jo~s&MOh%}@ zd(B8cnc&gPG{&803-3et1M``qJpNiCk>Hj?I|sU4vUvrvBeFR>N_}(aQ9--Xn_<4C ziI5uU8si{YRyZcx$?+ntE;)bacK(*#3)pmTBFOd9{j7QxY|GSrL?MHaqR4@e`xfW0 zKfrz*Dcm(e^&dicGvF#=g!xW^%LKz>yMY<` zKf=_Bl*j?Zhn+4BnXyK~xjNX7XsfCt52GgYxyG>U=j)h_c#rKJ81H`)NnHAlJ{d_J zi8$H?A-V!XlC^kPha>w24^^i4t;*Sm{P(O*uX2upry7LHb{u|Er^9VME|P4A7Gm3H zo~ZUIaOY>Gb|WO;cXxMZv(*I5y0sv%;Zk$NaoE%=9BR{N?IL@Yu0qKk zJi?4YcTA+jQrtSaZGlySyWrIF8`n5~4IjRm`ms1^ZpLzYQ##7tqz0?(?gC3iBTU-o z0{vn7+h;qpU7V(~Z(ZqVV*+~tMyc3%uGe(T%lpz=5|KbnXLN_!ZiDx>vixZ$7I7Ja ziw~+lZqSnqhC}Y}Jr^~X8^cUum&RMLvgl8)<@4z6w<}*L>I}bL!Ogq%hJB%bg)z$8 zv@^PJOV?W6wR~%zBgq57=Nd}7?qOezPQuqCrQwP(wom^P6Q>}u%ieq&eK2nwFLWDu zef_<~v=^~zDrrDA0bUM{7W<&DC{-98>-$wWUc^Lg7@KV}lg9gAVc=!`fADtd`oQA+-@H_E=j|**-ir+U zphV7S|2*H)@?*zx41!XK5RP>qa!^j>KR!d49NjMs9I_l(E##TimnIpc$DCt#FMi+9 z=~*2&FTCa3f#|87tvW*DUGr`FKxtD1imN>aVyYDhLy)%E3$5I-*w`CsjW)$ekO*by zKc*~kJQNPoF2Od}wkc}EtW(unX-1?Xf%$PksLO$5n@7-wi%RjGa8eHzZ z9;{>)cBvVAt|nZPDHsPJq2a{Gv6eXBdGDzBAdB*Gpn4^1SEG9~E(I$Pt~MU6_MPwj`_4c7bb zL0WV7ROr(4LsFVPfO|J#_^NKANfT;|g|gO&i?s=xQTa6f%JF>?SQWBEgOCq~@-Nf4 z4|i3c;=t$#o!&bxs}17GcOJ_c$!6@74HlFJ}bax7J^jWcDps zMM~3a<%XX;FL%I2(eLRRD>o&8fJJY~^Tr_!MYYqfd&2^vzz|G~E))tHM!dkT8Vkwz z_F1*B18I9QUs78>+$!edrZ!LTk$9H&;>86QI^~O~R+=vwCud={agG6IWkw&DIrRiZ&&D2M+JfsPZv?$e&OXeDCUseY1tLSuk*pf5qDh$7&86P(jlSjDeeSFJJY8;>yYzjSK!U!+$BMtZx`tiWa8r00V0(UybJSyBs;fL8IYr7Dbq0Qh zr1m|T=!NW%3?t=Ks9?tco7d>}&;QR>!&jj!S=UCM2(5sY>KeKWeJkgKR@%?Q%WuI` zzD&M|yo5ue=LApnuQ%F2Ssvy%?+o_LTUB;-D|~NPty7ti$AOEYz;CtJM+H{szM7m8 zqy?9rd*{kLM)17r0k8LS97!sv9j8U6v={~6n}B2Fi^HTkGw3_hUpwBFsyd6@XaQi& zkxoZ`G=vb9g;pk_w$AhK5V5iIa{?ZV!isF&p_}2jKwjorcMQZ_f0@43F}eEw)Xd=1 zFZ|yKLYRtk`jJ3<#q`P0Yfw292OKW1FWwvbNaeC<2XF zSIJdyw@6bJn}?qEiwMCwF}-WKi_fq9bHPs~R6RP1y!>7%caOt# z{$!r5(Cp~&wgb*%J^Kh;!I%?%hjt+)e!4)};@@xu9Qm>6owTsR1<-uai~5EMACx?0 z2n6WDbHSs*Iu~@dU<7Xxx-hjh4UH*QoVn#*S!STrXw5__;R_$DQEu<>yE8z{k39x1 z2H0kjEjUmJE8^cc-C6HbZVO6IS9ddW&^Vt04Ca1uZ3z`%O3c-?dseJ9L5m z&c;Jfrc6!zRX1W)I4KiuR6R2z8ge)m?Ky)%(%O6t(ewA6++WVIG=DQd9kt8vyz zTo}zoDQ44(`9j9yr`&EM=i$8k)oV6f&RhD{O0NlWK+aNEXR+(^bO8RUeB%8~=myc0 zD;#Uy$NNPZmU-O|QJRT0X4)!6>@kqZy5G6HBe>?q{7|&?b8BR~kA8xhEE5FpYo}%O zZE{x=NTWXkm8B!+_x^Jv5#m^zSfVJlJe%r3HvnHA;I3cDR?7xsNC*yv&P|+?h8YaD|k2$A2qn0Pv zziBArv17S2+9m1VsQH9x#5PWuyi6a*W=k^v@2B>@EkEZvHFAZcUgA=ujtcY%1)=n}ug`O|&e|@2fYK?$EGKt+@c} z-@48%a2fzM%hpAp>EIgpeO|V9{(c$IC~S1$8-cESWt)yUnHggyQ{`JQm@- zg-~fLc`MlG`PUFb#zX0ZP<(Zr?#6Ker{hBk{S&svg)v{<S7dwsl9tR$Ur%v&(?&<4Tx%TR9K~!10_k3lo`&(0SCeqdN2ar?vo~KmgVQC}+RT{*heT15oY<&> ztr>mHB%@X<@bI@CDjP?cRmI>aEUU~&fXg|nk=Soy2rgfv;twx#0!Q*19Pq+an}6Nq zfFcTmmwV3$jy`8lP*2#T#3KyuTgsRm!pt6p9yM#s0+ltupdg_$xVLd@K0@}R;N8X% z`J#j?AUhn!v%o3USlyIXjy<@ShXSJ^%J_&fKD9H72-8 z`e1j=F8Vx)wMc2FI)l5DI=^D39-0cr#ux;yF01zgnAhQ@!r*bp-LnZ?VKgjj_(NET zFr9pC32uHWJsHU#)a$3o9QZ3bzkF3o+^(5HiD%cNx{}Ov6CQDjE4QTYZaI0oi{57_ zqOPFNM%%k935mDUF1(oDes-=K@A-AtHskCQ$Zg6o#1cSuqQhj+0!j{Y(HmGU2)rS=r+=aG7!ybHY5S?79V{uX>X2t< zvwJzY8TRzj{%+Dp++4qj9?x7#3CF+gC^G^N&(Eo#vSW*axDN%ddTrXMH=eEB2Oi3L z6c4E7thvt5eSQpdZC!#La5$W75xp;?cgE#(zc+(OKj#cw%16OGm+&wwS=-_ z%S(ujxwGrQGiZ`nsY$kj$Z$!zhhNoQ)h)`~LvR_>XHNZO|ra3BB~1eF65wQo&Pyrz#kZEdGf6usjgP#%;Y;a|JnBC<#S z);~I;&({Q-six%RN(V`M_<$SSE^uu`@C&rnXn#}Y4UN#2EUe44`?_f&GQS)d+EDEr zoIqGZjP+gJqP)t%x~u1uuDft%K7g%3V}1vIM{n${vPfGH)@s^ZFtm7|NjzkEFnTR0 zeet>MflFg~Wv;$2FsIQaf~LS^nA#3qBlga}0@DX&ER2v5M5%kR zMufJXGZ~A}0e}yLf6qeGU=P9bHbTw#j1r8Dt z*n|I%vF{3NDr(vV!~#K4N)Qngq)4x!7sW;gDWO-95(q5<2^|#_K{`k;0s^78(2F1- z(v%i@Cy^Q;(%ad7zkKIEcgG7JFZRw_Yu2opSu^jv+tcr#&v6O*qTNzq1a=YpvDv|A z*DShlFZ$Ea{Hw)UHf&x~{nKvM7^2%+fry{zfyZ{@qLQhXg=-kd!zp#rU3OY*tm5#% zqE<5hP>Rr)IHPgi6H+{&3qnG>UvEe;PR9prP+R+${4Lv?hdQrX&$vQm?&0UW8I8kl zM!;8#fbJ}N6agb3EurZYH(7J|IyD{+Lmfi54_B&x)Rq2QyaAUgFwOCrNW8isxxaqL z5m$5iq;GyYHWvPA(mn+jy~rTNHPesO{Rr}kzQd(}ExP9}&ex=GvDQj>Q@iW5(mC%Y82XW&h3)_ho0ViefNj3%H5DUldHs6&v<9ko+o z#Lu~Z#;WB~a;=7h;gwUb;Ab{BeD_wWN4x;i7`|@P)y=X_NorGI0G!Fm{e@ougUy{V z=k#a<%7e6-gOCW2^V}N~t_5mj(nnm?%EkKK1)$MGY59YaMf$q+f3l%^VZ)GLAv6gN zF;5EG^)K`@F0utKKb@_I&M@PnNyn6TADc%wa+fAkp(o-doq97xx%7KJ{P^9<*Du)! zZ!qn86T7e(>wZ_Gcd5{uqnJ`AdWVX-iN1;GxWq?&=X-idl-Mq0cwb(yjg{Z<{fx}Q zo0w-D)hgoL#Y((NH6xM|4aepqDmLT8*W ztDcB=0}6WC74E`schk-sw`aN-9Ap0NiVzA>%RF4e+uv!_0Xn8u_WMgg5_;m8P}DId zReKQUqbajj5b6`ol1qPd%qI0Rg_d|L)wmQ~8(wU7vNM9IFq)FfrC*$stbKk`Cu!R~ z@WeKH9BlZG(^*4aJnbAqn-E>gH)}YE%siL^n$+PszWQlg9G+_8g29*_$$IwcnsVnK z4!`O=j%B5)4mIQziv8+~J&qU_O46fDB2!|pTc53pmmtm;#fyG^p$`P=$xyZG7XYdp z?l@soG(C-W4*=kI#&oJnYm4s}8@ndx&b5LswN`M}PzRjR-?cdsU%YChAK}drp~MpF zXrwlXSy*$YpBb$4tNa`Y+V-l#Zd5LQ8g?FZKiu!Pg_{2!{16EB+&`$jrZ6Zh@WJ7t zWYOpsdbnx9;dDh@1uzaEPh z3!hr`>j=*(0Q^UJ^_tqor%9l0;$`5qerRm^dyukt*93c~$6=iEhLNi#@3H-qADtb% z0Si=(KcjcOD&Yl2Tj6Xe2Uuw{=4hYd!}T)1^XRN6_BlU5K2+tz2KO$4en()f(~V{o zImJiOi}SAIyJifWpTeEZMfzSYD9m6Ei!y_MQbu1Z@;jmTbV{V?ILbqlBv<>~m z=H=tX-;1GLoiWY;9*g#0loOCxwFdC93;_gI<8FxI*R;iA-s5LjtPU1D{h$IzX+=GquPA~=p^(HZZA&U2(ba2sR zX}rQ4eTb<=jV{yZ%Ut!~mH|nD1MBUB#qRZf;Fkx^e|dv@*63@4g2lK2gx{w9)!4xrmhK$yO8J{d#p z7SV^mWT3v!HCOu(0H|fEPNV!KY4?-WVuYfb^^UQnFPqee$9cnK;g9GU zFm!*qJ+(N|MIA%ndIrqi{Je#t@ZC%Ezg&ALCEe$WvB66l-mOw0f!*p%DJ zx8qWTx}0vIG?Jm_4TEW#yleK%-cDjoQ)x30%7kF?%PBD_y1r3;&lk45yEF?3g$UQH z?1U3$5tEX`J)a3DXY9%hA(`tFC%(E~jk7$(I1L60@mq zrUvim(ZlW3#avXnIg~bX&z<+Kk4w4#4)NEaV?MTyggMG5^YGxeOZz`C5(&|EjLye8 zs)2cRJ;s&`z{`f8!~%!kq1>ej9j_Gbyt-2Vr?QW^y2RXb-JV$vqbkmyK|fdd`BS>S zc?NM|v3r4cpyM}$#s`@xx;c2&(HCmVy4BaHMj{8gsoUL2tQZHN#<{1ae(-4luj zyl8WwnR3pB&x`P`&5oyms7J~_B|@hWFBJzv^L&= z16@TW?lWu-FH&QUUu=)_rKCR>b!_0kZY-=NnKU0Nrb9<7jLTKs){~}d-?$HdaDnOp zMqklQdk07p7ijPfNWC1vME^KiA7M0$yR9`i*w;0~aaKonQT5+Yg~>sD0A{)t`FMML z1*8+-YT1P-xAS}4o9XJ>4=I>=T|mFTCf?_c7F-!~KgRFM8An`TT0LF_hyb(Q%V9xM zT;ZLx9n}+~9~SzO-ff7W1mSuoBfkClO-v)&b`!@Z?b=Snf5C4{oN*0+M2&ZjnhWYm z=P(``fK80b%7o(1^g#FVb?!L(ixfpIwz;lG*fi75F~8#~hmU6sdSxl8`an%mr^EiD zbaUaU@4#t8ofbd@n2(wP*blZ@YQ2K}HCc>R2}fOnZf0lI|5ld34cOh7_HDRm!#$Kz zZ}C4xYi1PEH0Dx%3uQY-yhV?u{g(maLS3l1zU9 z8n!2^Y_K_9q2+d`6792YS8qpJzPyUB8ut8TKT%q>r#x}$P~j?m$G^z^(zsYHV&}=@ zM|MG?MVkwsv*|l3S8>shQ=hs0U5*9(A1+AB1%xjP)G^j1v?y1w9{gsMi!&M8X8( zw7`f8-krn+2C@Nn;KrdumT7*}t8zcoG571)&vN{~1!;mqRa z^p`tuanp4(Dt}r2%)v-r*?kB(*_{7NZ;8C;GdV@cpmq&0dt19w0wsGW)&AaPm5l3Bt`LZ_4IceBW2 zjjIK{Wu83esbUfxh_kU>(M?+=c-e89;eG$9I6A_y%IU@;Rlky-pj3UZd%CMDjgW$q zAplTeWlmcAbb#|O&PL+(w>@Y2H}_XUk-=#Z8|Rr{wc!RJpSo`P6q2$K{p_XiG1uyL z??ICQ%GpU?K&m+yF=dSIo`|L>sA zK-L}W(xk^kcz>%e{9;dNQ3qpdSC^;5f^S|hqW3%&`8x!D1(K3J(jn6nEUGI^B81Xs zvb|E2j2)}m3cgQf1YiB%&)Vv?)#iy$U*9VmkLg z37=8Cv$Yw)qTk~6WUwy5e3!^L3+Sh)^n@x@uMTe6l-%k&_^-D27?buhLQ-UgI_lw9 z@jYa?C%l{urNOR1C^C-pES^g_2S=*)0vmeV5R6DKUKK|sCmgR0i%ymVBeY40^OK8f zx1J`yBbYL=5`VdiOqK-`L;v^0@in*lVq$z@ZF0h6)xj0$fLb9Slq|5sXW4p~dVU;t z@lSDtw%JV_q@EXC{xjNby|ytPlqtBkI&UX7eT=`2=wP65-y+SYHW+cTNMA)Na%W1S zZ4f4z8+&lx<$(Sx(^W`eJr}_&{myr*gFZ(2WRvP(gwb{dpe=KdLWREL?dY9@K%cX9 z(FXpp;$ULxFFUcJU5kGTSNH}H-+|?J_pOnKhU8~fZZQRiUye`WyDlJzh`*`xcQ#*- zCxPFxg&_rh$P$AWrS*5z4~~jrau;#$VoYHMk37KVt7mqEB7okd)Wj#NakU5UZ;hOG zeL~C-dXO&Ljf>gVgNt5WQ$T%++DS7jcrTL-r-I8$x9zig67-1SkDMsVW#dS0nBjM2 z(FNnV`FH>WO*-tH2=obs^`FO&IuIb!{eqA;2SO$}u=n4zP3jW_;e<*~IZ*JcCG;z@ zo+7Vk4YXY~07*N8qJF0#8?OR`Zp5f1XQ*|JoKqJ4&hRCrm ze{grSKHXmv$Q(0Athy1IfZ;3dpK-+H?AR%75Js^>vGhj0lqGKqnmYv}lpz;}EH+QPQq zy@-c2pGp&dgl4Rbg3d?1mYru%o7S|*eKItKCT@EiVVCI-Y@_v>C}q#!`~o&#O4 z#O2LJ_j3i0PQ(M)=3mFAjMFAWyyo_#K7Fausj#6TaVc!EHZelroVz5x$An=stdU*n zGp=)n9q2{R1j6(RQQ2agEpHLDk~kns5IlF`s;~_p&fA{^cT=lqzx0WjnjirI%PL zbWv6voE_0q>c5?n#0;45X_OPOH0PR7WCLCyVUDy*(?Ps4{DEK>(aTGudn)jsuE(ba z@yyx-3`aZwWvT>rpzi*`$s#p8`C_-u^pSagsrh!kkx@bPGj>7#e{b0Iwf@ZviYaiQ zRQ~ehxvJ0Lqh*$)8aQez177kXT0$6EqJeb$OZAzfn0g$_=R3ym->Vh&tbem=Ry$|b zqY@}}piVSRjV9C}T55=w9wdhXELGeR&S}TCJIr;Q`KnFPvUekn@)m8+ce2L_D0Xpz zund1Is1xiZDjEfIC+w)F-eIyM&2%mFc2me`E*y?I+LP0Ec(cjmMEvz-T$w!d-{?IJ zK|nr%A2g<*o|c^K%}$NBJQk|e+wklMy3!9WmVy&`o8n|yC7dH=1r9vm4b2)(2}e^3 zQZ?=;=d8#8(-&}+pQVL2Ux0z(TfS^+ql73PsZ|Z zY?1^H%JXt2i3J7sd6k$XfFnELUyw~g0#E|}_XPvR|IZh2W`A87@*HkX(v#Usi5sm! z;)}Y@c{xZdt}VB;O|H~!z!*=9=m_VNLa32aBl1`4m_-_d4;uf?nOq z?63S^Vn7mv#$^_q3NV%}QlEP|k(~H15F+6t1?~2HblvLnkDpIfMw#|){g-P?4TwT; zt-xIPyRtqgk4YR@^z8se$p87L_7NcCp03GQjO!xM#dti}o=zc7{RJdvIGzSD?K2>!pkm+=6p zWQFOD@wKmPM#9(r4J-5z^YeVE|F86ax(Uom6`TvlB7`4LmX^-YVx<-N&$kG5{>7(w zf-Hnn&fQc`(UM6E;xQ>-aMpQbTU(U^LdwUO=#mf#o9D{l1c!DH0sVDWSofJ9y%P*A z$93!n|A{4OWBi{@3bZBJLkrs?(uDh91>@;N=NQ|+rl!zx3}Ci7@doq-XS~`(+#$PE z)uGT=l4pLFb)0mj<=+c&Dp{@p{+zx$)LT#}`JpgS!ejBdc=n|Jupi6h-~FNc+}tq6v7 zg$<|Y&8O6j^i{iOkrO{V9ox`{JN}Ezh9`h{w(oeCItlDe!>h4AXT{wL-yGlXG|g-s z`R>dcGes~(oR-lh@H)^zOn#-*f98Dg2sbr+RysQG$yYpdt6BB7)(J%J*V!e5PzZ>v zIC6$NA)ezYo|hC;w}3gNpaPwk_mgu*B}5-3+Qb0{iM%b1YA*$s^u^vmDDS z@0MJtO+Go_)*Mpcj<4uv-|K}Slt~?`I{X)>tYoLlZTd^VNzwg!XCQ(l(Ekul{k^mt zr`AU-KTAc9m^f`^e2h7MmzX1jCG0$blpqX_&5ARt=^fwl{+2Drr89iB9PV#y=2?3_ zRM8OTUt)(PPOV_im`krTYl;<|{c6ZLG0U|3SWrpj*Kei=fWr3Wl7lcE_=%)+*NRPf zGa_PHXzJGJ^@Y`=fR&Qdj$DR1SmX%e%oii69K|)}+Ibmj7s`Qi(I#e=E zPWZn0_O-cAOIx9gV6A@fCqa6bpppG|VeiVp-dORA)DU2&eDZ`ax-_JLY*CFA1e=ua5FGMU++xbr+#nt%$A@r z%a{M-=*-_ZgzbK^ik2{)%H(IVU^|oAn+`J0quA?jf*)BmQuC%JPyKUKo4L+o}5{KSVQPE{H{eVXpoIY>#n?B$(bF&;<0{j(O-K3p#or6-=k}?o3t@%zR^8HVD_RWlsPFj$tW48&-V%mT?@*AF`P#efx$TJ#b zoxPd)wj%rLkp1fC^7ZnH6%rbx^hfeEjO0!)v z4Nu5_5H&UOYo9D>C$jxVTogDC<$+5MZinc;+KSe1Q8k0_wI`-`)D<6HP=r*a-L%!z z&WFu#MOnlFqLsnbVuX3an;o^_x#BrWID5$MNtwHRSxozfC!=3?Y%!?%cHbZYw!q8q zxi0Cm?3Fhw1!U3!YFFTNw6}O61(z<@v2QNE3tAZAjdNwArjSh?86#%_I~$kiLNH16 zx1P=SJ>Jo)+Q{iuW)G`~ad~ZrFSTOdEMy6h3FXma_U5_*EZ<2t|Jvki+=o)9)uYqO z(Y+UmdY5TY289N}%#NCvUW8uNa9z$%diG6=f#T|Y+feMd{1!baGXv+UoU5&ZCBMyZ zizy@fX0~9M;I$i|&V25;xz{3prxHS*7KOHH!`$ba{*vYFDi*WYd!_S(IYmC5Nt$H`cCTD*)-YpS5g6aR z9-h&t<-1n1^(2E)_^Ew?wjSzePzg6S((nQ1C)X{Xf*F|C+9kF}wN%K`c#b%BOy^!z zbO3f+I>+wv*cBR2PAe$$Xtna}LpqP>@m}#eItZ?O!_b{Jscd&;xKS6e_DenZy z_ulHpuDFO$his*~zFwbM4NATnXzOaJ_8Zi&`nGDjKkkw8Q@cAjXXE}(8!opZ8io*= zBB87>f3|RV2{XtTjC11!bmcjf`xx%jq79vx9$`hhL*|Gj zFctilJQW&KZXV03r~9}6ylA?vt;N$evZ|g{<-8jE<5hE0Vu0{y*Gf3%ATmjHT58bB z>%)km`+h^xuL{Y|-Bh`YB*eEO3k)9?Q@^Mgr#P3$cm}@gp!MY!(2qNwWr&v(wj6~7 zp%;>g+&=?K?UwMSn$ny7!-~I?7$>L&s3ayVKCbN$Wek0fTWdJrL1^LM9DWPQ>Gu%Q z;x}zQ%`9D6vA+ydl$Z`rpexpC z$ZM_q2@XP^cpw(BoucXQRzJfclhe>Le*`IF zR;Ab(J}F}1jTh2g#c?2sL8R4%uB$t9qsft*j2dK*#wnw|SMa1oE=$1PzwHrEhPpG$ z7pVcJ8$toEkbkk|0%@DDVOCs9H9B}pw1f$SbYAvOr{utsyfUfTlz*6ztvH;0__VKg zETd2?*d}3?9EN4k;?|vFZb~m@vs_ySr4A}?e9_}zFpu6(EoT7b?Mr%R{Y0_e7%r*x ziK^xr`sgruDd=Q^_v664*qtDyMMLdT!inf~iB1j1p;>WQKDB-P5{0Zml@>( z&9!}oL+`CYn!buZGf2s_xozPp0BV0w?V1Z;MRL!B9@W}rual7?{!WFCr#+sG$Cy@I zY2MIGX?C++!>quGTbG0AsGW33hARXSZ~eYM{!*O^TXXg1ShIb9YOW&t_T=N5aNFY{u4t#IQBWd89Bok3R=G&kg5iLsB%DxW~ z0IfkNh?m!9rnKw?qH=SuRp9*#(Tk~yN_v?*AzWkM9sz#e3X?U{C4Q$I`98_@OJ0NM z4OYvQn-KkwTwB-h^%vfh54gf&yKEn3P1&>t8M9`;54ythnSasZh@_T@F^1^|rY76Y1i}6dVyFs)(gS7n^H4xz};t zJ366IyoNDz{vv%@g^U`?u2z`x(zP^cPS5X4euJpgy*Q+Nu?>)tpd-Jh(jE`r!C^Ty~te=*Wi` z*^Ty^zsv1IRqI4N#RfzQxE5_V+sPe(g%<)F4+2wbi#EVVSaqip8%j4l6OvTtx7=*f zDMOD)w%e_Jy^b3iqUtGP9?LNB+1!Jh2K+YYX}6-(8@9<{VvvvFw+*+$+=nxO3`VJj zA8ap%T-D{UFS2YETcvz)W!=V(`R(&D^M!Fg|5&9TJ*iv<&Kk?2ugO{XxYv5juHwyL z9q*n@6hh1P<}Xd$&cuz|GXpC327XtQmGo`b;j06SJ;e=}3T0@Qfr>Um$%Ba?rn`~^ zE8(Lks>U6!S%b1oie*X}+ddw63ZaY+9cXRCUY5yKsb~4{Vj+a`g_x$KZ8*szhB0JO zNmvjQ$fn(I=HjVTn%ZYBK=ESNzj=@22EqQ>Hpr#aEc@hP`Frb?(Z0Gbdj(Nn8@~DslCr9V6B~fvPPUBP;pA#QkBZ)mFo=*)`}wS9vhllu{BFd zYuBt9jFn`v{bZH$F=ywdZ7zRh&o)}7A;Nxn+rVL1al0=p03OGvt7;OvzL#d*UE7!( ztu)UXcv<3xhmrG3cLhkB@hf#5RPM=Bo-H4f-c1!*E}f9eO2$f*>pt}XR0l{)M9t4< z^<@cROSk*Uxvr}NO-PjPrHzknih{||7c-l-e=?L-F65gff6)@|r`6n})n342di07O zC|M=kaM59kWlcY#3`rbR1im;D@{XLvvCU&dW()@?oR+A(wd<8Q&w(2>Mb~r?%Ccrt zb2@xHq{>8!2*vNiRLZhNo@D_!z!86}_~cTdR<4o#FKH0*PaO3)rc$Uyw%)oIl6Z6bB%?|qHKyea(^%K42j+kw)H|Q?PAL-jgvfH) z-rE0CG-cTbUci@wL~RsjEGlW~k)cMd}8UDM>makz?e^U~edgj$+b}klD(WX4Ott;QAvj2LcQiLIGft8F$s;b`&a9BAt zP$wz#I}~ue5ek6M*NJq_Ms*j#$JxCi!-l#XYK-mJAY*eCxD6m1=%WF>8 zYA6}m<+_I@6?_}~>y^jkE@liXLSh_g|?)}B`p z7bPSJr8JoKGgTT_)2pdXY@d=9zQ%Y1oNr6cC(yYf)AaP~0ki7X23b+vG7#*AgWwen zxB41~sWj=loUX=sj(*~@&Zg<_9HuJyh7gHE28=7LBnpP0A&5c*0H7V&|~AYYMj zhLjmx03t=WIjSN81L7=GrWEHcT`FnNxgs^s85gj~T=>8P*g!u8ehXBxqM|cz1UWV&6B@}$k3vE3RmSBfl_7%F#`a z25v#SI?3?WFQ*cL6;j4|_En5N>)j7P|B!L7?DhKC-u5=6d~f&v)f`?pH~_N@GLQnB z1a6gOgvO0?bY7e))zZC^fcU&U#8B$?i~`=;;3o0vkTcFDYl)LowHtk?A&IjkFVx74 z?+J-+8GJZ*;YbuFfWkL|`_Y;35f{bZ9E!YQm4jY@^INYJAJhQZMU?J8&@{~OJtTvM z^T@XB+vUF={_grv0{=tNAh~HJP~7(~hu4%HZVuK(dJ8=V zLejAHS80`q;&xxX=D_v|J~ORnOR1YC;znu|MK=J0n}y@q`oq^(c4DbXYIgxGPQp(o zpRP*EE3p--ch^;S_AAV~Duao$*P9IYM--k8xowN+>x2n8lZlmJf2o|Nebc&PU<4iZ z)a59mCmV4Z%vKP^&`RH{?3EszXMuGn7&P=~95?G&@0vJep?|2d0-G>jw)dTPYx2i@ z2s&MVUTVw_FS_n&&PhUh15KbK`w2C>`uTdP$g?q&FDIW0sev3AQD&4TIi}Atl5bpm zMfhyhYVnM21v3~camQ9C1k76ni3)HP|9Rj1eJV!sA+sf(Q4_pIVPK{)?CH}iNG{PJ zPA%o)Gyo3}x2G&)* z^lD>ST|55fD^({OLPy*8V4NYHTrzu=GY3}$0s=$k1Vl2Xj$iY4f|>K4;W;G(6Iyq) zxH+lI+@v@(kceqp^?gW<@D z`C0{buOjVL*88X9_9q?ljOg_0LFs-!e3o7AMX?VnG7pY`tI+W01_hzN9=OU)DJ2DZ zcnD@%BbJl|_a@(N{-tE4tGUdv)5C*ky6H%WYWA#!YAO00p>hJ0Q)~mmlcA?wh|23m z2Klv6#ZNGS%sP{=dmH5s!Z0^)IqB%|q`Mk1?0V05YF7TPwmiNb&1(CIiubNMZ;4c- zA}u;eiRN*~n#ERjs;0r@qa7l~aC&4V4#G*8oEEn=T)RIsCk4hE`DjN4ZEtmserm3g ze7Zwak;NlHfa$b7q0RaJtE#_qeMsMfDbqWf1izTgSL(W( zT&?~DD=r}(kHYe0)>>0Hh*?)Ad?8puZ9(UJWnSxrLOt_krZmm&>-yoxsMF?|eK}Q* z(;%jglgGs3&flo&P(UoQTEGo2+-c!;ogC+#Hk2ddsj1S+)^B@({9Jf(g6`M>#pYga zZe^U2Pm0_jp#Z?%SXr-rm8>5(KP3B^9oxy>O^K)+eC@Asu>WH8@Xu$?4y>i4_^~6e zm_+Bqh(q$ATb>dmS~9wziSrfWE9`A2b`SFt-62`auE*@$Z;x4i@lxfxwq5cL_g~w6 zr!t|K7u7k2*e>^99SUpI_YxXkkT%~E_$i0j&WJni6k0}w%x`~yTpoS#{sd7?$*@7F zKz>fzvJbtN_wB+^cQ{nJ(nP37HlO_1zHNTX&dBkjcLtJm;wJ@2aw zR6ehlRC@VudYcG$g#<;(%uqk~X6RZeo!_!|w4}lLWQOjh{m8CtT<`o;Fa?TPQZhj& zr+IQkD~XhRjEwO2TInMz;fn0xc?jv%5o;&dq$*3Hcp6UI-lomDw`Ct#@BLaK=@@g6 zC~4I--ksvyPx(6i;Etj^4H0ut0r#PBsXr%$ zY;Cc6k5S4^nu8d+j!RPP+hXz(DrB0$YXLQ(@V@7wah?rR1At*>soxp6@2%lqgqG9S zsY_~EXtLV6>3zFd_v)JKOpo}TDoNem-$#TWu3FbBA9gb6zl(Ek&|7kh!6!!5!y9`Q zHFcL6RXb^rUmyp{!@t_!s6J~F&^c^iS>9O#L23m>)U02}0BM14?m#Zw&b(3F_-;!5 zPJe!5$30Kz;k;9(k2;^Lo5?N$M#JlPV|SG(%V)0a^)MBt4^He42;Up@Zx>) zD$Dv1BMprgY4*U06k|{3YowF8bh4iet)?=jgewboS(-uGzm&L^E0trgKVu%*#C~dO zKa8dId>Z5s?T)5FX^;GNze*vSSa!jZdg3@aN#>XLMB%3~4ev&nRsZr=%t1~222A4< zEpjq>-L=64Qr5Y#eq_TRt}EJPy@hArBH42PGhbRl!M@JNp$7I|9D0EfW>%fu3JC-a zhyA+vHZ<<{>n)YH*kQq^2)RpKB3~Ih>ebC=8B`Eac_qmh8?~uJla7t6`quX$)pjzD z)iFb#*HvD=;+j!BJ{gy3-{TLYWCwMLpln(1Dc@jG=c9S4XKF2F={oNQ$x>ZdQygwJ zDPC~ALrlq_0&eqft@W9U-*lSK%!}!T$c&k+ipfG%)Ny1XH2k zLcFqoRWp{Q&Io=`uy+-Nw22yDPasZrGK5W z&3#ZXoPL-Tn#4JX7o2obA6cHi3S#8iz8yRN4X(0}NIbyL9-7eJ#ud00 z#;fk6ra19wG^G+$#*W0ZUKMPKd8BHPX>vNg+w(A-7GD)Wr*o|}jLi>2^ryF=sss!& zJPEr)&a&qada|~4908-@*=lH;zX@rJ`3l_4|2!hSY5b1U_7H}e?^Ap_uBH`d%gC$- zfHBv!(b59ajdl&OR1C2d$+IR`C}i^8i_Tapl-w#&*n~t9aWby_GE+aK!6D+mVjLRR>D5_K)*x z5#L6Q1~@CyTq$wYoE1a~)PQ z)mTrs2G`t{$%_yy`=<5X%HBhU(4#y?z=~<4#(Ad5mEh4Tvx($1NFK8)T-0s?jFe)C1=l;qntl)Juw46*nM6(@TlKp@`q@4PgLs^fzDGQ*OtLQCqg>nV6&z%V$m0rDRRC0SalhX7S z=|Wd)Hgm>`oPRKE{(_))Gj)Za0?ajU#j~`%bIp_GM+UV)ed%|@`{weA{;#g#LtJhM zF>k2t-Ho~&Iz=I8w3Jx_+luV}0oi`hA1-6=vlII3b~N%@+3&R}rIMkl-#^Ua2MxT?yen zrw271a^H7*4VPSfCv>XJN!k$Y_F&^AY0bAYgVe%m9Uq=AW%cgrvACfhNSWuuoG^lp z_k6DPdA)T_;<|n$S!D3F+F5J96_ExVKQ{5#`qcS`h*JmUv^jrRFR)?XWarbJmeTB9 zACi4u(R|(aECV)w6nhfhrgv33T=&Eaj2|Z)BRJIpAl*_F z?4k88I40%AW!{nzd4op3(fC`2l4&ajp>H_fK3+13M!F@=l5>9TukgEOv4ycYH3aw7 zbL+h}3?qp8=G@EauN{0#&t%HJtuP^sQ*P|88ef6E9&(X2{ov}czUIEOI?)*G7yUI* z5xc|R2i0SIF~88JHH8pw8~K^#rDDRVOclCZfR6vZGa%9`*-MKY31V`}t=exmapW8} z)7CUu_1W&z`m8MbPRzC9Dt{%-OPP0{GEcJG8;7Wx5x8~$3qLs^o@;!&xNAHaY&5Y+ z`|HJeneTH5<&w0f9)i$ZeZ{*}u4I+mLQe#qzJ#xPQzue;i)VY$C%5l|dr?rl>Spn2 zHirq=LwC1G$SyOe?(OPr*J*ek&%|h@p0@JRZj$%J_eZh8rcx{mHx2LKQpYJ5Uo=sZ z-{`h><)fGr9f=VK<*ZUp*m~&A+htb4PNl>OD+l#MU&{K&{z2Z20V{&WEC}6Ur8cU% zOJg!S!YY^G3rf?54_*_$RHf%Sak6)MEFR^r_>Mo`4hIa?uXzr4E&{pW@FLK_tm7wq zEI+a5RB|hbn!lt4fliv^ZxtxTSLKov8hlx=PzgP$e`RZZ)B4cL$Ncwg0lH**P9<%E zuo+d%b&|sHbc7T^oR_^Rd%6{fwz9VwAMO;q_xUweknxs%=0uO#(-fXwMc*aUOW9e$ z6_(>;LZAT`|Ge5%;ss(dS2D-$E;2LVBD59yz|q<}EpTfi-_E^~Eahp&^oS>|2ko7< z@(g-FSPXx#-NzQZ{yeS^-&2NWq>v3MqsG;b;?zQA3K-Mck32m#O-ho+5Jb{JS4HEg zwt4npzBLEI>iwFetz2-jmg}#JRDN#^Wh$lsPxTZskWthALA0C_U8p zd&EWcesQtJe2YpO5L46Q4dMu5BGp#@Q4EQSCQp0(_J>S*c}-T*9D`hm<9$@;UK=&K z79YIT&^KLiRA6H{L-c^z<}u2JB9!MzRWME?JE6uEg)5AVu-o!HiR`PDCCp(SB!qL9Vh!*x5OENZW2vN z=0IKMjaq4H4%~UCm-ze^cC%5sG^PRsxGSK zg2g;diASQ*#A80EQ2~e0?fABj=G-iva!U(#JOm5+aBVLY*O;}W(b~)sv5r?&MR8Fr zgH}NPBoS7;-Ny~~$LcOId;57$*klbP{r;Nri2u~+>XoBxeb`}5(p(%;d`!MBnWP7+ zbEqO{&d0}16$|X+O4ORQQ_TW3Npuu)o}C^^V&QHRSFETsR=T1gzFrI@e;K5hrhLVGv(h`krjxBL9W&vwfwltIh@W$QiB z@XRD3djsh$NDaNv8q{wIP9CQ6H@ma2!C;|rUoWvu*fp}0ZI0~?JImd2p)o@q^?W|g z3oUuN3|DGcE(Yjb!It{wgt&Ut9fFTMg;-fbd1O@{xAMQm$q4J7UV^S%&*?O_?WJ^x z*LvA*KO8`w1}>+b_a4QWK=e^~ez2&A5Y3HeR0 zkGE(v#-ACbp#K)V0@s_pDSu;zcsGA~dQkaoR3(6cR54#Zw2FtE#9n2mK~*)b1}PWV z!(rn7k*Fi>qvonLimh{k+B;-dJRs-BTu+KX85Ta#T+TeyFoA2vPH|L9hJ7GUi!YVH zUjBVY8xiNJQHFff7Uzkn?(KqYNPRXGtlq0B!`Nlg^mp_BE&IHl;`9!$r}&+*DHXRp z)y&~*yKpz;^80)2?0a!68&sDf(Yn0p&jY!NeJ^H!4ppe}M`HUvN?gV^{Ooh9TNrqtlB!@+OmcwlE97|_Y-_fmlyfGR;dh^e??;b?r7kA-9L z$IJrtsCQ#EAdSg)hK^8C*@w$7GOam&LV^aK;=CWThU5y8EYuk+TizzWt8B>zY5zbK zbX_OH!7GDSK+B6VbG_m9_g4uq9VxLBcJ#2?$3W2RSs75Z%*|i;a42gXUio>3U6HK+ z?bthloGu4JOfL?%11_-_L2)6`?b58CO?T2+(EJcK-6-kFc`8Vjt*Zd7-|vjHfhRku zUboS&jGvRhqvnMH%^ZlEM@a&T_hw7kgdo#vm%BeQ`+_j?Cnknh`# zhco`SVop>$vu4O>3qUk+-d9_hZ7*~G3VEKv5uNhe+LH7^t9GFerr`QSUFlttyXN_v zbS`ZcGR*4Ree*O12Bs>RyQ;OmQ2U3#T=f269zz_w;}V9dPIjg=Z$!0-vWh>Sr62*+ z^5KCyxO4o$iaIPou73i}lWBk_`n+jZxB}ny@g}5yz7!O+c#mI0PxM;pev(|j+{IUq zhDep#4i)*8=1DuCJnDRWBuaYue=3{EG(USLIbGvlC$)Z$33>l*FY{6UN&{OLbj}`; zbFw+=rGmX=)MrU`nTMHStVsh>?zJ=Q1VBLq)UNv|{SD|VQYAG8tdVZLa(e0h)ySfs zPnqE6&B?dufScOn`~_G?Bft0$3M=KtR4y}qUE;K~?%7wfGxmm=uK8EK1p(6_r zi&N3$S=iLJ-@@+r)Q>2y_nDFK>hs94|ETU9VTxZ%f`^vUa6_eT!-%d}ojR51nNn!x zHbSLqS9d1gkP===cY{LqDkwAqk4{u}E@>cYPvn~yQIz5jKVeYeE5r+-FV+rBc`Kv1 z@={+OJxnbcbYkOst8NTv>^02(%{XLat>Ut@dY-A$yp%2pV47rJ85od6qUri;g9ak4 zM5_JMP#kFs7wizJX?jPMbeoFdX9UT&sz!&W~!nuSE zrIg)z?t6J*g`3&8Sd?iH*Pmpn$f88YzA5%?y3%{JBSt+*Wf~QfDrA-g$ioZpE&W!{ zhC97&)3~!O8r!2_20#%gq1_M`45Zfkch8KkeD7~k(J{9(GADr+=z9H?L%DWHh|~>( zENy#Z+Y%y2NW%yT^oy<+fOKN%l5x=CF)fnaXido0N~-xvy`W+*_xc)1uRQ?Hw3BF! zX&DUoDZc6hk+?27aw*YyV6mZno@5x00CQ2~ZxVZ$9_f8~8pO_`$s+xzck|@bL3jRP zu=Z3gqwEExhxvbmMo1&e>3Bu5@4jpAYn}J0|1$HKjXDzep1__ADCU(IF#L;>ZO-yG@@*x#$}wSgF;Y^}QZcYV_BlXDB?n@c4{ZfCz= z1)=+y`8BFfUPwUr*tZ&5{zqHoMMChDL-)JDMwR_!0pq2mBzIrt4Cv&YxEXHp@qOVJ zV2!%0WX5f=G%~nt>zFezG{U5NO*hHLp6jja=ze|fE0b@h(>0(WvtK;VqFQwB$#fwh z;r>ujT7E40mbFIVwnkp*wnr%Ua9jGq;JVc5gS<8-zNXB>{gBlnO!`ojKOYafk9vX1 z7l+r?gNF%nShaSJixKr>Fe5#-2>qo*aKKQkiYBXC z>!qXHG7oQJb5wMU@p3T@ncBLKJNLE6_a;)*q6@@lBo#qLmIOb?c^Q@rVB;A8kUsfnU={$kBL%lkIYYsItAvkQkD? zSGff|Hh4%L#Aw$R_qbC{>$v+W6#j@=fzXi5e(^DV`Sg7z-RCO~l-%JGDmy|&X+ zyY+L(>mIIBDlqpyThk(MLU@@B8U_q&HZNh{@6R6CJ6}G%Y+oi5in(+0c$nD+TOeP7 z>6d*#dmX4d*|^64jm7#Z@ZKQOWfcg;$FwC9?I_S~HZN?b9{3Su%-b9m| z(WsGMRv^17y3Vo5E2D*>O4A`|IxA&}VU3`LPtd^ETaSt3$4La5)x${gwC{=&g+zX* zA{*I~i%ZPr8R&9l(4BekumOZZ=B{S;AT~wO=>gMKf^4{mCJjirJ=hk6JI3yZuM$}%{ zyH7@gWTWhoNgg&?O4T0?_xiy3J&hQML1nEhz$0Xpxra~l^Sv6;U>El-FoFqwHl{&) zJsK&ywe}x-DsR>ADM7l-9m^szL(1OP!SR21`VxOAzxVwiEhvhNN{H-h8;P+b31y$L z?<(sg3B%Yb-e`m@k!55HW8b&2BtwW1#xi5cOibCvkg<&A_w@O`UO#_;Ip;j*+~+>m zb=}up2m%?pB-Kke->9!#`%~gs?ca=hYP^^`2nKz6V<7V3SgH`w&DlHlU9KWnLY%2= zBet%?lN1PUhpb-6;LWe7Oo}D3)Ugr6e+c$Eehx z<^MLM;BCXKs}bo--U(LxC-A_$txmH;wp49r7E*6=RZkW)E8C(c{Z7Gx0M09m`&Q9; z7wHsqdj!4k*3&i4WHTyptBK>j7OOE^z_~So4&;A9Qov?dc_4^04~fypsYATGcCI1e zU_{xtrb%~eeG@ORx)YQr(T&cxL~Jm8Y{%lznAVN-rh5iv(~eA5&{%BsX^_+P+Afpa zW`Sr0?(&9lYk(F!&w~IJNZ|~^?2X8}5b0HB;Wg<(qHO;ey4ZSLpF#`GE%V64uTPD) z5=&VL>UadZ|Got=P*EsL4oCROMHnU_=Z(f==BVH;k=*QY=YOeZ*mRZ~eizI- zVj`suEW1A-+yqs9;%fY16N|>_q8{pEHvh7Lw1o81QCH@bv*6D>-n=|-5NW?%g$Gom z3?l3tkW!prUI|Ty57joMX3(+9(AjG0feGn*v4*8JgoIv(b#+fM*OdXlY-{%zYI`zF zsgRvrA2K_#4D34Fwa|A45IvpT?rR9Z^G@rjS!=-b6}ci4Saxse2Erdb2p)w}SwICc zVssZ^tNXogJ1UHzua@4bI=p86Z~hwC>?#Q$r^yGmmRzi?;_fuR<;=it*9~e~c~=IX zhSr}_Gj>m=TJ0y}giC}HY7zCTj+NEhVV~I7#e|p#idBkjOQWOE4y0{JcNp~?qg9c2 zSUXnY<8{Od9zJl{KKACcfgi7B{=x%J7EljQPf$K}`p2ZTA9db7#gS01{YQUEy$Z0h zUv&+I@wrt&!o#`QbJvMM0&g{LOJ4c!y)R=OtLX2RWe?Xqx5A` z@9-eTuZYnQM@te(ffcY+?C5{}Y8tWB!mw>Q2^#BAU8XjH^k7ng30`hs(6 zcPtHK=EQ#nVyDs?8&rS>MFBR#wR5|-{_$+X8qx~m&l|ai&79{uCG$dBEho9&U|xdG zn(7Tp*R2QL?k%`nmtZ;nhu!N3=X~#r5{&qi2l|4z6U)Q6+6TM=pik_DDzvy#lVF9j zXCKJ0dn1F??3~SrkQ~#0huor%OHVO$47w3d8vgHB_D?I6WT}Q`H6m7hZthgMD{Y_% zeiU9Ey30kNY|9zd%+Y`AOVm!%+P?^Woo6gOIKLKFYK`w=&I;>(G_5nq{c9%&;#I1N z_*q@K2<8QWl&Ut@_WdeOva6;`Vb*obi#_X=)RVsZHMF(cMh>y}eN=}raqU+fkAXI- z(?;$c7mAawwy62K{OqSh$ajskU_}5lJ}W~*contCBz|vfm+wB#G8;1nM#6(8}NU zvnAYLeuV*_v$}O6A|p<2cJEHwW5K$aU=(MR7000X=1ydlBt7waa&_XTDc(L+(6D$E z&%FU-9kWy4-r#=#P(kGT25Uoc8ib_r_s~J!2_MQ$!cLH%V(_TlL?2CLf_LDB9k%H= z@@r+mkZ)udxN@8=N(_B<^`Wtts@axWC)takCTt)sRHv8wH-*)t^!bB0%M#>kE0q%w zHc^p+niG3>8YR~@?rDdhdl~b*FxX37yRc{J;68};#fxsq7q~$)Fe&-6Wf3rd1mh-| zfYw>oiQkyJaWI--M=GP%O978`STe|8+^dP3v>BR^$cC&8^JGRDOCTIaZA*p1T{|cb z8Lfx9@Lz0_ z`t|p*b%VvkG|pUw{60t_M%lI~NZ@AfR+kEiH{dhQmlc%#!HP3C_u=vGFaC-z?y?%s zXyQ*eXFh5378b#gtF^7ts9Ou7pb9hg}SJTT$? zMR>mA`>52wLiPWjhdO=DKrQG`7FGD;>(1FtF()F3QJWQw6`xx!)|{&-Ik3sFuo;x9 zgWtfHVIHH++}~AcAyf2-EFf=S_ZN4*vEpC}lDhR-)mBs-ukd-Taxp1zx^(6Bo}ec? z@-QrVjE+gL)L%Eas>zq+N+YSk{r+2`=tG3-4xYOirmI^5h-nkX6KeR|+M6SAmeuOG z#OGJ^9k&FWDr$2zLFlH-xr-oA3aSa*Yin1rgeCD(?H^0jJ)$m_FY;k}UZm|zDokfZ zva?fG?scg!d0;d{5fErZmzCRPUiHE$K#3n||0swrPO-R|x928Yo3i?ESb?>M+3@lc zV8t5hevWp32O(8fN5I%qg|TEY&TpXMi1*#u&h>(yZmwhyNiURPQ(#V6Xgxen z#&~d1eC>OTuQJFfC~Cx`EOJXPIML}$}Bi@ zb(baq8kmpgc8cnH{o0a9KOW^#{RsrB7xg{a^y5b!LEHB4Ez4A@6=tLRE}0AT>7jR9 z!FiC=*d*oXv&?rLXMWAbn!!*xp~rMBn7%}~)AjnD#?xWmB)nBfA9+q*frE3M^MHEK zn-X~Cwy(2)Do%E#Ix7!cJ@L~6lXQJ)!yF|!wb^d*txwYm(oJs0L`znN3^VZ2Q|&kD z$AiO9Ukxl#H{4pb4*8y7{J*%Lm7NOaK}0->#60V@*%4fqlK^QAcD-)G-~7wwgisGn z#5`^|h*Xx6!{Vmc8MEJs0mo3jUX)l9Q4iq44~QD+vXgUh*=J+ZhyJWa<+NI13GMrz zacT1V&*s0vQb#jv$hHS_YmezKQGq1}KX)q*$|kH(e~go5$P%;ImgFLL`ca%k%3-u~MF>RoPnLY`dC`5?($Q5D53YE>V&n3Crn#OF?6zCgS!b2WbomgLGJ|Ksp7_1UsaX?~X zz1*(2KLLievmXm2M>~0#0Biqs>Y*M$lOMKbSe@Nwi|(jnf4f~8>fqrUv9#%dy3Ju- z8_Fa#+%Y1wJEXk}h@Z5SKL?zaDizq^I^}QIFzfNo1_k~Ic$}PQB`@exfY>9}QrC&G zn+#U6O7)GOHT1;jb=Jmp<1OcaFac_iISz`c zP-2G!%-1Hs5A_M6JLM^9rE=q>$nNN|8;lmDXlE%bXU-ZjfM#w-8lCEs>$MHJzeR5d zlnfflvFSoLrlI~a9R9~P++05nyO>n`k{Iv z^dt#!|C2g2=iR)K%*z-_`sCr(Ef}G0iP&*CLf!<^%pOKk)!~k7?!GYqpBpuI5YX+y zSD~GhZ2USn>6f6~GoSh1c1xAk9oXuLd zX3YlTORY_33RbbiNfCwvylUIqLh!83M`l=`iU260Ka~}vbDIu)tR4FOwVU$Ka`zEi zAE}d3D@?)-XVW>-!L<3-ZW3-F(x~R(P)#J33L#L>Fx1-JJC;T3b%2-LBSO$BpemH4 zhxCV0kA0;vHur?BAk*X$@b*N1X~vAx+>tyf>@G~UPH_s4wE;zlMg9^5w}L*21k7&r z=ig*Kn`%j^9-Iw`8!X1GqXJ~0GtghF1zcxnwjVCI9Rr>QvTQn9D2vBWSNteCB>W^x zP!k-B4Ug|ro7Mf@2Y)onj`jd(Zwdjz)kqD0Gi=Q`3@0l4z(NBWRC1p) zy_A4?TT{diU*z*pV5j0%t_}V3$*$t~Be5PSL~rlRa{c(H9JLLH3qGlAv;3uUAI6!j zYUf2ijXcymd!>z-H{?1W57fpv&e_QG0P(&8GXmp<^eu{^H0zrR$xYc&mZp1w$WVMe zq6q{l|C+}Nx`p~B`00)V0p~(&hY<756Tg#kvU5fS$Kq=L)v4ctivqiwPT^b=uAbE2 zrI%s&iNCsf3EB+eoHfiVOLdMpLE1b@0l~AqTYHoh8+Oo3n~zb{(kCm;%-x?C!ERD; zk}ZTt<_+KqO27%Rg6ddN9H8N{VVS48pi56CCThVzIg<`LVA&eMgBLN#Qa{=8Ck2Rr zAW#HBuYncc2WCoXI`~qoGEG$OuWkjv7NVD5#4o`=MzT#^_lc2<0 z0pRO(OXb>QDT2`YiIz!+<&Lu;r#vetDB@|9L6_vI&h9v|4eztD5ID@rd+1Z)zsnx@ zD@}C(;uzMDv>4l;pg1B7Pd-&tTDVfbZJ}#y5!&uUzlA(g!FMfTl|QF?uo{!lIJ}p* zN^LYBh!jJAm9w$_=yfKbQDwkkxzXBN5!6|*lcxv7(N%3+?I7zgM?ki^YvvmrQRB>@ zhvn}KOc2vd_J6;6Y1|$7)&1%F1nqmz8We^|zrLI#m@$aL-kBY+(0wJ9X@@rh$K}?b z1l!m}Bd~D&!2#IwV`8^oBxd5u$wnyQ5**bwd#B-^P6h{y;JGz-2T72Yd2u(WF3#R9 z4gKw&SGk3)8)e+kK+iq(+rI<2uqq1b3@PjxdwCqa)$h~gwVa1F1lKjF$J-+g+u_(7 z!|@pWz>3mNO@#QQ#)cXR@|E0*!GD!=C-LG9rGz75F_<^ zrU2^!BG5oH?(GP{MNR1n^wsXe1;8~qz9BY(8-rW%-yT=4G!Lz)M>Mo?X^#DxvC$js z18-L&T9&G#am*DJgpL63cSvln5XqSV;Dp9dA@mcvyy<(+1 zhYCugti!r;i$l_119CTgJUL*uuY5YDedq9Ef{Ez>MatPsnaKRv2jefff5FY?YNKz1 z@aA_uke0eTVCqGZ;k$d49kTce(-@U(S-TU6qFGN*lhGKSV@nvedClzyp4G!OD^S9+ z&&q2iXT~*TMPt>VS5(1d`=$VrhIVsYbMtj1Q06f*2Uw^)@M?;$Qk--4jT@m-=Nc#d z_TH*DDstSBN(DgkpiIR>GtU_ zWDkR!@CqyeJ$iMu`M^NyYe=HHmXaUCOkox$qXavFSe8fg6TwyALDex9n@y7v$*|x7XhF z1r*h){t4TnnqT9yb#qz|+AB%4&{WK0tSSPQeuNL}jbgO6mxDLh{g5Ge6WGkMULhW@ zISXESDdJx^@-^z}i_}r=7jtCRIij1BBWU=>NBPA))@O5MZy0sP4D{@LJiD=kHNTAi zBiqYTNkK~i*tXeP`8$$usK%ZPkcUajrhc$r*$m--c1lZZ<-xbRC8siqJN+zCYSI;F z7_Y9?CLOsS(PT*bsi86Zb})}=tF>pEe!|S%qkM36?_VmW@%uIbYzzQve)V5n&v)z% zJpp%^Y$F6p-^d^8pV{;@YM=#=^qRvG)NDgK!+P(v`KQ@P0VlOVF%U|~QS+ajm@Un> zzxv5K3e$S}m3JgQTH9ljGQyu=?BsG%i}i(G#!6|+R1}9=Cr4D|$pmMTV25(i4dYO( z`pVsmPwN`nDax9?%y$)V{TNnInf+TzK*z_VmZpdmZ#blm?!5~Y|+iOe+xmS^<>iZ?Q)P{mz=?U&?Jp5W0v zOcIUB8o?I1yaeT4ibgewJ!Eygq`zo=+bk9J7~K?%*19?G>(bAj8G3!_M8tG~%75Fw zX3|a}X)=PyWR-WSgw)^HmxSI@)4<{7N~d5~9G+e`fdraAoIGABc^+;7Ys*)deY+Cs z$?fyQuZpbpUXzbXHAOf&hZ0YFO(5ky4{0iS}hPQM2G^nE?A$8$`3QivJ7``H=g_=(b4-X2SN z2an46GoG(ZLVIbt32ofrj<7s485fCyGlFU*1)QXgcGpZdo3ZAcHXM5H(6iEG;j3-h z7O;?rA5FCp*vo}~v)pt3Fl#@7t|&QQ547=+hROe`xaxbdIA_koYaUjC-Ab0+yeyv- z)boRreK|SNrR%e#*9~AnLjayrFMLed$2@fZ%~o5$bltP} zb3&sU4b2HlzU7#Mg)?ij6<%Aj`K{QIr!jGG=b` zA7Kbk@HZuXzbTLu6ac8j2}%LdWjzH%FeBwdzWz8{#0pS3YyV;75Pylyvp#z%&=$8T z_)f70e<1_G8X>d(y~pP`zg! ztMT{lq=8%Q1AKUz$Lp0h)BMnbAvCE(gI0a_tF`C*YwTvdzoOH$4x@N@c)VvzcZ6K% z=M7`jE4{ootx&4T8i)Pl63;YA+4kEu5Te5Lnjq zQc7@Hf0iY}NILa{Xc>%^B9j`Aj<}@szH`$SSDW9%PjNeaV3fRNKv4U#6NFN3(3&jX z2_bJ@H5g@ooAYv>&>a7RZR%HKqyI+a2QL`6=26?+iL^i%=OiWFZ2#@O%DM@9Dhfb} z+>U6y7>Pjx9ECZ;^6yYatJ%HBRwYiGUoxu0C-MSHmP{yTT0Kw@R|pbwE+Bl6oZYQI zsv>~(5q=p)cE$@?ngc*is49ue%nxSmv6K-ME6=s~cNVc1+A@0r6>*#48E0+B=xTuu zn7#dPaXGbT3=ISIAbm~Y20w9`|R_910SnfB<(rfgQw+WiW!;9%B~3G+(^sEaIGduAm)Rj+;t zUV#Uk_Nh*9n1uNOXle_*dFdxCu|L$UIs4_6=W&Uv0g&NiB;^H*rr?G%qJCLA%}(h$g*#?i-Z z1hOM6N3#y`MxxRLf*#viOtqN(h;OI)y|sPsDJ=4jLO!MEXu#PwtG3N9SNkBdPX|cw-80Bg|Ad_AOq>0OPqIQq*)u`I`qCCZ@0e&^E*$y6Ymy9H747+m z!)b}}0K%mx8G-Oz#HC6DC%iL2>f3I8pawVEUkTG&-F!~)yB=XIdiC@ze^pIJHT3=fy`(ng`s*hrU9IpRTN|nxt_t6$-r}k>vzy%Ia zu)#5^{imxCYafRj#{5KYLfBQ^CZk8r)rE>6Ez3fySG`mhBx_G#^+Tjmn0d{ zgQ%4^KRE+fkRL3l&0u3oNXL&$ya?@wq8(Nt>9_+ZY<6(X5OTS?tz zZDV3nzl+;DAK-&XJKR$3Kqjk!-(#R_KPN>&-|lhn`h;R=pqcaW2OdYnMY#|pcEei$ zo6~r!tXbVlhT_em%<>7~U*SJ@2`i?BvG2RiuhUtaLJHgz;0vVX}G)KBd73vZq!8S z-dS6ZjiC^K`PWFEv1JK+=O^sOb;bGhKU!auwBLM;r@kQEtR|VO^Cen{i>(AHmD5Vp zu?F~DaHd@Q(_SV?ZmpcaEGJJHy4FyC^1XUis8Vsx4A3n_pVG6;WwdI65?>8BTstne z$l7G;Ub%4FCn%MiwYFEz%*yH_yEp;?=wZpbVH3qV3|r3+OPgR;PZK1o@j45Rns7h| zQ>{Y2Xk5U`;FqToW$raO)bRfggqdh4oD`G5jf;LQw4=O%gIu;Q%+5Clcf>wFUr^QNdCKYN9)PB?V z1VCpkF|J1*EUtQ0#M`MwCaBL~3KQ&K|8xUveX@AZNkyUiI(XYOG%Q!<&w_+^^?Cq! zwrEmz4FSAf8{>CNa5q;95al*fa_xsDWMr~B)luqRE(c!vEnapVVhzxKbZ?vwihs0R z9^e_oNzn=R^V|D&^nL5%PdB+L9e9>+l6$q6%-Y;n*!3Q1r(Q8&(GoIKp(SCDIhnQ( zpTp3zivJPn0*o>|W$@0Yi znb*%L05kv;<+(SuDfKsOCqM%= z^pB3cJ|;vCLiC5&f0*K(wDY!)8O1U2r_5Rp)pfKU8#a6mdPAJrcv@dE%1SU?x%a0T z5TUM>yo5}gV0E;7IOVm+kD-$H_?j)|E^@Fx1(J^kMCQix`d&`?_7Vm%0%H+=Qjs3s z4)=XS-W6bmZVwZ&7BC(Yxw*4uX-jM_U+!P!N$Kj+mIi%$z!94)Z8Uo<9hAwPVM+v) z1{}>M>Paed(E`paAU%JL506j8$<~MF^qa?2RR058*Y7iKrnYaB{C4NpxdTj_vvH+R z*xMZi6W}rlF9!ZwR z;$rkN%a)}}-29#$K;v+zS$S8`dHJYopT~F*T+TTUybUdW`p%A1sRk3N;9l;dvq=}Q zHN#$V4VJ0~DC*?#gL+TJ$_=w#ohAKdOJMQ(})l3 z%eM}IHIr`dNGH6ZsP8inwix#1S?dToq7Kes4!(j`yr-{yzxxHyr9v^s>B`dMzX3 z?+sL%jC`2Lju=u%)BIu7lA8at^e;l7SvJ;6HoU#V!VW!6SFRsWlhY`;wG+Ktwn|N~ z|2el*%;g`5YR7m&5*nJyaf9l)l47gVGvxc2Bw5G2opw)Z<`MWs;*!0v!|QAr$Y9Xx zYZYx{VTGVNc6Nvt)HM?fa({EN@Z;H$1rET_^K@bG%|bPc&P!1Nc_phyE1NNxKO7K1 zrmVn<_VV3Z=T`o)ed`^RqW|rL+HR=*DnkYJhHuV;FgZ)IYpPbNbQ$mJRVT1MBX~L+PbO!L=E4_r9y{+ys zue9{J777!7y9#53)&IG$9=ZrN=v@N~*GxR8&O1hKQl>ByT;M=6C6UF1+@Xo@qzr;7 z>{Rj(%a&lfTjK)`j>btD=Uk-NoXpJNw$-&&7LTe}zRi@4FheNQr$Jic^NLkO8v*QdZsp=l*ndZg=;|CrAhav8J=vWiJfWtGE!bVv*n{0JSrc z=E-Ud5Z>TKch1)>Jm&hRSwRJ#D_^d<`TaM_I{vxx@8ySlLftpsvkAHJCx()+LwSSj z;)j#tQ?3US?>mq!xHl;hnnBaB)y2T|3DZz&=u$(Y?Y_3Jp*41xQ6dd6^#Apisw$hm zj8i|1=00+w3glRowsIJo&r1K2SZLKK?lM1yG~BKolo0uRUg2*5Uxc!BWWB+Y7w`17 zK$LG!;+^fX91chv#(5gxuNgxjWq6DHWE!u-5o>;@$* zshEJr`LQNpS%)?rOi4hJBKGTZWu0l1q^Oz?U&9^8N0GfBx|a1@g+AGHNZg-@V-o_| zn{bp!v4J`pjLcg&epsCHN+S<;_j1HI<*`GCzzE}-K|lEl7}CzwH%7f-mvA+{wyA!E zk@CDTM1b&vceM7Frl^YMco?P$TR44F$=V^vO}KDX3-#a(utexe(&9aX2_Jd1;xBj9 zh%O&mPjB`QR$J>o@6#4C_ECv9HGEj&uGY7var*O9kpPljg6|a)SUmTNVBkBqEl{Rs z^L0`J-AVDz8?#mXD|h%XnaW?!UElk1?YAS5rLh%`F8mvmnqUc#BU=ZYq_Ou_f8SOB zF|B4|-mT#djIKUA+i}v9b!B_DOS#f)Z@($zE4G8=MCUF1Lx@$3a6Xs&@<~Y@JkQ_@ zLN_UpBezuLKT&d4q#iLi`2<-iGF^q1XWpb?+^-OKhQeMcUMU$-@MKtb0RJ_Ut<0>8 zsZmb3)?gvFuA+9f!#neV*NcUpSk_@_a6)76M*Z=_gXb`U?u+MD*^sre52y4m2%Mke zme-Jp%Yf~3LyR?o4zOSo!=M73Q2*CM#-&-Wos(+ZyN67>!e0I@pWh8{AC@Q_(P1^7t5;}+cHyBH4ZlW-r9v>c+hbWrb%>0EHEPuTP59)=fq;gf zw;R3!sQfV@ZcBCEAxXf0!FIl)v;%muyrQyr&fZK(OG`NXGFus5H<+2qr5WDdDHND# zBP!ZHHqg-GUpHc-o)mb^Sfu-B@A+8%n0a>XAqHO$I4RJbg$OZDCwf;NN$^BS0#zL^ z|3+5t-sx2q<7WMKpKG(aH=3?uBlc?hv4uyTzuoH<_08?oBxP)1xxvqiHMqH(P;oZM z92tq}?IdS{AK0#Vb@-JS$TOpQ%}<7hRaQ5(;^M)#8`lHu)lu8l`!-vM44W&^IqS+D z$oro<&LWkKO%A?6{+Pz%yA8CJl0C4D0V){)7$<)WaXZ+%-$q4SV@JtpnBJ=^K{NlN z%wsnW>z)a#%TE+x0yZLfx))R6f_bUqGKtvHVlxk?ktdIwOdksU5i>uo>#QLbEr&yK?O zlN$o|ie?#J=j!4g#t0t+^JA72%!-f0khUK?DJ#eRSb}LainJ2X_lJHMqTRazUchB% z=O&6dMN6;0Ah)T02xzP~cNNogBE(Y}=92dJ;YE~#zqcEC9n`ii0?o;M=3Qx!^#s+7fOpl{Rc{a;1C_ZsP@Q@6bG zFT&N7SL(4G__7gyNI8Y*CiZ@nM_wZ!>vs@liye~h{c0x~>}Gx0H5?lq)i_KSJTe6v zn{J63M^_%uut_)#3}*T=1zsa}Xk2=hIMrPyL*}F_*7VXpriQ(dykw0fw(ox;@0lBZ zu;dGhAtO%`0zW*h#2W)DG&1t7;7x9`!IeO7w@ju?1<=oKcha-{%VCG*e60Q8@4Kk| ziUDuG6b#q_ZfXO$UZ<|pSYXrgLgc31Erst6{F+om9!qlXpuxfhA ztA}ek7VoWk`ugA~@_R-jMC=gR1-B`QI=H7t4tkFpP}*e~;Fl9}P56@&HKdPyxuD$y z^c%$r)pm&$yu53m6vKDPW3J2P5wj5esh>KvRPZ;9U(CJya_qO{`bS&YQRhY97b#C~ zA@fss-o*1+JQmXrvjHV`oasNgS*^5r{ihz;$miqHEJNV65wwK^HQ1%|PON4ZXjEFpo_+5SjFt(_~yS6}_sL1r(xpGg(0bbpcw z#OZ|E?QIZYAbBYO2B~C+V=UzB$jE5&lq~enW@UTEiT;$i@#Sr%N}ZXd4N$s$j-k>n z{c@^oqw9WtL$jZ+ZhA@z7#vULN?Lf2P0m84C}Y;kj6B(G#f&N<1dp|^tIGoY3_Qvy zOMo%um`MF~J?Xy}+!Ph#Y7e+P0isq_m4hbaPnhZ+qe zsaww+j$_akMYl_q&3F(W_-pruEU(HTkX^V8o-^R8d>s7NMgOeg_9wnARhQ5v40D{n z7a_c8m?kS^{CKadXHx_vER9x^+ZJB2+i+}X&H?bXu!_Ai&@)Lwk2{#D;E7Y&9}s`~ zaWD7se8u{lY&!dQ^1AA(ir*iSqY~d<)*vZY|8BgIi*Yj0%d*qGFpz!a(W49Ij9X}6 zKHV=rjhJDC3P*&Mew%>xL_}-cxeO7dCicIt*$mI`J0U3_+j9sWKj6#_{{xC znb!^+NZs^XK8_Yr@&6{6XtPyewgsT02UbbS{K_K|)n`F3_SVhJ0UBJ851cr zN{Xh=HWZIdJ8drcUwT%h*4^FNx!Szx(IT(hf*Q>rN98ImFw%}XYIW?2nmbl-3IGQz zP47Ik;`A8+BYD1Vm#PkY!FeBmWkuG)`S2KY&KY9(lX*CH?HQdPGi#2o5pstECbxt8 zjo@vLST%l*rV=~aGsdgGyY|iQr}@u33Tt>!Qirg104Gz~pZJ!5-dC9Yp$t`|y57C* zdsQCleqGslzAfD%Bx;c-NV&SH_Js&ty2MXc?{oP*Pbw0a+1Z}kwW9h$T8#^d->&5( zEU4WSR;ze^?CZ;4I>#r7K>#rF3A(38F1dRqRxSTh4luKmUiLp7OQTECtxV&*y&>Y{ zGDDq|mAAvyz)Nf+gx$8hY@TtgQtUCE9py$8KB(9HM#h2NtU?@MW_TF5gL7`fmQ(W? z7Bh4QlT-ny3qZ_^C#|tKQ46xjjq^mKzo|uN464Ulb|f(>Oz~2mRVXdmAwuwh85`HiRB<6o7l7;Z zcGWK31Tf1sp~P+h3S62E&d(B89ZgzQM|0d~7HE@5^*-YSGj3q_+ovh&GKD)OhfkbkvQ zNGe3es&=qATR@%NlRcE&Y+zjn;`3`1?MdCHcj;wz- zAEK4aEIz7G9sj|v!;0SsD?_Y-o#}X5dcszF(8xgLSOiecyyz;tv7|;j=dzBQJ~9tc zG!MC+Fra1y(V^U#CI`IzN+KTUY1zDxwr@_+_Cw`F@!YJ$dK$ZzKNqo)F%)S1aQQ4+ z5%q1iuY?s}>;WUlC=}S>lnn~|Bol^cBaa#15dVF!ULE_7?TrVl51#h&j>q+^x!baa z{^2Lm3`QThU!1%MBz{i!<1G%Kj^(mNJCDRi&2_KEau`ZVpEivux??M=@VRBpq%kPg zJM7))=&wh&{gZFALk5_i$r8=j+1cs2(MyxtL7WvGP{>@v{k+dM?&_u#NqxCrf{e=* zygg4V^CjyR7|j+kw6`%~aa^S^y9*L0xj+7`7Ql4#%~$UzbwAp{mNT(Q z8+RH_9wZ@j!7tn*$3Hr4W#i5h8*mnGNpW9yZxHBxe7Rj-*$NgdPg@hazXD{SMa9+B zANIL2U*?mhpXsvaAV=qkfg}2Ao4}l{M=?nRRqG&MXu5#vY(h}|a{BXk(D^ANt9VJJ z{cbWhUvEC_39bU;`KZ`wa~s@IiO?ur90RZkCYZ+SqB=xAg|d|v(!@g?eQUo|*6nbk z-kk4k$E<<()yil4z=7tF9R5TJS}Rt6=6bozUElGBBBg6TurkiCx-^jdZ=il|7vF-o9@2x>@9^ z!{%XI`Zf)9$5u(4i0HCF%$5j^+LH9A{8XgGa-N7k8e-NH>xQ4g(T^3N*_83ALnubI zqw(3k(7h9`DH1#~2Z04yY(VitEAbHd`o{SrmQd43K(|vi9SnFZ|SPqd;vd{5r+O zW;M*QP1K}vZ5ePs_~7i*>9g`~UFVe*I|SXmVZr=pNn)I4?!H-Q7s(o)E7+0T2)8`e z6}xE6mlLjXq#e`afEOk){aZqV;>f{S2h%gF)FZodhy^KTQ2SAj!B5}bDg0ls%h4Q1 z!b9U1!TC6IzKOKsV&6_Ci>P5u8iA6MU()bp{`exprLOCzU*wz>;^jqqJZ!!cxp{!c zvquSX3#7z8kK5HT6?ysP_|j9J0^ttzdgI*S-Jr&zmwcEcNp3?pEAqOtP#jI z@Nn0X+C%AEx5KtIw_)O^80H!QT^DebxL^a)6vmN@s#hsh@An^NDB8Q%(GH;BRNwJMn%e550 zne#Rg=P`GsDqC_a@35EOCtA4hQGmSvX0Ez%Ze*0hKv;-rPls)d-s^AQ959ys^05Cn zo|rsCzGCFWc@Y&CLMw_e#NOwpJMP3)CcB?h^@$rX-)kriYYu70M}{_-blsSaW^pom z3WXW1=4lf`e(xq<#=on3=$yCd zxDC;Omf!QS$XLF32=Q$D<6~g;p^bgpLMhksL07URdA9%uP^I>;*bOx+ASa}JZHV9g zBOCAn8FA_CTF=`Vi-ldr&Rik*lw<~)ye`+D4tp}*jUH`o?A+c`K3un@h`!xo7jLw?Fy2lApiN8O>XW!*IX~dCnax&K(o`!KuIV;*Luqik4)^=QY-vp@ym*8coR3}l43seF z-LlEG!Efe=_!=yZI&N3`KJII; zPa#HW*32)~sNMd#!+6wk^1OeaJLm8D31rl2Sc?bepUd~{=TPF`a~<=ZNvCSr{tO}% zg=CJ_qe}h1>$2iGCXE)$d-fF)du4>fz0}5S$09DBplQ}kcF3>R-Z1>xT!i5;RFgvg z7G7tl%(-Q{NeTPZPW%>U<>|qRnvIRH2|4OjC?$up8o)SDmmB_aW(mTzBz4|1^F;1+ zFI8alRT!?8BJelu7{9eL8<{vkzzmJ#=HLxC{Mjde&P5z-!zQzQffVUC8YU7#CM6`> z^-3M};BenBD#!)E{SN3`@g8ubu>KgL`a`rEH)orolHkVX26xE0F7@AEu>w zz`UPfGlR3d*Qnmr#&uC?HVR7_F&nK4t5jyB<+H%ZEof>0qwkSVDz@+pXRC-uFLSy! zCbO!_#I_juAG;DMZggd9eUOhM(9dgaZ4IzkwQcUi3(Qux)i$)Xwwg4?C&+sab<0W< zKAHF%*-vxg&iTNs}F`e3RQ-+TQl~`fU#@{jo+) z7<$BPlXcUkZf~O1o!)OA)v}5ZMk-qLd0hrNvrK;k)1cFD#gboG2&$RC(GVT$XK<@g zPiy2dB-i&dF^}_+GNC#369?gJzrOG;E1c)N(Ww%0&NY8SY1NtX&Ww;PikAA};~A$~ zgP7(;v0F`-ZD??rQ+Ra>m;7FBJp6f42D&;Ra4)Z3b0W+<%0bl!~G=_%iw=y%w4ST2F&AbyNVz+c&KtQ(?rqh3J)<7RT5DeL$vmB_J zo9kZRBgrHD+?#eml+6j^#1FUgfODAaW620F?`X!jGR=%wQ9F6XDd=|b!b%f%Jbqwe zGELZQ&q4eOuf}!v-p}FVRlnKGOjY6y7CHb^Ke-z_!rI5<%n0NfpSDP#5I>0v)f2U7 zV|<#HA^GL(07tS`X!Q=Dms(ojY_XTRJ;&)Al3ur5+M-4qsS+&Z8)jXoMT$C0stH!K zzX{Izbi)7lX4`NBWyOpTbm%fz|5|n;Lkkb&A4F;BgY6*er1EpNUZv}i2eYMsb3?&#Wu7`XnAz_mVGOoAd#3yl1}ev3l+q2JBr|WKNE2OTg@Jk68_&q1Hm+oVm+A z4jT}Dd5lv#rZ8(*)P!Gi4s~{u)bUSR`F+x@v{6CWLhyu(=Mz35H)dNSkKn8h>n&Vw zcbHw7r4F!DUJLH0k-mgyVIp6h2c#);$SVT5GZUPv19+)HaA25SyS5hEz3_Nkku2eg z#p@5})6Z9ObZYyn-SXvH@9xWIvpi)5A_ShDD!@eI-{QAL0FWZF$oXNewid)8ih9;I zjg%MQqRyK9v(Hts$J-it(;2pc(;QHyN*VSNDMzn>L53ZOld>vq!RvaD&ahnMI0hyv zvwEFh(~Y+YgIzH*(B{zNA*05%Ij72=w3m$dTh8%@O01Z}av* zh__B3@UN*=4twBGQkUfdv>MwDF2sB%ri2j5tE@K`%j>$krLJ*dBw3SteJ8nEPoH>W zL(9AB%VU)x_(t8A|2FyK-$5b%Q=o{rsjb2LZ>PtPUyHKmF9WF3<=|&Bx}(AK!FM=- z;_yzcLr3D`AMk|K8OKIMl=_+g+v9%Q>8V9&aGLZP%|;cX(DoMV2GyEY2r9#|vtIKE zeLwaC*k}*Bz*Q<3+LaH71sGb~y03B$4HQupl_{(LRLi?}BJ|CmigyQ4tl`0$F>2YZ zbPf2eZ(N7?sl^g-hk0u#o=ngEtCpxl!gsi4N?O|$1#F7tpCnQaawE7-<=joFU>lEM zsCWK~q9hi?2TU4o{hOOsQ)ZRqmH2!m=lRV8Zx&GEourE<$BbwHl+0iahVQd31?FYD zadXH|=K;-sPBU~vrj>iG>*{L^JpiBIEKTt6xm*a^lI*eU`-fL2nnc-0M{wmn_Huh} z3guo)VUa5=jYfIIwlCfqL)XG~C-v-GzM z)73ip|H``Zc&NMYKdH!G$z+Qbk%!4rma-&IWXV>Bv1H#hBw-j!*3#IQ2-%_->sSUc zqc9Lo_M zp0K7d0?_k?y1AUS{hR0We3)s20t7qPj)WI8!68Ngt{z{&c1uE<`XNYYtG@{ZespsC88cEJ|`n4AZ4(9?j@w5nTG;;@<=g0U`b=!OY5{{=li{xCWmldz65@}(pnnCAvk zrqr%Pm2OCDeo=!)l{KwiIdsOZ=|kd!RYi>dXKTVZ*@A-FONZ!`O5WfedVCsLgt*fY zsqNA0o%wVlx4wsgWG*(K+%99(92RBprolB_@@J<=diE)HScwPH@s<09kAs6k@Q5R35sYwOL9y`;PCnEMR&?S? zp_0V#B)p<`t2+5x;k;bt;>$ay4olx``69=oxuW&DN>+x|SXeQ-Hcq5YRTN+-^gekQ z9$S(?EQINC6gRT{VYD$N4VT1malaWFb^O5AlT@iT4uvNi0<8lD7U+LikJ&X=h%^Sz zD#Zlq(i{qC*nvwzUKlNvi7p{spOf6NiIsHTMWlv>b-()%=kq*?c7uuQx)mFS>#kle zN!}QM4IqCT;vC3GnnL>SUs4+@c<3pHX>rilio7_ov8inHqGd?C{pAV9cS6E&O{q=> z-4I8)9?G{pOB$Zmxk~x4$n18JjjT_Z2cOV3D$};xG*AyqRm7!)u%9M7T%nTm1-)Wn zNEK#4&n7@o+3O;EQNHmRgDu`V_RjZY8t{D7-@0x_5A#NN57L60oSK>7M;l-a41J7U zeH+LLP)|y@^}a7n$)#9SEF8;KP6<&Bfo^hcjg7`#_Bbw5{5{8|W?Qoa7?-1;s^ z-FBCyOSe8FMi>q^LlVTy8Y>*UcgnW9@Pc876uCFowCrQlPYSCfV5dvI2>oeMx6aQ? zL5q-@k|Oj+IhAR&+vhcRLqkNrk88lW(^+%Xxi$**XC7fh5w&VyGenesvFkD;A}88> z{W=Ccz{gsSswDY?gS~vW1X2jprLwASw{{x=s^@qJ0a_*Y%KWMk1KS77N3mPj$P{8U zTYB>!A!-8}%%xWSY&VkzG+Mo}VplPEBgCydN2d7CxMmqySc7a<A@vjFi}9q-LBU|>B77wpjAr$#lb|o_ip?PIRLs|Hqb++Kr2hDs!1*)d!6LB z(DAa3Qc~r-orwTMchGgsa2N${zl_2YI#;b$JD@d&BP!s&qnc-0$*Kmt>06@6UMq3m z|ERf$LZ(wwy7q=ksmv|=d^R`2>Ul}O6Ue4;Gjm?i@-t1EZ|dz5MOR*lUM&PDOn+X1 zYU>2``IiXfkh=NrXsM|FOvAfPhGVU!FJ-o>UrgFq@&tr+^RRAd24oYM^v|z^IBqlj z$~IOwT$86qSDaJtw?zMeco~Q3a?de(!~+0W4xM{BV~170?)DVYbu#l?-&-Y!y-t}VINU&U22pUs%I(8N@+Cru8S%pmjBzok_dl?~62*jRQ-2e{|M^|1=z4ExOSN_xCg4wObTh$hN zY^h|oe21EWDWlBLkdW_xhTxZ5B#mqJ9C@i?jJ8N~qwiLV% z@!V1p4#6;_>j{NOaf~syoqyC6+*#NYETEYc@uJ?2+zp=c!!^re>_;pqdu_4JJ)C~) zl$+PWgE;IeJH!mH41UsrM8`(AeN7J zK#ZC+42Ep|#Sv-o%qERF=W1_@T)vZ*UPfV=x%@bqu--$~DimN(KCZ2DoNX}fqmpx= z>Qu|vR>{{G=2(=`YtdNAL+0n}+yC%^PB%13`N3*#tQue#`*(=rZm;#zwy-BXjeI8o zbO!{Ikx(BPF1Rd)a0af0$X?(N;!g_$?1)$NMh_v+rc@LQT=LPn8)hf5WqD58VfCcf zmeLP(n~_JJ)~TAZh0`$w^bpu_XqB3+>Ue?CfIx1c5UWOl&u|zq(yLm}?b&s;DZlVxn>qJ6oE1T*GOWCdi+%CaYa??v^>$5s zg3^l8`6y9Z+}Ze|Lijy5KE??CWgUm&YkNjZnxz7e@&;9jhD`F7prmg_m8Q-xxO`>7 zlT<`JsXoGafII{#A8S5uX!fj~?RBkp^HoptY#4v-rZoe*;*UOq3PeSu6)ht@M$`0u z)~O$Nu}9|#l;=!(wz>WGFV~6DXZ+0?0;AKVCpvVER2M|koj+}-X1 z+*m>>YGo)sx#p)8j#nd#*&60^u5-y-_7cA^UWp@p1KrN=;Zv5?hPGo`n&)*WCfOln z+p!G^y7e+C{G%J{nAe8ZN1j{__u+j+7*_C&sk(=WQP*p$#`piE%^=*nL92Se*saDX zbiYNJJd}_uoc<{g5n6xrx#*>PWOtv2nznV@mBabspJ`(yCMRd}9X0TtRTt`tp_aPR zSmLGCF^5dTizutmu;_3D!D7)OK0E_PT95CURr#l(0tlofDX~qFyf(F_OxC)fbhLXy zlP;%=*0;T#yM0P5>VGxvXjaZ*eNnAya&1WGakFZkKQzAI_E%Aa)|gGCjLN6*ZEGc= zg2ta4+**oh(e;7L%~_Y1)`otOvahJ1NHqYW-T=-v<(uh{lN(-|5!2XCEHQdL`2br0 zz#)|+f&}l!wRP26Bn(aEM`T|bc`SBkY8KEj7k*A{tL;_?V7CxRtmJ2WAg1vfv*`Dv zvkOTvM{OeG5`;*BG>*qle%M*OHD0G~LF{fxyx*|gZxE<5=7c?3bjOT;(VWvFa3o4t zpe02Yt3EQA^63&LC98eaF{bJ;k)^iuBjsVF0S^7T+5q>DvmMwUcm}TUW4Y(+(<5uYoBVZbqu&e z9_`(!`38t!&hi)oG#dr4;nSA0`PVP2jTj#NIN16l-x~>@^(sy)DW^@yM9gKNN{ggo zgDlo`+D9MiFyMZ{@2@WmCG4gj46x`3FHiIXUC&L3hkoCY+3u0B0Nr@h=*J!U=*#KS zT^TV)zfaid8wg14Ce1l5I_DKEB|QQoIjM0NzoqnLN&d&_$YQo>`1Eq;Bj^?Vr@`-3 zt9VC4mkjo}nAYxbe!m8)77!0qrCglpiJdT}N8VoWzp%W23%JqK@=05}5Xm zx7Dz$h`%&j_pnLxfT_dNU%w*yb&ww3`EC}~cDQ6;^nr{^*ZTJ@;*Ed6F0j^uU#VX+54m|gzh*ur`V?F3@Z zVKH^65AdnnA0b}q-BeqC6QbPe@a^T*aRYSIVB)31e%V1+kF50K!X!+mT3}PEtoL(# zOvHu3EtQ;Uz`0$%;C5<_V{m^RetlIQ$6TyAuns8Xk7kvzb*2wYYeHEKcKwR5rS*9p z563g;n}q_J(pr~>r(c0L(z`QH%@DQYWJyY@KMbr4Xw?{e+nJrW!2pADdM9h}sv<4C zs!(lb-Z$4biyP)9Pc7fj{!t|YKVy~{>7!ZNktC7Sc$qYsrK+gC|h`GqB!fCfNiPhZ<6~u*A&gWjz+*8S2liPlI5AUC+ z?Aid<6#IF8H?Z0?PIJPQCHGaL-kkY4ey`z?+E?6+IC!gQJfhpa<$|dzo!NyS0^H^% z{N7BbZw*`jA{U7+z90n$PX$=e+%%3#AR@Aro`#DkZR3v(6Rt{6RAZ*0M==-udfCsZ z)Ln)Z@oaj}&76o6Y3J~AK?8c@kRi`8n55^J4GoK0N@DLl`<1ZRd{UrJy~@WyUZhDC z=c1W$=lXdyHZTl+RwL|(H{a@gw01@@%k!ilcaw3P`hSd!T;btf%qfoyxa%hE!|XzN zr;1=di8>zg>dvA=N*Q=T(Nb*!r|FhWDfk%YO%o-*Cp$1rfJXIAZEUYy$3)zLK$6Op z1(q25(CbYPagWQB1L#hB+E>J=B}^R6@t2ni{ULGvgoK;rP35lV^)KC8Q-fct3u>R#&v^yyq^|Vh(wtk086@IyT>i zm}DYdyg4IVLetX?epZKF54JL|>O74t(oiXeC*O5k-mSAvJIitsB?gtX*iiVzf$=ol z2@qKF#@rJzwG|A@?|Tx@hMLFS=#qMCxRW_F@ffp4;R35;`%Im}CM!gD2FE7gZrj8k zQ0+8${8CzCpv5=qB7SnoYfZbb@A+naifEX$-D^B{IuHWxSZNK~#Bdnd*Gd$WPko9h zq?=*WJ@>~bLS45XT zbRXgla=K97$FX|IdCyfRbm2QfH=I4-)&Tv47u0}tXofB5$DcJ}{a<%(%FX1Tqtx)) zF1Oy?-r3IB$~eI5_$y_wISZIa&<1^QL$0!5jPrbX?Ur@X;q#M>CH>#DAFOg>Mtc?L z5Ibe^9|5`VKS_};dgO^DCll?{q3H$3b%kGc00OPaTVp~c2&+vNgyHX@M@Pw4wVwav zfIPW;Hh?Z)ii2s450n*7~Gmt_TXo6x-7znLHfU_TO( z@WK3R7~fmN`RvEFjlAm@dR-}84_s3E0Rh*n%x5wORehqx0kx))Xo-xX!yt*=`@y^f z^KRi1#!grs>`|msDQ-Rq6yreXZ^C<3e=e^i?Z1sIU0?LTztl~3c5%&;e=0<+_8d^l z%LxWnH^%8jxfscHl8I2ySIGcx4DU%PhVk0ql;MG@573Am+`9?; zzDWs8UB$pS*%>=lR!`P~vR0s?et0c``+X;<>IV7#960uAkaul|z_nCtVgY zns6SM?!I?6ZIwN2x8N1bPyU%p-2OcK&YmxfsPJsb?8v`HDXIYExo`8uRYesWb9s4r zb!CXs(b(N>X6Vd7qJI%q`QDv%gS|y7ToC#C2XZxqXi`1mU%u~#LwZBa^iBM0V~?Ew zR~zImpvZl(sz`EQ>Fw>UF<51$>=XLFm>HSmpcb!jFnQb^quevGGpwy2iyANZ#XY~j zg$6hG_x0s!4CgOW>5(|l(t|bF@fqzpoVA?_Sf*qr7DfAy{>!Hs@oYtV2Irb(PY%!~LRBhR(ZLDU=aRHAo z$wmPXk$+M&J?MP#XGA>oc*Zy+JvjqZ0n@1c_rO8d!opoK>m6(}ulPcW=yDM^1dKCW-zYj-o*&ED#B- z_*Qw&vMQf+nQJ`#QW^()z|g!S$qhV*6eY!NqrunC-|74DgPJ;>64fQ+q1#SOK_A|) z_aA2O6iui!yOj3S$wz#=W}p3UY4H0J#1xI{PhP&0+!^LUAwEdyz|Xm ztSaG4GjZJ%e+{v`bBik5Z`U|FI{xs)Z@wUV)q@e6`{g}xX&UeKlDtg0o3lc>@w_R2 zM$XX5d}%Zu`NeR)2zB`cm4<_YTQ>vAAjtgc(|<(YBI{Cy$|f%#iC+4{Wj_-oM?V9j znDS)wp)*Nk?42&KJ!+@?E`LV&d49>p7O-+sea|g-Y{eF1#opf!ZtT#08YV&eK?_uF zWD^Aa%Rjr6>~CKkuGMn&TIuVg9`^zVV8pe6F6{XnFLWRDR z_PV8_3;^j<%hi2{Wev<35egoaLEV#4Mjw)fJY%Wgw8V z(jc<_rry1)z>e~>U+(+?b;*>}*#clX|Cs>*yfGrL-)QI7EV>W$`idVfL=irQv)gF& zlHcWj^+6>51gzZFptn34PAw?+lFchS)dGewpex&cr)AEQFUGRU zy}o7lGf-vEXa&=&7SxODow||0+)F&b6;&@i&C(_J^g5XW3mG}&Y3;a6QtVrjH)n5sTc>7 zsibOa9q6*+1MB0T$Y!)~rFQmET z0&ukB7(S+<2||!Kc9{vg?%Z&exgT7rqRvy52PW4PQXT71yYc{! zjI09_W!L|PeI@ux5~a=~;w;8-3Tk$yJWlY5oG!Q@dP8m}Rcfo0v{0@>A=Dsze7dy8 z$a5F}1KlJXWP@pBl=EPbB7!V=&sAAlCzxu$@K{wP8b`f zirGJPL5vuKqQ*PPD>u1pVa{)WTlnl;7tB}Wyk;O&-5z3&1Vx>LCNc?3dO}@rRSBT5 zx~Iz5R9o}uCIy$}9_v(mOOA&@(Z{GOH3^nMp5-#_>!pK$coP~aHFS37zOBuM`cyydBgdM9vJAPXlbL%FiR-|&^6YB?p84aM_f5WUy6uu|gE+55c z)Ta|P`w1evnOJwknKb)lHL5HS2=bsT$=oJE*rJ1YMf1{VHvkq)WF^-OS^lSSehYT+ zG_HFFDWCL&ZtQxNZw#F!-lh%@5c@K)SVBYVcp6t_F$Rta^JtICD*NO80227$q*nFv z$>LC}r8MaP9n&!ZEIs_3Q%)O=WS|zQV^uWZ7wobLA$v~(4=6gBkFQ@FPR&Fuf_1ku zwOp4s|Idup#cb5&(hYD09biS=#=N3he?g3*j_^JnTww34yQ8TYF-$YJZ)lPyQ!6>Z zLTy&zZ5q~h^ZL(cYPiO2paw!L+GB%S|5^>nSX2FaGjY^p*`!!pQ&V%dL+UU|oSj-j zIS;+u_tLpjoz7f6AgJmtV`=VNEz455`^lFJ0Idd^e?LK1ak8e2gk*nuqtc107yo6e z_Nh)b(2iAb6mLGNX-XUBcah4H|5bSJ_VNQ4oT<}Qu;vEL)TGr(Fo`++|9W3Mn0`-# z5VGxnGZ(#A_`!#T*N24fH%&mNYm^pO9kq%r*i?c ziTjLDk*txA4VdgcS+-2J?)lPTt}L|n3lSNqs{$z>1&fiN8N796GUK3A)fkV+?I>su zRlg*#`+HZ_Y&|qB0TKVV=3A<GMiaM@0S*2DvAAeXt3E+-tDBoile2q$qF*@=sD_0K8hr!unPD;aZK^ zt!fhHuO`^pUl@fsy|CbDnwU$zc{9lJ)QQH+QiX@(lpjEQ0?po=OFD_$<2WhI<)5k>Srn}w)=yChMtb6};17w*c_;;YX!AUF(G4_|opG=g#KTJnZ zUmE^3tj_Aa)Cy2#|Ceml;O#luk_3TSSFnrwJ3TRk!xMWfHPhRF<^J7b?+fy=jI%aF zMYBI;+ok^!gmA=Ry_5Cl9{6hXbN~HcxGsG34&U6b!kn3Z3i()so&Fs6t5R!haj=N= zxaM!I5H$A3T_e@;xea8F=d9M>20&O0;On1<%Top1uL?T|$!i#J{iR)ui*TqZ3)^8c zqQ2fU`uM_q4TBz1`L=@E+^qjroL{!+tkcpifR_JXQn91M24AeWeueyd;ijgnb*o6p HJn;Vjmn+6m literal 31664 zcmeEu_ghoR8}CWz9YKl|!3IiK=_Ry9MWssb!Xmv$M+k`^u!@L^6agtB5PI(|h=2=1 zsM1N0UW2p%fpE`m*n9tl`@@&#@eya{E%SNHymMy8m-@PQndo`w0RUjqzW0YA0MH-- zfKr~88f;k}YSRS&qVv9I?h616?En0M04ZtQU?arW@U8|>(#N*~{)5sPA73_30CTUad(Q+$1LWw95#c3w=+oFCu8fng@MIW$^DW;mP!uMgGbc zd_a{r4NuM`odRG znSrC7%wS6pihF*4)~n>`Q)iGhOQdAlZANlWAUnXKPmk~&!E1X@Yh9?6CK+8j>#_yA zUUy?-cgtyCV1^DfBc;eB4#L32x93TuGzqVW=v4;;{^O9AT(yI<$=m%wiKck>6)Ry4 z%X!M@-Xj)Usn1X5h`tBvd6^3Bw6c9`EMZDS(UdwvN$H;g8vu|dbVwS($kuqjL+&&FJPP=pRsQ2O#c$8ZBU|VO!`PCe2nTP)M31RjQ>>f z0FY^T%E0Ww#@I1rW<-I|Z98t1HgY6mrO&~Erb*Q34Bf|H9b!xl zvh~=Sx_DKC^$fIhIwVUWi^XW9;2BaX3iQlERN-AK+ksL-aGs&;?Ck%%$x;Y_m7Rwo z?kDB7jqSQL-B;fdBP(F{pb80VQVqYkI(Q(Tfx+esfP0sJe%zk}2U~p+HKe5KHq0JfN&=eB2%7O7KhA-`ne#jLAH3*anNK^fL(JD({H zKw0nx0Mkv<%i@r(RbueSBD1QCw|0ta^LkTs>6-N6JH_ctg_6qx^| zm12Y9qQ0mdxQO-9ZF(No?v9c|`A$_#>nsmPTk7|hB+@jkvTJWplCF_OIi~~3u?e!n z!ShlFjne5K)>g4jW=H*OJpXoQ21D&?Jg*7%73XJsSgTO{*uFA!a4izOM21r>o)W#T zLl>2i_*;`UlEpDa11ERZ<4cL=Gg7Fnd*HxknkChkREV_A5&SR2ouhzcb?xWgCA8@; z)Pe+#yd}t)LG2MGn$g0AS4DfS%V*@)vqm4PEzu7wLSAUV^-j{VnMjvdknPC3Ho2qM+gH?s!aOm!!ArMU5!NJ$&wkbD+u^2kXFyQj0T|sx)VHKLIoibjLx=hgfRUGt z@-+HCQb9`emf8*4uy+!zQ9I9XUm}|X4bUQI-x;!o@_@0|$X#n|NP8?x#zUSPBIW+P zrvFq?`_dMX+=c_Wlxf|dP5;u<$Q>xNrFVl8#zOAe-$X#%b?9MEF3Q>ng~c6jY>wcu z3%Rc>Pz3q-?tRPUxSM^hxE|^B9I2-N$nH={t>0r-y=%o3n%3FH7EXq-Oc)bj2!uBj9D&;}B_wBxopby1xEMzx8+t4B(#~IQp>m)6??B2W>55}3>nOI+_-540< z82fY3jIN-xT-F0=a?jWeC!igYqwfbsuY+=W62SLwJCdIjXn&r=8WgPS$+gk=aLydY zu5d=7D4scsHspSGE+(%@zSG3X4YWvba$v|*?jOMp z&^dTc>Kxg{P0=46#lJSccw` zN5};-Z{=6Fky)2-TvgFYvdz}{Z&c7#@l3Fl51uMfYJV=VX0az2eTHrX9Wv_{Xype< zO9M}6kNsd7wHCAFz%28%P}9sY)IXB8hIM}Ssgc1v>Q^~Sr?QuUs8>0xbun7BQ(Bfs zW@$82_6fKD)dAh-3}NDU0C5qB3FwDcGpCuxSTH1>4_z`_Q<}945X^~my zu2GWCdwilxvs6h#k6#%A>(le1tpc+xVOFJ%A9BDAU+5NK> zvhE$g&6A{o19Q4>RhHh|$N%`q4MBN$lD-ZO`2`DjEDy?)YY)Kl3zYkg9V}z%wx4S5 zZ|T*fLWD2Je@Q4*i%ROXn#;%IM`9M&M1$6!gG*A6|{~L2JFkHva^Tch*q~ zy7?c5w4q@9{=qww@bf2m66c|I+#kfn^{bCTS0g*H(s^ zOjwd<_d1>4j=MDUqPKv5k9g*PtF0{xh&q>wS<)L?cr=VZ92giloAe!BP){>@9k6sv zLS=~9{VNm+0{1QH{=XI1YA!w5p}AEcQg116p^2WJRMT3`Pi_EV7s)DK0X_GvrMhiy zPa$gZD%H3oSrfZ&MgYa>eaPyh-=V_lNS+i?n>_yY2YNf4?G0tnM`KW?dH?ah&4EUn z8X_k;ektSTQ1NHF*j0gCY_(@yG9DKF8(^G5RfUtpS7pd%L%th;^3)B5!cIR(=w<5)-}oMOwr*U>f^yek zBn?XA$!c<+gGhPj{j=r|PtrfTm4Oi^hl~`Pg&GCn{-xEY4WYVo@~gKWT-ra2Y;FiR zhh{_MvyY&%y8l;MR)E3{%(0VxAGJQ6)qZGNFi47ujRwPBAI;M*3g^5h2XLmj2=aM# z4&a|Cv1E`D8u0tf;L@O-%HAD@&gAsunY}2GsecIBuO;i#F9iy{WBAuZUXPbS#@uGtfzIWnk@FHf(vk`tMl z10_1)0mLdvB3^oXuhGZ)P4ud1r>%?Ce5>yBaV@mW%Eh$Yo;6gD*fi!W31r@c;$9WK zXx1A#xWsu04-=L2_4j6ee)`ZM@l-L=87}3@VG2PM{^I{v0q0mC2z|dSv3-Wi<(NCJ zaCJH%=GIJ}ln3W)!yIF@*Px2hnW>||?MCj47KJVNg_y0{+=6Z^9fb#T%2aOnhyhd; zy}W6eDmk4Y{~39i${E~zC~%6WySe3r#Pd;SM0ex<8Fx@mWG73032p=KkNn9D*UOIW zC&+@ew=~K7iFcz&F_a`e9iMk*5L(C<s!Fd#a5bC zb#ag+(!TswII)^ZuuG%vHFlE%`1v?gz_WlKEt2`A(Tx6UU+5u z=4uubd1>rtglxU}!YXFUK}xy9RaB_wkn**TpguBqavC^Xy`s)b&efT87HVGRE`+o~ z0o4~@7ugrZV_gLn6xKeS`D%NT@RLeE1@S9FFQ z*~s%rUd>z5sSN6GFM~L3g+_8LWLiLRObI66G6sXr@qKkU;tw5UYv5Tj;L0GE5}B@G|Cj#X zF3yL_l(u0k8n{^{Ma71DN#?_v{~-bnk)cD-y-FrN{<`;afYF_%pMla&hp~|ZFx)?cYW!{0}4%kS#gN{5^%l=0viWq{Fl{!&ynKHE?YKdFLvyPPO9bAp-XlXzJn=Cu=XflE2@H46{ZS;{1 zCD8;_>8zYH${hb^{L*bDTk0arNd*Evtj=(jfat|dfx^WGSsM27?BT%PU;s~vY2*BCl@&GVG_=aO$`U`HCmNYIgRMl3bvlDvQpl?ROp4YJ_+2c&;p;! zes-Lq-+$x9O#oGmE4D`|Ab6ck&h3ow?! zFdxsEo2PC3TI(1;CbZlbojZ8e7T~W=kUe2Sz|FzR;n=$55Ywz>Z71d#w7KZCQR@XcRvf?nvqv@6sU10e)3&FjaaOe=&C3yyq)J%8z@i!N*S9v- z9qD$DPR?l6{BEu~Cc>@Ya=~1)xDu5$uZbp}r!roRy*ilFo`l&jY(ydmfZ1gCx3GFC z;#E#|qC|<1d}IIg_NbglOauG^BKLQ_Rpfa!<8J%Y)jHCT=?>q(xzm~5Q(qbB9){bM z(h@_r13A5Q8f>?f?G?iQn(n)_>GQ~LKjBth-CrHyF$z>lz8(-2)wSNrtXm7d$}c;d z0uNP2J3M7??#=pszgX=4b8_W`pEpd>QLZWG;9;5n=+8fP{Qc8^cBB_g;YYE0+eCua zmh;_#zx*m64lX#L160a+pAtllj$yS2mKnFoGrk$`^_B?jN52)m7p$>+R}4xoNlBr< zS&uQukXs>rq*ne~&Gq+)R)RHE6EVP`Q!G}s`NJE%kF{YLoiTL{wU%XRkLIb8^jwY| zXL{hC=4!3JS2VPKR9;A^$hzV6XUew`rJbz3r!x4X_NJKV>v-WFqLQt!0seU7D72SI zORzBKvhEw-wjJHNVAhOvDo1e#w0hkG7z5c4Hl72?9(9j3ZhuJn2~X{?_wm~dv%W4F zDrt|{KAkBw$k>q%i>pbqESio@i2T6!LgmJ2;@2|&1)>{g3 zJtwPDrikeq#hZ|xxhFm^3zi)b#d;k!iX*y4woiU`{UTm(t^Dz0r(Vb0$;#6?`48fg zryTFCgM=^CM#&XDfr~9V%(RYP1)>^ND!-S9K<#9oiu*Yie-517X84_?FFD<~bkmT- zbbdQ1ebUk{qW8{`nb`gGkD5P=f9Q4b9L+2g7Tm*()g(K4{pnB9j}J#}`=Tqoe1M(h{yK|ujw!HtL8oB*(B=x z&>*~9onqbB{i;m7*{8u;%>l)2xJvCdYYW8SKg%sz&6RJf>?<}^PC0SP;$<9jx=*hD zz$PAy!RnH{){@C^Ccwy-dl{80BD`F?dQ0md2gI@meBQFv7LKx}Dp9cxbe zSyl)Lt9xfeELjr^C8gNU)Uao7oHvb0==)1GI^;B~&%XRZ$Oqm>RA}$$tPPxd0#FAR zZPN@pXY45Z&}m?qp+ey+DpnS#IZzFP(}uI;hQekdwLWMjN3PY1)na_58{_qJG zqk%wQcH=;IXZOPGR_GuVz^%YaLN=Cpx=KL<$ z3*7n%#WmGUQn`1DsQ~FTN=dNBV0(fam!B1t&Vp}QfjA3x$QF~w zuCRK{5i7mB_2KdS&M(~vi`|>Qqz)!JyN{>jFrGu^V+X!hAX^(R94rUAe(`6qP+yzI z9x6$eG6l4;_72MLlvG%UW7XwjqL%&y*F^#Q-{F*#TOmid#*BSIctBpcSu$_cO&T;5 zYXBb2;*?zBVj_A^+FB{ma-yGx zeB>7|l=BCd?8(a4-LmZ=>|aHx3ruLLrZA~Q#ABPWRR_&mtfT`BXCm}3ojy3WO`oS12ept9Yao{WrRh1KvB|EGH& z57H2&;&9nP)d%SgOZ5TiP8lzP_s76}hBRhTLV;E93L;~{fl>KN&5~(Gb9*<$?2vyR z|5aN*MuL;qq%{-~>@;pQ-XFh&7}~NDcy%0dP~GI^H}Li+)b2U|o*o~KYH)cBPjG%rSeY+633Fwz@d#{fI-p88+Q zE6v=Wq);~EDgy;`232WVhcZp9#ljGWpB6p|9)uk_{i%t;`IiTcIzNffcY}BffPPjc ziKWzh^7vKGQ0SBfMNF}jSx#)?&(=Q=%~Lb#`%0$OY>@OZFCC;_YVG~KRIx1oQgM8@ z-7wt=aSJ0PYAxpDpM3jLAinAc|5!vt`K9R1hN`M72(M2sUg4AymKt0M&mQ(f4M~Xn zQ%fy{O=R%c_z<~E&Cv-~vHJtR&aV%P;a+h@x`{B<3AZJSaq+uZHxc^&E(m4L4c`B& z*eH6%zT8$=12-+IexDib?&Gy6^m@r5> zfb!LtqesPb+dNOsZB^$-erTja-1Xx0X9Ijc1@GU>XI83X=iLl&S|DwP|MY+ApSX%@ zhkKM$Qy;oo zJO2qU2%}jUotT6(Ytfx-FH&b6)%m;3vj*{8(U;wG_MgcOeR7;P0RqnrV4xQ1+Avt8Y?hIPus-R5x+`{rC0Xf=co&o4O|%v;x}5e z=y6*8Z9zpkGSQGS8@bzVu2YZCYvcAeP^X=81wt=wc~{zHG@vvEjxTuEK9c-iCId&& z&Ut3L>m|21=?->`?}$}bWICt!!gU{58jC#QjH(VTNz&vgu(<*=G#OY9@9oruA+FrEhT({(E zAEo)&d#}_V*FOHdAi?}}WyFs*!8Js;o6!P<3Ms2U8 z+J{wJ2Js@-Cqseed>i0Cv@&?VtT>IJ#AI>vRsGN07p+CJVmyyFLogJc+f|{bEcbgL zWtrhR3;UQ#J1-GM(cKI?ZSFS3Cc*ZAAJCt-qtxtpycYQC~(lwO=;$v;h^-kt~X!F6v^qrED1d zxF+kJzcfGX2P*$AhO&Z=O8x2+C+o#=iYhkJ&x(Ohy$A{(1uMtvc|1hj55 z)nTQlCF8mON(86AgWPLo+AmJz%7&S-MO8}tGx7AsqQZrLl?3mZpgMXR(+NdA$|1?H zNZ(aUxuae#QC@zWgpToPqLiK|S_t-GX`xMqA4m#l0qxjpq5Po*ioMH!Waq+J){;RH zB=(8R%ryQva@E$efAx+RL@HIEN?AEfV56sXE}lC-VQaLx51x`w5+}f8J~@pQAE)ts zgAYBU^3E-mT$5*D&WcgoZR47FSCKX6Bg+bUDRQrxoAx0^%g=cOy#?+uwMb!4QaTU^ppCkaX z`b4?K{SQa8kK3B)gciRe*92eW__ySU>+&D|e%lu?m9&dFR!sBieP*FZl*1CN(d{P| zeLAYir!k!i)>SLf$ChHSGVgd7Z`$gIeAV{E(k7|B%XTWZHg9=tiy}YW@EwOW1y!{0 z(MmtPW86T{v$rCU97CIf>m^6$>RfBbI_i2qdmK({63+kJ8&>9JzFZpp!~SY_s5_5$ zYhnRn=iL)U4>2*U0eBPVWno|%)jD~q8ib`OA#qsE3y61MYb>S`SfsCDsj?rl%F^p$!xXa$=H$J3W zR`Vp`P3B?qf_Z(-j5W^XurIk2^7=AhLiK}x#tk1LC4yXAaQd3N{q@7A_$_aduVcek zMOY}if2oP`-`$4(4(4giyE)kz{xmpxrANSN^mNZHMpW;Y>(iV?JNa6K=d+6`r-y@h z39Nu@X=Mr5O8TKAqxyNq@7qcNoEtq$8ArPI{Jln}opqZ;WyJTp4vPx=hb2qw3#|xF zQ4D5#=GM!OMq3yuFJ}KZjikV`ec{3bD(`(+BgjrQjMM24UvAJ#VN|vQZ$8k-|4e7T z*wM)=n}7|;HK^tMiiL6Fv+xA|zNxCZ_X)RA4Q66ir>y>wUyDsoB^I1WSM5}KdT%*F z)*tPR5EiDe5_KhUTFx~^Z`VypBzR)iv-z4j>>W#SAIp3ae>=RD5sry2(>0y3?Cbf< zr|(F+ii3IyCP}c-9vD> zjsZPnA-n^HO9`#sF33s_6K$eqBwx07X`y5x^9?9rg%Q>qx7 z=1w?%F^Auw=2mLn z^7*LtcuFtZ8Z6OJY5YuezW0KodmVzQgGIBB)!(=(zB+d!=8p_b4yl;^$9mxr*Oh`{ zcc=#8w+fc#8wT-GdVfWQGXHS>{+1%@cpbx_7yK(M`1?zjkNS(+#H%GDUY&xcQ?0QS z*Hw2gZQLqeIorz9UG-Nw-ez#Yj{}8|w=qf4p>1NbKUaNgW1b#}pG*~6qwlqXDs6s- zRZ828G||>nnEPI!)%&%ztuZna_(MR$eEAtyd-W8mGIWN;C0*rPNT9$reokA|Bh$@7 z(rz~;c(ktMSMZqZZn=Do1MA4UQKqWYo_O#ZbEWgna*nx}Y+m1ILnf-W5X_f5T<-G} zN#Nwp39q#8!{q;Z1&a=L!dBu`yI<_|Z|g|M ze^X9eX~rH6OOTvQMeu&iZsVZ}k06kHxi}2JwAbMBx+l}(m**;a+RA6oYj0$W!yO&+ zm$}hJ@L=d3Yttwp_lmQt`nUV zIUPA#TxIV1wCi!eTdsMZ*3C+Ll~er4!Ma&kr^U9VOQ1!wN}!FINx;d41kVz4)1&%D zj4MnskjmkLkBE_F?h;T~0P9MNUf5kosc z?L-Ex2GF!}dP{`VDK>(~1H9tsqH7~*#?5}n-@zCkq4MSlFOQkh#!ygAsZ-x|%hZ&I zZ)Q-OEK$xF2A;Uz4+?D)C(E(}zQ9ARU8H#Dma1n3gU%c8akNUu2{oYxm_;v_N*=Qu zDQ8;Wz|$yruYVRd?sF7zZRxi%jgRrpLGdmuP~J$0H29Wu~$#j+_0)9*9ybW(BU+t}AxzN$1W z3LcN=A=dF6t*O^X+Je*f9h70b`C-#l<%j5H`i~-{lMRo#nbVG-g`e{AWo{l1kGQcH zI5mxW>}>+hO*zJAU@CqIvOLD8Y%>I<{Fr|=uKe6Bhey8EE{$r7^{`%P9EWY>LsSjY zhm39u{bdNB=)R0*G000Ez5fw{Uyd_LL}^iu9=))*`y5R8Hkp_tB2_+Fwn07kDG%v{KpR zD=zxS(39Bnz4M5DiPc0zo@#9QU-?C;iz2&L>*hl{2l6MUVfAr3CD}~KopyKBmL$?%<(0eRHlCK<@SyiCl}FBVkwrONe~#52TYZ|^BACjJ zhX(H-F^AM8Bz@=9z#ZEkR^>7QIn%-7N9D%3o&`T3m|w2%p0cHWx*I4vxHP{02H|mG z9{l2_zR8-n*&7;HErlV$aNT0DJJK`w9fgJpy5*`DZNdXH19u8tr`-t&h9{F+sdq*; zgV{&F;v_hCs*d4f#lHm*>{nGO!FJHQ?4KVMPf(8YB|Fy-CXP2TDMxwNW4e%7i&t5a{LWWdwkg?zk3UEiJHcoDh->_ zD!*)4l(8Om;4CWs!Gh`eE5Qy|B6XmA2jy;tcNi#l=afBIHv&H?W%zHnX$Jdt6x#jR zCcrmSr2g8k>5;1AD>tz8|JjhfxOBG{vslsB@4DwjdU!k!UkMwP-O%~9*~{C!idA23 zH;}e1I**xG{aN9u_;*INH6rm&2=$iX$N8n(xeb}dhYwb?y}c7YE!=LX?7Von^?I`N zx~b#R<(b?SU*spq4~dZ$v{9;I?9q+YMA7Sobd(}W(T5-RS0@c%Zof5rz;&z&_ zt-H4|_=0%UWc&mclLk2!tVCsQT{`j9bNJ1V;Pc3T274POc^G&rc7OhJX+C~1x-na% z?xoDoE+%QzqXG3u;4Aj@y18w-=5U2)irlVh9RHE+YpX-HgB#Aqq?65E&2M*fKVL*p z6K)O2|8@Myn8@%jMyd6&q?p~hsre7$wN=@d4Z{`Jrx*~m!lz=sqBG!qG}Xm^xoFDl znb#}92-e{A>ATZHZD#XMe=yhiET1+-xi$@k%c(9AoqMi|jND_GN^QEaLyyggdpmkO zC@;#py&W}ZF6~2kf58JoWF^fwUt3$tW{zjG!2ejLz!klVyx+<)>Dzi&J z!O3F7shAe|-1S38xA}14!ue!d_b39ebmC~ytRN|=}##@#ijt&u* zynFGr!UKtXq;x8!Aq``Hi|nv-dttUMY^0ge^8q8<%&kMWW2n%g+ms?r-)nzOd6u>X zpW8c7u{&^Oz9IzCe@6{{o&v>5tY+p2RuwJ=*Tg1zbh{;B9uzLYc=SmMuBCOh1wPr< z3*z2hmyaE-m6)aiu5&ehqH)Vd1qlVNr+j-ui##o?mc8mQd{-&{d*U(oUfH=9ZH3CO zm!X+3=<}21&&*IeXQPds_3jChZ|$-5&I6c0bJXoHIb+gCi{;KBtCgjapPY4a=SUTa zgIN{1mveG#$|ob{U!$T3HJ_&A!K3c`ycCzbn~%)aUsVa-7F_7@XY;Rf|K0KGiLqs| zO*#WGf>LG$?>G~W01Fe}>mWeMIlqgHq^jL{JlqRbKVQz7D2kD70tGzhX~(Vymz58C ze2$8pQYyU91z_zK#ON>CTOWDT9_j0RzF2_B|J!_+Xq}_Nub*upH{;h<17}z3d18Q9 zp3Kc?5HAe7Ti#+!FK>Z@mTdSEe5+>VjNiGVIzvulo91S_?-anIHiAq&GO5tDtWeWD zmRbDU5x<)79Yp?}VDl3Hp|9}(3S&N;|LW(91pnv*S>%(1;C&)09;mZ{zs_DIG#q0r ziAQc+38*@%O@FSHN*|uG-20-~>adwNJZ~7L|MoQpLZf$QyJJ?tYYl6f2TEoM)rdYL z;8CiDoH%$&Snvq?9OTbX^Y?|+{+1ooBd+1=rfo3Zxe1d6UWvq(m}gb2q-yCwY*B`n6-4%bENTR>&M}*%h@nXd!6a74#eQW#~gn#&dR; zGhgD8Y3r=hc?!j^nh*LBjEq$=7R`6KnF*g);#Qxz;g2Mq2m&O^OWxpak(B7kzE^fC zDWe#tn4bo9-Lo9l)*7p704z+`e&JHWuS;0KRD0ByEk+t}zcO;r6NDv19wHy1^q9<1_f_z2f6&gGFz#ZX-(5 zL)=?(vZTpakzhJm-+I)?di%x+LGdtH1Zc^Ymgjvl%zUKfO)nXRJ^dIBmvNmioi9$3 z6fs%*dX@c=TCuB@^b@`BD=I9R{?%_P8#9d-t4mD%+jLeE2uxK7*yzzm;`a_38GrnW zuVtu^N!$KKmv_IvEENC;=~3~Hyhmk{H>}g*cJQC*jpWOWP9F3gq2i^WC}V-We8&MD zfxR(ChZ!e`w5TLo$xYN+I9sz+seiNbO!vIa>WQh9@1@7?Xe z>nB$jDdLT8kp$Nnlxw9Ah(cb&Ix2miC6*uwgKy5;J(bbb4QS&F1kd#F=|9b zuVNjK*%nrFt?I;q^!_a=MFH5wD26?={FEc!)K8|xHT1NjV&co$Fri#z3LSFEVCNgY za@O&LVC6_rmCaI@A+T+Asdkjc7nM)7=~#eJxT7=D+N}KN&Bp7Ke~J^S(CiOH-$%`f z?R#VqaS{RV3d4MFz&Ln>nq&<|yG2+`EoNKj%8FpCk2C=*;*OZktrHQ-sN7wH3<>#a zE)fJ?0zR^vTF>2U#j1?9$1xfUk1P8wzpd}*KCGK6Q*{R>Fm-q-ZjyZP0;_qeFK#l78{ zg_p;=%3EGNlgB1i$N1<3%+Mp9WL+7GtvgzCj5${b?N$T=qQN$jt?E(s$TWhy837|EU&= zqnfYjpBzi_%qw%*h}Vk75!8>Goe5JPJcc{$*mMgSkk2l(_vJ0Zk)=MI#G3vaj3plB zSBuj3v!~ibXYp5$?C!^JT&pkhKtFYzIIW$RsxZFR>KkzL9Aqn8VuR&av&c*B%7KSj z3F$-vbPVSgFK-|_KtGdM?O&z5C&#y>Kx@Lm=%4RF(xBSfo?*oQi3z`vESYAab7?GD z?X|;*-zGjhCxH(@z(!2KAYuQmzST2uv8~a0(o=qr)M85;mRj@j$mUixf*QDvk(l_| z(Pi9LxN9W*nhl*Z@=oH*n)|#28{kF zZ~t;+CsHjTrNkm{!{vXEcv@3Kr7M1))U5g!9W9dKsWZ!`!th6eRu0@#EM0{MbrZEL zDRK`DKWV{5=@E3eVK8@^#p?+7A?sX;h6bFm|wRw)t3j4UPZt zsS5FgzWQ}`WNY4z>4(A?x?{QPx;DSl-+Y%m&bMyMzK+lOME&Oq_1+Wtuu4P65!XVJ z4tV<(-4M#TcMs34=g=&Bcn|*qzK&%X`kks($+nW-AgcY;#&^r;gp97<^rrfACawrE}LLhF7GRB$G@D zTsN~guk`x%P-9fUcP@|5L+?7Vjb*f42QP+oXVREBZc``U;o3VFbu%($Q=pYPZ}4ut z(BCKE#n}tSGy>3BzuOOlHIw4bGb7RwB<0P3%8;Zum;hn{Bc0zL@)XA-V{)2KQ}s8T z2buUKFrB9>#dq>sYhlFDzK{~$9epo_#YZpG1d4MRu1olqikt(TC21jdV13Co*sCG-z0eYu~0cf%eE#c_O}Ezw6R44b|C-5DNT!z8I-ZRMx7ye%LA zYvnu1wyw(S=2FhI$&QSgW0rO)O_98#D&RN3nKl1o`y$e1c81XA;qmLUqP&jK2`BM4 zUIKS7IPH_)(;azY$@F(uyELYr)$HED{cHXP8P;g&me-232)*m#$>PD7L+O23fI%t1 zU6%x^A8)EYvi|Fdk;m+K8JA6i-H`B&?xQo>KFegUQul-=n-}}Cfmx3Tby(y+gJ!*DBG_j0* zHoxP}PRt}oJs*!OgV=Ef|3a{H#keyQtmQv8i4e8M7!J&==S>EJ6Nssy$Dft@j^>{R zG;|?2I>&+H)z7e2>WA4eieJh{&Cw$b@;({%;Qev|7s(ol)ty_{O=dC{C&%>EJT#U8 zsnmh_)9gB0;NkHjkr0R;-T*duqQ*T{*MweblIkK6E}gfBs4|OMcGWC8U%*Me=|*cKTabRY@Thf^Nc?EKA7GHU*~$%V)*eD;z!NzO_xKu@t*;N_2ZKE2M_DdO^{o85 z%%}_5>X|+0Jvj1vT?whv&Jp((zvUn@6Mc!;3e-hD-U{L*%D$JWAmB9&ft!5)w^bYahP2&he*Ja@{PcK?}xyucgqJ_u%w?~e+ka$lGt-%6NQ8WUQl z0flKqy7)mn4sN{xUxFNbu`=FOUahM18b3BlhloAc<8n(RP?Q9RPQ0qDb3WJ1|Hd{7 z-#NeW4OGjFjsp#_vxD%w6XI(?4FyZ_vKsTG}4uq#VK|-$@L!(*i{%~sl?Z$JPxr@+N{H3EdIPJt2Wdp&H3Q`NpV=38h znbLtzpz2K0y*I%J4+tlzH1_-r=Yl(9AfP-{5Y8zylMn5&rvB$%5L-fpDpi|Y58eh0 zh@y8}Tz1r;tKCni4b!b@`_qT^sk0^x`UfS%TTYWUjq|=T?FPkzkx0RV`P{o$^9jKpVI@{h*ct?>%k3qqa~jBz;1opdP%y56`-#TnUC7 zwEZ3sp|_SAh}(RPnSVN!vxH}Kz2bJFkgCK$kt3kBlSZbF6vnCVYR`J1)F{jzdO}h* z8?Ax(zemvd*LLH}x0m2Ag#Ud0F?OFiOp4Dd;=M}G2-;fOUb?U5I~zdSKtRxrck$pIY3fdPHkn5!A&cYXbWL0Hf=P%_4#4@g za3YM^BV+bYL(Apadn4#@T*Zl5$b;pk-o9)ADA~~hyg!1kb>!P$d>fk0-cQ&oK*YTj z&aucZ0j{S65cN6Ly*UgYEMs?0Dn)|RnwbEcPzDu{M2CD%bo&#Fo!9o33_kta11S5D zbm=(q7j1Y{8T zQ2kmb0dn5$Jf$k%8*Badp7LQOS#0ugl?W#ADLU~`=?!?nZ_hOcx}xQ6JEo3QJefn0VPSHyOs%ztGZ$dpza}qGj4O+#z@>qu$fzE@d(!! z<%<(D%7Tck_zz?KDNKZ8WuoWY4}PciUu-y^`dG};or@PF2JE14zLi!;(S6O3mi_jp z7pKfiG(s+3#s9LGF-CM`j0jm{p+eUmGE>N^Z*LC1+cn6O2rVsq$HkwX=TMg`*S<9F z9my+9syt3zVMWtMlYXEM z=5$C1>}MAx__~zsFmi9y*+GAVt6`!w=up|Y{Mz&-yMrr;O)*x0{@rH1b=6WCT8JNy zZ!Xr^Z_k_eB`Jeh%zC{&E3X`zmw1>%NU5sZdwf3gck@i(<1{Ay_|?vZ6@}HquYWWp z4Ti&n1VPgsC`^1rO4z^8Gn{n3tIF5P*pwUAIu_JLWjzg8t=R1Z z>x^eIZzhN2S3H0&MfaDc5wPyS0_>9HO$hj~Q39{ICpOW~($#}&sWB*>_D*vhm_n+K|Pc%Q~Pod5~rOv(I7o5DKR8xS!=lv>p5hmXkg+IyK;zIopT21>l#?%!t zn@;@WfMMwV+}P~BY4^bZp?v#2?e$WHH?^_s7dppRY)(Cfg(I6)8JFfFLT%^~kO_l1 zm1c(IJ333Pkt{#%1B|geLYEC4)gO#h6sX2kzC8M3g25ilJio6J*YG82UO2c-M*v;q z!yTI5j+3+(pw0_e)2JhA8>9198{W<|HlQ9Tjv8(iHnOQji11?qAwwt^Fi1GMEiU>>WZRAN zx(v7@oP=)mM(+@+CnmJyf)hnmaSid<6f(4&ebE~IniAcgJhe&~buNs2@e^|wCH2?6 z;^i8Meku4qNtLf4EK4x|zX& z>lqWsn~}RJVxe{>;FrsL*|T_1cJ?PN6&q(Q8fl!7$347=F%>N$%dUOzFrdoIyMQ^2 zkGN_#l4=@qzDLn`&lRS^f?q=y#g#c2dBokg8$P*9!n)F zph>~Qgox)7%8h$uPIP*#+8>@%h}m4Tie^Gh=9mmbOC5L=StfP0Ru&eW?6d=R9!IFS zfVzh{xgt0n^g~LtetlFs*0&fbT>erqje+?5&affV{$=Eo*I*uW@}_?=^tC~*T=zj_ zMJg)dsVrI%+{RjP4jHzjaB3BVI>|!qP-gA3UIIe7d6)kJ%)W0~=}LN9f6(Iwm>!H0 zyuYj|Z*ZkqXyr)-ajlgP!`7?U37%<8Wx6r}REJhdRzll>!93EyweDTYb zzuiBFhSO$pR2NN+9Q~hmzVolC?fE+NCZHmqvVX5=8+4feX?M9WK&KkPbD0$;MO zrT8Xi51!PFnB<|~7=L(R=r9Wn9lm7DoO@Z(n1!6Fd;KWIS4;|zlR9@Byru#&D+llo zooLRk5lvO2raOXkGDctiP^!Ui-DTngOy1=be6*%d=aj4Pm|!Xm0!oPAd6G5l?Fr9u z5%qa(o^;KhkI(HsEr?}tFDzoJ>+*jFaNJ&>VMr(2gHNiI&juw<3^6^)w>>2YP_yZ3 z^f);@eJnw+pT;eY{Z_8awfysd(VjpxZ`LSDrQ?!9Dj7!EU#5ZXZ~*JDW5uNXXo@l| zB$Bxy5)jk2+Du70C$-H!g9w2_Q0S+ek-j#~0#*-)_dlno^8%0+AP3F!?LVf{b*yEH zNQQoj0$r4pc`OMB!>lyw2dw^CLjG%F;IrAzKi{3&~={7~t# z#w2Ps_Qlx%K_I=7(}{Jm{FRH{s$F9EYBBSyXhgnG&dpV0+~qD+feuKGA7mJYDhN5_ z36A~pw3D8!*CyF*{+@R1PU`#%w7Vb=(dx*PXNoQ&x&F5zUL#JZbf8@iw!Xs4_{lzX6OI44UZ{7Cp=xq&j08LTSJeIUEcHpu`MNAf7PVhMRP< zh6~{$YJClwVCnaHt1Z^U?VTFAE7sMAG#xoWV?fvI<4oCwcV00Q6ZbHw^%1RC0VxT) ztYdVqov_FR&gC4WA+-M6x5L!0+AIi#7=ph6VXhIn*v|wSa^T+$T18>6G`u=g;ZA%B zx~S)Lu{pbn%XN%Qon;}C?OZMj`O|&O=GZKZXJg|LZ@%SHBtjorIjP<_9co1P+%r(5 zuIf1^mgC2)6TOXM*wofR2eG3fZ3F?ax1K+414#@nnV2Z_QaOa|`F&UHMC5!Xka(8a z2wNDG$)>WhRXAAkEQwVPYNx`H2uR}a$)7Q6dW#w+e>N#;6ktx848?s)%yd8jEecQ# z;x|vnlLFf_u0RduAm_jJsJC*Ij#`dAbVBt2CYPr3R)y%za1l#Pq%7L+F?VhIdVwv6 zh~1!?TtJ_qC|>(I2&#mu%c-hK3au|hf^CX=KScun`Oc~-nlw6A9by%WRuo~eX!|}i zAGx}a=NoPTnyQkfpH-xv4Z6rrPr2{G(1@*TG~w;EG!EH>D|mL50dfxI2E$~?NDlaI zbgdzf-WtoiYAC6p6bn`Ay{m_ib8*W1Xz>r$-zziB$0)(4FvUt(UKEn}@I`R%wi$t@ z()Z=_16GGu&nKW6D4pMG`<@}Pg` z`W1zr^Na`v;y zp7;ZKV;iGJVakZbZc@X=R>F2V$srv&LQtP(g(;G75{gO``R<9>kdOYYujpX z_|)7=4m8m*Jm*1e@3(#{FyUPZm^)GU$*xs6I+bUeM&=J`WMF|NDU8By7YWWCMRy|h?V1FWwma{;%CfyU_LpC zv*I46Xxl)^!;BUAw9canDMoKoliRPJ8dT?B=Fv*n8j`)0Bd`(gT^%M{s>q=|syUs? zT%;`xG2tQ@PRv}1#OL}Y_&Hj#hA)k%s~#q5>XO{t)5*R4RT~kCw5&2_Q)$$peV%bZ&;D&YDwV7`jRn_@@n@BlTF_xcsNIozRWiUGUG4Mz zL5V{v!F$($e{_h`8=ElXa{6HX2H69u|b=u&^Y5!+EYeFVw!GXvqrG~w0jBKn@^a&Yx&c|Mh! zju(!;tPvBDyIOo2z)TenBw)D`7{&gmZ6zFFsFV%V>ik1rfPmpTpwqqqtS78l&O0|D zp+!sB;5axA3Jtfxns1g=(SA%OYJz>0p7&V04=oY^XZyZTYP1|`1g{#4aCVSWgQ>CR zlc@l{B>gsxLAsH>#?Mi0Ht{eBx`@%dY@t(zOCAHaW z-KkOu09$(oY=GD0YTK{CXF(kcLgDeIdtZW!i!V4N+FSIsqb<_HXGb9{p3($qBM^Dl z0NlH!17Mp_(8!v4MK1OjmX8ZJudT>kG2%FRow6jjSTUHq0$t5rMKRy8AalT;0dt@#-t7a>RZw`E6ZTse1&$m2x%!VxE4uK~`E-rB4y zriwldzqSd_8(CCu1c+qBwR1aXw3RHnzD?kJ6BAC*{pHx-Q*6CVQM4Rx2L<#*I zm4|+EKW8#?w-|SL(UDw2mhBl?p_^618aJ~{ssKTg>g{VUsi^4YJJ#NyT|_^leisX# z@pR6}Tin#(5H+0K_OW!cLnmG1f5smAv{5Jc=!aTZG#U#a!VH}>VVgS1~HO9A~QEW!F=<2NGAi%y)VY%l{Ja+Pi}T8Rk9{ryJT%(W>DJ#wh=~M&-=*j+p}heZnolY6N>;U6C#8UAUGy_i zj_(=1$u-bo)Cdo-OYX^=N_p%7N(D0|$e-bWbL5fASYtYl(5ET=?A$Hn4V7~zCTk^m zqkf#RPqMfe)n58lnlPyVP|@w(UW2tE&D>(h?@{A~G^(RgHu|6!4JMK8fc)^p^6TG( z%lGe%Z|P7VUGIC|mycP4F~vYXP31^;k;};y-Be(I-`Pk8B6m9~@FbgHJ8o4xZZaRs6JSKIJqEYZx_fA^Gvq zx~{>bbnW0hg&BEIHd>y1PS%zd)7{jJWx?+WdRl)Doq0&B8-v>qzV9LLyx+VJz|vVl zdpaTf{v29x9FApadbt-acznD$K)~xA!qBe{vQHOvhw`z<4}Z43roP9Uh;V%A8gT#X z+lL4F&@GgQV%p)DDMvP~6G~>Aj8W0h3bq-pdz1-oimmNvK@I&@6b$XIDoeX-*(TNr z-J`YSa``N^E$PekU>29AP0Ku2k{9cBPBsS=G5k?l1R5oHN?enki)tK2~|3lj>; z4IYPdomdUd?Krkkw{Ab%Neg|kz+xN3TI}!-2Czr;?2dE&-EACz*E}AGps3%7Ej(!Y z$lR24nX@WM1Uuh&6T_vAge7~IS1RZf7G=fkRdzh0PVAiDdLk=k8k&<}ZQt^#B+Pz( ziBw{cJMGnQ=`GyFO68Nd&VWc6F4LntZ7I;8^E4B^(r}y+$9A8zjtTsWqSKp0>k6sp|Z@t^EETG2fmOCv}l zIKsDUR8Y|?!Vq87TBeBe$wEu=^BHDwSw|xxlF#I5MiWe9@dg`7lU@5-BmKc~X$g?* z;;L{^O&r^tNp?Xg%dOZUZ)H9gQhDfh-qC^#2E5WV$;5Jvr8##d+F5dCK~*aAE99() zSO0nzkqUFHj;4ACw?kJ)JJ7`5b$og4MMrBLP{U<9N(Ezc?qFZy`bB4z>Tb_9^T}_EjrblVzN;G-fM_?|<6oHe>O!5n( zR6(%j%~4&{nVUJS?j~&5!2=T|IZh-+FZAHIE7Y1Qsku+d+xE_$2YGlz(7H-Yx%m~4 z)jLoCFk~>;X&)*3>{k5ASO7K)P9hb(ovWj{qv1+N(2|MPr89fQaLQ=r!<>^w) zMGxrG{aBNs*7;Jn4tqGp+$EDVka;14toqd>d*kmgNj4MAibD?{O+yiPRj`JXW9Z*OR;{Khi zr{*&vZGpXPzrSf#@%3F0=iW0P|6cz$YMp9nHqVqg_*3fffPcfQD&Yc8LN!tFB#Aaw zVo19JMcmw@3R}G0a~uDze)ofJ4ICMKU4qB!Be5{i^z&uw2cW5Tbjh^OL-dHy+br|( zw}=rD1e`5IP_|(1#dSCPK-YjKj7#!ylk$9`)|8IasXPGedU@CK?o1%&zQydsVEC9k z7)T9Ek@DC1lj@S*gA!u}jJ;Vy65_0ez@s$+iNRVtPm;_MpkUk&Od@shsITB^u}6mD ziN8=d0XnO=BswqA{#De@Dxe&@JMGVXe}g3u{1tg)^5q)2oWX$yQm!`G7TP6UqbT-E}#og-!s3=MN~KwM+S*gK~L>?OSe;bw1er$08Pn; z?@qzIqLG(dYxm6cY!oe($<-Ss1ZRHr3Zf@gG~3N_HWHCL+J0onTE_OF%?`f*a@88L zH~5OLT13)Dl|Zcn`npcP<$XxDLG31Vj+3Rr*SeD$*!NHAA@Sie721%EFa@DWVt}fU zGxtCR+;BDH)LXHqmD9&L`WPLBzY%LXxIwR2nHGLNB$Yqs_lg53?c4tu#Dv3klh&>2 zK>~4UzBtk%mx~uzpFcnWpAa&Wdu)a+{Oe0#Y!#Rv^xRQtc4NRLQb&~Bn-D(Z^X<#G z-SV@0sR+0bcXV_D+sbYbZ*zVloA#|>!R1m4b8*gL!mE^mL+Y#wDBboziKb|Sh?blc zTi8B{4t2W0NTZ~^Bd+b-vZZ?ks<8{avsJ;;1_4_sUebv@D{XZAA)5)*rg|mn9P>>tgtVH3 zS@^ZRl8LA&1&VY5=F^yb7eFw$w;gHw>vE%XZlfP|!y=JSaIv*Mmu_3zyhAnV+dF-Z z<*xa??%wDtm1eN@T$;pV=vEo5B4m+}%3(a2KOSe4sQeoR9O@@+o4f?i+ zGSe1wp1bpd8WJAZZ0iVJd6OcN8gv79SDTDkocx3U-{IQ=q^M;W@%gRPvquFx3(6}k z2Z}|Hz7eDq#+Zwg&U`iwFcqu(%?@DjBMW?b<>y&tZ#3?}&y4;-QNeQyc^}D?UW29swLKbnQ5F zPl2OIqQ)Rqf=8nw3&+m#yCK(`vQzhu8B!%Lf;SbInDvJr;pupYv&8}H@?roxQy}jW}%>(drC*ga`AfU|C1 zj&5H3RMV3gHhO*_(Nj?*dQ*DJ3d~`A{1&j}%FzO!(XqFz?ZZm0Q9OGE^L%hk!u;UD z?f7eF^PUu(47gyP)k^t%zSqz9d2Po)OCq6qp)5T^&p8=YHJ>eX@5WXpj9eX)v$R6W zVJNw_aG(SThIOQ5aAU@~>ehF?7IP?!hAKc9vqUzN28?Jc+-LesD5S$&t7a+4~5#t zUbpNw9P$qG1z$#xZkFA;t1r;8+aj=Amez)D_~M@r#GvBtP5l z8;C6w3J1G?PqZkgU@Owr-pg1hKbvV8Xh=hrR`hO<28o5^h$)k&Z$3LuchOFvZzN)mY@=SNBQR&E6XS5~4P`R5m zwEK_ptbM&A5(^p;H62ehlj?<5WSYNG(fTTe3AAo+-MXXNcp<1NVJXVv#zO4{Msj%N za#k4MIzWezl=y9n@dsKjpXMC{3K;i<+z7O0g3w;He?rCbq*(Lrcsn}e>5%Vb5VRS7 zdi0zR0e>z!eYr>5>0EO`HW%YWYMkv9B%9mhioRNqmf1*zVpxBdji}e9!!dm`w+Oq1 z&W}FR+4lSuZv33?sP~YtR=e&G+3m0@6FRed?Dw~x%Sid{Z4Rck9Stiimcru+Qk9Wb z(U$8=JR}kAf?cds zzjMwT5iRdfpU%Egf1Xic!#GvNd37eSaIBG(GLo_CF9^EX)zqvjS@7Ha)fWB81^OhC z^Aj-dg+FYe`s@FkjG+B}WwUzA`Go!v$lbgS3C1eZ_AR61t^28oLtH_Z#Dycq1=q6u z3~YiS9-bE%b2}flAdUxo_ph3=$!W2M+$QrQmR7G~E$Q?gUL1+B48Ya#3^)H?u?HWS z7yq4g#zyTC z`1*}OTg36M=F)I<)Cj0uAj&p1dSNn3X}xnEY4dsM&!#ob(!zpa80871=97%B-ih-8 zvl&_|>;1Qr+EC4@u^|JPiq6m7&^?BI&&;#63~f)%Lhb-ti1&2wGPz7p=+%sUU7!B2 z-VDj|(PG05ytX1dp&CqJ&TC!{lsI#v7s`k)uc`1FuC*>6Dl0p51piNVECrB|d-9;X7cyTJ>nU87FZ*jf4Q!OS?7O7BJAPOi>48EJX)HywWp$%rwn~90 zeP)vX60G@ZMQ2@tPh(CMp8L7nU%aC>C&h#4^`>S=jn&HN`S4pgLG-DobPDZ1!;SJwwVGpaVOhRaFP&}zZ}m7= zS`slpS;)FWIU4{G&UEPT7$i>+5s%^Aqoge26=8zLU30zcwT!(RH?N3zt?!OM`89Ma@bCw{{Ye01`+ifoaJl5f=j(hp2~r3bXo zW&|5qeA|}%%eZChXCsDrJnGnHA~JxMv&r(Pm$s4q2RZkgEIji86KYAa(J~iOh?mF-&-@ z0CeC~U6`jVF(fj$Gvbf#I?KGX&49Y)4~AFPBSVl#`33$+=-#LUyNuo?b}AD2CWlmF z7U)a9AdqKPVVB@CzqWCf*}wmp?;;U)+{6)~73UoTEGW;Ht`C}Q4tjhU&fkIEMF=Ha zb9Ni)I5{{#6Dw*ZHL%7CNP~BScAG;T=%f9U{`)RNF==SOE{>z#`?*mHGI={-!kGK9;K(I1k9CkZhw*IdT4s0jGhX)j&#GAq_hR;_>nX7&G z1kB#_+aB`qh8GJO_y7Z$HAgv0u13zR*HnS=KQ(yEjJ`5$ zkH2_qZ*8>=$A=I$NOMhVOk5sbD-+n7$wYCb7~cBr430HoMleUWhMiEHT zA4^T2eA~u#cyzG2MVx+VIPDFa{o+b2>F=G<(t8ZD0J*2@OHTV#1pF&(n$AW)OFxeq zM{~xD?fk27nXUz7MtSt9DSiKncZMzk8RUEF^nogLFL*AXp13cCVn_We&1l9z=XL+Z z+5K_KAA2wB{4VN0Xq(Xr?SF!pHtLMcQJ2(aw}~X$th`|}O@1$f3@!-y-@|w5yuu=z zN6+v7s{`813H(|>Z8o8;W6-R+`ap4=H2JR-C&&ws5^dQ^Z3c+6+fL>M>l-97%JCJ{ zMBD%LMK?7-7B!-bn=f$g75(RfgmzBiFec;wQ;`R@z|`&nBZl9>l#z-oGbIxawvVkj zg8p5FjTQYYJEtw>*?xemkaaukjGiX{_VV^pMvwyP1hrB^z_17W`^#AXsN?J!ZndB0 zJl(Gk3Az09Ux)plwB>&v|9Rj)5B%qW|2*)Y2mbTGe;)YH1OLByAk^;&ewDQ { + logger.apiReq(req) + + const successCode = constants.HTTP_CODE_SUCCESS + const errorCodes = [ + { + code: constants.HTTP_CODE_UNAUTHORIZED, + errors: [Errors.AuthenticationError] + }, + { + code: constants.HTTP_CODE_NOT_FOUND, + errors: [Errors.NotFoundError] + } + ] + + await keycloak.protect(['SRE', 'Developer', 'Viewer'])(req, res, async () => { + const listMicroserviceByPubTagEndPoint = ResponseDecorator.handleErrors(MicroservicesController.listMicroserviceByPubTagEndPoint, + successCode, errorCodes) + const responseObject = await listMicroserviceByPubTagEndPoint(req) + const user = req.kauth.grant.access_token.content.preferred_username + res + .status(responseObject.code) + .send(responseObject.body) + + logger.apiRes({ req: req, user: user, res: responseObject }) + }) + } + }, + { + method: 'get', + path: '/api/v3/microservices/sub/:tag', + middleware: async (req, res) => { + logger.apiReq(req) + + const successCode = constants.HTTP_CODE_SUCCESS + const errorCodes = [ + { + code: constants.HTTP_CODE_UNAUTHORIZED, + errors: [Errors.AuthenticationError] + }, + { + code: constants.HTTP_CODE_NOT_FOUND, + errors: [Errors.NotFoundError] + } + ] + + await keycloak.protect(['SRE', 'Developer', 'Viewer'])(req, res, async () => { + const listMicroserviceBySubTagEndPoint = ResponseDecorator.handleErrors(MicroservicesController.listMicroserviceBySubTagEndPoint, + successCode, errorCodes) + const responseObject = await listMicroserviceBySubTagEndPoint(req) + const user = req.kauth.grant.access_token.content.preferred_username + res + .status(responseObject.code) + .send(responseObject.body) + + logger.apiRes({ req: req, user: user, res: responseObject }) + }) + } + }, { method: 'patch', path: '/api/v3/microservices/:uuid', diff --git a/src/schemas/iofog.js b/src/schemas/iofog.js index 5cda9e7fb..80ad9004f 100644 --- a/src/schemas/iofog.js +++ b/src/schemas/iofog.js @@ -20,6 +20,7 @@ const iofogCreate = { 'latitude': { 'type': 'number', 'minimum': -90, 'maximum': 90 }, 'longitude': { 'type': 'number', 'minimum': -180, 'maximum': 180 }, 'description': { 'type': 'string' }, + 'networkInterface': { 'type': 'string' }, 'dockerUrl': { 'type': 'string' }, 'diskLimit': { 'type': 'integer', 'minimum': 0 }, 'diskDirectory': { 'type': 'string' }, @@ -43,6 +44,13 @@ const iofogCreate = { 'messagingPort': { 'type': 'integer', 'minimum': 1, 'maximum': 65535 }, 'interRouterPort': { 'type': 'integer', 'minimum': 1, 'maximum': 65535 }, 'edgeRouterPort': { 'type': 'integer', 'minimum': 1, 'maximum': 65535 }, + 'requireSsl': { 'type': 'string' }, + 'sslProfile': { 'type': 'string' }, + 'saslMechanisms': { 'type': 'string' }, + 'authenticatePeer': { 'type': 'string' }, + 'caCert': { 'type': 'string' }, + 'tlsCert': { 'type': 'string' }, + 'tlsKey': { 'type': 'string' }, 'host': { 'type': 'string' }, 'tags': { 'type': 'array', @@ -82,6 +90,7 @@ const iofogUpdate = { 'latitude': { 'type': 'number', 'minimum': -90, 'maximum': 90 }, 'longitude': { 'type': 'number', 'minimum': -180, 'maximum': 180 }, 'description': { 'type': 'string' }, + 'networkInterface': { 'type': 'string' }, 'dockerUrl': { 'type': 'string' }, 'diskLimit': { 'type': 'integer', 'minimum': 0 }, 'diskDirectory': { 'type': 'string' }, @@ -105,6 +114,13 @@ const iofogUpdate = { 'messagingPort': { 'type': 'integer', 'minimum': 1, 'maximum': 65535 }, 'interRouterPort': { 'type': 'integer', 'minimum': 1, 'maximum': 65535 }, 'edgeRouterPort': { 'type': 'integer', 'minimum': 1, 'maximum': 65535 }, + 'requireSsl': { 'type': 'string' }, + 'sslProfile': { 'type': 'string' }, + 'saslMechanisms': { 'type': 'string' }, + 'authenticatePeer': { 'type': 'string' }, + 'caCert': { 'type': 'string' }, + 'tlsCert': { 'type': 'string' }, + 'tlsKey': { 'type': 'string' }, 'host': { 'type': 'string' }, 'upstreamRouters': { 'type': 'array', @@ -239,6 +255,13 @@ const defaultRouterCreate = { 'messagingPort': { 'type': 'integer', 'minimum': 1, 'maximum': 65535 }, 'interRouterPort': { 'type': 'integer', 'minimum': 1, 'maximum': 65535 }, 'edgeRouterPort': { 'type': 'integer', 'minimum': 1, 'maximum': 65535 }, + 'requireSsl': { 'type': 'string' }, + 'sslProfile': { 'type': 'string' }, + 'saslMechanisms': { 'type': 'string' }, + 'authenticatePeer': { 'type': 'string' }, + 'caCert': { 'type': 'string' }, + 'tlsCert': { 'type': 'string' }, + 'tlsKey': { 'type': 'string' }, 'host': { 'type': 'string' } }, 'required': ['host'], diff --git a/src/schemas/microservice.js b/src/schemas/microservice.js index 23b07f2f5..92fde6ea1 100644 --- a/src/schemas/microservice.js +++ b/src/schemas/microservice.js @@ -55,7 +55,15 @@ const microserviceCreate = { 'items': { 'type': 'string' } }, 'runAsUser': { 'type': 'string' }, 'platform': { 'type': 'string' }, - 'runtime': { 'type': 'string' } + 'runtime': { 'type': 'string' }, + 'pubTags': { + 'type': 'array', + 'items': { 'type': 'string' } + }, + 'subTags': { + 'type': 'array', + 'items': { 'type': 'string' } + } }, 'required': ['name'], 'additionalProperties': true @@ -102,7 +110,15 @@ const microserviceUpdate = { 'items': { 'type': 'string' } }, 'runAsUser': { 'type': 'string' }, 'platform': { 'type': 'string' }, - 'runtime': { 'type': 'string' } + 'runtime': { 'type': 'string' }, + 'pubTags': { + 'type': 'array', + 'items': { 'type': 'string' } + }, + 'subTags': { + 'type': 'array', + 'items': { 'type': 'string' } + } }, 'additionalProperties': true } @@ -146,9 +162,8 @@ const ports = { 'properties': { 'internal': { 'type': 'integer' }, 'external': { 'type': 'integer' }, - 'public': { '$ref': '/publicPort' }, - 'proxy': { type: 'boolean' }, - 'protocol': { 'enum': ['tcp', 'udp'] } + 'protocol': { 'enum': ['tcp', 'udp'] }, + 'public': { '$ref': '/publicPort' } }, 'required': ['internal', 'external'], 'additionalProperties': true diff --git a/src/services/iofog-service.js b/src/services/iofog-service.js index c2505bf0f..1255c82d0 100644 --- a/src/services/iofog-service.js +++ b/src/services/iofog-service.js @@ -48,6 +48,7 @@ async function createFogEndPoint (fogData, isCLI, transaction) { longitude: fogData.longitude, gpsMode: fogData.latitude || fogData.longitude ? 'manual' : undefined, description: fogData.description, + networkInterface: fogData.networkInterface, dockerUrl: fogData.dockerUrl, diskLimit: fogData.diskLimit, diskDirectory: fogData.diskDirectory, @@ -159,6 +160,7 @@ async function updateFogEndPoint (fogData, isCLI, transaction) { longitude: fogData.longitude, gpsMode: fogData.latitude || fogData.longitude ? 'manual' : undefined, description: fogData.description, + networkInterface: fogData.networkInterface, dockerUrl: fogData.dockerUrl, diskLimit: fogData.diskLimit, diskDirectory: fogData.diskDirectory, @@ -211,6 +213,13 @@ async function updateFogEndPoint (fogData, isCLI, transaction) { const messagingPort = fogData.messagingPort || (router ? router.messagingPort : null) const interRouterPort = fogData.interRouterPort || (router ? router.interRouterPort : null) const edgeRouterPort = fogData.edgeRouterPort || (router ? router.edgeRouterPort : null) + const requireSsl = fogData.requireSsl || (router ? router.requireSsl : null) + const sslProfile = fogData.sslProfile || (router ? router.sslProfile : null) + const saslMechanisms = fogData.saslMechanisms || (router ? router.saslMechanisms : null) + const authenticatePeer = fogData.authenticatePeer || (router ? router.authenticatePeer : null) + const caCert = fogData.caCert || (router ? router.caCert : null) + const tlsCert = fogData.tlsCert || (router ? router.tlsCert : null) + const tlsKey = fogData.tlsKey || (router ? router.tlsKey : null) let networkRouter // const isSystem = updateFogData.isSystem === undefined ? oldFog.isSystem : updateFogData.isSystem @@ -237,7 +246,7 @@ async function updateFogEndPoint (fogData, isCLI, transaction) { } else { // Update existing router networkRouter = await RouterService.updateRouter(router, { - messagingPort, interRouterPort, edgeRouterPort, isEdge: routerMode === 'edge', host + messagingPort, interRouterPort, edgeRouterPort, isEdge: routerMode === 'edge', host, requireSsl, sslProfile, saslMechanisms, authenticatePeer, caCert, tlsCert, tlsKey }, upstreamRouters) await ChangeTrackingService.update(fogData.uuid, ChangeTrackingService.events.routerChanged, transaction) } diff --git a/src/services/microservice-ports/default.js b/src/services/microservice-ports/default.js index a80eca2d0..d5c233782 100644 --- a/src/services/microservice-ports/default.js +++ b/src/services/microservice-ports/default.js @@ -84,7 +84,7 @@ async function validatePortMapping (agent, mapping, availablePublicPortsByHost, } let host if (mapping.public.router && mapping.public.router.host && mapping.public.router.host !== DEFAULT_ROUTER_NAME) { - host = await FogManager.findOne({ uuid: mapping.public.host }, transaction) + host = await FogManager.findOne({ uuid: mapping.public.router.host }, transaction) if (!host) { throw new Errors.ValidationError(AppHelper.formatMessage(ErrorMessages.INVALID_ROUTER_HOST, mapping.public.host)) } @@ -168,12 +168,23 @@ async function validatePublicPortAppHostTemplate (extraHost, templateArgs, msvc, } const ports = await MicroservicePortManager.findAllPublicPorts({ microserviceUuid: msvc.uuid }, transaction) + for (const port of ports) { if (port.publicPort.publicPort === +(templateArgs[4])) { - const fog = await FogManager.findOne({ uuid: port.publicPort.hostId }, transaction) - extraHost.publicPort = port.publicPort.publicPort - extraHost.targetFogUuid = fog.uuid - extraHost.value = fog.host || fog.ipAddress + if (port.publicPort.hostId) { + const fog = await FogManager.findOne({ uuid: port.publicPort.hostId }, transaction) + extraHost.publicPort = port.publicPort.publicPort + extraHost.targetFogUuid = fog.uuid + extraHost.value = fog.host || fog.ipAddress + } else { + extraHost.publicPort = port.publicPort.publicPort + extraHost.targetFogUuid = null + extraHost.value = lget( + await ConfigManager.findOne({ key: DEFAULT_PROXY_HOST }, transaction), + 'value', + 'undefined-proxy-host' + ) + } return extraHost } } diff --git a/src/services/microservices-service.js b/src/services/microservices-service.js index c919d2770..a0bc47fad 100644 --- a/src/services/microservices-service.js +++ b/src/services/microservices-service.js @@ -37,6 +37,35 @@ const MicroserviceExtraHostManager = require('../data/managers/microservice-extr const { VOLUME_MAPPING_DEFAULT } = require('../helpers/constants') const constants = require('../helpers/constants') const isEqual = require('lodash/isEqual') +const TagsManager = require('../data/managers/tags-manager') + +async function _setPubTags (microserviceModel, tagsArray, transaction) { + if (tagsArray) { + let tags = [] + for (const tag of tagsArray) { + let tagModel = await TagsManager.findOne({ value: tag }, transaction) + if (!tagModel) { + tagModel = await TagsManager.create({ value: tag }, transaction) + } + tags.push(tagModel) + } + await microserviceModel.setPubTags(tags) + } +} + +async function _setSubTags (microserviceModel, tagsArray, transaction) { + if (tagsArray) { + let tags = [] + for (const tag of tagsArray) { + let tagModel = await TagsManager.findOne({ value: tag }, transaction) + if (!tagModel) { + tagModel = await TagsManager.create({ value: tag }, transaction) + } + tags.push(tagModel) + } + await microserviceModel.setSubTags(tags) + } +} async function listMicroservicesEndPoint (opt, isCLI, transaction) { // API retro compatibility @@ -296,6 +325,37 @@ async function createMicroserviceEndPoint (microserviceData, isCLI, transaction) await _createVolumeMappings(microservice, microserviceData.volumeMappings, transaction) } + if (microserviceData.pubTags) { + await _setPubTags(microservice, microserviceData.pubTags, transaction) + } + + if (microserviceData.subTags) { + await _setSubTags(microservice, microserviceData.subTags, transaction) + const fogsNeedUpdate = new Set() + for (const tag of microserviceData.subTags) { + try { + const where = { + delete: false, + '$pubTags.value$': tag + } + // Get fog nodes with microservices for the given pubTag + const response = await MicroserviceManager.findAllExcludeFields(where, transaction, { attributes: ['iofogUuid'] }) + if (response.length > 0) { + response.forEach(ms => ms.iofogUuid && fogsNeedUpdate.add(ms.iofogUuid)) + } + } catch (error) { + console.error(`[ERROR] Checking fog nodes list for pubTag "${tag.value}":`, error.message) + } + } + for (const fog of fogsNeedUpdate) { + try { + await ChangeTrackingService.update(fog, ChangeTrackingService.events.microserviceFull, transaction) + } catch (error) { + console.error(`[ERROR] Updating change tracking for fog "${fog.value}":`, error.message) + } + } + } + if (microserviceData.iofogUuid) { await _updateChangeTracking(false, microserviceData.iofogUuid, transaction) } @@ -739,6 +799,38 @@ async function updateMicroserviceEndPoint (microserviceUuid, microserviceData, i await MicroservicePortService.movePublicPortsToNewFog(updatedMicroservice, transaction) } + // Update tags + if (microserviceData.pubTags) { + await _setPubTags(microservice, microserviceData.pubTags, transaction) + } + + if (microserviceData.subTags) { + await _setSubTags(microservice, microserviceData.subTags, transaction) + const fogsNeedUpdate = new Set() + for (const tag of microserviceData.subTags) { + try { + const where = { + delete: false, + '$pubTags.value$': tag + } + // Get fog nodes with microservices for the given pubTag + const response = await MicroserviceManager.findAllExcludeFields(where, transaction, { attributes: ['iofogUuid'] }) + if (response.length > 0) { + response.forEach(ms => ms.iofogUuid && fogsNeedUpdate.add(ms.iofogUuid)) + } + } catch (error) { + console.error(`[ERROR] Checking fog nodes list for pubTag "${tag.value}":`, error.message) + } + } + for (const fog of fogsNeedUpdate) { + try { + await ChangeTrackingService.update(fog, ChangeTrackingService.events.microserviceFull, transaction) + } catch (error) { + console.error(`[ERROR] Updating change tracking for fog "${fog.value}":`, error.message) + } + } + } + if (needStatusReset) { const microserviceStatus = { status: MicroserviceStates.QUEUED, @@ -958,15 +1050,66 @@ async function listPortMappingsEndPoint (microserviceUuid, isCLI, transaction) { } async function getReceiverMicroservices (microservice, transaction) { + // 1. Get existing routes (app-level routing) const routes = await RoutingManager.findAll({ sourceMicroserviceUuid: microservice.uuid }, transaction) - return routes.map(route => route.destMicroserviceUuid) + let receiverMicroservices = routes.map(route => route.destMicroserviceUuid) + + // 2. Check if the microservice has pubTags and fetch microservices associated with those tags + if (microservice.pubTags) { + for (const tag of microservice.pubTags) { + try { + const where = { + delete: false, + '$subTags.value$': tag.value + } + // Get microservices for the given pubTag + const response = await MicroserviceManager.findAllExcludeFields(where, transaction, { attributes: ['uuid'] }) + if (response.length > 0) { + const tagMicroservices = response.map(ms => ms.uuid) + // Add the microservices' UUIDs to the receiver list (filtering duplicates and removing the current microservice's UUID) + receiverMicroservices = [ + ...new Set([ + ...receiverMicroservices, + ...tagMicroservices.filter(uuid => uuid !== microservice.uuid) // Remove the current microservice's UUID + ]) + ] + } + } catch (error) { + console.error(`[ERROR] Checking microservices for pubTag "${tag.value}":`, error.message) + } + } + } + return receiverMicroservices } async function isMicroserviceConsumer (microservice, transaction) { + // Step 1: App-level routing check const routes = await RoutingManager.findAll({ destMicroserviceUuid: microservice.uuid }, transaction) - return Boolean(routes.length) + if (routes.length > 0) { + return true + } + + // Step 2: Subtag-based routing check + if (microservice.subTags) { + for (const tag of microservice.subTags) { + try { + const where = { + delete: false, + '$pubTags.value$': tag.value + } + const result = await MicroserviceManager.findAllExcludeFields(where, transaction, { attributes: ['uuid'] }) + + if (result.length > 0) { + return true + } + } catch (error) { + console.error(`[ERROR] Checking microservices for subTag "${tag.value}":`, error.message) + } + } + } + return false } async function createVolumeMappingEndPoint (microserviceUuid, volumeMappingData, isCLI, transaction) { @@ -1391,14 +1534,15 @@ async function _buildGetMicroserviceResponse (microservice, transaction) { const extraHosts = await MicroserviceExtraHostManager.findAll({ microserviceUuid: microserviceUuid }, transaction) const images = await CatalogItemImageManager.findAll({ microserviceUuid: microserviceUuid }, transaction) const volumeMappings = await VolumeMappingManager.findAll({ microserviceUuid: microserviceUuid }, transaction) - const routes = await RoutingManager.findAll({ sourceMicroserviceUuid: microserviceUuid }, transaction) + const routes = await getReceiverMicroservices(microservice, transaction) const env = await MicroserviceEnvManager.findAllExcludeFields({ microserviceUuid: microserviceUuid }, transaction) const cmd = await MicroserviceArgManager.findAllExcludeFields({ microserviceUuid: microserviceUuid }, transaction) const arg = cmd.map((it) => it.cmd) const cdiDevices = await MicroserviceCdiDevManager.findAllExcludeFields({ microserviceUuid: microserviceUuid }, transaction) const cdiDevs = cdiDevices.map((it) => it.cdiDevices) + const pubTags = microservice.pubTags ? microservice.pubTags.map(t => t.value) : [] + const subTags = microservice.subTags ? microservice.subTags.map(t => t.value) : [] const status = await MicroserviceStatusManager.findAllExcludeFields({ microserviceUuid: microserviceUuid }, transaction) - // build microservice response const res = Object.assign({}, microservice) res.ports = [] @@ -1408,7 +1552,7 @@ async function _buildGetMicroserviceResponse (microservice, transaction) { res.ports.push(mapping) } res.volumeMappings = volumeMappings.map((vm) => vm.dataValues) - res.routes = routes.map((r) => r.destMicroserviceUuid) + res.routes = routes res.env = env res.cmd = arg res.cdiDevices = cdiDevs @@ -1417,6 +1561,8 @@ async function _buildGetMicroserviceResponse (microservice, transaction) { if (status && status.length) { res.status = status[0] } + res.pubTags = pubTags + res.subTags = subTags res.logSize *= 1 @@ -1432,6 +1578,40 @@ function listAllPublicPortsEndPoint (transaction) { return MicroservicePortService.listAllPublicPorts(transaction) } +async function listMicroserviceByPubTagEndPoint (pubTag, transaction) { + const where = { + delete: false, + '$pubTags.value$': pubTag + } + + const microservices = await MicroserviceManager.findAllExcludeFields(where, transaction) + + const res = await Promise.all(microservices.map(async (microservice) => { + return _buildGetMicroserviceResponse(microservice.dataValues, transaction) + })) + + return { + microservices: res + } +} + +async function listMicroserviceBySubTagEndPoint (subTag, transaction) { + const where = { + delete: false, + '$subTags.value$': subTag + } + + const microservices = await MicroserviceManager.findAllExcludeFields(where, transaction) + + const res = await Promise.all(microservices.map(async (microservice) => { + return _buildGetMicroserviceResponse(microservice.dataValues, transaction) + })) + + return { + microservices: res + } +} + module.exports = { createMicroserviceEndPoint: TransactionDecorator.generateTransaction(createMicroserviceEndPoint), createPortMappingEndPoint: TransactionDecorator.generateTransaction(createPortMappingEndPoint), @@ -1457,5 +1637,7 @@ module.exports = { updateMicroserviceEndPoint: TransactionDecorator.generateTransaction(updateMicroserviceEndPoint), updateSystemMicroserviceEndPoint: TransactionDecorator.generateTransaction(updateSystemMicroserviceEndPoint), buildGetMicroserviceResponse: _buildGetMicroserviceResponse, - updateChangeTracking: _updateChangeTracking + updateChangeTracking: _updateChangeTracking, + listMicroserviceByPubTagEndPoint: TransactionDecorator.generateTransaction(listMicroserviceByPubTagEndPoint), + listMicroserviceBySubTagEndPoint: TransactionDecorator.generateTransaction(listMicroserviceBySubTagEndPoint) } diff --git a/src/services/router-service.js b/src/services/router-service.js index 162fb71d5..fb5626787 100644 --- a/src/services/router-service.js +++ b/src/services/router-service.js @@ -65,16 +65,23 @@ async function createRouterForFog (fogData, uuid, upstreamRouters, transaction) edgeRouterPort: !isEdge ? fogData.edgeRouterPort : null, interRouterPort: !isEdge ? fogData.interRouterPort : null, isDefault: isDefault, + requireSsl: fogData.requireSsl, + sslProfile: fogData.sslProfile, + saslMechanisms: fogData.saslMechanisms, + authenticatePeer: fogData.authenticatePeer, + caCert: fogData.caCert, + tlsCert: fogData.tlsCert, + tlsKey: fogData.tlsKey, iofogUuid: uuid } const router = await RouterManager.create(routerData, transaction) - const microserviceConfig = _getRouterMicroserviceConfig(isEdge, uuid, messagingPort, router.interRouterPort, router.edgeRouterPort) + const microserviceConfig = _getRouterMicroserviceConfig(isEdge, uuid, messagingPort, router.interRouterPort, router.edgeRouterPort, router.saslMechanisms, router.authenticatePeer, router.sslProfile, router.requireSsl, router.caCert, router.tlsCert, router.tlsKey) for (const upstreamRouter of upstreamRouters) { await RouterConnectionManager.create({ sourceRouter: router.id, destRouter: upstreamRouter.id }, transaction) - microserviceConfig.connectors = (microserviceConfig.connectors || []).concat(_getRouterConnectorConfig(isEdge, upstreamRouter)) + microserviceConfig.connectors = (microserviceConfig.connectors || []).concat(_getRouterConnectorConfig(isEdge, upstreamRouter, router.sslProfile, router.saslMechanisms)) } const routerMicroservice = await _createRouterMicroservice(isEdge, uuid, microserviceConfig, transaction) @@ -160,12 +167,12 @@ async function updateConfig (routerID, transaction) { if (!router) { throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.INVALID_ROUTER, routerID)) } - const microserviceConfig = _getRouterMicroserviceConfig(router.isEdge, router.iofogUuid, router.messagingPort, router.interRouterPort, router.edgeRouterPort) + const microserviceConfig = _getRouterMicroserviceConfig(router.isEdge, router.iofogUuid, router.messagingPort, router.interRouterPort, router.edgeRouterPort, router.saslMechanisms, router.authenticatePeer, router.sslProfile, router.requireSsl, router.caCert, router.tlsCert, router.tlsKey) const upstreamRoutersConnections = await RouterConnectionManager.findAllWithRouters({ sourceRouter: router.id }, transaction) for (const upstreamRouterConnection of upstreamRoutersConnections) { - microserviceConfig.connectors = (microserviceConfig.connectors || []).concat(_getRouterConnectorConfig(router.isEdge, upstreamRouterConnection.dest)) + microserviceConfig.connectors = (microserviceConfig.connectors || []).concat(_getRouterConnectorConfig(router.isEdge, upstreamRouterConnection.dest, router.sslProfile, router.saslMechanisms)) } const routerCatalog = await CatalogService.getRouterCatalogItem(transaction) const routerMicroservice = await MicroserviceManager.findOne({ @@ -245,16 +252,26 @@ async function _createRouterMicroservice (isEdge, uuid, microserviceConfig, tran return routerMicroservice } -function _getRouterConnectorConfig (isEdge, dest) { - return { +function _getRouterConnectorConfig (isEdge, dest, sslProfile, saslMechanisms) { + const config = { name: dest.iofogUuid || Constants.DEFAULT_ROUTER_NAME, - role: (isEdge ? 'edge' : 'inter-router'), + role: isEdge ? 'edge' : 'inter-router', host: dest.host, - port: (isEdge ? dest.edgeRouterPort : dest.interRouterPort) + port: isEdge ? dest.edgeRouterPort : dest.interRouterPort + } + + if (sslProfile) { + config.sslProfile = sslProfile } + + if (saslMechanisms) { + config.saslMechanisms = saslMechanisms + } + + return config } -function _getRouterMicroserviceConfig (isEdge, uuid, messagingPort, interRouterPort, edgeRouterPort) { +function _getRouterMicroserviceConfig (isEdge, uuid, messagingPort, interRouterPort, edgeRouterPort, saslMechanisms, authenticatePeer, sslProfile, requireSsl, caCert, tlsCert, tlsKey) { const microserviceConfig = { mode: isEdge ? 'edge' : 'interior', id: uuid, @@ -267,17 +284,37 @@ function _getRouterMicroserviceConfig (isEdge, uuid, messagingPort, interRouterP ] } + // Conditionally add sslProfiles + if (sslProfile && tlsCert && tlsKey) { + microserviceConfig.sslProfiles = [ + { + name: sslProfile, + tlsCert: tlsCert, + tlsKey: tlsKey, + ...(caCert && { caCert }) // Add caCert if provided + } + ] + } + if (!isEdge) { microserviceConfig.listeners.push( { role: 'inter-router', host: '0.0.0.0', - port: interRouterPort + port: interRouterPort, + ...(saslMechanisms && { saslMechanisms }), // Add saslMechanisms if provided + ...(authenticatePeer && { authenticatePeer }), // Add authenticatePeer if provided + ...(sslProfile && { sslProfile }), // Add sslProfile if provided + ...(requireSsl && { requireSsl }) // Add requireSsl if provided }, { role: 'edge', host: '0.0.0.0', - port: edgeRouterPort + port: edgeRouterPort, + ...(saslMechanisms && { saslMechanisms }), // Add saslMechanisms if provided + ...(authenticatePeer && { authenticatePeer }), // Add authenticatePeer if provided + ...(sslProfile && { sslProfile }), // Add sslProfile if provided + ...(requireSsl && { requireSsl }) // Add requireSsl if provided } ) } diff --git a/src/services/yaml-parser-service.js b/src/services/yaml-parser-service.js index 5e1dfbf48..d8fb7ca22 100644 --- a/src/services/yaml-parser-service.js +++ b/src/services/yaml-parser-service.js @@ -93,6 +93,9 @@ const parseMicroserviceYAML = async (microservice) => { env: (lget(microservice, 'container.env', [])).map(e => ({ key: e.key.toString(), value: e.value.toString() })), images, extraHosts: lget(microservice, 'container.extraHosts', []), + ...microservice.msRoutes, + pubTags: lget(microservice, 'msRoutes.pubTags', []), + subTags: lget(microservice, 'msRoutes.subTags', []), application: microservice.application } _deleteUndefinedFields(microserviceData) From 1ae53c74c2990b1af4ffe1c2e4a7c752db692bc8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emirhan=20Durmu=C5=9F?= Date: Thu, 6 Mar 2025 18:23:43 +0300 Subject: [PATCH 146/178] added rebild option for router updateconfig --- docs/swagger.yaml | 2 +- package-lock.json | 26 +++++++++++++------------- package.json | 6 +++--- src/services/router-service.js | 1 + 4 files changed, 18 insertions(+), 17 deletions(-) diff --git a/docs/swagger.yaml b/docs/swagger.yaml index a39a8195e..5c8e9b11f 100755 --- a/docs/swagger.yaml +++ b/docs/swagger.yaml @@ -1,6 +1,6 @@ openapi : "3.0.0" info: - version: 3.4.9 + version: 3.4.10 title: Datasance PoT Controller paths: /status: diff --git a/package-lock.json b/package-lock.json index 0c5f9d408..ed86c5e11 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,16 +1,16 @@ { "name": "@datasance/iofogcontroller", - "version": "3.4.9", + "version": "3.4.10", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@datasance/iofogcontroller", - "version": "3.4.9", + "version": "3.4.10", "hasInstallScript": true, "license": "EPL-2.0", "dependencies": { - "@datasance/ecn-viewer": "0.4.1", + "@datasance/ecn-viewer": "0.4.2", "axios": "1.7.4", "body-parser": "^1.20.3", "child_process": "1.0.2", @@ -31,7 +31,7 @@ "is-elevated": "3.0.0", "js-yaml": "4.1.0", "jsonschema": "1.4.1", - "keycloak-connect": "^26.0.5", + "keycloak-connect": "^26.1.1", "minimatch": "10.0.1", "moment": "2.30.1", "moment-timezone": "0.5.45", @@ -556,9 +556,9 @@ } }, "node_modules/@datasance/ecn-viewer": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@datasance/ecn-viewer/-/ecn-viewer-0.4.1.tgz", - "integrity": "sha512-RTcAH8/5dJNdOriw1D8WragMscqus2kpHgiPb9Bh/QgmBwdkv6/ZElyFIIKAYctcKmWLggrKpuX4sik+iZLo2g==" + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@datasance/ecn-viewer/-/ecn-viewer-0.4.2.tgz", + "integrity": "sha512-+xyDmmw4q/pfzzCdz+u0c2sGaGGPj62M8u8JKE0luRNiILqmADRtVSsMCzal4sLmILgD3nkeaUeVTw+EzQcwyw==" }, "node_modules/@eslint-community/eslint-utils": { "version": "4.4.0", @@ -3517,9 +3517,9 @@ "dev": true }, "node_modules/elliptic": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.6.0.tgz", - "integrity": "sha512-dpwoQcLc/2WLQvJvLRHKZ+f9FgOdjnq11rurqwekGQygGPsYSK29OMMD2WalatiqQ+XGFDglTNixpPfI+lpaAA==", + "version": "6.6.1", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.6.1.tgz", + "integrity": "sha512-RaddvvMatK2LJHqFJ+YA4WysVN5Ita9E35botqIYspQ4TkRAlCicdzKOjlyv/1Za5RyTNn7di//eEV0uTAfe3g==", "dependencies": { "bn.js": "^4.11.9", "brorand": "^1.1.0", @@ -6991,9 +6991,9 @@ } }, "node_modules/keycloak-connect": { - "version": "26.0.5", - "resolved": "https://registry.npmjs.org/keycloak-connect/-/keycloak-connect-26.0.5.tgz", - "integrity": "sha512-CvPjSL+dqQg6jFgXuYO3v13SjxxNGwo1+s5I2gFfxf7Vh6krz3nHtihH+str2kfP7TqeZgXtqWq2AbWw6HWkLg==", + "version": "26.1.1", + "resolved": "https://registry.npmjs.org/keycloak-connect/-/keycloak-connect-26.1.1.tgz", + "integrity": "sha512-2wvNJXldB9Em+mp6liJ+AnftcJovFEvNhUgv3hblNDmVihBoBqn4zFlwLIN41lo0H8CicB2T86xZ5U2MiQ9FFA==", "dependencies": { "jwk-to-pem": "^2.0.0" }, diff --git a/package.json b/package.json index 3f3804162..b8e80899e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@datasance/iofogcontroller", - "version": "3.4.9", + "version": "3.4.10", "description": "ioFog Controller project for Eclipse IoFog @ iofog.org \\nCopyright (c) 2023 Datasance Teknoloji A.S.", "main": "./src/main.js", "author": "Emirhan Durmus", @@ -55,7 +55,7 @@ "iofog-controller": "src/main.js" }, "dependencies": { - "@datasance/ecn-viewer": "0.4.1", + "@datasance/ecn-viewer": "0.4.2", "axios": "1.7.4", "body-parser": "^1.20.3", "child_process": "1.0.2", @@ -76,7 +76,7 @@ "is-elevated": "3.0.0", "js-yaml": "4.1.0", "jsonschema": "1.4.1", - "keycloak-connect": "^26.0.5", + "keycloak-connect": "^26.1.1", "minimatch": "10.0.1", "moment": "2.30.1", "moment-timezone": "0.5.45", diff --git a/src/services/router-service.js b/src/services/router-service.js index fb5626787..3ccf0bcbd 100644 --- a/src/services/router-service.js +++ b/src/services/router-service.js @@ -196,6 +196,7 @@ async function updateConfig (routerID, transaction) { await MicroserviceManager.update({ uuid: routerMicroservice.uuid }, { rebuild: true }, transaction) await ChangeTrackingService.update(router.iofogUuid, ChangeTrackingService.events.microserviceList, transaction) } else { + await MicroserviceManager.update({ uuid: routerMicroservice.uuid }, { rebuild: true }, transaction) await ChangeTrackingService.update(router.iofogUuid, ChangeTrackingService.events.microserviceConfig, transaction) } } From 9507b15f9a53325596e7517b96bab66c80889a1f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emirhan=20Durmu=C5=9F?= Date: Wed, 9 Apr 2025 18:21:01 +0300 Subject: [PATCH 147/178] microservice container cap add , drop , annotations added, new rebuild endpoint for microservices --- Dockerfile | 2 +- docs/swagger.yaml | 120 +++++++++++- package-lock.json | 183 +++++------------- package.json | 6 +- src/cli/microservice.js | 43 ++++ src/controllers/microservices-controller.js | 12 ++ .../managers/microservice-cap-add-manager.js | 35 ++++ .../managers/microservice-cap-drop-manager.js | 35 ++++ src/data/managers/microservice-manager.js | 56 +++++- src/data/migrations/db_migration_v1.0.2.sql | 20 ++ src/data/models/microservice.js | 24 ++- src/data/models/microserviceCapAdd.js | 31 +++ src/data/models/microserviceCapDrop.js | 31 +++ src/routes/microservices.js | 70 +++++++ src/schemas/microservice.js | 14 ++ src/services/agent-service.js | 5 + src/services/microservices-service.js | 168 +++++++++++++++- src/services/router-service.js | 12 ++ 18 files changed, 718 insertions(+), 149 deletions(-) create mode 100644 src/data/managers/microservice-cap-add-manager.js create mode 100644 src/data/managers/microservice-cap-drop-manager.js create mode 100644 src/data/models/microserviceCapAdd.js create mode 100644 src/data/models/microserviceCapDrop.js diff --git a/Dockerfile b/Dockerfile index 4ac88738f..7e3af9880 100644 --- a/Dockerfile +++ b/Dockerfile @@ -38,7 +38,7 @@ RUN microdnf install -y python3 && \ pip3 install --no-cache --upgrade pip setuptools && \ microdnf install shadow-utils && \ microdnf clean all -RUN microdnf reinstall -y tzdata && microdnf clean all +RUN microdnf install -y tzdata && microdnf clean all RUN microdnf -y remove microdnf RUN useradd --uid 10000 --create-home runner RUN mkdir -p /var/log/iofog-controller && \ diff --git a/docs/swagger.yaml b/docs/swagger.yaml index 5c8e9b11f..c0f0cfc52 100755 --- a/docs/swagger.yaml +++ b/docs/swagger.yaml @@ -1,6 +1,6 @@ openapi : "3.0.0" info: - version: 3.4.10 + version: 3.4.11 title: Datasance PoT Controller paths: /status: @@ -2185,6 +2185,64 @@ paths: description: Not Found "500": description: Internal Server Error + "/microservices/system/{uuid}/rebuild": + patch: + tags: + - Microservices + summary: Rebuilds a system microservice + operationId: rebuildSystemMicroservice + parameters: + - in: path + name: uuid + description: Microservice Uuid + required: true + schema: + type: string + security: + - userToken: [] + responses: + "204": + description: Success + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + "401": + description: Not Authorized + "404": + description: Not Found + "500": + description: Internal Server Error + "/microservices/{uuid}/rebuild": + patch: + tags: + - Microservices + summary: Rebuilds a microservice + operationId: rebuildMicroservice + parameters: + - in: path + name: uuid + description: Microservice Uuid + required: true + schema: + type: string + security: + - userToken: [] + responses: + "204": + description: Success + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + "401": + description: Not Authorized + "404": + description: Not Found + "500": + description: Internal Server Error "/microservices/{uuid}/image-snapshot": post: tags: @@ -3305,6 +3363,8 @@ components: type: string config: type: string + annotations: + type: string catalogItemId: type: integer registryId: @@ -3348,6 +3408,14 @@ components: type: array items: type: string + capAdd: + type: array + items: + type: string + capDrop: + type: array + items: + type: string cmd: type: array items: @@ -3444,6 +3512,8 @@ components: type: string config: type: string + annotations: + type: string catalogItemId: type: integer registryId: @@ -3489,6 +3559,14 @@ components: type: array items: type: string + capAdd: + type: array + items: + type: string + capDrop: + type: array + items: + type: string cmd: type: array items: @@ -4133,6 +4211,8 @@ components: type: string config: type: string + annotations: + type: string rebuild: type: boolean rootHostAccess: @@ -4169,6 +4249,14 @@ components: type: array items: type: string + capAdd: + type: array + items: + type: string + capDrop: + type: array + items: + type: string cmd: type: array items: @@ -4585,6 +4673,8 @@ components: type: string config: type: string + annotations: + type: string rootHostAccess: type: boolean logLimit: @@ -4618,6 +4708,14 @@ components: type: array items: type: string + capAdd: + type: array + items: + type: string + capDrop: + type: array + items: + type: string cmd: type: array items: @@ -4652,6 +4750,8 @@ components: type: string config: type: string + annotations: + type: string catalogItemId: type: integer images: @@ -4690,6 +4790,14 @@ components: type: array items: type: string + capAdd: + type: array + items: + type: string + capDrop: + type: array + items: + type: string cmd: type: array items: @@ -4711,6 +4819,8 @@ components: type: string config: type: string + annotations: + type: string rebuild: type: boolean iofogUuid: @@ -4743,6 +4853,14 @@ components: type: array items: type: string + capAdd: + type: array + items: + type: string + capDrop: + type: array + items: + type: string cmd: type: array items: diff --git a/package-lock.json b/package-lock.json index ed86c5e11..8dcc7705e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,17 +1,17 @@ { "name": "@datasance/iofogcontroller", - "version": "3.4.10", + "version": "3.4.11", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@datasance/iofogcontroller", - "version": "3.4.10", + "version": "3.4.11", "hasInstallScript": true, "license": "EPL-2.0", "dependencies": { - "@datasance/ecn-viewer": "0.4.2", - "axios": "1.7.4", + "@datasance/ecn-viewer": "0.4.3", + "axios": "1.8.4", "body-parser": "^1.20.3", "child_process": "1.0.2", "command-line-args": "5.2.1", @@ -92,12 +92,13 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.24.2", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.2.tgz", - "integrity": "sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==", + "version": "7.26.2", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", + "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", "dev": true, "dependencies": { - "@babel/highlight": "^7.24.2", + "@babel/helper-validator-identifier": "^7.25.9", + "js-tokens": "^4.0.0", "picocolors": "^1.0.0" }, "engines": { @@ -326,18 +327,18 @@ } }, "node_modules/@babel/helper-string-parser": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.1.tgz", - "integrity": "sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", + "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.5.tgz", - "integrity": "sha512-3q93SSKX2TWCG30M2G2kwaKeTYgEUp5Snjuj8qm729SObL6nbtUldAi37qbxkD5gg3xnBio+f9nqpSepGZMvxA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", + "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", "dev": true, "engines": { "node": ">=6.9.0" @@ -353,110 +354,26 @@ } }, "node_modules/@babel/helpers": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.5.tgz", - "integrity": "sha512-CiQmBMMpMQHwM5m01YnrM6imUG1ebgYJ+fAIW4FZe6m4qHTPaRHti+R8cggAwkdz4oXhtO4/K9JWlh+8hIfR2Q==", + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.0.tgz", + "integrity": "sha512-U5eyP/CTFPuNE3qk+WZMxFkp/4zUzdceQlfzf7DdGdhp+Fezd7HD+i8Y24ZuTMKX3wQBld449jijbGq6OdGNQg==", "dev": true, "dependencies": { - "@babel/template": "^7.24.0", - "@babel/traverse": "^7.24.5", - "@babel/types": "^7.24.5" + "@babel/template": "^7.27.0", + "@babel/types": "^7.27.0" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/highlight": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.5.tgz", - "integrity": "sha512-8lLmua6AVh/8SLJRRVD6V8p73Hir9w5mJrhE+IPpILG31KKlI9iz5zmBYKcWPS59qSfgP9RaSBQSHHE81WKuEw==", - "dev": true, - "dependencies": { - "@babel/helper-validator-identifier": "^7.24.5", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0", - "picocolors": "^1.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@babel/highlight/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "node_modules/@babel/highlight/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@babel/highlight/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "node_modules/@babel/parser": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.0.tgz", + "integrity": "sha512-iaepho73/2Pz7w2eMS0Q5f83+0RKI7i4xmiYeBmDzfRVbQtTOG7Ts0S4HzJVsTMGI9keU8rNfuZr8DKfSt7Yyg==", "dev": true, "dependencies": { - "has-flag": "^3.0.0" + "@babel/types": "^7.27.0" }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/parser": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.5.tgz", - "integrity": "sha512-EOv5IK8arwh3LI47dz1b0tKUb/1uhHAnHJOrjgtQMIpu1uXd9mlFrJg9IUgGUgZ41Ch0K8REPTYpO7B76b4vJg==", - "dev": true, "bin": { "parser": "bin/babel-parser.js" }, @@ -465,14 +382,14 @@ } }, "node_modules/@babel/template": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.0.tgz", - "integrity": "sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==", + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.0.tgz", + "integrity": "sha512-2ncevenBqXI6qRMukPlXwHKHchC7RyMuu4xv5JBXRfOGVcTy1mXCD12qrp7Jsoxll1EV3+9sE4GugBVRjT2jFA==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.23.5", - "@babel/parser": "^7.24.0", - "@babel/types": "^7.24.0" + "@babel/code-frame": "^7.26.2", + "@babel/parser": "^7.27.0", + "@babel/types": "^7.27.0" }, "engines": { "node": ">=6.9.0" @@ -532,14 +449,13 @@ "dev": true }, "node_modules/@babel/types": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.5.tgz", - "integrity": "sha512-6mQNsaLeXTw0nxYUYu+NSa4Hx4BlF1x1x8/PMFbiR+GBSr+2DkECc69b8hgy2frEodNcvPffeH8YfWd3LI6jhQ==", + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.0.tgz", + "integrity": "sha512-H45s8fVLYjbhFH62dIJ3WtmJ6RSPt/3DRO0ZcT2SUiYiQyz3BLVb9ADEnLl91m74aQPS3AzzeajZHYOalWe3bg==", "dev": true, "dependencies": { - "@babel/helper-string-parser": "^7.24.1", - "@babel/helper-validator-identifier": "^7.24.5", - "to-fast-properties": "^2.0.0" + "@babel/helper-string-parser": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -556,9 +472,9 @@ } }, "node_modules/@datasance/ecn-viewer": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/@datasance/ecn-viewer/-/ecn-viewer-0.4.2.tgz", - "integrity": "sha512-+xyDmmw4q/pfzzCdz+u0c2sGaGGPj62M8u8JKE0luRNiILqmADRtVSsMCzal4sLmILgD3nkeaUeVTw+EzQcwyw==" + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@datasance/ecn-viewer/-/ecn-viewer-0.4.3.tgz", + "integrity": "sha512-7GHEwbd1JtbivEMus4QW7NxDwaWQP9E1WjXspTh3JH4048BhrsVrdfnqFt+f5n8x2QE77lT7UePyu5bbnpQXMQ==" }, "node_modules/@eslint-community/eslint-utils": { "version": "4.4.0", @@ -1910,9 +1826,9 @@ "dev": true }, "node_modules/axios": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.4.tgz", - "integrity": "sha512-DukmaFRnY6AzAALSH4J2M3k6PkaC+MfaAGdEERRWcC9q3/TWQwLpHR8ZRLKTdQ3aBDL64EdluRDjJqKw+BPZEw==", + "version": "1.8.4", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.8.4.tgz", + "integrity": "sha512-eBSYY4Y68NNlHbHBMdeDmKNtDgXWhQsJcGqzO3iLUM0GraQFSS9cVgPX5I9b3lbdFKyYoAEGAZF1DwhTaljNAw==", "dependencies": { "follow-redirects": "^1.15.6", "form-data": "^4.0.0", @@ -12343,9 +12259,9 @@ } }, "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==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.2.tgz", + "integrity": "sha512-EsaAXwxmx8UB7FRKqeozqEPop69DXcmYwTQwXvyAPF352HJsPdkVhvTaDPYqfNgruveJIJy3TA2l+2zj8LJIJA==", "dependencies": { "chownr": "^1.1.1", "mkdirp-classic": "^0.5.2", @@ -12564,15 +12480,6 @@ "node": ">=0.6.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", diff --git a/package.json b/package.json index b8e80899e..7b39fd6ef 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@datasance/iofogcontroller", - "version": "3.4.10", + "version": "3.4.11", "description": "ioFog Controller project for Eclipse IoFog @ iofog.org \\nCopyright (c) 2023 Datasance Teknoloji A.S.", "main": "./src/main.js", "author": "Emirhan Durmus", @@ -55,8 +55,8 @@ "iofog-controller": "src/main.js" }, "dependencies": { - "@datasance/ecn-viewer": "0.4.2", - "axios": "1.7.4", + "@datasance/ecn-viewer": "0.4.3", + "axios": "1.8.4", "body-parser": "^1.20.3", "child_process": "1.0.2", "command-line-args": "5.2.1", diff --git a/src/cli/microservice.js b/src/cli/microservice.js index 7ccdf6173..e105537ed 100644 --- a/src/cli/microservice.js +++ b/src/cli/microservice.js @@ -24,6 +24,7 @@ const JSON_SCHEMA_ADD = AppHelper.stringifyCliJsonSchema( { name: 'string', config: 'string', + annotations: 'string', catalogItemId: 0, images: [ { @@ -66,6 +67,12 @@ const JSON_SCHEMA_ADD = AppHelper.stringifyCliJsonSchema( cdiDevices: [ 'string' ], + capAdd: [ + 'string' + ], + capDrop: [ + 'string' + ], runAsUser: 'string', platform: 'string', runtime: 'string' @@ -76,6 +83,7 @@ const JSON_SCHEMA_UPDATE = AppHelper.stringifyCliJsonSchema( { name: 'string', config: 'string', + annotations: 'string', rebuild: true, iofogUuid: 'string', rootHostAccess: true, @@ -108,6 +116,12 @@ const JSON_SCHEMA_UPDATE = AppHelper.stringifyCliJsonSchema( cdiDevices: [ 'string' ], + capAdd: [ + 'string' + ], + capDrop: [ + 'string' + ], runAsUser: 'string', platform: 'string', runtime: 'string' @@ -197,6 +211,13 @@ class Microservice extends BaseCLIHandler { description: 'Microservice config', group: [constants.CMD_UPDATE, constants.CMD_ADD] }, + { + name: 'annotations', + alias: 'A', + type: String, + description: 'Microservice annotations', + group: [constants.CMD_UPDATE, constants.CMD_ADD] + }, { name: 'volumes', alias: 'v', @@ -308,6 +329,22 @@ class Microservice extends BaseCLIHandler { multiple: true, group: [constants.CMD_UPDATE, constants.CMD_ADD] }, + { + name: 'capAdd', + alias: 'cA', + type: String, + description: 'A list of kernel capabilities to add to the container.', + multiple: true, + group: [constants.CMD_UPDATE, constants.CMD_ADD] + }, + { + name: 'capDrop', + alias: 'cD', + type: String, + description: 'A list of kernel capabilities to drop to the container.', + multiple: true, + group: [constants.CMD_UPDATE, constants.CMD_ADD] + }, { name: 'user', alias: 'U', @@ -624,12 +661,15 @@ const _updateMicroserviceObject = function (obj) { const microserviceObj = { name: obj.name, config: obj.config, + annotations: obj.annotations, iofogUuid: obj.iofogUuid, rootHostAccess: AppHelper.validateBooleanCliOptions(obj.rootEnable, obj.rootDisable), logSize: (obj.logSize || constants.MICROSERVICE_DEFAULT_LOG_SIZE) * 1, rebuild: obj.rebuild, cmd: obj.cmd, cdiDevices: obj.cdiDevices, + capAdd: obj.capAdd, + capDrop: obj.capDrop, runAsUser: obj.runAsUser, platform: obj.platform, runtime: obj.runtime, @@ -686,6 +726,7 @@ const _createMicroserviceObject = function (obj) { const microserviceObj = { name: obj.name, config: obj.config, + annotations: obj.annotations, catalogItemId: parseInt(obj.catalogId) || undefined, application: obj.applicationName, registryId: parseInt(obj.registryId) || undefined, @@ -695,6 +736,8 @@ const _createMicroserviceObject = function (obj) { routes: obj.routes, cmd: obj.cmd, cdiDevices: obj.cdiDevices, + capAdd: obj.capAdd, + capDrop: obj.capDrop, runAsUser: obj.runAsUser, platform: obj.platform, runtime: obj.runtime, diff --git a/src/controllers/microservices-controller.js b/src/controllers/microservices-controller.js index 6b35b3e1a..55249c4af 100644 --- a/src/controllers/microservices-controller.js +++ b/src/controllers/microservices-controller.js @@ -54,6 +54,16 @@ const updateSystemMicroserviceEndPoint = async function (req) { return MicroservicesService.updateSystemMicroserviceEndPoint(microserviceUuid, microservice, false) } +const rebuildMicroserviceEndPoint = async function (req) { + const microserviceUuid = req.params.uuid + return MicroservicesService.rebuildMicroserviceEndPoint(microserviceUuid, false) +} + +const rebuildSystemMicroserviceEndPoint = async function (req) { + const microserviceUuid = req.params.uuid + return MicroservicesService.rebuildSystemMicroserviceEndPoint(microserviceUuid, false) +} + const updateMicroserviceYAMLEndPoint = async function (req) { const microserviceUuid = req.params.uuid const fileContent = req.file.buffer.toString() @@ -169,6 +179,8 @@ module.exports = { listMicroserviceBySubTagEndPoint: (listMicroserviceBySubTagEndPoint), updateMicroserviceEndPoint: (updateMicroserviceEndPoint), updateSystemMicroserviceEndPoint: (updateSystemMicroserviceEndPoint), + rebuildMicroserviceEndPoint: (rebuildMicroserviceEndPoint), + rebuildSystemMicroserviceEndPoint: (rebuildSystemMicroserviceEndPoint), deleteMicroserviceEndPoint: (deleteMicroserviceEndPoint), getMicroservicesByApplicationEndPoint: (getMicroservicesByApplicationEndPoint), createMicroserviceRouteEndPoint: (createMicroserviceRouteEndPoint), diff --git a/src/data/managers/microservice-cap-add-manager.js b/src/data/managers/microservice-cap-add-manager.js new file mode 100644 index 000000000..b92430fa2 --- /dev/null +++ b/src/data/managers/microservice-cap-add-manager.js @@ -0,0 +1,35 @@ +/* + * ******************************************************************************* + * * Copyright (c) 2023 Datasance Teknoloji A.S. + * * + * * This program and the accompanying materials are made available under the + * * terms of the Eclipse Public License v. 2.0 which is available at + * * http://www.eclipse.org/legal/epl-2.0 + * * + * * SPDX-License-Identifier: EPL-2.0 + * ******************************************************************************* + * + */ + +const BaseManager = require('./base-manager') +const models = require('../models') +const MicroserviceCapAdd = models.MicroserviceCapAdd + +const MicroserviceCapAddExcludedFields = [ + 'id', + 'microservice_uuid', + 'microserviceUuid' +] + +class MicroserviceCapAddManager extends BaseManager { + getEntity () { + return MicroserviceCapAdd + } + + findAllExcludeFields (where, transaction) { + return this.findAllWithAttributes(where, { exclude: MicroserviceCapAddExcludedFields }, transaction) + } +} + +const instance = new MicroserviceCapAddManager() +module.exports = instance diff --git a/src/data/managers/microservice-cap-drop-manager.js b/src/data/managers/microservice-cap-drop-manager.js new file mode 100644 index 000000000..2dce889f2 --- /dev/null +++ b/src/data/managers/microservice-cap-drop-manager.js @@ -0,0 +1,35 @@ +/* + * ******************************************************************************* + * * Copyright (c) 2023 Datasance Teknoloji A.S. + * * + * * This program and the accompanying materials are made available under the + * * terms of the Eclipse Public License v. 2.0 which is available at + * * http://www.eclipse.org/legal/epl-2.0 + * * + * * SPDX-License-Identifier: EPL-2.0 + * ******************************************************************************* + * + */ + +const BaseManager = require('./base-manager') +const models = require('../models') +const MicroserviceCapDrop = models.MicroserviceCapDrop + +const MicroserviceCapDropExcludedFields = [ + 'id', + 'microservice_uuid', + 'microserviceUuid' +] + +class MicroserviceCapDropManager extends BaseManager { + getEntity () { + return MicroserviceCapDrop + } + + findAllExcludeFields (where, transaction) { + return this.findAllWithAttributes(where, { exclude: MicroserviceCapDropExcludedFields }, transaction) + } +} + +const instance = new MicroserviceCapDropManager() +module.exports = instance diff --git a/src/data/managers/microservice-manager.js b/src/data/managers/microservice-manager.js index 00320b391..68ca789e7 100644 --- a/src/data/managers/microservice-manager.js +++ b/src/data/managers/microservice-manager.js @@ -19,6 +19,8 @@ const MicroserviceEnv = models.MicroserviceEnv const MicroserviceExtraHost = models.MicroserviceExtraHost const MicroserviceArg = models.MicroserviceArg const MicroserviceCdiDev = models.MicroserviceCdiDev +const MicroserviceCapAdd = models.MicroserviceCapAdd +const MicroserviceCapDrop = models.MicroserviceCapDrop const VolumeMapping = models.VolumeMapping const StraceDiagnostics = models.StraceDiagnostics const CatalogItem = models.CatalogItem @@ -74,6 +76,18 @@ class MicroserviceManager extends BaseManager { required: false, attributes: ['cdiDevices'] }, + { + model: MicroserviceCapAdd, + as: 'capAdd', + required: false, + attributes: ['capAdd'] + }, + { + model: MicroserviceCapDrop, + as: 'capDrop', + required: false, + attributes: ['capDrop'] + }, { model: MicroservicePort, as: 'ports', @@ -165,6 +179,18 @@ class MicroserviceManager extends BaseManager { required: false, attributes: ['cdiDevices'] }, + { + model: MicroserviceCapAdd, + as: 'capAdd', + required: false, + attributes: ['capAdd'] + }, + { + model: MicroserviceCapDrop, + as: 'capDrop', + required: false, + attributes: ['capDrop'] + }, { model: MicroservicePort, as: 'ports', @@ -271,6 +297,18 @@ class MicroserviceManager extends BaseManager { required: false, attributes: ['cdiDevices'] }, + { + model: MicroserviceCapAdd, + as: 'capAdd', + required: false, + attributes: ['capAdd'] + }, + { + model: MicroserviceCapDrop, + as: 'capDrop', + required: false, + attributes: ['capDrop'] + }, { model: MicroservicePort, as: 'ports', @@ -384,7 +422,23 @@ class MicroserviceManager extends BaseManager { attributes: ['uuid'] }, { transaction: transaction }) } - + findSystemMicroserviceOnGet (where, transaction) { + return Microservice.findOne({ + include: [ + { + model: Application, + as: 'application', + required: true, + where: { + isSystem: true + }, + attributes: ['id'] + } + ], + where: where, + attributes: ['uuid'] + }, { transaction: transaction }) + } async findOneExcludeFields (where, transaction) { return Microservice.findOne({ include: [ diff --git a/src/data/migrations/db_migration_v1.0.2.sql b/src/data/migrations/db_migration_v1.0.2.sql index 769defbee..2eed15b69 100644 --- a/src/data/migrations/db_migration_v1.0.2.sql +++ b/src/data/migrations/db_migration_v1.0.2.sql @@ -593,3 +593,23 @@ CREATE INDEX idx_microservicepubtags_microservice_uuid ON MicroservicePubTags (m CREATE INDEX idx_microservicesubtags_microservice_uuid ON MicroservicesubTags (microservice_uuid); CREATE INDEX idx_microservicepubtags_tag_id ON MicroservicePubTags (tag_id); CREATE INDEX idx_microservicesubtags_tag_id ON MicroservicesubTags (tag_id); + +CREATE TABLE IF NOT EXISTS MicroserviceCapAdd ( + id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, + cap_add TEXT, + microservice_uuid VARCHAR(32), + FOREIGN KEY (microservice_uuid) REFERENCES Microservices (uuid) ON DELETE CASCADE +); + +CREATE INDEX idx_microservice_capAdd_microserviceUuid ON MicroserviceCapAdd (microservice_uuid); + +CREATE TABLE IF NOT EXISTS MicroserviceCapDrop ( + id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, + cap_drop TEXT, + microservice_uuid VARCHAR(32), + FOREIGN KEY (microservice_uuid) REFERENCES Microservices (uuid) ON DELETE CASCADE +); + +CREATE INDEX idx_microservice_capDrop_microserviceUuid ON MicroserviceCapDrop (microservice_uuid); + +ALTER TABLE Microservices ADD COLUMN annotations TEXT; \ No newline at end of file diff --git a/src/data/models/microservice.js b/src/data/models/microservice.js index 1856805d0..bc6141cc0 100644 --- a/src/data/models/microservice.js +++ b/src/data/models/microservice.js @@ -15,6 +15,11 @@ module.exports = (sequelize, DataTypes) => { field: 'config', defaultValue: '{}' }, + annotations: { + type: DataTypes.TEXT, + field: 'annotations', + defaultValue: '{}' + }, name: { type: DataTypes.TEXT, field: 'name', @@ -39,15 +44,18 @@ module.exports = (sequelize, DataTypes) => { }, runAsUser: { type: DataTypes.TEXT, - field: 'run_as_user' + field: 'run_as_user', + defaultValue: '' }, platform: { type: DataTypes.TEXT, - field: 'platform' + field: 'platform', + defaultValue: '' }, runtime: { type: DataTypes.TEXT, - field: 'runtime' + field: 'runtime', + defaultValue: '' }, logSize: { type: DataTypes.BIGINT, @@ -160,6 +168,16 @@ module.exports = (sequelize, DataTypes) => { as: 'cdiDevices' }) + Microservice.hasMany(models.MicroserviceCapAdd, { + foreignKey: 'microservice_uuid', + as: 'capAdd' + }) + + Microservice.hasMany(models.MicroserviceCapDrop, { + foreignKey: 'microservice_uuid', + as: 'capDrop' + }) + Microservice.hasMany(models.MicroserviceExtraHost, { foreignKey: 'microservice_uuid', as: 'extraHosts' diff --git a/src/data/models/microserviceCapAdd.js b/src/data/models/microserviceCapAdd.js new file mode 100644 index 000000000..6a5ee5fe6 --- /dev/null +++ b/src/data/models/microserviceCapAdd.js @@ -0,0 +1,31 @@ +'use strict' +module.exports = (sequelize, DataTypes) => { + const MicroserviceCapAdd = sequelize.define('MicroserviceCapAdd', { + id: { + type: DataTypes.INTEGER, + primaryKey: true, + autoIncrement: true, + allowNull: false, + field: 'id' + }, + capAdd: { + type: DataTypes.TEXT, + field: 'cap_add' + } + }, { + tableName: 'MicroserviceCapAdd', + timestamps: false, + underscored: true + }) + MicroserviceCapAdd.associate = function (models) { + MicroserviceCapAdd.belongsTo(models.Microservice, { + foreignKey: { + name: 'microserviceUuid', + field: 'microservice_uuid' + }, + as: 'microservice', + onDelete: 'cascade' + }) + } + return MicroserviceCapAdd +} diff --git a/src/data/models/microserviceCapDrop.js b/src/data/models/microserviceCapDrop.js new file mode 100644 index 000000000..288faa659 --- /dev/null +++ b/src/data/models/microserviceCapDrop.js @@ -0,0 +1,31 @@ +'use strict' +module.exports = (sequelize, DataTypes) => { + const MicroserviceCapDrop = sequelize.define('MicroserviceCapDrop', { + id: { + type: DataTypes.INTEGER, + primaryKey: true, + autoIncrement: true, + allowNull: false, + field: 'id' + }, + capDrop: { + type: DataTypes.TEXT, + field: 'cap_drop' + } + }, { + tableName: 'MicroserviceCapDrop', + timestamps: false, + underscored: true + }) + MicroserviceCapDrop.associate = function (models) { + MicroserviceCapDrop.belongsTo(models.Microservice, { + foreignKey: { + name: 'microserviceUuid', + field: 'microservice_uuid' + }, + as: 'microservice', + onDelete: 'cascade' + }) + } + return MicroserviceCapDrop +} diff --git a/src/routes/microservices.js b/src/routes/microservices.js index d59b59a6d..a43a8cf4c 100644 --- a/src/routes/microservices.js +++ b/src/routes/microservices.js @@ -305,6 +305,76 @@ module.exports = [ }) } }, + { + method: 'patch', + path: '/api/v3/microservices/:uuid/rebuild', + middleware: async (req, res) => { + logger.apiReq(req) + + const successCode = constants.HTTP_CODE_NO_CONTENT + const errorCodes = [ + { + code: constants.HTTP_CODE_BAD_REQUEST, + errors: [Errors.ValidationError] + }, + { + code: constants.HTTP_CODE_UNAUTHORIZED, + errors: [Errors.AuthenticationError] + }, + { + code: constants.HTTP_CODE_NOT_FOUND, + errors: [Errors.NotFoundError] + } + ] + + await keycloak.protect(['SRE', 'Developer'])(req, res, async () => { + const rebuildMicroserviceEndPoint = ResponseDecorator.handleErrors(MicroservicesController.rebuildMicroserviceEndPoint, + successCode, errorCodes) + const responseObject = await rebuildMicroserviceEndPoint(req) + const user = req.kauth.grant.access_token.content.preferred_username + res + .status(responseObject.code) + .send(responseObject.body) + + logger.apiRes({ req: req, user: user, res: responseObject }) + }) + } + }, + { + method: 'patch', + path: '/api/v3/microservices/system/:uuid/rebuild', + middleware: async (req, res) => { + logger.apiReq(req) + + const successCode = constants.HTTP_CODE_NO_CONTENT + const errorCodes = [ + { + code: constants.HTTP_CODE_BAD_REQUEST, + errors: [Errors.ValidationError] + }, + { + code: constants.HTTP_CODE_UNAUTHORIZED, + errors: [Errors.AuthenticationError] + }, + { + code: constants.HTTP_CODE_NOT_FOUND, + errors: [Errors.NotFoundError] + } + ] + + await keycloak.protect(['SRE'])(req, res, async () => { + const rebuildSystemMicroserviceEndPoint = ResponseDecorator.handleErrors(MicroservicesController.rebuildSystemMicroserviceEndPoint, + successCode, errorCodes) + const responseObject = await rebuildSystemMicroserviceEndPoint(req) + const user = req.kauth.grant.access_token.content.preferred_username + res + .status(responseObject.code) + .send(responseObject.body) + + logger.apiRes({ req: req, user: user, res: responseObject }) + }) + } + }, { method: 'patch', path: '/api/v3/microservices/yaml/:uuid', diff --git a/src/schemas/microservice.js b/src/schemas/microservice.js index 92fde6ea1..386ad3f43 100644 --- a/src/schemas/microservice.js +++ b/src/schemas/microservice.js @@ -9,6 +9,7 @@ const microserviceCreate = { 'pattern': nameRegex }, 'config': { 'type': 'string' }, + 'annotations': { 'type': 'string' }, 'catalogItemId': { 'type': 'integer', 'minimum': 4 @@ -53,6 +54,12 @@ const microserviceCreate = { 'cdiDevices': { 'type': 'array', 'items': { 'type': 'string' } }, + 'capAdd': { + 'type': 'array', + 'items': { 'type': 'string' } }, + 'capDrop': { + 'type': 'array', + 'items': { 'type': 'string' } }, 'runAsUser': { 'type': 'string' }, 'platform': { 'type': 'string' }, 'runtime': { 'type': 'string' }, @@ -78,6 +85,7 @@ const microserviceUpdate = { 'pattern': nameRegex }, 'config': { 'type': 'string' }, + 'annotations': { 'type': 'string' }, 'rebuild': { 'type': 'boolean' }, 'iofogUuid': { 'type': 'string' }, 'agentName': { 'type': 'string' }, @@ -108,6 +116,12 @@ const microserviceUpdate = { 'cdiDevices': { 'type': 'array', 'items': { 'type': 'string' } }, + 'capAdd': { + 'type': 'array', + 'items': { 'type': 'string' } }, + 'capDrop': { + 'type': 'array', + 'items': { 'type': 'string' } }, 'runAsUser': { 'type': 'string' }, 'platform': { 'type': 'string' }, 'runtime': { 'type': 'string' }, diff --git a/src/services/agent-service.js b/src/services/agent-service.js index fee8ebc96..88c2be767 100644 --- a/src/services/agent-service.js +++ b/src/services/agent-service.js @@ -289,6 +289,8 @@ const getAgentMicroservices = async function (fog, transaction) { }) const cmd = microservice.cmd && microservice.cmd.sort((a, b) => a.id - b.id).map((it) => it.cmd) const cdiDevices = microservice.cdiDevices && microservice.cdiDevices.sort((a, b) => a.id - b.id).map((it) => it.cdiDevices) + const capAdd = microservice.capAdd && microservice.capAdd.sort((a, b) => a.id - b.id).map((it) => it.capAdd) + const capDrop = microservice.capDrop && microservice.capDrop.sort((a, b) => a.id - b.id).map((it) => it.capDrop) const registryId = microservice.catalogItem && microservice.catalogItem.registry ? microservice.catalogItem.registry.id : microservice.registry.id const extraHosts = microservice.extraHosts ? microservice.extraHosts.map(_mapExtraHost) : [] @@ -297,6 +299,7 @@ const getAgentMicroservices = async function (fog, transaction) { uuid: microservice.uuid, imageId: imageId, config: microservice.config, + annotations: microservice.annotations, rebuild: microservice.rebuild, rootHostAccess: microservice.rootHostAccess, runAsUser: microservice.runAsUser, @@ -313,6 +316,8 @@ const getAgentMicroservices = async function (fog, transaction) { extraHosts, cmd, cdiDevices, + capAdd, + capDrop, routes, isConsumer } diff --git a/src/services/microservices-service.js b/src/services/microservices-service.js index a0bc47fad..e9bec9fb7 100644 --- a/src/services/microservices-service.js +++ b/src/services/microservices-service.js @@ -16,6 +16,8 @@ const MicroserviceManager = require('../data/managers/microservice-manager') const MicroserviceStatusManager = require('../data/managers/microservice-status-manager') const MicroserviceArgManager = require('../data/managers/microservice-arg-manager') const MicroserviceCdiDevManager = require('../data/managers/microservice-cdi-device-manager') +const MicroserviceCapAddManager = require('../data/managers/microservice-cap-add-manager') +const MicroserviceCapDropManager = require('../data/managers/microservice-cap-drop-manager') const MicroserviceEnvManager = require('../data/managers/microservice-env-manager') const MicroservicePortService = require('../services/microservice-ports/default') const CatalogItemImageManager = require('../data/managers/catalog-item-image-manager') @@ -321,6 +323,16 @@ async function createMicroserviceEndPoint (microserviceData, isCLI, transaction) await _createCdiDevices(microservice, cdiDevices, transaction) } } + if (microserviceData.capAdd) { + for (const capAdd of microserviceData.capAdd) { + await _createCapAdd(microservice, capAdd, transaction) + } + } + if (microserviceData.capDrop) { + for (const capDrop of microserviceData.capDrop) { + await _createCapDrop(microservice, capDrop, transaction) + } + } if (microserviceData.volumeMappings) { await _createVolumeMappings(microservice, microserviceData.volumeMappings, transaction) } @@ -428,16 +440,21 @@ async function updateSystemMicroserviceEndPoint (microserviceUuid, microserviceD const config = _validateMicroserviceConfig(microserviceData.config) + const annotations = _validateMicroserviceAnnotations(microserviceData.annotations) + const newFog = await _findFog(microserviceData, isCLI, transaction) || {} const microserviceToUpdate = { name: microserviceData.name, config: config, + annotations: annotations, images: microserviceData.images, catalogItemId: microserviceData.catalogItemId, rebuild: microserviceData.rebuild, iofogUuid: newFog.uuid, rootHostAccess: microserviceData.rootHostAccess, cdiDevices: microserviceData.cdiDevices, + capAdd: microserviceData.capAdd, + capDrop: microserviceData.capDrop, runAsUser: microserviceData.runAsUser, platform: microserviceData.platform, runtime: microserviceData.runtime, @@ -553,6 +570,9 @@ async function updateSystemMicroserviceEndPoint (microserviceUuid, microserviceD microserviceDataUpdate.env || microserviceDataUpdate.cmd || microserviceDataUpdate.cdiDevices || + microserviceDataUpdate.annotations || + microserviceDataUpdate.capAdd || + microserviceDataUpdate.capDrop || microserviceDataUpdate.runAsUser || microserviceDataUpdate.platform || microserviceDataUpdate.runtime || @@ -585,6 +605,14 @@ async function updateSystemMicroserviceEndPoint (microserviceUuid, microserviceD await _updateCdiDevices(microserviceDataUpdate.cdiDevices, microserviceUuid, transaction) } + if (microserviceDataUpdate.capAdd) { + await _updateCapAdd(microserviceDataUpdate.capAdd, microserviceUuid, transaction) + } + + if (microserviceDataUpdate.capDrop) { + await _updateCapDrop(microserviceDataUpdate.capDrop, microserviceUuid, transaction) + } + if (microserviceDataUpdate.iofogUuid && microserviceDataUpdate.iofogUuid !== microservice.iofogUuid) { await MicroservicePortService.movePublicPortsToNewFog(updatedMicroservice, transaction) } @@ -634,16 +662,21 @@ async function updateMicroserviceEndPoint (microserviceUuid, microserviceData, i const config = _validateMicroserviceConfig(microserviceData.config) + const annotations = _validateMicroserviceAnnotations(microserviceData.annotations) + const newFog = await _findFog(microserviceData, isCLI, transaction) || {} const microserviceToUpdate = { name: microserviceData.name, config: config, + annotations: annotations, images: microserviceData.images, catalogItemId: microserviceData.catalogItemId, rebuild: microserviceData.rebuild, iofogUuid: newFog.uuid, rootHostAccess: microserviceData.rootHostAccess, cdiDevices: microserviceData.cdiDevices, + capAdd: microserviceData.capAdd, + capDrop: microserviceData.capDrop, runAsUser: microserviceData.runAsUser, platform: microserviceData.platform, runtime: microserviceData.runtime, @@ -763,6 +796,9 @@ async function updateMicroserviceEndPoint (microserviceUuid, microserviceData, i microserviceDataUpdate.env || microserviceDataUpdate.cmd || microserviceDataUpdate.cdiDevices || + microserviceDataUpdate.capAdd || + microserviceDataUpdate.capDrop || + microserviceDataUpdate.annotations || microserviceDataUpdate.runAsUser || microserviceDataUpdate.platform || microserviceDataUpdate.runtime || @@ -795,6 +831,14 @@ async function updateMicroserviceEndPoint (microserviceUuid, microserviceData, i await _updateCdiDevices(microserviceDataUpdate.cdiDevices, microserviceUuid, transaction) } + if (microserviceDataUpdate.capAdd) { + await _updateCapAdd(microserviceDataUpdate.capAdd, microserviceUuid, transaction) + } + + if (microserviceDataUpdate.capDrop) { + await _updateCapDrop(microserviceDataUpdate.capDrop, microserviceUuid, transaction) + } + if (microserviceDataUpdate.iofogUuid && microserviceDataUpdate.iofogUuid !== microservice.iofogUuid) { await MicroservicePortService.movePublicPortsToNewFog(updatedMicroservice, transaction) } @@ -860,6 +904,50 @@ async function updateMicroserviceEndPoint (microserviceUuid, microserviceData, i } } +async function rebuildMicroserviceEndPoint (microserviceUuid, isCLI, transaction) { + const query = isCLI + ? { + uuid: microserviceUuid + } + : { + uuid: microserviceUuid + } + + const microservice = await MicroserviceManager.updateAndFind(query, { rebuild: true }, transaction) + + if (!microservice) { + throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.INVALID_MICROSERVICE_UUID, microserviceUuid)) + } + const iofogUuid = microservice.iofogUuid + await ChangeTrackingService.update(iofogUuid, ChangeTrackingService.events.microserviceCommon, transaction) + return { + uuid: microserviceUuid, + rebuild: true + } +} + +async function rebuildSystemMicroserviceEndPoint (microserviceUuid, isCLI, transaction) { + const query = isCLI + ? { + uuid: microserviceUuid + } + : { + uuid: microserviceUuid + } + + const microservice = await MicroserviceManager.updateAndFind(query, { rebuild: true }, transaction) + + if (!microservice) { + throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.INVALID_MICROSERVICE_UUID, microserviceUuid)) + } + const iofogUuid = microservice.iofogUuid + await ChangeTrackingService.update(iofogUuid, ChangeTrackingService.events.microserviceCommon, transaction) + return { + uuid: microserviceUuid, + rebuild: true + } +} + /** * checks if microservice image is updated * @param {*} microserviceDataUpdateImages @@ -1028,12 +1116,40 @@ async function _createCdiDevices (microservice, cdiDevices, transaction) { throw new Errors.ValidationError(AppHelper.formatMessage(ErrorMessages.REQUIRED_FOG_NODE)) } - const mscdiDevicesData = { + const msCdiDevicesData = { cdiDevices: cdiDevices, microserviceUuid: microservice.uuid } - await MicroserviceCdiDevManager.create(mscdiDevicesData, transaction) + await MicroserviceCdiDevManager.create(msCdiDevicesData, transaction) + await MicroservicePortService.switchOnUpdateFlagsForMicroservicesForPortMapping(microservice, false, transaction) +} + +async function _createCapAdd (microservice, capAdd, transaction) { + if (!microservice.iofogUuid) { + throw new Errors.ValidationError(AppHelper.formatMessage(ErrorMessages.REQUIRED_FOG_NODE)) + } + + const msCapAddData = { + capAdd: capAdd, + microserviceUuid: microservice.uuid + } + + await MicroserviceCapAddManager.create(msCapAddData, transaction) + await MicroservicePortService.switchOnUpdateFlagsForMicroservicesForPortMapping(microservice, false, transaction) +} + +async function _createCapDrop (microservice, capDrop, transaction) { + if (!microservice.iofogUuid) { + throw new Errors.ValidationError(AppHelper.formatMessage(ErrorMessages.REQUIRED_FOG_NODE)) + } + + const msCapDropData = { + capDrop: capDrop, + microserviceUuid: microservice.uuid + } + + await MicroserviceCapDropManager.create(msCapDropData, transaction) await MicroservicePortService.switchOnUpdateFlagsForMicroservicesForPortMapping(microservice, false, transaction) } @@ -1253,17 +1369,29 @@ function _validateMicroserviceConfig (config) { return result } +function _validateMicroserviceAnnotations (annotations) { + let result + if (annotations) { + result = annotations.split('\\"').join('"').split('"').join('\"') // eslint-disable-line no-useless-escape + } + return result +} + async function _createMicroservice (microserviceData, isCLI, transaction) { const config = _validateMicroserviceConfig(microserviceData.config) + const annotations = _validateMicroserviceAnnotations(microserviceData.annotations) let newMicroservice = { uuid: AppHelper.generateRandomString(32), name: microserviceData.name, config: config, + annotations: annotations, catalogItemId: microserviceData.catalogItemId, iofogUuid: microserviceData.iofogUuid, rootHostAccess: microserviceData.rootHostAccess, cdiDevices: microserviceData.cdiDevices, + capAdd: microserviceData.capAdd, + capDrop: microserviceData.capDrop, runAsUser: microserviceData.runAsUser, platform: microserviceData.platform, runtime: microserviceData.runtime, @@ -1436,6 +1564,34 @@ async function _updateCdiDevices (cdiDevices, microserviceUuid, transaction) { } } +async function _updateCapAdd (capAdd, microserviceUuid, transaction) { + await MicroserviceCapAddManager.delete({ + microserviceUuid: microserviceUuid + }, transaction) + for (const capAddData of capAdd) { + const envObj = { + microserviceUuid: microserviceUuid, + capAdd: capAddData + } + + await MicroserviceCapAddManager.create(envObj, transaction) + } +} + +async function _updateCapDrop (capDrop, microserviceUuid, transaction) { + await MicroserviceCapDropManager.delete({ + microserviceUuid: microserviceUuid + }, transaction) + for (const capDropData of capDrop) { + const envObj = { + microserviceUuid: microserviceUuid, + capDrop: capDropData + } + + await MicroserviceCapDropManager.create(envObj, transaction) + } +} + async function _updatePorts (newPortMappings, microservice, transaction) { await MicroservicePortService.deletePortMappings(microservice, transaction) for (const portMapping of newPortMappings) { @@ -1540,6 +1696,10 @@ async function _buildGetMicroserviceResponse (microservice, transaction) { const arg = cmd.map((it) => it.cmd) const cdiDevices = await MicroserviceCdiDevManager.findAllExcludeFields({ microserviceUuid: microserviceUuid }, transaction) const cdiDevs = cdiDevices.map((it) => it.cdiDevices) + const capAdd = await MicroserviceCapAddManager.findAllExcludeFields({ microserviceUuid: microserviceUuid }, transaction) + const capAdds = capAdd.map((it) => it.capAdd) + const capDrop = await MicroserviceCapDropManager.findAllExcludeFields({ microserviceUuid: microserviceUuid }, transaction) + const capDrops = capDrop.map((it) => it.capDrop) const pubTags = microservice.pubTags ? microservice.pubTags.map(t => t.value) : [] const subTags = microservice.subTags ? microservice.subTags.map(t => t.value) : [] const status = await MicroserviceStatusManager.findAllExcludeFields({ microserviceUuid: microserviceUuid }, transaction) @@ -1556,6 +1716,8 @@ async function _buildGetMicroserviceResponse (microservice, transaction) { res.env = env res.cmd = arg res.cdiDevices = cdiDevs + res.capAdd = capAdds + res.capDrop = capDrops res.extraHosts = extraHosts.map(eH => ({ name: eH.name, address: eH.template, value: eH.value })) res.images = images.map(i => ({ containerImage: i.containerImage, fogTypeId: i.fogTypeId })) if (status && status.length) { @@ -1636,6 +1798,8 @@ module.exports = { listVolumeMappingsEndPoint: TransactionDecorator.generateTransaction(listVolumeMappingsEndPoint), updateMicroserviceEndPoint: TransactionDecorator.generateTransaction(updateMicroserviceEndPoint), updateSystemMicroserviceEndPoint: TransactionDecorator.generateTransaction(updateSystemMicroserviceEndPoint), + rebuildMicroserviceEndPoint: TransactionDecorator.generateTransaction(rebuildMicroserviceEndPoint), + rebuildSystemMicroserviceEndPoint: TransactionDecorator.generateTransaction(rebuildSystemMicroserviceEndPoint), buildGetMicroserviceResponse: _buildGetMicroserviceResponse, updateChangeTracking: _updateChangeTracking, listMicroserviceByPubTagEndPoint: TransactionDecorator.generateTransaction(listMicroserviceByPubTagEndPoint), diff --git a/src/services/router-service.js b/src/services/router-service.js index 3ccf0bcbd..124089e90 100644 --- a/src/services/router-service.js +++ b/src/services/router-service.js @@ -18,6 +18,7 @@ const Constants = require('../helpers/constants') const Errors = require('../helpers/errors') const ErrorMessages = require('../helpers/error-messages') const MicroserviceManager = require('../data/managers/microservice-manager') +const MicroserviceCapAddManager = require('../data/managers/microservice-cap-add-manager') const MicroserviceStatusManager = require('../data/managers/microservice-status-manager') const ApplicationManager = require('../data/managers/application-manager') const MicroservicePortManager = require('../data/managers/microservice-port-manager') @@ -245,11 +246,22 @@ async function _createRouterMicroservice (isEdge, uuid, microserviceConfig, tran logSize: constants.MICROSERVICE_DEFAULT_LOG_SIZE, configLastUpdated: Date.now() } + + const capAddValues = [ + { capAdd: 'NET_RAW' } + ] + await ApplicationManager.create(routerApplicationData, transaction) const application = await ApplicationManager.findOne({ name: routerApplicationData.name }, transaction) routerMicroserviceData.applicationId = application.id const routerMicroservice = await MicroserviceManager.create(routerMicroserviceData, transaction) await MicroserviceStatusManager.create({ microserviceUuid: routerMicroserviceData.uuid }, transaction) + for (const capAdd of capAddValues) { + await MicroserviceCapAddManager.create({ + microserviceUuid: routerMicroserviceData.uuid, + capAdd: capAdd.capAdd + }, transaction) + } return routerMicroservice } From 3e3b73ac16fb5450c9f2560ea8be657c25e09880 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emirhan=20Durmu=C5=9F?= Date: Wed, 9 Apr 2025 20:20:49 +0300 Subject: [PATCH 148/178] ecn-viewer version updated --- package-lock.json | 8 ++++---- package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index 8dcc7705e..52b827352 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,7 +10,7 @@ "hasInstallScript": true, "license": "EPL-2.0", "dependencies": { - "@datasance/ecn-viewer": "0.4.3", + "@datasance/ecn-viewer": "0.4.4", "axios": "1.8.4", "body-parser": "^1.20.3", "child_process": "1.0.2", @@ -472,9 +472,9 @@ } }, "node_modules/@datasance/ecn-viewer": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/@datasance/ecn-viewer/-/ecn-viewer-0.4.3.tgz", - "integrity": "sha512-7GHEwbd1JtbivEMus4QW7NxDwaWQP9E1WjXspTh3JH4048BhrsVrdfnqFt+f5n8x2QE77lT7UePyu5bbnpQXMQ==" + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/@datasance/ecn-viewer/-/ecn-viewer-0.4.4.tgz", + "integrity": "sha512-n6ZAmPlOMTch1RBAF44QBO6hos//Q2IqNxtLY8D8Q8kuvPTMhVc1X/zWNLjHiHAsjIfmDFBJFYW6d7VhyEc1wg==" }, "node_modules/@eslint-community/eslint-utils": { "version": "4.4.0", diff --git a/package.json b/package.json index 7b39fd6ef..271cb8719 100644 --- a/package.json +++ b/package.json @@ -55,7 +55,7 @@ "iofog-controller": "src/main.js" }, "dependencies": { - "@datasance/ecn-viewer": "0.4.3", + "@datasance/ecn-viewer": "0.4.4", "axios": "1.8.4", "body-parser": "^1.20.3", "child_process": "1.0.2", From 6cba95cff09cf9241a14cd702c45e3e3105ecbc6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emirhan=20Durmu=C5=9F?= Date: Thu, 10 Apr 2025 13:52:37 +0300 Subject: [PATCH 149/178] logrotate and mscv rebuild endpoint fixed --- logrotate.conf | 7 +++++-- src/services/microservices-service.js | 5 +++++ 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/logrotate.conf b/logrotate.conf index 7656fa264..9690627c0 100644 --- a/logrotate.conf +++ b/logrotate.conf @@ -1,9 +1,12 @@ /var/log/iofog-controller/iofog-controller.log { - rotate 10 - size 100m + daily + rotate 50 + size 100M compress notifempty missingok + create 0644 10000 10000 + nodateext postrotate if [ -f /home/runner/iofog-controller.pid ]; then kill -HUP `cat /home/runner/iofog-controller.pid`; diff --git a/src/services/microservices-service.js b/src/services/microservices-service.js index e9bec9fb7..cd5649050 100644 --- a/src/services/microservices-service.js +++ b/src/services/microservices-service.js @@ -913,6 +913,11 @@ async function rebuildMicroserviceEndPoint (microserviceUuid, isCLI, transaction uuid: microserviceUuid } + const check = await MicroserviceManager.findOneWithCategory(query, transaction) + if (check.catalogItem && check.catalogItem.category === 'SYSTEM') { + throw new Errors.ValidationError(AppHelper.formatMessage(ErrorMessages.SYSTEM_MICROSERVICE_UPDATE, microserviceUuid)) + } + const microservice = await MicroserviceManager.updateAndFind(query, { rebuild: true }, transaction) if (!microservice) { From d3c2016860bccbe36ab15bd294f658e6dfa0992f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emirhan=20Durmu=C5=9F?= Date: Tue, 22 Apr 2025 18:06:16 +0300 Subject: [PATCH 150/178] agent static accestoken replaced with ed25519 keypair and jwt. new config import mechanism added. noon-user-auth option for dev deployments. logging improved. logrotation handled internally --- .dockerignore | 4 +- .gitignore | 4 +- Dockerfile | 4 +- docs/swagger.yaml | 6 +- package-lock.json | 1775 ++++++++++++++++- package.json | 18 +- scripts/postinstall.js | 2 +- scripts/start-dev.js | 38 +- src/cli/config.js | 46 +- src/cli/start.js | 17 +- src/config/constants.js | 31 - src/config/controller.yaml | 111 ++ src/config/default.json | 39 - src/config/development.json | 63 - src/config/env-mapping.js | 79 + src/config/index.js | 153 +- src/config/keycloak.js | 89 +- src/config/production.json | 56 - src/config/telemetry.js | 78 + src/config/test.json | 19 - src/data/managers/fog-used-token-manager.js | 101 + src/data/managers/iofog-manager.js | 14 - src/data/managers/iofog-public-key-manager.js | 89 + src/data/migrations/db_migration_v1.0.2.sql | 27 +- src/data/models/fog.js | 10 + src/data/models/fogUsedToken.js | 42 + src/data/models/fogpublickey.js | 42 + src/data/models/index.js | 9 +- src/data/providers/database-factory.js | 2 +- src/data/providers/database-provider.js | 34 +- src/data/providers/mysql.js | 2 +- src/data/providers/postgres.js | 2 +- src/data/providers/sqlite.js | 2 +- src/decorators/authorization-decorator.js | 67 +- src/helpers/app-helper.js | 2 +- src/init.js | 46 + src/jobs/fog-status-job.js | 4 +- src/jobs/stopped-app-status-job.js | 2 +- src/logger/index.js | 203 +- src/main.js | 13 +- src/schemas/config.js | 2 +- src/server.js | 425 ++-- src/services/agent-service.js | 15 +- src/services/cleanup-service.js | 34 + src/services/diagnostic-service.js | 4 +- src/services/iofog-key-service.js | 130 ++ src/services/iofog-service.js | 4 +- src/services/microservice-ports/default.js | 2 +- src/services/microservices-service.js | 13 +- src/services/tunnel-service.js | 10 +- src/services/user-service.js | 268 ++- src/utils/ssl-utils.js | 76 + test/OTEL/README.md | 50 + test/OTEL/docker-compose.yml | 65 + test/OTEL/otel-collector-config.yaml | 39 + test/OTEL/prometheus.yml | 8 + 56 files changed, 3694 insertions(+), 796 deletions(-) delete mode 100644 src/config/constants.js create mode 100644 src/config/controller.yaml delete mode 100644 src/config/default.json delete mode 100644 src/config/development.json create mode 100644 src/config/env-mapping.js delete mode 100644 src/config/production.json create mode 100644 src/config/telemetry.js delete mode 100644 src/config/test.json create mode 100644 src/data/managers/fog-used-token-manager.js create mode 100644 src/data/managers/iofog-public-key-manager.js create mode 100644 src/data/models/fogUsedToken.js create mode 100644 src/data/models/fogpublickey.js create mode 100644 src/init.js create mode 100644 src/services/cleanup-service.js create mode 100644 src/services/iofog-key-service.js create mode 100644 src/utils/ssl-utils.js create mode 100644 test/OTEL/README.md create mode 100644 test/OTEL/docker-compose.yml create mode 100644 test/OTEL/otel-collector-config.yaml create mode 100644 test/OTEL/prometheus.yml diff --git a/.dockerignore b/.dockerignore index 10f384634..72c4d8543 100644 --- a/.dockerignore +++ b/.dockerignore @@ -15,4 +15,6 @@ node_modules /src/config/*-config.json .DS_Store iofogcontroller-*.tgz -iofog-iofogcontroller-*.tgz \ No newline at end of file +iofog-iofogcontroller-*.tgz +.env +src/iofog-controller.pid \ No newline at end of file diff --git a/.gitignore b/.gitignore index a80448af3..76ea49d75 100644 --- a/.gitignore +++ b/.gitignore @@ -17,4 +17,6 @@ node_modules iofogcontroller-*.tgz diagnostic/ iofog-iofogcontroller-*.tgz -.npmrc \ No newline at end of file +.npmrc +.env +src/iofog-controller.pid \ No newline at end of file diff --git a/Dockerfile b/Dockerfile index 7e3af9880..ef8c1a335 100644 --- a/Dockerfile +++ b/Dockerfile @@ -27,9 +27,7 @@ FROM registry.access.redhat.com/ubi9/nodejs-20-minimal:latest USER root # Install dependencies for logging and development -RUN microdnf install -y logrotate g++ make && microdnf clean all - -COPY logrotate.conf /etc/logrotate.d/iofog-controller +RUN microdnf install -y g++ make && microdnf clean all # Install Python and pip RUN microdnf install -y python3 && \ diff --git a/docs/swagger.yaml b/docs/swagger.yaml index c0f0cfc52..93ce06d67 100755 --- a/docs/swagger.yaml +++ b/docs/swagger.yaml @@ -3191,9 +3191,9 @@ components: scheme: bearer bearerFormat: JWT agentToken: - type: apiKey - in: header - name: Authorization + type: http + scheme: bearer + bearerFormat: JWT requestBodies: UpdateIOFogNodeRequestBody: content: diff --git a/package-lock.json b/package-lock.json index 52b827352..cbfa99ded 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,16 +1,22 @@ { "name": "@datasance/iofogcontroller", - "version": "3.4.11", + "version": "3.5.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@datasance/iofogcontroller", - "version": "3.4.11", + "version": "3.5.0", "hasInstallScript": true, "license": "EPL-2.0", "dependencies": { - "@datasance/ecn-viewer": "0.4.4", + "@datasance/ecn-viewer": "0.5.3", + "@opentelemetry/api": "^1.9.0", + "@opentelemetry/exporter-trace-otlp-http": "^0.200.0", + "@opentelemetry/instrumentation-express": "^0.48.1", + "@opentelemetry/instrumentation-http": "^0.200.0", + "@opentelemetry/resources": "^1.8.0", + "@opentelemetry/sdk-node": "^0.200.0", "axios": "1.8.4", "body-parser": "^1.20.3", "child_process": "1.0.2", @@ -20,6 +26,7 @@ "cookie-parser": "1.4.7", "cors": "2.8.5", "daemonize2": "0.4.2", + "dotenv": "^16.5.0", "ejs": "3.1.10", "express": "4.21.2", "express-session": "1.18.1", @@ -29,6 +36,7 @@ "helmet": "7.1.0", "https": "1.0.0", "is-elevated": "3.0.0", + "jose": "^4.15.9", "js-yaml": "4.1.0", "jsonschema": "1.4.1", "keycloak-connect": "^26.1.1", @@ -40,6 +48,7 @@ "mysql2": "3.10.1", "nconf": "0.12.1", "node-fetch-npm": "^2.0.4", + "node-schedule": "^2.1.1", "os": "0.1.2", "path": "0.12.7", "pg": "8.12.0", @@ -472,9 +481,9 @@ } }, "node_modules/@datasance/ecn-viewer": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/@datasance/ecn-viewer/-/ecn-viewer-0.4.4.tgz", - "integrity": "sha512-n6ZAmPlOMTch1RBAF44QBO6hos//Q2IqNxtLY8D8Q8kuvPTMhVc1X/zWNLjHiHAsjIfmDFBJFYW6d7VhyEc1wg==" + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/@datasance/ecn-viewer/-/ecn-viewer-0.5.3.tgz", + "integrity": "sha512-jjfnn9zPK5OmRVbAOdfaB/jIrKA4w/RsSNK2fbeQeGhq01deJQJXmbHqutdskdyQpJKdwVWpM3mWAIe2nimOCg==" }, "node_modules/@eslint-community/eslint-utils": { "version": "4.4.0", @@ -690,6 +699,89 @@ "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==", "optional": true }, + "node_modules/@grpc/grpc-js": { + "version": "1.13.3", + "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.13.3.tgz", + "integrity": "sha512-FTXHdOoPbZrBjlVLHuKbDZnsTxXv2BlHF57xw6LuThXacXvtkahEPED0CKMk6obZDf65Hv4k3z62eyPNpvinIg==", + "dependencies": { + "@grpc/proto-loader": "^0.7.13", + "@js-sdsl/ordered-map": "^4.4.2" + }, + "engines": { + "node": ">=12.10.0" + } + }, + "node_modules/@grpc/proto-loader": { + "version": "0.7.14", + "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.14.tgz", + "integrity": "sha512-oS0FyK8eGNBJC6aB/qsS4LOxCYQlBniNzp6W8IdjlRVRGs0FOK9dS84OV+kXGaZf8Ozeos8fbUMJUGGzSpOCzQ==", + "dependencies": { + "lodash.camelcase": "^4.3.0", + "long": "^5.0.0", + "protobufjs": "^7.2.5", + "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/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/@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/@humanfs/core": { "version": "0.19.1", "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", @@ -840,151 +932,1414 @@ "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, "dependencies": { - "sprintf-js": "~1.0.2" + "sprintf-js": "~1.0.2" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "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/@jridgewell/gen-mapping": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "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.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@js-sdsl/ordered-map": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/@js-sdsl/ordered-map/-/ordered-map-4.4.2.tgz", + "integrity": "sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/js-sdsl" + } + }, + "node_modules/@one-ini/wasm": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@one-ini/wasm/-/wasm-0.1.1.tgz", + "integrity": "sha512-XuySG1E38YScSJoMlqovLru4KTUNSjgVTIjyh7qMX6aNN5HY5Ct5LhRJdxO79JtTzKfzV/bnWpz+zquYrISsvw==", + "dev": true + }, + "node_modules/@opentelemetry/api": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.0.tgz", + "integrity": "sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@opentelemetry/context-async-hooks": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/context-async-hooks/-/context-async-hooks-2.0.0.tgz", + "integrity": "sha512-IEkJGzK1A9v3/EHjXh3s2IiFc6L4jfK+lNgKVgUjeUJQRRhnVFMIO3TAvKwonm9O1HebCuoOt98v8bZW7oVQHA==", + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/core": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.30.1.tgz", + "integrity": "sha512-OOCM2C/QIURhJMuKaekP3TRBxBKxG/TWWA0TL2J6nXUtDnuCtccy49LUJF8xPFXMX+0LMcxFpCo8M9cGY1W6rQ==", + "dependencies": { + "@opentelemetry/semantic-conventions": "1.28.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/core/node_modules/@opentelemetry/semantic-conventions": { + "version": "1.28.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.28.0.tgz", + "integrity": "sha512-lp4qAiMTD4sNWW4DbKLBkfiMZ4jbAboJIGOQr5DvciMRI494OapieI9qiODpOt0XBr1LjIDy1xAGAnVs5supTA==", + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/exporter-logs-otlp-grpc": { + "version": "0.200.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-logs-otlp-grpc/-/exporter-logs-otlp-grpc-0.200.0.tgz", + "integrity": "sha512-+3MDfa5YQPGM3WXxW9kqGD85Q7s9wlEMVNhXXG7tYFLnIeaseUt9YtCeFhEDFzfEktacdFpOtXmJuNW8cHbU5A==", + "dependencies": { + "@grpc/grpc-js": "^1.7.1", + "@opentelemetry/core": "2.0.0", + "@opentelemetry/otlp-exporter-base": "0.200.0", + "@opentelemetry/otlp-grpc-exporter-base": "0.200.0", + "@opentelemetry/otlp-transformer": "0.200.0", + "@opentelemetry/sdk-logs": "0.200.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/exporter-logs-otlp-grpc/node_modules/@opentelemetry/core": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.0.0.tgz", + "integrity": "sha512-SLX36allrcnVaPYG3R78F/UZZsBsvbc7lMCLx37LyH5MJ1KAAZ2E3mW9OAD3zGz0G8q/BtoS5VUrjzDydhD6LQ==", + "dependencies": { + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/exporter-logs-otlp-http": { + "version": "0.200.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-logs-otlp-http/-/exporter-logs-otlp-http-0.200.0.tgz", + "integrity": "sha512-KfWw49htbGGp9s8N4KI8EQ9XuqKJ0VG+yVYVYFiCYSjEV32qpQ5qZ9UZBzOZ6xRb+E16SXOSCT3RkqBVSABZ+g==", + "dependencies": { + "@opentelemetry/api-logs": "0.200.0", + "@opentelemetry/core": "2.0.0", + "@opentelemetry/otlp-exporter-base": "0.200.0", + "@opentelemetry/otlp-transformer": "0.200.0", + "@opentelemetry/sdk-logs": "0.200.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/exporter-logs-otlp-http/node_modules/@opentelemetry/api-logs": { + "version": "0.200.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.200.0.tgz", + "integrity": "sha512-IKJBQxh91qJ+3ssRly5hYEJ8NDHu9oY/B1PXVSCWf7zytmYO9RNLB0Ox9XQ/fJ8m6gY6Q6NtBWlmXfaXt5Uc4Q==", + "dependencies": { + "@opentelemetry/api": "^1.3.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@opentelemetry/exporter-logs-otlp-http/node_modules/@opentelemetry/core": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.0.0.tgz", + "integrity": "sha512-SLX36allrcnVaPYG3R78F/UZZsBsvbc7lMCLx37LyH5MJ1KAAZ2E3mW9OAD3zGz0G8q/BtoS5VUrjzDydhD6LQ==", + "dependencies": { + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/exporter-logs-otlp-proto": { + "version": "0.200.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-logs-otlp-proto/-/exporter-logs-otlp-proto-0.200.0.tgz", + "integrity": "sha512-GmahpUU/55hxfH4TP77ChOfftADsCq/nuri73I/AVLe2s4NIglvTsaACkFVZAVmnXXyPS00Fk3x27WS3yO07zA==", + "dependencies": { + "@opentelemetry/api-logs": "0.200.0", + "@opentelemetry/core": "2.0.0", + "@opentelemetry/otlp-exporter-base": "0.200.0", + "@opentelemetry/otlp-transformer": "0.200.0", + "@opentelemetry/resources": "2.0.0", + "@opentelemetry/sdk-logs": "0.200.0", + "@opentelemetry/sdk-trace-base": "2.0.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/exporter-logs-otlp-proto/node_modules/@opentelemetry/api-logs": { + "version": "0.200.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.200.0.tgz", + "integrity": "sha512-IKJBQxh91qJ+3ssRly5hYEJ8NDHu9oY/B1PXVSCWf7zytmYO9RNLB0Ox9XQ/fJ8m6gY6Q6NtBWlmXfaXt5Uc4Q==", + "dependencies": { + "@opentelemetry/api": "^1.3.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@opentelemetry/exporter-logs-otlp-proto/node_modules/@opentelemetry/core": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.0.0.tgz", + "integrity": "sha512-SLX36allrcnVaPYG3R78F/UZZsBsvbc7lMCLx37LyH5MJ1KAAZ2E3mW9OAD3zGz0G8q/BtoS5VUrjzDydhD6LQ==", + "dependencies": { + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/exporter-logs-otlp-proto/node_modules/@opentelemetry/resources": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.0.0.tgz", + "integrity": "sha512-rnZr6dML2z4IARI4zPGQV4arDikF/9OXZQzrC01dLmn0CZxU5U5OLd/m1T7YkGRj5UitjeoCtg/zorlgMQcdTg==", + "dependencies": { + "@opentelemetry/core": "2.0.0", + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.3.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/exporter-metrics-otlp-grpc": { + "version": "0.200.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-metrics-otlp-grpc/-/exporter-metrics-otlp-grpc-0.200.0.tgz", + "integrity": "sha512-uHawPRvKIrhqH09GloTuYeq2BjyieYHIpiklOvxm9zhrCL2eRsnI/6g9v2BZTVtGp8tEgIa7rCQ6Ltxw6NBgew==", + "dependencies": { + "@grpc/grpc-js": "^1.7.1", + "@opentelemetry/core": "2.0.0", + "@opentelemetry/exporter-metrics-otlp-http": "0.200.0", + "@opentelemetry/otlp-exporter-base": "0.200.0", + "@opentelemetry/otlp-grpc-exporter-base": "0.200.0", + "@opentelemetry/otlp-transformer": "0.200.0", + "@opentelemetry/resources": "2.0.0", + "@opentelemetry/sdk-metrics": "2.0.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/exporter-metrics-otlp-grpc/node_modules/@opentelemetry/core": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.0.0.tgz", + "integrity": "sha512-SLX36allrcnVaPYG3R78F/UZZsBsvbc7lMCLx37LyH5MJ1KAAZ2E3mW9OAD3zGz0G8q/BtoS5VUrjzDydhD6LQ==", + "dependencies": { + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/exporter-metrics-otlp-grpc/node_modules/@opentelemetry/exporter-metrics-otlp-http": { + "version": "0.200.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-metrics-otlp-http/-/exporter-metrics-otlp-http-0.200.0.tgz", + "integrity": "sha512-5BiR6i8yHc9+qW7F6LqkuUnIzVNA7lt0qRxIKcKT+gq3eGUPHZ3DY29sfxI3tkvnwMgtnHDMNze5DdxW39HsAw==", + "dependencies": { + "@opentelemetry/core": "2.0.0", + "@opentelemetry/otlp-exporter-base": "0.200.0", + "@opentelemetry/otlp-transformer": "0.200.0", + "@opentelemetry/resources": "2.0.0", + "@opentelemetry/sdk-metrics": "2.0.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/exporter-metrics-otlp-grpc/node_modules/@opentelemetry/resources": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.0.0.tgz", + "integrity": "sha512-rnZr6dML2z4IARI4zPGQV4arDikF/9OXZQzrC01dLmn0CZxU5U5OLd/m1T7YkGRj5UitjeoCtg/zorlgMQcdTg==", + "dependencies": { + "@opentelemetry/core": "2.0.0", + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.3.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/exporter-metrics-otlp-grpc/node_modules/@opentelemetry/sdk-metrics": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-2.0.0.tgz", + "integrity": "sha512-Bvy8QDjO05umd0+j+gDeWcTaVa1/R2lDj/eOvjzpm8VQj1K1vVZJuyjThpV5/lSHyYW2JaHF2IQ7Z8twJFAhjA==", + "dependencies": { + "@opentelemetry/core": "2.0.0", + "@opentelemetry/resources": "2.0.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.9.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/exporter-metrics-otlp-proto": { + "version": "0.200.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-metrics-otlp-proto/-/exporter-metrics-otlp-proto-0.200.0.tgz", + "integrity": "sha512-E+uPj0yyvz81U9pvLZp3oHtFrEzNSqKGVkIViTQY1rH3TOobeJPSpLnTVXACnCwkPR5XeTvPnK3pZ2Kni8AFMg==", + "dependencies": { + "@opentelemetry/core": "2.0.0", + "@opentelemetry/exporter-metrics-otlp-http": "0.200.0", + "@opentelemetry/otlp-exporter-base": "0.200.0", + "@opentelemetry/otlp-transformer": "0.200.0", + "@opentelemetry/resources": "2.0.0", + "@opentelemetry/sdk-metrics": "2.0.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/exporter-metrics-otlp-proto/node_modules/@opentelemetry/core": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.0.0.tgz", + "integrity": "sha512-SLX36allrcnVaPYG3R78F/UZZsBsvbc7lMCLx37LyH5MJ1KAAZ2E3mW9OAD3zGz0G8q/BtoS5VUrjzDydhD6LQ==", + "dependencies": { + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/exporter-metrics-otlp-proto/node_modules/@opentelemetry/exporter-metrics-otlp-http": { + "version": "0.200.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-metrics-otlp-http/-/exporter-metrics-otlp-http-0.200.0.tgz", + "integrity": "sha512-5BiR6i8yHc9+qW7F6LqkuUnIzVNA7lt0qRxIKcKT+gq3eGUPHZ3DY29sfxI3tkvnwMgtnHDMNze5DdxW39HsAw==", + "dependencies": { + "@opentelemetry/core": "2.0.0", + "@opentelemetry/otlp-exporter-base": "0.200.0", + "@opentelemetry/otlp-transformer": "0.200.0", + "@opentelemetry/resources": "2.0.0", + "@opentelemetry/sdk-metrics": "2.0.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/exporter-metrics-otlp-proto/node_modules/@opentelemetry/resources": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.0.0.tgz", + "integrity": "sha512-rnZr6dML2z4IARI4zPGQV4arDikF/9OXZQzrC01dLmn0CZxU5U5OLd/m1T7YkGRj5UitjeoCtg/zorlgMQcdTg==", + "dependencies": { + "@opentelemetry/core": "2.0.0", + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.3.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/exporter-metrics-otlp-proto/node_modules/@opentelemetry/sdk-metrics": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-2.0.0.tgz", + "integrity": "sha512-Bvy8QDjO05umd0+j+gDeWcTaVa1/R2lDj/eOvjzpm8VQj1K1vVZJuyjThpV5/lSHyYW2JaHF2IQ7Z8twJFAhjA==", + "dependencies": { + "@opentelemetry/core": "2.0.0", + "@opentelemetry/resources": "2.0.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.9.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/exporter-prometheus": { + "version": "0.200.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-prometheus/-/exporter-prometheus-0.200.0.tgz", + "integrity": "sha512-ZYdlU9r0USuuYppiDyU2VFRA0kFl855ylnb3N/2aOlXrbA4PMCznen7gmPbetGQu7pz8Jbaf4fwvrDnVdQQXSw==", + "dependencies": { + "@opentelemetry/core": "2.0.0", + "@opentelemetry/resources": "2.0.0", + "@opentelemetry/sdk-metrics": "2.0.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/exporter-prometheus/node_modules/@opentelemetry/core": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.0.0.tgz", + "integrity": "sha512-SLX36allrcnVaPYG3R78F/UZZsBsvbc7lMCLx37LyH5MJ1KAAZ2E3mW9OAD3zGz0G8q/BtoS5VUrjzDydhD6LQ==", + "dependencies": { + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/exporter-prometheus/node_modules/@opentelemetry/resources": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.0.0.tgz", + "integrity": "sha512-rnZr6dML2z4IARI4zPGQV4arDikF/9OXZQzrC01dLmn0CZxU5U5OLd/m1T7YkGRj5UitjeoCtg/zorlgMQcdTg==", + "dependencies": { + "@opentelemetry/core": "2.0.0", + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.3.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/exporter-prometheus/node_modules/@opentelemetry/sdk-metrics": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-2.0.0.tgz", + "integrity": "sha512-Bvy8QDjO05umd0+j+gDeWcTaVa1/R2lDj/eOvjzpm8VQj1K1vVZJuyjThpV5/lSHyYW2JaHF2IQ7Z8twJFAhjA==", + "dependencies": { + "@opentelemetry/core": "2.0.0", + "@opentelemetry/resources": "2.0.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.9.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/exporter-trace-otlp-grpc": { + "version": "0.200.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-grpc/-/exporter-trace-otlp-grpc-0.200.0.tgz", + "integrity": "sha512-hmeZrUkFl1YMsgukSuHCFPYeF9df0hHoKeHUthRKFCxiURs+GwF1VuabuHmBMZnjTbsuvNjOB+JSs37Csem/5Q==", + "dependencies": { + "@grpc/grpc-js": "^1.7.1", + "@opentelemetry/core": "2.0.0", + "@opentelemetry/otlp-exporter-base": "0.200.0", + "@opentelemetry/otlp-grpc-exporter-base": "0.200.0", + "@opentelemetry/otlp-transformer": "0.200.0", + "@opentelemetry/resources": "2.0.0", + "@opentelemetry/sdk-trace-base": "2.0.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/exporter-trace-otlp-grpc/node_modules/@opentelemetry/core": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.0.0.tgz", + "integrity": "sha512-SLX36allrcnVaPYG3R78F/UZZsBsvbc7lMCLx37LyH5MJ1KAAZ2E3mW9OAD3zGz0G8q/BtoS5VUrjzDydhD6LQ==", + "dependencies": { + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/exporter-trace-otlp-grpc/node_modules/@opentelemetry/resources": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.0.0.tgz", + "integrity": "sha512-rnZr6dML2z4IARI4zPGQV4arDikF/9OXZQzrC01dLmn0CZxU5U5OLd/m1T7YkGRj5UitjeoCtg/zorlgMQcdTg==", + "dependencies": { + "@opentelemetry/core": "2.0.0", + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.3.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/exporter-trace-otlp-http": { + "version": "0.200.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-http/-/exporter-trace-otlp-http-0.200.0.tgz", + "integrity": "sha512-Goi//m/7ZHeUedxTGVmEzH19NgqJY+Bzr6zXo1Rni1+hwqaksEyJ44gdlEMREu6dzX1DlAaH/qSykSVzdrdafA==", + "dependencies": { + "@opentelemetry/core": "2.0.0", + "@opentelemetry/otlp-exporter-base": "0.200.0", + "@opentelemetry/otlp-transformer": "0.200.0", + "@opentelemetry/resources": "2.0.0", + "@opentelemetry/sdk-trace-base": "2.0.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/exporter-trace-otlp-http/node_modules/@opentelemetry/core": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.0.0.tgz", + "integrity": "sha512-SLX36allrcnVaPYG3R78F/UZZsBsvbc7lMCLx37LyH5MJ1KAAZ2E3mW9OAD3zGz0G8q/BtoS5VUrjzDydhD6LQ==", + "dependencies": { + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/exporter-trace-otlp-http/node_modules/@opentelemetry/resources": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.0.0.tgz", + "integrity": "sha512-rnZr6dML2z4IARI4zPGQV4arDikF/9OXZQzrC01dLmn0CZxU5U5OLd/m1T7YkGRj5UitjeoCtg/zorlgMQcdTg==", + "dependencies": { + "@opentelemetry/core": "2.0.0", + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.3.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/exporter-trace-otlp-proto": { + "version": "0.200.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-proto/-/exporter-trace-otlp-proto-0.200.0.tgz", + "integrity": "sha512-V9TDSD3PjK1OREw2iT9TUTzNYEVWJk4Nhodzhp9eiz4onDMYmPy3LaGbPv81yIR6dUb/hNp/SIhpiCHwFUq2Vg==", + "dependencies": { + "@opentelemetry/core": "2.0.0", + "@opentelemetry/otlp-exporter-base": "0.200.0", + "@opentelemetry/otlp-transformer": "0.200.0", + "@opentelemetry/resources": "2.0.0", + "@opentelemetry/sdk-trace-base": "2.0.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/exporter-trace-otlp-proto/node_modules/@opentelemetry/core": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.0.0.tgz", + "integrity": "sha512-SLX36allrcnVaPYG3R78F/UZZsBsvbc7lMCLx37LyH5MJ1KAAZ2E3mW9OAD3zGz0G8q/BtoS5VUrjzDydhD6LQ==", + "dependencies": { + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/exporter-trace-otlp-proto/node_modules/@opentelemetry/resources": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.0.0.tgz", + "integrity": "sha512-rnZr6dML2z4IARI4zPGQV4arDikF/9OXZQzrC01dLmn0CZxU5U5OLd/m1T7YkGRj5UitjeoCtg/zorlgMQcdTg==", + "dependencies": { + "@opentelemetry/core": "2.0.0", + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.3.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/exporter-zipkin": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-zipkin/-/exporter-zipkin-2.0.0.tgz", + "integrity": "sha512-icxaKZ+jZL/NHXX8Aru4HGsrdhK0MLcuRXkX5G5IRmCgoRLw+Br6I/nMVozX2xjGGwV7hw2g+4Slj8K7s4HbVg==", + "dependencies": { + "@opentelemetry/core": "2.0.0", + "@opentelemetry/resources": "2.0.0", + "@opentelemetry/sdk-trace-base": "2.0.0", + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, + "node_modules/@opentelemetry/exporter-zipkin/node_modules/@opentelemetry/core": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.0.0.tgz", + "integrity": "sha512-SLX36allrcnVaPYG3R78F/UZZsBsvbc7lMCLx37LyH5MJ1KAAZ2E3mW9OAD3zGz0G8q/BtoS5VUrjzDydhD6LQ==", + "dependencies": { + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/exporter-zipkin/node_modules/@opentelemetry/resources": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.0.0.tgz", + "integrity": "sha512-rnZr6dML2z4IARI4zPGQV4arDikF/9OXZQzrC01dLmn0CZxU5U5OLd/m1T7YkGRj5UitjeoCtg/zorlgMQcdTg==", + "dependencies": { + "@opentelemetry/core": "2.0.0", + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.3.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/instrumentation-express": { + "version": "0.48.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-express/-/instrumentation-express-0.48.1.tgz", + "integrity": "sha512-j8NYOf9DRWtchbWor/zA0poI42TpZG9tViIKA0e1lC+6MshTqSJYtgNv8Fn1sx1Wn/TRyp+5OgSXiE4LDfvpEg==", + "dependencies": { + "@opentelemetry/core": "^2.0.0", + "@opentelemetry/instrumentation": "^0.200.0", + "@opentelemetry/semantic-conventions": "^1.27.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-express/node_modules/@opentelemetry/api-logs": { + "version": "0.200.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.200.0.tgz", + "integrity": "sha512-IKJBQxh91qJ+3ssRly5hYEJ8NDHu9oY/B1PXVSCWf7zytmYO9RNLB0Ox9XQ/fJ8m6gY6Q6NtBWlmXfaXt5Uc4Q==", + "dependencies": { + "@opentelemetry/api": "^1.3.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@opentelemetry/instrumentation-express/node_modules/@opentelemetry/core": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.0.0.tgz", + "integrity": "sha512-SLX36allrcnVaPYG3R78F/UZZsBsvbc7lMCLx37LyH5MJ1KAAZ2E3mW9OAD3zGz0G8q/BtoS5VUrjzDydhD6LQ==", + "dependencies": { + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/instrumentation-express/node_modules/@opentelemetry/instrumentation": { + "version": "0.200.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.200.0.tgz", + "integrity": "sha512-pmPlzfJd+vvgaZd/reMsC8RWgTXn2WY1OWT5RT42m3aOn5532TozwXNDhg1vzqJ+jnvmkREcdLr27ebJEQt0Jg==", + "dependencies": { + "@opentelemetry/api-logs": "0.200.0", + "@types/shimmer": "^1.2.0", + "import-in-the-middle": "^1.8.1", + "require-in-the-middle": "^7.1.1", + "shimmer": "^1.2.1" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-express/node_modules/acorn": { + "version": "8.14.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz", + "integrity": "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/@opentelemetry/instrumentation-express/node_modules/import-in-the-middle": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-1.13.1.tgz", + "integrity": "sha512-k2V9wNm9B+ysuelDTHjI9d5KPc4l8zAZTGqj+pcynvWkypZd857ryzN8jNC7Pg2YZXNMJcHRPpaDyCBbNyVRpA==", + "dependencies": { + "acorn": "^8.14.0", + "acorn-import-attributes": "^1.9.5", + "cjs-module-lexer": "^1.2.2", + "module-details-from-path": "^1.0.3" + } + }, + "node_modules/@opentelemetry/instrumentation-http": { + "version": "0.200.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-http/-/instrumentation-http-0.200.0.tgz", + "integrity": "sha512-9tqGbCJikhYU68y3k9mi6yWsMyMeCcwoQuHvIXan5VvvPPQ5WIZaV6Mxu/MCVe4swRNoFs8Th+qyj0TZV5ELvw==", + "dependencies": { + "@opentelemetry/core": "2.0.0", + "@opentelemetry/instrumentation": "0.200.0", + "@opentelemetry/semantic-conventions": "^1.29.0", + "forwarded-parse": "2.1.2" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-http/node_modules/@opentelemetry/api-logs": { + "version": "0.200.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.200.0.tgz", + "integrity": "sha512-IKJBQxh91qJ+3ssRly5hYEJ8NDHu9oY/B1PXVSCWf7zytmYO9RNLB0Ox9XQ/fJ8m6gY6Q6NtBWlmXfaXt5Uc4Q==", + "dependencies": { + "@opentelemetry/api": "^1.3.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@opentelemetry/instrumentation-http/node_modules/@opentelemetry/core": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.0.0.tgz", + "integrity": "sha512-SLX36allrcnVaPYG3R78F/UZZsBsvbc7lMCLx37LyH5MJ1KAAZ2E3mW9OAD3zGz0G8q/BtoS5VUrjzDydhD6LQ==", + "dependencies": { + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/instrumentation-http/node_modules/@opentelemetry/instrumentation": { + "version": "0.200.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.200.0.tgz", + "integrity": "sha512-pmPlzfJd+vvgaZd/reMsC8RWgTXn2WY1OWT5RT42m3aOn5532TozwXNDhg1vzqJ+jnvmkREcdLr27ebJEQt0Jg==", + "dependencies": { + "@opentelemetry/api-logs": "0.200.0", + "@types/shimmer": "^1.2.0", + "import-in-the-middle": "^1.8.1", + "require-in-the-middle": "^7.1.1", + "shimmer": "^1.2.1" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-http/node_modules/acorn": { + "version": "8.14.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz", + "integrity": "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/@opentelemetry/instrumentation-http/node_modules/import-in-the-middle": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-1.13.1.tgz", + "integrity": "sha512-k2V9wNm9B+ysuelDTHjI9d5KPc4l8zAZTGqj+pcynvWkypZd857ryzN8jNC7Pg2YZXNMJcHRPpaDyCBbNyVRpA==", + "dependencies": { + "acorn": "^8.14.0", + "acorn-import-attributes": "^1.9.5", + "cjs-module-lexer": "^1.2.2", + "module-details-from-path": "^1.0.3" + } + }, + "node_modules/@opentelemetry/otlp-exporter-base": { + "version": "0.200.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-exporter-base/-/otlp-exporter-base-0.200.0.tgz", + "integrity": "sha512-IxJgA3FD7q4V6gGq4bnmQM5nTIyMDkoGFGrBrrDjB6onEiq1pafma55V+bHvGYLWvcqbBbRfezr1GED88lacEQ==", + "dependencies": { + "@opentelemetry/core": "2.0.0", + "@opentelemetry/otlp-transformer": "0.200.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/otlp-exporter-base/node_modules/@opentelemetry/core": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.0.0.tgz", + "integrity": "sha512-SLX36allrcnVaPYG3R78F/UZZsBsvbc7lMCLx37LyH5MJ1KAAZ2E3mW9OAD3zGz0G8q/BtoS5VUrjzDydhD6LQ==", + "dependencies": { + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/otlp-grpc-exporter-base": { + "version": "0.200.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-grpc-exporter-base/-/otlp-grpc-exporter-base-0.200.0.tgz", + "integrity": "sha512-CK2S+bFgOZ66Bsu5hlDeOX6cvW5FVtVjFFbWuaJP0ELxJKBB6HlbLZQ2phqz/uLj1cWap5xJr/PsR3iGoB7Vqw==", + "dependencies": { + "@grpc/grpc-js": "^1.7.1", + "@opentelemetry/core": "2.0.0", + "@opentelemetry/otlp-exporter-base": "0.200.0", + "@opentelemetry/otlp-transformer": "0.200.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/otlp-grpc-exporter-base/node_modules/@opentelemetry/core": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.0.0.tgz", + "integrity": "sha512-SLX36allrcnVaPYG3R78F/UZZsBsvbc7lMCLx37LyH5MJ1KAAZ2E3mW9OAD3zGz0G8q/BtoS5VUrjzDydhD6LQ==", + "dependencies": { + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/otlp-transformer": { + "version": "0.200.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-transformer/-/otlp-transformer-0.200.0.tgz", + "integrity": "sha512-+9YDZbYybOnv7sWzebWOeK6gKyt2XE7iarSyBFkwwnP559pEevKOUD8NyDHhRjCSp13ybh9iVXlMfcj/DwF/yw==", + "dependencies": { + "@opentelemetry/api-logs": "0.200.0", + "@opentelemetry/core": "2.0.0", + "@opentelemetry/resources": "2.0.0", + "@opentelemetry/sdk-logs": "0.200.0", + "@opentelemetry/sdk-metrics": "2.0.0", + "@opentelemetry/sdk-trace-base": "2.0.0", + "protobufjs": "^7.3.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/otlp-transformer/node_modules/@opentelemetry/api-logs": { + "version": "0.200.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.200.0.tgz", + "integrity": "sha512-IKJBQxh91qJ+3ssRly5hYEJ8NDHu9oY/B1PXVSCWf7zytmYO9RNLB0Ox9XQ/fJ8m6gY6Q6NtBWlmXfaXt5Uc4Q==", + "dependencies": { + "@opentelemetry/api": "^1.3.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@opentelemetry/otlp-transformer/node_modules/@opentelemetry/core": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.0.0.tgz", + "integrity": "sha512-SLX36allrcnVaPYG3R78F/UZZsBsvbc7lMCLx37LyH5MJ1KAAZ2E3mW9OAD3zGz0G8q/BtoS5VUrjzDydhD6LQ==", + "dependencies": { + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/otlp-transformer/node_modules/@opentelemetry/resources": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.0.0.tgz", + "integrity": "sha512-rnZr6dML2z4IARI4zPGQV4arDikF/9OXZQzrC01dLmn0CZxU5U5OLd/m1T7YkGRj5UitjeoCtg/zorlgMQcdTg==", + "dependencies": { + "@opentelemetry/core": "2.0.0", + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.3.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/otlp-transformer/node_modules/@opentelemetry/sdk-metrics": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-2.0.0.tgz", + "integrity": "sha512-Bvy8QDjO05umd0+j+gDeWcTaVa1/R2lDj/eOvjzpm8VQj1K1vVZJuyjThpV5/lSHyYW2JaHF2IQ7Z8twJFAhjA==", + "dependencies": { + "@opentelemetry/core": "2.0.0", + "@opentelemetry/resources": "2.0.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.9.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/propagator-b3": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-b3/-/propagator-b3-2.0.0.tgz", + "integrity": "sha512-blx9S2EI49Ycuw6VZq+bkpaIoiJFhsDuvFGhBIoH3vJ5oYjJ2U0s3fAM5jYft99xVIAv6HqoPtlP9gpVA2IZtA==", + "dependencies": { + "@opentelemetry/core": "2.0.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/propagator-b3/node_modules/@opentelemetry/core": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.0.0.tgz", + "integrity": "sha512-SLX36allrcnVaPYG3R78F/UZZsBsvbc7lMCLx37LyH5MJ1KAAZ2E3mW9OAD3zGz0G8q/BtoS5VUrjzDydhD6LQ==", + "dependencies": { + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/propagator-jaeger": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-jaeger/-/propagator-jaeger-2.0.0.tgz", + "integrity": "sha512-Mbm/LSFyAtQKP0AQah4AfGgsD+vsZcyreZoQ5okFBk33hU7AquU4TltgyL9dvaO8/Zkoud8/0gEvwfOZ5d7EPA==", + "dependencies": { + "@opentelemetry/core": "2.0.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/propagator-jaeger/node_modules/@opentelemetry/core": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.0.0.tgz", + "integrity": "sha512-SLX36allrcnVaPYG3R78F/UZZsBsvbc7lMCLx37LyH5MJ1KAAZ2E3mW9OAD3zGz0G8q/BtoS5VUrjzDydhD6LQ==", + "dependencies": { + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/resources": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.30.1.tgz", + "integrity": "sha512-5UxZqiAgLYGFjS4s9qm5mBVo433u+dSPUFWVWXmLAD4wB65oMCoXaJP1KJa9DIYYMeHu3z4BZcStG3LC593cWA==", + "dependencies": { + "@opentelemetry/core": "1.30.1", + "@opentelemetry/semantic-conventions": "1.28.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/resources/node_modules/@opentelemetry/semantic-conventions": { + "version": "1.28.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.28.0.tgz", + "integrity": "sha512-lp4qAiMTD4sNWW4DbKLBkfiMZ4jbAboJIGOQr5DvciMRI494OapieI9qiODpOt0XBr1LjIDy1xAGAnVs5supTA==", + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/sdk-logs": { + "version": "0.200.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-logs/-/sdk-logs-0.200.0.tgz", + "integrity": "sha512-VZG870063NLfObmQQNtCVcdXXLzI3vOjjrRENmU37HYiPFa0ZXpXVDsTD02Nh3AT3xYJzQaWKl2X2lQ2l7TWJA==", + "dependencies": { + "@opentelemetry/api-logs": "0.200.0", + "@opentelemetry/core": "2.0.0", + "@opentelemetry/resources": "2.0.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.4.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/sdk-logs/node_modules/@opentelemetry/api-logs": { + "version": "0.200.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.200.0.tgz", + "integrity": "sha512-IKJBQxh91qJ+3ssRly5hYEJ8NDHu9oY/B1PXVSCWf7zytmYO9RNLB0Ox9XQ/fJ8m6gY6Q6NtBWlmXfaXt5Uc4Q==", + "dependencies": { + "@opentelemetry/api": "^1.3.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@opentelemetry/sdk-logs/node_modules/@opentelemetry/core": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.0.0.tgz", + "integrity": "sha512-SLX36allrcnVaPYG3R78F/UZZsBsvbc7lMCLx37LyH5MJ1KAAZ2E3mW9OAD3zGz0G8q/BtoS5VUrjzDydhD6LQ==", + "dependencies": { + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/sdk-logs/node_modules/@opentelemetry/resources": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.0.0.tgz", + "integrity": "sha512-rnZr6dML2z4IARI4zPGQV4arDikF/9OXZQzrC01dLmn0CZxU5U5OLd/m1T7YkGRj5UitjeoCtg/zorlgMQcdTg==", + "dependencies": { + "@opentelemetry/core": "2.0.0", + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.3.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/sdk-node": { + "version": "0.200.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-node/-/sdk-node-0.200.0.tgz", + "integrity": "sha512-S/YSy9GIswnhYoDor1RusNkmRughipvTCOQrlF1dzI70yQaf68qgf5WMnzUxdlCl3/et/pvaO75xfPfuEmCK5A==", + "dependencies": { + "@opentelemetry/api-logs": "0.200.0", + "@opentelemetry/core": "2.0.0", + "@opentelemetry/exporter-logs-otlp-grpc": "0.200.0", + "@opentelemetry/exporter-logs-otlp-http": "0.200.0", + "@opentelemetry/exporter-logs-otlp-proto": "0.200.0", + "@opentelemetry/exporter-metrics-otlp-grpc": "0.200.0", + "@opentelemetry/exporter-metrics-otlp-http": "0.200.0", + "@opentelemetry/exporter-metrics-otlp-proto": "0.200.0", + "@opentelemetry/exporter-prometheus": "0.200.0", + "@opentelemetry/exporter-trace-otlp-grpc": "0.200.0", + "@opentelemetry/exporter-trace-otlp-http": "0.200.0", + "@opentelemetry/exporter-trace-otlp-proto": "0.200.0", + "@opentelemetry/exporter-zipkin": "2.0.0", + "@opentelemetry/instrumentation": "0.200.0", + "@opentelemetry/propagator-b3": "2.0.0", + "@opentelemetry/propagator-jaeger": "2.0.0", + "@opentelemetry/resources": "2.0.0", + "@opentelemetry/sdk-logs": "0.200.0", + "@opentelemetry/sdk-metrics": "2.0.0", + "@opentelemetry/sdk-trace-base": "2.0.0", + "@opentelemetry/sdk-trace-node": "2.0.0", + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.3.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/sdk-node/node_modules/@opentelemetry/api-logs": { + "version": "0.200.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.200.0.tgz", + "integrity": "sha512-IKJBQxh91qJ+3ssRly5hYEJ8NDHu9oY/B1PXVSCWf7zytmYO9RNLB0Ox9XQ/fJ8m6gY6Q6NtBWlmXfaXt5Uc4Q==", + "dependencies": { + "@opentelemetry/api": "^1.3.0" + }, + "engines": { + "node": ">=8.0.0" } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, + "node_modules/@opentelemetry/sdk-node/node_modules/@opentelemetry/core": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.0.0.tgz", + "integrity": "sha512-SLX36allrcnVaPYG3R78F/UZZsBsvbc7lMCLx37LyH5MJ1KAAZ2E3mW9OAD3zGz0G8q/BtoS5VUrjzDydhD6LQ==", "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" + "@opentelemetry/semantic-conventions": "^1.29.0" }, "engines": { - "node": ">=8" + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, + "node_modules/@opentelemetry/sdk-node/node_modules/@opentelemetry/exporter-metrics-otlp-http": { + "version": "0.200.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-metrics-otlp-http/-/exporter-metrics-otlp-http-0.200.0.tgz", + "integrity": "sha512-5BiR6i8yHc9+qW7F6LqkuUnIzVNA7lt0qRxIKcKT+gq3eGUPHZ3DY29sfxI3tkvnwMgtnHDMNze5DdxW39HsAw==", "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" + "@opentelemetry/core": "2.0.0", + "@opentelemetry/otlp-exporter-base": "0.200.0", + "@opentelemetry/otlp-transformer": "0.200.0", + "@opentelemetry/resources": "2.0.0", + "@opentelemetry/sdk-metrics": "2.0.0" }, - "bin": { - "js-yaml": "bin/js-yaml.js" + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, + "node_modules/@opentelemetry/sdk-node/node_modules/@opentelemetry/instrumentation": { + "version": "0.200.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.200.0.tgz", + "integrity": "sha512-pmPlzfJd+vvgaZd/reMsC8RWgTXn2WY1OWT5RT42m3aOn5532TozwXNDhg1vzqJ+jnvmkREcdLr27ebJEQt0Jg==", "dependencies": { - "p-locate": "^4.1.0" + "@opentelemetry/api-logs": "0.200.0", + "@types/shimmer": "^1.2.0", + "import-in-the-middle": "^1.8.1", + "require-in-the-middle": "^7.1.1", + "shimmer": "^1.2.1" }, "engines": { - "node": ">=8" + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, + "node_modules/@opentelemetry/sdk-node/node_modules/@opentelemetry/resources": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.0.0.tgz", + "integrity": "sha512-rnZr6dML2z4IARI4zPGQV4arDikF/9OXZQzrC01dLmn0CZxU5U5OLd/m1T7YkGRj5UitjeoCtg/zorlgMQcdTg==", "dependencies": { - "p-try": "^2.0.0" + "@opentelemetry/core": "2.0.0", + "@opentelemetry/semantic-conventions": "^1.29.0" }, "engines": { - "node": ">=6" + "node": "^18.19.0 || >=20.6.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "@opentelemetry/api": ">=1.3.0 <1.10.0" } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, + "node_modules/@opentelemetry/sdk-node/node_modules/@opentelemetry/sdk-metrics": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-2.0.0.tgz", + "integrity": "sha512-Bvy8QDjO05umd0+j+gDeWcTaVa1/R2lDj/eOvjzpm8VQj1K1vVZJuyjThpV5/lSHyYW2JaHF2IQ7Z8twJFAhjA==", "dependencies": { - "p-limit": "^2.2.0" + "@opentelemetry/core": "2.0.0", + "@opentelemetry/resources": "2.0.0" }, "engines": { - "node": ">=8" + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.9.0 <1.10.0" } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, + "node_modules/@opentelemetry/sdk-node/node_modules/acorn": { + "version": "8.14.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz", + "integrity": "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==", + "bin": { + "acorn": "bin/acorn" + }, "engines": { - "node": ">=8" + "node": ">=0.4.0" } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true + "node_modules/@opentelemetry/sdk-node/node_modules/import-in-the-middle": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-1.13.1.tgz", + "integrity": "sha512-k2V9wNm9B+ysuelDTHjI9d5KPc4l8zAZTGqj+pcynvWkypZd857ryzN8jNC7Pg2YZXNMJcHRPpaDyCBbNyVRpA==", + "dependencies": { + "acorn": "^8.14.0", + "acorn-import-attributes": "^1.9.5", + "cjs-module-lexer": "^1.2.2", + "module-details-from-path": "^1.0.3" + } }, - "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, + "node_modules/@opentelemetry/sdk-trace-base": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-2.0.0.tgz", + "integrity": "sha512-qQnYdX+ZCkonM7tA5iU4fSRsVxbFGml8jbxOgipRGMFHKaXKHQ30js03rTobYjKjIfnOsZSbHKWF0/0v0OQGfw==", + "dependencies": { + "@opentelemetry/core": "2.0.0", + "@opentelemetry/resources": "2.0.0", + "@opentelemetry/semantic-conventions": "^1.29.0" + }, "engines": { - "node": ">=8" + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.3.0 <1.10.0" } }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", - "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", - "dev": true, + "node_modules/@opentelemetry/sdk-trace-base/node_modules/@opentelemetry/core": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.0.0.tgz", + "integrity": "sha512-SLX36allrcnVaPYG3R78F/UZZsBsvbc7lMCLx37LyH5MJ1KAAZ2E3mW9OAD3zGz0G8q/BtoS5VUrjzDydhD6LQ==", "dependencies": { - "@jridgewell/set-array": "^1.2.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.24" + "@opentelemetry/semantic-conventions": "^1.29.0" }, "engines": { - "node": ">=6.0.0" + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "dev": true, + "node_modules/@opentelemetry/sdk-trace-base/node_modules/@opentelemetry/resources": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.0.0.tgz", + "integrity": "sha512-rnZr6dML2z4IARI4zPGQV4arDikF/9OXZQzrC01dLmn0CZxU5U5OLd/m1T7YkGRj5UitjeoCtg/zorlgMQcdTg==", + "dependencies": { + "@opentelemetry/core": "2.0.0", + "@opentelemetry/semantic-conventions": "^1.29.0" + }, "engines": { - "node": ">=6.0.0" + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.3.0 <1.10.0" } }, - "node_modules/@jridgewell/set-array": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", - "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", - "dev": true, + "node_modules/@opentelemetry/sdk-trace-node": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-node/-/sdk-trace-node-2.0.0.tgz", + "integrity": "sha512-omdilCZozUjQwY3uZRBwbaRMJ3p09l4t187Lsdf0dGMye9WKD4NGcpgZRvqhI1dwcH6og+YXQEtoO9Wx3ykilg==", + "dependencies": { + "@opentelemetry/context-async-hooks": "2.0.0", + "@opentelemetry/core": "2.0.0", + "@opentelemetry/sdk-trace-base": "2.0.0" + }, "engines": { - "node": ">=6.0.0" + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.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.25", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", - "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", - "dev": true, + "node_modules/@opentelemetry/sdk-trace-node/node_modules/@opentelemetry/core": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.0.0.tgz", + "integrity": "sha512-SLX36allrcnVaPYG3R78F/UZZsBsvbc7lMCLx37LyH5MJ1KAAZ2E3mW9OAD3zGz0G8q/BtoS5VUrjzDydhD6LQ==", "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, - "node_modules/@one-ini/wasm": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@one-ini/wasm/-/wasm-0.1.1.tgz", - "integrity": "sha512-XuySG1E38YScSJoMlqovLru4KTUNSjgVTIjyh7qMX6aNN5HY5Ct5LhRJdxO79JtTzKfzV/bnWpz+zquYrISsvw==", - "dev": true + "node_modules/@opentelemetry/semantic-conventions": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.32.0.tgz", + "integrity": "sha512-s0OpmpQFSfMrmedAn9Lhg4KWJELHCU6uU9dtIJ28N8UGhf9Y55im5X8fEzwhwDwiSqN+ZPSNrDJF7ivf/AuRPQ==", + "engines": { + "node": ">=14" + } }, "node_modules/@pkgjs/parseargs": { "version": "0.11.0", @@ -1037,6 +2392,60 @@ "node": "*" } }, + "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/@rushstack/node-core-library": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/@rushstack/node-core-library/-/node-core-library-4.3.0.tgz", @@ -1352,6 +2761,11 @@ "undici-types": "~5.26.4" } }, + "node_modules/@types/shimmer": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@types/shimmer/-/shimmer-1.2.0.tgz", + "integrity": "sha512-UE7oxhQLLd9gub6JKIAhDq06T0F6FnztwMNRvYgjeQSBeMc1ZG/tA47EwfduvkuQS8apbkM/lpLpWsaCeYsXVg==" + }, "node_modules/@types/superagent": { "version": "4.1.13", "resolved": "https://registry.npmjs.org/@types/superagent/-/superagent-4.1.13.tgz", @@ -1409,7 +2823,6 @@ "version": "8.11.3", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", - "dev": true, "bin": { "acorn": "bin/acorn" }, @@ -1417,6 +2830,14 @@ "node": ">=0.4.0" } }, + "node_modules/acorn-import-attributes": { + "version": "1.9.5", + "resolved": "https://registry.npmjs.org/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz", + "integrity": "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==", + "peerDependencies": { + "acorn": "^8" + } + }, "node_modules/acorn-jsx": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", @@ -2544,6 +3965,11 @@ "deprecated": "CircularJSON is in maintenance only, flatted is its successor.", "dev": true }, + "node_modules/cjs-module-lexer": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.3.tgz", + "integrity": "sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==" + }, "node_modules/clean-stack": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", @@ -2928,6 +4354,17 @@ "node": ">= 0.10" } }, + "node_modules/cron-parser": { + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/cron-parser/-/cron-parser-4.9.0.tgz", + "integrity": "sha512-p0SaNjrHOnQeR8/VnfGbmg9te2kfyYSQ7Sc/j/6DtPL3JQvKxmjO9TSjNFpujqV3vEYYBvNNvXSxzyksBWAx1Q==", + "dependencies": { + "luxon": "^3.2.1" + }, + "engines": { + "node": ">=12.0.0" + } + }, "node_modules/cross-spawn": { "version": "7.0.6", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", @@ -3338,6 +4775,17 @@ "node": ">=0.10.0" } }, + "node_modules/dotenv": { + "version": "16.5.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.5.0.tgz", + "integrity": "sha512-m/C+AwOAr9/W1UOIZUo232ejMNnJAJtYQjUbHoNTBNTJSvqzzDh7vnrei3o3r3m9blf6ZoDkvcw0VmozNRFJxg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, "node_modules/dottie": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/dottie/-/dottie-2.0.6.tgz", @@ -4830,6 +6278,11 @@ "node": ">= 0.6" } }, + "node_modules/forwarded-parse": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/forwarded-parse/-/forwarded-parse-2.1.2.tgz", + "integrity": "sha512-alTFZZQDKMporBH77856pXgzhEzaUVmLCDk+egLgIgHst3Tpndzz8MnKe+GzRJRfvVdn69HhpW7cmXzvtLvJAw==" + }, "node_modules/fresh": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", @@ -6603,10 +8056,9 @@ "integrity": "sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==" }, "node_modules/jose": { - "version": "5.6.3", - "resolved": "https://registry.npmjs.org/jose/-/jose-5.6.3.tgz", - "integrity": "sha512-1Jh//hEEwMhNYPDDLwXHa2ePWgWiFNNUadVmguAAw2IJ6sj9mNxV5tGXJNqlMkJAybF6Lgw1mISDxTePP/187g==", - "dev": true, + "version": "4.15.9", + "resolved": "https://registry.npmjs.org/jose/-/jose-4.15.9.tgz", + "integrity": "sha512-1vUQX+IdDMVPj4k8kOxgUqlcK518yluMuGZwqlr44FS1ppZB/5GWh4rZG89erpOBOJjU/OBsnCVFfapsRz6nEA==", "funding": { "url": "https://github.com/sponsors/panva" } @@ -7066,6 +8518,11 @@ "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz", "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==" }, + "node_modules/long-timeout": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/long-timeout/-/long-timeout-0.1.1.tgz", + "integrity": "sha512-BFRuQUqc7x2NWxfJBCyUrN8iYUYznzL9JROmRz1gZ6KlOIgmoD+njPVbb+VNn2nGMKggMsK79iUNErillsrx7w==" + }, "node_modules/loose-envify": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", @@ -7104,6 +8561,14 @@ "es5-ext": "~0.10.2" } }, + "node_modules/luxon": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.6.1.tgz", + "integrity": "sha512-tJLxrKJhO2ukZ5z0gyjY1zPh3Rh88Ej9P7jNrZiHMUXHae1yvI2imgOZtL1TO8TW6biMMKfTtAOoEJANgtWBMQ==", + "engines": { + "node": ">=12" + } + }, "node_modules/make-dir": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", @@ -7559,6 +9024,11 @@ "url": "https://github.com/chalk/supports-color?sponsor=1" } }, + "node_modules/module-details-from-path": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/module-details-from-path/-/module-details-from-path-1.0.3.tgz", + "integrity": "sha512-ySViT69/76t8VhE1xXHK6Ch4NcDd26gx0MzKXLO+F7NOtnqH68d9zF94nT8ZWSxXh8ELOERsnJO/sWt1xZYw5A==" + }, "node_modules/moment": { "version": "2.30.1", "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz", @@ -7904,6 +9374,19 @@ "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", "dev": true }, + "node_modules/node-schedule": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/node-schedule/-/node-schedule-2.1.1.tgz", + "integrity": "sha512-OXdegQq03OmXEjt2hZP33W2YPs/E5BcFQks46+G2gAxs4gHOIVD1u7EqlYLYSKsaIpyKCK9Gbk0ta1/gjRSMRQ==", + "dependencies": { + "cron-parser": "^4.2.0", + "long-timeout": "0.1.1", + "sorted-array-functions": "^1.3.0" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", @@ -9242,6 +10725,15 @@ "node": ">=16" } }, + "node_modules/postman-runtime/node_modules/jose": { + "version": "5.6.3", + "resolved": "https://registry.npmjs.org/jose/-/jose-5.6.3.tgz", + "integrity": "sha512-1Jh//hEEwMhNYPDDLwXHa2ePWgWiFNNUadVmguAAw2IJ6sj9mNxV5tGXJNqlMkJAybF6Lgw1mISDxTePP/187g==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/panva" + } + }, "node_modules/postman-sandbox": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/postman-sandbox/-/postman-sandbox-5.1.1.tgz", @@ -9407,6 +10899,29 @@ "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==", "dev": true }, + "node_modules/protobufjs": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.5.0.tgz", + "integrity": "sha512-Z2E/kOY1QjoMlCytmexzYfDm/w5fKAiRwpSzGtdnXW1zC88Z2yXazHHrOtwCzn+7wSxyE8PYM4rvVcMphF9sOA==", + "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/proxy-addr": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", @@ -9924,6 +11439,40 @@ "node": ">=0.10.0" } }, + "node_modules/require-in-the-middle": { + "version": "7.5.2", + "resolved": "https://registry.npmjs.org/require-in-the-middle/-/require-in-the-middle-7.5.2.tgz", + "integrity": "sha512-gAZ+kLqBdHarXB64XpAe2VCjB7rIRv+mU8tfRWziHRJ5umKsIHN2tLLv6EtMw7WCdP19S0ERVMldNvxYCHnhSQ==", + "dependencies": { + "debug": "^4.3.5", + "module-details-from-path": "^1.0.3", + "resolve": "^1.22.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/require-in-the-middle/node_modules/debug": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/require-in-the-middle/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/require-main-filename": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", @@ -10500,6 +12049,11 @@ "node": ">=8" } }, + "node_modules/shimmer": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/shimmer/-/shimmer-1.2.1.tgz", + "integrity": "sha512-sQTKC1Re/rM6XyFM6fIAGHRPVGvyXfgzIDvzoq608vM+jeyVD0Tu1E6Np0Kc2zAIFWIj963V2800iF/9LPieQw==" + }, "node_modules/side-channel": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", @@ -10663,6 +12217,11 @@ "atomic-sleep": "^1.0.0" } }, + "node_modules/sorted-array-functions": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/sorted-array-functions/-/sorted-array-functions-1.3.0.tgz", + "integrity": "sha512-2sqgzeFlid6N4Z2fUQ1cvFmTOLRi/sEDzSQ0OKYchqgoPmQBVyM3959qYx3fpS6Esef80KjmpgPeEr028dP3OA==" + }, "node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", diff --git a/package.json b/package.json index 271cb8719..4b6212bbc 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@datasance/iofogcontroller", - "version": "3.4.11", + "version": "3.5.0", "description": "ioFog Controller project for Eclipse IoFog @ iofog.org \\nCopyright (c) 2023 Datasance Teknoloji A.S.", "main": "./src/main.js", "author": "Emirhan Durmus", @@ -55,7 +55,7 @@ "iofog-controller": "src/main.js" }, "dependencies": { - "@datasance/ecn-viewer": "0.4.4", + "@datasance/ecn-viewer": "0.5.3", "axios": "1.8.4", "body-parser": "^1.20.3", "child_process": "1.0.2", @@ -65,6 +65,7 @@ "cookie-parser": "1.4.7", "cors": "2.8.5", "daemonize2": "0.4.2", + "dotenv": "^16.5.0", "ejs": "3.1.10", "express": "4.21.2", "express-session": "1.18.1", @@ -74,6 +75,7 @@ "helmet": "7.1.0", "https": "1.0.0", "is-elevated": "3.0.0", + "jose": "^4.15.9", "js-yaml": "4.1.0", "jsonschema": "1.4.1", "keycloak-connect": "^26.1.1", @@ -85,6 +87,7 @@ "mysql2": "3.10.1", "nconf": "0.12.1", "node-fetch-npm": "^2.0.4", + "node-schedule": "^2.1.1", "os": "0.1.2", "path": "0.12.7", "pg": "8.12.0", @@ -98,7 +101,13 @@ "string-format": "2.0.0", "umzug": "^3.7.0", "underscore": "1.13.6", - "xss-clean": "0.1.1" + "xss-clean": "0.1.1", + "@opentelemetry/api": "^1.9.0", + "@opentelemetry/resources": "^1.8.0", + "@opentelemetry/sdk-node": "^0.200.0", + "@opentelemetry/exporter-trace-otlp-http": "^0.200.0", + "@opentelemetry/instrumentation-http": "^0.200.0", + "@opentelemetry/instrumentation-express": "^0.48.1" }, "devDependencies": { "acorn": "8.11.3", @@ -127,5 +136,6 @@ ".eslintrc.js", ".jshintrc", ".snyk" - ] + ], + "type": "commonjs" } diff --git a/scripts/postinstall.js b/scripts/postinstall.js index 9884ab3b2..851c00621 100644 --- a/scripts/postinstall.js +++ b/scripts/postinstall.js @@ -168,7 +168,7 @@ function updateEncryptionMethod () { function updateLogName () { console.log(' updating log name in ') - const dirname = config.get('Service:LogsDirectory') + const dirname = config.get('log.directory') if (fs.existsSync(dirname)) { fs.readdirSync(dirname).forEach((file) => { diff --git a/scripts/start-dev.js b/scripts/start-dev.js index 3f852f468..996af7f9a 100644 --- a/scripts/start-dev.js +++ b/scripts/start-dev.js @@ -12,21 +12,43 @@ */ const execSync = require('child_process').execSync - +const path = require('path') +const fs = require('fs') const { setDbEnvVars } = require('./util') function startDev () { + // Load .env file if it exists + const envPath = path.resolve(process.cwd(), '.env') + let envVars = {} + + if (fs.existsSync(envPath)) { + const envContent = fs.readFileSync(envPath, 'utf8') + envContent.split('\n').forEach(line => { + line = line.trim() + if (line && !line.startsWith('#')) { + const [key, value] = line.split('=').map(str => str.trim()) + if (key && value) { + envVars[key] = value + } + } + }) + } else { + } + + // Create a new environment object with all variables + const newEnv = { + ...process.env, // Include existing environment variables + ...envVars, // Override with .env variables + 'NODE_ENV': 'development', + 'PATH': process.env.PATH + } + + // Apply database environment variables const options = { - env: { - 'NODE_ENV': 'development', - 'VIEWER_PORT': '8008', - 'PATH': process.env.PATH - }, + env: setDbEnvVars(newEnv), stdio: [process.stdin, process.stdout, process.stderr] } - options.env = setDbEnvVars(options.env) - execSync('node ./src/main.js start', options) } diff --git a/src/cli/config.js b/src/cli/config.js index 3c5af3cd9..6492c4b09 100644 --- a/src/cli/config.js +++ b/src/cli/config.js @@ -142,59 +142,59 @@ const _executeCase = async function (catalogCommand, commandName, f) { const _addConfigOption = async function (options) { await Validator.validate(options, Validator.schemas.configUpdate) - await updateConfig(options.port, 'port', 'Server:Port', async (onSuccess) => { + await updateConfig(options.port, 'port', 'server.port', async (onSuccess) => { const port = options.port const status = await AppHelper.checkPortAvailability(port) if (status === 'closed') { - config.set('Server:Port', port) + config.set('server.port', port) onSuccess() } else { logger.error(AppHelper.formatMessage(ErrorMessages.PORT_NOT_AVAILABLE, port)) } }) - await updateConfig(options.sslCert, 'ssl-cert', 'Server:SslCert', (onSuccess) => { + await updateConfig(options.sslCert, 'ssl-cert', 'server.ssl.path.cert', (onSuccess) => { const sslCert = options.sslCert if (!AppHelper.isFileExists(sslCert)) { logger.error(ErrorMessages.INVALID_FILE_PATH) return } - config.set('Server:SslCert', sslCert) + config.set('server.ssl.path.cert', sslCert) onSuccess() }) - await updateConfig(options.sslKey, 'ssl-key', 'Server:SslKey', (onSuccess) => { + await updateConfig(options.sslKey, 'ssl-key', 'server.ssl.path.key', (onSuccess) => { const sslKey = options.sslKey if (!AppHelper.isFileExists(sslKey)) { logger.error(ErrorMessages.INVALID_FILE_PATH) return } - config.set('Server:SslKey', sslKey) + config.set('server.ssl.path.key', sslKey) onSuccess() }) - await updateConfig(options.intermediateCert, 'intermediate-cert', 'Server:IntermediateCert', (onSuccess) => { + await updateConfig(options.intermediateCert, 'intermediate-cert', 'server.ssl.path.intermediateCert', (onSuccess) => { const intermediateCert = options.intermediateCert if (!AppHelper.isFileExists(intermediateCert)) { logger.error(ErrorMessages.INVALID_FILE_PATH) return } - config.set('Server:IntermediateCert', intermediateCert) + config.set('server.ssl.path.intermediateCert', intermediateCert) onSuccess() }) - await updateConfig(options.logDir, 'log-dir', 'Service:LogsDirectory', (onSuccess) => { - config.set('Service:LogsDirectory', options.logDir) + await updateConfig(options.logDir, 'log-dir', 'log.directory', (onSuccess) => { + config.set('log.directory', options.logDir) onSuccess() }) - await updateConfig(options.logSize, 'log-size', 'Service:LogsFileSize', (onSuccess) => { - config.set('Service:LogsFileSize', options.logSize * 1024) + await updateConfig(options.logSize, 'log-size', 'log.fileSize', (onSuccess) => { + config.set('log.fileSize', options.logSize * 1024) onSuccess() }) - await updateConfig(options.logSize, 'log-file-counr', 'Service:LogsFileCount', (onSuccess) => { - config.set('Service:LogsFileCount', options.logFileCount) + await updateConfig(options.logFileCount, 'log-file-count', 'log.fileCount', (onSuccess) => { + config.set('log.fileCount', options.logFileCount) onSuccess() }) } @@ -215,14 +215,14 @@ const updateConfig = async function (newConfigValue, cliConfigName, configName, const _listConfigOptions = function () { const configuration = { - 'Port': config.get('Server:Port'), - 'SSL key directory': config.get('Server:SslKey'), - 'SSL certificate directory': config.get('Server:SslCert'), - 'Intermediate key directory': config.get('Server:IntermediateCert'), - 'Log files directory': config.get('Service:LogsDirectory'), - 'Log files size': config.get('Service:LogsFileSize'), - 'Log files count': config.get('Service:LogsFileCount'), - 'Dev mode': config.get('Server:DevMode') + 'Port': config.get('server.port'), + 'SSL key directory': config.get('server.ssl.path.key'), + 'SSL certificate directory': config.get('server.ssl.path.cert'), + 'Intermediate key directory': config.get('server.ssl.path.intermediateCert'), + 'Log files directory': config.get('log.directory'), + 'Log files size': config.get('log.fileSize'), + 'Log files count': config.get('log.fileCount'), + 'Dev mode': config.get('server.devMode') } const result = Object.keys(configuration) @@ -234,7 +234,7 @@ const _listConfigOptions = function () { const _changeDevModeState = async function (options) { const enableDevMode = AppHelper.validateBooleanCliOptions(options.on, options.off) - config.set('Server:DevMode', enableDevMode) + config.set('server.devMode', enableDevMode) logger.cliRes('Dev mode state updated successfully.') } diff --git a/src/cli/start.js b/src/cli/start.js index a54e2bee3..0b169502f 100644 --- a/src/cli/start.js +++ b/src/cli/start.js @@ -43,11 +43,11 @@ class Start extends BaseCLIHandler { daemon._options.silent = false } const configuration = { - devMode: config.get('Server:DevMode'), - port: config.get('Server:Port'), - sslKey: config.get('Server:SslKey'), - sslCert: config.get('Server:SslCert'), - intermedKey: config.get('Server:IntermediateCert') + devMode: config.get('server.devMode'), + port: config.get('server.port'), + sslKey: config.get('server.ssl.path.key'), + sslCert: config.get('server.ssl.path.cert'), + intermedKey: config.get('server.ssl.path.intermediateCert') } const pid = daemon.status() @@ -76,8 +76,7 @@ function checkDaemon (daemon, configuration) { iterationsCount++ const pid = daemon.status() if (pid === 0) { - logger.error('Error: port is probably allocated, or ssl_key or ssl_cert or intermediate_cert ' + - 'is either missing or invalid.') + logger.error('Error: port is probably allocated, or ssl_key or ssl_cert is either missing or invalid.') return reject(new Error('Error starting ioFog-Controller')) } @@ -95,8 +94,8 @@ function checkDaemon (daemon, configuration) { } function checkServerProtocol (configuration) { - const { devMode, port, sslKey, sslCert, intermedKey } = configuration - if (!devMode && sslKey && sslCert && intermedKey) { + const { devMode, port, sslKey, sslCert } = configuration + if (!devMode && sslKey && sslCert) { logger.cliRes(`==> 🌎 HTTPS server listening on port ${port}. Open up https://localhost:${port}/ in your browser.`) } else { logger.cliRes(`==> 🌎 Listening on port ${port}. Open up http://localhost:${port}/ in your browser.`) diff --git a/src/config/constants.js b/src/config/constants.js deleted file mode 100644 index 1167cf99f..000000000 --- a/src/config/constants.js +++ /dev/null @@ -1,31 +0,0 @@ -/* - * ******************************************************************************* - * * Copyright (c) 2023 Datasance Teknoloji A.S. - * * - * * This program and the accompanying materials are made available under the - * * terms of the Eclipse Public License v. 2.0 which is available at - * * http://www.eclipse.org/legal/epl-2.0 - * * - * * SPDX-License-Identifier: EPL-2.0 - * ******************************************************************************* - * - */ - -module.exports = { - 'App:Name': 'iofog-controller', - 'Viewer:Port': 8008, - - 'Server:Port': 51121, - 'Server:DevMode': false, - - 'Service:LogsDirectory': '/var/log/iofog-controller', - 'Service:LogsFileSize': 104857600, - 'Service:LogsFileCount': 10, - - 'Settings:DefaultJobIntervalSeconds': 120, - 'Settings:FogTokenExpirationIntervalSeconds': 3600, - 'Settings:FogStatusUpdateIntervalSeconds': 30, - 'Settings:FogStatusUpdateTolerance': 3, - - 'Diagnostics:DiagnosticDir': 'diagnostic' -} diff --git a/src/config/controller.yaml b/src/config/controller.yaml new file mode 100644 index 000000000..1ff9e67f8 --- /dev/null +++ b/src/config/controller.yaml @@ -0,0 +1,111 @@ +# Application Configuration +app: + name: pot-controller # Application name + controlPlane: Remote # Control plane type: Remote or Kubernetes or Local + +# Server Configuration +server: + port: 51121 # Server port number + devMode: true # Development mode flag + # ssl: + # path: + # key: "" # SSL key file path + # cert: "" # SSL certificate file path + # intermediateCert: "" # Intermediate certificate file path + # # base64: + # # key: # SSL key in base64 format + # # cert: # SSL certificate in base64 format + # # intermediateCert: # Intermediate certificate in base64 format + +# Viewer Configuration +viewer: + port: 8008 # Viewer port number + url: "" # Viewer URL + +# Logging Configuration +log: + level: info + directory: /var/log/iofog-controller # Log directory + fileSize: 1073741824 # Maximum log file size in bytes (1GB) + fileCount: 10 # Maximum number of log files + +# Settings Configuration +settings: + # defaultJobInterval: 120 # Default job interval in seconds + fogStatusUpdateInterval: 30 # Fog status update interval in seconds + fogStatusUpdateTolerance: 3 # Fog status update tolerance + +# Database Configuration +database: + provider: sqlite # Database provider (sqlite/mysql/postgres) + # mysql: + # host: "" # MySQL host + # port: 3306 # MySQL port + # username: "" # MySQL username + # password: "" # MySQL password + # database: "" # MySQL database name + # postgres: + # host: "" # PostgreSQL host + # port: 5432 # PostgreSQL port + # username: "" # PostgreSQL username + # password: "" # PostgreSQL password + # database: "" # PostgreSQL database name + sqlite: + databaseName: dev_database.sqlite # SQLite database file name + logging: false # Enable SQLite query logging + transactionType: IMMEDIATE # SQLite transaction type + pool: + maxActive: 1 # Maximum active connections + max: 1 # Maximum total connections + min: 0 # Minimum connections + idle: 20000 # Idle timeout in milliseconds + +# Auth Configuration +# auth: +# realm: # Keycloak realm +# realmKey: # Realm public key +# url: # Keycloak authentication server URL +# sslRequired: # SSL requirement level +# client: +# id: # ControllerClient ID +# secret: # ControllerClient Client secret +# viewerClient: # Viewer client ID + +# Public Ports Configuration +publicPorts: + range: "6001-7999" # Public ports range + +# System Images Configuration +systemImages: + router: + "1": "ghcr.io/datasance/router:latest" + "2": "ghcr.io/datasance/router:latest" + proxy: + "1": "ghcr.io/datasance/proxy:latest" + "2": "ghcr.io/datasance/proxy:latest" + +# Diagnostics Configuration +diagnostics: + directory: "diagnostic" # Diagnostics directory + + +# OpenTelemetry Configuration +# otel: +# enabled: false # true/disable OpenTelemetry +# serviceName: "pot-controller" # Service name for traces +# endpoint: "http://localhost:4318/v1/traces" # OTel endpoint +# protocol: http/protobuf # Exporter OTLP Protocol (grpc or http/protobuf) +# headers: "" # A list of headers to apply to all outgoing data (traces, metrics, and logs). +# resourceAttributes: "service.version=3.5.0,deployment.environment=production,team=devops" # Resource attributes +# metrics: +# exporter: otlp # Otel metrics exporter +# interval: 1000 # Metrics collection interval in ms +# logs: +# level: info # Log level +# propagators: "tracecontext,baggage" # Context propagation +# traces: +# sampler: "parentbased_traceidratio" # Sampler to be used for traces +# samplerArg: 0.1 +# batch: # Batch size and timeout for telemetry data +# size: 512 # Maximum batch size +# delay: 1000 # Delay interval (in milliseconds) between two consecutive exports diff --git a/src/config/default.json b/src/config/default.json deleted file mode 100644 index ff9ea9676..000000000 --- a/src/config/default.json +++ /dev/null @@ -1,39 +0,0 @@ -{ - "App": { - "Name": "iofog-controller" - }, - "Viewer": { - "Port": 8008 - }, - "Server": { - "Port": 51121, - "DevMode": false - }, - "Service": { - "LogsDirectory": "/var/log/iofog-controller", - "LogsFileSize": 104857600, - "LogsFileCount": 10 - }, - "Settings": { - "DefaultJobIntervalSeconds": 120, - "FogTokenExpirationIntervalSeconds": 3600, - "FogStatusUpdateIntervalSeconds": 30, - "FogStatusUpdateTolerance": 3 - }, - "Diagnostics": { - "DiagnosticDir": "diagnostic" - }, - "PublicPorts": { - "Range": "6001-7999" - }, - "SystemImages": { - "Router": { - "1": "ghcr.io/datasance/router:latest", - "2": "ghcr.io/datasance/router:latest" - }, - "Proxy": { - "1": "ghcr.io/datasance/proxy:latest", - "2": "ghcr.io/datasance/proxy:latest" - } - } -} diff --git a/src/config/development.json b/src/config/development.json deleted file mode 100644 index 0fed88803..000000000 --- a/src/config/development.json +++ /dev/null @@ -1,63 +0,0 @@ -{ - "App": { - "Name": "iofog-controller-dev" - }, - "Viewer": { - "Port": 8008 - }, - "Server": { - "Port": 51121, - "DevMode": true - }, - "Service": { - "LogsDirectory": "/var/log/iofog-controller", - "LogsFileSize": 104857600, - "LogsFileCount": 10 - }, - "Settings": { - "FogTokenExpirationIntervalSeconds": 3600, - "FogStatusUpdateIntervalSeconds": 30, - "FogStatusUpdateTolerance": 3 - }, - "Tunnel": { - "Username": "username", - "Password": "password", - "Host": "23.253.111.231", - "RsaKey": "rsa", - "Lport": 22, - "PortRange": "2000-10000" - }, - "Diagnostics": { - "DiagnosticDir": "diagnostic" - }, - "Database": { - "Provider": "sqlite", - "Config": { - "sqlite": { - "databaseName": "dev_database.sqlite", - "logging": false, - "transactionType": "IMMEDIATE", - "pool": { - "maxactive": 1, - "max": 1, - "min": 0, - "idle": 20000 - } - }, - "mysql": { - "host": "", - "port": "", - "username": "", - "password": "", - "databaseName": "" - }, - "postgres": { - "host": "", - "port": "", - "username": "", - "password": "", - "databaseName": "" - } - } - } -} \ No newline at end of file diff --git a/src/config/env-mapping.js b/src/config/env-mapping.js new file mode 100644 index 000000000..5398bdf02 --- /dev/null +++ b/src/config/env-mapping.js @@ -0,0 +1,79 @@ +module.exports = { + // Application Configuration + 'APP_NAME': 'app.name', + 'CONTROL_PLANE': 'app.controlPlane', + + // Server Configuration + 'SERVER_PORT': 'server.port', + 'SERVER_DEV_MODE': 'server.devMode', + + // Viewer Configuration + 'VIEWER_PORT': 'viewer.port', + 'VIEWER_URL': 'viewer.url', + + // Logging Configuration + 'LOG_LEVEL': 'log.level', + 'LOG_DIRECTORY': 'log.directory', + 'LOG_FILE_SIZE': 'log.fileSize', + 'LOG_FILE_COUNT': 'log.fileCount', + + // Settings Configuration + 'FOG_STATUS_UPDATE_INTERVAL': 'settings.fogStatusUpdateInterval', + 'FOG_STATUS_UPDATE_TOLERANCE': 'settings.fogStatusUpdateTolerance', + + // Database Configuration + 'DB_PROVIDER': 'database.provider', + // These will map to the appropriate provider based on DB_PROVIDER + 'DB_HOST': { + path: (provider) => `database.${provider}.host` + }, + 'DB_PORT': { + path: (provider) => `database.${provider}.port` + }, + 'DB_USERNAME': { + path: (provider) => `database.${provider}.username` + }, + 'DB_PASSWORD': { + path: (provider) => `database.${provider}.password` + }, + 'DB_NAME': { + path: (provider) => `database.${provider}.databaseName` + }, + + // Auth Configuration + 'KC_REALM': 'auth.realm', + 'KC_REALM_KEY': 'auth.realmKey', + 'KC_URL': 'auth.url', + 'KC_SSL_REQ': 'auth.sslRequired', + 'KC_CLIENT': 'auth.client.id', + 'KC_CLIENT_SECRET': 'auth.client.secret', + 'KC_VIEWER_CLIENT': 'auth.viewerClient', + + // Public Ports Configuration + 'PUBLIC_PORTS_RANGE': 'publicPorts.range', + + // System Images Configuration + 'ROUTER_IMAGE_1': 'systemImages.router.1', + 'ROUTER_IMAGE_2': 'systemImages.router.2', + 'PROXY_IMAGE_1': 'systemImages.proxy.1', + 'PROXY_IMAGE_2': 'systemImages.proxy.2', + + // Diagnostics Configuration + 'DIAGNOSTICS_DIRECTORY': 'diagnostics.directory', + + // OpenTelemetry Configuration + 'ENABLE_TELEMETRY': 'otel.enabled', + 'OTEL_SERVICE_NAME': 'otel.serviceName', + 'OTEL_EXPORTER_OTLP_ENDPOINT': 'otel.endpoint', + 'OTEL_EXPORTER_OTLP_PROTOCOL': 'otel.protocol', + 'OTEL_EXPORTER_OTLP_HEADERS': 'otel.headers', + 'OTEL_RESOURCE_ATTRIBUTES': 'otel.resourceAttributes', + 'OTEL_METRICS_EXPORTER': 'otel.metrics.exporter', + 'OTEL_METRICS_INTERVAL': 'otel.metrics.interval', + 'OTEL_LOG_LEVEL': 'otel.logs.level', + 'OTEL_PROPAGATORS': 'otel.propagators', + 'OTEL_TRACES_SAMPLER': 'otel.traces.sampler', + 'OTEL_TRACES_SAMPLER_ARG': 'otel.traces.samplerArg', + 'OTEL_BATCH_SIZE': 'otel.batch.size', + 'OTEL_BATCH_DELAY': 'otel.batch.delay' +} diff --git a/src/config/index.js b/src/config/index.js index a2b6dc907..34cfadec8 100644 --- a/src/config/index.js +++ b/src/config/index.js @@ -13,39 +13,158 @@ const nconf = require('nconf') const path = require('path') -const constants = require('./constants') +const fs = require('fs') +const yaml = require('js-yaml') class Config { constructor () { - nconf.env({ separator: '_' }) - const environment = nconf.get('NODE:ENV') || 'production' - this.load(environment) + this.envMapping = require('./env-mapping') + this.configPath = process.env.CONFIG_PATH || path.join(__dirname, 'controller.yaml') + this.config = null + this.load() } - get (key, defaultValue) { - let value = nconf.get(key) + load () { + // 1. Load YAML config file + this.loadYamlConfig() + + // 2. Set OTEL environment variables from config + this.setOtelEnvVars() + } + + loadYamlConfig () { + try { + console.log('Loading config from:', this.configPath) + const configContent = fs.readFileSync(this.configPath, 'utf8') + this.config = yaml.load(configContent) + + // Clear any existing configuration + nconf.reset() + + // Set the entire config as defaults + nconf.defaults(this.config) + + // Set environment variables + nconf.env({ + separator: '_', + parseValues: true, + transform: (obj) => { + // Skip OTEL environment variables as they are handled separately + if (obj.key.startsWith('OTEL_') || obj.key === 'ENABLE_TELEMETRY') { + return null + } + + const mapping = this.envMapping[obj.key] + if (!mapping) { + return null + } + + // Handle database configuration + if (typeof mapping === 'object' && mapping.path) { + const provider = this.get('database.provider', 'sqlite') + return { + key: mapping.path(provider), + value: this.parseEnvValue(obj.value) + } + } + + return { + key: mapping, + value: this.parseEnvValue(obj.value) + } + } + }) + + // Get all environment overrides + const envOverrides = nconf.get() + + // Create a deep copy of the base config + const finalConfig = JSON.parse(JSON.stringify(this.config)) + + // Merge environment overrides into the final config + Object.entries(envOverrides).forEach(([key, value]) => { + if (key.includes('.')) { + const keys = key.split('.') + let current = finalConfig + for (let i = 0; i < keys.length - 1; i++) { + if (!current[keys[i]]) { + current[keys[i]] = {} + } + current = current[keys[i]] + } + current[keys[keys.length - 1]] = value + } else if (!key.includes(':') && key !== 'type') { + finalConfig[key] = value + } + }) - if (value === undefined || value === null) { - value = constants[key] + // Remove any nconf internal keys and the type field + Object.keys(finalConfig).forEach(key => { + if (key.includes(':') || key === 'type') { + delete finalConfig[key] + } + }) + + // Reset nconf and set the final merged config + nconf.reset() + nconf.defaults(finalConfig) + // Log the final merged config + } catch (error) { + console.error(`Error loading config file: ${error.message}`) + throw error } + } - if (value === undefined || value === null) { - value = defaultValue + setOtelEnvVars () { + console.log('Setting OTEL environment variables from config...') + // Only set OTEL env vars if they're not already set + for (const [envVar, configPath] of Object.entries(this.envMapping)) { + if (envVar.startsWith('OTEL_') || envVar === 'ENABLE_TELEMETRY') { + const value = this.get(configPath) + if (value !== undefined && !process.env[envVar]) { + const formattedValue = this.formatValue(value) + process.env[envVar] = formattedValue + } + } } + } + parseEnvValue (value) { + // Handle different types + if (value === 'true') return true + if (value === 'false') return false + if (!isNaN(value) && value !== '') return Number(value) return value } - set (key, value) { - const environment = nconf.get('NODE:ENV') || 'production' + formatValue (value) { + if (typeof value === 'boolean') { + return value.toString() + } + if (Array.isArray(value)) { + return value.join(',') + } + if (typeof value === 'object') { + return Object.entries(value) + .map(([key, val]) => `${key}=${val}`) + .join(',') + } + return value.toString() + } + + get (key, defaultValue) { + // Replace dots with colons for nconf compatibility + const nconfKey = key.replace(/\./g, ':') + let value = nconf.get(nconfKey) + return value !== undefined ? value : defaultValue + } - nconf.stores[environment].set(key, value) - nconf.stores[environment].saveSync() + set (key, value) { + nconf.set(key, value) } - load (environment) { - nconf.file(environment, path.join(__dirname, environment.toLowerCase() + '.json')) - nconf.file('default', path.join(__dirname, 'default.json')) + getAll () { + return nconf.get() } } diff --git a/src/config/keycloak.js b/src/config/keycloak.js index d1dc8ca27..0f510064a 100644 --- a/src/config/keycloak.js +++ b/src/config/keycloak.js @@ -1,16 +1,50 @@ const session = require('express-session') const Keycloak = require('keycloak-connect') +const config = require('./index') +const logger = require('../logger') + +// Mock Keycloak implementation for development mode +class MockKeycloak { + constructor () { + this.protect = (roles) => { + return async (req, res, next) => { + // In dev mode, we just add mock user info to the request + req.kauth = { + grant: { + access_token: { + content: { + preferred_username: 'dev-user', + realm_access: { + roles: ['SRE', 'Developer', 'Viewer'] + } + } + } + } + } + return next() + } + } + + // Add middleware method to match real Keycloak interface + this.middleware = () => { + return (req, res, next) => { + // In dev mode, we just pass through the middleware + return next() + } + } + } +} const keycloakConfig = { - realm: process.env.KC_REALM, - 'realm-public-key': process.env.KC_REALM_KEY, - 'auth-server-url': `${process.env.KC_URL}`, - 'ssl-required': process.env.KC_SSL_REQ, - resource: process.env.KC_CLIENT, + realm: process.env.KC_REALM || config.get('auth.realm'), + 'realm-public-key': process.env.KC_REALM_KEY || config.get('auth.realmKey'), + 'auth-server-url': process.env.KC_URL || config.get('auth.url'), + 'ssl-required': process.env.KC_SSL_REQ || config.get('auth.sslRequired'), + resource: process.env.KC_CLIENT || config.get('auth.client.id'), 'bearer-only': true, 'verify-token-audience': true, credentials: { - secret: process.env.KC_CLIENT_SECRET + secret: process.env.KC_CLIENT_SECRET || config.get('auth.client.secret') }, 'use-resource-role-mappings': true, 'confidential-port': 0 @@ -19,14 +53,51 @@ const keycloakConfig = { let keycloak let memoryStore +function isAuthConfigured () { + const requiredConfigs = [ + 'auth.realm', + 'auth.realmKey', + 'auth.url', + 'auth.client.id', + 'auth.client.secret' + ] + return requiredConfigs.every(configKey => { + const value = config.get(configKey) + return value !== undefined && value !== null && value !== '' + }) +} + function initKeycloak () { if (keycloak) { return keycloak + } + + const isDevMode = config.get('server.devMode', true) + const hasAuthConfig = isAuthConfigured() + + if (!hasAuthConfig && isDevMode) { + // Initialize mock Keycloak for development + keycloak = new MockKeycloak() + logger.warn('Keycloak initialized in development mode (no auth configuration)') + logger.warn('WARNING: All routes are unprotected in this mode') + } else if (!hasAuthConfig) { + // Throw error in production if auth not configured + const error = new Error('Auth configuration required in production mode') + logger.error('Failed to initialize Keycloak:', error) + throw error } else { - memoryStore = new session.MemoryStore() - keycloak = new Keycloak({ store: memoryStore }, keycloakConfig) - return keycloak + // Initialize real Keycloak + try { + memoryStore = new session.MemoryStore() + keycloak = new Keycloak({ store: memoryStore }, keycloakConfig) + logger.info('Keycloak initialized successfully with auth configuration') + } catch (error) { + logger.error('Error initializing Keycloak:', error) + throw error + } } + + return keycloak } function getKeycloak () { diff --git a/src/config/production.json b/src/config/production.json deleted file mode 100644 index 82bd77082..000000000 --- a/src/config/production.json +++ /dev/null @@ -1,56 +0,0 @@ -{ - "App": { - "Name": "iofog-controller" - }, - "Viewer": { - "Port": 8008 - }, - "Server": { - "Port": 51121, - "DevMode": true - }, - "Service": { - "LogsDirectory": "/var/log/iofog-controller", - "LogsFileSize": 104857600, - "LogsFileCount": 10 - }, - "Settings": { - "FogTokenExpirationIntervalSeconds": 3600, - "FogStatusUpdateIntervalSeconds": 30, - "FogStatusUpdateTolerance": 3 - }, - "PublicPorts": { - "Provider": "default" - }, - "Database": { - "Provider": "sqlite", - "Config": { - "sqlite": { - "databaseName": "prod_database.sqlite", - "logging": false, - "transactionType": "IMMEDIATE", - "pool": { - "maxactive": 1, - "max": 1, - "min": 0, - "idle": 20000 - } - }, - "mysql": { - "host": "", - "port": "", - "username": "", - "password": "", - "databaseName": "" - }, - "postgres": { - "host": "", - "port": "", - "username": "", - "password": "", - "databaseName": "" - } - } - } -} - diff --git a/src/config/telemetry.js b/src/config/telemetry.js new file mode 100644 index 000000000..dd969184c --- /dev/null +++ b/src/config/telemetry.js @@ -0,0 +1,78 @@ +const { NodeSDK } = require('@opentelemetry/sdk-node') +const { OTLPTraceExporter } = require('@opentelemetry/exporter-trace-otlp-http') +const { HttpInstrumentation } = require('@opentelemetry/instrumentation-http') +const { ExpressInstrumentation } = require('@opentelemetry/instrumentation-express') +const { + Resource, + envDetectorSync, + hostDetectorSync, + processDetectorSync +} = require('@opentelemetry/resources') +const logger = require('../logger') + +// Workaround for async attributes +function awaitAttributes (detector) { + return { + async detect (config) { + const resource = detector.detect(config) + if (resource.waitForAsyncAttributes) { + await resource.waitForAsyncAttributes() + } + return resource + } + } +} + +// Initialize OpenTelemetry +const sdk = new NodeSDK({ + serviceName: process.env.OTEL_SERVICE_NAME || 'pot-controller', + resource: new Resource({}), + resourceDetectors: [ + awaitAttributes(envDetectorSync), + awaitAttributes(processDetectorSync), + awaitAttributes(hostDetectorSync) + ], + traceExporter: new OTLPTraceExporter({ + url: process.env.OTEL_EXPORTER_OTLP_ENDPOINT || 'http://localhost:4318/v1/traces', + headers: {} + }), + instrumentations: [ + new HttpInstrumentation(), + new ExpressInstrumentation() + ] +}) + +// Start the SDK +async function startTelemetry () { + const isTelemetryEnabled = process.env.ENABLE_TELEMETRY === 'true' + if (!isTelemetryEnabled) { + logger.info('Telemetry is disabled via ENABLE_TELEMETRY environment variable') + return + } + + try { + await sdk.start() + logger.info('OpenTelemetry initialized successfully') + } catch (error) { + logger.error('Error initializing OpenTelemetry:', error) + process.exit(1) + } +} + +// Handle process termination +process.on('SIGTERM', () => { + if (process.env.ENABLE_TELEMETRY !== 'true') return + + try { + sdk.shutdown() + } catch (error) { + logger.error('Error terminating OpenTelemetry:', error) + } finally { + process.exit(0) + } +}) + +module.exports = { + sdk, + startTelemetry +} diff --git a/src/config/test.json b/src/config/test.json deleted file mode 100644 index 048637511..000000000 --- a/src/config/test.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "Server": { - "DevMode": true - }, - "Database": { - "Provider": "sqlite", - "Config": { - "databaseName": "test_database.sqlite", - "logging": false, - "transactionType": "IMMEDIATE", - "pool": { - "maxactive": 1, - "max": 1, - "min": 0, - "idle": 20000 - } - } - } -} \ No newline at end of file diff --git a/src/data/managers/fog-used-token-manager.js b/src/data/managers/fog-used-token-manager.js new file mode 100644 index 000000000..a9274ded7 --- /dev/null +++ b/src/data/managers/fog-used-token-manager.js @@ -0,0 +1,101 @@ +/* + * ******************************************************************************* + * * Copyright (c) 2023 Datasance Teknoloji A.S. + * * + * * This program and the accompanying materials are made available under the + * * terms of the Eclipse Public License v. 2.0 which is available at + * * http://www.eclipse.org/legal/epl-2.0 + * * + * * SPDX-License-Identifier: EPL-2.0 + * ******************************************************************************* + * + */ + +const models = require('../models') +const logger = require('../../logger') +const { Op } = require('sequelize') + +class FogUsedTokenManager { + /** + * Store a JTI (JWT ID) to mark it as used + * @param {string} jti - The JWT ID + * @param {string} fogUuid - The UUID of the fog node + * @param {number} exp - The expiration timestamp + * @param {Object} transaction - Sequelize transaction + * @returns {Promise} + */ + static async storeJti (jti, fogUuid, exp, transaction) { + try { + if (!transaction || transaction.fakeTransaction) { + // If no transaction or fake transaction, create a new one + await models.FogUsedToken.create({ + jti, + iofogUuid: fogUuid, + expiryTime: exp + }) + } else { + // Use the provided transaction + await models.FogUsedToken.create({ + jti, + iofogUuid: fogUuid, + expiryTime: exp + }, { transaction }) + } + } catch (error) { + logger.error(`Failed to store JTI: ${error.message}`) + throw error + } + } + + /** + * Check if a JTI has already been used + * @param {string} jti - The JWT ID to check + * @param {Object} transaction - Sequelize transaction + * @returns {Promise} True if the JTI has been used, false otherwise + */ + static async isJtiUsed (jti, transaction) { + try { + let token + if (!transaction || transaction.fakeTransaction) { + // If no transaction or fake transaction, query without transaction + token = await models.FogUsedToken.findOne({ + where: { jti } + }) + } else { + // Use the provided transaction + token = await models.FogUsedToken.findOne({ + where: { jti }, + transaction + }) + } + return !!token + } catch (error) { + logger.error(`Failed to check JTI: ${error.message}`) + throw error + } + } + + /** + * Clean up expired JTIs + * @returns {Promise} Number of deleted tokens + */ + static async cleanupExpiredJtis () { + try { + const now = new Date().getTime() / 1000 // Convert to Unix timestamp + const result = await models.FogUsedToken.destroy({ + where: { + expiryTime: { + [Op.lt]: now + } + } + }) + logger.debug(`Cleaned up ${result} expired JTIs`) + return result + } catch (error) { + logger.error(`Failed to cleanup expired JTIs: ${error.message}`) + throw error + } + } +} + +module.exports = FogUsedTokenManager diff --git a/src/data/managers/iofog-manager.js b/src/data/managers/iofog-manager.js index 35a7d894e..a0e98c762 100644 --- a/src/data/managers/iofog-manager.js +++ b/src/data/managers/iofog-manager.js @@ -16,7 +16,6 @@ const models = require('../models') const Fog = models.Fog const Tags = models.Tags -const FogAccessToken = models.FogAccessToken const Microservice = models.Microservice const Strace = models.StraceDiagnostics @@ -65,19 +64,6 @@ class FogManager extends BaseManager { }) } - // no transaction required here, used by auth decorator - checkToken (token) { - return Fog.findOne({ - include: [{ - model: FogAccessToken, - as: 'accessToken', - where: { - token: token - } - }] - }) - } - // no transaction required here, used by agent-last-active decorator updateLastActive (uuid, timestamp) { return Fog.update({ diff --git a/src/data/managers/iofog-public-key-manager.js b/src/data/managers/iofog-public-key-manager.js new file mode 100644 index 000000000..93004f095 --- /dev/null +++ b/src/data/managers/iofog-public-key-manager.js @@ -0,0 +1,89 @@ +/* + * ******************************************************************************* + * * Copyright (c) 2023 Datasance Teknoloji A.S. + * * + * * This program and the accompanying materials are made available under the + * * terms of the Eclipse Public License v. 2.0 which is available at + * * http://www.eclipse.org/legal/epl-2.0 + * * + * * SPDX-License-Identifier: EPL-2.0 + * ******************************************************************************* + * + */ + +const BaseManager = require('./base-manager') +const models = require('../models') +const FogPublicKey = models.FogPublicKey + +class FogPublicKeyManager extends BaseManager { + getEntity () { + return FogPublicKey + } + + // Find public key by fog UUID + findByFogUuid (fogUuid, transaction) { + const options = transaction.fakeTransaction + ? { + where: { + iofogUuid: fogUuid + } + } + : { + where: { + iofogUuid: fogUuid + }, + transaction: transaction + } + + return FogPublicKey.findOne(options) + } + + // Update or create public key for a fog + updateOrCreate (fogUuid, publicKey, transaction) { + const options = transaction.fakeTransaction + ? { + where: { + iofogUuid: fogUuid + } + } + : { + where: { + iofogUuid: fogUuid + }, + transaction: transaction + } + + return FogPublicKey.findOne(options).then((existingKey) => { + if (existingKey) { + const updateOptions = transaction.fakeTransaction + ? { + where: { + iofogUuid: fogUuid + } + } + : { + where: { + iofogUuid: fogUuid + }, + transaction: transaction + } + + return FogPublicKey.update({ + publicKey: publicKey + }, updateOptions) + } else { + const createOptions = transaction.fakeTransaction + ? {} + : { transaction: transaction } + + return FogPublicKey.create({ + iofogUuid: fogUuid, + publicKey: publicKey + }, createOptions) + } + }) + } +} + +const instance = new FogPublicKeyManager() +module.exports = instance diff --git a/src/data/migrations/db_migration_v1.0.2.sql b/src/data/migrations/db_migration_v1.0.2.sql index 2eed15b69..8f802a653 100644 --- a/src/data/migrations/db_migration_v1.0.2.sql +++ b/src/data/migrations/db_migration_v1.0.2.sql @@ -612,4 +612,29 @@ CREATE TABLE IF NOT EXISTS MicroserviceCapDrop ( CREATE INDEX idx_microservice_capDrop_microserviceUuid ON MicroserviceCapDrop (microservice_uuid); -ALTER TABLE Microservices ADD COLUMN annotations TEXT; \ No newline at end of file +ALTER TABLE Microservices ADD COLUMN annotations TEXT; + +CREATE TABLE IF NOT EXISTS FogPublicKeys ( + id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, + public_key TEXT, + iofog_uuid VARCHAR(32), + created_at DATETIME, + updated_at DATETIME, + FOREIGN KEY (iofog_uuid) REFERENCES Fogs (uuid) ON DELETE CASCADE +); + +CREATE INDEX idx_fog_public_keys_iofogUuid ON FogPublicKeys (iofog_uuid); + +CREATE TABLE IF NOT EXISTS FogUsedTokens ( + id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, + jti VARCHAR(255) NOT NULL, + iofog_uuid VARCHAR(32), + expiry_time DATETIME NOT NULL, + created_at DATETIME, + updated_at DATETIME, + FOREIGN KEY (iofog_uuid) REFERENCES Fogs (uuid) ON DELETE CASCADE +); + +CREATE INDEX idx_fog_used_tokens_iofogUuid ON FogUsedTokens (iofog_uuid); + +DROP TABLE IF EXISTS FogAccessTokens; \ No newline at end of file diff --git a/src/data/models/fog.js b/src/data/models/fog.js index df198da4d..3b8a02c89 100644 --- a/src/data/models/fog.js +++ b/src/data/models/fog.js @@ -329,11 +329,21 @@ module.exports = (sequelize, DataTypes) => { as: 'accessToken' }) + Fog.hasOne(models.FogPublicKey, { + foreignKey: 'iofog_uuid', + as: 'publicKey' + }) + Fog.hasMany(models.Microservice, { foreignKey: 'iofog_uuid', as: 'microservice' }) + Fog.hasMany(models.FogUsedToken, { + foreignKey: 'iofog_uuid', + as: 'jti' + }) + Fog.hasOne(models.Router, { foreignKey: 'iofog_uuid', as: 'router' diff --git a/src/data/models/fogUsedToken.js b/src/data/models/fogUsedToken.js new file mode 100644 index 000000000..a46323ff2 --- /dev/null +++ b/src/data/models/fogUsedToken.js @@ -0,0 +1,42 @@ +'use strict' + +const { convertToInt } = require('../../helpers/app-helper') + +module.exports = (sequelize, DataTypes) => { + const FogUsedToken = sequelize.define('FogUsedToken', { + id: { + type: DataTypes.INTEGER, + primaryKey: true, + autoIncrement: true, + allowNull: false, + field: 'id' + }, + jti: { + type: DataTypes.STRING(255), + primaryKey: true, + allowNull: false + }, + expiryTime: { + type: DataTypes.BIGINT, + get () { + return convertToInt(this.getDataValue('daemonLastStart'), 0) + }, + field: 'expiry_time' + } + }, { + tableName: 'FogUsedTokens', + timestamps: true, + underscored: true + }) + FogUsedToken.associate = function (models) { + FogUsedToken.belongsTo(models.Fog, { + foreignKey: { + name: 'iofogUuid', + field: 'iofog_uuid' + }, + as: 'iofog', + onDelete: 'cascade' + }) + } + return FogUsedToken +} diff --git a/src/data/models/fogpublickey.js b/src/data/models/fogpublickey.js new file mode 100644 index 000000000..37413b000 --- /dev/null +++ b/src/data/models/fogpublickey.js @@ -0,0 +1,42 @@ +'use strict' + +module.exports = (sequelize, DataTypes) => { + const FogPublicKey = sequelize.define('FogPublicKey', { + id: { + type: DataTypes.INTEGER, + primaryKey: true, + autoIncrement: true, + allowNull: false, + field: 'id' + }, + publicKey: { + type: DataTypes.TEXT, + field: 'public_key' + }, + createdAt: { + type: DataTypes.DATE, + field: 'created_at' + }, + updatedAt: { + type: DataTypes.DATE, + field: 'updated_at' + } + }, { + tableName: 'FogPublicKeys', + timestamps: true, + underscored: true + }) + + FogPublicKey.associate = function (models) { + FogPublicKey.belongsTo(models.Fog, { + foreignKey: { + name: 'iofogUuid', + field: 'iofog_uuid' + }, + as: 'iofog', + onDelete: 'cascade' + }) + } + + return FogPublicKey +} diff --git a/src/data/models/index.js b/src/data/models/index.js index 5a2886c83..71666d164 100644 --- a/src/data/models/index.js +++ b/src/data/models/index.js @@ -8,6 +8,7 @@ const constants = require('../constants') const basename = path.basename(__filename) const db = {} const config = require('../../config') +const logger = require('../../logger') const databaseProvider = require('../providers/database-factory') const sequelize = databaseProvider.sequelize @@ -52,10 +53,10 @@ db.initDB = async (isStart) => { // Check if the database file exists if (fs.existsSync(sqliteDbPath)) { - console.log('Database file exists. Running migrations only...') + logger.info('Database file exists. Running migrations only...') await databaseProvider.runMigration(sqliteDbPath) // Ensure migration finishes before moving on } else { - console.log('Database file does not exist. Running migrations and seeders...') + logger.info('Database file does not exist. Running migrations and seeders...') await databaseProvider.runMigration(sqliteDbPath) // Wait for migration to finish await databaseProvider.runSeeder(sqliteDbPath) // Wait for seeding to finish } @@ -63,8 +64,8 @@ db.initDB = async (isStart) => { // Configure system images const fogTypes = await db.FogType.findAll({}) - await configureImage(db, constants.ROUTER_CATALOG_NAME, fogTypes, config.get('SystemImages:Router', {})) - await configureImage(db, constants.PROXY_CATALOG_NAME, fogTypes, config.get('SystemImages:Proxy', {})) + await configureImage(db, constants.ROUTER_CATALOG_NAME, fogTypes, config.get('systemImages.router', {})) + await configureImage(db, constants.PROXY_CATALOG_NAME, fogTypes, config.get('systemImages.proxy', {})) } } diff --git a/src/data/providers/database-factory.js b/src/data/providers/database-factory.js index 12c17b728..3538908b6 100644 --- a/src/data/providers/database-factory.js +++ b/src/data/providers/database-factory.js @@ -1,7 +1,7 @@ const config = require('../../config') function createDatabaseProvider () { - let provider = process.env.DB_PROVIDER || config.get('Database:Provider', 'sqlite') + let provider = process.env.DB_PROVIDER || config.get('database.provider', 'sqlite') if (!provider) { provider = 'sqlite' diff --git a/src/data/providers/database-provider.js b/src/data/providers/database-provider.js index 67fd47dfa..9ada5d730 100644 --- a/src/data/providers/database-provider.js +++ b/src/data/providers/database-provider.js @@ -1,6 +1,7 @@ const path = require('path') const fs = require('fs') const sqlite3 = require('sqlite3').verbose() +const logger = require('../../logger') class DatabaseProvider { constructor () { @@ -12,7 +13,7 @@ class DatabaseProvider { const migrationSqlPath = path.resolve(__dirname, '../migrations/db_migration_v1.0.2.sql') if (!fs.existsSync(migrationSqlPath)) { - console.error(`Migration file not found: ${migrationSqlPath}`) + logger.error(`Migration file not found: ${migrationSqlPath}`) throw new Error('Migration file not found') } @@ -21,10 +22,10 @@ class DatabaseProvider { let db = new sqlite3.Database(dbName, (err) => { if (err) { - console.error(err.message) + logger.error(err.message) throw err } - console.log('Connected to the SQLite database for migration.') + logger.info('Connected to the SQLite database for migration.') }) try { @@ -45,7 +46,7 @@ class DatabaseProvider { err.message.includes('already exists') || err.message.includes('duplicate') ) { - console.warn(`Ignored error: ${err.message}`) + logger.warn(`Ignored error: ${err.message}`) resolve() // Ignore specific errors } else { db.run('ROLLBACK;') // Rollback transaction on error @@ -61,16 +62,16 @@ class DatabaseProvider { // Commit the transaction if all queries succeed db.run('COMMIT;') - console.log('Migration completed successfully.') + logger.info('Migration completed successfully.') } catch (err) { - console.error('Migration failed:', err) + logger.error('Migration failed:', err) throw err } finally { db.close((err) => { if (err) { - console.error('Error closing database connection:', err.message) + logger.error('Error closing database connection:', err.message) } else { - console.log('Database connection closed after migration.') + logger.info('Database connection closed after migration.') } }) } @@ -81,7 +82,7 @@ class DatabaseProvider { const seederSqlPath = path.resolve(__dirname, '../seeders/db_seeder_v1.0.2.sql') if (!fs.existsSync(seederSqlPath)) { - console.error(`Seeder file not found: ${seederSqlPath}`) + logger.error(`Seeder file not found: ${seederSqlPath}`) throw new Error('Seeder file not found') } @@ -90,14 +91,15 @@ class DatabaseProvider { let db = new sqlite3.Database(dbName, (err) => { if (err) { - console.error(err.message) + logger.error(err.message) throw err } - console.log('Connected to the SQLite database for seeding.') + logger.info('Connected to the SQLite database for seeding.') }) try { db.serialize(() => { + db.run('PRAGMA foreign_keys=OFF;') // Disable foreign key checks during seeding db.run('BEGIN TRANSACTION;') // Start transaction }) @@ -113,7 +115,7 @@ class DatabaseProvider { err.message.includes('already exists') || err.message.includes('duplicate') ) { - console.warn(`Ignored error: ${err.message}`) + logger.warn(`Ignored error: ${err.message}`) resolve() // Ignore specific errors } else { db.run('ROLLBACK;') // Rollback transaction on error @@ -129,16 +131,16 @@ class DatabaseProvider { // Commit the transaction if all queries succeed db.run('COMMIT;') - console.log('Seeding completed successfully.') + logger.info('Seeding completed successfully.') } catch (err) { - console.error('Seeding failed:', err) + logger.error('Seeding failed:', err) throw err } finally { db.close((err) => { if (err) { - console.error('Error closing database connection:', err.message) + logger.error('Error closing database connection:', err.message) } else { - console.log('Database connection closed after seeding.') + logger.info('Database connection closed after seeding.') } }) } diff --git a/src/data/providers/mysql.js b/src/data/providers/mysql.js index 935e25125..3c654f8a4 100644 --- a/src/data/providers/mysql.js +++ b/src/data/providers/mysql.js @@ -7,7 +7,7 @@ class MySqlDatabaseProvider extends DatabaseProvider { constructor () { super() - const mysqlConfig = config.get('Database:Config:mysql', {}) + const mysqlConfig = config.get('database.mysql', {}) mysqlConfig.dialect = 'mysql' mysqlConfig.host = process.env.DB_HOST || mysqlConfig.host mysqlConfig.port = process.env.DB_PORT || mysqlConfig.port diff --git a/src/data/providers/postgres.js b/src/data/providers/postgres.js index b5e959f08..1c8a07e1d 100644 --- a/src/data/providers/postgres.js +++ b/src/data/providers/postgres.js @@ -7,7 +7,7 @@ class PostgresDatabaseProvider extends DatabaseProvider { constructor () { super() - const postgresConfig = config.get('Database:Config:postgre', {}) + const postgresConfig = config.get('database.postgres', {}) postgresConfig.dialect = 'postgres' postgresConfig.host = process.env.DB_HOST || postgresConfig.host postgresConfig.port = process.env.DB_PORT || postgresConfig.port diff --git a/src/data/providers/sqlite.js b/src/data/providers/sqlite.js index 1d0e5cb04..15312e325 100644 --- a/src/data/providers/sqlite.js +++ b/src/data/providers/sqlite.js @@ -9,7 +9,7 @@ class SqliteDatabaseProvider extends DatabaseProvider { constructor () { super() - const sqliteConfig = config.get('Database:Config:sqlite', {}) + const sqliteConfig = config.get('database.sqlite', {}) sqliteConfig.dialect = 'sqlite' sqliteConfig.databaseName = process.env.DB_NAME || sqliteConfig.databaseName if (!sqliteConfig.databaseName.endsWith('.sqlite')) { diff --git a/src/decorators/authorization-decorator.js b/src/decorators/authorization-decorator.js index 9883feddc..656a4d172 100644 --- a/src/decorators/authorization-decorator.js +++ b/src/decorators/authorization-decorator.js @@ -11,9 +11,8 @@ * */ const logger = require('../logger') -const config = require('../config') const FogManager = require('../data/managers/iofog-manager') -const FogAccessTokenManager = require('../data/managers/iofog-access-token-manager') +const FogKeyService = require('../services/iofog-key-service') const Errors = require('../helpers/errors') const { isTest } = require('../helpers/app-helper') @@ -24,28 +23,64 @@ function checkFogToken (f) { } const req = fArgs[0] - const token = req.headers.authorization + const authHeader = req.headers.authorization - const fog = await FogManager.checkToken(token) - - if (!fog) { - logger.error('token ' + token + ' incorrect') + if (!authHeader) { + logger.error('No authorization token provided') throw new Errors.AuthenticationError('authorization failed') } - if (Date.now() > fog.accessToken.expirationTime) { - logger.error('token ' + token + ' expired') - throw new Errors.AuthenticationError('token expired') + + // Extract token from Bearer scheme + const [scheme, token] = authHeader.split(' ') + if (scheme.toLowerCase() !== 'bearer' || !token) { + logger.error('Invalid authorization scheme') + throw new Errors.AuthenticationError('authorization failed') } - fArgs.push(fog) + try { + // Debug log for JWT + logger.debug({ token }, 'Received JWT') + + // First, decode the JWT without verification to get the fog UUID + const tokenParts = token.split('.') + if (tokenParts.length !== 3) { + logger.error('Invalid JWT format') + throw new Errors.AuthenticationError('authorization failed') + } + + const payload = JSON.parse(Buffer.from(tokenParts[1], 'base64').toString()) + const fogUuid = payload.sub + logger.debug({ payload }, 'JWT payload') + + if (!fogUuid) { + logger.error('JWT missing subject claim') + throw new Errors.AuthenticationError('authorization failed') + } - FogAccessTokenManager.updateExpirationTime(fog.accessToken.id, fog.accessToken.expirationTime + - config.get('Settings:FogTokenExpirationIntervalSeconds') * 1000) + // Get the fog with transaction + const fog = await FogManager.findOne({ + uuid: fogUuid + }, { fakeTransaction: true }) - const timestamp = Date.now() - await FogManager.updateLastActive(fog.uuid, timestamp) + if (!fog) { + logger.error(`Fog with UUID ${fogUuid} not found`) + throw new Errors.AuthenticationError('authorization failed') + } - return f.apply(this, fArgs) + // Verify the JWT with transaction + await FogKeyService.verifyJWT(token, fogUuid, { fakeTransaction: true }) + + // Update last active timestamp with transaction + const timestamp = Date.now() + await FogManager.updateLastActive(fog.uuid, timestamp, { fakeTransaction: true }) + + fArgs.push(fog) + + return f.apply(this, fArgs) + } catch (error) { + logger.error(`JWT verification failed: ${error.message}`) + throw new Errors.AuthenticationError('authorization failed') + } } } diff --git a/src/helpers/app-helper.js b/src/helpers/app-helper.js index 3c0ffa972..8a9a26bfd 100644 --- a/src/helpers/app-helper.js +++ b/src/helpers/app-helper.js @@ -70,7 +70,7 @@ async function checkPortAvailability (port) { } const findAvailablePort = async function (hostname) { - let portRange = Config.get('Tunnel:PortRange') + let portRange = Config.get('tunnel.portRange') if (!portRange) { logger.warn('Port range was\'n specified in config. Default range (2000-10000) will be used') portRange = '2000-10000' diff --git a/src/init.js b/src/init.js new file mode 100644 index 000000000..2da8d0260 --- /dev/null +++ b/src/init.js @@ -0,0 +1,46 @@ +/* + * ******************************************************************************* + * * Copyright (c) 2023 Datasance Teknoloji A.S. + * * + * * This program and the accompanying materials are made available under the + * * terms of the Eclipse Public License v. 2.0 which is available at + * * http://www.eclipse.org/legal/epl-2.0 + * * + * * SPDX-License-Identifier: EPL-2.0 + * ******************************************************************************* + * + */ + +// Load configuration first +require('./config') + +// Initialize logger with configuration +const logger = require('./logger') +const { startTelemetry } = require('./config/telemetry') +const db = require('./data/models') + +async function initialize () { + try { + // Log initial steps using console since logger might not be ready + console.log('Configuration loaded') + console.log('Logger initialized with configuration') + + // Now we can use logger for the rest of initialization + logger.info('Initializing OpenTelemetry...') + startTelemetry() + + logger.info('Initializing database...') + await db.initDB(true) + + logger.info('Initialization completed successfully') + return true + } catch (error) { + // Use console.error here since logger might not be initialized + console.error('Initialization failed:', error) + process.exit(1) + } +} + +module.exports = { + initialize +} diff --git a/src/jobs/fog-status-job.js b/src/jobs/fog-status-job.js index d007bd09a..e07370809 100644 --- a/src/jobs/fog-status-job.js +++ b/src/jobs/fog-status-job.js @@ -21,7 +21,7 @@ const MicroserviceStates = require('../enums/microservice-state') const FogStates = require('../enums/fog-state') const Config = require('../config') -const scheduleTime = Config.get('Settings:FogStatusUpdateIntervalSeconds') * 1000 +const scheduleTime = Config.get('settings.fogStatusUpdateInterval') * 1000 async function run () { try { @@ -41,7 +41,7 @@ async function updateFogsConnectionStatus (transaction) { } async function _updateFogStatus (transaction) { - const statusUpdateTolerance = Config.get('Settings:FogStatusUpdateTolerance') + const statusUpdateTolerance = Config.get('settings.fogStatusUpdateTolerance') const fogs = await FogManager.findAll({ daemonStatus: FogStates.RUNNING }, transaction) const unknownFogUuids = fogs .filter((fog) => { diff --git a/src/jobs/stopped-app-status-job.js b/src/jobs/stopped-app-status-job.js index 87fb608fa..e6cf6f255 100644 --- a/src/jobs/stopped-app-status-job.js +++ b/src/jobs/stopped-app-status-job.js @@ -19,7 +19,7 @@ const MicroserviceStates = require('../enums/microservice-state') const Config = require('../config') const ApplicationManager = require('../data/managers/application-manager') -const scheduleTime = Config.get('Settings:FogStatusUpdateIntervalSeconds') * 1000 +const scheduleTime = Config.get('settings.fogStatusUpdateInterval') * 1000 async function run () { try { diff --git a/src/logger/index.js b/src/logger/index.js index 03bc2d2df..d855e847e 100644 --- a/src/logger/index.js +++ b/src/logger/index.js @@ -11,13 +11,47 @@ * */ -const fs = require('fs') -const path = require('path') const pino = require('pino') -const serializer = require('pino-std-serializers') +const path = require('path') +const fs = require('fs') const config = require('../config') +const serializer = require('pino-std-serializers') +const zlib = require('zlib') + +// Get log directory and settings from environment or config +const dirName = process.env.LOG_DIRECTORY || config.get('log.directory') + +const maxFileSize = process.env.LOG_FILE_SIZE ? parseInt(process.env.LOG_FILE_SIZE) * 1024 * 1024 * 1024 : config.get('log.fileSize') + +const maxFiles = process.env.LOG_FILE_COUNT ? parseInt(process.env.LOG_FILE_COUNT) : config.get('log.fileCount') + +// Validate required values +if (!dirName) { + throw new Error('Log directory is not configured. Please set LOG_DIRECTORY environment variable or log.directory in config.') +} +if (!maxFileSize) { + throw new Error('Log file size is not configured. Please set LOG_FILE_SIZE environment variable or log.fileSize in config.') +} +if (!maxFiles) { + throw new Error('Log file count is not configured. Please set LOG_FILE_COUNT environment variable or log.fileCount in config.') +} -const dirName = config.get('Service:LogsDirectory') +const baseFileName = 'iofog-controller' +const logFileName = `${baseFileName}.log` + +console.log('Log directory:', dirName) +console.log('Max file size:', maxFileSize) +console.log('Max files:', maxFiles) + +// Default log level from environment variable, fallback to config, then 'info' if not set +let defaultLogLevel = process.env.LOG_LEVEL || config.get('log.level') || 'info' + +// Validate log level +const validLogLevels = ['fatal', 'error', 'warn', 'info', 'debug', 'trace', 'silly'] +if (!validLogLevels.includes(defaultLogLevel)) { + console.error(`Invalid LOG_LEVEL: ${defaultLogLevel}. Using default level: info`) + defaultLogLevel = 'info' +} const levels = { error: 100, @@ -26,6 +60,8 @@ const levels = { cliRes: 70, apiReq: 60, apiRes: 50, + service: 45, + db: 40, info: 40, verbose: 30, debug: 20, @@ -33,12 +69,18 @@ const levels = { } const defaultFormat = { - level: 'info', + level: defaultLogLevel, + timestamp: () => `,"time":"${new Date().toISOString()}"`, customLevels: levels, useOnlyCustomLevels: true, - redact: ['headers.authorization'], + redact: { + paths: ['headers.authorization', 'token', 'password', 'apiKey', 'secret', 'privateKey'], + censor: '[REDACTED]' + }, formatters: { - level: (level) => ({ level }), + level: (label) => { + return { level: label } + }, log: (log) => { if (!log.req && !log.res) { return log @@ -68,26 +110,139 @@ const defaultFormat = { } } -const consoleLogger = pino(defaultFormat) - let fileLogger = null -try { - // Create the log directory if it does not exist - if (!fs.existsSync(dirName)) { - fs.mkdirSync(dirName) +let consoleLogger = null + +async function compressFile (sourcePath, targetPath) { + return new Promise((resolve, reject) => { + const gzip = zlib.createGzip() + const input = fs.createReadStream(sourcePath) + const output = fs.createWriteStream(targetPath) + + input.pipe(gzip).pipe(output) + + output.on('finish', () => { + fs.unlink(sourcePath, (err) => { + if (err) reject(err) + else resolve() + }) + }) + + output.on('error', reject) + }) +} + +async function rotateLogFile (isStartup = false) { + try { + const logFile = path.join(dirName, logFileName) + + // On startup, rotate if file exists and has content + // During runtime, rotate if size limit is reached + const shouldRotate = isStartup + ? (fs.existsSync(logFile) && fs.statSync(logFile).size > 0) + : (fs.existsSync(logFile) && fs.statSync(logFile).size >= maxFileSize) + + if (shouldRotate) { + console.log(isStartup ? 'Rotating log file on startup...' : 'Log file size exceeded, rotating...') + + // Find the next available compressed file number + let nextFileNumber = 1 + while (fs.existsSync(path.join(dirName, `${baseFileName}${nextFileNumber}.log.gz`))) { + nextFileNumber++ + } + + // If we've reached max files, remove the oldest compressed file + if (nextFileNumber > maxFiles) { + const oldestFile = path.join(dirName, `${baseFileName}1.log.gz`) + if (fs.existsSync(oldestFile)) { + console.log('Removing oldest compressed log file:', oldestFile) + await fs.promises.unlink(oldestFile) + } + nextFileNumber = maxFiles + } + + // Compress the current log file to the numbered target + const compressedFile = path.join(dirName, `${baseFileName}${nextFileNumber}.log.gz`) + console.log(`Compressing current log file to: ${compressedFile}`) + await compressFile(logFile, compressedFile) + + // Create new empty log file + await fs.promises.writeFile(logFile, '') + console.log('Log rotation completed') + } + } catch (err) { + console.error('Error during log rotation:', err) + } +} + +function getLogger () { + if (!fileLogger) { + try { + // Create the log directory if it does not exist + if (!fs.existsSync(dirName)) { + console.log('Creating log directory:', dirName) + fs.mkdirSync(dirName, { recursive: true }) + } + + const logFile = path.join(dirName, logFileName) + console.log('Log file path:', logFile) + + // Perform initial rotation if needed + rotateLogFile(true).catch(err => { + console.error('Error during initial rotation:', err) + }) + + const logDestination = pino.destination({ + dest: logFile, + sync: true, + mkdir: true + }) + + // Check rotation before each write + const originalWrite = logDestination.write + logDestination.write = function (chunk) { + rotateLogFile(false).catch(err => { + console.error('Error during rotation check:', err) + }) + return originalWrite.call(this, chunk) + } + + fileLogger = pino( + { + ...defaultFormat, + level: defaultLogLevel + }, + logDestination + ) + + // Test write to ensure file is writable + fileLogger.info('Logger initialized successfully') + console.log('File logger initialized and tested') + } catch (err) { + console.error('Error initializing file logger:', err) + return getConsoleLogger() + } } + return fileLogger +} - const logDestination = pino.destination(path.resolve(dirName, 'iofog-controller.log')) - fileLogger = pino( - { +function getConsoleLogger () { + if (!consoleLogger) { + consoleLogger = pino({ ...defaultFormat, - level: 'apiRes' - }, - logDestination) - process.on('SIGHUP', () => logDestination.reopen()) -} catch (e) {} + level: defaultLogLevel + }) + } + return consoleLogger +} + +// Initialize file logger immediately +getLogger() -module.exports = {} +module.exports = { + getLogger, + getConsoleLogger +} for (const level of Object.keys(levels)) { module.exports[level] = (...log) => { @@ -102,9 +257,9 @@ for (const level of Object.keys(levels)) { if (log[0] instanceof Error) { log = serializer.err(...log) } - consoleLogger[level](...log) + getConsoleLogger()[level](...log) if (fileLogger !== null) { - fileLogger[level](...log) + getLogger()[level](...log) } } } diff --git a/src/main.js b/src/main.js index 4e4eb4bab..bb7ec0cf9 100644 --- a/src/main.js +++ b/src/main.js @@ -20,11 +20,10 @@ const isElevated = require('is-elevated') const fetch = require('node-fetch-npm') const isHTTPS = () => { - const sslKey = config.get('Server:SslKey', '') - const devMode = config.get('Server:DevMode', false) - const sslCert = config.get('Server:SslCert', '') - const intermedKey = config.get('Server:IntermediateCert', '') - return !devMode && sslKey && sslCert && intermedKey + const sslKey = config.get('server.ssl.path.key', '') + const devMode = config.get('server.devMode', false) + const sslCert = config.get('server.ssl.path.cert', '') + return !devMode && sslKey && sslCert } const getJSONFromURL = async (uri) => { @@ -35,8 +34,8 @@ const getJSONFromURL = async (uri) => { return response.json() } -const apiPort = +(config.get('Server:Port', 51121)) -const viewerPort = +(process.env.VIEWER_PORT || config.get('Viewer:Port', 80)) +const apiPort = +(config.get('server.port', 51121)) +const viewerPort = +(process.env.VIEWER_PORT || config.get('viewer.port', 8008)) const isDaemonElevated = async () => { // If it is running and you can see it, you have enough permission to move forward diff --git a/src/schemas/config.js b/src/schemas/config.js index c03b779ae..5c4e390ba 100644 --- a/src/schemas/config.js +++ b/src/schemas/config.js @@ -18,7 +18,7 @@ const configUpdate = { port: { type: 'integer', minimum: 0, maximum: 65535 }, sslCert: { type: 'string' }, sslKey: { type: 'string' }, - intermediateCert: { type: 'string' }, + intermediateCert: { type: 'string', optional: true }, logDir: { type: 'string' }, logSize: { type: 'integer' } } diff --git a/src/server.js b/src/server.js index 5c91faacc..5a0b8039d 100755 --- a/src/server.js +++ b/src/server.js @@ -11,225 +11,270 @@ * */ -const config = require('./config') -const logger = require('./logger') -const db = require('./data/models') - -const bodyParser = require('body-parser') -const cookieParser = require('cookie-parser') -const express = require('express') -const ecnViewer = process.env.ECN_VIEWER_PATH ? require(`${process.env.ECN_VIEWER_PATH}/package/index.js`) : require('@datasance/ecn-viewer') -const fs = require('fs') -const helmet = require('helmet') -const cors = require('cors') -const https = require('https') -const path = require('path') -const { renderFile } = require('ejs') -const xss = require('xss-clean') -const { substitutionMiddleware } = require('./helpers/template-helper') -const multer = require('multer') -const multerMemStorage = multer.memoryStorage() -const uploadFile = (fileName) => multer({ - storage: multerMemStorage -}).single(fileName) -const keycloak = require('./config/keycloak.js').initKeycloak() -const session = require('express-session') -const memoryStore = require('./config/keycloak.js').getMemoryStore() - -const viewerApp = express() - -const app = express() - -app.use(cors()) - -app.use(helmet()) -app.use(xss()) - -// express logs -// app.use(morgan('combined')); -app.use(session({ - secret: 'pot-controller', - resave: false, - saveUninitialized: true, - store: memoryStore -})) -app.use(keycloak.middleware()) -app.use(bodyParser.urlencoded({ - extended: true -})) -app.use(bodyParser.json()) - -app.engine('ejs', renderFile) -app.set('view engine', 'ejs') -app.use(cookieParser()) - -app.set('views', path.join(__dirname, 'views')) - -app.on('uncaughtException', (req, res, route, err) => { - // TODO -}) +// Initialize everything in the correct order +const { initialize } = require('./init') +initialize().then(() => { + const config = require('./config') + const logger = require('./logger') + const db = require('./data/models') + const CleanupService = require('./services/cleanup-service') -app.use((req, res, next) => { - if (req.headers && req.headers['request-id']) { - req.id = req.headers['request-id'] - delete req.headers['request-id'] - } + const bodyParser = require('body-parser') + const cookieParser = require('cookie-parser') + const express = require('express') + const ecnViewer = process.env.ECN_VIEWER_PATH ? require(`${process.env.ECN_VIEWER_PATH}/package/index.js`) : require('@datasance/ecn-viewer') + const fs = require('fs') + const helmet = require('helmet') + const cors = require('cors') + const https = require('https') + const path = require('path') + const { renderFile } = require('ejs') + const xss = require('xss-clean') + const { substitutionMiddleware } = require('./helpers/template-helper') + const multer = require('multer') + const multerMemStorage = multer.memoryStorage() + const uploadFile = (fileName) => multer({ + storage: multerMemStorage + }).single(fileName) - res.append('X-Timestamp', Date.now()) - next() -}) + // Initialize session and Keycloak after config is loaded + const session = require('express-session') + const { initKeycloak, getMemoryStore } = require('./config/keycloak.js') + const memoryStore = getMemoryStore() + const keycloak = initKeycloak() -global.appRoot = path.resolve(__dirname) + const viewerApp = express() + const app = express() -const registerRoute = (route) => { - const middlewares = [route.middleware] - if (route.supportSubstitution) { - middlewares.unshift(substitutionMiddleware) - } - if (route.fileInput) { - middlewares.unshift(uploadFile(route.fileInput)) - } - app[route.method.toLowerCase()](route.path, ...middlewares) -} + app.use(cors()) -const setupMiddleware = function (routeName) { - const routes = [].concat(require(path.join(__dirname, 'routes', routeName)) || []) - routes.forEach(registerRoute) -} + app.use(helmet()) + app.use(xss()) -fs.readdirSync(path.join(__dirname, 'routes')) - .forEach(setupMiddleware) + // express logs + // app.use(morgan('combined')); + app.use(session({ + secret: 'pot-controller', + resave: false, + saveUninitialized: true, + store: memoryStore + })) + app.use(keycloak.middleware()) + app.use(bodyParser.urlencoded({ + extended: true + })) + app.use(bodyParser.json()) -const jobs = [] + app.engine('ejs', renderFile) + app.set('view engine', 'ejs') + app.use(cookieParser()) -const setupJobs = function (file) { - jobs.push((require(path.join(__dirname, 'jobs', file)) || [])) -} + app.set('views', path.join(__dirname, 'views')) -fs.readdirSync(path.join(__dirname, 'jobs')) - .filter((file) => { - return (file.indexOf('.') !== 0) && (file.slice(-3) === '.js') - }) - .forEach(setupJobs) - -function registerServers (api, viewer) { - process.once('SIGTERM', async function (code) { - console.log('SIGTERM received. Shutting down.') - await new Promise((resolve) => { api.close(resolve) }) - console.log('API Server closed.') - await new Promise((resolve) => { viewer.close(resolve) }) - console.log('Viewer Server closed.') - process.exit(0) + app.on('uncaughtException', (req, res, route, err) => { + // TODO }) -} - -function startHttpServer (apps, ports, jobs) { - logger.info('SSL not configured, starting HTTP server.') - const viewerServer = apps.viewer.listen(ports.viewer, function onStart (err) { - if (err) { - logger.error(err) + app.use((req, res, next) => { + if (req.headers && req.headers['request-id']) { + req.id = req.headers['request-id'] + delete req.headers['request-id'] } - logger.info(`==> 🌎 Viewer listening on port ${ports.viewer}. Open up http://localhost:${ports.viewer}/ in your browser.`) + + res.append('X-Timestamp', Date.now()) + next() }) - const apiServer = apps.api.listen(ports.api, function onStart (err) { - if (err) { - logger.error(err) + + global.appRoot = path.resolve(__dirname) + + const registerRoute = (route) => { + const middlewares = [route.middleware] + if (route.supportSubstitution) { + middlewares.unshift(substitutionMiddleware) } - logger.info(`==> 🌎 API Listening on port ${ports.api}. Open up http://localhost:${ports.api}/ in your browser.`) - jobs.forEach((job) => job.run()) - }) - registerServers(apiServer, viewerServer) -} - -function startHttpsServer (apps, ports, sslKey, sslCert, intermedKey, jobs) { - try { - const sslOptions = { - key: fs.readFileSync(sslKey), - cert: fs.readFileSync(sslCert), - ca: fs.readFileSync(intermedKey), - requestCert: true, - rejectUnauthorized: false // currently for some reason iofog agent doesn't work without this option + if (route.fileInput) { + middlewares.unshift(uploadFile(route.fileInput)) } + app[route.method.toLowerCase()](route.path, ...middlewares) + } + + const setupMiddleware = function (routeName) { + const routes = [].concat(require(path.join(__dirname, 'routes', routeName)) || []) + routes.forEach(registerRoute) + } + + fs.readdirSync(path.join(__dirname, 'routes')) + .forEach(setupMiddleware) + + const jobs = [] + + const setupJobs = function (file) { + jobs.push((require(path.join(__dirname, 'jobs', file)) || [])) + } + + fs.readdirSync(path.join(__dirname, 'jobs')) + .filter((file) => { + return (file.indexOf('.') !== 0) && (file.slice(-3) === '.js') + }) + .forEach(setupJobs) - const viewerServer = https.createServer(sslOptions, apps.viewer).listen(ports.viewer, function onStart (err) { + function registerServers (api, viewer) { + process.once('SIGTERM', async function (code) { + console.log('SIGTERM received. Shutting down.') + await new Promise((resolve) => { api.close(resolve) }) + console.log('API Server closed.') + await new Promise((resolve) => { viewer.close(resolve) }) + console.log('Viewer Server closed.') + process.exit(0) + }) + } + + function startHttpServer (apps, ports, jobs) { + logger.info('SSL not configured, starting HTTP server.') + + const viewerServer = apps.viewer.listen(ports.viewer, function onStart (err) { if (err) { logger.error(err) } - logger.info(`==> 🌎 HTTPS Viewer server listening on port ${ports.viewer}. Open up https://localhost:${ports.viewer}/ in your browser.`) - jobs.forEach((job) => job.run()) + logger.info(`==> 🌎 Viewer listening on port ${ports.viewer}. Open up http://localhost:${ports.viewer}/ in your browser.`) }) - - const apiServer = https.createServer(sslOptions, apps.api).listen(ports.api, function onStart (err) { + const apiServer = apps.api.listen(ports.api, function onStart (err) { if (err) { logger.error(err) } - logger.info(`==> 🌎 HTTPS API server listening on port ${ports.api}. Open up https://localhost:${ports.api}/ in your browser.`) + logger.info(`==> 🌎 API Listening on port ${ports.api}. Open up http://localhost:${ports.api}/ in your browser.`) jobs.forEach((job) => job.run()) }) registerServers(apiServer, viewerServer) - } catch (e) { - logger.error('ssl_key or ssl_cert or intermediate_cert is either missing or invalid. Provide valid SSL configurations.') } -} - -const devMode = config.get('Server:DevMode') -const apiPort = +(config.get('Server:Port')) -const viewerPort = +(process.env.VIEWER_PORT || config.get('Viewer:Port')) -const viewerURL = process.env.VIEWER_URL || config.get('Viewer:Url') -const sslKey = config.get('Server:SslKey') -const sslCert = config.get('Server:SslCert') -const intermedKey = config.get('Server:IntermediateCert') -const kcRealm = process.env.KC_REALM -const kcURL = `${process.env.KC_URL}` -const kcClient = process.env.KC_VIEWER_CLIENT - -viewerApp.use('/', ecnViewer.middleware(express)) - -const isDaemon = process.argv[process.argv.length - 1] === 'daemonize2' - -const initState = async () => { - if (!isDaemon) { - // InitDB + + const { createSSLOptions } = require('./utils/ssl-utils') + + function startHttpsServer (apps, ports, sslKey, sslCert, intermedKey, jobs, isBase64 = false) { try { - await db.initDB(true) - } catch (err) { - logger.error('Unable to initialize the database. Error: ' + err) - process.exit(1) + const sslOptions = createSSLOptions({ + key: sslKey, + cert: sslCert, + intermedKey: intermedKey, + isBase64: isBase64 + }) + + const viewerServer = https.createServer(sslOptions, apps.viewer).listen(ports.viewer, function onStart (err) { + if (err) { + logger.error(err) + } + logger.info(`==> 🌎 HTTPS Viewer server listening on port ${ports.viewer}. Open up https://localhost:${ports.viewer}/ in your browser.`) + jobs.forEach((job) => job.run()) + }) + + const apiServer = https.createServer(sslOptions, apps.api).listen(ports.api, function onStart (err) { + if (err) { + logger.error(err) + } + logger.info(`==> 🌎 HTTPS API server listening on port ${ports.api}. Open up https://localhost:${ports.api}/ in your browser.`) + jobs.forEach((job) => job.run()) + }) + registerServers(apiServer, viewerServer) + } catch (e) { + logger.error('Error loading SSL certificates. Please check your configuration.') } + } + + const devMode = process.env.DEV_MODE || config.get('server.devMode') + const apiPort = process.env.API_PORT || config.get('server.port') + const viewerPort = process.env.VIEWER_PORT || config.get('viewer.port') + const viewerURL = process.env.VIEWER_URL || config.get('viewer.url') + + // File-based SSL configuration + const sslKey = process.env.SSL_KEY || config.get('server.ssl.path.key') + const sslCert = process.env.SSL_CERT || config.get('server.ssl.path.cert') + const intermedKey = process.env.INTERMEDIATE_CERT || config.get('server.ssl.path.intermediateCert') - // Store PID to let deamon know we are running. - jobs.push({ - run: () => { - const pidFile = path.join((process.env.PID_BASE || __dirname), 'iofog-controller.pid') - logger.info(`==> PID file: ${pidFile}`) - fs.writeFileSync(pidFile, process.pid.toString()) + // Base64 SSL configuration + const sslKeyBase64 = config.get('server.ssl.base64.key') + const sslCertBase64 = config.get('server.ssl.base64.cert') + const intermedKeyBase64 = config.get('server.ssl.base64.intermediateCert') + + const hasFileBasedSSL = !devMode && sslKey && sslCert + const hasBase64SSL = !devMode && sslKeyBase64 && sslCertBase64 + + const kcRealm = process.env.KC_REALM || config.get('auth.realm') + const kcURL = process.env.KC_URL || config.get('auth.url') + const kcClient = process.env.KC_VIEWER_CLIENT || config.get('auth.viewerClient') + + viewerApp.use('/', ecnViewer.middleware(express)) + + const isDaemon = process.argv[process.argv.length - 1] === 'daemonize2' + + const initState = async () => { + if (!isDaemon) { + // InitDB + try { + await db.initDB(true) + } catch (err) { + logger.error('Unable to initialize the database. Error: ' + err) + process.exit(1) } - }) - } - // Set up controller-config.js for ECN Viewer - const ecnViewerControllerConfigFilePath = path.join(__dirname, '..', 'node_modules', '@datasance', 'ecn-viewer', 'build', 'controller-config.js') - const ecnViewerControllerConfig = { - port: apiPort, - user: {}, - keycloakURL: kcURL, - keycloakRealm: kcRealm, - keycloakClientid: kcClient - } - if (viewerURL) { - ecnViewerControllerConfig.url = viewerURL - } - const ecnViewerConfigScript = ` - window.controllerConfig = ${JSON.stringify(ecnViewerControllerConfig)} - ` - fs.writeFileSync(ecnViewerControllerConfigFilePath, ecnViewerConfigScript) -} - -initState() - .then(() => { - if (!devMode && sslKey && sslCert && intermedKey) { - startHttpsServer({ api: app, viewer: viewerApp }, { api: apiPort, viewer: viewerPort }, sslKey, sslCert, intermedKey, jobs) - } else { - startHttpServer({ api: app, viewer: viewerApp }, { api: apiPort, viewer: viewerPort }, jobs) + + // Store PID to let deamon know we are running. + jobs.push({ + run: () => { + const pidFile = path.join((process.env.PID_BASE || __dirname), 'iofog-controller.pid') + logger.info(`==> PID file: ${pidFile}`) + fs.writeFileSync(pidFile, process.pid.toString()) + } + }) } - }) + // Set up controller-config.js for ECN Viewer + const ecnViewerControllerConfigFilePath = path.join(__dirname, '..', 'node_modules', '@datasance', 'ecn-viewer', 'build', 'controller-config.js') + const ecnViewerControllerConfig = { + port: apiPort, + user: {}, + controllerDevMode: devMode, + keycloakURL: kcURL, + keycloakRealm: kcRealm, + keycloakClientid: kcClient + } + if (viewerURL) { + ecnViewerControllerConfig.url = viewerURL + } + const ecnViewerConfigScript = ` + window.controllerConfig = ${JSON.stringify(ecnViewerControllerConfig)} + ` + fs.writeFileSync(ecnViewerControllerConfigFilePath, ecnViewerConfigScript) + } + + // Initialize cleanup service + CleanupService.start() + + initState() + .then(() => { + if (hasFileBasedSSL) { + startHttpsServer( + { api: app, viewer: viewerApp }, + { api: apiPort, viewer: viewerPort }, + sslKey, + sslCert, + intermedKey, + jobs, + false + ) + } else if (hasBase64SSL) { + startHttpsServer( + { api: app, viewer: viewerApp }, + { api: apiPort, viewer: viewerPort }, + sslKeyBase64, + sslCertBase64, + intermedKeyBase64, + jobs, + true + ) + } else { + startHttpServer( + { api: app, viewer: viewerApp }, + { api: apiPort, viewer: viewerPort }, + jobs + ) + } + }) +}) diff --git a/src/services/agent-service.js b/src/services/agent-service.js index 88c2be767..fa2a6f1fc 100644 --- a/src/services/agent-service.js +++ b/src/services/agent-service.js @@ -21,7 +21,7 @@ const Op = Sequelize.Op const TransactionDecorator = require('../decorators/transaction-decorator') const FogProvisionKeyManager = require('../data/managers/iofog-provision-key-manager') const FogManager = require('../data/managers/iofog-manager') -const FogAccessTokenService = require('../services/iofog-access-token-service') +const FogKeyService = require('../services/iofog-key-service') const ChangeTrackingService = require('./change-tracking-service') const FogVersionCommandManager = require('../data/managers/iofog-version-command-manager') const StraceManager = require('../data/managers/strace-manager') @@ -54,6 +54,7 @@ const agentProvision = async function (provisionData, transaction) { const provision = await FogProvisionKeyManager.findOne({ provisionKey: provisionData.key }, transaction) + if (!provision) { throw new Errors.NotFoundError(ErrorMessages.INVALID_PROVISIONING_KEY) } @@ -67,11 +68,17 @@ const agentProvision = async function (provisionData, transaction) { uuid: provision.iofogUuid }, transaction) + if (!fog) { + throw new Errors.NotFoundError(ErrorMessages.INVALID_IOFOG_UUID) + } + await _checkMicroservicesFogType(fog, provisionData.type, transaction) - const newAccessToken = await FogAccessTokenService.generateAccessToken(transaction) + // Generate Ed25519 key pair + const keyPair = await FogKeyService.generateKeyPair(transaction) - await FogAccessTokenService.updateAccessToken(fog.uuid, newAccessToken, transaction) + // Store the public key + await FogKeyService.storePublicKey(fog.uuid, keyPair.publicKey, transaction) await FogManager.update({ uuid: fog.uuid @@ -85,7 +92,7 @@ const agentProvision = async function (provisionData, transaction) { return { uuid: fog.uuid, - token: newAccessToken.token + privateKey: keyPair.privateKey } } diff --git a/src/services/cleanup-service.js b/src/services/cleanup-service.js new file mode 100644 index 000000000..9c67201d0 --- /dev/null +++ b/src/services/cleanup-service.js @@ -0,0 +1,34 @@ +/* + * ******************************************************************************* + * * Copyright (c) 2023 Datasance Teknoloji A.S. + * * + * * This program and the accompanying materials are made available under the + * * terms of the Eclipse Public License v. 2.0 which is available at + * * http://www.eclipse.org/legal/epl-2.0 + * * + * * SPDX-License-Identifier: EPL-2.0 + * ******************************************************************************* + * + */ + +const schedule = require('node-schedule') +const FogUsedTokenManager = require('../data/managers/fog-used-token-manager') +const logger = require('../logger') + +class CleanupService { + start () { + // Run every 5 minutes to ensure we catch all expired tokens + // (since tokens are valid for 10 minutes) + schedule.scheduleJob('*/5 * * * *', async () => { + try { + logger.debug('Starting cleanup of expired JTIs') + const count = await FogUsedTokenManager.cleanupExpiredJtis() + logger.debug(`Cleaned up ${count} expired JTIs`) + } catch (error) { + logger.error('Error during JTI cleanup:', error) + } + }) + } +} + +module.exports = new CleanupService() diff --git a/src/services/diagnostic-service.js b/src/services/diagnostic-service.js index f138683cc..41ace819c 100644 --- a/src/services/diagnostic-service.js +++ b/src/services/diagnostic-service.js @@ -58,7 +58,7 @@ const getMicroserviceStraceData = async function (uuid, data, isCLI, transaction throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.INVALID_MICROSERVICE_STRACE, uuid)) } - const dir = Config.get('Diagnostics:DiagnosticDir') || 'diagnostics' + const dir = Config.get('diagnostics.directory') || 'diagnostics' const filePath = dir + '/' + uuid let result = straceData.buffer @@ -91,7 +91,7 @@ const postMicroserviceStraceDatatoFtp = async function (uuid, data, isCLI, trans throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.INVALID_MICROSERVICE_STRACE, uuid)) } - const dir = Config.get('Diagnostics:DiagnosticDir') + const dir = Config.get('diagnostics.directory') const filePath = dir + '/' + uuid _createDirectoryIfNotExists(dir) diff --git a/src/services/iofog-key-service.js b/src/services/iofog-key-service.js new file mode 100644 index 000000000..242c45972 --- /dev/null +++ b/src/services/iofog-key-service.js @@ -0,0 +1,130 @@ +/* + * ******************************************************************************* + * * Copyright (c) 2023 Datasance Teknoloji A.S. + * * + * * This program and the accompanying materials are made available under the + * * terms of the Eclipse Public License v. 2.0 which is available at + * * http://www.eclipse.org/legal/epl-2.0 + * * + * * SPDX-License-Identifier: EPL-2.0 + * ******************************************************************************* + * + */ + +const crypto = require('crypto') +const AppHelper = require('../helpers/app-helper') +const FogPublicKeyManager = require('../data/managers/iofog-public-key-manager') +const FogUsedTokenManager = require('../data/managers/fog-used-token-manager') +const jose = require('jose') + +/** + * Generate Ed25519 key pair and return as JWK strings + * @returns {Object} Object containing publicKey and privateKey as base64 encoded JWK strings + */ +const generateKeyPair = async function (transaction) { + // Generate Ed25519 key pair + const { publicKey, privateKey } = crypto.generateKeyPairSync('ed25519') + + // Convert to JWK format + const publicKeyJwk = publicKey.export({ format: 'jwk' }) + const privateKeyJwk = privateKey.export({ format: 'jwk' }) + + // Convert JWK to base64 encoded single line strings + const publicKeyBase64 = Buffer.from(JSON.stringify(publicKeyJwk)).toString('base64') + const privateKeyBase64 = Buffer.from(JSON.stringify(privateKeyJwk)).toString('base64') + + return { + publicKey: publicKeyBase64, + privateKey: privateKeyBase64 + } +} + +/** + * Store public key for a fog node + * @param {string} fogUuid - UUID of the fog node + * @param {string} publicKey - Public key as base64 encoded JWK string + * @param {Object} transaction - Sequelize transaction + * @returns {Promise} Promise resolving to the stored public key + */ +const storePublicKey = async function (fogUuid, publicKey, transaction) { + // Encrypt the public key using the fog UUID as salt + const encryptedPublicKey = AppHelper.encryptText(publicKey, fogUuid) + + // Store the encrypted public key + return FogPublicKeyManager.updateOrCreate(fogUuid, encryptedPublicKey, transaction) +} + +/** + * Get public key for a fog node + * @param {string} fogUuid - UUID of the fog node + * @param {Object} transaction - Sequelize transaction + * @returns {Promise} Promise resolving to the public key as base64 encoded JWK string + */ +const getPublicKey = async function (fogUuid, transaction) { + // Get the encrypted public key + const fogPublicKey = await FogPublicKeyManager.findByFogUuid(fogUuid, transaction) + + if (!fogPublicKey) { + return null + } + + // Decrypt the public key using the fog UUID as salt + return AppHelper.decryptText(fogPublicKey.publicKey, fogUuid) +} + +/** + * Verify a JWT signed by a fog node + * @param {string} token - JWT token + * @param {string} fogUuid - UUID of the fog node + * @param {Object} transaction - Sequelize transaction + * @returns {Promise} Promise resolving to the verified JWT payload + */ +const verifyJWT = async function (token, fogUuid, transaction) { + try { + // Get the public key for the fog node + const publicKeyBase64 = await getPublicKey(fogUuid, transaction) + + if (!publicKeyBase64) { + throw new Error('Public key not found for fog node') + } + + // Convert base64 JWK string to JWK object + const publicKeyJwk = JSON.parse(Buffer.from(publicKeyBase64, 'base64').toString()) + + // Convert JWK to crypto key + const publicKey = crypto.createPublicKey({ + key: publicKeyJwk, + format: 'jwk' + }) + + // Verify the JWT using jose + const { payload } = await jose.jwtVerify(token, publicKey, { + algorithms: ['EdDSA'] + }) + + // Check if JTI is already used + const isUsed = await FogUsedTokenManager.isJtiUsed(payload.jti, transaction) + if (isUsed) { + throw new Error('JWT already used') + } + + // Store the JTI + await FogUsedTokenManager.storeJti(payload.jti, fogUuid, payload.exp, transaction) + + return payload + } catch (error) { + throw new Error(`JWT verification failed: ${error.message}`) + } +} + +async function all (transaction) { + return FogPublicKeyManager.findAll(null, transaction) +} + +module.exports = { + generateKeyPair, + storePublicKey, + getPublicKey, + verifyJWT, + all +} diff --git a/src/services/iofog-service.js b/src/services/iofog-service.js index 1255c82d0..1cc27db5a 100644 --- a/src/services/iofog-service.js +++ b/src/services/iofog-service.js @@ -489,8 +489,8 @@ async function generateProvisioningKeyEndPoint (fogData, isCLI, transaction) { const newProvision = { iofogUuid: fogData.uuid, - provisionKey: AppHelper.generateRandomString(8), - expirationTime: new Date().getTime() + (20 * 60 * 1000) + provisionKey: AppHelper.generateRandomString(16), + expirationTime: new Date().getTime() + (10 * 60 * 1000) } const fog = await FogManager.findOne(queryFogData, transaction) diff --git a/src/services/microservice-ports/default.js b/src/services/microservice-ports/default.js index d5c233782..956186be2 100644 --- a/src/services/microservice-ports/default.js +++ b/src/services/microservice-ports/default.js @@ -52,7 +52,7 @@ async function _checkForDuplicatePorts (agent, localPort, transaction) { } function _createDefaultPublicPortRange () { - const defaultPortRangeStr = process.env.PUBLIC_PORTS_RANGE || controllerConfig.get('PublicPorts:Range') + const defaultPortRangeStr = process.env.PUBLIC_PORTS_RANGE || controllerConfig.get('publicPorts.range') const [startStr, endStr] = defaultPortRangeStr.split('-') let start = parseInt(startStr) let end = parseInt(endStr) diff --git a/src/services/microservices-service.js b/src/services/microservices-service.js index cd5649050..8a7257208 100644 --- a/src/services/microservices-service.js +++ b/src/services/microservices-service.js @@ -40,6 +40,7 @@ const { VOLUME_MAPPING_DEFAULT } = require('../helpers/constants') const constants = require('../helpers/constants') const isEqual = require('lodash/isEqual') const TagsManager = require('../data/managers/tags-manager') +const logger = require('../logger') async function _setPubTags (microserviceModel, tagsArray, transaction) { if (tagsArray) { @@ -356,14 +357,14 @@ async function createMicroserviceEndPoint (microserviceData, isCLI, transaction) response.forEach(ms => ms.iofogUuid && fogsNeedUpdate.add(ms.iofogUuid)) } } catch (error) { - console.error(`[ERROR] Checking fog nodes list for pubTag "${tag.value}":`, error.message) + logger.error(`Checking fog nodes list for pubTag "${tag.value}":`, error.message) } } for (const fog of fogsNeedUpdate) { try { await ChangeTrackingService.update(fog, ChangeTrackingService.events.microserviceFull, transaction) } catch (error) { - console.error(`[ERROR] Updating change tracking for fog "${fog.value}":`, error.message) + logger.error(`Updating change tracking for fog "${fog.value}":`, error.message) } } } @@ -863,14 +864,14 @@ async function updateMicroserviceEndPoint (microserviceUuid, microserviceData, i response.forEach(ms => ms.iofogUuid && fogsNeedUpdate.add(ms.iofogUuid)) } } catch (error) { - console.error(`[ERROR] Checking fog nodes list for pubTag "${tag.value}":`, error.message) + logger.error(`Checking fog nodes list for pubTag "${tag.value}":`, error.message) } } for (const fog of fogsNeedUpdate) { try { await ChangeTrackingService.update(fog, ChangeTrackingService.events.microserviceFull, transaction) } catch (error) { - console.error(`[ERROR] Updating change tracking for fog "${fog.value}":`, error.message) + logger.error(`Updating change tracking for fog "${fog.value}":`, error.message) } } } @@ -1197,7 +1198,7 @@ async function getReceiverMicroservices (microservice, transaction) { ] } } catch (error) { - console.error(`[ERROR] Checking microservices for pubTag "${tag.value}":`, error.message) + logger.error(`Checking microservices for pubTag "${tag.value}":`, error.message) } } } @@ -1226,7 +1227,7 @@ async function isMicroserviceConsumer (microservice, transaction) { return true } } catch (error) { - console.error(`[ERROR] Checking microservices for subTag "${tag.value}":`, error.message) + logger.error(`Checking microservices for subTag "${tag.value}":`, error.message) } } } diff --git a/src/services/tunnel-service.js b/src/services/tunnel-service.js index 14142af29..7c013b26f 100644 --- a/src/services/tunnel-service.js +++ b/src/services/tunnel-service.js @@ -30,13 +30,13 @@ const openTunnel = async function (tunnelData, isCli, transaction) { if (isCli) { tunnel.rport = await AppHelper.findAvailablePort(tunnelData.host) } else { - const host = Config.get('Tunnel:Host') + const host = Config.get('tunnel.host') tunnel = { - username: Config.get('Tunnel:Username'), - password: Config.get('Tunnel:Password'), + username: Config.get('tunnel.username'), + password: Config.get('tunnel.password'), host: host, - rsakey: Config.get('Tunnel:RsaKey'), - lport: Config.get('Tunnel:Lport'), + rsakey: Config.get('tunnel.rsaKey'), + lport: Config.get('tunnel.lport'), iofogUuid: iofog.uuid, closed: false, rport: await AppHelper.findAvailablePort(host) diff --git a/src/services/user-service.js b/src/services/user-service.js index fcbed54d4..639b1feff 100644 --- a/src/services/user-service.js +++ b/src/services/user-service.js @@ -16,38 +16,73 @@ const TransactionDecorator = require('../decorators/transaction-decorator') const axios = require('axios') const qs = require('qs') const https = require('https') +const config = require('../config') + +const kcClient = process.env.KC_CLIENT || config.get('auth.client.id') +const kcClientSecret = process.env.KC_CLIENT_SECRET || config.get('auth.client.secret') +const kcUrl = process.env.KC_URL || config.get('auth.url') +const kcRealm = process.env.KC_REALM || config.get('auth.realm') +const isDevMode = config.get('server.devMode', true) + +const mockUser = { + preferred_username: 'dev-user', + email: 'dev@example.com', + realm_access: { + roles: ['SRE', 'Developer', 'Viewer'] + } +} + +const mockToken = { + access_token: 'mock-access-token', + refresh_token: 'mock-refresh-token' +} + +const isAuthConfigured = () => { + return kcUrl && kcRealm && kcClient && kcClientSecret +} const login = async function (credentials, isCLI, transaction) { - try { - const data = qs.stringify({ - grant_type: 'password', - username: credentials.email, - password: credentials.password, - totp: credentials.totp, - client_id: process.env.KC_CLIENT, - client_secret: process.env.KC_CLIENT_SECRET - }) - - const agent = new https.Agent({ - rejectUnauthorized: false // Ignore SSL certificate errors - }) - - const config = { - method: 'post', - maxBodyLength: Infinity, - url: `${process.env.KC_URL}realms/${process.env.KC_REALM}/protocol/openid-connect/token`, - headers: { - 'Cache-Control': 'no-cache', - 'Content-Type': 'application/x-www-form-urlencoded' - }, - data, - httpsAgent: agent + // If in dev mode and auth is not configured, always return mock token + if (!isAuthConfigured() && isDevMode) { + return { + accessToken: mockToken.access_token, + refreshToken: mockToken.refresh_token } + } - // Make a POST request to Keycloak token endpoint - const response = await axios.request(config) + // If auth is not configured and not in dev mode, throw error + if (!isAuthConfigured() && !isDevMode) { + throw new Error(`Auth is not configured for this cluster. Please contact your administrator.`) + } - // Extract the access token from the response + // Only proceed with axios request if auth is configured + const data = qs.stringify({ + grant_type: 'password', + username: credentials.email, + password: credentials.password, + totp: credentials.totp, + client_id: kcClient, + client_secret: kcClientSecret + }) + + const agent = new https.Agent({ + rejectUnauthorized: false + }) + + const requestConfig = { + method: 'post', + maxBodyLength: Infinity, + url: `${kcUrl}realms/${kcRealm}/protocol/openid-connect/token`, + headers: { + 'Cache-Control': 'no-cache', + 'Content-Type': 'application/x-www-form-urlencoded' + }, + data, + httpsAgent: agent + } + + try { + const response = await axios.request(requestConfig) const accessToken = response.data.access_token const refreshToken = response.data.refresh_token return { @@ -55,40 +90,53 @@ const login = async function (credentials, isCLI, transaction) { refreshToken } } catch (error) { - console.error('Error during login:', error) - throw new Errors.InvalidCredentialsError() + if (error.response && error.response.data) { + throw new Errors.InvalidCredentialsError(error.response.data.error_description || 'Invalid credentials') + } + throw new Errors.InvalidCredentialsError(error.message || 'Invalid credentials') } } const refresh = async function (credentials, isCLI, transaction) { - try { - const data = qs.stringify({ - grant_type: 'refresh_token', - refresh_token: credentials.refreshToken, - client_id: process.env.KC_CLIENT, - client_secret: process.env.KC_CLIENT_SECRET - }) - - const agent = new https.Agent({ - rejectUnauthorized: false // Ignore SSL certificate errors - }) - - const config = { - method: 'post', - maxBodyLength: Infinity, - url: `${process.env.KC_URL}realms/${process.env.KC_REALM}/protocol/openid-connect/token`, - headers: { - 'Cache-Control': 'no-cache', - 'Content-Type': 'application/x-www-form-urlencoded' - }, - data, - httpsAgent: agent + // If in dev mode and auth is not configured, always return mock token + if (!isAuthConfigured() && isDevMode) { + return { + accessToken: mockToken.access_token, + refreshToken: mockToken.refresh_token } + } + + // If auth is not configured and not in dev mode, throw error + if (!isAuthConfigured() && !isDevMode) { + throw new Error(`Auth is not configured for this cluster. Please contact your administrator.`) + } - // Make a POST request to Keycloak token endpoint - const response = await axios.request(config) + // Only proceed with axios request if auth is configured + const data = qs.stringify({ + grant_type: 'refresh_token', + refresh_token: credentials.refreshToken, + client_id: kcClient, + client_secret: kcClientSecret + }) + + const agent = new https.Agent({ + rejectUnauthorized: false + }) + + const requestConfig = { + method: 'post', + maxBodyLength: Infinity, + url: `${kcUrl}realms/${kcRealm}/protocol/openid-connect/token`, + headers: { + 'Cache-Control': 'no-cache', + 'Content-Type': 'application/x-www-form-urlencoded' + }, + data, + httpsAgent: agent + } - // Extract the access token from the response + try { + const response = await axios.request(requestConfig) const accessToken = response.data.access_token const refreshToken = response.data.refresh_token return { @@ -96,68 +144,88 @@ const refresh = async function (credentials, isCLI, transaction) { refreshToken } } catch (error) { - console.error('Error during login:', error) - throw new Errors.InvalidCredentialsError() + if (error.response && error.response.data) { + throw new Errors.InvalidCredentialsError(error.response.data.error_description || 'Invalid credentials') + } + throw new Errors.InvalidCredentialsError(error.message || 'Invalid credentials') } } const profile = async function (req, isCLI, transaction) { - try { - const accessToken = req.headers.authorization.replace('Bearer ', '') - const agent = new https.Agent({ - // Ignore SSL certificate errors - rejectUnauthorized: false - }) - - const profileconfig = { - method: 'get', - maxBodyLength: Infinity, - url: `${process.env.KC_URL}realms/${process.env.KC_REALM}/protocol/openid-connect/userinfo`, - headers: { - 'Content-Type': 'application/x-www-form-urlencoded', - Authorization: `Bearer ${accessToken}` - }, - httpsAgent: agent - } + // If in dev mode and auth is not configured, always return mock user + if (!isAuthConfigured() && isDevMode) { + return mockUser + } - // Make the request using async/await - const response = await axios.request(profileconfig) + // If auth is not configured and not in dev mode, throw error + if (!isAuthConfigured() && !isDevMode) { + throw new Error(`Auth is not configured for this cluster. Please contact your administrator.`) + } - // Return the userinfo data + // Only proceed with axios request if auth is configured + const accessToken = req.headers.authorization.replace('Bearer ', '') + const agent = new https.Agent({ + rejectUnauthorized: false + }) + + const requestConfig = { + method: 'get', + maxBodyLength: Infinity, + url: `${kcUrl}realms/${kcRealm}/protocol/openid-connect/userinfo`, + headers: { + 'Content-Type': 'application/x-www-form-urlencoded', + Authorization: `Bearer ${accessToken}` + }, + httpsAgent: agent + } + + try { + const response = await axios.request(requestConfig) return response.data } catch (error) { - console.error('Error during profile retrieval:', error) - throw new Errors.InvalidCredentialsError() + if (error.response && error.response.data) { + throw new Errors.InvalidCredentialsError(error.response.data.error_description || 'Invalid credentials') + } + throw new Errors.InvalidCredentialsError(error.message || 'Invalid credentials') } } const logout = async function (req, isCLI, transaction) { - try { - const accessToken = req.headers.authorization.replace('Bearer ', '') - const agent = new https.Agent({ - // Ignore SSL certificate errors - rejectUnauthorized: false - }) - - const logoutconfig = { - method: 'post', - maxBodyLength: Infinity, - url: `${process.env.KC_URL}realms/${process.env.KC_REALM}/protocol/openid-connect/logout`, - headers: { - 'Content-Type': 'application/x-www-form-urlencoded', - Authorization: `Bearer ${accessToken}` - }, - httpsAgent: agent - } + // If in dev mode and auth is not configured, always return success + if (!isAuthConfigured() && isDevMode) { + return { status: 'success' } + } - // Make the request using async/await - const response = await axios.request(logoutconfig) + // If auth is not configured and not in dev mode, throw error + if (!isAuthConfigured() && !isDevMode) { + throw new Error(`Auth is not configured for this cluster. Please contact your administrator.`) + } - // Return the userinfo data + // Only proceed with axios request if auth is configured + const accessToken = req.headers.authorization.replace('Bearer ', '') + const agent = new https.Agent({ + rejectUnauthorized: false + }) + + const requestConfig = { + method: 'post', + maxBodyLength: Infinity, + url: `${kcUrl}realms/${kcRealm}/protocol/openid-connect/logout`, + headers: { + 'Content-Type': 'application/x-www-form-urlencoded', + Authorization: `Bearer ${accessToken}` + }, + httpsAgent: agent + } + + try { + const response = await axios.request(requestConfig) return response.data } catch (error) { - console.error('Error during logout:', error) - throw new Errors.InvalidCredentialsError() + if (error.response && error.response.data) { + throw new Errors.InvalidCredentialsError(error.response.data.error_description || 'Invalid credentials') + } + throw new Errors.InvalidCredentialsError(error.message || 'Invalid credentials') } } diff --git a/src/utils/ssl-utils.js b/src/utils/ssl-utils.js new file mode 100644 index 000000000..988eca7a8 --- /dev/null +++ b/src/utils/ssl-utils.js @@ -0,0 +1,76 @@ +/* + * ******************************************************************************* + * * Copyright (c) 2023 Datasance Teknoloji A.S. + * * + * * This program and the accompanying materials are made available under the + * * terms of the Eclipse Public License v. 2.0 which is available at + * * http://www.eclipse.org/legal/epl-2.0 + * * + * * SPDX-License-Identifier: EPL-2.0 + * ******************************************************************************* + * + */ + +const fs = require('fs') +const logger = require('../logger') + +/** + * Loads a certificate from either a file path or base64 string + * @param {string} source - The source of the certificate (file path or base64 string) + * @param {boolean} isBase64 - Whether the source is a base64 string + * @returns {Buffer} The loaded certificate + * @throws {Error} If there's an error loading the certificate + */ +function loadCertificate (source, isBase64 = false) { + try { + if (!source) { + throw new Error('Certificate source is empty') + } + + if (isBase64) { + return Buffer.from(source, 'base64') + } + return fs.readFileSync(source) + } catch (e) { + logger.error(`Error loading certificate: ${e.message}`) + throw e + } +} + +/** + * Creates SSL options from either file paths or base64 strings + * @param {Object} options - SSL configuration options + * @param {string} options.key - SSL key file path or base64 string + * @param {string} options.cert - SSL certificate file path or base64 string + * @param {string} [options.intermedKey] - Intermediate certificate file path or base64 string + * @param {boolean} [options.isBase64=false] - Whether the inputs are base64 strings + * @returns {Object} SSL options for HTTPS server + */ +function createSSLOptions ({ key, cert, intermedKey, isBase64 = false }) { + if (!key || !cert) { + throw new Error('SSL key and certificate are required') + } + + const sslOptions = { + key: loadCertificate(key, isBase64), + cert: loadCertificate(cert, isBase64), + requestCert: true, + rejectUnauthorized: false + } + + // Only add CA if intermediate certificate is provided + if (intermedKey) { + try { + sslOptions.ca = loadCertificate(intermedKey, isBase64) + } catch (e) { + logger.warn('Intermediate certificate could not be loaded, continuing without it') + } + } + + return sslOptions +} + +module.exports = { + loadCertificate, + createSSLOptions +} diff --git a/test/OTEL/README.md b/test/OTEL/README.md new file mode 100644 index 000000000..777250873 --- /dev/null +++ b/test/OTEL/README.md @@ -0,0 +1,50 @@ +# OpenTelemetry Test Setup + +This directory contains the necessary configuration files to test OpenTelemetry integration with Jaeger, Prometheus, and Grafana. + +## Prerequisites + +- Docker +- Docker Compose + +## Setup + +1. Start the observability stack: +```bash +docker-compose up -d +``` + +2. Access the UIs: +- Jaeger UI: http://localhost:16686 +- Prometheus: http://localhost:9090 +- Grafana: http://localhost:3000 (login with admin/admin) + +## Testing Your Application + +To test your application with this setup: + +1. Set the environment variables: +```bash +export OTEL_EXPORTER_OTLP_ENDPOINT=http://localhost:4318 +export OTEL_SERVICE_NAME=your-service-name +``` + +2. Run your application with OpenTelemetry: +```bash +sudo -E node -r dotenv/config src/server.js +``` + +## Verifying the Setup + +1. Make some requests to your application +2. Open Jaeger UI (http://localhost:16686) +3. Select your service from the dropdown +4. Click "Find Traces" +5. You should see traces from your application + +## Cleanup + +To stop and remove all containers: +```bash +docker-compose down -v +``` \ No newline at end of file diff --git a/test/OTEL/docker-compose.yml b/test/OTEL/docker-compose.yml new file mode 100644 index 000000000..6db625c40 --- /dev/null +++ b/test/OTEL/docker-compose.yml @@ -0,0 +1,65 @@ +version: '3.8' + +services: + # Jaeger for trace visualization + jaeger: + image: jaegertracing/all-in-one:latest + ports: + - "16686:16686" # Jaeger UI + - "14250:14250" # gRPC + environment: + - COLLECTOR_OTLP_ENABLED=true + - METRICS_STORAGE_TYPE=prometheus + - PROMETHEUS_SERVER_URL=http://prometheus:9090 + networks: + - telemetry-network + + # OpenTelemetry Collector + otel-collector: + image: otel/opentelemetry-collector:latest + command: ["--config=/etc/otel-collector-config.yaml"] + volumes: + - ./otel-collector-config.yaml:/etc/otel-collector-config.yaml + ports: + - "4317:4317" # OTLP gRPC + - "4318:4318" # OTLP HTTP + - "8888:8888" # Prometheus metrics exposed by the collector + - "8889:8889" # Prometheus exporter + - "13133:13133" # health_check extension + - "55679:55679" # zpages extension + depends_on: + - jaeger + - prometheus + networks: + - telemetry-network + + # Prometheus for metrics + prometheus: + image: prom/prometheus:latest + volumes: + - ./prometheus.yml:/etc/prometheus/prometheus.yml + ports: + - "9090:9090" + networks: + - telemetry-network + + # Grafana for visualization + grafana: + image: grafana/grafana:latest + ports: + - "3000:3000" + volumes: + - grafana-storage:/var/lib/grafana + environment: + - GF_SECURITY_ADMIN_PASSWORD=admin + depends_on: + - prometheus + networks: + - telemetry-network + +networks: + telemetry-network: + driver: bridge + +volumes: + grafana-storage: \ No newline at end of file diff --git a/test/OTEL/otel-collector-config.yaml b/test/OTEL/otel-collector-config.yaml new file mode 100644 index 000000000..5c5b03abc --- /dev/null +++ b/test/OTEL/otel-collector-config.yaml @@ -0,0 +1,39 @@ +receivers: + otlp: + protocols: + http: + endpoint: 0.0.0.0:4318 + grpc: + endpoint: 0.0.0.0:4317 + +processors: + batch: + timeout: 1s + send_batch_size: 1024 + +exporters: + otlp: + endpoint: jaeger:4317 + tls: + insecure: true + prometheus: + endpoint: "0.0.0.0:8889" + namespace: "controller" + resource_to_telemetry_conversion: + enabled: true + debug: + verbosity: detailed + +service: + telemetry: + logs: + level: debug + pipelines: + traces: + receivers: [otlp] + processors: [batch] + exporters: [otlp, debug] + metrics: + receivers: [otlp] + processors: [batch] + exporters: [otlp, prometheus, debug] \ No newline at end of file diff --git a/test/OTEL/prometheus.yml b/test/OTEL/prometheus.yml new file mode 100644 index 000000000..de10cdb21 --- /dev/null +++ b/test/OTEL/prometheus.yml @@ -0,0 +1,8 @@ +global: + scrape_interval: 15s + +scrape_configs: + - job_name: 'otel-collector' + scrape_interval: 5s + static_configs: + - targets: ['otel-collector:8889'] \ No newline at end of file From 5e5957557360622c66af1e841858703889788f5d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emirhan=20Durmu=C5=9F?= Date: Thu, 24 Apr 2025 15:13:14 +0300 Subject: [PATCH 151/178] yaml parses updated with microservice container annotations, capadd, capdrop --- src/services/yaml-parser-service.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/services/yaml-parser-service.js b/src/services/yaml-parser-service.js index d8fb7ca22..bdbf1ea50 100644 --- a/src/services/yaml-parser-service.js +++ b/src/services/yaml-parser-service.js @@ -87,6 +87,9 @@ const parseMicroserviceYAML = async (microservice) => { agentName: lget(microservice, 'agent.name'), registryId, ...microservice.container, + annotations: microservice.container.annotations != null ? JSON.stringify(microservice.container.annotations) : undefined, + capAdd: lget(microservice, 'container.capAdd', []), + capDrop: lget(microservice, 'container.capDrop', []), ports: (lget(microservice, 'container.ports', [])), volumeMappings: lget(microservice, 'container.volumes', []), cmd: lget(microservice, 'container.commands', []), From 58ba9cdd0276ad9ff05af2f551542fa28124f59c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emirhan=20Durmu=C5=9F?= Date: Thu, 24 Apr 2025 22:59:52 +0300 Subject: [PATCH 152/178] viewer version updated --- package-lock.json | 8 ++++---- package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index cbfa99ded..9be6b883e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,7 +10,7 @@ "hasInstallScript": true, "license": "EPL-2.0", "dependencies": { - "@datasance/ecn-viewer": "0.5.3", + "@datasance/ecn-viewer": "0.5.4", "@opentelemetry/api": "^1.9.0", "@opentelemetry/exporter-trace-otlp-http": "^0.200.0", "@opentelemetry/instrumentation-express": "^0.48.1", @@ -481,9 +481,9 @@ } }, "node_modules/@datasance/ecn-viewer": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/@datasance/ecn-viewer/-/ecn-viewer-0.5.3.tgz", - "integrity": "sha512-jjfnn9zPK5OmRVbAOdfaB/jIrKA4w/RsSNK2fbeQeGhq01deJQJXmbHqutdskdyQpJKdwVWpM3mWAIe2nimOCg==" + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/@datasance/ecn-viewer/-/ecn-viewer-0.5.4.tgz", + "integrity": "sha512-Eu8BhBAhHyU6S3RdOPyiKpq3DhRUcEQQlU02BBWTdI5e6j5Iqv6Q72AFBw+AaE0NeO7PSNz8x7jQj77OX7jU5g==" }, "node_modules/@eslint-community/eslint-utils": { "version": "4.4.0", diff --git a/package.json b/package.json index 4b6212bbc..4d56685d5 100644 --- a/package.json +++ b/package.json @@ -55,7 +55,7 @@ "iofog-controller": "src/main.js" }, "dependencies": { - "@datasance/ecn-viewer": "0.5.3", + "@datasance/ecn-viewer": "0.5.4", "axios": "1.8.4", "body-parser": "^1.20.3", "child_process": "1.0.2", From 91316a46ac89e2a48f2bdf3b40b68adec8d5267a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emirhan=20Durmu=C5=9F?= Date: Fri, 16 May 2025 16:51:09 +0300 Subject: [PATCH 153/178] new secret and certificate endpoints added, router mtls by default, bd migrations and seeders handled by controller, logging improved --- docs/swagger.yaml | 824 +++++++++++++++++- package-lock.json | 350 +++++++- package.json | 11 +- scripts/cli-tests.js | 6 +- src/controllers/agent-controller.js | 7 +- src/controllers/certificate-controller.js | 87 ++ src/controllers/secret-controller.js | 66 ++ src/data/managers/certificate-manager.js | 227 +++++ src/data/managers/secret-manager.js | 57 ++ .../mysql/db_migration_mysql_v1.0.2.sql | 716 +++++++++++++++ .../postgres/db_migration_pg_v1.0.2.sql | 717 +++++++++++++++ .../db_migration_sqlite_v1.0.2.sql} | 79 +- src/data/models/certificate.js | 130 +++ src/data/models/index.js | 60 +- src/data/models/microservicestatus.js | 5 + src/data/models/router.js | 30 +- src/data/models/secret.js | 79 ++ src/data/providers/database-provider.js | 520 ++++++++++- src/data/providers/mysql.js | 57 +- src/data/providers/postgres.js | 58 +- .../seeders/mysql/db_seeder_mysql_v1.0.2.sql | 43 + .../seeders/postgres/db_seeder_pg_v1.0.2.sql | 42 + .../db_seeder_sqlite_v1.0.2.sql} | 0 src/decorators/authorization-decorator.js | 1 + src/helpers/error-messages.js | 13 +- src/helpers/errors.js | 11 +- src/helpers/secret-helper.js | 59 ++ src/helpers/template-helper.js | 378 ++++---- src/logger/index.js | 39 +- src/routes/agent.js | 69 +- src/routes/application.js | 20 +- src/routes/applicationTemplate.js | 16 +- src/routes/catalog.js | 10 +- src/routes/certificate.js | 356 ++++++++ src/routes/config.js | 6 +- src/routes/controller.js | 4 +- src/routes/diagnostics.js | 10 +- src/routes/edgeResource.js | 16 +- src/routes/flow.js | 10 +- src/routes/iofog.js | 22 +- src/routes/microservices.js | 50 +- src/routes/registries.js | 8 +- src/routes/router.js | 4 +- src/routes/routing.js | 10 +- src/routes/secret.js | 246 ++++++ src/routes/tunnel.js | 4 +- src/routes/user.js | 2 +- src/schemas/certificate.js | 144 +++ src/schemas/secret.js | 65 ++ src/services/agent-service.js | 54 +- src/services/certificate-service.js | 605 +++++++++++++ src/services/iofog-service.js | 153 +++- src/services/router-service.js | 303 +++++-- src/services/secret-service.js | 136 +++ src/services/yaml-parser-service.js | 79 +- src/utils/cert.js | 518 +++++++++++ src/utils/k8s-client.js | 153 ++++ 57 files changed, 7148 insertions(+), 597 deletions(-) create mode 100644 src/controllers/certificate-controller.js create mode 100644 src/controllers/secret-controller.js create mode 100644 src/data/managers/certificate-manager.js create mode 100644 src/data/managers/secret-manager.js create mode 100644 src/data/migrations/mysql/db_migration_mysql_v1.0.2.sql create mode 100644 src/data/migrations/postgres/db_migration_pg_v1.0.2.sql rename src/data/migrations/{db_migration_v1.0.2.sql => sqlite/db_migration_sqlite_v1.0.2.sql} (90%) create mode 100644 src/data/models/certificate.js create mode 100644 src/data/models/secret.js create mode 100644 src/data/seeders/mysql/db_seeder_mysql_v1.0.2.sql create mode 100644 src/data/seeders/postgres/db_seeder_pg_v1.0.2.sql rename src/data/seeders/{db_seeder_v1.0.2.sql => sqlite/db_seeder_sqlite_v1.0.2.sql} (100%) create mode 100644 src/helpers/secret-helper.js create mode 100644 src/routes/certificate.js create mode 100644 src/routes/secret.js create mode 100644 src/schemas/certificate.js create mode 100644 src/schemas/secret.js create mode 100644 src/services/certificate-service.js create mode 100644 src/services/secret-service.js create mode 100644 src/utils/cert.js create mode 100644 src/utils/k8s-client.js diff --git a/docs/swagger.yaml b/docs/swagger.yaml index 93ce06d67..28aaad1a1 100755 --- a/docs/swagger.yaml +++ b/docs/swagger.yaml @@ -1,6 +1,6 @@ openapi : "3.0.0" info: - version: 3.4.11 + version: 3.5.0 title: Datasance PoT Controller paths: /status: @@ -476,7 +476,7 @@ paths: requestBody: required: true content: - application/yaml: + multipart/form-data: schema: type: object properties: @@ -619,7 +619,7 @@ paths: requestBody: required: true content: - application/yaml: + multipart/form-data: schema: type: object properties: @@ -677,7 +677,7 @@ paths: requestBody: required: true content: - application/yaml: + multipart/form-data: schema: type: object properties: @@ -813,7 +813,7 @@ paths: requestBody: required: true content: - application/yaml: + multipart/form-data: schema: type: object properties: @@ -895,6 +895,34 @@ paths: description: Not Authorized "500": description: Internal Server Error + /agent/cert: + get: + tags: + - Agent + summary: Move Controller CA to Agent + operationId: agentControllerCert + security: + - agentToken: [] + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/AgentDeprovisioningRequest" + required: true + responses: + "204": + description: Success + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + "400": + description: Bad Request + "401": + description: Not Authorized + "500": + description: Internal Server Error /agent/config: get: tags: @@ -1576,7 +1604,7 @@ paths: requestBody: required: true content: - application/yaml: + multipart/form-data: schema: type: object properties: @@ -1778,7 +1806,7 @@ paths: requestBody: required: true content: - application/yaml: + multipart/form-data: schema: type: object properties: @@ -3155,6 +3183,453 @@ paths: description: Not Found "500": description: Internal Server Error + /secrets: + post: + tags: + - Secrets + summary: Creates a new secret + operationId: createSecret + security: + - userToken: [] + requestBody: + required: true + content: + application/json: + schema: + $ref: "#/components/schemas/SecretCreate" + responses: + "201": + description: Created + content: + application/json: + schema: + $ref: "#/components/schemas/SecretResponse" + "400": + description: Bad Request + "401": + description: Not Authorized + "409": + description: Secret Already Exists + "500": + description: Internal Server Error + get: + tags: + - Secrets + summary: Lists all secrets + operationId: listSecrets + security: + - userToken: [] + responses: + "200": + description: Success + content: + application/json: + schema: + $ref: "#/components/schemas/SecretListResponse" + "401": + description: Not Authorized + "500": + description: Internal Server Error + "/secrets/{name}": + get: + tags: + - Secrets + summary: Gets a secret by name + operationId: getSecret + parameters: + - in: path + name: name + description: Secret name + required: true + schema: + type: string + security: + - userToken: [] + responses: + "200": + description: Success + content: + application/json: + schema: + $ref: "#/components/schemas/SecretResponse" + "401": + description: Not Authorized + "404": + description: Secret Not Found + "500": + description: Internal Server Error + put: + tags: + - Secrets + summary: Updates an existing secret + operationId: updateSecret + parameters: + - in: path + name: name + description: Secret name + required: true + schema: + type: string + security: + - userToken: [] + requestBody: + required: true + content: + application/json: + schema: + $ref: "#/components/schemas/SecretUpdate" + responses: + "200": + description: Success + content: + application/json: + schema: + $ref: "#/components/schemas/SecretResponse" + "400": + description: Bad Request + "401": + description: Not Authorized + "404": + description: Secret Not Found + "500": + description: Internal Server Error + delete: + tags: + - Secrets + summary: Deletes a secret + operationId: deleteSecret + parameters: + - in: path + name: name + description: Secret name + required: true + schema: + type: string + security: + - userToken: [] + responses: + "200": + description: Success + "401": + description: Not Authorized + "404": + description: Secret Not Found + "500": + description: Internal Server Error + /secrets/yaml: + post: + tags: + - Secrets + summary: Create a secret from YAML file + operationId: createSecretFromYAML + security: + - userToken: [] + requestBody: + content: + multipart/form-data: + schema: + type: object + properties: + secret: + type: string + format: binary + responses: + '201': + description: Created + content: + application/json: + schema: + $ref: "#/components/schemas/SecretResponse" + '400': + description: Bad Request + "401": + description: Not Authorized + "409": + description: Secret Already Exists + "500": + description: Internal Server Error + "/secrets/yaml/{name}": + put: + tags: + - Secrets + summary: Updates an existing secret using YAML + operationId: updateSecretFromYAML + parameters: + - in: path + name: name + description: Secret name + required: true + schema: + type: string + security: + - userToken: [] + requestBody: + content: + multipart/form-data: + schema: + type: object + properties: + secret: + type: string + format: binary + responses: + '200': + description: Success + content: + application/json: + schema: + $ref: "#/components/schemas/SecretResponse" + '400': + description: Bad Request + '401': + description: Unauthorized + '404': + description: Secret Not Found + /certificates/ca/{name}: + get: + tags: + - Certificates + summary: Get a Certificate Authority (CA) by name + operationId: getCA + parameters: + - in: path + name: name + description: CA name + required: true + schema: + type: string + security: + - userToken: [] + responses: + '200': + description: Success + content: + application/json: + schema: + $ref: "#/components/schemas/CAResponse" + '401': + description: Unauthorized + '404': + description: CA not found + '500': + description: Internal Server Error + delete: + tags: + - Certificates + summary: Delete a Certificate Authority (CA) by name + operationId: deleteCA + parameters: + - in: path + name: name + description: CA name + required: true + schema: + type: string + security: + - userToken: [] + responses: + '200': + description: Success + '401': + description: Unauthorized + '404': + description: CA not found + '500': + description: Internal Server Error + + /certificates: + post: + tags: + - Certificates + summary: Create a new certificate + operationId: createCertificate + security: + - userToken: [] + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/CertificateCreateRequest" + responses: + '201': + description: Created + content: + application/json: + schema: + $ref: "#/components/schemas/CertificateResponse" + '400': + description: Bad Request + '401': + description: Unauthorized + '404': + description: Not Found - Referenced CA not found + '409': + description: Conflict - Certificate already exists + get: + tags: + - Certificates + summary: List all certificates + operationId: listCertificates + security: + - userToken: [] + responses: + '200': + description: Success + content: + application/json: + schema: + $ref: "#/components/schemas/CertificateListResponse" + '401': + description: Unauthorized + '500': + description: Internal Server Error + + /certificates/expiring: + get: + tags: + - Certificates + summary: List certificates that will expire soon + operationId: listExpiringCertificates + parameters: + - in: query + name: days + description: Number of days ahead to check for expiration (default 30) + required: false + schema: + type: integer + default: 30 + security: + - userToken: [] + responses: + '200': + description: Success + content: + application/json: + schema: + $ref: "#/components/schemas/CertificateListResponse" + '400': + description: Bad Request + '401': + description: Unauthorized + '500': + description: Internal Server Error + + /certificates/{name}: + get: + tags: + - Certificates + summary: Get a certificate by name + operationId: getCertificate + parameters: + - in: path + name: name + description: Certificate name + required: true + schema: + type: string + security: + - userToken: [] + responses: + '200': + description: Success + content: + application/json: + schema: + $ref: "#/components/schemas/CertificateResponse" + '401': + description: Unauthorized + '404': + description: Certificate not found + '500': + description: Internal Server Error + delete: + tags: + - Certificates + summary: Delete a certificate by name + operationId: deleteCertificate + parameters: + - in: path + name: name + description: Certificate name + required: true + schema: + type: string + security: + - userToken: [] + responses: + '200': + description: Success + '401': + description: Unauthorized + '404': + description: Certificate not found + '500': + description: Internal Server Error + + /certificates/{name}/renew: + post: + tags: + - Certificates + summary: Renew a certificate + operationId: renewCertificate + parameters: + - in: path + name: name + description: Certificate name + required: true + schema: + type: string + security: + - userToken: [] + responses: + '200': + description: Success + content: + application/json: + schema: + $ref: "#/components/schemas/CertificateRenewResponse" + '400': + description: Bad Request + '401': + description: Unauthorized + '404': + description: Certificate not found + '500': + description: Internal Server Error + /certificates/yaml: + post: + tags: + - Certificates + summary: Create a certificate or CA from YAML file + operationId: createCertificateFromYAML + security: + - userToken: [] + requestBody: + content: + multipart/form-data: + schema: + type: object + properties: + certificate: + type: string + format: binary + responses: + '201': + description: Created + content: + application/json: + schema: + oneOf: + - $ref: "#/components/schemas/CAResponse" + - $ref: "#/components/schemas/CertificateResponse" + '400': + description: Bad Request + '401': + description: Unauthorized + '404': + description: Not Found - Referenced CA not found + '409': + description: Conflict - Certificate or CA already exists tags: - name: Controller description: Manage your controller @@ -3182,6 +3657,10 @@ tags: description: Used by your agents to communicate with your controller - name: User description: Manage your users + - name: Secrets + description: Manage your secrets + - name: Certificates + description: Manage your certificates servers: - url: http://localhost:51121/api/v3 components: @@ -3897,20 +4376,6 @@ components: type: number edgeRouterPort: type: number - requireSsl: - type: string - sslProfile: - type: string - saslMechanisms: - type: string - authenticatePeer: - type: string - caCert: - type: string - tlsCert: - type: string - tlsKey: - type: string host: type: string tags: @@ -5040,4 +5505,319 @@ components: sourceMicroserviceUuid: type: string destMicroserviceUuid: - type: string \ No newline at end of file + type: string + SecretCreate: + type: object + required: + - name + - type + - data + properties: + name: + type: string + minLength: 1 + maxLength: 255 + type: + type: string + enum: [opaque, tls] + data: + type: object + SecretUpdate: + type: object + required: + - data + properties: + data: + type: object + SecretResponse: + type: object + required: + - id + - name + - type + - data + - created_at + - updated_at + properties: + id: + type: integer + name: + type: string + type: + type: string + enum: [opaque, tls] + data: + type: object + created_at: + type: string + format: date-time + updated_at: + type: string + format: date-time + SecretListResponse: + type: object + required: + - secrets + properties: + secrets: + type: array + items: + type: object + required: + - id + - name + - type + - created_at + - updated_at + properties: + id: + type: integer + name: + type: string + type: + type: string + enum: [opaque, tls] + created_at: + type: string + format: date-time + updated_at: + type: string + format: date-time + # Certificate schemas + CACreateRequest: + type: object + required: + - name + - subject + - type + properties: + name: + type: string + description: Name of the CA + subject: + type: string + description: Subject of the CA (CN) + expiration: + type: integer + description: Expiration time in milliseconds + type: + type: string + enum: [k8s-secret, direct, self-signed] + description: Type of CA + secretName: + type: string + description: Name of the secret (required for direct type) + + CAResponse: + type: object + properties: + name: + type: string + description: Name of the CA + subject: + type: string + description: Subject of the CA + is_ca: + type: boolean + description: True if this is a CA + valid_from: + type: string + format: date-time + description: Validity start date + valid_to: + type: string + format: date-time + description: Validity end date + serial_number: + type: string + description: Certificate serial number + data: + type: object + properties: + certificate: + type: string + description: PEM encoded certificate + private_key: + type: string + description: PEM encoded private key + + CAListResponse: + type: object + properties: + cas: + type: array + items: + type: object + properties: + name: + type: string + description: Name of the CA + subject: + type: string + description: Subject of the CA + valid_from: + type: string + format: date-time + description: Validity start date + valid_to: + type: string + format: date-time + description: Validity end date + days_remaining: + type: integer + description: Days until expiration + is_expired: + type: boolean + description: True if certificate is expired + + CertificateCreateRequest: + type: object + required: + - name + - subject + - hosts + properties: + name: + type: string + description: Name of the certificate + subject: + type: string + description: Subject of the certificate (CN) + hosts: + type: string + description: Comma-separated list of hosts + expiration: + type: integer + description: Expiration time in milliseconds + ca: + type: object + properties: + type: + type: string + enum: [k8s-secret, direct, self-signed] + description: Type of CA + secretName: + type: string + description: Name of the CA secret + cert: + type: string + description: PEM encoded certificate (for direct type) + key: + type: string + description: PEM encoded private key (for direct type) + + CertificateResponse: + type: object + properties: + name: + type: string + description: Name of the certificate + subject: + type: string + description: Subject of the certificate + hosts: + type: string + description: Comma-separated list of hosts + is_ca: + type: boolean + description: True if this is a CA + valid_from: + type: string + format: date-time + description: Validity start date + valid_to: + type: string + format: date-time + description: Validity end date + serial_number: + type: string + description: Certificate serial number + ca_name: + type: string + description: Name of the signing CA + certificate_chain: + type: array + items: + type: object + properties: + name: + type: string + subject: + type: string + days_remaining: + type: integer + description: Days until expiration + is_expired: + type: boolean + description: True if certificate is expired + data: + type: object + properties: + certificate: + type: string + description: PEM encoded certificate + private_key: + type: string + description: PEM encoded private key + + CertificateListResponse: + type: object + properties: + certificates: + type: array + items: + type: object + properties: + name: + type: string + description: Name of the certificate + subject: + type: string + description: Subject of the certificate + hosts: + type: string + description: Comma-separated list of hosts + is_ca: + type: boolean + description: True if this is a CA + valid_from: + type: string + format: date-time + description: Validity start date + valid_to: + type: string + format: date-time + description: Validity end date + days_remaining: + type: integer + description: Days until expiration + is_expired: + type: boolean + description: True if certificate is expired + ca_name: + type: string + description: Name of the signing CA + + CertificateRenewResponse: + type: object + properties: + name: + type: string + description: Name of the certificate + subject: + type: string + description: Subject of the certificate + hosts: + type: string + description: Comma-separated list of hosts + valid_from: + type: string + format: date-time + description: New validity start date + valid_to: + type: string + format: date-time + description: New validity end date + renewed: + type: boolean + description: True if certificate was successfully renewed \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 9be6b883e..db97afda7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,6 +11,7 @@ "license": "EPL-2.0", "dependencies": { "@datasance/ecn-viewer": "0.5.4", + "@kubernetes/client-node": "^0.22.3", "@opentelemetry/api": "^1.9.0", "@opentelemetry/exporter-trace-otlp-http": "^0.200.0", "@opentelemetry/instrumentation-express": "^0.48.1", @@ -30,7 +31,7 @@ "ejs": "3.1.10", "express": "4.21.2", "express-session": "1.18.1", - "formidable": "3.5.1", + "formidable": "3.5.4", "ftp": "0.3.10", "globally": "^0.0.0", "helmet": "7.1.0", @@ -48,6 +49,7 @@ "mysql2": "3.10.1", "nconf": "0.12.1", "node-fetch-npm": "^2.0.4", + "node-forge": "^1.3.1", "node-schedule": "^2.1.1", "os": "0.1.2", "path": "0.12.7", @@ -910,6 +912,25 @@ "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, + "node_modules/@isaacs/fs-minipass": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", + "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", + "dependencies": { + "minipass": "^7.0.4" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@isaacs/fs-minipass/node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, "node_modules/@istanbuljs/load-nyc-config": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", @@ -1081,6 +1102,111 @@ "url": "https://opencollective.com/js-sdsl" } }, + "node_modules/@jsep-plugin/assignment": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@jsep-plugin/assignment/-/assignment-1.3.0.tgz", + "integrity": "sha512-VVgV+CXrhbMI3aSusQyclHkenWSAm95WaiKrMxRFam3JSUiIaQjoMIw2sEs/OX4XifnqeQUN4DYbJjlA8EfktQ==", + "engines": { + "node": ">= 10.16.0" + }, + "peerDependencies": { + "jsep": "^0.4.0||^1.0.0" + } + }, + "node_modules/@jsep-plugin/regex": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@jsep-plugin/regex/-/regex-1.0.4.tgz", + "integrity": "sha512-q7qL4Mgjs1vByCaTnDFcBnV9HS7GVPJX5vyVoCgZHNSC9rjwIlmbXG5sUuorR5ndfHAIlJ8pVStxvjXHbNvtUg==", + "engines": { + "node": ">= 10.16.0" + }, + "peerDependencies": { + "jsep": "^0.4.0||^1.0.0" + } + }, + "node_modules/@kubernetes/client-node": { + "version": "0.22.3", + "resolved": "https://registry.npmjs.org/@kubernetes/client-node/-/client-node-0.22.3.tgz", + "integrity": "sha512-dG8uah3+HDJLpJEESshLRZlAZ4PgDeV9mZXT0u1g7oy4KMRzdZ7n5g0JEIlL6QhK51/2ztcIqURAnjfjJt6Z+g==", + "dependencies": { + "byline": "^5.0.0", + "isomorphic-ws": "^5.0.0", + "js-yaml": "^4.1.0", + "jsonpath-plus": "^10.2.0", + "request": "^2.88.0", + "rfc4648": "^1.3.0", + "stream-buffers": "^3.0.2", + "tar": "^7.0.0", + "tslib": "^2.4.1", + "ws": "^8.18.0" + }, + "optionalDependencies": { + "openid-client": "^6.1.3" + } + }, + "node_modules/@kubernetes/client-node/@cypress/request@3.0.8": {}, + "node_modules/@kubernetes/client-node/node_modules/chownr": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", + "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", + "engines": { + "node": ">=18" + } + }, + "node_modules/@kubernetes/client-node/node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/@kubernetes/client-node/node_modules/minizlib": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.0.2.tgz", + "integrity": "sha512-oG62iEk+CYt5Xj2YqI5Xi9xWUeZhDI8jjQmC5oThVH5JGCTgIjr7ciJDzC7MBzYd//WvR1OTmP5Q38Q8ShQtVA==", + "dependencies": { + "minipass": "^7.1.2" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/@kubernetes/client-node/node_modules/tar": { + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.4.3.tgz", + "integrity": "sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==", + "dependencies": { + "@isaacs/fs-minipass": "^4.0.0", + "chownr": "^3.0.0", + "minipass": "^7.1.2", + "minizlib": "^3.0.1", + "mkdirp": "^3.0.1", + "yallist": "^5.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@kubernetes/client-node/node_modules/yallist": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", + "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", + "engines": { + "node": ">=18" + } + }, + "node_modules/@noble/hashes": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz", + "integrity": "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==", + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, "node_modules/@one-ini/wasm": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/@one-ini/wasm/-/wasm-0.1.1.tgz", @@ -2341,6 +2467,14 @@ "node": ">=14" } }, + "node_modules/@paralleldrive/cuid2": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/@paralleldrive/cuid2/-/cuid2-2.2.2.tgz", + "integrity": "sha512-ZOBkgDwEdoYVlSeRbYYXs0S9MejQofiVYoTbKzy/6GQa39/q5tQU2IX46+shYnUkpEl3wc+J6wRlar7r2EK2xA==", + "dependencies": { + "@noble/hashes": "^1.1.5" + } + }, "node_modules/@pkgjs/parseargs": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", @@ -2754,11 +2888,11 @@ "integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==" }, "node_modules/@types/node": { - "version": "20.12.12", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.12.tgz", - "integrity": "sha512-eWLDGF/FOSPtAvEqeRAQ4C8LSA7M1I7i0ky1I8U7kD1J5ITyW3AsRhQrKVoWf5pFKZ2kILsEGJhsI9r93PYnOw==", + "version": "22.15.17", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.15.17.tgz", + "integrity": "sha512-wIX2aSZL5FE+MR0JlvF87BNVrtFWf6AE6rxSE9X7OwnVvoyCQjpzSRJ+M87se/4QCkCiebQAqrJ0y6fwIyi7nw==", "dependencies": { - "undici-types": "~5.26.4" + "undici-types": "~6.21.0" } }, "node_modules/@types/shimmer": { @@ -3646,6 +3780,14 @@ "node": ">=10.16.0" } }, + "node_modules/byline": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/byline/-/byline-5.0.0.tgz", + "integrity": "sha512-s6webAy+R4SR8XVuJWt2V2rGvhnrhxN+9S15GNuTK3wKPOXFF6RNc+8ug2XhH+2s4f+uudG4kUVYmYOQWL2g0Q==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/bytes": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", @@ -6250,14 +6392,17 @@ } }, "node_modules/formidable": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/formidable/-/formidable-3.5.1.tgz", - "integrity": "sha512-WJWKelbRHN41m5dumb0/k8TeAx7Id/y3a+Z7QfhxP/htI9Js5zYaEDtG8uMgG0vM0lOlqnmjE99/kfpOYi/0Og==", + "version": "3.5.4", + "resolved": "https://registry.npmjs.org/formidable/-/formidable-3.5.4.tgz", + "integrity": "sha512-YikH+7CUTOtP44ZTnUhR7Ic2UASBPOqmaRkRKxRbywPTe5VxF7RRCck4af9wutiZ/QKM5nME9Bie2fFaPz5Gug==", "dependencies": { + "@paralleldrive/cuid2": "^2.2.2", "dezalgo": "^1.0.4", - "hexoid": "^1.0.0", "once": "^1.4.0" }, + "engines": { + "node": ">=14.0.0" + }, "funding": { "url": "https://ko-fi.com/tunnckoCore/commissions" } @@ -6892,6 +7037,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/hexoid/-/hexoid-1.0.0.tgz", "integrity": "sha512-QFLV0taWQOZtvIRIAdBChesmogZrtuXvVWsFHZTk2SU+anspqZ2vMnoLg7IE1+Uk16N19APic1BuF8bC8c2m5g==", + "dev": true, "engines": { "node": ">=8" } @@ -7779,6 +7925,14 @@ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" }, + "node_modules/isomorphic-ws": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/isomorphic-ws/-/isomorphic-ws-5.0.0.tgz", + "integrity": "sha512-muId7Zzn9ywDsyXgTIafTry2sV3nySZeUDe6YedVd1Hvuuep5AsIlqK+XefWpYTyJG5e503F2xIuT2lcU6rCSw==", + "peerDependencies": { + "ws": "*" + } + }, "node_modules/isstream": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", @@ -8226,6 +8380,14 @@ "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==", "optional": true }, + "node_modules/jsep": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/jsep/-/jsep-1.4.0.tgz", + "integrity": "sha512-B7qPcEVE3NVkmSJbaYxvv4cHkVW7DQsZz13pUMrfS8z8Q/BuShN+gcTXrUlPiGqM2/t/EEaI030bpxMqY8gMlw==", + "engines": { + "node": ">= 10.16.0" + } + }, "node_modules/jsesc": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", @@ -8306,6 +8468,23 @@ "node": ">= 10.0.0" } }, + "node_modules/jsonpath-plus": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/jsonpath-plus/-/jsonpath-plus-10.3.0.tgz", + "integrity": "sha512-8TNmfeTCk2Le33A3vRRwtuworG/L5RrgMvdjhKZxvyShO+mBu2fP50OWUjRLNtvw344DdDarFh9buFAZs5ujeA==", + "dependencies": { + "@jsep-plugin/assignment": "^1.3.0", + "@jsep-plugin/regex": "^1.0.4", + "jsep": "^1.4.0" + }, + "bin": { + "jsonpath": "bin/jsonpath-cli.js", + "jsonpath-plus": "bin/jsonpath-cli.js" + }, + "engines": { + "node": ">=18.0.0" + } + }, "node_modules/jsonschema": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/jsonschema/-/jsonschema-1.4.1.tgz", @@ -8878,7 +9057,6 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz", "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==", - "dev": true, "bin": { "mkdirp": "dist/cjs/src/bin.js" }, @@ -9345,7 +9523,6 @@ "version": "1.3.1", "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", - "dev": true, "engines": { "node": ">= 6.13.0" } @@ -9676,6 +9853,15 @@ "node": "*" } }, + "node_modules/oauth4webapi": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/oauth4webapi/-/oauth4webapi-3.5.1.tgz", + "integrity": "sha512-txg/jZQwcbaF7PMJgY7aoxc9QuCxHVFMiEkDIJ60DwDz3PbtXPQnrzo+3X4IRYGChIwWLabRBRpf1k9hO9+xrQ==", + "optional": true, + "funding": { + "url": "https://github.com/sponsors/panva" + } + }, "node_modules/object-assign": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.0.1.tgz", @@ -9780,6 +9966,28 @@ "node": ">=4" } }, + "node_modules/openid-client": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/openid-client/-/openid-client-6.5.0.tgz", + "integrity": "sha512-fAfYaTnOYE2kQCqEJGX9KDObW2aw7IQy4jWpU/+3D3WoCFLbix5Hg6qIPQ6Js9r7f8jDUmsnnguRNCSw4wU/IQ==", + "optional": true, + "dependencies": { + "jose": "^6.0.10", + "oauth4webapi": "^3.5.1" + }, + "funding": { + "url": "https://github.com/sponsors/panva" + } + }, + "node_modules/openid-client/node_modules/jose": { + "version": "6.0.11", + "resolved": "https://registry.npmjs.org/jose/-/jose-6.0.11.tgz", + "integrity": "sha512-QxG7EaliDARm1O1S8BGakqncGT9s25bKL1WSf6/oa17Tkqwi8D2ZNglqCF+DsYF88/rV66Q/Q2mFAy697E1DUg==", + "optional": true, + "funding": { + "url": "https://github.com/sponsors/panva" + } + }, "node_modules/optionator": { "version": "0.9.4", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", @@ -9953,20 +10161,6 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "optional": true }, - "node_modules/pac-proxy-agent/node_modules/socks-proxy-agent": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.3.tgz", - "integrity": "sha512-VNegTZKhuGq5vSD6XNKlbqWhyt/40CgoEw8XxD6dhnm8Jq9IEa3nIa4HwnM8XOqU0CdB0BwWVXusqiFXfHB3+A==", - "optional": true, - "dependencies": { - "agent-base": "^7.1.1", - "debug": "^4.3.4", - "socks": "^2.7.1" - }, - "engines": { - "node": ">= 14" - } - }, "node_modules/pac-resolver": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-7.0.1.tgz", @@ -11023,20 +11217,6 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "optional": true }, - "node_modules/proxy-agent/node_modules/socks-proxy-agent": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.3.tgz", - "integrity": "sha512-VNegTZKhuGq5vSD6XNKlbqWhyt/40CgoEw8XxD6dhnm8Jq9IEa3nIa4HwnM8XOqU0CdB0BwWVXusqiFXfHB3+A==", - "optional": true, - "dependencies": { - "agent-base": "^7.1.1", - "debug": "^4.3.4", - "socks": "^2.7.1" - }, - "engines": { - "node": ">= 14" - } - }, "node_modules/proxy-from-env": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", @@ -11431,6 +11611,10 @@ "node": ">=4" } }, + "node_modules/request": { + "resolved": "node_modules/@kubernetes/client-node/@cypress/request@3.0.8", + "link": true + }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -11559,6 +11743,11 @@ "resolved": "https://registry.npmjs.org/retry-as-promised/-/retry-as-promised-7.0.4.tgz", "integrity": "sha512-XgmCoxKWkDofwH8WddD0w85ZfqYz+ZHlr5yo+3YUCfycWawU56T5ckWXsScsj5B8tqUcIG67DxXByo3VUgiAdA==" }, + "node_modules/rfc4648": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/rfc4648/-/rfc4648-1.5.4.tgz", + "integrity": "sha512-rRg/6Lb+IGfJqO05HZkN50UtY7K/JhxJag1kP23+zyMfrvoB0B7RWv06MbOzoc79RgCdNTiUaNsTT1AJZ7Z+cg==" + }, "node_modules/roarr": { "version": "2.15.4", "resolved": "https://registry.npmjs.org/roarr/-/roarr-2.15.4.tgz", @@ -12209,6 +12398,52 @@ "npm": ">= 3.0.0" } }, + "node_modules/socks-proxy-agent": { + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.5.tgz", + "integrity": "sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==", + "optional": true, + "dependencies": { + "agent-base": "^7.1.2", + "debug": "^4.3.4", + "socks": "^2.8.3" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/socks-proxy-agent/node_modules/agent-base": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz", + "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==", + "optional": true, + "engines": { + "node": ">= 14" + } + }, + "node_modules/socks-proxy-agent/node_modules/debug": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "optional": true, + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/socks-proxy-agent/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==", + "optional": true + }, "node_modules/sonic-boom": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-4.0.1.tgz", @@ -13373,6 +13608,14 @@ "node": ">= 0.8" } }, + "node_modules/stream-buffers": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/stream-buffers/-/stream-buffers-3.0.3.tgz", + "integrity": "sha512-pqMqwQCso0PBJt2PQmDO0cFj0lyqmiwOMiMSkVtRokl7e+ZTRYgDHKnuZNbqjiJXgsg4nuqtD/zxuo9KqTp0Yw==", + "engines": { + "node": ">= 0.10.0" + } + }, "node_modules/stream-length": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/stream-length/-/stream-length-1.0.2.tgz", @@ -14067,8 +14310,7 @@ "node_modules/tslib": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", - "optional": true + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" }, "node_modules/tunnel-agent": { "version": "0.6.0", @@ -14301,9 +14543,9 @@ "integrity": "sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==" }, "node_modules/undici-types": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==" }, "node_modules/uniq": { "version": "1.0.1", @@ -14709,6 +14951,26 @@ "mkdirp": "bin/cmd.js" } }, + "node_modules/ws": { + "version": "8.18.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.2.tgz", + "integrity": "sha512-DMricUmwGZUVr++AEAe2uiVM7UoO9MAVZMDu05UQOaUII0lp+zOzLLU4Xqh/JvTqklB1T4uELaaPBKyjE1r4fQ==", + "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 + } + } + }, "node_modules/xml": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/xml/-/xml-1.0.1.tgz", diff --git a/package.json b/package.json index 4d56685d5..d7473c818 100644 --- a/package.json +++ b/package.json @@ -56,6 +56,7 @@ }, "dependencies": { "@datasance/ecn-viewer": "0.5.4", + "@kubernetes/client-node": "^0.22.3", "axios": "1.8.4", "body-parser": "^1.20.3", "child_process": "1.0.2", @@ -69,7 +70,7 @@ "ejs": "3.1.10", "express": "4.21.2", "express-session": "1.18.1", - "formidable": "3.5.1", + "formidable": "3.5.4", "ftp": "0.3.10", "globally": "^0.0.0", "helmet": "7.1.0", @@ -87,6 +88,7 @@ "mysql2": "3.10.1", "nconf": "0.12.1", "node-fetch-npm": "^2.0.4", + "node-forge": "^1.3.1", "node-schedule": "^2.1.1", "os": "0.1.2", "path": "0.12.7", @@ -137,5 +139,10 @@ ".jshintrc", ".snyk" ], - "type": "commonjs" + "type": "commonjs", + "overrides": { + "@kubernetes/client-node": { + "request": "@cypress/request@3.0.8" + } + } } diff --git a/scripts/cli-tests.js b/scripts/cli-tests.js index 7f8f1148a..e64f86f39 100644 --- a/scripts/cli-tests.js +++ b/scripts/cli-tests.js @@ -65,9 +65,9 @@ async function seedTestData () { fogType: 1, isSystem: true, routerMode: 'interior', - messagingPort: 5672, - edgeRouterPort: 56722, - interRouterPort: 56721, + messagingPort: 5671, + edgeRouterPort: 45671, + interRouterPort: 55671, host: 'localhost' }, { }, false) const defaultRouter = await RouterService.findOne({ isDefault: true }) diff --git a/src/controllers/agent-controller.js b/src/controllers/agent-controller.js index a3c1e794a..223ef9aab 100644 --- a/src/controllers/agent-controller.js +++ b/src/controllers/agent-controller.js @@ -110,6 +110,10 @@ const putImageSnapshotEndPoint = async function (req, fog) { return AgentService.putImageSnapshot(req, fog) } +const getControllerCAEndPoint = async function (req, fog) { + return AgentService.getControllerCA(fog) +} + module.exports = { agentProvisionEndPoint: agentProvisionEndPoint, agentDeprovisionEndPoint: AuthDecorator.checkFogToken(agentDeprovisionEndPoint), @@ -130,5 +134,6 @@ module.exports = { getImageSnapshotEndPoint: AuthDecorator.checkFogToken(getImageSnapshotEndPoint), putImageSnapshotEndPoint: AuthDecorator.checkFogToken(putImageSnapshotEndPoint), resetAgentConfigChangesEndPoint: AuthDecorator.checkFogToken(resetAgentConfigChangesEndPoint), - getAgentLinkedEdgeResourcesEndpoint: AuthDecorator.checkFogToken(getAgentLinkedEdgeResourcesEndpoint) + getAgentLinkedEdgeResourcesEndpoint: AuthDecorator.checkFogToken(getAgentLinkedEdgeResourcesEndpoint), + getControllerCAEndPoint: AuthDecorator.checkFogToken(getControllerCAEndPoint) } diff --git a/src/controllers/certificate-controller.js b/src/controllers/certificate-controller.js new file mode 100644 index 000000000..3271c5c60 --- /dev/null +++ b/src/controllers/certificate-controller.js @@ -0,0 +1,87 @@ +const CertificateService = require('../services/certificate-service') +const YamlParserService = require('../services/yaml-parser-service') + +// CA Management +const createCAEndpoint = async function (req) { + const ca = req.body + return CertificateService.createCAEndpoint(ca) +} + +const getCAEndpoint = async function (req) { + const name = req.params.name + return CertificateService.getCAEndpoint(name) +} + +const listCAEndpoint = async function (req) { + return CertificateService.listCAEndpoint() +} + +const deleteCAEndpoint = async function (req) { + const name = req.params.name + return CertificateService.deleteCAEndpoint(name) +} + +// Certificate Management +const createCertificateEndpoint = async function (req) { + const cert = req.body + return CertificateService.createCertificateEndpoint(cert) +} + +const getCertificateEndpoint = async function (req) { + const name = req.params.name + return CertificateService.getCertificateEndpoint(name) +} + +const listCertificatesEndpoint = async function (req) { + return CertificateService.listCertificatesEndpoint() +} + +const deleteCertificateEndpoint = async function (req) { + const name = req.params.name + return CertificateService.deleteCertificateEndpoint(name) +} + +// Certificate Renewal +const renewCertificateEndpoint = async function (req) { + const name = req.params.name + return CertificateService.renewCertificateEndpoint(name) +} + +// List Expiring Certificates +const listExpiringCertificatesEndpoint = async function (req) { + const days = req.query.days ? parseInt(req.query.days) : 30 + return CertificateService.listExpiringCertificatesEndpoint(days) +} + +// YAML Endpoint +const createCertificateFromYamlEndpoint = async function (req) { + const fileContent = req.file.buffer.toString() + const certData = await YamlParserService.parseCertificateFile(fileContent) + + if (certData.isCA) { + delete certData.isCA + return CertificateService.createCAEndpoint(certData) + } else { + return CertificateService.createCertificateEndpoint(certData) + } +} + +module.exports = { + // CA endpoints + createCAEndpoint, + getCAEndpoint, + listCAEndpoint, + deleteCAEndpoint, + + // Certificate endpoints + createCertificateEndpoint, + getCertificateEndpoint, + listCertificatesEndpoint, + deleteCertificateEndpoint, + // Certificate renewal endpoints + renewCertificateEndpoint, + listExpiringCertificatesEndpoint, + + // YAML endpoints + createCertificateFromYamlEndpoint +} diff --git a/src/controllers/secret-controller.js b/src/controllers/secret-controller.js new file mode 100644 index 000000000..d4457a068 --- /dev/null +++ b/src/controllers/secret-controller.js @@ -0,0 +1,66 @@ +/* + * ******************************************************************************* + * * Copyright (c) 2023 Datasance Teknoloji A.S. + * * + * * This program and the accompanying materials are made available under the + * * terms of the Eclipse Public License v. 2.0 which is available at + * * http://www.eclipse.org/legal/epl-2.0 + * * + * * SPDX-License-Identifier: EPL-2.0 + * ******************************************************************************* + * + */ + +const SecretService = require('../services/secret-service') +const YamlParserService = require('../services/yaml-parser-service') + +const createSecretEndpoint = async function (req) { + const secret = req.body + return SecretService.createSecretEndpoint(secret) +} + +const updateSecretEndpoint = async function (req) { + const secret = req.body + const secretName = req.params.name + return SecretService.updateSecretEndpoint(secretName, secret) +} + +const getSecretEndpoint = async function (req) { + const secretName = req.params.name + return SecretService.getSecretEndpoint(secretName) +} + +const listSecretsEndpoint = async function (req) { + return SecretService.listSecretsEndpoint() +} + +const deleteSecretEndpoint = async function (req) { + const secretName = req.params.name + return SecretService.deleteSecretEndpoint(secretName) +} + +const createSecretFromYamlEndpoint = async function (req) { + const fileContent = req.file.buffer.toString() + const secretData = await YamlParserService.parseSecretFile(fileContent) + return SecretService.createSecretEndpoint(secretData) +} + +const updateSecretFromYamlEndpoint = async function (req) { + const fileContent = req.file.buffer.toString() + const secretName = req.params.name + const secretData = await YamlParserService.parseSecretFile(fileContent, { + isUpdate: true, + secretName: secretName + }) + return SecretService.updateSecretEndpoint(secretName, secretData) +} + +module.exports = { + createSecretEndpoint, + updateSecretEndpoint, + getSecretEndpoint, + listSecretsEndpoint, + deleteSecretEndpoint, + createSecretFromYamlEndpoint, + updateSecretFromYamlEndpoint +} diff --git a/src/data/managers/certificate-manager.js b/src/data/managers/certificate-manager.js new file mode 100644 index 000000000..a54c62a06 --- /dev/null +++ b/src/data/managers/certificate-manager.js @@ -0,0 +1,227 @@ +const BaseManager = require('./base-manager') +const models = require('../models') +const Certificate = models.Certificate +const { Op } = require('sequelize') +const SecretManager = require('./secret-manager') +const AppHelper = require('../../helpers/app-helper') + +class CertificateManager extends BaseManager { + getEntity () { + return Certificate + } + + async createCertificateRecord (certData, transaction) { + // First find the secret by name to get its ID + const secret = await SecretManager.findOne({ name: certData.name }, transaction) + + if (secret) { + // Link the certificate to the secret + certData.secretId = secret.id + } + + return this.create(certData, transaction) + } + + async findCertificatesByCA (caId, transaction) { + AppHelper.checkTransaction(transaction) + + const options = transaction.fakeTransaction + ? { + where: { signedById: caId }, + include: ['secret'] } + : { + where: { signedById: caId }, + include: ['secret'], + transaction: transaction } + return this.getEntity().findAll(options) + } + + async findExpiringCertificates (days = 30, transaction) { + AppHelper.checkTransaction(transaction) + + const expirationDate = new Date() + expirationDate.setDate(expirationDate.getDate() + days) + + const options = transaction.fakeTransaction + ? { + where: { validTo: { [Op.lt]: expirationDate + } + }, + include: ['signingCA'] } + : { + where: { validTo: { [Op.lt]: expirationDate + } + }, + include: ['signingCA'], + transaction: transaction } + return this.getEntity().findAll(options) + } + + async findCertificateByName (name, transaction) { + AppHelper.checkTransaction(transaction) + + const options = transaction.fakeTransaction + ? { + where: { name }, + include: ['signingCA', 'secret'] } + : { + where: { name }, + include: ['signingCA', 'secret'], + transaction: transaction } + return this.getEntity().findOne(options) + } + + async findAllCAs (transaction) { + AppHelper.checkTransaction(transaction) + + const options = transaction.fakeTransaction + ? { + where: { isCA: true }, + include: ['secret'] } + : { + where: { isCA: true }, + include: ['secret'], + transaction: transaction } + return this.getEntity().findAll(options) + } + + async findAllCertificates (transaction) { + AppHelper.checkTransaction(transaction) + + const options = transaction.fakeTransaction + ? { + include: ['signingCA', 'secret'] } + : { + include: ['signingCA', 'secret'], + transaction: transaction } + return this.getEntity().findAll(options) + } + + async deleteCertificate (name, transaction) { + return this.delete({ name }, transaction) + } + + async updateCertificate (id, updates, transaction) { + AppHelper.checkTransaction(transaction) + + // Find existing certificate + const options = transaction.fakeTransaction + ? { + where: { id } } + : { + where: { id }, + transaction: transaction } + const cert = await this.getEntity().findOne(options) + + if (!cert) { + throw new Error(`Certificate with id ${id} not found`) + } + + // Update certificate + return this.update({ id }, updates, transaction) + } + + async findExpiredCertificates (transaction) { + AppHelper.checkTransaction(transaction) + + const currentDate = new Date() + + const options = transaction.fakeTransaction + ? { + where: { validTo: { [Op.lt]: currentDate + } + }, + include: ['signingCA', 'secret'] } + : { + where: { validTo: { [Op.lt]: currentDate + } + }, + include: ['signingCA', 'secret'], + transaction: transaction } + return this.getEntity().findAll(options) + } + + async getCertificateChain (certId, transaction) { + AppHelper.checkTransaction(transaction) + const chain = [] + + const options = transaction.fakeTransaction + ? { + where: { id: certId }, + include: ['signingCA', 'secret'] } + : { + where: { id: certId }, + include: ['signingCA', 'secret'], + transaction: transaction } + let currentCert = await this.getEntity().findOne(options) + + if (!currentCert) { + return chain + } + + chain.push(currentCert) + + // Traverse up the chain of signing CAs + while (currentCert.signingCA) { + const parentOptions = transaction.fakeTransaction + ? { where: { id: currentCert.signedById }, include: ['signingCA', 'secret'] + } + : { where: { id: currentCert.signedById }, include: ['signingCA', 'secret'], transaction: transaction + } + currentCert = await this.getEntity().findOne(parentOptions) + + if (currentCert) { + chain.push(currentCert) + } else { + break + } + } + + return chain + } + + async findCertificatesForRenewal (days = 30, transaction) { + AppHelper.checkTransaction(transaction) + + // Calculate the date range - we want certificates that expire between now and (now + days) + const now = new Date() + const futureDate = new Date() + futureDate.setDate(futureDate.getDate() + days) + + const options = transaction.fakeTransaction + ? { + where: { + validTo: { + [Op.gt]: now, + [Op.lt]: futureDate + } + }, + include: ['signingCA', 'secret'] } + : { + where: { + validTo: { + [Op.gt]: now, + [Op.lt]: futureDate + } + }, + include: ['signingCA', 'secret'], + transaction: transaction } + return this.getEntity().findAll(options) + } + + async getCertificateChildren (caId, transaction) { + AppHelper.checkTransaction(transaction) + + const options = transaction.fakeTransaction + ? { + where: { signedById: caId }, + include: ['secret'] } + : { + where: { signedById: caId }, + include: ['secret'], + transaction: transaction } + return this.getEntity().findAll(options) + } +} + +module.exports = new CertificateManager() diff --git a/src/data/managers/secret-manager.js b/src/data/managers/secret-manager.js new file mode 100644 index 000000000..6cca804a4 --- /dev/null +++ b/src/data/managers/secret-manager.js @@ -0,0 +1,57 @@ +const BaseManager = require('./base-manager') +const SecretHelper = require('../../helpers/secret-helper') +const models = require('../models') +const Secret = models.Secret + +class SecretManager extends BaseManager { + getEntity () { + return Secret + } + + async createSecret (name, type, data, transaction) { + // const encryptedData = await SecretHelper.encryptSecret(data, name) + return this.create({ + name, + type, + data: data + }, transaction) + } + + async updateSecret (name, data, transaction) { + const encryptedData = await SecretHelper.encryptSecret(data, name) + return this.update( + { name }, + { data: encryptedData }, + transaction + ) + } + + async getSecret (name, transaction) { + const secret = await this.findOne({ name }, transaction) + if (!secret) { + return null + } + // const decryptedData = await SecretHelper.decryptSecret(secret.data, name) + return { + ...secret.toJSON(), + data: secret.data + } + } + + async listSecrets (transaction) { + const secrets = await this.findAll({}, transaction) + return secrets.map(secret => ({ + id: secret.id, + name: secret.name, + type: secret.type, + created_at: secret.created_at, + updated_at: secret.updated_at + })) + } + + async deleteSecret (name, transaction) { + return this.delete({ name }, transaction) + } +} + +module.exports = new SecretManager() diff --git a/src/data/migrations/mysql/db_migration_mysql_v1.0.2.sql b/src/data/migrations/mysql/db_migration_mysql_v1.0.2.sql new file mode 100644 index 000000000..5cb25c7dc --- /dev/null +++ b/src/data/migrations/mysql/db_migration_mysql_v1.0.2.sql @@ -0,0 +1,716 @@ +START TRANSACTION; + +CREATE TABLE IF NOT EXISTS Flows ( + id INT AUTO_INCREMENT PRIMARY KEY, + name VARCHAR(255) UNIQUE, + description VARCHAR(255) DEFAULT '', + is_activated BOOLEAN DEFAULT false, + is_system BOOLEAN DEFAULT false, + created_at DATETIME, + updated_at DATETIME +); + +CREATE TABLE IF NOT EXISTS Registries ( + id INT AUTO_INCREMENT PRIMARY KEY, + url VARCHAR(255), + is_public BOOLEAN, + secure BOOLEAN, + certificate TEXT, + requires_cert BOOLEAN, + user_name TEXT, + password TEXT, + user_email TEXT +); + + +CREATE TABLE IF NOT EXISTS CatalogItems ( + id INT AUTO_INCREMENT PRIMARY KEY, + name VARCHAR(255) UNIQUE, + description VARCHAR(255), + category TEXT, + config_example VARCHAR(255) DEFAULT '{}', + publisher TEXT, + disk_required BIGINT DEFAULT 0, + ram_required BIGINT DEFAULT 0, + picture VARCHAR(255) DEFAULT 'images/shared/default.png', + is_public BOOLEAN DEFAULT false, + registry_id INT, + FOREIGN KEY (registry_id) REFERENCES Registries (id) ON DELETE SET NULL +); + +CREATE INDEX idx_catalog_item_registry_id ON CatalogItems (registry_id); + + +CREATE TABLE IF NOT EXISTS FogTypes ( + id INT PRIMARY KEY, + name TEXT, + image TEXT, + description TEXT, + network_catalog_item_id INT, + hal_catalog_item_id INT, + bluetooth_catalog_item_id INT, + FOREIGN KEY (network_catalog_item_id) REFERENCES CatalogItems (id) ON DELETE CASCADE, + FOREIGN KEY (hal_catalog_item_id) REFERENCES CatalogItems (id) ON DELETE CASCADE, + FOREIGN KEY (bluetooth_catalog_item_id) REFERENCES CatalogItems (id) ON DELETE CASCADE +); + +CREATE INDEX idx_fog_type_network_catalog_item_id ON FogTypes (network_catalog_item_id); +CREATE INDEX idx_fog_type_hal_catalog_item_id ON FogTypes (hal_catalog_item_id); +CREATE INDEX idx_fog_type_bluetooth_catalog_item_id ON FogTypes (bluetooth_catalog_item_id); + + +CREATE TABLE IF NOT EXISTS Fogs ( + uuid VARCHAR(32) PRIMARY KEY NOT NULL, + name VARCHAR(255) DEFAULT 'Unnamed ioFog 1', + location TEXT, + gps_mode TEXT, + latitude FLOAT, + longitude FLOAT, + description TEXT, + last_active BIGINT, + daemon_status VARCHAR(32) DEFAULT 'UNKNOWN', + daemon_operating_duration BIGINT DEFAULT 0, + daemon_last_start BIGINT, + memory_usage FLOAT DEFAULT 0.000, + disk_usage FLOAT DEFAULT 0.000, + cpu_usage FLOAT DEFAULT 0.00, + memory_violation TEXT, + disk_violation TEXT, + cpu_violation TEXT, + `system-available-disk` BIGINT, + `system-available-memory` BIGINT, + `system-total-cpu` FLOAT, + security_status VARCHAR(32) DEFAULT 'OK', + security_violation_info VARCHAR(32) DEFAULT 'No violation', + catalog_item_status TEXT, + repository_count BIGINT DEFAULT 0, + repository_status TEXT, + system_time BIGINT, + last_status_time BIGINT, + ip_address VARCHAR(32) DEFAULT '0.0.0.0', + ip_address_external VARCHAR(32) DEFAULT '0.0.0.0', + host VARCHAR(32), + processed_messages BIGINT DEFAULT 0, + catalog_item_message_counts TEXT, + message_speed FLOAT DEFAULT 0.000, + last_command_time BIGINT, + network_interface VARCHAR(32) DEFAULT 'dynamic', + docker_url VARCHAR(255) DEFAULT 'unix:///var/run/docker.sock', + disk_limit FLOAT DEFAULT 50, + disk_directory VARCHAR(255) DEFAULT '/var/lib/iofog/', + memory_limit FLOAT DEFAULT 4096, + cpu_limit FLOAT DEFAULT 80, + log_limit FLOAT DEFAULT 10, + log_directory VARCHAR(255) DEFAULT '/var/log/iofog/', + bluetooth BOOLEAN DEFAULT FALSE, + hal BOOLEAN DEFAULT FALSE, + log_file_count BIGINT DEFAULT 10, + `version` TEXT, + is_ready_to_upgrade BOOLEAN DEFAULT TRUE, + is_ready_to_rollback BOOLEAN DEFAULT FALSE, + status_frequency INT DEFAULT 10, + change_frequency INT DEFAULT 20, + device_scan_frequency INT DEFAULT 20, + tunnel VARCHAR(255) DEFAULT '', + isolated_docker_container BOOLEAN DEFAULT TRUE, + docker_pruning_freq INT DEFAULT 1, + available_disk_threshold FLOAT DEFAULT 20, + log_level VARCHAR(10) DEFAULT 'INFO', + is_system BOOLEAN DEFAULT FALSE, + router_id INT DEFAULT 0, + time_zone VARCHAR(32) DEFAULT 'Etc/UTC', + created_at DATETIME, + updated_at DATETIME, + fog_type_id INT DEFAULT 0, + FOREIGN KEY (fog_type_id) REFERENCES FogTypes (id) +); + +CREATE INDEX idx_fog_fog_type_id ON Fogs (fog_type_id); + +CREATE TABLE IF NOT EXISTS ChangeTrackings ( + id INT AUTO_INCREMENT PRIMARY KEY NOT NULL, + microservice_config BOOLEAN DEFAULT false, + reboot BOOLEAN DEFAULT false, + deletenode BOOLEAN DEFAULT false, + version BOOLEAN DEFAULT false, + microservice_list BOOLEAN DEFAULT false, + config BOOLEAN DEFAULT false, + routing BOOLEAN DEFAULT false, + registries BOOLEAN DEFAULT false, + tunnel BOOLEAN DEFAULT false, + diagnostics BOOLEAN DEFAULT false, + router_changed BOOLEAN DEFAULT false, + image_snapshot BOOLEAN DEFAULT false, + prune BOOLEAN DEFAULT false, + linked_edge_resources BOOLEAN DEFAULT false, + last_updated VARCHAR(255) DEFAULT false, + iofog_uuid VARCHAR(32), + FOREIGN KEY (iofog_uuid) REFERENCES Fogs (uuid) ON DELETE CASCADE +); + +CREATE INDEX idx_change_tracking_iofog_uuid ON ChangeTrackings (iofog_uuid); + +CREATE TABLE IF NOT EXISTS FogAccessTokens ( + id INT AUTO_INCREMENT PRIMARY KEY NOT NULL, + expiration_time BIGINT, + token TEXT, + iofog_uuid VARCHAR(32), + FOREIGN KEY (iofog_uuid) REFERENCES Fogs (uuid) ON DELETE CASCADE +); + +CREATE INDEX idx_fog_access_tokens_iofogUuid ON FogAccessTokens (iofog_uuid); + +CREATE TABLE IF NOT EXISTS FogProvisionKeys ( + id INT AUTO_INCREMENT PRIMARY KEY NOT NULL, + provisioning_string VARCHAR(100), + expiration_time BIGINT, + iofog_uuid VARCHAR(32), + FOREIGN KEY (iofog_uuid) REFERENCES Fogs (uuid) ON DELETE CASCADE +); + +CREATE INDEX idx_fog_provision_keys_iofogUuid ON FogProvisionKeys (iofog_uuid); + +CREATE TABLE IF NOT EXISTS FogVersionCommands ( + id INT AUTO_INCREMENT PRIMARY KEY NOT NULL, + version_command VARCHAR(100), + iofog_uuid VARCHAR(32), + FOREIGN KEY (iofog_uuid) REFERENCES Fogs (uuid) ON DELETE CASCADE +); + +CREATE INDEX idx_fog_version_commands_iofogUuid ON FogVersionCommands (iofog_uuid); + +CREATE TABLE IF NOT EXISTS HWInfos ( + id INT AUTO_INCREMENT PRIMARY KEY NOT NULL, + info TEXT, + created_at DATETIME, + updated_at DATETIME, + iofog_uuid VARCHAR(32), + FOREIGN KEY (iofog_uuid) REFERENCES Fogs (uuid) ON DELETE CASCADE +); + +CREATE INDEX idx_hw_infos_iofogUuid ON HWInfos (iofog_uuid); + +CREATE TABLE IF NOT EXISTS USBInfos ( + id INT AUTO_INCREMENT PRIMARY KEY NOT NULL, + info TEXT, + created_at DATETIME, + updated_at DATETIME, + iofog_uuid VARCHAR(32), + FOREIGN KEY (iofog_uuid) REFERENCES Fogs (uuid) ON DELETE CASCADE +); + +CREATE INDEX idx_usb_infos_iofogUuid ON USBInfos (iofog_uuid); + +CREATE TABLE IF NOT EXISTS Tunnels ( + id INT AUTO_INCREMENT PRIMARY KEY NOT NULL, + username TEXT, + password TEXT, + host TEXT, + remote_port INT, + local_port INT DEFAULT 22, + rsa_key TEXT, + closed BOOLEAN DEFAULT false, + iofog_uuid VARCHAR(32), + FOREIGN KEY (iofog_uuid) REFERENCES Fogs (uuid) ON DELETE CASCADE +); + +CREATE INDEX idx_tunnels_iofogUuid ON Tunnels (iofog_uuid); + +CREATE TABLE IF NOT EXISTS Microservices ( + uuid VARCHAR(32) PRIMARY KEY NOT NULL, + config TEXT, + name VARCHAR(255) DEFAULT 'New Microservice', + config_last_updated BIGINT, + rebuild BOOLEAN DEFAULT false, + root_host_access BOOLEAN DEFAULT false, + log_size BIGINT DEFAULT 0, + image_snapshot VARCHAR(255) DEFAULT '', + `delete` BOOLEAN DEFAULT false, + delete_with_cleanup BOOLEAN DEFAULT false, + created_at DATETIME, + updated_at DATETIME, + catalog_item_id INT, + registry_id INT DEFAULT 1, + iofog_uuid VARCHAR(32), + application_id INT, + FOREIGN KEY (catalog_item_id) REFERENCES CatalogItems (id) ON DELETE CASCADE, + FOREIGN KEY (registry_id) REFERENCES Registries (id) ON DELETE SET NULL, + FOREIGN KEY (iofog_uuid) REFERENCES Fogs (uuid) ON DELETE CASCADE, + FOREIGN KEY (application_id) REFERENCES Flows (id) ON DELETE CASCADE +); + +CREATE INDEX idx_microservices_catalogItemId ON Microservices (catalog_item_id); +CREATE INDEX idx_microservices_registryId ON Microservices (registry_id); +CREATE INDEX idx_microservices_iofogUuid ON Microservices (iofog_uuid); +CREATE INDEX idx_microservices_applicationId ON Microservices (application_id); + +CREATE TABLE IF NOT EXISTS MicroserviceArgs ( + id INT AUTO_INCREMENT PRIMARY KEY NOT NULL, + cmd TEXT, + microservice_uuid VARCHAR(32), + FOREIGN KEY (microservice_uuid) REFERENCES Microservices (uuid) ON DELETE CASCADE +); + +CREATE INDEX idx_microservice_args_microserviceUuid ON MicroserviceArgs (microservice_uuid); + +CREATE TABLE IF NOT EXISTS MicroserviceEnvs ( + id INT AUTO_INCREMENT PRIMARY KEY NOT NULL, + `key` TEXT, + `value` TEXT, + microservice_uuid VARCHAR(32), + FOREIGN KEY (microservice_uuid) REFERENCES Microservices (uuid) ON DELETE CASCADE +); + +CREATE INDEX idx_microservice_envs_microserviceUuid ON MicroserviceEnvs (microservice_uuid); + +CREATE TABLE IF NOT EXISTS MicroserviceExtraHost ( + id INT AUTO_INCREMENT PRIMARY KEY NOT NULL, + template_type TEXT, + name TEXT, + public_port INT, + template TEXT, + `value` TEXT, + microservice_uuid VARCHAR(32), + target_microservice_uuid VARCHAR(32), + target_fog_uuid VARCHAR(32), + FOREIGN KEY (microservice_uuid) REFERENCES Microservices (uuid) ON DELETE CASCADE, + FOREIGN KEY (target_microservice_uuid) REFERENCES Microservices (uuid) ON DELETE CASCADE, + FOREIGN KEY (target_fog_uuid) REFERENCES Fogs (uuid) ON DELETE CASCADE +); + +CREATE INDEX idx_microservice_extra_host_microserviceUuid ON MicroserviceExtraHost (microservice_uuid); +CREATE INDEX idx_microservice_extra_host_targetMicroserviceUuid ON MicroserviceExtraHost (target_microservice_uuid); +CREATE INDEX idx_microservice_extra_host_targetFogUuid ON MicroserviceExtraHost (target_fog_uuid); + +CREATE TABLE IF NOT EXISTS MicroservicePorts ( + id INT AUTO_INCREMENT PRIMARY KEY NOT NULL, + port_internal INT, + port_external INT, + is_udp BOOLEAN, + is_public BOOLEAN, + is_proxy BOOLEAN, + created_at DATETIME, + updated_at DATETIME, + microservice_uuid VARCHAR(32), + FOREIGN KEY (microservice_uuid) REFERENCES Microservices (uuid) ON DELETE CASCADE +); + +CREATE INDEX idx_microservice_port_microserviceUuid ON MicroservicePorts (microservice_uuid); + +CREATE TABLE IF NOT EXISTS MicroservicePublicPorts ( + id INT AUTO_INCREMENT PRIMARY KEY NOT NULL, + port_id INT UNIQUE, + host_id VARCHAR(255) UNIQUE, + local_proxy_id TEXT, + remote_proxy_id TEXT, + public_port INT, + queue_name TEXT, + schemes VARCHAR(255) DEFAULT '["https"]', + is_tcp BOOLEAN DEFAULT false, + created_at DATETIME, + updated_at DATETIME, + protocol VARCHAR(255) AS (CASE WHEN is_tcp THEN 'tcp' ELSE 'http' END) VIRTUAL, + FOREIGN KEY (port_id) REFERENCES MicroservicePorts (id) ON DELETE CASCADE, + FOREIGN KEY (host_id) REFERENCES Fogs (uuid) ON DELETE CASCADE +); + +CREATE INDEX idx_microservice_public_port_portId ON MicroservicePublicPorts (port_id); +CREATE INDEX idx_microservice_public_port_hostId ON MicroservicePublicPorts (host_id); + + +CREATE TABLE IF NOT EXISTS MicroserviceStatuses ( + id INT AUTO_INCREMENT PRIMARY KEY NOT NULL, + status VARCHAR(255) DEFAULT 'QUEUED', + operating_duration BIGINT DEFAULT 0, + start_time BIGINT DEFAULT 0, + cpu_usage FLOAT DEFAULT 0.000, + memory_usage BIGINT DEFAULT 0, + container_id VARCHAR(255) DEFAULT '', + percentage FLOAT DEFAULT 0.00, + error_message TEXT, + microservice_uuid VARCHAR(32), + created_at DATETIME, + updated_at DATETIME, + FOREIGN KEY (microservice_uuid) REFERENCES Microservices (uuid) ON DELETE CASCADE +); + +CREATE INDEX idx_microservice_status_microserviceUuid ON MicroserviceStatuses (microservice_uuid); + +CREATE TABLE IF NOT EXISTS StraceDiagnostics ( + id INT AUTO_INCREMENT PRIMARY KEY NOT NULL, + strace_run BOOLEAN, + buffer VARCHAR(255) DEFAULT '', + microservice_uuid VARCHAR(32), + FOREIGN KEY (microservice_uuid) REFERENCES Microservices (uuid) ON DELETE CASCADE +); + +CREATE INDEX idx_strace_diagnostics_microserviceUuid ON StraceDiagnostics (microservice_uuid); + +CREATE TABLE IF NOT EXISTS VolumeMappings ( + uuid INT AUTO_INCREMENT PRIMARY KEY NOT NULL, + host_destination TEXT, + container_destination TEXT, + access_mode TEXT, + type TEXT, + microservice_uuid VARCHAR(32), + FOREIGN KEY (microservice_uuid) REFERENCES Microservices (uuid) ON DELETE CASCADE +); + +CREATE INDEX idx_volume_mappings_microserviceUuid ON VolumeMappings (microservice_uuid); + + +CREATE TABLE IF NOT EXISTS CatalogItemImages ( + id INT AUTO_INCREMENT PRIMARY KEY, + container_image TEXT, + catalog_item_id INT, + microservice_uuid VARCHAR(32), + fog_type_id INT, + FOREIGN KEY (catalog_item_id) REFERENCES CatalogItems (id) ON DELETE CASCADE, + FOREIGN KEY (microservice_uuid) REFERENCES Microservices (uuid) ON DELETE CASCADE, + FOREIGN KEY (fog_type_id) REFERENCES FogTypes (id) ON DELETE CASCADE +); + +CREATE INDEX idx_catalog_item_image_catalog_item_id ON CatalogItemImages (catalog_item_id); +CREATE INDEX idx_catalog_item_image_microservice_uuid ON CatalogItemImages (microservice_uuid); +CREATE INDEX idx_catalog_item_image_fog_type_id ON CatalogItemImages (fog_type_id); + +CREATE TABLE IF NOT EXISTS CatalogItemInputTypes ( + id INT AUTO_INCREMENT PRIMARY KEY, + info_type TEXT, + info_format TEXT, + catalog_item_id INT, + FOREIGN KEY (catalog_item_id) REFERENCES CatalogItems (id) ON DELETE CASCADE +); + +CREATE INDEX idx_catalog_item_input_type_catalog_item_id ON CatalogItemInputTypes (catalog_item_id); + +CREATE TABLE IF NOT EXISTS CatalogItemOutputTypes ( + id INT AUTO_INCREMENT PRIMARY KEY, + info_type TEXT, + info_format TEXT, + catalog_item_id INT, + FOREIGN KEY (catalog_item_id) REFERENCES CatalogItems (id) ON DELETE CASCADE +); + +CREATE INDEX idx_catalog_item_output_type_catalog_item_id ON CatalogItemOutputTypes (catalog_item_id); + + +CREATE TABLE IF NOT EXISTS Routings ( + id INT AUTO_INCREMENT PRIMARY KEY NOT NULL, + name TEXT NOT NULL, + source_microservice_uuid VARCHAR(32), + dest_microservice_uuid VARCHAR(32), + application_id INT, + FOREIGN KEY (source_microservice_uuid) REFERENCES Microservices (uuid) ON DELETE CASCADE, + FOREIGN KEY (dest_microservice_uuid) REFERENCES Microservices (uuid) ON DELETE CASCADE, + FOREIGN KEY (application_id) REFERENCES Flows (id) ON DELETE CASCADE +); + +CREATE INDEX idx_routing_sourceMicroserviceUuid ON Routings (source_microservice_uuid); +CREATE INDEX idx_routing_destMicroserviceUuid ON Routings (dest_microservice_uuid); +CREATE INDEX idx_routing_applicationId ON Routings (application_id); + +CREATE TABLE IF NOT EXISTS Routers ( + id INT AUTO_INCREMENT PRIMARY KEY NOT NULL, + is_edge BOOLEAN DEFAULT true, + messaging_port INT DEFAULT 5671, + edge_router_port INT, + inter_router_port INT, + host TEXT, + is_default BOOLEAN DEFAULT false, + iofog_uuid VARCHAR(32), + created_at DATETIME, + updated_at DATETIME, + FOREIGN KEY (iofog_uuid) REFERENCES Fogs (uuid) ON DELETE CASCADE + +); + +CREATE INDEX idx_router_iofogUuid ON Routers (iofog_uuid); + + +CREATE TABLE RouterConnections ( + id INT AUTO_INCREMENT PRIMARY KEY, + source_router INT, + dest_router INT, + created_at DATETIME NOT NULL, + updated_at DATETIME NOT NULL, + FOREIGN KEY (source_router) REFERENCES Routers(id) ON DELETE CASCADE, + FOREIGN KEY (dest_router) REFERENCES Routers(id) ON DELETE CASCADE +); + +CREATE INDEX idx_routerconnections_sourceRouter ON RouterConnections (source_router); +CREATE INDEX idx_routerconnections_destRouter ON RouterConnections (dest_router); + + + +CREATE TABLE IF NOT EXISTS Config ( + id INT AUTO_INCREMENT PRIMARY KEY NOT NULL, + `key` VARCHAR(255) NOT NULL UNIQUE, + value VARCHAR(255) NOT NULL, + created_at DATETIME, + updated_at DATETIME +); + +CREATE INDEX idx_config_key ON Config (`key`); + + +CREATE TABLE IF NOT EXISTS Tags ( + id INT AUTO_INCREMENT PRIMARY KEY NOT NULL, + value VARCHAR(255) UNIQUE NOT NULL +); + +CREATE TABLE IF NOT EXISTS IofogTags ( + id INT AUTO_INCREMENT PRIMARY KEY NOT NULL, + fog_uuid VARCHAR(32), + tag_id INT, + FOREIGN KEY (fog_uuid) REFERENCES Fogs (uuid) ON DELETE CASCADE, + FOREIGN KEY (tag_id) REFERENCES Tags (id) ON DELETE CASCADE +); + +CREATE INDEX idx_iofogtags_fog_uuid ON IofogTags (fog_uuid); +CREATE INDEX idx_iofogtags_tag_id ON IofogTags (tag_id); + +CREATE TABLE IF NOT EXISTS EdgeResources ( + id INT AUTO_INCREMENT PRIMARY KEY NOT NULL, + name VARCHAR(255) NOT NULL, + version TEXT, + description TEXT, + display_name TEXT, + display_color TEXT, + display_icon TEXT, + interface_protocol TEXT, + interface_id INT, + custom TEXT +); + + +CREATE TABLE IF NOT EXISTS AgentEdgeResources ( + id INT AUTO_INCREMENT PRIMARY KEY NOT NULL, + fog_uuid VARCHAR(32), + edge_resource_id INT, + FOREIGN KEY (fog_uuid) REFERENCES Fogs (uuid) ON DELETE CASCADE, + FOREIGN KEY (edge_resource_id) REFERENCES EdgeResources (id) ON DELETE CASCADE +); + +CREATE TABLE IF NOT EXISTS EdgeResourceOrchestrationTags ( + id INT AUTO_INCREMENT PRIMARY KEY NOT NULL, + edge_resource_id INT, + tag_id INT, + FOREIGN KEY (edge_resource_id) REFERENCES EdgeResources (id) ON DELETE CASCADE, + FOREIGN KEY (tag_id) REFERENCES Tags (id) ON DELETE CASCADE +); + +CREATE INDEX idx_agentedgeresources_fog_id ON AgentEdgeResources (fog_uuid); +CREATE INDEX idx_agentedgeresources_edge_resource_id ON AgentEdgeResources (edge_resource_id); +CREATE INDEX idx_edgeresourceorchestrationtags_edge_resource_id ON EdgeResourceOrchestrationTags (edge_resource_id); +CREATE INDEX idx_edgeresourceorchestrationtags_tag_id ON EdgeResourceOrchestrationTags (tag_id); + +CREATE TABLE IF NOT EXISTS HTTPBasedResourceInterfaces ( + id INT AUTO_INCREMENT PRIMARY KEY NOT NULL, + edge_resource_id INT, + FOREIGN KEY (edge_resource_id) REFERENCES EdgeResources (id) ON DELETE CASCADE +); + +CREATE TABLE IF NOT EXISTS HTTPBasedResourceInterfaceEndpoints ( + id INT AUTO_INCREMENT PRIMARY KEY NOT NULL, + interface_id INT, + name TEXT, + description TEXT, + `method` TEXT, + url TEXT, + requestType TEXT, + responseType TEXT, + requestPayloadExample TEXT, + responsePayloadExample TEXT, + FOREIGN KEY (interface_id) REFERENCES HTTPBasedResourceInterfaces (id) ON DELETE CASCADE +); + +CREATE INDEX idx_httpbasedresourceinterfaces_edge_resource_id ON HTTPBasedResourceInterfaces (edge_resource_id); +CREATE INDEX idx_httpbasedresourceinterfaceendpoints_interface_id ON HTTPBasedResourceInterfaceEndpoints (interface_id); + + +CREATE TABLE IF NOT EXISTS ApplicationTemplates ( + id INT AUTO_INCREMENT PRIMARY KEY NOT NULL, + name VARCHAR(255) UNIQUE NOT NULL DEFAULT 'new-application', + description VARCHAR(255) DEFAULT '', + schema_version VARCHAR(255) DEFAULT '', + application_json LONGTEXT, + created_at DATETIME, + updated_at DATETIME + +); + + +CREATE TABLE IF NOT EXISTS ApplicationTemplateVariables ( + id INT AUTO_INCREMENT PRIMARY KEY NOT NULL, + application_template_id INT NOT NULL, + `key` TEXT, + description VARCHAR(255) DEFAULT '', + default_value VARCHAR(255), + created_at DATETIME, + updated_at DATETIME, + FOREIGN KEY (application_template_id) REFERENCES ApplicationTemplates (id) ON DELETE CASCADE +); + +CREATE INDEX idx_applicationtemplatevariables_application_template_id ON ApplicationTemplateVariables (application_template_id); + +CREATE TABLE IF NOT EXISTS MicroserviceCdiDevices ( + id INT AUTO_INCREMENT PRIMARY KEY NOT NULL, + cdi_devices TEXT, + microservice_uuid VARCHAR(32), + FOREIGN KEY (microservice_uuid) REFERENCES Microservices (uuid) ON DELETE CASCADE +); + +CREATE INDEX idx_microservice_cdiDevices_microserviceUuid ON MicroserviceCdiDevices (microservice_uuid); + +ALTER TABLE Microservices +ADD COLUMN run_as_user TEXT DEFAULT NULL, +ADD COLUMN platform TEXT DEFAULT NULL, +ADD COLUMN runtime TEXT DEFAULT NULL; + +ALTER TABLE Fogs +RENAME COLUMN `system-available-disk` TO system_available_disk, +RENAME COLUMN `system-available-memory` TO system_available_memory, +RENAME COLUMN `system-total-cpu` TO system_total_cpu; + +ALTER TABLE Routers DROP COLUMN IF EXISTS require_ssl; +ALTER TABLE Routers DROP COLUMN IF EXISTS ssl_profile; +ALTER TABLE Routers DROP COLUMN IF EXISTS sasl_mechanisms; +ALTER TABLE Routers DROP COLUMN IF EXISTS authenticate_peer; +ALTER TABLE Routers DROP COLUMN IF EXISTS ca_cert; +ALTER TABLE Routers DROP COLUMN IF EXISTS tls_cert; +ALTER TABLE Routers DROP COLUMN IF EXISTS tls_key; + +CREATE TABLE IF NOT EXISTS MicroservicePubTags ( + id INT AUTO_INCREMENT PRIMARY KEY NOT NULL, + microservice_uuid VARCHAR(32), + tag_id INT, + FOREIGN KEY (microservice_uuid) REFERENCES Microservices (uuid) ON DELETE CASCADE, + FOREIGN KEY (tag_id) REFERENCES Tags (id) ON DELETE CASCADE +); + +CREATE TABLE IF NOT EXISTS MicroserviceSubTags ( + id INT AUTO_INCREMENT PRIMARY KEY NOT NULL, + microservice_uuid VARCHAR(32), + tag_id INT, + FOREIGN KEY (microservice_uuid) REFERENCES Microservices (uuid) ON DELETE CASCADE, + FOREIGN KEY (tag_id) REFERENCES Tags (id) ON DELETE CASCADE +); + +CREATE INDEX idx_microservicepubtags_microservice_uuid ON MicroservicePubTags (microservice_uuid); +CREATE INDEX idx_microservicesubtags_microservice_uuid ON MicroserviceSubTags (microservice_uuid); +CREATE INDEX idx_microservicepubtags_tag_id ON MicroservicePubTags (tag_id); +CREATE INDEX idx_microservicesubtags_tag_id ON MicroserviceSubTags (tag_id); + +CREATE TABLE IF NOT EXISTS MicroserviceCapAdd ( + id INT AUTO_INCREMENT PRIMARY KEY NOT NULL, + cap_add TEXT, + microservice_uuid VARCHAR(32), + FOREIGN KEY (microservice_uuid) REFERENCES Microservices (uuid) ON DELETE CASCADE +); + +CREATE INDEX idx_microservice_capAdd_microserviceUuid ON MicroserviceCapAdd (microservice_uuid); + +CREATE TABLE IF NOT EXISTS MicroserviceCapDrop ( + id INT AUTO_INCREMENT PRIMARY KEY NOT NULL, + cap_drop TEXT, + microservice_uuid VARCHAR(32), + FOREIGN KEY (microservice_uuid) REFERENCES Microservices (uuid) ON DELETE CASCADE +); + +CREATE INDEX idx_microservice_capDrop_microserviceUuid ON MicroserviceCapDrop (microservice_uuid); + +ALTER TABLE Microservices +ADD COLUMN annotations TEXT; + +CREATE TABLE IF NOT EXISTS FogPublicKeys ( + id INT AUTO_INCREMENT PRIMARY KEY NOT NULL, + public_key TEXT, + iofog_uuid VARCHAR(32), + created_at DATETIME, + updated_at DATETIME, + FOREIGN KEY (iofog_uuid) REFERENCES Fogs (uuid) ON DELETE CASCADE +); + +CREATE INDEX idx_fog_public_keys_iofogUuid ON FogPublicKeys (iofog_uuid); + +CREATE TABLE IF NOT EXISTS FogUsedTokens ( + id INT AUTO_INCREMENT PRIMARY KEY NOT NULL, + jti VARCHAR(255) NOT NULL, + iofog_uuid VARCHAR(32), + expiry_time DATETIME NOT NULL, + created_at DATETIME, + updated_at DATETIME, + FOREIGN KEY (iofog_uuid) REFERENCES Fogs (uuid) ON DELETE CASCADE +); + +CREATE INDEX idx_fog_used_tokens_iofogUuid ON FogUsedTokens (iofog_uuid); + +DROP TABLE IF EXISTS FogAccessTokens; + +ALTER TABLE MicroserviceStatuses ADD COLUMN ip_address TEXT; + +CREATE TABLE IF NOT EXISTS Secrets ( + id INT AUTO_INCREMENT PRIMARY KEY NOT NULL, + name VARCHAR(255) UNIQUE NOT NULL, + type VARCHAR(50) NOT NULL CHECK (type IN ('opaque', 'tls')), + data TEXT NOT NULL, + created_at DATETIME, + updated_at DATETIME +); + +CREATE INDEX idx_secrets_name ON Secrets (name); + +CREATE TABLE IF NOT EXISTS Certificates ( + id INT AUTO_INCREMENT PRIMARY KEY NOT NULL, + name TEXT NOT NULL, + subject TEXT NOT NULL, + is_ca BOOLEAN DEFAULT false, + signed_by_id INT, + hosts TEXT, + valid_from DATETIME NOT NULL, + valid_to DATETIME NOT NULL, + serial_number TEXT NOT NULL, + secret_id INT, + created_at DATETIME, + updated_at DATETIME, + FOREIGN KEY (signed_by_id) REFERENCES Certificates (id) ON DELETE SET NULL, + FOREIGN KEY (secret_id) REFERENCES Secrets (id) ON DELETE CASCADE +); + +CREATE UNIQUE INDEX idx_certificates_name_unique ON Certificates ((name(255))); +CREATE INDEX idx_certificates_valid_to ON Certificates ((valid_to)); +CREATE INDEX idx_certificates_is_ca ON Certificates (is_ca); +CREATE INDEX idx_certificates_signed_by_id ON Certificates (signed_by_id); +CREATE INDEX idx_certificates_secret_id ON Certificates (secret_id); + +CREATE TABLE IF NOT EXISTS Services ( + id INT AUTO_INCREMENT PRIMARY KEY NOT NULL, + name VARCHAR(255) UNIQUE NOT NULL, + type VARCHAR(50) NOT NULL, + resource TEXT NOT NULL, + target_port INT NOT NULL, + service_port INT, + bridge_port INT, + service_endpoint TEXT, + created_at DATETIME, + updated_at DATETIME, +); + +CREATE INDEX idx_services_name ON Services (name); +CREATE INDEX idx_services_id ON Services (id); + +CREATE TABLE IF NOT EXISTS ServiceTags ( + id INT AUTO_INCREMENT PRIMARY KEY NOT NULL, + service_id INT NOT NULL, + tag_id INT NOT NULL, + created_at DATETIME, + updated_at DATETIME, + FOREIGN KEY (service_id) REFERENCES Services (id) ON DELETE CASCADE, + FOREIGN KEY (tag_id) REFERENCES Tags (id) ON DELETE CASCADE +); + +CREATE INDEX idx_service_tags_service_id ON ServiceTags (service_id); +CREATE INDEX idx_service_tags_tag_id ON ServiceTags (tag_id); + +COMMIT; \ No newline at end of file diff --git a/src/data/migrations/postgres/db_migration_pg_v1.0.2.sql b/src/data/migrations/postgres/db_migration_pg_v1.0.2.sql new file mode 100644 index 000000000..29faea833 --- /dev/null +++ b/src/data/migrations/postgres/db_migration_pg_v1.0.2.sql @@ -0,0 +1,717 @@ +CREATE TABLE IF NOT EXISTS "Flows" ( + id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY, + name VARCHAR(255) UNIQUE, + description VARCHAR(255) DEFAULT '', + is_activated BOOLEAN DEFAULT false, + is_system BOOLEAN DEFAULT false, + created_at TIMESTAMP(0), + updated_at TIMESTAMP(0) +); + +CREATE TABLE IF NOT EXISTS "Registries" ( + id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY, + url VARCHAR(255), + is_public BOOLEAN, + secure BOOLEAN, + certificate TEXT, + requires_cert BOOLEAN, + user_name TEXT, + password TEXT, + user_email TEXT +); + + +CREATE TABLE IF NOT EXISTS "CatalogItems" ( + id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY, + name VARCHAR(255) UNIQUE, + description VARCHAR(255), + category TEXT, + config_example VARCHAR(255) DEFAULT '{}', + publisher TEXT, + disk_required BIGINT DEFAULT 0, + ram_required BIGINT DEFAULT 0, + picture VARCHAR(255) DEFAULT 'images/shared/default.png', + is_public BOOLEAN DEFAULT false, + registry_id INT, + FOREIGN KEY (registry_id) REFERENCES "Registries" (id) ON DELETE SET NULL +); + +CREATE INDEX idx_catalog_item_registry_id ON "CatalogItems" (registry_id); + + +CREATE TABLE IF NOT EXISTS "FogTypes" ( + id INT PRIMARY KEY, + name TEXT, + image TEXT, + description TEXT, + network_catalog_item_id INT, + hal_catalog_item_id INT, + bluetooth_catalog_item_id INT, + FOREIGN KEY (network_catalog_item_id) REFERENCES "CatalogItems" (id) ON DELETE CASCADE, + FOREIGN KEY (hal_catalog_item_id) REFERENCES "CatalogItems" (id) ON DELETE CASCADE, + FOREIGN KEY (bluetooth_catalog_item_id) REFERENCES "CatalogItems" (id) ON DELETE CASCADE +); + +CREATE INDEX idx_fog_type_network_catalog_item_id ON "FogTypes" (network_catalog_item_id); +CREATE INDEX idx_fog_type_hal_catalog_item_id ON "FogTypes" (hal_catalog_item_id); +CREATE INDEX idx_fog_type_bluetooth_catalog_item_id ON "FogTypes" (bluetooth_catalog_item_id); + + +CREATE TABLE IF NOT EXISTS "Fogs" ( + uuid VARCHAR(32) PRIMARY KEY NOT NULL, + name VARCHAR(255) DEFAULT 'Unnamed ioFog 1', + location TEXT, + gps_mode TEXT, + latitude DOUBLE PRECISION, + longitude DOUBLE PRECISION, + description TEXT, + last_active BIGINT, + daemon_status VARCHAR(32) DEFAULT 'UNKNOWN', + daemon_operating_duration BIGINT DEFAULT 0, + daemon_last_start BIGINT, + memory_usage DOUBLE PRECISION DEFAULT 0.000, + disk_usage DOUBLE PRECISION DEFAULT 0.000, + cpu_usage DOUBLE PRECISION DEFAULT 0.00, + memory_violation TEXT, + disk_violation TEXT, + cpu_violation TEXT, + system_available_disk BIGINT, + system_available_memory BIGINT, + system_total_cpu DOUBLE PRECISION, + security_status VARCHAR(32) DEFAULT 'OK', + security_violation_info VARCHAR(32) DEFAULT 'No violation', + catalog_item_status TEXT, + repository_count BIGINT DEFAULT 0, + repository_status TEXT, + system_time BIGINT, + last_status_time BIGINT, + ip_address VARCHAR(32) DEFAULT '0.0.0.0', + ip_address_external VARCHAR(32) DEFAULT '0.0.0.0', + host VARCHAR(32), + processed_messages BIGINT DEFAULT 0, + catalog_item_message_counts TEXT, + message_speed DOUBLE PRECISION DEFAULT 0.000, + last_command_time BIGINT, + network_interface VARCHAR(32) DEFAULT 'dynamic', + docker_url VARCHAR(255) DEFAULT 'unix:///var/run/docker.sock', + disk_limit DOUBLE PRECISION DEFAULT 50, + disk_directory VARCHAR(255) DEFAULT '/var/lib/iofog/', + memory_limit DOUBLE PRECISION DEFAULT 4096, + cpu_limit DOUBLE PRECISION DEFAULT 80, + log_limit DOUBLE PRECISION DEFAULT 10, + log_directory VARCHAR(255) DEFAULT '/var/log/iofog/', + bluetooth BOOLEAN DEFAULT FALSE, + hal BOOLEAN DEFAULT FALSE, + log_file_count BIGINT DEFAULT 10, + version TEXT, + is_ready_to_upgrade BOOLEAN DEFAULT TRUE, + is_ready_to_rollback BOOLEAN DEFAULT FALSE, + status_frequency INT DEFAULT 10, + change_frequency INT DEFAULT 20, + device_scan_frequency INT DEFAULT 20, + tunnel VARCHAR(255) DEFAULT '', + isolated_docker_container BOOLEAN DEFAULT TRUE, + docker_pruning_freq INT DEFAULT 1, + available_disk_threshold DOUBLE PRECISION DEFAULT 20, + log_level VARCHAR(10) DEFAULT 'INFO', + is_system BOOLEAN DEFAULT FALSE, + router_id INT DEFAULT 0, + time_zone VARCHAR(32) DEFAULT 'Etc/UTC', + created_at TIMESTAMP(0), + updated_at TIMESTAMP(0), + fog_type_id INT DEFAULT 0, + FOREIGN KEY (fog_type_id) REFERENCES "FogTypes" (id) +); + +CREATE INDEX idx_fog_fog_type_id ON "Fogs" (fog_type_id); + +CREATE TABLE IF NOT EXISTS "ChangeTrackings" ( + id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY NOT NULL, + microservice_config BOOLEAN DEFAULT false, + reboot BOOLEAN DEFAULT false, + deletenode BOOLEAN DEFAULT false, + version BOOLEAN DEFAULT false, + microservice_list BOOLEAN DEFAULT false, + config BOOLEAN DEFAULT false, + routing BOOLEAN DEFAULT false, + registries BOOLEAN DEFAULT false, + tunnel BOOLEAN DEFAULT false, + diagnostics BOOLEAN DEFAULT false, + router_changed BOOLEAN DEFAULT false, + image_snapshot BOOLEAN DEFAULT false, + prune BOOLEAN DEFAULT false, + linked_edge_resources BOOLEAN DEFAULT false, + last_updated VARCHAR(255) DEFAULT false, + iofog_uuid VARCHAR(32), + FOREIGN KEY (iofog_uuid) REFERENCES "Fogs" (uuid) ON DELETE CASCADE +); + +CREATE INDEX idx_change_tracking_iofog_uuid ON "ChangeTrackings" (iofog_uuid); + +CREATE TABLE IF NOT EXISTS "FogAccessTokens" ( + id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY NOT NULL, + expiration_time BIGINT, + token TEXT, + iofog_uuid VARCHAR(32), + FOREIGN KEY (iofog_uuid) REFERENCES "Fogs" (uuid) ON DELETE CASCADE +); + +CREATE INDEX idx_fog_access_tokens_iofogUuid ON "FogAccessTokens" (iofog_uuid); + +CREATE TABLE IF NOT EXISTS "FogProvisionKeys" ( + id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY NOT NULL, + provisioning_string VARCHAR(100), + expiration_time BIGINT, + iofog_uuid VARCHAR(32), + FOREIGN KEY (iofog_uuid) REFERENCES "Fogs" (uuid) ON DELETE CASCADE +); + +CREATE INDEX idx_fog_provision_keys_iofogUuid ON "FogProvisionKeys" (iofog_uuid); + +CREATE TABLE IF NOT EXISTS "FogVersionCommands" ( + id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY NOT NULL, + version_command VARCHAR(100), + iofog_uuid VARCHAR(32), + FOREIGN KEY (iofog_uuid) REFERENCES "Fogs" (uuid) ON DELETE CASCADE +); + +CREATE INDEX idx_fog_version_commands_iofogUuid ON "FogVersionCommands" (iofog_uuid); + +CREATE TABLE IF NOT EXISTS "HWInfos" ( + id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY NOT NULL, + info TEXT, + created_at TIMESTAMP(0), + updated_at TIMESTAMP(0), + iofog_uuid VARCHAR(32), + FOREIGN KEY (iofog_uuid) REFERENCES "Fogs" (uuid) ON DELETE CASCADE +); + +CREATE INDEX idx_hw_infos_iofogUuid ON "HWInfos" (iofog_uuid); + +CREATE TABLE IF NOT EXISTS "USBInfos" ( + id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY NOT NULL, + info TEXT, + created_at TIMESTAMP(0), + updated_at TIMESTAMP(0), + iofog_uuid VARCHAR(32), + FOREIGN KEY (iofog_uuid) REFERENCES "Fogs" (uuid) ON DELETE CASCADE +); + +CREATE INDEX idx_usb_infos_iofogUuid ON "USBInfos" (iofog_uuid); + +CREATE TABLE IF NOT EXISTS "Tunnels" ( + id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY NOT NULL, + username TEXT, + password TEXT, + host TEXT, + remote_port INT, + local_port INT DEFAULT 22, + rsa_key TEXT, + closed BOOLEAN DEFAULT false, + iofog_uuid VARCHAR(32), + FOREIGN KEY (iofog_uuid) REFERENCES "Fogs" (uuid) ON DELETE CASCADE +); + +CREATE INDEX idx_tunnels_iofogUuid ON "Tunnels" (iofog_uuid); + +CREATE TABLE IF NOT EXISTS "Microservices" ( + uuid VARCHAR(32) PRIMARY KEY NOT NULL, + config TEXT, + name VARCHAR(255) DEFAULT 'New Microservice', + config_last_updated BIGINT, + rebuild BOOLEAN DEFAULT false, + root_host_access BOOLEAN DEFAULT false, + log_size BIGINT DEFAULT 0, + image_snapshot VARCHAR(255) DEFAULT '', + delete BOOLEAN DEFAULT false, + delete_with_cleanup BOOLEAN DEFAULT false, + created_at TIMESTAMP(0), + updated_at TIMESTAMP(0), + catalog_item_id INT, + registry_id INT DEFAULT 1, + iofog_uuid VARCHAR(32), + application_id INT, + FOREIGN KEY (catalog_item_id) REFERENCES "CatalogItems" (id) ON DELETE CASCADE, + FOREIGN KEY (registry_id) REFERENCES "Registries" (id) ON DELETE SET NULL, + FOREIGN KEY (iofog_uuid) REFERENCES "Fogs" (uuid) ON DELETE CASCADE, + FOREIGN KEY (application_id) REFERENCES "Flows" (id) ON DELETE CASCADE +); + +CREATE INDEX idx_microservices_catalogItemId ON "Microservices" (catalog_item_id); +CREATE INDEX idx_microservices_registryId ON "Microservices" (registry_id); +CREATE INDEX idx_microservices_iofogUuid ON "Microservices" (iofog_uuid); +CREATE INDEX idx_microservices_applicationId ON "Microservices" (application_id); + +CREATE TABLE IF NOT EXISTS "MicroserviceArgs" ( + id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY NOT NULL, + cmd TEXT, + microservice_uuid VARCHAR(32), + FOREIGN KEY (microservice_uuid) REFERENCES "Microservices" (uuid) ON DELETE CASCADE +); + +CREATE INDEX idx_microservice_args_microserviceUuid ON "MicroserviceArgs" (microservice_uuid); + +CREATE TABLE IF NOT EXISTS "MicroserviceEnvs" ( + id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY NOT NULL, + key TEXT, + value TEXT, + microservice_uuid VARCHAR(32), + FOREIGN KEY (microservice_uuid) REFERENCES "Microservices" (uuid) ON DELETE CASCADE +); + +CREATE INDEX idx_microservice_envs_microserviceUuid ON "MicroserviceEnvs" (microservice_uuid); + +CREATE TABLE IF NOT EXISTS "MicroserviceExtraHost" ( + id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY NOT NULL, + template_type TEXT, + name TEXT, + public_port INT, + template TEXT, + value TEXT, + microservice_uuid VARCHAR(32), + target_microservice_uuid VARCHAR(32), + target_fog_uuid VARCHAR(32), + FOREIGN KEY (microservice_uuid) REFERENCES "Microservices" (uuid) ON DELETE CASCADE, + FOREIGN KEY (target_microservice_uuid) REFERENCES "Microservices" (uuid) ON DELETE CASCADE, + FOREIGN KEY (target_fog_uuid) REFERENCES "Fogs" (uuid) ON DELETE CASCADE +); + +CREATE INDEX idx_microservice_extra_host_microserviceUuid ON "MicroserviceExtraHost" (microservice_uuid); +CREATE INDEX idx_microservice_extra_host_targetMicroserviceUuid ON "MicroserviceExtraHost" (target_microservice_uuid); +CREATE INDEX idx_microservice_extra_host_targetFogUuid ON "MicroserviceExtraHost" (target_fog_uuid); + +CREATE TABLE IF NOT EXISTS "MicroservicePorts" ( + id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY NOT NULL, + port_internal INT, + port_external INT, + is_udp BOOLEAN, + is_public BOOLEAN, + is_proxy BOOLEAN, + created_at TIMESTAMP(0), + updated_at TIMESTAMP(0), + microservice_uuid VARCHAR(32), + FOREIGN KEY (microservice_uuid) REFERENCES "Microservices" (uuid) ON DELETE CASCADE +); + +CREATE INDEX idx_microservice_port_microserviceUuid ON "MicroservicePorts" (microservice_uuid); + +CREATE TABLE IF NOT EXISTS "MicroservicePublicPorts" ( + id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY NOT NULL, + port_id INT UNIQUE, + host_id VARCHAR(255) UNIQUE, + local_proxy_id TEXT, + remote_proxy_id TEXT, + public_port INT, + queue_name TEXT, + schemes VARCHAR(255) DEFAULT '["https"]', + is_tcp BOOLEAN DEFAULT false, + created_at TIMESTAMP(0), + updated_at TIMESTAMP(0), + protocol VARCHAR(255) GENERATED ALWAYS AS (CASE WHEN is_tcp THEN 'tcp' ELSE 'http' END) STORED, + FOREIGN KEY (port_id) REFERENCES "MicroservicePorts" (id) ON DELETE CASCADE, + FOREIGN KEY (host_id) REFERENCES "Fogs" (uuid) ON DELETE CASCADE +); + +CREATE INDEX idx_microservice_public_port_portId ON "MicroservicePublicPorts" (port_id); +CREATE INDEX idx_microservice_public_port_hostId ON "MicroservicePublicPorts" (host_id); + + +CREATE TABLE IF NOT EXISTS "MicroserviceStatuses" ( + id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY NOT NULL, + status VARCHAR(255) DEFAULT 'QUEUED', + operating_duration BIGINT DEFAULT 0, + start_time BIGINT DEFAULT 0, + cpu_usage DOUBLE PRECISION DEFAULT 0.000, + memory_usage BIGINT DEFAULT 0, + container_id VARCHAR(255) DEFAULT '', + percentage DOUBLE PRECISION DEFAULT 0.00, + error_message TEXT, + microservice_uuid VARCHAR(32), + created_at TIMESTAMP(0), + updated_at TIMESTAMP(0), + FOREIGN KEY (microservice_uuid) REFERENCES "Microservices" (uuid) ON DELETE CASCADE +); + +CREATE INDEX idx_microservice_status_microserviceUuid ON "MicroserviceStatuses" (microservice_uuid); + +CREATE TABLE IF NOT EXISTS "StraceDiagnostics" ( + id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY NOT NULL, + strace_run BOOLEAN, + buffer VARCHAR(255) DEFAULT '', + microservice_uuid VARCHAR(32), + FOREIGN KEY (microservice_uuid) REFERENCES "Microservices" (uuid) ON DELETE CASCADE +); + +CREATE INDEX idx_strace_diagnostics_microserviceUuid ON "StraceDiagnostics" (microservice_uuid); + +CREATE TABLE IF NOT EXISTS "VolumeMappings" ( + uuid INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY NOT NULL, + host_destination TEXT, + container_destination TEXT, + access_mode TEXT, + type TEXT, + microservice_uuid VARCHAR(32), + FOREIGN KEY (microservice_uuid) REFERENCES "Microservices" (uuid) ON DELETE CASCADE +); + +CREATE INDEX idx_volume_mappings_microserviceUuid ON "VolumeMappings" (microservice_uuid); + + +CREATE TABLE IF NOT EXISTS "CatalogItemImages" ( + id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY, + container_image TEXT, + catalog_item_id INT, + microservice_uuid VARCHAR(32), + fog_type_id INT, + FOREIGN KEY (catalog_item_id) REFERENCES "CatalogItems" (id) ON DELETE CASCADE, + FOREIGN KEY (microservice_uuid) REFERENCES "Microservices" (uuid) ON DELETE CASCADE, + FOREIGN KEY (fog_type_id) REFERENCES "FogTypes" (id) ON DELETE CASCADE +); + +CREATE INDEX idx_catalog_item_image_catalog_item_id ON "CatalogItemImages" (catalog_item_id); +CREATE INDEX idx_catalog_item_image_microservice_uuid ON "CatalogItemImages" (microservice_uuid); +CREATE INDEX idx_catalog_item_image_fog_type_id ON "CatalogItemImages" (fog_type_id); + +CREATE TABLE IF NOT EXISTS "CatalogItemInputTypes" ( + id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY, + info_type TEXT, + info_format TEXT, + catalog_item_id INT, + FOREIGN KEY (catalog_item_id) REFERENCES "CatalogItems" (id) ON DELETE CASCADE +); + +CREATE INDEX idx_catalog_item_input_type_catalog_item_id ON "CatalogItemInputTypes" (catalog_item_id); + +CREATE TABLE IF NOT EXISTS "CatalogItemOutputTypes" ( + id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY, + info_type TEXT, + info_format TEXT, + catalog_item_id INT, + FOREIGN KEY (catalog_item_id) REFERENCES "CatalogItems" (id) ON DELETE CASCADE +); + +CREATE INDEX idx_catalog_item_output_type_catalog_item_id ON "CatalogItemOutputTypes" (catalog_item_id); + + +CREATE TABLE IF NOT EXISTS "Routings" ( + id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY NOT NULL, + name TEXT NOT NULL, + source_microservice_uuid VARCHAR(32), + dest_microservice_uuid VARCHAR(32), + application_id INT, + FOREIGN KEY (source_microservice_uuid) REFERENCES "Microservices" (uuid) ON DELETE CASCADE, + FOREIGN KEY (dest_microservice_uuid) REFERENCES "Microservices" (uuid) ON DELETE CASCADE, + FOREIGN KEY (application_id) REFERENCES "Flows" (id) ON DELETE CASCADE +); + +CREATE INDEX idx_routing_sourceMicroserviceUuid ON "Routings" (source_microservice_uuid); +CREATE INDEX idx_routing_destMicroserviceUuid ON "Routings" (dest_microservice_uuid); +CREATE INDEX idx_routing_applicationId ON "Routings" (application_id); + +CREATE TABLE IF NOT EXISTS "Routers" ( + id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY NOT NULL, + is_edge BOOLEAN DEFAULT true, + messaging_port INT DEFAULT 5671, + edge_router_port INT, + inter_router_port INT, + host TEXT, + is_default BOOLEAN DEFAULT false, + iofog_uuid VARCHAR(32), + created_at TIMESTAMP(0), + updated_at TIMESTAMP(0), + FOREIGN KEY (iofog_uuid) REFERENCES "Fogs" (uuid) ON DELETE CASCADE + +); + +CREATE INDEX idx_router_iofogUuid ON "Routers" (iofog_uuid); + + +CREATE TABLE "RouterConnections" ( + id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY, + source_router INT, + dest_router INT, + created_at TIMESTAMP(0) NOT NULL, + updated_at TIMESTAMP(0) NOT NULL, + FOREIGN KEY (source_router) REFERENCES "Routers"(id) ON DELETE CASCADE, + FOREIGN KEY (dest_router) REFERENCES "Routers"(id) ON DELETE CASCADE +); + +CREATE INDEX idx_routerconnections_sourceRouter ON "RouterConnections" (source_router); +CREATE INDEX idx_routerconnections_destRouter ON "RouterConnections" (dest_router); + + + +CREATE TABLE IF NOT EXISTS "Config" ( + id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY NOT NULL, + key VARCHAR(255) NOT NULL UNIQUE, + value VARCHAR(255) NOT NULL, + created_at TIMESTAMP(0), + updated_at TIMESTAMP(0) +); + +CREATE INDEX idx_config_key ON "Config" (key); + + +CREATE TABLE IF NOT EXISTS "Tags" ( + id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY NOT NULL, + value VARCHAR(255) UNIQUE NOT NULL +); + +CREATE TABLE IF NOT EXISTS "IofogTags" ( + id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY NOT NULL, + fog_uuid VARCHAR(32), + tag_id INT, + FOREIGN KEY (fog_uuid) REFERENCES "Fogs" (uuid) ON DELETE CASCADE, + FOREIGN KEY (tag_id) REFERENCES "Tags" (id) ON DELETE CASCADE +); + +CREATE INDEX idx_iofogtags_fog_uuid ON "IofogTags" (fog_uuid); +CREATE INDEX idx_iofogtags_tag_id ON "IofogTags" (tag_id); + +CREATE TABLE IF NOT EXISTS "EdgeResources" ( + id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY NOT NULL, + name VARCHAR(255) NOT NULL, + version TEXT, + description TEXT, + display_name TEXT, + display_color TEXT, + display_icon TEXT, + interface_protocol TEXT, + interface_id INT, + custom TEXT +); + + +CREATE TABLE IF NOT EXISTS "AgentEdgeResources" ( + id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY NOT NULL, + fog_uuid VARCHAR(32), + edge_resource_id INT, + FOREIGN KEY (fog_uuid) REFERENCES "Fogs" (uuid) ON DELETE CASCADE, + FOREIGN KEY (edge_resource_id) REFERENCES "EdgeResources" (id) ON DELETE CASCADE +); + +CREATE TABLE IF NOT EXISTS "EdgeResourceOrchestrationTags" ( + id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY NOT NULL, + edge_resource_id INT, + tag_id INT, + FOREIGN KEY (edge_resource_id) REFERENCES "EdgeResources" (id) ON DELETE CASCADE, + FOREIGN KEY (tag_id) REFERENCES "Tags" (id) ON DELETE CASCADE +); + +CREATE INDEX idx_agentedgeresources_fog_id ON "AgentEdgeResources" (fog_uuid); +CREATE INDEX idx_agentedgeresources_edge_resource_id ON "AgentEdgeResources" (edge_resource_id); +CREATE INDEX idx_edgeresourceorchestrationtags_edge_resource_id ON "EdgeResourceOrchestrationTags" (edge_resource_id); +CREATE INDEX idx_edgeresourceorchestrationtags_tag_id ON "EdgeResourceOrchestrationTags" (tag_id); + +CREATE TABLE IF NOT EXISTS "HTTPBasedResourceInterfaces" ( + id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY NOT NULL, + edge_resource_id INT, + FOREIGN KEY (edge_resource_id) REFERENCES "EdgeResources" (id) ON DELETE CASCADE +); + +CREATE TABLE IF NOT EXISTS "HTTPBasedResourceInterfaceEndpoints" ( + id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY NOT NULL, + interface_id INT, + name TEXT, + description TEXT, + method TEXT, + url TEXT, + requestType TEXT, + responseType TEXT, + requestPayloadExample TEXT, + responsePayloadExample TEXT, + FOREIGN KEY (interface_id) REFERENCES "HTTPBasedResourceInterfaces" (id) ON DELETE CASCADE +); + +CREATE INDEX idx_httpbasedresourceinterfaces_edge_resource_id ON "HTTPBasedResourceInterfaces" (edge_resource_id); +CREATE INDEX idx_httpbasedresourceinterfaceendpoints_interface_id ON "HTTPBasedResourceInterfaceEndpoints" (interface_id); + + +CREATE TABLE IF NOT EXISTS "ApplicationTemplates" ( + id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY NOT NULL, + name VARCHAR(255) UNIQUE NOT NULL DEFAULT 'new-application', + description VARCHAR(255) DEFAULT '', + schema_version VARCHAR(255) DEFAULT '', + application_json TEXT, + created_at TIMESTAMP(0), + updated_at TIMESTAMP(0) + +); + + +CREATE TABLE IF NOT EXISTS "ApplicationTemplateVariables" ( + id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY NOT NULL, + application_template_id INT NOT NULL, + key TEXT, + description VARCHAR(255) DEFAULT '', + default_value VARCHAR(255), + created_at TIMESTAMP(0), + updated_at TIMESTAMP(0), + FOREIGN KEY (application_template_id) REFERENCES "ApplicationTemplates" (id) ON DELETE CASCADE +); + +CREATE INDEX idx_applicationtemplatevariables_application_template_id ON "ApplicationTemplateVariables" (application_template_id); + +CREATE TABLE IF NOT EXISTS "MicroserviceCdiDevices" ( + id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY NOT NULL, + cdi_devices TEXT, + microservice_uuid VARCHAR(32), + FOREIGN KEY (microservice_uuid) REFERENCES "Microservices" (uuid) ON DELETE CASCADE +); + +CREATE INDEX idx_microservice_cdiDevices_microserviceUuid ON "MicroserviceCdiDevices" (microservice_uuid); + +ALTER TABLE "Microservices" +ADD COLUMN run_as_user TEXT DEFAULT NULL, +ADD COLUMN platform TEXT DEFAULT NULL, +ADD COLUMN runtime TEXT DEFAULT NULL; + +ALTER TABLE "Routers" +ADD COLUMN require_ssl TEXT, +ADD COLUMN ssl_profile TEXT, +ADD COLUMN sasl_mechanisms TEXT, +ADD COLUMN authenticate_peer TEXT, +ADD COLUMN ca_cert TEXT, +ADD COLUMN tls_cert TEXT, +ADD COLUMN tls_key TEXT; + +CREATE TABLE IF NOT EXISTS "MicroservicePubTags" ( + id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY NOT NULL, + microservice_uuid VARCHAR(32), + tag_id INT, + FOREIGN KEY (microservice_uuid) REFERENCES "Microservices" (uuid) ON DELETE CASCADE, + FOREIGN KEY (tag_id) REFERENCES "Tags" (id) ON DELETE CASCADE +); + +CREATE TABLE IF NOT EXISTS "MicroserviceSubTags" ( + id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY NOT NULL, + microservice_uuid VARCHAR(32), + tag_id INT, + FOREIGN KEY (microservice_uuid) REFERENCES "Microservices" (uuid) ON DELETE CASCADE, + FOREIGN KEY (tag_id) REFERENCES "Tags" (id) ON DELETE CASCADE +); + +CREATE INDEX idx_microservicepubtags_microservice_uuid ON "MicroservicePubTags" (microservice_uuid); +CREATE INDEX idx_microservicesubtags_microservice_uuid ON "MicroserviceSubTags" (microservice_uuid); +CREATE INDEX idx_microservicepubtags_tag_id ON "MicroservicePubTags" (tag_id); +CREATE INDEX idx_microservicesubtags_tag_id ON "MicroserviceSubTags" (tag_id); + +CREATE TABLE IF NOT EXISTS "MicroserviceCapAdd" ( + id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY NOT NULL, + cap_add TEXT, + microservice_uuid VARCHAR(32), + FOREIGN KEY (microservice_uuid) REFERENCES "Microservices" (uuid) ON DELETE CASCADE +); + +CREATE INDEX idx_microservice_capAdd_microserviceUuid ON "MicroserviceCapAdd" (microservice_uuid); + +CREATE TABLE IF NOT EXISTS "MicroserviceCapDrop" ( + id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY NOT NULL, + cap_drop TEXT, + microservice_uuid VARCHAR(32), + FOREIGN KEY (microservice_uuid) REFERENCES "Microservices" (uuid) ON DELETE CASCADE +); + +CREATE INDEX idx_microservice_capDrop_microserviceUuid ON "MicroserviceCapDrop" (microservice_uuid); + +ALTER TABLE "Microservices" +ADD COLUMN annotations TEXT; + +CREATE TABLE IF NOT EXISTS "FogPublicKeys" ( + id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY NOT NULL, + public_key TEXT, + iofog_uuid VARCHAR(32), + created_at TIMESTAMP(0), + updated_at TIMESTAMP(0), + FOREIGN KEY (iofog_uuid) REFERENCES "Fogs" (uuid) ON DELETE CASCADE +); + +CREATE INDEX idx_fog_public_keys_iofogUuid ON "FogPublicKeys" (iofog_uuid); + +CREATE TABLE IF NOT EXISTS "FogUsedTokens" ( + id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY NOT NULL, + jti VARCHAR(255) NOT NULL, + iofog_uuid VARCHAR(32), + expiry_time TIMESTAMP(0) NOT NULL, + created_at TIMESTAMP(0), + updated_at TIMESTAMP(0), + FOREIGN KEY (iofog_uuid) REFERENCES "Fogs" (uuid) ON DELETE CASCADE +); + +CREATE INDEX idx_fog_used_tokens_iofogUuid ON "FogUsedTokens" (iofog_uuid); + +ALTER TABLE "MicroserviceStatuses" +ADD COLUMN ip_address TEXT; + +DROP TABLE IF EXISTS "FogAccessTokens"; + +CREATE TABLE IF NOT EXISTS "Secrets" ( + id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY NOT NULL, + name VARCHAR(255) UNIQUE NOT NULL, + type VARCHAR(50) NOT NULL CHECK (type IN ('opaque', 'tls')), + data TEXT NOT NULL, + created_at TIMESTAMP(0), + updated_at TIMESTAMP(0) +); + +CREATE INDEX idx_secrets_name ON "Secrets" (name); + +CREATE TABLE IF NOT EXISTS "Certificates" ( + id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY NOT NULL, + name TEXT UNIQUE NOT NULL, + subject TEXT NOT NULL, + is_ca BOOLEAN DEFAULT false, + signed_by_id INT, + hosts TEXT, + valid_from TIMESTAMP(0) NOT NULL, + valid_to TIMESTAMP(0) NOT NULL, + serial_number TEXT NOT NULL, + secret_id INT, + created_at TIMESTAMP(0), + updated_at TIMESTAMP(0), + FOREIGN KEY (signed_by_id) REFERENCES "Certificates" (id) ON DELETE SET NULL, + FOREIGN KEY (secret_id) REFERENCES "Secrets" (id) ON DELETE CASCADE +); + +CREATE INDEX idx_certificates_name ON "Certificates" (name); +CREATE INDEX idx_certificates_valid_to ON "Certificates" (valid_to); +CREATE INDEX idx_certificates_is_ca ON "Certificates" (is_ca); +CREATE INDEX idx_certificates_signed_by_id ON "Certificates" (signed_by_id); +CREATE INDEX idx_certificates_secret_id ON "Certificates" (secret_id); + +CREATE TABLE IF NOT EXISTS "Services" ( + id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY NOT NULL, + name TEXT UNIQUE NOT NULL, + type TEXT NOT NULL, + resource TEXT NOT NULL, + target_port INTEGER NOT NULL, + service_port INTEGER, + bridge_port INTEGER, + service_endpoint TEXT, + created_at TIMESTAMP(0), + updated_at TIMESTAMP(0) +); + +CREATE INDEX idx_services_name ON "Services" (name); +CREATE INDEX idx_services_id ON "Services" (id); + +CREATE TABLE IF NOT EXISTS "ServiceTags" ( + id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY NOT NULL, + service_id INTEGER NOT NULL, + tag_id INTEGER NOT NULL, + created_at TIMESTAMP(0), + updated_at TIMESTAMP(0), + FOREIGN KEY (service_id) REFERENCES "Services" (id) ON DELETE CASCADE, + FOREIGN KEY (tag_id) REFERENCES "Tags" (id) ON DELETE CASCADE +); + +CREATE INDEX idx_service_tags_service_id ON "ServiceTags" (service_id); +CREATE INDEX idx_service_tags_tag_id ON "ServiceTags" (tag_id); + +ALTER TABLE "Routers" DROP COLUMN IF EXISTS require_ssl; +ALTER TABLE "Routers" DROP COLUMN IF EXISTS ssl_profile; +ALTER TABLE "Routers" DROP COLUMN IF EXISTS sasl_mechanisms; +ALTER TABLE "Routers" DROP COLUMN IF EXISTS authenticate_peer; +ALTER TABLE "Routers" DROP COLUMN IF EXISTS ca_cert; +ALTER TABLE "Routers" DROP COLUMN IF EXISTS tls_cert; +ALTER TABLE "Routers" DROP COLUMN IF EXISTS tls_key; \ No newline at end of file diff --git a/src/data/migrations/db_migration_v1.0.2.sql b/src/data/migrations/sqlite/db_migration_sqlite_v1.0.2.sql similarity index 90% rename from src/data/migrations/db_migration_v1.0.2.sql rename to src/data/migrations/sqlite/db_migration_sqlite_v1.0.2.sql index 8f802a653..7a8a825da 100644 --- a/src/data/migrations/db_migration_v1.0.2.sql +++ b/src/data/migrations/sqlite/db_migration_sqlite_v1.0.2.sql @@ -1,4 +1,3 @@ - CREATE TABLE IF NOT EXISTS Flows ( id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, name VARCHAR(255) UNIQUE, @@ -415,7 +414,7 @@ CREATE INDEX idx_routing_applicationId ON Routings (application_id); CREATE TABLE IF NOT EXISTS Routers ( id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, is_edge BOOLEAN DEFAULT true, - messaging_port INT DEFAULT 5672, + messaging_port INT DEFAULT 5671, edge_router_port INT, inter_router_port INT, host TEXT, @@ -565,14 +564,6 @@ CREATE TABLE IF NOT EXISTS MicroserviceCdiDevices ( CREATE INDEX idx_microservice_cdiDevices_microserviceUuid ON MicroserviceCdiDevices (microservice_uuid); -ALTER TABLE Routers ADD COLUMN require_ssl TEXT; -ALTER TABLE Routers ADD COLUMN ssl_profile TEXT; -ALTER TABLE Routers ADD COLUMN sasl_mechanisms TEXT; -ALTER TABLE Routers ADD COLUMN authenticate_peer TEXT; -ALTER TABLE Routers ADD COLUMN ca_cert TEXT; -ALTER TABLE Routers ADD COLUMN tls_cert TEXT; -ALTER TABLE Routers ADD COLUMN tls_key TEXT; - CREATE TABLE IF NOT EXISTS MicroservicePubTags ( id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, microservice_uuid VARCHAR(32), @@ -637,4 +628,70 @@ CREATE TABLE IF NOT EXISTS FogUsedTokens ( CREATE INDEX idx_fog_used_tokens_iofogUuid ON FogUsedTokens (iofog_uuid); -DROP TABLE IF EXISTS FogAccessTokens; \ No newline at end of file +DROP TABLE IF EXISTS FogAccessTokens; + +ALTER TABLE MicroserviceStatuses ADD COLUMN ip_address TEXT; + +CREATE TABLE IF NOT EXISTS Secrets ( + id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, + name VARCHAR(255) UNIQUE NOT NULL, + type VARCHAR(50) NOT NULL CHECK (type IN ('opaque', 'tls')), + data TEXT NOT NULL, + created_at DATETIME, + updated_at DATETIME +); + +CREATE INDEX idx_secrets_name ON Secrets (name); + +CREATE TABLE IF NOT EXISTS Certificates ( + id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, + name TEXT UNIQUE NOT NULL, + subject TEXT NOT NULL, + is_ca BOOLEAN DEFAULT false, + signed_by_id INTEGER, + hosts TEXT, + valid_from DATETIME NOT NULL, + valid_to DATETIME NOT NULL, + serial_number TEXT NOT NULL, + secret_id INTEGER, + created_at DATETIME, + updated_at DATETIME, + FOREIGN KEY (signed_by_id) REFERENCES Certificates (id) ON DELETE SET NULL, + FOREIGN KEY (secret_id) REFERENCES Secrets (id) ON DELETE CASCADE +); + +CREATE INDEX idx_certificates_name ON Certificates (name); +CREATE INDEX idx_certificates_valid_to ON Certificates (valid_to); +CREATE INDEX idx_certificates_is_ca ON Certificates (is_ca); +CREATE INDEX idx_certificates_signed_by_id ON Certificates (signed_by_id); +CREATE INDEX idx_certificates_secret_id ON Certificates (secret_id); + +CREATE TABLE IF NOT EXISTS Services ( + id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, + name TEXT UNIQUE NOT NULL, + type TEXT NOT NULL, + resource TEXT NOT NULL, + target_port INTEGER NOT NULL, + service_port INTEGER, + bridge_port INTEGER, + service_endpoint TEXT, + created_at DATETIME, + updated_at DATETIME, +); + +CREATE INDEX idx_services_id ON Services (id); +CREATE INDEX idx_services_name ON Services (name); + +CREATE TABLE IF NOT EXISTS ServiceTags ( + id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, + service_id INTEGER NOT NULL, + tag_id INTEGER NOT NULL, + created_at DATETIME, + updated_at DATETIME, + FOREIGN KEY (service_id) REFERENCES Services (id) ON DELETE CASCADE, + FOREIGN KEY (tag_id) REFERENCES Tags (id) ON DELETE CASCADE +); + +CREATE INDEX idx_service_tags_service_id ON ServiceTags (service_id); +CREATE INDEX idx_service_tags_tag_id ON ServiceTags (tag_id); + diff --git a/src/data/models/certificate.js b/src/data/models/certificate.js new file mode 100644 index 000000000..c343332ff --- /dev/null +++ b/src/data/models/certificate.js @@ -0,0 +1,130 @@ +'use strict' + +module.exports = (sequelize, DataTypes) => { + const Certificate = sequelize.define('Certificate', { + id: { + type: DataTypes.INTEGER, + primaryKey: true, + autoIncrement: true, + allowNull: false, + field: 'id' + }, + name: { + type: DataTypes.TEXT, + allowNull: false, + field: 'name', + unique: true + }, + subject: { + type: DataTypes.TEXT, + allowNull: false, + field: 'subject' + }, + isCA: { + type: DataTypes.BOOLEAN, + allowNull: false, + defaultValue: false, + field: 'is_ca' + }, + signedById: { + type: DataTypes.INTEGER, + allowNull: true, + field: 'signed_by_id', + references: { + model: 'Certificates', + key: 'id' + } + }, + hosts: { + type: DataTypes.TEXT, + allowNull: true, + field: 'hosts' + }, + validFrom: { + type: DataTypes.DATE, + allowNull: false, + field: 'valid_from' + }, + validTo: { + type: DataTypes.DATE, + allowNull: false, + field: 'valid_to' + }, + serialNumber: { + type: DataTypes.TEXT, + allowNull: false, + field: 'serial_number' + }, + secretId: { + type: DataTypes.INTEGER, + allowNull: true, + field: 'secret_id', + references: { + model: 'Secrets', + key: 'id' + } + } + }, { + tableName: 'Certificates', + timestamps: true, + underscored: true, + indexes: [ + { + unique: true, + fields: ['name'] + }, + { + fields: ['valid_to'] + }, + { + fields: ['is_ca'] + }, + { + fields: ['signed_by_id'] + }, + { + fields: ['secret_id'] + } + ] + }) + + Certificate.associate = (models) => { + Certificate.belongsTo(Certificate, { + as: 'signingCA', + foreignKey: 'signed_by_id' + }) + Certificate.hasMany(Certificate, { + as: 'signedCertificates', + foreignKey: 'signed_by_id' + }) + + Certificate.belongsTo(models.Secret, { + foreignKey: 'secret_id', + as: 'secret' + }) + } + + // Add a getter for days remaining until expiration + Certificate.prototype.getDaysUntilExpiration = function () { + const today = new Date() + const expiryDate = new Date(this.validTo) + const diffTime = expiryDate - today + const diffDays = Math.ceil(diffTime / (1000 * 60 * 60 * 24)) + return diffDays > 0 ? diffDays : 0 + } + + // Add a method to check if certificate is expired + Certificate.prototype.isExpired = function () { + const today = new Date() + const expiryDate = new Date(this.validTo) + return today > expiryDate + } + + // Add a method to check if certificate is expiring soon + Certificate.prototype.isExpiringSoon = function (days = 30) { + const daysRemaining = this.getDaysUntilExpiration() + return daysRemaining > 0 && daysRemaining <= days + } + + return Certificate +} diff --git a/src/data/models/index.js b/src/data/models/index.js index 71666d164..30b833b76 100644 --- a/src/data/models/index.js +++ b/src/data/models/index.js @@ -11,26 +11,28 @@ const config = require('../../config') const logger = require('../../logger') const databaseProvider = require('../providers/database-factory') -const sequelize = databaseProvider.sequelize -fs - .readdirSync(__dirname) - .filter((file) => { - return (file.indexOf('.') !== 0) && (file !== basename) && (file.slice(-3) === '.js') - }) - .forEach((file) => { - const model = require(path.join(__dirname, file))(sequelize, Sequelize.DataTypes) - db[model.name] = model - }) +// Initialize models after database is ready +const initializeModels = (sequelize) => { + fs + .readdirSync(__dirname) + .filter((file) => { + return (file.indexOf('.') !== 0) && (file !== basename) && (file.slice(-3) === '.js') + }) + .forEach((file) => { + const model = require(path.join(__dirname, file))(sequelize, Sequelize.DataTypes) + db[model.name] = model + }) -Object.keys(db).forEach((modelName) => { - if (db[modelName].associate) { - db[modelName].associate(db) - } -}) + Object.keys(db).forEach((modelName) => { + if (db[modelName].associate) { + db[modelName].associate(db) + } + }) -db.sequelize = sequelize -db.Sequelize = Sequelize + db.sequelize = sequelize + db.Sequelize = Sequelize +} const configureImage = async (db, name, fogTypes, images) => { const catalogItem = await db.CatalogItem.findOne({ where: { name, isPublic: false } }) @@ -47,19 +49,23 @@ const configureImage = async (db, name, fogTypes, images) => { db.initDB = async (isStart) => { await databaseProvider.initDB(isStart) + // Initialize models after database is ready + initializeModels(databaseProvider.sequelize) + if (isStart) { if (databaseProvider instanceof require('../providers/sqlite')) { const sqliteDbPath = databaseProvider.sequelize.options.storage - - // Check if the database file exists - if (fs.existsSync(sqliteDbPath)) { - logger.info('Database file exists. Running migrations only...') - await databaseProvider.runMigration(sqliteDbPath) // Ensure migration finishes before moving on - } else { - logger.info('Database file does not exist. Running migrations and seeders...') - await databaseProvider.runMigration(sqliteDbPath) // Wait for migration to finish - await databaseProvider.runSeeder(sqliteDbPath) // Wait for seeding to finish - } + logger.info('Running SQLite database migrations and seeders...') + await databaseProvider.runMigrationSQLite(sqliteDbPath) + await databaseProvider.runSeederSQLite(sqliteDbPath) + } else if (databaseProvider instanceof require('../providers/mysql')) { + logger.info('Running MySQL database migrations and seeders...') + await databaseProvider.runMigrationMySQL(databaseProvider.sequelize) + await databaseProvider.runSeederMySQL(databaseProvider.sequelize) + } else if (databaseProvider instanceof require('../providers/postgres')) { + logger.info('Running PostgreSQL database migrations and seeders...') + await databaseProvider.runMigrationPostgres(databaseProvider.sequelize) + await databaseProvider.runSeederPostgres(databaseProvider.sequelize) } // Configure system images diff --git a/src/data/models/microservicestatus.js b/src/data/models/microservicestatus.js index 7fe3c46ca..136fda266 100644 --- a/src/data/models/microservicestatus.js +++ b/src/data/models/microservicestatus.js @@ -60,6 +60,11 @@ module.exports = (sequelize, DataTypes) => { type: DataTypes.TEXT, defaultValue: '', field: 'error_message' + }, + ipAddress: { + type: DataTypes.TEXT, + defaultValue: '', + field: 'ip_address' } }, { tableName: 'MicroserviceStatuses', diff --git a/src/data/models/router.js b/src/data/models/router.js index 97d75e940..e4cd99801 100644 --- a/src/data/models/router.js +++ b/src/data/models/router.js @@ -17,7 +17,7 @@ module.exports = (sequelize, DataTypes) => { messagingPort: { type: DataTypes.INTEGER, field: 'messaging_port', - defaultValue: 5672 + defaultValue: 5671 }, edgeRouterPort: { type: DataTypes.INTEGER, @@ -35,34 +35,6 @@ module.exports = (sequelize, DataTypes) => { type: DataTypes.BOOLEAN, field: 'is_default', defaultValue: false - }, - requireSsl: { - type: DataTypes.TEXT, - field: 'require_ssl' - }, - sslProfile: { - type: DataTypes.TEXT, - field: 'ssl_profile' - }, - saslMechanisms: { - type: DataTypes.TEXT, - field: 'sasl_mechanisms' - }, - authenticatePeer: { - type: DataTypes.TEXT, - field: 'authenticate_peer' - }, - caCert: { - type: DataTypes.TEXT, - field: 'ca_cert' - }, - tlsCert: { - type: DataTypes.TEXT, - field: 'tls_cert' - }, - tlsKey: { - type: DataTypes.TEXT, - field: 'tls_key' } }, { tableName: 'Routers', diff --git a/src/data/models/secret.js b/src/data/models/secret.js new file mode 100644 index 000000000..3b19442ac --- /dev/null +++ b/src/data/models/secret.js @@ -0,0 +1,79 @@ +'use strict' + +const SecretHelper = require('../../helpers/secret-helper') + +module.exports = (sequelize, DataTypes) => { + const Secret = sequelize.define('Secret', { + id: { + type: DataTypes.INTEGER, + primaryKey: true, + autoIncrement: true, + allowNull: false, + field: 'id' + }, + name: { + type: DataTypes.TEXT, + allowNull: false, + field: 'name', + unique: true + }, + type: { + type: DataTypes.TEXT, + allowNull: false, + field: 'type', + validate: { + isIn: [['opaque', 'tls']] + } + }, + data: { + type: DataTypes.TEXT, + allowNull: false, + field: 'data', + defaultValue: '{}', + get () { + const rawValue = this.getDataValue('data') + return rawValue ? JSON.parse(rawValue) : {} + }, + set (value) { + this.setDataValue('data', JSON.stringify(value)) + } + } + }, { + tableName: 'Secrets', + timestamps: true, + underscored: true, + indexes: [ + { + unique: true, + fields: ['name'] + } + ], + hooks: { + beforeSave: async (secret) => { + if (secret.changed('data')) { + const encryptedData = await SecretHelper.encryptSecret( + secret.data, + secret.name + ) + secret.data = encryptedData + } + }, + afterFind: async (secret) => { + if (secret && secret.data) { + try { + const decryptedData = await SecretHelper.decryptSecret( + secret.data, + secret.name + ) + secret.data = decryptedData + } catch (error) { + console.error('Error decrypting secret data:', error) + secret.data = {} + } + } + } + } + }) + + return Secret +} diff --git a/src/data/providers/database-provider.js b/src/data/providers/database-provider.js index 9ada5d730..df1ef454b 100644 --- a/src/data/providers/database-provider.js +++ b/src/data/providers/database-provider.js @@ -8,9 +8,251 @@ class DatabaseProvider { this.basename = path.basename(__filename) } - // Async function for the migration process - async runMigration (dbName) { - const migrationSqlPath = path.resolve(__dirname, '../migrations/db_migration_v1.0.2.sql') + // Helper method to create database if it doesn't exist + async createDatabaseIfNotExists (db, provider, dbName) { + let checkQuery, createQuery + switch (provider) { + case 'mysql': + checkQuery = `SHOW DATABASES LIKE '${dbName}'` + createQuery = `CREATE DATABASE IF NOT EXISTS \`${dbName}\`` + break + case 'postgres': + checkQuery = `SELECT 1 FROM pg_database WHERE datname = '${dbName}'` + createQuery = `CREATE DATABASE "${dbName}"` + break + default: + return // No need to create database for SQLite + } + + try { + // For MySQL, we need to connect without a database first + if (provider === 'mysql') { + const mysql = require('mysql2/promise') + const config = { ...db.config } + // Remove database from config for initial connection + delete config.database + + const tempConnection = await mysql.createConnection(config) + try { + const [result] = await tempConnection.query(checkQuery) + const databaseExists = result.length > 0 + + if (!databaseExists) { + logger.info(`Creating database ${dbName}...`) + await tempConnection.query(createQuery) + logger.info(`Database ${dbName} created successfully`) + } else { + logger.info(`Database ${dbName} already exists`) + } + } finally { + await tempConnection.end() + } + } else if (provider === 'postgres') { + const { Pool } = require('pg') + const config = { ...db.config } + // Remove database from config for initial connection + delete config.database + + const pool = new Pool(config) + try { + const result = await pool.query(checkQuery) + const databaseExists = result.rows && result.rows.length > 0 + + if (!databaseExists) { + logger.info(`Creating database ${dbName}...`) + await pool.query(createQuery) + logger.info(`Database ${dbName} created successfully`) + } else { + logger.info(`Database ${dbName} already exists`) + } + } finally { + await pool.end() + } + } + } catch (err) { + logger.error(`Error checking/creating database ${dbName}:`, err) + throw err + } + } + + // Common method to check if migration has been run + async checkMigrationVersion (db, provider) { + let query + switch (provider) { + case 'sqlite': + query = 'SELECT migration_version FROM SchemaVersion WHERE migration_version IS NOT NULL ORDER BY id DESC LIMIT 1' + return new Promise((resolve, reject) => { + db.get(query, (err, row) => { + if (err) { + if (err.message.includes('no such table')) { + resolve(null) // Table doesn't exist yet + } else { + reject(err) + } + } else { + resolve(row ? row.migration_version : null) + } + }) + }) + case 'mysql': + query = 'SELECT migration_version FROM SchemaVersion WHERE migration_version IS NOT NULL ORDER BY id DESC LIMIT 1' + break + case 'postgres': + query = 'SELECT migration_version FROM "SchemaVersion" WHERE migration_version IS NOT NULL ORDER BY id DESC LIMIT 1' + break + } + + try { + const [results] = await db.query(query) + return results && results.length > 0 ? results[0].migration_version : null + } catch (err) { + if (err.code === 'ER_NO_SUCH_TABLE' || err.code === '42P01') { + return null // Table doesn't exist yet + } + throw err + } + } + + // Common method to check if seeder has been run + async checkSeederVersion (db, provider) { + let query + switch (provider) { + case 'sqlite': + query = 'SELECT seeder_version FROM SchemaVersion WHERE seeder_version IS NOT NULL ORDER BY id DESC LIMIT 1' + return new Promise((resolve, reject) => { + db.get(query, (err, row) => { + if (err) { + if (err.message.includes('no such table')) { + resolve(null) // Table doesn't exist yet + } else { + reject(err) + } + } else { + resolve(row ? row.seeder_version : null) + } + }) + }) + case 'mysql': + query = 'SELECT seeder_version FROM SchemaVersion WHERE seeder_version IS NOT NULL ORDER BY id DESC LIMIT 1' + break + case 'postgres': + query = 'SELECT seeder_version FROM "SchemaVersion" WHERE seeder_version IS NOT NULL ORDER BY id DESC LIMIT 1' + break + } + + try { + const [results] = await db.query(query) + return results && results.length > 0 ? results[0].seeder_version : null + } catch (err) { + if (err.code === 'ER_NO_SUCH_TABLE' || err.code === '42P01') { + return null // Table doesn't exist yet + } + throw err + } + } + + // Common method to create SchemaVersion table + async createSchemaVersionTable (db, provider) { + let query + switch (provider) { + case 'sqlite': + query = ` + CREATE TABLE IF NOT EXISTS SchemaVersion ( + id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, + migration_version TEXT NOT NULL, + seeder_version TEXT, + created_at DATETIME DEFAULT CURRENT_TIMESTAMP, + updated_at DATETIME DEFAULT CURRENT_TIMESTAMP + ) + ` + return new Promise((resolve, reject) => { + db.run(query, (err) => { + if (err) reject(err) + else resolve() + }) + }) + case 'mysql': + query = ` + CREATE TABLE IF NOT EXISTS SchemaVersion ( + id INT AUTO_INCREMENT PRIMARY KEY, + migration_version VARCHAR(255) NOT NULL, + seeder_version VARCHAR(255), + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP + ) + ` + break + case 'postgres': + query = ` + CREATE TABLE IF NOT EXISTS "SchemaVersion" ( + id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY, + migration_version VARCHAR(255) NOT NULL, + seeder_version VARCHAR(255), + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP + ) + ` + break + } + + try { + await db.query(query) + } catch (err) { + throw err + } + } + + // Common method to update migration version + async updateMigrationVersion (db, version, provider) { + let query + switch (provider) { + case 'sqlite': + query = 'INSERT INTO SchemaVersion (migration_version) VALUES (?)' + return new Promise((resolve, reject) => { + db.run(query, [version], (err) => { + if (err) reject(err) + else resolve() + }) + }) + case 'mysql': + query = 'INSERT INTO SchemaVersion (migration_version) VALUES (?)' + await db.query(query, { replacements: [version] }) + break + case 'postgres': + query = 'INSERT INTO "SchemaVersion" (migration_version) VALUES ($1)' + await db.query(query, { bind: [version] }) + break + } + } + + // Common method to update seeder version + async updateSeederVersion (db, version, provider) { + switch (provider) { + case 'sqlite': + const sqliteQuery = 'UPDATE SchemaVersion SET seeder_version = ?, updated_at = CURRENT_TIMESTAMP WHERE id = (SELECT MAX(id) FROM SchemaVersion)' + return new Promise((resolve, reject) => { + db.run(sqliteQuery, [version], (err) => { + if (err) reject(err) + else resolve() + }) + }) + case 'mysql': + const [result] = await db.query('SELECT MAX(id) as maxId FROM SchemaVersion') + const maxId = result[0].maxId + const mysqlQuery = 'UPDATE SchemaVersion SET seeder_version = ?, updated_at = CURRENT_TIMESTAMP WHERE id = ?' + await db.query(mysqlQuery, { replacements: [version, maxId] }) + break + case 'postgres': + const postgresQuery = 'UPDATE "SchemaVersion" SET seeder_version = $1, updated_at = CURRENT_TIMESTAMP WHERE id = (SELECT MAX(id) FROM "SchemaVersion")' + await db.query(postgresQuery, { bind: [version] }) + break + } + } + + // SQLite migration + async runMigrationSQLite (dbName) { + const migrationSqlPath = path.resolve(__dirname, '../migrations/sqlite/db_migration_sqlite_v1.0.2.sql') + const migrationVersion = '1.0.2' if (!fs.existsSync(migrationSqlPath)) { logger.error(`Migration file not found: ${migrationSqlPath}`) @@ -18,7 +260,7 @@ class DatabaseProvider { } const migrationSql = fs.readFileSync(migrationSqlPath).toString() - const dataArr = migrationSql.split(';') // Split by semicolon + const dataArr = migrationSql.split(';') let db = new sqlite3.Database(dbName, (err) => { if (err) { @@ -29,28 +271,31 @@ class DatabaseProvider { }) try { + await this.createSchemaVersionTable(db, 'sqlite') + const currentVersion = await this.checkMigrationVersion(db, 'sqlite') + + if (currentVersion === migrationVersion) { + logger.info('Migration already up to date, skipping...') + return + } + db.serialize(() => { - db.run('PRAGMA foreign_keys=OFF;') // Disable foreign key checks during migration - db.run('BEGIN TRANSACTION;') // Start transaction + db.run('PRAGMA foreign_keys=OFF;') + db.run('BEGIN TRANSACTION;') }) for (let query of dataArr) { if (query.trim()) { - query = query.trim() + ';' // Ensure semicolon is added back - - // Run each query sequentially + query = query.trim() + ';' await new Promise((resolve, reject) => { db.run(query, (err) => { if (err) { - if ( - err.message.includes('already exists') || - err.message.includes('duplicate') - ) { + if (err.message.includes('already exists') || err.message.includes('duplicate')) { logger.warn(`Ignored error: ${err.message}`) - resolve() // Ignore specific errors + resolve() } else { - db.run('ROLLBACK;') // Rollback transaction on error - reject(err) // Reject on other errors + db.run('ROLLBACK;') + reject(err) } } else { resolve() @@ -60,7 +305,7 @@ class DatabaseProvider { } } - // Commit the transaction if all queries succeed + await this.updateMigrationVersion(db, migrationVersion, 'sqlite') db.run('COMMIT;') logger.info('Migration completed successfully.') } catch (err) { @@ -77,9 +322,114 @@ class DatabaseProvider { } } - // Async function for the seeding process - async runSeeder (dbName) { - const seederSqlPath = path.resolve(__dirname, '../seeders/db_seeder_v1.0.2.sql') + // MySQL migration + async runMigrationMySQL (db) { + const migrationSqlPath = path.resolve(__dirname, '../migrations/mysql/db_migration_mysql_v1.0.2.sql') + const migrationVersion = '1.0.2' + + if (!fs.existsSync(migrationSqlPath)) { + logger.error(`Migration file not found: ${migrationSqlPath}`) + throw new Error('Migration file not found') + } + + const migrationSql = fs.readFileSync(migrationSqlPath).toString() + const dataArr = migrationSql.split(';') + + try { + await this.createSchemaVersionTable(db, 'mysql') + const currentVersion = await this.checkMigrationVersion(db, 'mysql') + + if (currentVersion === migrationVersion) { + logger.info('Migration already up to date, skipping...') + return + } + + await db.query('START TRANSACTION') + + for (let query of dataArr) { + if (query.trim()) { + query = query.trim() + ';' + try { + await db.query(query) + } catch (err) { + if (err.code === 'ER_TABLE_EXISTS_ERROR' || + err.code === 'ER_DUP_FIELDNAME' || + err.code === 'ER_DUP_KEYNAME') { + logger.warn(`Ignored MySQL error: ${err.message}`) + } else { + await db.query('ROLLBACK') + throw err + } + } + } + } + + await this.updateMigrationVersion(db, migrationVersion, 'mysql') + await db.query('COMMIT') + logger.info('Migration completed successfully.') + } catch (err) { + await db.query('ROLLBACK') + logger.error('Migration failed:', err) + throw err + } + } + + // PostgreSQL migration + async runMigrationPostgres (db) { + const migrationSqlPath = path.resolve(__dirname, '../migrations/postgres/db_migration_pg_v1.0.2.sql') + const migrationVersion = '1.0.2' + + if (!fs.existsSync(migrationSqlPath)) { + logger.error(`Migration file not found: ${migrationSqlPath}`) + throw new Error('Migration file not found') + } + + const migrationSql = fs.readFileSync(migrationSqlPath).toString() + const dataArr = migrationSql.split(';') + + try { + await this.createSchemaVersionTable(db, 'postgres') + const currentVersion = await this.checkMigrationVersion(db, 'postgres') + + if (currentVersion === migrationVersion) { + logger.info('Migration already up to date, skipping...') + return + } + + await db.query('BEGIN') + + for (let query of dataArr) { + if (query.trim()) { + query = query.trim() + ';' + try { + await db.query(query) + } catch (err) { + if (err.code === '42P07' || // duplicate_table + err.code === '42701' || // duplicate_column + err.code === '42P06') { // duplicate_schema + logger.warn(`Ignored PostgreSQL error: ${err.message}`) + } else { + await db.query('ROLLBACK') + throw err + } + } + } + } + + await this.updateMigrationVersion(db, migrationVersion, 'postgres') + await db.query('COMMIT') + logger.info('Migration completed successfully.') + } catch (err) { + await db.query('ROLLBACK') + logger.error('Migration failed:', err) + throw err + } + } + + // SQLite seeder + async runSeederSQLite (dbName) { + const seederSqlPath = path.resolve(__dirname, '../seeders/sqlite/db_seeder_sqlite_v1.0.2.sql') + const seederVersion = '1.0.2' if (!fs.existsSync(seederSqlPath)) { logger.error(`Seeder file not found: ${seederSqlPath}`) @@ -87,7 +437,7 @@ class DatabaseProvider { } const seederSql = fs.readFileSync(seederSqlPath).toString() - const dataArr = seederSql.split(';') // Split by semicolon + const dataArr = seederSql.split(';') let db = new sqlite3.Database(dbName, (err) => { if (err) { @@ -98,28 +448,30 @@ class DatabaseProvider { }) try { + const currentVersion = await this.checkSeederVersion(db, 'sqlite') + + if (currentVersion === seederVersion) { + logger.info('Seeder already up to date, skipping...') + return + } + db.serialize(() => { - db.run('PRAGMA foreign_keys=OFF;') // Disable foreign key checks during seeding - db.run('BEGIN TRANSACTION;') // Start transaction + db.run('PRAGMA foreign_keys=OFF;') + db.run('BEGIN TRANSACTION;') }) for (let query of dataArr) { if (query.trim()) { - query = query.trim() + ';' // Ensure semicolon is added back - - // Run each query sequentially + query = query.trim() + ';' await new Promise((resolve, reject) => { db.run(query, (err) => { if (err) { - if ( - err.message.includes('already exists') || - err.message.includes('duplicate') - ) { + if (err.message.includes('already exists') || err.message.includes('duplicate')) { logger.warn(`Ignored error: ${err.message}`) - resolve() // Ignore specific errors + resolve() } else { - db.run('ROLLBACK;') // Rollback transaction on error - reject(err) // Reject on other errors + db.run('ROLLBACK;') + reject(err) } } else { resolve() @@ -129,7 +481,7 @@ class DatabaseProvider { } } - // Commit the transaction if all queries succeed + await this.updateSeederVersion(db, seederVersion, 'sqlite') db.run('COMMIT;') logger.info('Seeding completed successfully.') } catch (err) { @@ -145,6 +497,106 @@ class DatabaseProvider { }) } } + + // MySQL seeder + async runSeederMySQL (db) { + const seederSqlPath = path.resolve(__dirname, '../seeders/mysql/db_seeder_mysql_v1.0.2.sql') + const seederVersion = '1.0.2' + + if (!fs.existsSync(seederSqlPath)) { + logger.error(`Seeder file not found: ${seederSqlPath}`) + throw new Error('Seeder file not found') + } + + const seederSql = fs.readFileSync(seederSqlPath).toString() + const dataArr = seederSql.split(';') + + try { + const currentVersion = await this.checkSeederVersion(db, 'mysql') + + if (currentVersion === seederVersion) { + logger.info('Seeder already up to date, skipping...') + return + } + + await db.query('START TRANSACTION') + + for (let query of dataArr) { + if (query.trim()) { + query = query.trim() + ';' + try { + await db.query(query) + } catch (err) { + if (err.code === 'ER_DUP_ENTRY' || + err.code === 'ER_DUP_KEY') { + logger.warn(`Ignored MySQL error: ${err.message}`) + } else { + await db.query('ROLLBACK') + throw err + } + } + } + } + + await this.updateSeederVersion(db, seederVersion, 'mysql') + await db.query('COMMIT') + logger.info('Seeding completed successfully.') + } catch (err) { + await db.query('ROLLBACK') + logger.error('Seeding failed:', err) + throw err + } + } + + // PostgreSQL seeder + async runSeederPostgres (db) { + const seederSqlPath = path.resolve(__dirname, '../seeders/postgres/db_seeder_pg_v1.0.2.sql') + const seederVersion = '1.0.2' + + if (!fs.existsSync(seederSqlPath)) { + logger.error(`Seeder file not found: ${seederSqlPath}`) + throw new Error('Seeder file not found') + } + + const seederSql = fs.readFileSync(seederSqlPath).toString() + const dataArr = seederSql.split(';') + + try { + const currentVersion = await this.checkSeederVersion(db, 'postgres') + + if (currentVersion === seederVersion) { + logger.info('Seeder already up to date, skipping...') + return + } + + await db.query('BEGIN') + + for (let query of dataArr) { + if (query.trim()) { + query = query.trim() + ';' + try { + await db.query(query) + } catch (err) { + if (err.code === '23505' || // unique_violation + err.code === '23503') { // foreign_key_violation + logger.warn(`Ignored PostgreSQL error: ${err.message}`) + } else { + await db.query('ROLLBACK') + throw err + } + } + } + } + + await this.updateSeederVersion(db, seederVersion, 'postgres') + await db.query('COMMIT') + logger.info('Seeding completed successfully.') + } catch (err) { + await db.query('ROLLBACK') + logger.error('Seeding failed:', err) + throw err + } + } } module.exports = DatabaseProvider diff --git a/src/data/providers/mysql.js b/src/data/providers/mysql.js index 3c654f8a4..4225a2041 100644 --- a/src/data/providers/mysql.js +++ b/src/data/providers/mysql.js @@ -1,24 +1,65 @@ const Sequelize = require('sequelize') - const config = require('../../config') const DatabaseProvider = require('./database-provider') +const logger = require('../../logger') +const mysql = require('mysql2/promise') class MySqlDatabaseProvider extends DatabaseProvider { constructor () { super() + // Get MySQL configuration from config or environment variables const mysqlConfig = config.get('database.mysql', {}) - mysqlConfig.dialect = 'mysql' - mysqlConfig.host = process.env.DB_HOST || mysqlConfig.host - mysqlConfig.port = process.env.DB_PORT || mysqlConfig.port - mysqlConfig.username = process.env.DB_USERNAME || mysqlConfig.username - mysqlConfig.password = process.env.DB_PASSWORD || mysqlConfig.password - mysqlConfig.databaseName = process.env.DB_NAME || mysqlConfig.database - this.sequelize = new Sequelize(mysqlConfig.databaseName, mysqlConfig.username, mysqlConfig.password, mysqlConfig) + // Base MySQL connection options + const connectionOptions = { + host: process.env.DB_HOST || mysqlConfig.host, + port: process.env.DB_PORT || mysqlConfig.port, + user: process.env.DB_USERNAME || mysqlConfig.username, + password: process.env.DB_PASSWORD || mysqlConfig.password, + database: process.env.DB_NAME || mysqlConfig.databaseName, + connectTimeout: 10000 + } + + // Sequelize configuration + const sequelizeConfig = { + dialect: 'mysql', + host: connectionOptions.host, + port: connectionOptions.port, + username: connectionOptions.user, + password: connectionOptions.password, + database: connectionOptions.database, + dialectOptions: { + connectTimeout: connectionOptions.connectTimeout + }, + logging: false + } + + this.sequelize = new Sequelize(sequelizeConfig) + this.connectionOptions = connectionOptions } async initDB () { + try { + // First try to connect to the database directly + const connection = await mysql.createConnection(this.connectionOptions) + await connection.end() + } catch (err) { + if (err.code === 'ER_BAD_DB_ERROR') { + // Database doesn't exist, try to create it + logger.info('Database does not exist, attempting to create it...') + const { database, ...connectionConfig } = this.connectionOptions + const tempConnection = await mysql.createConnection(connectionConfig) + try { + await tempConnection.query(`CREATE DATABASE IF NOT EXISTS \`${database}\``) + logger.info(`Database ${database} created successfully`) + } finally { + await tempConnection.end() + } + } else { + throw err + } + } } } diff --git a/src/data/providers/postgres.js b/src/data/providers/postgres.js index 1c8a07e1d..f1e44ade4 100644 --- a/src/data/providers/postgres.js +++ b/src/data/providers/postgres.js @@ -1,24 +1,66 @@ const Sequelize = require('sequelize') - const config = require('../../config') const DatabaseProvider = require('./database-provider') +const logger = require('../../logger') +const { Pool } = require('pg') class PostgresDatabaseProvider extends DatabaseProvider { constructor () { super() + // Get PostgreSQL configuration from config or environment variables const postgresConfig = config.get('database.postgres', {}) - postgresConfig.dialect = 'postgres' - postgresConfig.host = process.env.DB_HOST || postgresConfig.host - postgresConfig.port = process.env.DB_PORT || postgresConfig.port - postgresConfig.username = process.env.DB_USERNAME || postgresConfig.username - postgresConfig.password = process.env.DB_PASSWORD || postgresConfig.password - postgresConfig.databaseName = process.env.DB_NAME || postgresConfig.database - this.sequelize = new Sequelize(postgresConfig.databaseName, postgresConfig.username, postgresConfig.password, postgresConfig) + // Base PostgreSQL connection options + const connectionOptions = { + host: process.env.DB_HOST || postgresConfig.host, + port: process.env.DB_PORT || postgresConfig.port, + user: process.env.DB_USERNAME || postgresConfig.username, + password: process.env.DB_PASSWORD || postgresConfig.password, + database: process.env.DB_NAME || postgresConfig.databaseName, + connectTimeout: 10000 + } + + // Sequelize configuration + const sequelizeConfig = { + dialect: 'postgres', + host: connectionOptions.host, + port: connectionOptions.port, + username: connectionOptions.user, + password: connectionOptions.password, + database: connectionOptions.database, + dialectOptions: { + connectTimeout: connectionOptions.connectTimeout + }, + logging: false + } + + this.sequelize = new Sequelize(sequelizeConfig) + this.connectionOptions = connectionOptions } async initDB () { + try { + // First try to connect to the database directly + const pool = new Pool(this.connectionOptions) + await pool.query('SELECT 1') + await pool.end() + } catch (err) { + if (err.code === '3D000') { // PostgreSQL error code for database doesn't exist + // Database doesn't exist, try to create it + logger.info('Database does not exist, attempting to create it...') + const { database, ...connectionConfig } = this.connectionOptions + const pool = new Pool(connectionConfig) + try { + await pool.query(`CREATE DATABASE "${database}"`) + logger.info(`Database ${database} created successfully`) + } finally { + await pool.end() + } + } else { + throw err + } + } } } diff --git a/src/data/seeders/mysql/db_seeder_mysql_v1.0.2.sql b/src/data/seeders/mysql/db_seeder_mysql_v1.0.2.sql new file mode 100644 index 000000000..bfa21802b --- /dev/null +++ b/src/data/seeders/mysql/db_seeder_mysql_v1.0.2.sql @@ -0,0 +1,43 @@ +START TRANSACTION; + +INSERT INTO `Registries` (url, is_public, secure, certificate, requires_cert, user_name, password, user_email) +VALUES + ('registry.hub.docker.com', true, true, '', false, '', '', ''), + ('from_cache', true, true, '', false, '', '', ''); + +INSERT INTO `CatalogItems` (name, description, category, publisher, disk_required, ram_required, picture, config_example, is_public, registry_id) +VALUES + ('NATs', 'NATs server microservice for Datasance PoT', 'UTILITIES', 'Datasance', 0, 0, 'none.png', NULL, true, 1), + ('RESTBlue', 'REST API for Bluetooth Low Energy layer.', 'SYSTEM', 'Datasance', 0, 0, 'none.png', NULL, true, 1), + ('HAL', 'REST API for Hardware Abstraction layer.', 'SYSTEM', 'Datasance', 0, 0, 'none.png', NULL, true, 1), + ('EdgeGuard', 'Security and monitoring component for edge devices running ioFog Agents.', 'UTILITIES', 'Datasance', 0, 0, 'none.png', NULL, true, 1), + ('Router', 'The built-in router for Datasance PoT.', 'SYSTEM', 'Datasance', 0, 0, 'none.png', NULL, false, 1), + ('Proxy', 'The built-in proxy for Datasance PoT.', 'SYSTEM', 'Datasance', 0, 0, 'none.png', NULL, false, 1); + +INSERT INTO `FogTypes` (id, name, image, description, network_catalog_item_id, hal_catalog_item_id, bluetooth_catalog_item_id) +VALUES + (0, 'Unspecified', 'iointegrator0.png', 'Unspecified device. Fog Type will be selected on provision', 1, 3, 2), + (1, 'Standard Linux (x86)', 'iointegrator1.png', 'A standard Linux server of at least moderate processing power and capacity. Compatible with common Linux types such as Ubuntu, Red Hat, and CentOS.', 1, 3, 2), + (2, 'ARM Linux', 'iointegrator2.png', 'A version of ioFog meant to run on Linux systems with ARM processors. Microservices for this ioFog type will be tailored to ARM systems.', 1, 3, 2); + +UPDATE `Fogs` +SET fog_type_id = 0 +WHERE fog_type_id IS NULL; + +INSERT INTO `CatalogItemImages` (catalog_item_id, fog_type_id, container_image) +VALUES + (1, 1, 'ghcr.io/datasance/nats:latest'), + (1, 2, 'ghcr.io/datasance/nats:latest'), + (2, 1, 'ghcr.io/datasance/restblue:latest'), + (2, 2, 'ghcr.io/datasance/restblue:latest'), + (3, 1, 'ghcr.io/datasance/hal:latest'), + (3, 2, 'ghcr.io/datasance/hal:latest'), + (4, 1, 'ghcr.io/datasance/edge-guard:latest'), + (4, 2, 'ghcr.io/datasance/edge-guard:latest'), + (5, 1, 'ghcr.io/datasance/router:latest'), + (5, 2, 'ghcr.io/datasance/router:latest'), + (6, 1, 'ghcr.io/datasance/proxy:latest'), + (6, 2, 'ghcr.io/datasance/proxy:latest'); + + +COMMIT; \ No newline at end of file diff --git a/src/data/seeders/postgres/db_seeder_pg_v1.0.2.sql b/src/data/seeders/postgres/db_seeder_pg_v1.0.2.sql new file mode 100644 index 000000000..aaa987d9e --- /dev/null +++ b/src/data/seeders/postgres/db_seeder_pg_v1.0.2.sql @@ -0,0 +1,42 @@ +START TRANSACTION; + +INSERT INTO "Registries" (url, is_public, secure, certificate, requires_cert, user_name, password, user_email) +VALUES + ('registry.hub.docker.com', true, true, '', false, '', '', ''), + ('from_cache', true, true, '', false, '', '', ''); + +INSERT INTO "CatalogItems" (name, description, category, publisher, disk_required, ram_required, picture, config_example, is_public, registry_id) +VALUES + ('NATs', 'NATs server microservice for Datasance PoT', 'UTILITIES', 'Datasance', 0, 0, 'none.png', NULL, true, 1), + ('RESTBlue', 'REST API for Bluetooth Low Energy layer.', 'SYSTEM', 'Datasance', 0, 0, 'none.png', NULL, true, 1), + ('HAL', 'REST API for Hardware Abstraction layer.', 'SYSTEM', 'Datasance', 0, 0, 'none.png', NULL, true, 1), + ('EdgeGuard', 'Security and monitoring component for edge devices running ioFog Agents.', 'UTILITIES', 'Datasance', 0, 0, 'none.png', NULL, true, 1), + ('Router', 'The built-in router for Datasance PoT.', 'SYSTEM', 'Datasance', 0, 0, 'none.png', NULL, false, 1), + ('Proxy', 'The built-in proxy for Datasance PoT.', 'SYSTEM', 'Datasance', 0, 0, 'none.png', NULL, false, 1); + +INSERT INTO "FogTypes" (id, name, image, description, network_catalog_item_id, hal_catalog_item_id, bluetooth_catalog_item_id) +VALUES + (0, 'Unspecified', 'iointegrator0.png', 'Unspecified device. Fog Type will be selected on provision', 1, 3, 2), + (1, 'Standard Linux (x86)', 'iointegrator1.png', 'A standard Linux server of at least moderate processing power and capacity. Compatible with common Linux types such as Ubuntu, Red Hat, and CentOS.', 1, 3, 2), + (2, 'ARM Linux', 'iointegrator2.png', 'A version of ioFog meant to run on Linux systems with ARM processors. Microservices for this ioFog type will be tailored to ARM systems.', 1, 3, 2); + +UPDATE "Fogs" +SET fog_type_id = 0 +WHERE fog_type_id IS NULL; + +INSERT INTO "CatalogItemImages" (catalog_item_id, fog_type_id, container_image) +VALUES + (1, 1, 'ghcr.io/datasance/nats:latest'), + (1, 2, 'ghcr.io/datasance/nats:latest'), + (2, 1, 'ghcr.io/datasance/restblue:latest'), + (2, 2, 'ghcr.io/datasance/restblue:latest'), + (3, 1, 'ghcr.io/datasance/hal:latest'), + (3, 2, 'ghcr.io/datasance/hal:latest'), + (4, 1, 'ghcr.io/datasance/edge-guard:latest'), + (4, 2, 'ghcr.io/datasance/edge-guard:latest'), + (5, 1, 'ghcr.io/datasance/router:latest'), + (5, 2, 'ghcr.io/datasance/router:latest'), + (6, 1, 'ghcr.io/datasance/proxy:latest'), + (6, 2, 'ghcr.io/datasance/proxy:latest'); + +COMMIT; \ No newline at end of file diff --git a/src/data/seeders/db_seeder_v1.0.2.sql b/src/data/seeders/sqlite/db_seeder_sqlite_v1.0.2.sql similarity index 100% rename from src/data/seeders/db_seeder_v1.0.2.sql rename to src/data/seeders/sqlite/db_seeder_sqlite_v1.0.2.sql diff --git a/src/decorators/authorization-decorator.js b/src/decorators/authorization-decorator.js index 656a4d172..9003b0b67 100644 --- a/src/decorators/authorization-decorator.js +++ b/src/decorators/authorization-decorator.js @@ -51,6 +51,7 @@ function checkFogToken (f) { const payload = JSON.parse(Buffer.from(tokenParts[1], 'base64').toString()) const fogUuid = payload.sub logger.debug({ payload }, 'JWT payload') + logger.info({ iofogUUID: payload.sub }) if (!fogUuid) { logger.error('JWT missing subject claim') diff --git a/src/helpers/error-messages.js b/src/helpers/error-messages.js index 3eac8674f..af41a2c55 100644 --- a/src/helpers/error-messages.js +++ b/src/helpers/error-messages.js @@ -114,5 +114,16 @@ module.exports = { INVALID_MICROSERVICE_PUB_TAG: 'Invalid microservice Pub Tag \'{}\'', INVALID_MICROSERVICE_SUB_TAG: 'Invalid microservice Sub Tag \'{}\'', NOTFOUND_MICROSERVICE_PUB_TAG: 'No microservice found for Pub Tag \'{}\'', - NOTFOUND_MICROSERVICE_SUB_TAG: 'No microservice found for Sub Tag \'{}\'' + NOTFOUND_MICROSERVICE_SUB_TAG: 'No microservice found for Sub Tag \'{}\'', + SECRET_ALREADY_EXISTS: 'Secret with name "{0}" already exists', + SECRET_NOT_FOUND: 'Secret with name "{0}" not found', + // Certificate related error messages + CA_ALREADY_EXISTS: 'CA with name %s already exists', + CA_NOT_FOUND: 'CA with name %s not found', + CERTIFICATE_ALREADY_EXISTS: 'Certificate with name %s already exists', + CERTIFICATE_NOT_FOUND: 'Certificate with name %s not found', + INVALID_CERTIFICATE: 'Invalid certificate: %s', + INVALID_CA: 'Invalid CA: %s', + NOT_KUBERNETES_ENV: 'Controller is not running in Kubernetes environment', + K8S_SECRET_NOT_ALLOWED: 'Kubernetes secret type is not allowed in non-Kubernetes environment' } diff --git a/src/helpers/errors.js b/src/helpers/errors.js index cb57e675c..3d4f8c1cd 100644 --- a/src/helpers/errors.js +++ b/src/helpers/errors.js @@ -102,6 +102,14 @@ class CLIArgsNotProvidedError extends Error { } } +class ConflictError extends Error { + constructor (message) { + super(message) + this.name = 'ConflictError' + this.status = 409 + } +} + module.exports = { AuthenticationError: AuthenticationError, TransactionError: TransactionError, @@ -113,5 +121,6 @@ module.exports = { FtpError: FtpError, InvalidArgumentError: InvalidArgumentError, InvalidArgumentTypeError: InvalidArgumentTypeError, - CLIArgsNotProvidedError: CLIArgsNotProvidedError + CLIArgsNotProvidedError: CLIArgsNotProvidedError, + ConflictError: ConflictError } diff --git a/src/helpers/secret-helper.js b/src/helpers/secret-helper.js new file mode 100644 index 000000000..6e17595da --- /dev/null +++ b/src/helpers/secret-helper.js @@ -0,0 +1,59 @@ +const crypto = require('crypto') + +class SecretHelper { + constructor () { + this.ALGORITHM = 'aes-256-gcm' + this.IV_LENGTH = 12 + this.SALT_LENGTH = 16 + this.TAG_LENGTH = 16 + this.KEY_LENGTH = 32 + this.ITERATIONS = 100000 + } + + async encryptSecret (secretData, secretName) { + const salt = crypto.randomBytes(this.SALT_LENGTH) + const key = await this._deriveKey(secretName, salt) + const iv = crypto.randomBytes(this.IV_LENGTH) + const cipher = crypto.createCipheriv(this.ALGORITHM, key, iv) + const encrypted = Buffer.concat([ + cipher.update(JSON.stringify(secretData), 'utf8'), + cipher.final() + ]) + const tag = cipher.getAuthTag() + return Buffer.concat([salt, iv, tag, encrypted]).toString('base64') + } + + async decryptSecret (encryptedData, secretName) { + const buffer = Buffer.from(encryptedData, 'base64') + const salt = buffer.subarray(0, this.SALT_LENGTH) + const iv = buffer.subarray(this.SALT_LENGTH, this.SALT_LENGTH + this.IV_LENGTH) + const tag = buffer.subarray(this.SALT_LENGTH + this.IV_LENGTH, this.SALT_LENGTH + this.IV_LENGTH + this.TAG_LENGTH) + const encrypted = buffer.subarray(this.SALT_LENGTH + this.IV_LENGTH + this.TAG_LENGTH) + const key = await this._deriveKey(secretName, salt) + const decipher = crypto.createDecipheriv(this.ALGORITHM, key, iv) + decipher.setAuthTag(tag) + const decrypted = Buffer.concat([ + decipher.update(encrypted), + decipher.final() + ]) + return JSON.parse(decrypted.toString('utf8')) + } + + async _deriveKey (secretName, salt) { + return new Promise((resolve, reject) => { + crypto.pbkdf2( + secretName, + salt, + this.ITERATIONS, + this.KEY_LENGTH, + 'sha256', + (err, key) => { + if (err) reject(err) + else resolve(key) + } + ) + }) + } +} + +module.exports = new SecretHelper() diff --git a/src/helpers/template-helper.js b/src/helpers/template-helper.js index 543297a59..9ecdcf9d8 100755 --- a/src/helpers/template-helper.js +++ b/src/helpers/template-helper.js @@ -1,190 +1,188 @@ -/* - * Software Name : eclipse-iofog/Controller - * Version: 2.0.x - * SPDX-FileCopyrightText: Copyright (c) 2020-2020 Orange - * SPDX-License-Identifier: EPL-2.0 - * - * This software is distributed under the , - * the text of which is available at http://www.eclipse.org/legal/epl-2.0 - * or see the "license.txt" file for more details. - * - * Author: Franck Roudet - */ - -const ApplicationManager = require('../data/managers/application-manager.js') // Using manager instead of service to avoid dependency loop -const FogService = require('../services/iofog-service') -const MicroservicesService = require('../services/microservices-service') -const EdgeResourceService = require('../services/edge-resource-service') - -// ninja2 like template engine -const { Liquid } = require('../lib/liquidjs/liquid.node.cjs') -const templateEngine = new Liquid() - -/** - * Add filter findAgent to template engine. - * Syntaxe {{ microservice | findMicroserviceAgent }} - */ - -function findMicroserviceAgentHandler (microservice) { - const user = this.context.environments._user - if (!user) { - return undefined - } - const result = FogService.getFogEndPoint({ uuid: microservice.iofogUuid }, user, false) - return result -} - -async function findEdgeResourcehandler (name, version) { - const key = `${name}/${version}` - const user = this.context.environments._user - if (!user) { - return undefined - } - if (this.context.environments._edgeResourcesByName && this.context.environments._edgeResourcesByName[key]) { - return this.context.environments._edgeResourcesByName[key] - } - const result = await EdgeResourceService.getEdgeResource({ name, version }, user) - - if (result && this.context.environments._edgeResourcesByName) { - this.context.environments._edgeResourcesByName[key] = result - } - return result -} - -async function findApplicationHandler (name) { - const user = this.context.environments._user - if (!user) { - return undefined - } - if (this.context.environments._applicationsByName && this.context.environments._applicationsByName[name]) { - return this.context.environments._applicationsByName[name] - } - - const result = await ApplicationManager.findOnePopulated({ exclude: ['created_at', 'updated_at'] }, { fakeTransaction: true }) // TODO: Get a proper DB transaction - if (result) { - result.microservices = (await MicroservicesService.listMicroservicesEndPoint({ applicationName: name }, user, false)).microservices - if (this.context.environments._applicationsByName) { - this.context.environments._applicationsByName[name] = result - } - } - return result -} - -async function findAgentHandler (name) { - const user = this.context.environments._user - if (!user) { - return undefined - } - if (name === '') { - const { fogs: result } = await FogService.getFogListEndPoint([], user, false, false) - if (result && this.context.environments._agentsByName) { - result.forEach(agent => { - this.context.environments._agentsByName[agent.name] = agent - }) - } - return result - } - if (this.context.environments._agentsByName && this.context.environments._agentsByName[name]) { - return this.context.environments._agentsByName[name] - } - const result = await FogService.getFogEndPoint({ name }, user, false) - if (result && this.context.environments._agentsByName) { - this.context.environments._agentsByName[result.name] = result - } - return result -} - -async function JSONParser (variable) { - try { - console.log({ variable }) - return JSON.parse(variable) - } catch (e) { - return variable - } -} - -function toStringParser (variable) { - try { - if (typeof variable === 'string') { - return variable - } - if (variable.toString) { - return variable.toString() - } - return JSON.stringify(variable) - } catch (e) { - return variable - } -} -/** - * Add filter findEdgeRessource to template engine. - * user is in liquid context _user - * Syntaxe {{ name findEdgeRessource: version }} - */ -templateEngine.registerFilter('findEdgeResource', findEdgeResourcehandler) -templateEngine.registerFilter('findApplication', findApplicationHandler) -templateEngine.registerFilter('findAgent', findAgentHandler) -templateEngine.registerFilter('findMicroserviceAgent', findMicroserviceAgentHandler) -templateEngine.registerFilter('toNumber', JSONParser) -templateEngine.registerFilter('toBoolean', JSONParser) -templateEngine.registerFilter('toString', toStringParser) - -/** - * Object in depth traversal and right value templateEngine rendering - * @param {*} subjects - * @param {*} templateContext - */ -const rvaluesVarSubstition = async (subjects, templateContext, user) => { - let context = templateContext - // Due to the recursive nature of this function, user will only be defined on the first iteration - if (user) { - context = { - ...templateContext, - // Private context - _user: user // need by edge resource and every on demand request - } - } - - // Create local cache for filters if they do not exists - context._agentsByName = context._agentsByName || {} - context._edgeResourcesByName = context._edgeResourcesByName || {} - context._applicationsByName = context._applicationsByName || {} - - for (let key in subjects) { - try { - if (typeof subjects[key] === 'object') { - await rvaluesVarSubstition(subjects[key], context, null) - } else if (typeof subjects[key] === 'string') { - const result = await templateEngine.parseAndRender(subjects[key], context, { keepOutputType: true }) - subjects[key] = result - } - } catch (e) { - // Trace error in rendering - console.log({ e }) - subjects[key] = e.toString() - } - } - return subjects -} - -const substitutionMiddleware = async (req, res, next) => { - if (['POST', 'PUT', 'PATCH'].indexOf(req.method) > -1) { - let user - let tmplContext = { - self: req.body, - // Private context - _user: user // need by edge resource and every on demand request - } - try { - await rvaluesVarSubstition(req.body, tmplContext, user) - } catch (e) { - next(e) - } - } - next() -} - -module.exports = { - rvaluesVarSubstition, - substitutionMiddleware -} +/* + * Software Name : eclipse-iofog/Controller + * Version: 2.0.x + * SPDX-FileCopyrightText: Copyright (c) 2020-2020 Orange + * SPDX-License-Identifier: EPL-2.0 + * + * This software is distributed under the , + * the text of which is available at http://www.eclipse.org/legal/epl-2.0 + * or see the "license.txt" file for more details. + * + * Author: Franck Roudet + */ + +const ApplicationManager = require('../data/managers/application-manager.js') // Using manager instead of service to avoid dependency loop +const FogService = require('../services/iofog-service') +const MicroservicesService = require('../services/microservices-service') +const EdgeResourceService = require('../services/edge-resource-service') + +// ninja2 like template engine +const { Liquid } = require('../lib/liquidjs/liquid.node.cjs') +const templateEngine = new Liquid() + +/** + * Add filter findAgent to template engine. + * Syntaxe {{ microservice | findMicroserviceAgent }} + */ + +function findMicroserviceAgentHandler (microservice) { + // const user = this.context.environments._user + // if (!user) { + // return undefined + // } + const result = FogService.getFogEndPoint({ uuid: microservice.iofogUuid }, false) + return result +} + +async function findEdgeResourcehandler (name, version) { + const key = `${name}/${version}` + // const user = this.context.environments._user + // if (!user) { + // return undefined + // } + if (this.context.environments._edgeResourcesByName && this.context.environments._edgeResourcesByName[key]) { + return this.context.environments._edgeResourcesByName[key] + } + const result = await EdgeResourceService.getEdgeResource({ name, version }) + + if (result && this.context.environments._edgeResourcesByName) { + this.context.environments._edgeResourcesByName[key] = result + } + return result +} + +async function findApplicationHandler (name) { + // const user = this.context.environments._user + // if (!user) { + // return undefined + // } + if (this.context.environments._applicationsByName && this.context.environments._applicationsByName[name]) { + return this.context.environments._applicationsByName[name] + } + + const result = await ApplicationManager.findOnePopulated({ exclude: ['created_at', 'updated_at'] }, { fakeTransaction: true }) // TODO: Get a proper DB transaction + if (result) { + result.microservices = (await MicroservicesService.listMicroservicesEndPoint({ applicationName: name }, false)).microservices + if (this.context.environments._applicationsByName) { + this.context.environments._applicationsByName[name] = result + } + } + return result +} + +async function findAgentHandler (name) { + // const user = this.context.environments._user + // if (!user) { + // return undefined + // } + if (name === '') { + const { fogs: result } = await FogService.getFogListEndPoint([], false, false) + if (result && this.context.environments._agentsByName) { + result.forEach(agent => { + this.context.environments._agentsByName[agent.name] = agent + }) + } + return result + } + if (this.context.environments._agentsByName && this.context.environments._agentsByName[name]) { + return this.context.environments._agentsByName[name] + } + const result = await FogService.getFogEndPoint({ name }, false) + if (result && this.context.environments._agentsByName) { + this.context.environments._agentsByName[result.name] = result + } + return result +} + +async function JSONParser (variable) { + try { + console.log({ variable }) + return JSON.parse(variable) + } catch (e) { + return variable + } +} + +function toStringParser (variable) { + try { + if (typeof variable === 'string') { + return variable + } + if (variable.toString) { + return variable.toString() + } + return JSON.stringify(variable) + } catch (e) { + return variable + } +} +/** + * Add filter findEdgeRessource to template engine. + * user is in liquid context _user + * Syntaxe {{ name findEdgeRessource: version }} + */ +templateEngine.registerFilter('findEdgeResource', findEdgeResourcehandler) +templateEngine.registerFilter('findApplication', findApplicationHandler) +templateEngine.registerFilter('findAgent', findAgentHandler) +templateEngine.registerFilter('findMicroserviceAgent', findMicroserviceAgentHandler) +templateEngine.registerFilter('toNumber', JSONParser) +templateEngine.registerFilter('toBoolean', JSONParser) +templateEngine.registerFilter('toString', toStringParser) + +/** + * Object in depth traversal and right value templateEngine rendering + * @param {*} subjects + * @param {*} templateContext + */ +const rvaluesVarSubstition = async (subjects, templateContext) => { + let context = templateContext + // Due to the recursive nature of this function, user will only be defined on the first iteration + context = { + ...templateContext, + // Private context + // _user: user // need by edge resource and every on demand request + } + + // Create local cache for filters if they do not exists + context._agentsByName = context._agentsByName || {} + context._edgeResourcesByName = context._edgeResourcesByName || {} + context._applicationsByName = context._applicationsByName || {} + + for (let key in subjects) { + try { + if (typeof subjects[key] === 'object') { + await rvaluesVarSubstition(subjects[key], context, null) + } else if (typeof subjects[key] === 'string') { + const result = await templateEngine.parseAndRender(subjects[key], context, { keepOutputType: true }) + subjects[key] = result + } + } catch (e) { + // Trace error in rendering + console.log({ e }) + subjects[key] = e.toString() + } + } + return subjects +} + +const substitutionMiddleware = async (req, res, next) => { + if (['POST', 'PUT', 'PATCH'].indexOf(req.method) > -1) { + // let user + let tmplContext = { + self: req.body, + // Private context + // _user: user // need by edge resource and every on demand request + } + try { + await rvaluesVarSubstition(req.body, tmplContext) + } catch (e) { + next(e) + } + } + next() +} + +module.exports = { + rvaluesVarSubstition, + substitutionMiddleware +} diff --git a/src/logger/index.js b/src/logger/index.js index d855e847e..db7461a89 100644 --- a/src/logger/index.js +++ b/src/logger/index.js @@ -89,6 +89,7 @@ const defaultFormat = { let result = {} if (log.req) { + // Create base request info result = Object.assign( result, serializer.req(log.req), @@ -99,10 +100,46 @@ const defaultFormat = { username: log.req.kauth && log.req.kauth.grant && log.req.kauth.grant.access_token && log.req.kauth.grant.access_token.content && log.req.kauth.grant.access_token.content.preferred_username } ) + // Filter request headers + if (result.headers) { + const allowedHeaders = ['content-type', 'content-length', 'user-agent'] + const filteredHeaders = {} + for (const header of allowedHeaders) { + if (result.headers[header]) { + filteredHeaders[header] = result.headers[header] + } + } + result.headers = filteredHeaders + } } if (log.res) { - result = Object.assign(result, serializer.res(log.res)) + // Get serialized response + const serializedRes = serializer.res(log.res) + // Find status code + let statusCode = null + if (log.statusCode !== undefined) { + statusCode = log.statusCode + } else if (log.res.statusCode !== undefined) { + statusCode = log.res.statusCode + } else if (serializedRes.statusCode !== undefined) { + statusCode = serializedRes.statusCode + } + // Filter response headers + if (serializedRes.headers) { + const allowedHeaders = ['content-type', 'content-length', 'x-timestamp', 'etag'] + const filteredHeaders = {} + for (const header of allowedHeaders) { + if (serializedRes.headers[header]) { + filteredHeaders[header] = serializedRes.headers[header] + } + } + serializedRes.headers = filteredHeaders + } + // Add filtered response to result + result = Object.assign(result, serializedRes, { statusCode }) + // Remove body for privacy + delete result.body } return result diff --git a/src/routes/agent.js b/src/routes/agent.js index e2e86e273..f43836fbe 100644 --- a/src/routes/agent.js +++ b/src/routes/agent.js @@ -48,7 +48,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, res: responseObject }) + logger.apiRes({ req: req, res: res, responseObject: responseObject }) } }, { @@ -77,7 +77,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, res: responseObject }) + logger.apiRes({ req: req, res: res, responseObject: responseObject }) } }, { @@ -101,7 +101,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, res: responseObject }) + logger.apiRes({ req: req, res: res, responseObject: responseObject }) } }, { @@ -130,7 +130,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, res: responseObject }) + logger.apiRes({ req: req, res: res, responseObject: responseObject }) } }, { @@ -159,7 +159,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, res: responseObject }) + logger.apiRes({ req: req, res: res, responseObject: responseObject }) } }, { @@ -188,7 +188,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, res: responseObject }) + logger.apiRes({ req: req, res: res, responseObject: responseObject }) } }, { @@ -217,7 +217,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, res: responseObject }) + logger.apiRes({ req: req, res: res, responseObject: responseObject }) } }, { @@ -242,7 +242,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, res: responseObject }) + logger.apiRes({ req: req, res: res, responseObject: responseObject }) } }, { @@ -267,7 +267,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, res: responseObject }) + logger.apiRes({ req: req, res: res, responseObject: responseObject }) } }, { @@ -296,7 +296,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, res: responseObject }) + logger.apiRes({ req: req, res: res, responseObject: responseObject }) } }, { @@ -321,7 +321,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, res: responseObject }) + logger.apiRes({ req: req, res: res, responseObject: responseObject }) } }, { @@ -350,7 +350,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, res: responseObject }) + logger.apiRes({ req: req, res: res, responseObject: responseObject }) } }, { @@ -379,7 +379,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, res: responseObject }) + logger.apiRes({ req: req, res: res, responseObject: responseObject }) } }, { @@ -412,7 +412,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, res: responseObject }) + logger.apiRes({ req: req, res: res, responseObject: responseObject }) } }, { @@ -441,7 +441,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, res: responseObject }) + logger.apiRes({ req: req, res: res, responseObject: responseObject }) } }, { @@ -470,7 +470,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, res: responseObject }) + logger.apiRes({ req: req, res: res, responseObject: responseObject }) } }, { @@ -499,7 +499,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, res: responseObject }) + logger.apiRes({ req: req, res: res, responseObject: responseObject }) } }, { @@ -524,7 +524,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, res: responseObject }) + logger.apiRes({ req: req, res: res, responseObject: responseObject }) } }, { @@ -553,7 +553,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, res: responseObject }) + logger.apiRes({ req: req, res: res, responseObject: responseObject }) } }, { @@ -582,7 +582,36 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, res: responseObject }) + logger.apiRes({ req: req, res: res, responseObject: responseObject }) + } + }, + { + method: 'get', + path: '/api/v3/agent/cert', + middleware: async (req, res) => { + logger.apiReq(req) + + const successCode = constants.HTTP_CODE_SUCCESS + const errorCodes = [ + { + code: constants.HTTP_CODE_UNAUTHORIZED, + errors: [Errors.AuthenticationError] + }, + { + code: constants.HTTP_CODE_NOT_FOUND, + errors: [Errors.NotFoundError] + } + ] + + const getControllerCAEndPoint = ResponseDecorator.handleErrors(AgentController.getControllerCAEndPoint, + successCode, errorCodes) + const responseObject = await getControllerCAEndPoint(req) + + res + .status(responseObject.code) + .send(responseObject.body) + + logger.apiRes({ req: req, res: res, responseObject: responseObject }) } } ] diff --git a/src/routes/application.js b/src/routes/application.js index 5185cbfbc..0a6e6f60c 100644 --- a/src/routes/application.js +++ b/src/routes/application.js @@ -42,7 +42,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, user: user, res: responseObject }) + logger.apiRes({ req: req, user: user, res: res, responseObject: responseObject }) }) } }, @@ -70,7 +70,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, user: user, res: responseObject }) + logger.apiRes({ req: req, user: user, res: res, responseObject: responseObject }) }) } }, @@ -103,7 +103,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, user: user, res: responseObject }) + logger.apiRes({ req: req, user: user, res: res, responseObject: responseObject }) }) } }, @@ -136,7 +136,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, user: user, res: responseObject }) + logger.apiRes({ req: req, user: user, res: res, responseObject: responseObject }) }) } }, @@ -168,7 +168,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, user: user, res: responseObject }) + logger.apiRes({ req: req, user: user, res: res, responseObject: responseObject }) return null }) } @@ -206,7 +206,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, user: user, res: responseObject }) + logger.apiRes({ req: req, user: user, res: res, responseObject: responseObject }) }) } }, @@ -243,7 +243,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, user: user, res: responseObject }) + logger.apiRes({ req: req, user: user, res: res, responseObject: responseObject }) }) } }, @@ -280,7 +280,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, user: user, res: responseObject }) + logger.apiRes({ req: req, user: user, res: res, responseObject: responseObject }) }) } }, @@ -312,7 +312,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, user: user, res: responseObject }) + logger.apiRes({ req: req, user: user, res: res, responseObject: responseObject }) }) } }, @@ -344,7 +344,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, user: user, res: responseObject }) + logger.apiRes({ req: req, user: user, res: res, responseObject: responseObject }) }) } } diff --git a/src/routes/applicationTemplate.js b/src/routes/applicationTemplate.js index ff36626b2..f0bae7b23 100644 --- a/src/routes/applicationTemplate.js +++ b/src/routes/applicationTemplate.js @@ -42,7 +42,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, user: user, res: responseObject }) + logger.apiRes({ req: req, user: user, res: res, responseObject: responseObject }) }) } }, @@ -74,7 +74,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, user: user, res: responseObject }) + logger.apiRes({ req: req, user: user, res: res, responseObject: responseObject }) }) } }, @@ -107,7 +107,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, user: user, res: responseObject }) + logger.apiRes({ req: req, user: user, res: res, responseObject: responseObject }) }) } }, @@ -139,7 +139,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, user: user, res: responseObject }) + logger.apiRes({ req: req, user: user, res: res, responseObject: responseObject }) }) } }, @@ -175,7 +175,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, user: user, res: responseObject }) + logger.apiRes({ req: req, user: user, res: res, responseObject: responseObject }) }) } }, @@ -212,7 +212,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, user: user, res: responseObject }) + logger.apiRes({ req: req, user: user, res: res, responseObject: responseObject }) }) } }, @@ -248,7 +248,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, user: user, res: responseObject }) + logger.apiRes({ req: req, user: user, res: res, responseObject: responseObject }) }) } }, @@ -280,7 +280,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, user: user, res: responseObject }) + logger.apiRes({ req: req, user: user, res: res, responseObject: responseObject }) }) } } diff --git a/src/routes/catalog.js b/src/routes/catalog.js index 80134e44c..66580b17a 100644 --- a/src/routes/catalog.js +++ b/src/routes/catalog.js @@ -46,7 +46,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, user: user, res: responseObject }) + logger.apiRes({ req: req, user: user, res: res, responseObject: responseObject }) }) } }, @@ -87,7 +87,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req, user: user, res: responseObject }) + logger.apiRes({ req, user: user, res: res, responseObject: responseObject }) }) } }, @@ -123,7 +123,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req, user: user, res: responseObject }) + logger.apiRes({ req, user: user, res: res, responseObject: responseObject }) }) } }, @@ -168,7 +168,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req, user: user, res: responseObject }) + logger.apiRes({ req, user: user, res: res, responseObject: responseObject }) }) } }, @@ -204,7 +204,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req, user: user, res: responseObject }) + logger.apiRes({ req, user: user, res: res, responseObject: responseObject }) }) } } diff --git a/src/routes/certificate.js b/src/routes/certificate.js new file mode 100644 index 000000000..2f30cfbcd --- /dev/null +++ b/src/routes/certificate.js @@ -0,0 +1,356 @@ +const constants = require('../helpers/constants') +const CertificateController = require('../controllers/certificate-controller') +const ResponseDecorator = require('../decorators/response-decorator') +const logger = require('../logger') +const Errors = require('../helpers/errors') +const keycloak = require('../config/keycloak.js').initKeycloak() + +module.exports = [ + { + method: 'post', + path: '/api/v3/certificates/ca', + middleware: async (req, res) => { + logger.apiReq(req) + + const successCode = constants.HTTP_CODE_CREATED + const errorCodes = [ + { + code: constants.HTTP_CODE_UNAUTHORIZED, + errors: [Errors.AuthenticationError] + }, + { + code: constants.HTTP_CODE_BAD_REQUEST, + errors: [Errors.ValidationError] + }, + { + code: constants.HTTP_CODE_CONFLICT, + errors: [Errors.ConflictError] + } + ] + + await keycloak.protect(['SRE', 'Developer'])(req, res, async () => { + const createCAEndpoint = ResponseDecorator.handleErrors(CertificateController.createCAEndpoint, successCode, errorCodes) + const responseObject = await createCAEndpoint(req) + const user = req.kauth.grant.access_token.content.preferred_username + res + .status(responseObject.code) + .send(responseObject.body) + + logger.apiRes({ req: req, user: user, res: res, responseObject: responseObject }) + }) + } + }, + { + method: 'get', + path: '/api/v3/certificates/ca/:name', + middleware: async (req, res) => { + logger.apiReq(req) + + const successCode = constants.HTTP_CODE_SUCCESS + const errorCodes = [ + { + code: constants.HTTP_CODE_UNAUTHORIZED, + errors: [Errors.AuthenticationError] + }, + { + code: constants.HTTP_CODE_NOT_FOUND, + errors: [Errors.NotFoundError] + } + ] + + await keycloak.protect(['SRE', 'Developer', 'Viewer'])(req, res, async () => { + const getCAEndpoint = ResponseDecorator.handleErrors(CertificateController.getCAEndpoint, successCode, errorCodes) + const responseObject = await getCAEndpoint(req) + const user = req.kauth.grant.access_token.content.preferred_username + res + .status(responseObject.code) + .send(responseObject.body) + + logger.apiRes({ req: req, user: user, res: res, responseObject: responseObject }) + }) + } + }, + { + method: 'get', + path: '/api/v3/certificates/ca', + middleware: async (req, res) => { + logger.apiReq(req) + + const successCode = constants.HTTP_CODE_SUCCESS + const errorCodes = [ + { + code: constants.HTTP_CODE_UNAUTHORIZED, + errors: [Errors.AuthenticationError] + } + ] + + await keycloak.protect(['SRE', 'Developer', 'Viewer'])(req, res, async () => { + const listCAEndpoint = ResponseDecorator.handleErrors(CertificateController.listCAEndpoint, successCode, errorCodes) + const responseObject = await listCAEndpoint(req) + const user = req.kauth.grant.access_token.content.preferred_username + res + .status(responseObject.code) + .send(responseObject.body) + + logger.apiRes({ req: req, user: user, res: res, responseObject: responseObject }) + }) + } + }, + { + method: 'delete', + path: '/api/v3/certificates/ca/:name', + middleware: async (req, res) => { + logger.apiReq(req) + + const successCode = constants.HTTP_CODE_SUCCESS + const errorCodes = [ + { + code: constants.HTTP_CODE_UNAUTHORIZED, + errors: [Errors.AuthenticationError] + }, + { + code: constants.HTTP_CODE_NOT_FOUND, + errors: [Errors.NotFoundError] + } + ] + + await keycloak.protect(['SRE', 'Developer'])(req, res, async () => { + const deleteCAEndpoint = ResponseDecorator.handleErrors(CertificateController.deleteCAEndpoint, successCode, errorCodes) + const responseObject = await deleteCAEndpoint(req) + const user = req.kauth.grant.access_token.content.preferred_username + res + .status(responseObject.code) + .send(responseObject.body) + + logger.apiRes({ req: req, user: user, res: res, responseObject: responseObject }) + }) + } + }, + { + method: 'post', + path: '/api/v3/certificates', + middleware: async (req, res) => { + logger.apiReq(req) + + const successCode = constants.HTTP_CODE_CREATED + const errorCodes = [ + { + code: constants.HTTP_CODE_UNAUTHORIZED, + errors: [Errors.AuthenticationError] + }, + { + code: constants.HTTP_CODE_BAD_REQUEST, + errors: [Errors.ValidationError] + }, + { + code: constants.HTTP_CODE_CONFLICT, + errors: [Errors.ConflictError] + }, + { + code: constants.HTTP_CODE_NOT_FOUND, + errors: [Errors.NotFoundError] + } + ] + + await keycloak.protect(['SRE', 'Developer'])(req, res, async () => { + const createCertificateEndpoint = ResponseDecorator.handleErrors(CertificateController.createCertificateEndpoint, successCode, errorCodes) + const responseObject = await createCertificateEndpoint(req) + const user = req.kauth.grant.access_token.content.preferred_username + res + .status(responseObject.code) + .send(responseObject.body) + + logger.apiRes({ req: req, user: user, res: res, responseObject: responseObject }) + }) + } + }, + { + method: 'get', + path: '/api/v3/certificates/expiring', + middleware: async (req, res) => { + logger.apiReq(req) + + const successCode = constants.HTTP_CODE_SUCCESS + const errorCodes = [ + { + code: constants.HTTP_CODE_UNAUTHORIZED, + errors: [Errors.AuthenticationError] + }, + { + code: constants.HTTP_CODE_BAD_REQUEST, + errors: [Errors.ValidationError] + } + ] + + await keycloak.protect(['SRE', 'Developer', 'Viewer'])(req, res, async () => { + const listExpiringCertificatesEndpoint = ResponseDecorator.handleErrors(CertificateController.listExpiringCertificatesEndpoint, successCode, errorCodes) + const responseObject = await listExpiringCertificatesEndpoint(req) + const user = req.kauth.grant.access_token.content.preferred_username + res + .status(responseObject.code) + .send(responseObject.body) + + logger.apiRes({ req: req, user: user, res: res, responseObject: responseObject }) + }) + } + }, + { + method: 'get', + path: '/api/v3/certificates/:name', + middleware: async (req, res) => { + logger.apiReq(req) + + const successCode = constants.HTTP_CODE_SUCCESS + const errorCodes = [ + { + code: constants.HTTP_CODE_UNAUTHORIZED, + errors: [Errors.AuthenticationError] + }, + { + code: constants.HTTP_CODE_NOT_FOUND, + errors: [Errors.NotFoundError] + } + ] + + await keycloak.protect(['SRE', 'Developer', 'Viewer'])(req, res, async () => { + const getCertificateEndpoint = ResponseDecorator.handleErrors(CertificateController.getCertificateEndpoint, successCode, errorCodes) + const responseObject = await getCertificateEndpoint(req) + const user = req.kauth.grant.access_token.content.preferred_username + res + .status(responseObject.code) + .send(responseObject.body) + + logger.apiRes({ req: req, user: user, res: res, responseObject: responseObject }) + }) + } + }, + { + method: 'get', + path: '/api/v3/certificates', + middleware: async (req, res) => { + logger.apiReq(req) + + const successCode = constants.HTTP_CODE_SUCCESS + const errorCodes = [ + { + code: constants.HTTP_CODE_UNAUTHORIZED, + errors: [Errors.AuthenticationError] + } + ] + + await keycloak.protect(['SRE', 'Developer', 'Viewer'])(req, res, async () => { + const listCertificatesEndpoint = ResponseDecorator.handleErrors(CertificateController.listCertificatesEndpoint, successCode, errorCodes) + const responseObject = await listCertificatesEndpoint(req) + const user = req.kauth.grant.access_token.content.preferred_username + res + .status(responseObject.code) + .send(responseObject.body) + + logger.apiRes({ req: req, user: user, res: res, responseObject: responseObject }) + }) + } + }, + { + method: 'delete', + path: '/api/v3/certificates/:name', + middleware: async (req, res) => { + logger.apiReq(req) + + const successCode = constants.HTTP_CODE_SUCCESS + const errorCodes = [ + { + code: constants.HTTP_CODE_UNAUTHORIZED, + errors: [Errors.AuthenticationError] + }, + { + code: constants.HTTP_CODE_NOT_FOUND, + errors: [Errors.NotFoundError] + } + ] + + await keycloak.protect(['SRE', 'Developer'])(req, res, async () => { + const deleteCertificateEndpoint = ResponseDecorator.handleErrors(CertificateController.deleteCertificateEndpoint, successCode, errorCodes) + const responseObject = await deleteCertificateEndpoint(req) + const user = req.kauth.grant.access_token.content.preferred_username + res + .status(responseObject.code) + .send(responseObject.body) + + logger.apiRes({ req: req, user: user, res: res, responseObject: responseObject }) + }) + } + }, + { + method: 'post', + path: '/api/v3/certificates/:name/renew', + middleware: async (req, res) => { + logger.apiReq(req) + + const successCode = constants.HTTP_CODE_SUCCESS + const errorCodes = [ + { + code: constants.HTTP_CODE_UNAUTHORIZED, + errors: [Errors.AuthenticationError] + }, + { + code: constants.HTTP_CODE_NOT_FOUND, + errors: [Errors.NotFoundError] + }, + { + code: constants.HTTP_CODE_BAD_REQUEST, + errors: [Errors.ValidationError] + } + ] + + await keycloak.protect(['SRE', 'Developer'])(req, res, async () => { + const renewCertificateEndpoint = ResponseDecorator.handleErrors(CertificateController.renewCertificateEndpoint, successCode, errorCodes) + const responseObject = await renewCertificateEndpoint(req) + const user = req.kauth.grant.access_token.content.preferred_username + res + .status(responseObject.code) + .send(responseObject.body) + + logger.apiRes({ req: req, user: user, res: res, responseObject: responseObject }) + }) + } + }, + { + method: 'post', + path: '/api/v3/certificates/yaml', + fileInput: 'certificate', + middleware: async (req, res) => { + logger.apiReq(req) + + const successCode = constants.HTTP_CODE_CREATED + const errorCodes = [ + { + code: constants.HTTP_CODE_UNAUTHORIZED, + errors: [Errors.AuthenticationError] + }, + { + code: constants.HTTP_CODE_BAD_REQUEST, + errors: [Errors.ValidationError] + }, + { + code: constants.HTTP_CODE_CONFLICT, + errors: [Errors.ConflictError] + }, + { + code: constants.HTTP_CODE_NOT_FOUND, + errors: [Errors.NotFoundError] + } + ] + + await keycloak.protect(['SRE', 'Developer'])(req, res, async () => { + const createCertificateFromYamlEndpoint = ResponseDecorator.handleErrors(CertificateController.createCertificateFromYamlEndpoint, successCode, errorCodes) + const responseObject = await createCertificateFromYamlEndpoint(req) + const user = req.kauth.grant.access_token.content.preferred_username + res + .status(responseObject.code) + .send(responseObject.body) + + logger.apiRes({ req: req, user: user, res: res, responseObject: responseObject }) + }) + } + } +] diff --git a/src/routes/config.js b/src/routes/config.js index fba93b482..366d42f21 100644 --- a/src/routes/config.js +++ b/src/routes/config.js @@ -41,7 +41,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, user: user, res: responseObject }) + logger.apiRes({ req: req, user: user, res: res, responseObject: responseObject }) }) } }, @@ -72,7 +72,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, user: user, res: responseObject }) + logger.apiRes({ req: req, user: user, res: res, responseObject: responseObject }) }) } }, @@ -104,7 +104,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, user: user, res: responseObject }) + logger.apiRes({ req: req, user: user, res: res, responseObject: responseObject }) }) } } diff --git a/src/routes/controller.js b/src/routes/controller.js index 3c41255ba..36e9fb8f7 100644 --- a/src/routes/controller.js +++ b/src/routes/controller.js @@ -31,7 +31,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, res: responseObject }) + logger.apiRes({ req: req, res: res, responseObject: responseObject }) } }, { @@ -49,7 +49,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, res: responseObject }) + logger.apiRes({ req: req, res: res, responseObject: responseObject }) } } ] diff --git a/src/routes/diagnostics.js b/src/routes/diagnostics.js index 5c9270a06..49e83a33e 100644 --- a/src/routes/diagnostics.js +++ b/src/routes/diagnostics.js @@ -50,7 +50,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, user: user, res: responseObject }) + logger.apiRes({ req: req, user: user, res: res, responseObject: responseObject }) }) } }, @@ -86,7 +86,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, user: user, res: responseObject }) + logger.apiRes({ req: req, user: user, res: res, responseObject: responseObject }) } else { res.writeHead(successCode, { 'Content-Length': responseObject.body['Content-Length'], @@ -133,7 +133,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, user: user, res: responseObject }) + logger.apiRes({ req: req, user: user, res: res, responseObject: responseObject }) }) } }, @@ -168,7 +168,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, user: user, res: responseObject }) + logger.apiRes({ req: req, user: user, res: res, responseObject: responseObject }) }) } }, @@ -211,7 +211,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, user: user, res: responseObject }) + logger.apiRes({ req: req, user: user, res: res, responseObject: responseObject }) }) } } diff --git a/src/routes/edgeResource.js b/src/routes/edgeResource.js index 55558160c..0f55c3e38 100644 --- a/src/routes/edgeResource.js +++ b/src/routes/edgeResource.js @@ -41,7 +41,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, user: user, res: responseObject }) + logger.apiRes({ req: req, user: user, res: res, responseObject: responseObject }) }) } }, @@ -72,7 +72,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, user: user, res: responseObject }) + logger.apiRes({ req: req, user: user, res: res, responseObject: responseObject }) }) } }, @@ -103,7 +103,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, user: user, res: responseObject }) + logger.apiRes({ req: req, user: user, res: res, responseObject: responseObject }) }) } }, @@ -139,7 +139,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, user: user, res: responseObject }) + logger.apiRes({ req: req, user: user, res: res, responseObject: responseObject }) }) } }, @@ -174,7 +174,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, user: user, res: responseObject }) + logger.apiRes({ req: req, user: user, res: res, responseObject: responseObject }) }) } }, @@ -206,7 +206,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, user: user, res: responseObject }) + logger.apiRes({ req: req, user: user, res: res, responseObject: responseObject }) }) } }, @@ -237,7 +237,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, user: user, res: responseObject }) + logger.apiRes({ req: req, user: user, res: res, responseObject: responseObject }) }) } }, @@ -268,7 +268,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, user: user, res: responseObject }) + logger.apiRes({ req: req, user: user, res: res, responseObject: responseObject }) }) } } diff --git a/src/routes/flow.js b/src/routes/flow.js index d3e922dda..e9397c047 100644 --- a/src/routes/flow.js +++ b/src/routes/flow.js @@ -41,7 +41,7 @@ module.exports = [ .status(responseObject.code) .send({ flows: responseObject.body.applications }) - logger.apiRes({ req: req, user: user, res: responseObject }) + logger.apiRes({ req: req, user: user, res: res, responseObject: responseObject }) }) } }, @@ -72,7 +72,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, user: user, res: responseObject }) + logger.apiRes({ req: req, user: user, res: res, responseObject: responseObject }) }) } }, @@ -103,7 +103,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, user: user, res: responseObject }) + logger.apiRes({ req: req, user: user, res: res, responseObject: responseObject }) }) } }, @@ -138,7 +138,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, user: user, res: responseObject }) + logger.apiRes({ req: req, user: user, res: res, responseObject: responseObject }) }) } }, @@ -169,7 +169,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, user: user, res: responseObject }) + logger.apiRes({ req: req, user: user, res: res, responseObject: responseObject }) }) } } diff --git a/src/routes/iofog.js b/src/routes/iofog.js index ab7f132a5..73ab91ac7 100644 --- a/src/routes/iofog.js +++ b/src/routes/iofog.js @@ -45,7 +45,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, user: user, res: responseObject }) + logger.apiRes({ req: req, user: user, res: res, responseObject: responseObject }) }) } }, @@ -77,7 +77,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, user: user, res: responseObject }) + logger.apiRes({ req: req, user: user, res: res, responseObject: responseObject }) }) } }, @@ -113,7 +113,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, user: user, res: responseObject }) + logger.apiRes({ req: req, user: user, res: res, responseObject: responseObject }) }) } }, @@ -144,7 +144,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, user: user, res: responseObject }) + logger.apiRes({ req: req, user: user, res: res, responseObject: responseObject }) }) } }, @@ -175,7 +175,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, user: user, res: responseObject }) + logger.apiRes({ req: req, user: user, res: res, responseObject: responseObject }) }) } }, @@ -206,7 +206,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, user: user, res: responseObject }) + logger.apiRes({ req: req, user: user, res: res, responseObject: responseObject }) }) } }, @@ -241,7 +241,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, user: user, res: responseObject }) + logger.apiRes({ req: req, user: user, res: res, responseObject: responseObject }) }) } }, @@ -276,7 +276,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, user: user, res: responseObject }) + logger.apiRes({ req: req, user: user, res: res, responseObject: responseObject }) }) } }, @@ -307,7 +307,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, user: user, res: responseObject }) + logger.apiRes({ req: req, user: user, res: res, responseObject: responseObject }) }) } }, @@ -337,7 +337,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, user: user, res: responseObject }) + logger.apiRes({ req: req, user: user, res: res, responseObject: responseObject }) }) } }, @@ -372,7 +372,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, user: user, res: responseObject }) + logger.apiRes({ req: req, user: user, res: res, responseObject: responseObject }) }) } } diff --git a/src/routes/microservices.js b/src/routes/microservices.js index a43a8cf4c..38bef8d60 100644 --- a/src/routes/microservices.js +++ b/src/routes/microservices.js @@ -44,7 +44,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, user: user, res: responseObject }) + logger.apiRes({ req: req, user: user, res: res, responseObject: responseObject }) }) } }, @@ -71,7 +71,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, user: user, res: responseObject }) + logger.apiRes({ req: req, user: user, res: res, responseObject: responseObject }) }) } }, @@ -103,7 +103,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, user: user, res: responseObject }) + logger.apiRes({ req: req, user: user, res: res, responseObject: responseObject }) }) } }, @@ -136,7 +136,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, user: user, res: responseObject }) + logger.apiRes({ req: req, user: user, res: res, responseObject: responseObject }) }) } }, @@ -167,7 +167,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, user: user, res: responseObject }) + logger.apiRes({ req: req, user: user, res: res, responseObject: responseObject }) }) } }, @@ -198,7 +198,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, user: user, res: responseObject }) + logger.apiRes({ req: req, user: user, res: res, responseObject: responseObject }) }) } }, @@ -229,7 +229,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, user: user, res: responseObject }) + logger.apiRes({ req: req, user: user, res: res, responseObject: responseObject }) }) } }, @@ -265,7 +265,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, user: user, res: responseObject }) + logger.apiRes({ req: req, user: user, res: res, responseObject: responseObject }) }) } }, @@ -301,7 +301,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, user: user, res: responseObject }) + logger.apiRes({ req: req, user: user, res: res, responseObject: responseObject }) }) } }, @@ -336,7 +336,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, user: user, res: responseObject }) + logger.apiRes({ req: req, user: user, res: res, responseObject: responseObject }) }) } }, @@ -371,7 +371,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, user: user, res: responseObject }) + logger.apiRes({ req: req, user: user, res: res, responseObject: responseObject }) }) } }, @@ -408,7 +408,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, user: user, res: responseObject }) + logger.apiRes({ req: req, user: user, res: res, responseObject: responseObject }) }) } }, @@ -439,7 +439,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, user: user, res: responseObject }) + logger.apiRes({ req: req, user: user, res: res, responseObject: responseObject }) }) } }, @@ -474,7 +474,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, user: user, res: responseObject }) + logger.apiRes({ req: req, user: user, res: res, responseObject: responseObject }) }) } }, @@ -509,7 +509,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, user: user, res: responseObject }) + logger.apiRes({ req: req, user: user, res: res, responseObject: responseObject }) }) } }, @@ -544,7 +544,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, user: user, res: responseObject }) + logger.apiRes({ req: req, user: user, res: res, responseObject: responseObject }) }) } }, @@ -579,7 +579,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, user: user, res: responseObject }) + logger.apiRes({ req: req, user: user, res: res, responseObject: responseObject }) }) } }, @@ -610,7 +610,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, user: user, res: responseObject }) + logger.apiRes({ req: req, user: user, res: res, responseObject: responseObject }) }) } }, @@ -641,7 +641,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, user: user, res: responseObject }) + logger.apiRes({ req: req, user: user, res: res, responseObject: responseObject }) }) } }, @@ -672,7 +672,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, user: user, res: responseObject }) + logger.apiRes({ req: req, user: user, res: res, responseObject: responseObject }) }) } }, @@ -706,7 +706,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, user: user, res: responseObject }) + logger.apiRes({ req: req, user: user, res: res, responseObject: responseObject }) }) } }, @@ -744,7 +744,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, user: user, res: responseObject }) + logger.apiRes({ req: req, user: user, res: res, responseObject: responseObject }) }) } }, @@ -782,7 +782,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, user: user, res: responseObject }) + logger.apiRes({ req: req, user: user, res: res, responseObject: responseObject }) }) } }, @@ -820,7 +820,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, user: user, res: responseObject }) + logger.apiRes({ req: req, user: user, res: res, responseObject: responseObject }) }) } }, @@ -858,7 +858,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, user: user, res: responseObject }) + logger.apiRes({ req: req, user: user, res: res, responseObject: responseObject }) }) } } diff --git a/src/routes/registries.js b/src/routes/registries.js index 5f80e3c60..e2d2f8d40 100644 --- a/src/routes/registries.js +++ b/src/routes/registries.js @@ -45,7 +45,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, user: user, res: responseObject }) + logger.apiRes({ req: req, user: user, res: res, responseObject: responseObject }) }) } }, @@ -75,7 +75,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, user: user, res: responseObject }) + logger.apiRes({ req: req, user: user, res: res, responseObject: responseObject }) }) } }, @@ -109,7 +109,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, user: user, res: responseObject }) + logger.apiRes({ req: req, user: user, res: res, responseObject: responseObject }) }) } }, @@ -145,7 +145,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, user: user, res: responseObject }) + logger.apiRes({ req: req, user: user, res: res, responseObject: responseObject }) }) } } diff --git a/src/routes/router.js b/src/routes/router.js index 12a64f9d2..cc13fbbde 100644 --- a/src/routes/router.js +++ b/src/routes/router.js @@ -49,7 +49,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, user: user, res: responseObject }) + logger.apiRes({ req: req, user: user, res: res, responseObject: responseObject }) }) } }, @@ -85,7 +85,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, user: user, res: responseObject }) + logger.apiRes({ req: req, user: user, res: res, responseObject: responseObject }) }) } } diff --git a/src/routes/routing.js b/src/routes/routing.js index 105e9add5..e44c9d2ab 100644 --- a/src/routes/routing.js +++ b/src/routes/routing.js @@ -49,7 +49,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, user: user, res: responseObject }) + logger.apiRes({ req: req, user: user, res: res, responseObject: responseObject }) }) } }, @@ -84,7 +84,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, user: user, res: responseObject }) + logger.apiRes({ req: req, user: user, res: res, responseObject: responseObject }) }) } }, @@ -128,7 +128,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, user: user, res: responseObject }) + logger.apiRes({ req: req, user: user, res: res, responseObject: responseObject }) }) } }, @@ -168,7 +168,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, user: user, res: responseObject }) + logger.apiRes({ req: req, user: user, res: res, responseObject: responseObject }) }) } }, @@ -203,7 +203,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, user: user, res: responseObject }) + logger.apiRes({ req: req, user: user, res: res, responseObject: responseObject }) }) } } diff --git a/src/routes/secret.js b/src/routes/secret.js new file mode 100644 index 000000000..54289adfa --- /dev/null +++ b/src/routes/secret.js @@ -0,0 +1,246 @@ +/* + * ******************************************************************************* + * * Copyright (c) 2023 Datasance Teknoloji A.S. + * * + * * This program and the accompanying materials are made available under the + * * terms of the Eclipse Public License v. 2.0 which is available at + * * http://www.eclipse.org/legal/epl-2.0 + * * + * * SPDX-License-Identifier: EPL-2.0 + * ******************************************************************************* + * + */ + +const constants = require('../helpers/constants') +const SecretController = require('../controllers/secret-controller') +const ResponseDecorator = require('../decorators/response-decorator') +const logger = require('../logger') +const Errors = require('../helpers/errors') +const keycloak = require('../config/keycloak.js').initKeycloak() + +module.exports = [ + { + method: 'post', + path: '/api/v3/secrets', + middleware: async (req, res) => { + logger.apiReq(req) + + const successCode = constants.HTTP_CODE_CREATED + const errorCodes = [ + { + code: constants.HTTP_CODE_UNAUTHORIZED, + errors: [Errors.AuthenticationError] + }, + { + code: constants.HTTP_CODE_BAD_REQUEST, + errors: [Errors.ValidationError] + }, + { + code: constants.HTTP_CODE_CONFLICT, + errors: [Errors.ConflictError] + } + ] + + await keycloak.protect(['SRE', 'Developer'])(req, res, async () => { + const createSecretEndpoint = ResponseDecorator.handleErrors(SecretController.createSecretEndpoint, successCode, errorCodes) + const responseObject = await createSecretEndpoint(req) + const user = req.kauth.grant.access_token.content.preferred_username + res + .status(responseObject.code) + .send(responseObject.body) + + logger.apiRes({ req: req, user: user, res: res, responseObject: responseObject }) + }) + } + }, + { + method: 'post', + path: '/api/v3/secrets/yaml', + fileInput: 'secret', + middleware: async (req, res) => { + logger.apiReq(req) + + const successCode = constants.HTTP_CODE_CREATED + const errorCodes = [ + { + code: constants.HTTP_CODE_UNAUTHORIZED, + errors: [Errors.AuthenticationError] + }, + { + code: constants.HTTP_CODE_BAD_REQUEST, + errors: [Errors.ValidationError] + }, + { + code: constants.HTTP_CODE_CONFLICT, + errors: [Errors.ConflictError] + } + ] + + await keycloak.protect(['SRE', 'Developer'])(req, res, async () => { + const createSecretFromYamlEndpoint = ResponseDecorator.handleErrors(SecretController.createSecretFromYamlEndpoint, successCode, errorCodes) + const responseObject = await createSecretFromYamlEndpoint(req) + const user = req.kauth.grant.access_token.content.preferred_username + res + .status(responseObject.code) + .send(responseObject.body) + + logger.apiRes({ req: req, user: user, res: res, responseObject: responseObject }) + }) + } + }, + { + method: 'put', + path: '/api/v3/secrets/:name', + middleware: async (req, res) => { + logger.apiReq(req) + + const successCode = constants.HTTP_CODE_SUCCESS + const errorCodes = [ + { + code: constants.HTTP_CODE_UNAUTHORIZED, + errors: [Errors.AuthenticationError] + }, + { + code: constants.HTTP_CODE_BAD_REQUEST, + errors: [Errors.ValidationError] + }, + { + code: constants.HTTP_CODE_NOT_FOUND, + errors: [Errors.NotFoundError] + } + ] + + await keycloak.protect(['SRE', 'Developer'])(req, res, async () => { + const updateSecretEndpoint = ResponseDecorator.handleErrors(SecretController.updateSecretEndpoint, successCode, errorCodes) + const responseObject = await updateSecretEndpoint(req) + const user = req.kauth.grant.access_token.content.preferred_username + res + .status(responseObject.code) + .send(responseObject.body) + + logger.apiRes({ req: req, user: user, res: res, responseObject: responseObject }) + }) + } + }, + { + method: 'put', + path: '/api/v3/secrets/yaml/:name', + fileInput: 'secret', + middleware: async (req, res) => { + logger.apiReq(req) + + const successCode = constants.HTTP_CODE_SUCCESS + const errorCodes = [ + { + code: constants.HTTP_CODE_UNAUTHORIZED, + errors: [Errors.AuthenticationError] + }, + { + code: constants.HTTP_CODE_BAD_REQUEST, + errors: [Errors.ValidationError] + }, + { + code: constants.HTTP_CODE_NOT_FOUND, + errors: [Errors.NotFoundError] + } + ] + + await keycloak.protect(['SRE', 'Developer'])(req, res, async () => { + const updateSecretFromYamlEndpoint = ResponseDecorator.handleErrors(SecretController.updateSecretFromYamlEndpoint, successCode, errorCodes) + const responseObject = await updateSecretFromYamlEndpoint(req) + const user = req.kauth.grant.access_token.content.preferred_username + res + .status(responseObject.code) + .send(responseObject.body) + + logger.apiRes({ req: req, user: user, res: res, responseObject: responseObject }) + }) + } + }, + { + method: 'get', + path: '/api/v3/secrets/:name', + middleware: async (req, res) => { + logger.apiReq(req) + + const successCode = constants.HTTP_CODE_SUCCESS + const errorCodes = [ + { + code: constants.HTTP_CODE_UNAUTHORIZED, + errors: [Errors.AuthenticationError] + }, + { + code: constants.HTTP_CODE_NOT_FOUND, + errors: [Errors.NotFoundError] + } + ] + + await keycloak.protect(['SRE', 'Developer', 'Viewer'])(req, res, async () => { + const getSecretEndpoint = ResponseDecorator.handleErrors(SecretController.getSecretEndpoint, successCode, errorCodes) + const responseObject = await getSecretEndpoint(req) + const user = req.kauth.grant.access_token.content.preferred_username + res + .status(responseObject.code) + .send(responseObject.body) + + logger.apiRes({ req: req, user: user, res: res, responseObject: responseObject }) + }) + } + }, + { + method: 'get', + path: '/api/v3/secrets', + middleware: async (req, res) => { + logger.apiReq(req) + + const successCode = constants.HTTP_CODE_SUCCESS + const errorCodes = [ + { + code: constants.HTTP_CODE_UNAUTHORIZED, + errors: [Errors.AuthenticationError] + } + ] + + await keycloak.protect(['SRE', 'Developer', 'Viewer'])(req, res, async () => { + const listSecretsEndpoint = ResponseDecorator.handleErrors(SecretController.listSecretsEndpoint, successCode, errorCodes) + const responseObject = await listSecretsEndpoint(req) + const user = req.kauth.grant.access_token.content.preferred_username + res + .status(responseObject.code) + .send(responseObject.body) + + logger.apiRes({ req: req, user: user, res: res, responseObject: responseObject }) + }) + } + }, + { + method: 'delete', + path: '/api/v3/secrets/:name', + middleware: async (req, res) => { + logger.apiReq(req) + + const successCode = constants.HTTP_CODE_SUCCESS + const errorCodes = [ + { + code: constants.HTTP_CODE_UNAUTHORIZED, + errors: [Errors.AuthenticationError] + }, + { + code: constants.HTTP_CODE_NOT_FOUND, + errors: [Errors.NotFoundError] + } + ] + + await keycloak.protect(['SRE', 'Developer'])(req, res, async () => { + const deleteSecretEndpoint = ResponseDecorator.handleErrors(SecretController.deleteSecretEndpoint, successCode, errorCodes) + const responseObject = await deleteSecretEndpoint(req) + const user = req.kauth.grant.access_token.content.preferred_username + res + .status(responseObject.code) + .send(responseObject.body) + + logger.apiRes({ req: req, user: user, res: res, responseObject: responseObject }) + }) + } + } +] diff --git a/src/routes/tunnel.js b/src/routes/tunnel.js index e3021a462..40c3b6223 100644 --- a/src/routes/tunnel.js +++ b/src/routes/tunnel.js @@ -53,7 +53,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, user: user, res: responseObject }) + logger.apiRes({ req: req, user: user, res: res, responseObject: responseObject }) }) } }, @@ -88,7 +88,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, user: user, res: responseObject }) + logger.apiRes({ req: req, user: user, res: res, responseObject: responseObject }) }) } } diff --git a/src/routes/user.js b/src/routes/user.js index 93eaa1f84..f900af895 100644 --- a/src/routes/user.js +++ b/src/routes/user.js @@ -100,7 +100,7 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, user: user, res: responseObject }) + logger.apiRes({ req: req, user: user, res: res, responseObject: responseObject }) } }, { diff --git a/src/schemas/certificate.js b/src/schemas/certificate.js new file mode 100644 index 000000000..28591cbdd --- /dev/null +++ b/src/schemas/certificate.js @@ -0,0 +1,144 @@ +const caCreate = { + id: '/caCreate', + type: 'object', + properties: { + name: { type: 'string', minLength: 1, maxLength: 255 }, + subject: { type: 'string', minLength: 1 }, + expiration: { type: 'integer', minimum: 0 }, + type: { + type: 'string', + enum: ['k8s-secret', 'direct', 'self-signed'] + }, + secretName: { type: 'string' } + }, + required: ['type'], + additionalProperties: false, + allOf: [ + { + if: { properties: { type: { const: 'self-signed' } } }, + then: { required: ['name', 'subject', 'expiration'] } + }, + { + if: { + properties: { + type: { + enum: ['k8s-secret', 'direct'] + } + } + }, + then: { required: ['secretName'] } + } + ] +} + +const certificateCreate = { + id: '/certificateCreate', + type: 'object', + properties: { + name: { type: 'string', minLength: 1, maxLength: 255 }, + subject: { type: 'string', minLength: 1 }, + hosts: { type: 'string', minLength: 1 }, + expiration: { type: 'integer', minimum: 0 }, + ca: { + type: 'object', + properties: { + type: { type: 'string', enum: ['k8s-secret', 'direct', 'self-signed'] }, + secretName: { type: 'string' }, + cert: { type: 'string' }, + key: { type: 'string' } + }, + required: ['type'] + } + }, + required: ['name', 'subject', 'hosts'], + additionalProperties: false +} + +const caResponse = { + id: '/caResponse', + type: 'object', + properties: { + name: { type: 'string' }, + subject: { type: 'string' }, + type: { type: 'string' }, + created_at: { type: 'string', format: 'date-time' }, + updated_at: { type: 'string', format: 'date-time' } + }, + required: ['name', 'subject', 'type', 'created_at', 'updated_at'], + additionalProperties: false +} + +const certificateResponse = { + id: '/certificateResponse', + type: 'object', + properties: { + name: { type: 'string' }, + subject: { type: 'string' }, + hosts: { type: 'string' }, + created_at: { type: 'string', format: 'date-time' }, + updated_at: { type: 'string', format: 'date-time' } + }, + required: ['name', 'subject', 'hosts', 'created_at', 'updated_at'], + additionalProperties: false +} + +const caListResponse = { + id: '/caListResponse', + type: 'object', + properties: { + cas: { + type: 'array', + items: { + type: 'object', + properties: { + name: { type: 'string' }, + subject: { type: 'string' }, + type: { type: 'string' }, + created_at: { type: 'string', format: 'date-time' }, + updated_at: { type: 'string', format: 'date-time' } + }, + required: ['name', 'subject', 'type', 'created_at', 'updated_at'], + additionalProperties: false + } + } + }, + required: ['cas'], + additionalProperties: false +} + +const certificateListResponse = { + id: '/certificateListResponse', + type: 'object', + properties: { + certificates: { + type: 'array', + items: { + type: 'object', + properties: { + name: { type: 'string' }, + subject: { type: 'string' }, + hosts: { type: 'string' }, + created_at: { type: 'string', format: 'date-time' }, + updated_at: { type: 'string', format: 'date-time' } + }, + required: ['name', 'subject', 'hosts', 'created_at', 'updated_at'], + additionalProperties: false + } + } + }, + required: ['certificates'], + additionalProperties: false +} + +module.exports = { + mainSchemas: [ + caCreate, + certificateCreate, + caResponse, + certificateResponse, + caListResponse, + certificateListResponse + ], + innerSchemas: [] +} + \ No newline at end of file diff --git a/src/schemas/secret.js b/src/schemas/secret.js new file mode 100644 index 000000000..af2ac259d --- /dev/null +++ b/src/schemas/secret.js @@ -0,0 +1,65 @@ +const secretCreate = { + id: '/secretCreate', + type: 'object', + properties: { + name: { type: 'string', minLength: 1, maxLength: 255 }, + type: { type: 'string', enum: ['opaque', 'tls'] }, + data: { type: 'object' } + }, + required: ['name', 'type', 'data'], + additionalProperties: false +} + +const secretUpdate = { + id: '/secretUpdate', + type: 'object', + properties: { + data: { type: 'object' } + }, + required: ['data'], + additionalProperties: false +} + +const secretResponse = { + id: '/secretResponse', + type: 'object', + properties: { + id: { type: 'integer' }, + name: { type: 'string' }, + type: { type: 'string', enum: ['opaque', 'tls'] }, + data: { type: 'object' }, + created_at: { type: 'string', format: 'date-time' }, + updated_at: { type: 'string', format: 'date-time' } + }, + required: ['id', 'name', 'type', 'data', 'created_at', 'updated_at'], + additionalProperties: false +} + +const secretListResponse = { + id: '/secretListResponse', + type: 'object', + properties: { + secrets: { + type: 'array', + items: { + type: 'object', + properties: { + id: { type: 'integer' }, + name: { type: 'string' }, + type: { type: 'string', enum: ['opaque', 'tls'] }, + created_at: { type: 'string', format: 'date-time' }, + updated_at: { type: 'string', format: 'date-time' } + }, + required: ['id', 'name', 'type', 'created_at', 'updated_at'], + additionalProperties: false + } + } + }, + required: ['secrets'], + additionalProperties: false +} + +module.exports = { + mainSchemas: [secretCreate, secretUpdate, secretResponse, secretListResponse], + innerSchemas: [] +} diff --git a/src/services/agent-service.js b/src/services/agent-service.js index fa2a6f1fc..ec416cc94 100644 --- a/src/services/agent-service.js +++ b/src/services/agent-service.js @@ -11,6 +11,7 @@ * */ +const config = require('../config') const path = require('path') const fs = require('fs') const formidable = require('formidable') @@ -41,6 +42,7 @@ const MicroserviceService = require('../services/microservices-service') const RouterManager = require('../data/managers/router-manager') const EdgeResourceService = require('./edge-resource-service') const constants = require('../helpers/constants') +const SecretManager = require('../data/managers/secret-manager') const IncomingForm = formidable.IncomingForm const CHANGE_TRACKING_DEFAULT = {} const CHANGE_TRACKING_KEYS = ['config', 'version', 'reboot', 'deleteNode', 'microserviceList', 'microserviceConfig', 'routing', 'registries', 'tunnel', 'diagnostics', 'isImageSnapshot', 'prune', 'routerChanged', 'linkedEdgeResources'] @@ -121,6 +123,9 @@ const _invalidateFogNode = async function (fog, transaction) { const getAgentConfig = async function (fog, transaction) { const router = fog.routerId ? await RouterManager.findOne({ id: fog.routerId }, transaction) : await fog.getRouter() + // Get local agent certificate from secrets + const localAgentSecret = await SecretManager.getSecret(`${fog.uuid}-local-agent`, transaction) + // fog is the result of FogManager.FindOne() in the checkFogToken middleware return { networkInterface: fog.networkInterface, @@ -143,7 +148,10 @@ const getAgentConfig = async function (fog, transaction) { dockerPruningFrequency: fog.dockerPruningFrequency, routerHost: router.host === fog.host ? 'localhost' : router.host, routerPort: router.messagingPort, - timeZone: fog.timeZone + timeZone: fog.timeZone, + caCert: localAgentSecret ? localAgentSecret.data['ca.crt'] : null, + tlsCert: localAgentSecret ? localAgentSecret.data['tls.crt'] : null, + tlsKey: localAgentSecret ? localAgentSecret.data['tls.key'] : null } } @@ -253,7 +261,8 @@ const _updateMicroserviceStatuses = async function (microserviceStatus, fog, tra cpuUsage: status.cpuUsage, memoryUsage: status.memoryUsage, percentage: status.percentage, - errorMessage: status.errorMessage + errorMessage: status.errorMessage, + ipAddress: status.ipAddress } microserviceStatus = AppHelper.deleteUndefinedFields(microserviceStatus) const microservice = await MicroserviceManager.findOne({ @@ -581,6 +590,44 @@ async function _checkMicroservicesFogType (fog, fogTypeId, transaction) { } } +const getControllerCA = async function (fog, transaction) { + const devMode = process.env.DEV_MODE || config.get('server.devMode') + const sslCert = process.env.SSL_CERT || config.get('server.ssl.path.cert') + const intermedKey = process.env.INTERMEDIATE_CERT || config.get('server.ssl.path.intermediateCert') + const sslCertBase64 = config.get('server.ssl.base64.cert') + const intermedKeyBase64 = config.get('server.ssl.base64.intermediateCert') + const hasFileBasedSSL = !devMode && sslCert + const hasBase64SSL = !devMode && sslCertBase64 + + if (devMode) { + throw new Errors.ValidationError('Controller is in development mode') + } + + if (hasFileBasedSSL) { + try { + if (intermedKey) { + const certData = fs.readFileSync(intermedKey) + return Buffer.from(certData).toString('base64') + } else { + const certData = fs.readFileSync(sslCert) + return Buffer.from(certData).toString('base64') + } + } catch (error) { + throw new Errors.ValidationError('Failed to read SSL certificate file') + } + } + + if (hasBase64SSL) { + if (intermedKeyBase64) { + return intermedKeyBase64 + } else if (sslCertBase64) { + return sslCertBase64 + } + } + + throw new Errors.ValidationError('No valid SSL certificate configuration found') +} + module.exports = { agentProvision: TransactionDecorator.generateTransaction(agentProvision), agentDeprovision: TransactionDecorator.generateTransaction(agentDeprovision), @@ -601,5 +648,6 @@ module.exports = { deleteNode: TransactionDecorator.generateTransaction(deleteNode), getImageSnapshot: TransactionDecorator.generateTransaction(getImageSnapshot), putImageSnapshot: TransactionDecorator.generateTransaction(putImageSnapshot), - getAgentLinkedEdgeResources: TransactionDecorator.generateTransaction(getAgentLinkedEdgeResources) + getAgentLinkedEdgeResources: TransactionDecorator.generateTransaction(getAgentLinkedEdgeResources), + getControllerCA: TransactionDecorator.generateTransaction(getControllerCA) } diff --git a/src/services/certificate-service.js b/src/services/certificate-service.js new file mode 100644 index 000000000..59d5f1398 --- /dev/null +++ b/src/services/certificate-service.js @@ -0,0 +1,605 @@ +const TransactionDecorator = require('../decorators/transaction-decorator') +const SecretService = require('./secret-service') +const CertificateManager = require('../data/managers/certificate-manager') +const SecretManager = require('../data/managers/secret-manager') +const Errors = require('../helpers/errors') +const ErrorMessages = require('../helpers/error-messages') +const AppHelper = require('../helpers/app-helper') +const Validator = require('../schemas/index') +const { generateSelfSignedCA, storeCA, generateCertificate } = require('../utils/cert') +const config = require('../config') +const forge = require('node-forge') + +// Helper function to check Kubernetes environment +function checkKubernetesEnvironment () { + const isKubernetes = process.env.CONTROL_PLANE || config.get('app.ControlPlane') === 'kubernetes' + if (!isKubernetes) { + throw new Errors.ValidationError(ErrorMessages.NOT_KUBERNETES_ENV) + } +} + +// Helper function to validate CA type +function validateCertType (type) { + if (type === 'k8s-secret') { + checkKubernetesEnvironment() + } else if (type !== 'self-signed' && type !== 'direct') { + throw new Errors.ValidationError(`Invalid CA type: ${type}. Must be one of: self-signed, direct, k8s-secret`) + } +} + +// Parse PEM certificate to extract metadata +function parseCertificate (certPem) { + try { + const cert = forge.pki.certificateFromPem(certPem) + return { + subject: cert.subject.getField('CN') ? cert.subject.getField('CN').value : '', + issuer: cert.issuer.getField('CN') ? cert.issuer.getField('CN').value : '', + validFrom: cert.validity.notBefore, + validTo: cert.validity.notAfter, + serialNumber: cert.serialNumber + } + } catch (error) { + throw new Errors.ValidationError(`Invalid certificate: ${error.message}`) + } +} + +// Helper function to convert months to milliseconds +function monthsToMilliseconds (months) { + // Average month length in milliseconds (30.44 days per month) + const avgMonthInMs = 30.44 * 24 * 60 * 60 * 1000 + return months * avgMonthInMs +} + +// Helper function to handle expiration input +function processExpiration (expiration) { + // If expiration is less than 1000, assume it's in months + // This threshold is chosen because no realistic certificate would expire in less than 1 second + if (expiration && expiration < 1000) { + return monthsToMilliseconds(expiration) + } + // Otherwise, use as-is (assuming milliseconds) + return expiration +} + +async function createCAEndpoint (caData, transaction) { + // Validate input data + const validation = await Validator.validate(caData, Validator.schemas.caCreate) + if (!validation.valid) { + throw new Errors.ValidationError(validation.error) + } + + // Only process expiration if present (for self-signed) + if (caData.expiration) { + caData.expiration = processExpiration(caData.expiration) + } + // Validate CA type based on environment + validateCertType(caData.type) + + try { + const secretName = caData.type === 'self-signed' ? caData.name : caData.secretName + const existingSecret = await SecretService.getSecretEndpoint(secretName) + if (caData.type === 'self-signed') { + if (existingSecret) { + throw new Errors.ConflictError(`CA with name ${secretName} already exists`) + } + } else { + if (!existingSecret) { + throw new Errors.NotFoundError(`Secret with name ${secretName} does not exist. You must create the secret first.`) + } + // For direct/k8s-secret, check if CA record already exists + const existingCA = await CertificateManager.findCertificateByName(secretName, transaction) + if (existingCA && existingCA.isCA) { + throw new Errors.ConflictError(`CA with name ${secretName} already exists`) + } + } + } catch (error) { + // Only proceed if the error is NotFoundError + if (!(error instanceof Errors.NotFoundError)) { + throw error + } + // For self-signed, NotFoundError is fine (secret doesn't exist yet) + // For direct/k8s-secret, NotFoundError is handled above + } + + let ca + let certDetails + + if (caData.type === 'self-signed') { + ca = await generateSelfSignedCA(caData.subject, caData.expiration) + await storeCA(ca, caData.name) + certDetails = parseCertificate(ca.cert) + } else if (caData.type === 'k8s-secret') { + // Import CA from Kubernetes secret + ca = await require('../utils/cert').getCAFromK8sSecret(caData.secretName) + certDetails = parseCertificate(ca.certificate) + // Store the CA locally with the same name as the secret + await storeCA({ cert: ca.certificate, key: ca.key }, caData.secretName) + } else if (caData.type === 'direct') { + // Load from internal secret + const caObj = await require('../utils/cert').loadCA(caData.secretName) + ca = await require('../utils/cert').getCAFromDirect(caObj) + certDetails = parseCertificate(ca.certificate) + } else { + throw new Errors.ValidationError('Unsupported CA type') + } + + // Get the secret that was just created or referenced + const secret = await SecretManager.findOne({ name: caData.secretName || caData.name }, transaction) + + // Create certificate record in database + await CertificateManager.createCertificateRecord({ + name: caData.secretName || caData.name, // Use secretName if available, otherwise use provided name + subject: certDetails.subject, + isCA: true, + validFrom: certDetails.validFrom, + validTo: certDetails.validTo, + serialNumber: certDetails.serialNumber, + secretId: secret ? secret.id : null + }, transaction) + + return { + name: caData.secretName || caData.name, // Use secretName if available, otherwise use provided name + subject: certDetails.subject, + type: caData.type, + valid_from: certDetails.validFrom, + valid_to: certDetails.validTo + } +} + +async function getCAEndpoint (name, transaction) { + const certRecord = await CertificateManager.findCertificateByName(name, transaction) + + if (!certRecord || !certRecord.isCA) { + throw new Errors.NotFoundError(`CA with name ${name} not found`) + } + + // Get the actual cert data from the secret + const secret = await SecretService.getSecretEndpoint(name) + + if (!secret || secret.type !== 'tls') { + throw new Errors.NotFoundError(`CA with name ${name} not found`) + } + + return { + name: certRecord.name, + subject: certRecord.subject, + is_ca: certRecord.isCA, + valid_from: certRecord.validFrom, + valid_to: certRecord.validTo, + serial_number: certRecord.serialNumber, + data: { + certificate: Buffer.from(secret.data['tls.crt'], 'base64').toString(), + private_key: Buffer.from(secret.data['tls.key'], 'base64').toString() + } + } +} + +async function listCAEndpoint (transaction) { + const caRecords = await CertificateManager.findAllCAs(transaction) + + return { + cas: caRecords.map(ca => ({ + name: ca.name, + subject: ca.subject, + valid_from: ca.validFrom, + valid_to: ca.validTo, + days_remaining: ca.getDaysUntilExpiration(), + is_expired: ca.isExpired() + })) + } +} + +async function deleteCAEndpoint (name, transaction) { + const caRecord = await CertificateManager.findCertificateByName(name, transaction) + + if (!caRecord || !caRecord.isCA) { + throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.CA_NOT_FOUND, name)) + } + + // Check if this CA has signed certificates + const signedCerts = await CertificateManager.findCertificatesByCA(caRecord.id, transaction) + + if (signedCerts.length > 0) { + throw new Errors.ValidationError(`Cannot delete CA that has signed certificates. Please delete the following certificates first: ${signedCerts.map(cert => cert.name).join(', ')}`) + } + + // Delete certificate record and the secret + await CertificateManager.deleteCertificate(name, transaction) + await SecretService.deleteSecretEndpoint(name) + + return {} +} + +async function createCertificateEndpoint (certData, transaction) { + // Validate input data + const validation = await Validator.validate(certData, Validator.schemas.certificateCreate) + if (!validation.valid) { + throw new Errors.ValidationError(validation.error) + } + // Validate CA type based on environment + validateCertType(certData.ca.type) + // Process expiration in months if needed + if (certData.expiration) { + certData.expiration = processExpiration(certData.expiration) + } + + // Check if certificate already exists + try { + const existingSecret = await SecretService.getSecretEndpoint(certData.name) + if (existingSecret) { + throw new Errors.ConflictError(`Certificate with name ${certData.name} already exists`) + } + } catch (error) { + if (!(error instanceof Errors.NotFoundError)) { + throw error + } + } + + // Find signing CA if one is specified + let caRecord = null + if (certData.ca && certData.ca.secretName) { + // Skip CA lookup for self-signed type - it's meant to be self-signed, not signed by another CA + if (certData.ca.type && certData.ca.type.toLowerCase() === 'self-signed') { + // Modify the CA structure to properly indicate self-signed + certData.ca = { type: 'self-signed' } + // Continue with certificate generation + } else { + caRecord = await CertificateManager.findCertificateByName(certData.ca.secretName, transaction) + if (!caRecord || !caRecord.isCA) { + // Log if we're dealing with a k8s-secret type + if (certData.ca.type === 'k8s-secret') { + try { + // Try to directly generate cert with k8s CA - this should invoke getCAFromInput + await generateCertificate({ + name: certData.name, + subject: certData.subject, + hosts: certData.hosts, + expiration: certData.expiration, + ca: certData.ca + }) + + // Get certificate details from newly created secret + const certSecret = await SecretService.getSecretEndpoint(certData.name) + const certPem = Buffer.from(certSecret.data['tls.crt'], 'base64').toString() + const certDetails = parseCertificate(certPem) + + // Find or create the CA record to get its ID + let caId = null + const caRecord = await CertificateManager.findCertificateByName(certData.ca.secretName, transaction) + if (caRecord) { + caId = caRecord.id + } + + // Create certificate record in database + await CertificateManager.createCertificateRecord({ + name: certData.name, + subject: certDetails.subject, + isCA: false, + signedById: caId, + hosts: certData.hosts, + validFrom: certDetails.validFrom, + validTo: certDetails.validTo, + serialNumber: certDetails.serialNumber + }, transaction) + + // Return response with CA name + return { + name: certData.name, + subject: certData.subject, + hosts: certData.hosts, + valid_from: certDetails.validFrom, + valid_to: certDetails.validTo, + ca_name: certData.ca.secretName + } + } catch (error) { + throw error + } + } + throw new Errors.NotFoundError(`CA with name ${certData.ca.secretName} not found`) + } + // Check if CA is expired + if (caRecord.isExpired()) { + throw new Errors.ValidationError(`CA ${certData.ca.secretName} is expired and cannot be used to sign new certificates`) + } + } + } + + // Generate certificate + await generateCertificate({ + name: certData.name, + subject: certData.subject, + hosts: certData.hosts, + expiration: certData.expiration, + ca: certData.ca + }) + + // Get certificate from secret to parse details + const certSecret = await SecretService.getSecretEndpoint(certData.name) + const certPem = Buffer.from(certSecret.data['tls.crt'], 'base64').toString() + const certDetails = parseCertificate(certPem) + + // Create certificate record in database + await CertificateManager.createCertificateRecord({ + name: certData.name, + subject: certDetails.subject, + isCA: false, + signedById: caRecord ? caRecord.id : null, + hosts: certData.hosts, + validFrom: certDetails.validFrom, + validTo: certDetails.validTo, + serialNumber: certDetails.serialNumber + }, transaction) + + return { + name: certData.name, + subject: certData.subject, + hosts: certData.hosts, + valid_from: certDetails.validFrom, + valid_to: certDetails.validTo, + ca_name: caRecord ? caRecord.name : null + } +} + +async function getCertificateEndpoint (name, transaction) { + const certRecord = await CertificateManager.findCertificateByName(name, transaction) + + if (!certRecord) { + throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.CERTIFICATE_NOT_FOUND, name)) + } + + // Get the actual cert data from the secret + const secret = await SecretService.getSecretEndpoint(name) + + if (!secret || secret.type !== 'tls') { + throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.CERTIFICATE_NOT_FOUND, name)) + } + + // Get the certificate chain if available + const certChain = await CertificateManager.getCertificateChain(certRecord.id, transaction) + const chainInfo = certChain.length > 1 + ? certChain.slice(1).map(c => ({ name: c.name, subject: c.subject })) + : [] + + return { + name: certRecord.name, + subject: certRecord.subject, + hosts: certRecord.hosts, + is_ca: certRecord.isCA, + valid_from: certRecord.validFrom, + valid_to: certRecord.validTo, + serial_number: certRecord.serialNumber, + ca_name: certRecord.signingCA ? certRecord.signingCA.name : null, + certificate_chain: chainInfo, + days_remaining: certRecord.getDaysUntilExpiration(), + is_expired: certRecord.isExpired(), + data: { + certificate: Buffer.from(secret.data['tls.crt'], 'base64').toString(), + private_key: Buffer.from(secret.data['tls.key'], 'base64').toString() + } + } +} + +async function listCertificatesEndpoint (transaction) { + const certRecords = await CertificateManager.findAllCertificates(transaction) + + return { + certificates: certRecords.map(cert => ({ + name: cert.name, + subject: cert.subject, + hosts: cert.hosts, + is_ca: cert.isCA, + valid_from: cert.validFrom, + valid_to: cert.validTo, + days_remaining: cert.getDaysUntilExpiration(), + is_expired: cert.isExpired(), + ca_name: cert.signingCA ? cert.signingCA.name : null + })) + } +} + +async function deleteCertificateEndpoint (name, transaction) { + const certRecord = await CertificateManager.findCertificateByName(name, transaction) + + if (!certRecord) { + throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.CERTIFICATE_NOT_FOUND, name)) + } + + // Check if this is a CA with signed certificates + if (certRecord.isCA) { + const signedCerts = await CertificateManager.findCertificatesByCA(certRecord.id, transaction) + if (signedCerts.length > 0) { + throw new Errors.ValidationError(`Cannot delete CA that has signed certificates. Please delete the following certificates first: ${signedCerts.map(cert => cert.name).join(', ')}`) + } + } + + // Delete certificate record and the secret + await CertificateManager.deleteCertificate(name, transaction) + await SecretService.deleteSecretEndpoint(name) + + return {} +} + +// Phase 3: Renewal Implementation +async function renewCertificateEndpoint (name, transaction) { + try { + // First check if certificate exists in database + let certRecord = await CertificateManager.findCertificateByName(name, transaction) + let isNewRecord = false + + // If no certificate record but secret exists, we'll create a new record + if (!certRecord) { + try { + const secret = await SecretManager.findOne({ name, type: 'tls' }, transaction) + if (secret) { + isNewRecord = true + console.log(`Certificate record not found for ${name}, but secret exists. Will create new record.`) + } else { + throw new Errors.NotFoundError(`Certificate with name ${name} not found`) + } + } catch (error) { + if (error instanceof Errors.NotFoundError) { + throw error + } + throw new Errors.NotFoundError(`Certificate with name ${name} not found: ${error.message}`) + } + } + + // Delete existing secret (if any) - we'll create a new one + try { + await SecretService.deleteSecretEndpoint(name) + } catch (error) { + // Ignore NotFoundError + if (!(error instanceof Errors.NotFoundError)) { + throw error + } + } + + // Prepare renewal data + const renewalData = { + name: name, + subject: certRecord ? certRecord.subject : name, + hosts: certRecord ? certRecord.hosts : null, + isRenewal: true + } + + // Handle signing CA if this certificate was signed by a CA + if (certRecord && certRecord.signedById) { + const signingCA = await CertificateManager.findOne({ id: certRecord.signedById }, transaction) + + if (!signingCA || !signingCA.isCA) { + throw new Errors.NotFoundError(`Signing CA for certificate ${name} not found or is not a valid CA`) + } + + if (signingCA.isExpired()) { + throw new Errors.ValidationError(`CA ${signingCA.name} is expired and cannot be used to renew certificates. Please renew the CA first.`) + } + + renewalData.ca = { + type: 'direct', + secretName: signingCA.name + } + } else { + // Self-signed renewal + renewalData.ca = { + type: 'self-signed' + } + } + + // Generate new certificate + await generateCertificate(renewalData) + + // Get the newly created secret + const secretModel = await SecretManager.findOne({ name }, transaction) + + if (!secretModel) { + throw new Errors.NotFoundError(`Failed to find renewed certificate secret: ${name}`) + } + + // Current date and expiration date + const nowDate = new Date() + const expiryDate = new Date() + expiryDate.setMonth(expiryDate.getMonth() + (certRecord && certRecord.isCA ? 36 : 12)) + + // Use Sequelize transaction for both operations + if (isNewRecord) { + // Create new certificate record + await CertificateManager.create({ + name: name, + subject: renewalData.subject, + hosts: renewalData.hosts, + isCA: renewalData.ca.type === 'self-signed', + validFrom: nowDate, + validTo: expiryDate, + serialNumber: `renewed-${Date.now()}`, + secretId: secretModel.id + }, transaction) + } else { + // Update the existing certificate record + await CertificateManager.update( + { id: certRecord.id }, + { + validFrom: nowDate, + validTo: expiryDate, + secretId: secretModel.id + }, + transaction + ) + } + + // Get the updated certificate record + const updatedCert = await CertificateManager.findCertificateByName(name, transaction) + + if (!updatedCert) { + // If certificate record still doesn't exist, try to create it again with all fields + await CertificateManager.create({ + name: name, + subject: renewalData.subject, + hosts: renewalData.hosts, + isCA: renewalData.ca.type === 'self-signed', + validFrom: nowDate, + validTo: expiryDate, + serialNumber: `renewed-${Date.now()}`, + secretId: secretModel.id + }, transaction) + + // Try to get it again + const newCert = await CertificateManager.findCertificateByName(name, transaction) + if (!newCert) { + throw new Error(`Failed to retrieve or create certificate record for ${name}`) + } + + return { + name: newCert.name, + subject: newCert.subject, + hosts: newCert.hosts, + valid_from: newCert.validFrom, + valid_to: newCert.validTo, + renewed: true + } + } + + return { + name: updatedCert.name, + subject: updatedCert.subject, + hosts: updatedCert.hosts, + valid_from: updatedCert.validFrom, + valid_to: updatedCert.validTo, + renewed: true + } + } catch (error) { + console.error(`Certificate renewal error: ${error.message}`) + throw error + } +} + +// Get certificates expiring soon +async function listExpiringCertificatesEndpoint (days = 30, transaction) { + const expiringCerts = await CertificateManager.findCertificatesForRenewal(days, transaction) + + // Ensure we return an empty array, not null, if no certificates are expiring + return { + certificates: expiringCerts ? expiringCerts.map(cert => ({ + name: cert.name, + subject: cert.subject, + hosts: cert.hosts, + is_ca: cert.isCA, + valid_from: cert.validFrom, + valid_to: cert.validTo, + days_remaining: cert.getDaysUntilExpiration(), + ca_name: cert.signingCA ? cert.signingCA.name : null + })) : [] + } +} + +module.exports = { + createCAEndpoint: TransactionDecorator.generateTransaction(createCAEndpoint), + getCAEndpoint: TransactionDecorator.generateTransaction(getCAEndpoint), + listCAEndpoint: TransactionDecorator.generateTransaction(listCAEndpoint), + deleteCAEndpoint: TransactionDecorator.generateTransaction(deleteCAEndpoint), + createCertificateEndpoint: TransactionDecorator.generateTransaction(createCertificateEndpoint), + getCertificateEndpoint: TransactionDecorator.generateTransaction(getCertificateEndpoint), + listCertificatesEndpoint: TransactionDecorator.generateTransaction(listCertificatesEndpoint), + deleteCertificateEndpoint: TransactionDecorator.generateTransaction(deleteCertificateEndpoint), + renewCertificateEndpoint: TransactionDecorator.generateTransaction(renewCertificateEndpoint), + listExpiringCertificatesEndpoint: TransactionDecorator.generateTransaction(listExpiringCertificatesEndpoint) +} diff --git a/src/services/iofog-service.js b/src/services/iofog-service.js index 1cc27db5a..7172c1ab4 100644 --- a/src/services/iofog-service.js +++ b/src/services/iofog-service.js @@ -11,6 +11,8 @@ * */ +const config = require('../config') +const fs = require('fs') const TransactionDecorator = require('../decorators/transaction-decorator') const AppHelper = require('../helpers/app-helper') const FogManager = require('../data/managers/iofog-manager') @@ -36,6 +38,107 @@ const RouterService = require('./router-service') const Constants = require('../helpers/constants') const Op = require('sequelize').Op const lget = require('lodash/get') +const CertificateService = require('./certificate-service') +const logger = require('../logger') + +const SITE_CA_CERT = 'pot-site-ca' +const DEFAULT_ROUTER_LOCAL_CA = 'default-router-local-ca' + +async function _handleRouterCertificates (fogData, transaction) { + // Helper to check CA existence + async function ensureCA (name, subject) { + try { + await CertificateService.getCAEndpoint(name, transaction) + // CA exists + } catch (err) { + if (err.name === 'NotFoundError') { + await CertificateService.createCAEndpoint({ + name, + subject: `${subject}`, + expiration: 60, // months + type: 'self-signed' + }, transaction) + } else if (err.name === 'ConflictError') { + // Already exists, ignore + } else { + throw err + } + } + } + + // Helper to check cert existence + async function ensureCert (name, subject, hosts, ca) { + try { + await CertificateService.getCertificateEndpoint(name, transaction) + // Cert exists + } catch (err) { + if (err.name === 'NotFoundError') { + await CertificateService.createCertificateEndpoint({ + name, + subject: `${subject}`, + hosts, + ca + }, transaction) + } else if (err.name === 'ConflictError') { + // Already exists, ignore + } else { + throw err + } + } + } + + // Build hosts string from available fields + const hosts = [ + fogData.host, + fogData.ipAddress, + fogData.ipAddressExternal + ].filter(Boolean).join(',') || 'localhost' + + try { + // Always ensure SITE_CA_CERT exists + await ensureCA(SITE_CA_CERT, SITE_CA_CERT) + + // Always ensure site-server cert exists + await ensureCert( + `${fogData.uuid}-site-server`, + `${fogData.uuid}-site-server`, + hosts, + { type: 'direct', secretName: SITE_CA_CERT } + ) + + // Always ensure local-ca exists + await ensureCA(`${fogData.uuid}-local-ca`, `${fogData.uuid}-local-ca`) + + // Always ensure local-server cert exists + await ensureCert( + `${fogData.uuid}-local-server`, + `${fogData.uuid}-local-server`, + hosts, + { type: 'direct', secretName: `${fogData.uuid}-local-ca` } + ) + + // Always ensure local-agent cert exists + await ensureCert( + `${fogData.uuid}-local-agent`, + `${fogData.uuid}-local-agent`, + hosts, + { type: 'direct', secretName: `${fogData.uuid}-local-ca` } + ) + + // If routerMode is 'none', also ensure DEFAULT_ROUTER_LOCAL_CA and local-agent signed by it + if (fogData.routerMode === 'none') { + await ensureCA(DEFAULT_ROUTER_LOCAL_CA, DEFAULT_ROUTER_LOCAL_CA) + await ensureCert( + `${fogData.uuid}-local-agent`, + `${fogData.uuid}-local-agent`, + hosts, + { type: 'direct', secretName: DEFAULT_ROUTER_LOCAL_CA } + ) + } + } catch (error) { + logger.error('Certificate operation failed:', error) + } +} async function createFogEndPoint (fogData, isCLI, transaction) { await Validator.validate(fogData, Validator.schemas.iofogCreate) @@ -72,6 +175,10 @@ async function createFogEndPoint (fogData, isCLI, transaction) { routerId: null, timeZone: fogData.timeZone } + + // Add certificate handling + await _handleRouterCertificates(fogData, transaction) + createFogData = AppHelper.deleteUndefinedFields(createFogData) // Default router is edge @@ -190,6 +297,9 @@ async function updateFogEndPoint (fogData, isCLI, transaction) { throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.INVALID_IOFOG_UUID, fogData.uuid)) } + // Add certificate handling + await _handleRouterCertificates(fogData, transaction) + // Update tags await _setTags(oldFog, fogData.tags, transaction) @@ -213,13 +323,6 @@ async function updateFogEndPoint (fogData, isCLI, transaction) { const messagingPort = fogData.messagingPort || (router ? router.messagingPort : null) const interRouterPort = fogData.interRouterPort || (router ? router.interRouterPort : null) const edgeRouterPort = fogData.edgeRouterPort || (router ? router.edgeRouterPort : null) - const requireSsl = fogData.requireSsl || (router ? router.requireSsl : null) - const sslProfile = fogData.sslProfile || (router ? router.sslProfile : null) - const saslMechanisms = fogData.saslMechanisms || (router ? router.saslMechanisms : null) - const authenticatePeer = fogData.authenticatePeer || (router ? router.authenticatePeer : null) - const caCert = fogData.caCert || (router ? router.caCert : null) - const tlsCert = fogData.tlsCert || (router ? router.tlsCert : null) - const tlsKey = fogData.tlsKey || (router ? router.tlsKey : null) let networkRouter // const isSystem = updateFogData.isSystem === undefined ? oldFog.isSystem : updateFogData.isSystem @@ -246,7 +349,7 @@ async function updateFogEndPoint (fogData, isCLI, transaction) { } else { // Update existing router networkRouter = await RouterService.updateRouter(router, { - messagingPort, interRouterPort, edgeRouterPort, isEdge: routerMode === 'edge', host, requireSsl, sslProfile, saslMechanisms, authenticatePeer, caCert, tlsCert, tlsKey + messagingPort, interRouterPort, edgeRouterPort, isEdge: routerMode === 'edge', host }, upstreamRouters) await ChangeTrackingService.update(fogData.uuid, ChangeTrackingService.events.routerChanged, transaction) } @@ -500,9 +603,41 @@ async function generateProvisioningKeyEndPoint (fogData, isCLI, transaction) { const provisioningKeyData = await FogProvisionKeyManager.updateOrCreate({ iofogUuid: fogData.uuid }, newProvision, transaction) + const devMode = process.env.DEV_MODE || config.get('server.devMode') + const sslCert = process.env.SSL_CERT || config.get('server.ssl.path.cert') + const intermedKey = process.env.INTERMEDIATE_CERT || config.get('server.ssl.path.intermediateCert') + const sslCertBase64 = config.get('server.ssl.base64.cert') + const intermedKeyBase64 = config.get('server.ssl.base64.intermediateCert') + const hasFileBasedSSL = !devMode && sslCert + const hasBase64SSL = !devMode && sslCertBase64 + let caCert = '' + + if (!devMode) { + if (hasFileBasedSSL) { + try { + if (intermedKey) { + const certData = fs.readFileSync(intermedKey) + caCert = Buffer.from(certData).toString('base64') + } else { + const certData = fs.readFileSync(sslCert) + caCert = Buffer.from(certData).toString('base64') + } + } catch (error) { + throw new Errors.ValidationError('Failed to read SSL certificate file') + } + } + if (hasBase64SSL) { + if (intermedKeyBase64) { + caCert = intermedKeyBase64 + } else if (sslCertBase64) { + caCert = sslCertBase64 + } + } + } return { key: provisioningKeyData.provisionKey, - expirationTime: provisioningKeyData.expirationTime + expirationTime: provisioningKeyData.expirationTime, + caCert: caCert } } diff --git a/src/services/router-service.js b/src/services/router-service.js index 124089e90..e1d4821cd 100644 --- a/src/services/router-service.js +++ b/src/services/router-service.js @@ -28,6 +28,11 @@ const TransactionDecorator = require('../decorators/transaction-decorator') const Validator = require('../schemas') const ldifferenceWith = require('lodash/differenceWith') const constants = require('../helpers/constants') +const MicroserviceEnvManager = require('../data/managers/microservice-env-manager') +const SecretManager = require('../data/managers/secret-manager') + +const SITE_CONFIG_VERSION = 'pot' +const SITE_CONFIG_NAMESPACE = 'datasance' async function validateAndReturnUpstreamRouters (upstreamRouterIds, isSystemFog, defaultRouter, transaction) { if (!upstreamRouterIds) { @@ -56,7 +61,7 @@ async function validateAndReturnUpstreamRouters (upstreamRouterIds, isSystemFog, async function createRouterForFog (fogData, uuid, upstreamRouters, transaction) { const isEdge = fogData.routerMode === 'edge' - const messagingPort = fogData.messagingPort || 5672 + const messagingPort = fogData.messagingPort || 5671 // Is default router if we are on a system fog and no other default router already exists const isDefault = (fogData.isSystem) ? !(await RouterManager.findOne({ isDefault: true }, transaction)) : false const routerData = { @@ -66,23 +71,17 @@ async function createRouterForFog (fogData, uuid, upstreamRouters, transaction) edgeRouterPort: !isEdge ? fogData.edgeRouterPort : null, interRouterPort: !isEdge ? fogData.interRouterPort : null, isDefault: isDefault, - requireSsl: fogData.requireSsl, - sslProfile: fogData.sslProfile, - saslMechanisms: fogData.saslMechanisms, - authenticatePeer: fogData.authenticatePeer, - caCert: fogData.caCert, - tlsCert: fogData.tlsCert, - tlsKey: fogData.tlsKey, iofogUuid: uuid } const router = await RouterManager.create(routerData, transaction) - const microserviceConfig = _getRouterMicroserviceConfig(isEdge, uuid, messagingPort, router.interRouterPort, router.edgeRouterPort, router.saslMechanisms, router.authenticatePeer, router.sslProfile, router.requireSsl, router.caCert, router.tlsCert, router.tlsKey) + const microserviceConfig = await _getRouterMicroserviceConfig(isEdge, uuid, messagingPort, router.interRouterPort, router.edgeRouterPort, transaction) for (const upstreamRouter of upstreamRouters) { await RouterConnectionManager.create({ sourceRouter: router.id, destRouter: upstreamRouter.id }, transaction) - microserviceConfig.connectors = (microserviceConfig.connectors || []).concat(_getRouterConnectorConfig(isEdge, upstreamRouter, router.sslProfile, router.saslMechanisms)) + const connectorConfig = _getRouterConnectorConfig(isEdge, upstreamRouter, uuid) + microserviceConfig.connectors[connectorConfig.name] = connectorConfig } const routerMicroservice = await _createRouterMicroservice(isEdge, uuid, microserviceConfig, transaction) @@ -120,7 +119,7 @@ async function updateRouter (oldRouter, newRouterData, upstreamRouters, transact await _createRouterPorts(routerMicroservice.uuid, newRouterData.edgeRouterPort, transaction) await _createRouterPorts(routerMicroservice.uuid, newRouterData.interRouterPort, transaction) } - newRouterData.messagingPort = newRouterData.messagingPort || 5672 + newRouterData.messagingPort = newRouterData.messagingPort || 5671 await RouterManager.update({ id: oldRouter.id }, newRouterData, transaction) // Update upstream routers @@ -163,42 +162,91 @@ async function _deleteRouterPorts (routerMicroserviceUuid, port, transaction) { await MicroservicePortManager.delete({ microserviceUuid: routerMicroserviceUuid, portInternal: port }, transaction) } +async function _updateRouterPorts (routerMicroserviceUuid, router, transaction) { + await MicroservicePortManager.delete({ microserviceUuid: routerMicroserviceUuid }, transaction) + await _createRouterPorts(routerMicroserviceUuid, router.messagingPort, transaction) + if (!router.isEdge) { + await _createRouterPorts(routerMicroserviceUuid, router.edgeRouterPort, transaction) + await _createRouterPorts(routerMicroserviceUuid, router.interRouterPort, transaction) + } +} + async function updateConfig (routerID, transaction) { const router = await RouterManager.findOne({ id: routerID }, transaction) if (!router) { throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.INVALID_ROUTER, routerID)) } - const microserviceConfig = _getRouterMicroserviceConfig(router.isEdge, router.iofogUuid, router.messagingPort, router.interRouterPort, router.edgeRouterPort, router.saslMechanisms, router.authenticatePeer, router.sslProfile, router.requireSsl, router.caCert, router.tlsCert, router.tlsKey) - const upstreamRoutersConnections = await RouterConnectionManager.findAllWithRouters({ sourceRouter: router.id }, transaction) - - for (const upstreamRouterConnection of upstreamRoutersConnections) { - microserviceConfig.connectors = (microserviceConfig.connectors || []).concat(_getRouterConnectorConfig(router.isEdge, upstreamRouterConnection.dest, router.sslProfile, router.saslMechanisms)) - } + // Get current configuration const routerCatalog = await CatalogService.getRouterCatalogItem(transaction) const routerMicroservice = await MicroserviceManager.findOne({ catalogItemId: routerCatalog.id, iofogUuid: router.iofogUuid }, transaction) + if (!routerMicroservice) { throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.INVALID_ROUTER, router.id)) } - if (routerMicroservice.config !== JSON.stringify(microserviceConfig)) { - await MicroserviceManager.update({ uuid: routerMicroservice.uuid }, { config: JSON.stringify(microserviceConfig) }, transaction) + const currentConfig = JSON.parse(routerMicroservice.config || '{}') - if (_listenersChanged(JSON.parse(routerMicroservice.config || '{}').listeners, microserviceConfig.listeners)) { - MicroservicePortManager.delete({ microserviceUuid: routerMicroservice.uuid }, transaction) - await _createRouterPorts(routerMicroservice.uuid, router.messagingPort, transaction) - if (!router.isEdge) { - await _createRouterPorts(routerMicroservice.uuid, router.edgeRouterPort, transaction) - await _createRouterPorts(routerMicroservice.uuid, router.interRouterPort, transaction) - } - await MicroserviceManager.update({ uuid: routerMicroservice.uuid }, { rebuild: true }, transaction) - await ChangeTrackingService.update(router.iofogUuid, ChangeTrackingService.events.microserviceList, transaction) + // Generate new configuration + const newConfig = await _getRouterMicroserviceConfig( + router.isEdge, + router.iofogUuid, + router.messagingPort, + router.interRouterPort, + router.edgeRouterPort, + transaction + ) + + // Add connectors for upstream routers + const upstreamRoutersConnections = await RouterConnectionManager.findAllWithRouters( + { sourceRouter: router.id }, + transaction + ) + + for (const upstreamRouterConnection of upstreamRoutersConnections) { + const connectorConfig = _getRouterConnectorConfig( + router.isEdge, + upstreamRouterConnection.dest, + router.iofogUuid + ) + newConfig.connectors[connectorConfig.name] = connectorConfig + } + + // Check if configuration needs update + if (JSON.stringify(currentConfig) !== JSON.stringify(newConfig)) { + await MicroserviceManager.update( + { uuid: routerMicroservice.uuid }, + { config: JSON.stringify(newConfig) }, + transaction + ) + + // Check if listeners changed + if (_listenersChanged(currentConfig.listeners, newConfig.listeners)) { + await _updateRouterPorts(routerMicroservice.uuid, router, transaction) + await MicroserviceManager.update( + { uuid: routerMicroservice.uuid }, + { rebuild: true }, + transaction + ) + await ChangeTrackingService.update( + router.iofogUuid, + ChangeTrackingService.events.microserviceList, + transaction + ) } else { - await MicroserviceManager.update({ uuid: routerMicroservice.uuid }, { rebuild: true }, transaction) - await ChangeTrackingService.update(router.iofogUuid, ChangeTrackingService.events.microserviceConfig, transaction) + // await MicroserviceManager.update( + // { uuid: routerMicroservice.uuid }, + // { rebuild: true }, + // transaction + // ) + await ChangeTrackingService.update( + router.iofogUuid, + ChangeTrackingService.events.microserviceConfig, + transaction + ) } } } @@ -218,6 +266,11 @@ function _listenersChanged (currentListeners, newListeners) { } function _createRouterPorts (routerMicroserviceUuid, port, transaction) { + // Skip port mapping for default AMQP listener (5672) + if (port === 5672) { + return Promise.resolve() + } + const mappingData = { isPublic: false, portInternal: port, @@ -244,7 +297,21 @@ async function _createRouterMicroservice (isEdge, uuid, microserviceConfig, tran iofogUuid: uuid, rootHostAccess: false, logSize: constants.MICROSERVICE_DEFAULT_LOG_SIZE, - configLastUpdated: Date.now() + configLastUpdated: Date.now(), + env: [ + { + key: 'QDROUTERD_CONF', + value: '/home/runner/skupper-router-certs/skrouterd.json' + }, + { + key: 'QDROUTERD_CONF_TYPE', + value: 'json' + }, + { + key: 'SKUPPER_SITE_ID', + value: uuid + } + ] } const capAddValues = [ @@ -262,77 +329,145 @@ async function _createRouterMicroservice (isEdge, uuid, microserviceConfig, tran capAdd: capAdd.capAdd }, transaction) } + + // Create environment variables + for (const env of routerMicroserviceData.env) { + await MicroserviceEnvManager.create({ + microserviceUuid: routerMicroserviceData.uuid, + key: env.key, + value: env.value + }, transaction) + } + return routerMicroservice } -function _getRouterConnectorConfig (isEdge, dest, sslProfile, saslMechanisms) { +function _getRouterConnectorConfig (isEdge, dest, uuid) { const config = { name: dest.iofogUuid || Constants.DEFAULT_ROUTER_NAME, role: isEdge ? 'edge' : 'inter-router', host: dest.host, - port: isEdge ? dest.edgeRouterPort : dest.interRouterPort + port: (isEdge ? dest.edgeRouterPort : dest.interRouterPort).toString(), + sslProfile: `${uuid}-site-server` } - if (sslProfile) { - config.sslProfile = sslProfile + return config +} + +async function _getRouterMicroserviceConfig (isEdge, uuid, messagingPort, interRouterPort, edgeRouterPort, transaction) { + const config = { + addresses: { + mc: { + prefix: 'mc', + distribution: 'multicast' + } + }, + bridges: { + tcpConnectors: {}, + tcpListeners: {} + }, + connectors: {}, + listeners: {}, + logConfig: { + ROUTER_CORE: { + enable: 'error+', + module: 'ROUTER_CORE' + } + }, + metadata: { + helloMaxAgeSeconds: '3', + id: uuid, + mode: isEdge ? 'edge' : 'interior' + }, + siteConfig: { + name: uuid, + namespace: SITE_CONFIG_NAMESPACE, + platform: 'docker', + version: SITE_CONFIG_VERSION + }, + sslProfiles: {} } - if (saslMechanisms) { - config.saslMechanisms = saslMechanisms + // Get SSL secrets for all profiles + const siteServerSecret = await SecretManager.getSecret(`${uuid}-site-server`, transaction) + const localServerSecret = await SecretManager.getSecret(`${uuid}-local-server`, transaction) + const localAgentSecret = await SecretManager.getSecret(`${uuid}-local-agent`, transaction) + + // Add SSL profiles + if (siteServerSecret) { + config.sslProfiles[`${uuid}-site-server`] = { + CaCert: siteServerSecret.data['ca.crt'], + TlsCert: siteServerSecret.data['tls.crt'], + TlsKey: siteServerSecret.data['tls.key'], + name: `${uuid}-site-server` + } } - return config -} + if (localServerSecret) { + config.sslProfiles[`${uuid}-local-server`] = { + CaCert: localServerSecret.data['ca.crt'], + TlsCert: localServerSecret.data['tls.crt'], + TlsKey: localServerSecret.data['tls.key'], + name: `${uuid}-local-server` + } + } -function _getRouterMicroserviceConfig (isEdge, uuid, messagingPort, interRouterPort, edgeRouterPort, saslMechanisms, authenticatePeer, sslProfile, requireSsl, caCert, tlsCert, tlsKey) { - const microserviceConfig = { - mode: isEdge ? 'edge' : 'interior', - id: uuid, - listeners: [ - { - role: 'normal', - host: '0.0.0.0', - port: messagingPort - } - ] + if (localAgentSecret) { + config.sslProfiles[`${uuid}-local-agent`] = { + CaCert: localAgentSecret.data['ca.crt'], + TlsCert: localAgentSecret.data['tls.crt'], + TlsKey: localAgentSecret.data['tls.key'], + name: `${uuid}-local-agent` + } } - // Conditionally add sslProfiles - if (sslProfile && tlsCert && tlsKey) { - microserviceConfig.sslProfiles = [ - { - name: sslProfile, - tlsCert: tlsCert, - tlsKey: tlsKey, - ...(caCert && { caCert }) // Add caCert if provided - } - ] + // Add default AMQP listener (internal) + config.listeners[`${uuid}-amqp`] = { + host: '0.0.0.0', + name: `${uuid}-amqp`, + port: 5672, + role: 'normal' } + // Add AMQPS listener + const amqpsListener = { + host: '0.0.0.0', + name: `${uuid}-amqps`, + port: messagingPort, + role: 'normal', + authenticatePeer: true, + saslMechanisms: 'EXTERNAL', + sslProfile: `${uuid}-local-server` + } + config.listeners[`${uuid}-amqps`] = amqpsListener + if (!isEdge) { - microserviceConfig.listeners.push( - { - role: 'inter-router', - host: '0.0.0.0', - port: interRouterPort, - ...(saslMechanisms && { saslMechanisms }), // Add saslMechanisms if provided - ...(authenticatePeer && { authenticatePeer }), // Add authenticatePeer if provided - ...(sslProfile && { sslProfile }), // Add sslProfile if provided - ...(requireSsl && { requireSsl }) // Add requireSsl if provided - }, - { - role: 'edge', - host: '0.0.0.0', - port: edgeRouterPort, - ...(saslMechanisms && { saslMechanisms }), // Add saslMechanisms if provided - ...(authenticatePeer && { authenticatePeer }), // Add authenticatePeer if provided - ...(sslProfile && { sslProfile }), // Add sslProfile if provided - ...(requireSsl && { requireSsl }) // Add requireSsl if provided - } - ) + // Add inter-router listener + const interRouterListener = { + host: '0.0.0.0', + name: `${uuid}-inter-router`, + port: interRouterPort, + role: 'inter-router', + authenticatePeer: true, + saslMechanisms: 'EXTERNAL', + sslProfile: `${uuid}-site-server` + } + config.listeners[`${uuid}-inter-router`] = interRouterListener + + // Add edge listener + const edgeListener = { + host: '0.0.0.0', + name: `${uuid}-edge`, + port: edgeRouterPort, + role: 'edge', + authenticatePeer: true, + saslMechanisms: 'EXTERNAL', + sslProfile: `${uuid}-site-server` + } + config.listeners[`${uuid}-edge`] = edgeListener } - return microserviceConfig + return config } async function getNetworkRouter (networkRouterId, transaction) { @@ -364,10 +499,10 @@ async function upsertDefaultRouter (routerData, transaction) { const createRouterData = { isEdge: false, - messagingPort: routerData.messagingPort || 5672, + messagingPort: routerData.messagingPort || 5671, host: routerData.host, - edgeRouterPort: routerData.edgeRouterPort || 56722, - interRouterPort: routerData.interRouterPort || 56721, + edgeRouterPort: routerData.edgeRouterPort || 45671, + interRouterPort: routerData.interRouterPort || 55671, isDefault: true } diff --git a/src/services/secret-service.js b/src/services/secret-service.js new file mode 100644 index 000000000..160847028 --- /dev/null +++ b/src/services/secret-service.js @@ -0,0 +1,136 @@ +/* + * ******************************************************************************* + * * Copyright (c) 2023 Datasance Teknoloji A.S. + * * + * * This program and the accompanying materials are made available under the + * * terms of the Eclipse Public License v. 2.0 which is available at + * * http://www.eclipse.org/legal/epl-2.0 + * * + * * SPDX-License-Identifier: EPL-2.0 + * ******************************************************************************* + * + */ + +const TransactionDecorator = require('../decorators/transaction-decorator') +const SecretManager = require('../data/managers/secret-manager') +const AppHelper = require('../helpers/app-helper') +const Errors = require('../helpers/errors') +const ErrorMessages = require('../helpers/error-messages') +const Validator = require('../schemas/index') + +function validateBase64 (value) { + try { + const decoded = Buffer.from(value, 'base64').toString('utf-8') + const reencoded = Buffer.from(decoded).toString('base64') + return reencoded === value + } catch (error) { + return false + } +} + +function validateSecretData (type, data) { + if (type === 'tls') { + const invalidKeys = Object.entries(data) + .filter(([_, value]) => !validateBase64(value)) + .map(([key]) => key) + + if (invalidKeys.length > 0) { + throw new Errors.ValidationError( + `Invalid base64 encoding for keys: ${invalidKeys.join(', ')}` + ) + } + } +} + +async function createSecretEndpoint (secretData, transaction) { + const validation = await Validator.validate(secretData, Validator.schemas.secretCreate) + if (!validation.valid) { + throw new Errors.ValidationError(validation.error) + } + + validateSecretData(secretData.type, secretData.data) + + const existingSecret = await SecretManager.findOne({ name: secretData.name }, transaction) + if (existingSecret) { + throw new Errors.ConflictError(AppHelper.formatMessage(ErrorMessages.SECRET_ALREADY_EXISTS, secretData.name)) + } + + const secret = await SecretManager.createSecret(secretData.name, secretData.type, secretData.data, transaction) + return { + id: secret.id, + name: secret.name, + type: secret.type, + created_at: secret.created_at, + updated_at: secret.updated_at + } +} + +async function updateSecretEndpoint (secretName, secretData, transaction) { + const validation = await Validator.validate(secretData, Validator.schemas.secretUpdate) + if (!validation.valid) { + throw new Errors.ValidationError(validation.error) + } + + const existingSecret = await SecretManager.findOne({ name: secretName }, transaction) + if (!existingSecret) { + throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.SECRET_NOT_FOUND, secretName)) + } + + validateSecretData(existingSecret.type, secretData.data) + + const secret = await SecretManager.updateSecret(secretName, secretData.data, transaction) + return { + id: secret.id, + name: secret.name, + type: secret.type, + created_at: secret.created_at, + updated_at: secret.updated_at + } +} + +async function getSecretEndpoint (secretName, transaction) { + const secret = await SecretManager.getSecret(secretName, transaction) + if (!secret) { + throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.SECRET_NOT_FOUND, secretName)) + } + + return { + id: secret.id, + name: secret.name, + type: secret.type, + data: secret.data, + created_at: secret.created_at, + updated_at: secret.updated_at + } +} + +async function listSecretsEndpoint (transaction) { + const secrets = await SecretManager.listSecrets(transaction) + return { + secrets: secrets.map(secret => ({ + id: secret.id, + name: secret.name, + type: secret.type, + created_at: secret.created_at, + updated_at: secret.updated_at + })) + } +} + +async function deleteSecretEndpoint (secretName, transaction) { + const existingSecret = await SecretManager.findOne({ name: secretName }, transaction) + if (!existingSecret) { + throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.SECRET_NOT_FOUND, secretName)) + } + + await SecretManager.deleteSecret(secretName, transaction) + return {} +} + +module.exports = { + createSecretEndpoint: TransactionDecorator.generateTransaction(createSecretEndpoint), + updateSecretEndpoint: TransactionDecorator.generateTransaction(updateSecretEndpoint), + getSecretEndpoint: TransactionDecorator.generateTransaction(getSecretEndpoint), + listSecretsEndpoint: TransactionDecorator.generateTransaction(listSecretsEndpoint), + deleteSecretEndpoint: TransactionDecorator.generateTransaction(deleteSecretEndpoint) +} diff --git a/src/services/yaml-parser-service.js b/src/services/yaml-parser-service.js index bdbf1ea50..aa33472c5 100644 --- a/src/services/yaml-parser-service.js +++ b/src/services/yaml-parser-service.js @@ -44,6 +44,45 @@ async function parseAppTemplateFile (fileContent) { return appTemplate } +async function parseSecretFile (fileContent, options = {}) { + try { + const doc = yaml.load(fileContent) + if (!doc || !doc.kind) { + throw new Errors.ValidationError(`Invalid YAML format: missing kind field`) + } + if (doc.kind !== 'Secret') { + throw new Errors.ValidationError(`Invalid kind ${doc.kind}`) + } + if (doc.metadata == null || doc.spec == null) { + throw new Errors.ValidationError('Invalid YAML format: missing metadata or spec') + } + + // If this is an update, validate that the name matches + if (options.isUpdate && options.secretName) { + if (doc.metadata.name !== options.secretName) { + throw new Errors.ValidationError(`Secret name in YAML (${doc.metadata.name}) doesn't match endpoint path (${options.secretName})`) + } + + // For updates, we only need the data + return { + data: doc.spec.data + } + } + + // For creates, return full object + return { + name: lget(doc, 'metadata.name', undefined), + type: doc.spec.type, + data: doc.spec.data + } + } catch (error) { + if (error instanceof Errors.ValidationError) { + throw error + } + throw new Errors.ValidationError(`Error parsing YAML: ${error.message}`) + } +} + const mapImages = (images) => { const imgs = [] if (images.x86 != null) { @@ -80,14 +119,15 @@ const parseMicroserviceImages = async (fileImages) => { const parseMicroserviceYAML = async (microservice) => { const { registryId, catalogItemId, images } = await parseMicroserviceImages(microservice.images) + const container = microservice.container || {} const microserviceData = { config: microservice.config != null ? JSON.stringify(microservice.config) : undefined, name: microservice.name, catalogItemId, agentName: lget(microservice, 'agent.name'), registryId, - ...microservice.container, - annotations: microservice.container.annotations != null ? JSON.stringify(microservice.container.annotations) : undefined, + ...container, + annotations: container.annotations != null ? JSON.stringify(container.annotations) : undefined, capAdd: lget(microservice, 'container.capAdd', []), capDrop: lget(microservice, 'container.capDrop', []), ports: (lget(microservice, 'container.ports', [])), @@ -140,8 +180,41 @@ async function parseMicroserviceFile (fileContent) { const _deleteUndefinedFields = (obj) => Object.keys(obj).forEach(key => obj[key] === undefined && delete obj[key]) +async function parseCertificateFile (fileContent) { + try { + const doc = yaml.load(fileContent) + if (!doc || !doc.kind) { + throw new Errors.ValidationError(`Invalid YAML format: missing kind field`) + } + if (doc.kind !== 'Certificate' && doc.kind !== 'CertificateAuthority') { + throw new Errors.ValidationError(`Invalid kind ${doc.kind}`) + } + if (doc.metadata == null || doc.spec == null) { + throw new Errors.ValidationError('Invalid YAML format: missing metadata or spec') + } + + const result = { + name: lget(doc, 'metadata.name', undefined), + ...doc.spec + } + + if (doc.kind === 'CertificateAuthority') { + result.isCA = true + } + + return result + } catch (error) { + if (error instanceof Errors.ValidationError) { + throw error + } + throw new Errors.ValidationError(`Error parsing YAML: ${error.message}`) + } +} + module.exports = { parseAppTemplateFile: parseAppTemplateFile, parseAppFile: parseAppFile, - parseMicroserviceFile: parseMicroserviceFile + parseMicroserviceFile: parseMicroserviceFile, + parseSecretFile: parseSecretFile, + parseCertificateFile: parseCertificateFile } diff --git a/src/utils/cert.js b/src/utils/cert.js new file mode 100644 index 000000000..91398b5f8 --- /dev/null +++ b/src/utils/cert.js @@ -0,0 +1,518 @@ +const forge = require('node-forge') +const k8sClient = require('./k8s-client') + +// Types for CA input +const CA_TYPES = { + K8S_SECRET: 'k8s-secret', + DIRECT: 'direct', + SELF_SIGNED: 'self-signed' +} + +/** + * Certificate Authority class + * Holds certificate, private key, and certificate data + */ +class CertificateAuthority { + constructor (certificate, key, crtData) { + this.certificate = certificate + this.key = key + this.crtData = crtData + } + + // Get certificate in PEM format + get certPem () { + return this.certificate + } +} + +/** + * CA Storage Format + * @typedef {Object} CAStorage + * @property {string} cert - PEM encoded certificate + * @property {string} key - PEM encoded private key + */ + +/** + * Validates a CA certificate and key pair + * @param {string} cert - PEM encoded certificate + * @param {string} key - PEM encoded private key + * @returns {boolean} - True if valid + * @throws {Error} - If validation fails + */ +async function validateCA (cert, key) { + try { + // Convert PEM to forge objects + const forgeCert = forge.pki.certificateFromPem(cert) + const forgeKey = forge.pki.privateKeyFromPem(key) + + // Extract public key from the certificate + const certPublicKey = forgeCert.publicKey + + // Create a message to test the keys + const md = forge.md.sha256.create() + md.update('test', 'utf8') + + // Sign with private key + const signature = forge.util.encode64( + forgeKey.sign(md) + ) + + // Verify with the certificate's public key + const verified = certPublicKey.verify( + md.digest().getBytes(), + forge.util.decode64(signature) + ) + + if (!verified) { + throw new Error('Private key does not match certificate') + } + + return true + } catch (error) { + throw new Error(`CA validation failed: ${error.message}`) + } +} + +/** + * Stores CA certificate and key to internal secret storage + * @param {CAStorage} ca - CA data to store + * @param {string} name - Name of the secret + * @returns {Promise} + */ +async function storeCA (ca, name) { + try { + // Ensure data is in base64 format for TLS secrets + const secretData = { + 'tls.crt': Buffer.from(ca.cert).toString('base64'), + 'tls.key': Buffer.from(ca.key).toString('base64'), + 'ca.crt': Buffer.from(ca.cert).toString('base64') + } + + const secret = { + name: name, + type: 'tls', + data: secretData + } + + // Use the secret service to store the CA + const SecretService = require('../services/secret-service') + await SecretService.createSecretEndpoint(secret) + } catch (error) { + throw new Error(`Failed to store CA: ${error.message}`) + } +} + +/** + * Loads CA certificate and key from internal secret storage + * @param {string} name - Name of the secret + * @returns {Promise} + */ +async function loadCA (name) { + try { + // Use SecretManager to get the secret with decryption handling + const SecretManager = require('../data/managers/secret-manager') + const fakeTransaction = { fakeTransaction: true } + + const secret = await SecretManager.getSecret(name, fakeTransaction) + if (!secret) { + throw new Error(`TLS secret with name ${name} not found`) + } + + if (secret.type !== 'tls') { + throw new Error(`Secret ${name} is not a TLS secret`) + } + + if (!secret.data || !secret.data['tls.crt'] || !secret.data['tls.key']) { + throw new Error(`Invalid TLS secret data for ${name}`) + } + + // Convert base64 data back to PEM format + return { + cert: Buffer.from(secret.data['tls.crt'], 'base64').toString(), + key: Buffer.from(secret.data['tls.key'], 'base64').toString() + } + } catch (error) { + throw new Error(`Failed to load CA: ${error.message}`) + } +} + +/** + * Generates a self-signed CA certificate + * @param {string} subject - CA subject name + * @param {number} expiration - Expiration time in milliseconds + * @returns {Promise} + */ +async function generateSelfSignedCA (subject, expiration = 5 * 365 * 24 * 60 * 60 * 1000) { + try { + // Generate RSA key pair + const keys = forge.pki.rsa.generateKeyPair(2048) + + // Create a certificate + const cert = forge.pki.createCertificate() + + // Set certificate fields + cert.publicKey = keys.publicKey + cert.serialNumber = forge.util.bytesToHex(forge.random.getBytesSync(16)) + + // Set validity period + const now = new Date() + cert.validity.notBefore = now + cert.validity.notAfter = new Date(now.getTime() + expiration) + + // Parse the subject string (format: /CN=Subject Name) + const subjectAttrs = [] + const issuerAttrs = [] + + // Extract CN from subject string + let commonName = subject + if (subject.startsWith('/CN=')) { + commonName = subject.substring(4) + } + + subjectAttrs.push({ name: 'commonName', value: commonName }) + issuerAttrs.push({ name: 'commonName', value: commonName }) + + cert.setSubject(subjectAttrs) + cert.setIssuer(issuerAttrs) // Self-signed, so issuer = subject + + // Add extensions for a CA certificate + cert.setExtensions([ + { + name: 'basicConstraints', + cA: true, + critical: true + }, + { + name: 'keyUsage', + keyCertSign: true, + cRLSign: true, + critical: true + }, + { + name: 'subjectKeyIdentifier' + } + ]) + + // Self-sign the certificate with SHA-256 + cert.sign(keys.privateKey, forge.md.sha256.create()) + + // Convert to PEM + const certPem = forge.pki.certificateToPem(cert) + const keyPem = forge.pki.privateKeyToPem(keys.privateKey) + + return { + cert: certPem, + key: keyPem + } + } catch (error) { + throw new Error(`Failed to generate certificate: ${error.message}`) + } +} + +// CA handling functions +async function getCAFromK8sSecret (secretName) { + try { + // Check that k8sClient is properly required and available + if (!k8sClient) { + throw new Error('Kubernetes client not available') + } + const secret = await k8sClient.getSecret(secretName) + if (!secret) { + return null + } + if (!secret.data) { + return null + } + if (!secret.data['tls.crt'] || !secret.data['tls.key']) { + return null + } + + const cert = Buffer.from(secret.data['tls.crt'], 'base64').toString() + const key = Buffer.from(secret.data['tls.key'], 'base64').toString() + + // Check if we need to register this CA in our local database + try { + // Use SecretManager to check if there's a local secret + const SecretManager = require('../data/managers/secret-manager') + const localSecret = await SecretManager.findOne({ name: secretName }, { fakeTransaction: true }) + + // If no local secret, we need to create one + if (!localSecret) { + // Store the CA in local secret storage + await storeCA({ cert, key }, secretName) + // Also create a certificate record + const CertificateManager = require('../data/managers/certificate-manager') + const forge = require('node-forge') + const forgeCert = forge.pki.certificateFromPem(cert) + // Extract subject + const subject = forgeCert.subject.getField('CN') ? forgeCert.subject.getField('CN').value : secretName + + // Create CA record + await CertificateManager.createCertificateRecord({ + name: secretName, + subject: subject, + isCA: true, + validFrom: forgeCert.validity.notBefore, + validTo: forgeCert.validity.notAfter, + serialNumber: forgeCert.serialNumber + }, { fakeTransaction: true }) + } + } catch (dbError) { + // Continue anyway - we at least have the cert/key + } + + return new CertificateAuthority( + cert, + key, + cert + ) + } catch (error) { + throw new Error(`Failed to get CA from Kubernetes secret: ${error.message}`) + } +} + +async function getCAFromDirect (ca) { + if (!ca.cert || !ca.key) { + throw new Error('CA must provide both certificate and private key in PEM format') + } + + try { + // Validate the CA + await validateCA(ca.cert, ca.key) + + return new CertificateAuthority(ca.cert, ca.key, ca.cert) + } catch (error) { + throw new Error(`failed to get CA from direct input: ${error.message}`) + } +} + +async function getCAFromInput (ca) { + if (!ca) { + return null + } + + // Normalize CA type to lowercase for case-insensitive matching + const caType = ca.type ? ca.type.toLowerCase() : '' + + switch (caType) { + case CA_TYPES.K8S_SECRET.toLowerCase(): + return getCAFromK8sSecret(ca.secretName) + case CA_TYPES.DIRECT.toLowerCase(): + if (ca.secretName) { + // If secretName is provided, load from internal secret storage + const caData = await loadCA(ca.secretName) + return getCAFromDirect(caData) + } + return getCAFromDirect(ca) + case CA_TYPES.SELF_SIGNED.toLowerCase(): + return null + default: + throw new Error(`unknown CA type: ${caType}. Expected one of: ${Object.values(CA_TYPES).join(', ')}`) + } +} + +/** + * Main certificate generation function + * @param {Object} params - Certificate parameters + * @returns {Promise} - Certificate data + */ +async function generateCertificate ({ + name, + subject, + hosts, + expiration = 5 * 365 * 24 * 60 * 60 * 1000, + ca, + isRenewal = false +}) { + try { + const caCert = await getCAFromInput(ca) + + // Generate RSA key pair + const keys = forge.pki.rsa.generateKeyPair(2048) + + // Create a certificate + const cert = forge.pki.createCertificate() + + // Set certificate fields + cert.publicKey = keys.publicKey + cert.serialNumber = forge.util.bytesToHex(forge.random.getBytesSync(16)) + + // Set validity period + const now = new Date() + cert.validity.notBefore = now + cert.validity.notAfter = new Date(now.getTime() + expiration) + + // Parse the subject string (format: /CN=Subject Name) + const subjectAttrs = [] + + // Extract CN from subject string + let commonName = subject + if (subject.startsWith('/CN=')) { + commonName = subject.substring(4) + } + + subjectAttrs.push({ name: 'commonName', value: commonName }) + cert.setSubject(subjectAttrs) + + // Process hosts for Subject Alternative Names + const hostsList = hosts ? hosts.split(',').map(h => h.trim()) : [] + const altNames = [] + + for (const host of hostsList) { + if (host.match(/^(\d{1,3}\.){3}\d{1,3}$/)) { + // IP address + altNames.push({ type: 7, ip: host }) + } else { + // DNS name + altNames.push({ type: 2, value: host }) + } + } + + // Set up the certificate based on whether we have a CA or not + if (caCert) { + // If we have a CA, use it to sign the certificate + const caForgeCert = forge.pki.certificateFromPem(caCert.certPem || caCert.crtData) + const caForgeKey = forge.pki.privateKeyFromPem(caCert.key) + + // Set the issuer from the CA + cert.setIssuer(caForgeCert.subject.attributes) + + // Add extensions for a server certificate + cert.setExtensions([ + { + name: 'basicConstraints', + cA: false, + critical: true + }, + { + name: 'keyUsage', + digitalSignature: true, + keyEncipherment: true, + critical: true + }, + { + name: 'extKeyUsage', + serverAuth: true, + clientAuth: true + }, + { + name: 'subjectAltName', + altNames: altNames + }, + { + name: 'authorityKeyIdentifier', + authorityCertIssuer: true, + serialNumber: caForgeCert.serialNumber + } + ]) + + // Sign the certificate with the CA's private key + cert.sign(caForgeKey, forge.md.sha256.create()) + } else { + // Self-signed certificate + cert.setIssuer(subjectAttrs) + + // Add extensions for a self-signed server certificate + cert.setExtensions([ + { + name: 'basicConstraints', + cA: false, + critical: true + }, + { + name: 'keyUsage', + digitalSignature: true, + keyEncipherment: true, + critical: true + }, + { + name: 'extKeyUsage', + serverAuth: true, + clientAuth: true + }, + { + name: 'subjectAltName', + altNames: altNames + }, + { + name: 'subjectKeyIdentifier' + } + ]) + + // Self-sign the certificate + cert.sign(keys.privateKey, forge.md.sha256.create()) + } + + // Convert to PEM + const certPem = forge.pki.certificateToPem(cert) + const keyPem = forge.pki.privateKeyToPem(keys.privateKey) + + // Store the certificate as a TLS secret + const secretData = { + 'tls.crt': Buffer.from(certPem).toString('base64'), + 'tls.key': Buffer.from(keyPem).toString('base64'), + 'ca.crt': Buffer.from(caCert ? caCert.certPem || caCert.crtData : certPem).toString('base64') + } + + const secret = { + name: name, + type: 'tls', + data: secretData + } + + // Use the secret service to store the certificate + const SecretService = require('../services/secret-service') + + if (isRenewal) { + // For renewals, delete the existing secret first + try { + await SecretService.deleteSecretEndpoint(name) + } catch (error) { + // If the secret doesn't exist, that's okay, just continue + if (error.name !== 'NotFoundError') { + throw error + } + } + } + + // Create new secret with certificate data + await SecretService.createSecretEndpoint(secret) + + return { + cert: certPem, + key: keyPem, + ca: caCert ? caCert.crtData : certPem + } + } catch (error) { + throw error + } +} + +function decodeCertificate (data) { + try { + const cert = forge.pki.certificateFromPem(data) + return { + subject: cert.subject.getField('CN').value, + issuer: cert.issuer.getField('CN').value, + validFrom: cert.validity.notBefore, + validTo: cert.validity.notAfter, + serialNumber: cert.serialNumber, + extensions: cert.extensions + } + } catch (error) { + throw new Error(`Failed to decode certificate: ${error.message}`) + } +} + +module.exports = { + CA_TYPES, + CertificateAuthority, + generateCertificate, + decodeCertificate, + generateSelfSignedCA, + storeCA, + loadCA, + validateCA, + getCAFromDirect, + getCAFromK8sSecret +} diff --git a/src/utils/k8s-client.js b/src/utils/k8s-client.js new file mode 100644 index 000000000..e84afda13 --- /dev/null +++ b/src/utils/k8s-client.js @@ -0,0 +1,153 @@ +const logger = require('../logger') +let k8sApi = null + +async function initializeK8sClient () { + if (!k8sApi) { + logger.debug('Initializing Kubernetes client') + const k8s = require('@kubernetes/client-node') + const kubeConfig = new k8s.KubeConfig() + + // Use the in-cluster configuration + kubeConfig.loadFromCluster() + k8sApi = kubeConfig.makeApiClient(k8s.CoreV1Api) + logger.info('Kubernetes client initialized successfully') + } + return k8sApi +} + +async function getSecret (secretName, namespace) { + logger.debug(`Getting secret: ${secretName} in namespace: ${namespace}`) + try { + const api = await initializeK8sClient() + const response = await api.readNamespacedSecret(secretName, namespace) + logger.info(`Successfully retrieved secret: ${secretName}`) + return response.body + } catch (error) { + logger.error(`Failed to get secret ${secretName}: ${error.message}`) + throw error + } +} + +// ConfigMap methods +async function getConfigMap (configMapName, namespace) { + logger.debug(`Getting ConfigMap: ${configMapName} in namespace: ${namespace}`) + try { + const api = await initializeK8sClient() + const response = await api.readNamespacedConfigMap(configMapName, namespace) + logger.info(`Successfully retrieved ConfigMap: ${configMapName}`) + return response.body + } catch (error) { + logger.error(`Failed to get ConfigMap ${configMapName}: ${error.message}`) + throw error + } +} + +async function patchConfigMap (configMapName, namespace, patchData) { + logger.debug(`Patching ConfigMap: ${configMapName} in namespace: ${namespace}`) + try { + const api = await initializeK8sClient() + // Pass all options in one object - much cleaner than multiple undefined parameters + const response = await api.patchNamespacedConfigMap( + configMapName, + namespace, + patchData, + { + headers: { 'Content-Type': 'application/strategic-merge-patch+json' } + } + ) + logger.info(`Successfully patched ConfigMap: ${configMapName}`) + return response.body + } catch (error) { + logger.error(`Failed to patch ConfigMap ${configMapName}: ${error.message}`) + throw error + } +} + +// Service methods +async function getNamespacedServices (namespace) { + logger.debug(`Listing services in namespace: ${namespace}`) + try { + const api = await initializeK8sClient() + const response = await api.listNamespacedService(namespace) + logger.info(`Successfully retrieved ${response.body.items.length} services in namespace: ${namespace}`) + return response.body + } catch (error) { + logger.error(`Failed to list services in namespace ${namespace}: ${error.message}`) + throw error + } +} + +async function createService (namespace, serviceSpec) { + logger.debug(`Creating service in namespace: ${namespace}`) + try { + const api = await initializeK8sClient() + const response = await api.createNamespacedService(namespace, serviceSpec) + logger.info(`Successfully created service: ${response.body.metadata.name} in namespace: ${namespace}`) + return response.body + } catch (error) { + logger.error(`Failed to create service in namespace ${namespace}: ${error.message}`) + throw error + } +} + +async function deleteService (serviceName, namespace) { + logger.debug(`Deleting service: ${serviceName} in namespace: ${namespace}`) + try { + const api = await initializeK8sClient() + const response = await api.deleteNamespacedService(serviceName, namespace) + logger.info(`Successfully deleted service: ${serviceName} from namespace: ${namespace}`) + return response.body + } catch (error) { + logger.error(`Failed to delete service ${serviceName}: ${error.message}`) + throw error + } +} + +/** + * Gets the LoadBalancer IP for a service if it exists + * @param {string} serviceName - The name of the service + * @param {string} namespace - The namespace of the service + * @returns {Promise} The LoadBalancer IP or null if not available + */ +async function watchLoadBalancerIP (serviceName, namespace) { + logger.debug(`Checking LoadBalancer IP for service: ${serviceName} in namespace: ${namespace}`) + const api = await initializeK8sClient() + try { + const response = await api.readNamespacedService(serviceName, namespace) + const service = response.body + + // Check if the service type is LoadBalancer + if (service.spec && service.spec.type === 'LoadBalancer') { + // Check if the LoadBalancer IP exists + if (service.status && + service.status.loadBalancer && + service.status.loadBalancer.ingress && + service.status.loadBalancer.ingress.length > 0) { + const ip = service.status.loadBalancer.ingress[0].ip + if (ip) { + logger.info(`Found LoadBalancer IP: ${ip} for service: ${serviceName}`) + return ip + } + } + logger.info(`Service ${serviceName} is LoadBalancer type but IP not yet assigned`) + } else { + const serviceType = service.spec && service.spec.type ? service.spec.type : 'unknown' + logger.info(`Service ${serviceName} is not of type LoadBalancer (type: ${serviceType})`) + } + // Return null if the service is not a LoadBalancer or IP is not yet assigned + return null + } catch (error) { + logger.error(`Error getting LoadBalancer IP for service ${serviceName}: ${error.message}`) + return null + } +} + +module.exports = { + getSecret, + getConfigMap, + patchConfigMap, + getNamespacedServices, + createService, + deleteService, + watchLoadBalancerIP +} From 2ccb64ed0925d6d6a74c8203e0a810c451d8d85c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emirhan=20Durmu=C5=9F?= Date: Wed, 4 Jun 2025 01:29:11 +0300 Subject: [PATCH 154/178] secret, certificate, volumemount, configmap endpoints and logic added, microservice execenabled added, k8s handler fixed --- docs/swagger.yaml | 1222 ++++++++++++++-- package-lock.json | 66 +- package.json | 4 +- src/config/controller.yaml | 21 +- src/config/env-mapping.js | 14 +- src/config/index.js | 14 +- src/controllers/agent-controller.js | 5 + src/controllers/config-map-controller.js | 66 + src/controllers/iofog-controller.js | 5 +- src/controllers/microservices-controller.js | 27 +- src/controllers/service-controller.js | 66 + src/controllers/volume-mount-controller.js | 71 + src/data/constants.js | 3 +- src/data/managers/config-map-manager.js | 54 + .../managers/iofog-access-token-manager.js | 36 - .../managers/microservice-port-manager.js | 16 - .../microservice-public-port-manager.js | 25 - src/data/managers/service-manager.js | 90 ++ src/data/managers/volume-mounting-manager.js | 62 + .../mysql/db_migration_mysql_v1.0.2.sql | 103 +- .../postgres/db_migration_pg_v1.0.2.sql | 93 +- .../sqlite/db_migration_sqlite_v1.0.2.sql | 78 +- src/data/models/changetracking.js | 10 + src/data/models/configMap.js | 77 + src/data/models/fog.js | 61 +- src/data/models/fogVolumeMounts.js | 9 + src/data/models/fogaccesstoken.js | 41 - src/data/models/index.js | 1 - src/data/models/microservice.js | 20 + src/data/models/microserviceExtraHost.js | 3 - src/data/models/microservicePublicPort.js | 88 -- src/data/models/microserviceenv.js | 8 + src/data/models/microserviceport.js | 13 - src/data/models/microservicestatus.js | 5 + src/data/models/service.js | 93 ++ src/data/models/serviceTags.js | 9 + src/data/models/tags.js | 1 + src/data/models/volumeMount.js | 43 + src/data/providers/database-provider.js | 48 +- src/data/providers/mysql.js | 14 +- .../seeders/mysql/db_seeder_mysql_v1.0.2.sql | 7 +- .../seeders/postgres/db_seeder_pg_v1.0.2.sql | 7 +- .../sqlite/db_seeder_sqlite_v1.0.2.sql | 7 +- src/enums/fog-state.js | 8 +- src/helpers/app-helper.js | 6 + src/helpers/error-messages.js | 19 +- src/helpers/template-helper.js | 4 +- src/jobs/fog-status-job.js | 5 +- src/routes/agent.js | 25 + src/routes/configMap.js | 246 ++++ src/routes/microservices.js | 184 ++- src/routes/secret.js | 4 +- src/routes/service.js | 274 ++++ src/routes/volumeMount.js | 312 ++++ src/schemas/agent.js | 13 +- src/schemas/certificate.js | 9 +- src/schemas/config-map.js | 66 + src/schemas/iofog.js | 4 + src/schemas/microservice.js | 49 +- src/schemas/service.js | 108 ++ src/schemas/utils/utils.js | 1 + src/schemas/volume-mount.js | 91 ++ src/server.js | 12 +- src/services/agent-service.js | 101 +- src/services/certificate-service.js | 94 +- src/services/change-tracking-service.js | 10 +- src/services/config-map-service.js | 127 ++ src/services/iofog-access-token-service.js | 53 - src/services/iofog-service.js | 662 +++++++-- .../microservice-ports/microservice-port.js | 211 +++ src/services/microservices-service.js | 336 ++++- src/services/router-service.js | 64 +- src/services/secret-service.js | 16 + src/services/services-service.js | 1209 ++++++++++++++++ src/services/volume-mount-service.js | 196 +++ src/services/yaml-parser-service.js | 152 +- src/utils/cert.js | 62 +- src/utils/k8s-client.js | 211 ++- src/utils/ssl-utils.js | 7 +- test/backup/iofog-service.js | 1250 ++++++++++++++++ test/backup/services-service.js | 1261 +++++++++++++++++ 81 files changed, 9198 insertions(+), 970 deletions(-) create mode 100644 src/controllers/config-map-controller.js create mode 100644 src/controllers/service-controller.js create mode 100644 src/controllers/volume-mount-controller.js create mode 100644 src/data/managers/config-map-manager.js delete mode 100644 src/data/managers/iofog-access-token-manager.js delete mode 100644 src/data/managers/microservice-public-port-manager.js create mode 100644 src/data/managers/service-manager.js create mode 100644 src/data/managers/volume-mounting-manager.js create mode 100644 src/data/models/configMap.js create mode 100644 src/data/models/fogVolumeMounts.js delete mode 100644 src/data/models/fogaccesstoken.js delete mode 100644 src/data/models/microservicePublicPort.js create mode 100644 src/data/models/service.js create mode 100644 src/data/models/serviceTags.js create mode 100644 src/data/models/volumeMount.js create mode 100644 src/routes/configMap.js create mode 100644 src/routes/service.js create mode 100644 src/routes/volumeMount.js create mode 100644 src/schemas/config-map.js create mode 100644 src/schemas/service.js create mode 100644 src/schemas/volume-mount.js create mode 100644 src/services/config-map-service.js delete mode 100644 src/services/iofog-access-token-service.js create mode 100644 src/services/microservice-ports/microservice-port.js create mode 100644 src/services/services-service.js create mode 100644 src/services/volume-mount-service.js create mode 100644 test/backup/iofog-service.js create mode 100644 test/backup/services-service.js diff --git a/docs/swagger.yaml b/docs/swagger.yaml index 28aaad1a1..622c9514c 100755 --- a/docs/swagger.yaml +++ b/docs/swagger.yaml @@ -2271,6 +2271,120 @@ paths: description: Not Found "500": description: Internal Server Error + "/microservices/{uuid}/exec": + post: + tags: + - Microservices + summary: Enables a exec for microservice + operationId: enableMicroserviceExec + parameters: + - in: path + name: uuid + description: Microservice UUID + required: true + schema: + type: string + security: + - userToken: [] + responses: + "201": + description: Created + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + "401": + description: Not Authorized + "404": + description: Invalid Microservice UUID + "500": + description: Internal Server Error + delete: + tags: + - Microservices + summary: Disables a exec for microservice + operationId: disableMicroserviceExec + parameters: + - in: path + name: uuid + description: Microservice UUID + required: true + schema: + type: string + security: + - userToken: [] + responses: + "204": + description: Success + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + "401": + description: Not Authorized + "404": + description: Invalid Microservice UUID + "500": + description: Internal Server Error + "/microservices/system/{uuid}/exec": + post: + tags: + - Microservices + summary: Enables a exec for system microservice + operationId: enableSystemMicroserviceExec + parameters: + - in: path + name: uuid + description: Microservice UUID + required: true + schema: + type: string + security: + - userToken: [] + responses: + "201": + description: Created + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + "401": + description: Not Authorized + "404": + description: Invalid Microservice UUID + "500": + description: Internal Server Error + delete: + tags: + - Microservices + summary: Disables a exec for system microservice + operationId: disableSystemMicroserviceExec + parameters: + - in: path + name: uuid + description: Microservice UUID + required: true + schema: + type: string + security: + - userToken: [] + responses: + "204": + description: Success + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + "401": + description: Not Authorized + "404": + description: Invalid Microservice UUID + "500": + description: Internal Server Error "/microservices/{uuid}/image-snapshot": post: tags: @@ -3258,7 +3372,7 @@ paths: description: Secret Not Found "500": description: Internal Server Error - put: + patch: tags: - Secrets summary: Updates an existing secret @@ -3349,7 +3463,7 @@ paths: "500": description: Internal Server Error "/secrets/yaml/{name}": - put: + patch: tags: - Secrets summary: Updates an existing secret using YAML @@ -3550,86 +3664,819 @@ paths: parameters: - in: path name: name - description: Certificate name + description: Certificate name + required: true + schema: + type: string + security: + - userToken: [] + responses: + '200': + description: Success + '401': + description: Unauthorized + '404': + description: Certificate not found + '500': + description: Internal Server Error + + /certificates/{name}/renew: + post: + tags: + - Certificates + summary: Renew a certificate + operationId: renewCertificate + parameters: + - in: path + name: name + description: Certificate name + required: true + schema: + type: string + security: + - userToken: [] + responses: + '200': + description: Success + content: + application/json: + schema: + $ref: "#/components/schemas/CertificateRenewResponse" + '400': + description: Bad Request + '401': + description: Unauthorized + '404': + description: Certificate not found + '500': + description: Internal Server Error + /certificates/yaml: + post: + tags: + - Certificates + summary: Create a certificate or CA from YAML file + operationId: createCertificateFromYAML + security: + - userToken: [] + requestBody: + content: + multipart/form-data: + schema: + type: object + properties: + certificate: + type: string + format: binary + responses: + '201': + description: Created + content: + application/json: + schema: + oneOf: + - $ref: "#/components/schemas/CAResponse" + - $ref: "#/components/schemas/CertificateResponse" + '400': + description: Bad Request + '401': + description: Unauthorized + '404': + description: Not Found - Referenced CA not found + '409': + description: Conflict - Certificate or CA already exists + /services: + get: + tags: + - Services + summary: Gets list of services + operationId: getServicesList + security: + - userToken: [] + responses: + "200": + description: Success + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + content: + application/json: + schema: + type: array + items: + $ref: "#/components/schemas/Service" + "401": + description: Not Authorized + "500": + description: Internal Server Error + post: + tags: + - Services + summary: Creates a new service + operationId: createService + security: + - userToken: [] + requestBody: + required: true + content: + application/json: + schema: + $ref: "#/components/schemas/Service" + responses: + "201": + description: Created + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + content: + application/json: + schema: + $ref: "#/components/schemas/Service" + "400": + description: Bad Request + "401": + description: Not Authorized + "409": + description: Duplicate Name + "500": + description: Internal Server Error + /services/{name}: + get: + tags: + - Services + summary: Gets a service info + operationId: getServiceInfo + parameters: + - in: path + name: name + description: Service name + required: true + schema: + type: string + security: + - userToken: [] + responses: + "200": + description: Success + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + content: + application/json: + schema: + $ref: "#/components/schemas/Service" + "401": + description: Not Authorized + "404": + description: Not Found + "500": + description: Internal Server Error + delete: + tags: + - Services + summary: Deletes a service + operationId: deleteService + parameters: + - in: path + name: name + description: Service name + required: true + schema: + type: string + security: + - userToken: [] + responses: + "204": + description: Success + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + "401": + description: Not Authorized + "404": + description: Not Found + "500": + description: Internal Server Error + patch: + tags: + - Services + summary: Patches a service + operationId: patchService + parameters: + - in: path + name: name + description: Service name + required: true + schema: + type: string + security: + - userToken: [] + requestBody: + required: true + content: + application/json: + schema: + $ref: "#/components/schemas/Service" + responses: + "200": + description: Success + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + content: + application/json: + schema: + $ref: "#/components/schemas/Service" + "400": + description: Bad Request + "401": + description: Not Authorized + "404": + description: Not Found + "500": + description: Internal Server Error + /services/yaml: + post: + tags: + - Services + summary: Creates a new service from YAML + operationId: createServiceYAML + security: + - userToken: [] + requestBody: + required: true + content: + multipart/form-data: + schema: + type: object + properties: + service: + type: string + format: binary + responses: + "201": + description: Created + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + content: + application/json: + schema: + type: object + properties: + id: + type: number + name: + type: string + type: + type: string + resource: + type: string + targetPort: + type: number + defaultBridge: + type: string + bridgePort: + type: number + updatedAt: + type: string + format: date-time + createdAt: + type: string + format: date-time + "400": + description: Bad Request + "401": + description: Not Authorized + "409": + description: Duplicate Name + "500": + description: Internal Server Error + "/services/yaml/{name}": + patch: + tags: + - Services + summary: Updates a service using YAML + operationId: updateServiceYAML + parameters: + - in: path + name: name + description: Service name + required: true + schema: + type: string + security: + - userToken: [] + requestBody: + required: true + content: + multipart/form-data: + schema: + type: object + properties: + service: + type: string + format: binary + responses: + "200": + description: Success + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + content: + application/json: + schema: + $ref: "#/components/schemas/Service" + "400": + description: Bad Request + "401": + description: Not Authorized + "404": + description: Not Found + "500": + description: Internal Server Error + /configmaps: + post: + tags: + - ConfigMap + summary: Creates a new ConfigMap + operationId: createConfigMap + security: + - userToken: [] + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/ConfigMapCreate" + responses: + "201": + description: Created + content: + application/json: + schema: + $ref: "#/components/schemas/ConfigMapResponse" + "400": + description: Bad Request + "401": + description: Not Authorized + "409": + description: ConfigMap Already Exists + "500": + description: Internal Server Error + get: + tags: + - ConfigMap + summary: Lists all ConfigMaps + operationId: listConfigMaps + security: + - userToken: [] + responses: + "200": + description: Success + content: + application/json: + schema: + $ref: "#/components/schemas/ConfigMapListResponse" + "401": + description: Not Authorized + "500": + description: Internal Server Error + /configmaps/yaml: + post: + tags: + - ConfigMap + summary: Creates a new ConfigMap from YAML + operationId: createConfigMapFromYaml + security: + - userToken: [] + requestBody: + content: + multipart/form-data: + schema: + type: object + properties: + configMap: + type: string + format: binary + responses: + "201": + description: Created + content: + application/json: + schema: + $ref: "#/components/schemas/ConfigMapResponse" + "400": + description: Bad Request + "401": + description: Not Authorized + "409": + description: ConfigMap Already Exists + "500": + description: Internal Server Error + /configmaps/{name}: + get: + tags: + - ConfigMap + summary: Gets a ConfigMap by name + operationId: getConfigMap + security: + - userToken: [] + parameters: + - in: path + name: name + required: true + schema: + type: string + responses: + "200": + description: Success + content: + application/json: + schema: + $ref: "#/components/schemas/ConfigMapResponse" + "401": + description: Not Authorized + "404": + description: ConfigMap Not Found + "500": + description: Internal Server Error + patch: + tags: + - ConfigMap + summary: Updates a ConfigMap + operationId: updateConfigMap + security: + - userToken: [] + parameters: + - in: path + name: name + required: true + schema: + type: string + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/ConfigMapUpdate" + responses: + "200": + description: Success + content: + application/json: + schema: + $ref: "#/components/schemas/ConfigMapResponse" + "400": + description: Bad Request + "401": + description: Not Authorized + "404": + description: ConfigMap Not Found + "500": + description: Internal Server Error + delete: + tags: + - ConfigMap + summary: Deletes a ConfigMap + operationId: deleteConfigMap + security: + - userToken: [] + parameters: + - in: path + name: name + required: true + schema: + type: string + responses: + "200": + description: Success + "401": + description: Not Authorized + "404": + description: ConfigMap Not Found + "500": + description: Internal Server Error + /configmaps/yaml/{name}: + patch: + tags: + - ConfigMap + summary: Updates a ConfigMap from YAML + operationId: updateConfigMapFromYaml + security: + - userToken: [] + parameters: + - in: path + name: name + required: true + schema: + type: string + requestBody: + content: + multipart/form-data: + schema: + type: object + properties: + configMap: + type: string + format: binary + responses: + "200": + description: Success + content: + application/json: + schema: + $ref: "#/components/schemas/ConfigMapResponse" + "400": + description: Bad Request + "401": + description: Not Authorized + "404": + description: ConfigMap Not Found + "500": + description: Internal Server Error + /volumeMounts: + get: + tags: + - VolumeMounts + summary: Returns list of volume mounts + operationId: listVolumeMounts + security: + - userToken: [] + responses: + "200": + description: List of volume mounts + content: + application/json: + schema: + type: array + items: + $ref: "#/components/schemas/VolumeMount" + "401": + description: Not Authorized + "500": + description: Internal Server Error + post: + tags: + - VolumeMounts + summary: Creates a new volume mount + operationId: createVolumeMount + security: + - userToken: [] + requestBody: + required: true + content: + application/json: + schema: + $ref: "#/components/schemas/VolumeMountCreate" + responses: + "200": + description: Created + content: + application/json: + schema: + $ref: "#/components/schemas/VolumeMount" + "400": + description: Bad Request + "401": + description: Not Authorized + "500": + description: Internal Server Error + + /volumeMounts/yaml: + post: + tags: + - VolumeMounts + summary: Creates a new volume mount from YAML + operationId: createVolumeMountYaml + security: + - userToken: [] + requestBody: + required: true + content: + application/x-yaml: + schema: + type: string + responses: + "200": + description: Created + content: + application/json: + schema: + $ref: "#/components/schemas/VolumeMount" + "400": + description: Bad Request + "401": + description: Not Authorized + "500": + description: Internal Server Error + + "/volumeMounts/{name}": + get: + tags: + - VolumeMounts + summary: Gets volume mount info + operationId: getVolumeMount + parameters: + - in: path + name: name + description: Volume mount name + required: true + schema: + type: string + security: + - userToken: [] + responses: + "200": + description: Success + content: + application/json: + schema: + $ref: "#/components/schemas/VolumeMount" + "401": + description: Not Authorized + "404": + description: Not Found + "500": + description: Internal Server Error + patch: + tags: + - VolumeMounts + summary: Updates existing volume mount + operationId: updateVolumeMount + parameters: + - in: path + name: name + description: Volume mount name + required: true + schema: + type: string + security: + - userToken: [] + requestBody: + required: true + content: + application/json: + schema: + $ref: "#/components/schemas/VolumeMountUpdate" + responses: + "200": + description: Updated + content: + application/json: + schema: + $ref: "#/components/schemas/VolumeMount" + "400": + description: Bad Request + "401": + description: Not Authorized + "404": + description: Not Found + "500": + description: Internal Server Error + delete: + tags: + - VolumeMounts + summary: Deletes a volume mount + operationId: deleteVolumeMount + parameters: + - in: path + name: name + description: Volume mount name + required: true + schema: + type: string + security: + - userToken: [] + responses: + "202": + description: Accepted + "401": + description: Not Authorized + "404": + description: Not Found + "500": + description: Internal Server Error + + "/volumeMounts/yaml/{name}": + patch: + tags: + - VolumeMounts + summary: Updates existing volume mount from YAML + operationId: updateVolumeMountYaml + parameters: + - in: path + name: name + description: Volume mount name required: true schema: type: string security: - userToken: [] + requestBody: + required: true + content: + application/x-yaml: + schema: + type: string responses: - '200': - description: Success - '401': - description: Unauthorized - '404': - description: Certificate not found - '500': + "200": + description: Updated + content: + application/json: + schema: + $ref: "#/components/schemas/VolumeMount" + "400": + description: Bad Request + "401": + description: Not Authorized + "404": + description: Not Found + "500": description: Internal Server Error - - /certificates/{name}/renew: + + "/volumeMounts/{name}/link": post: tags: - - Certificates - summary: Renew a certificate - operationId: renewCertificate + - VolumeMounts + summary: Links volume mount to fog nodes + operationId: linkVolumeMount parameters: - in: path name: name - description: Certificate name + description: Volume mount name required: true schema: type: string security: - userToken: [] + requestBody: + required: true + content: + application/json: + schema: + $ref: "#/components/schemas/VolumeMountLink" responses: - '200': + "200": description: Success content: application/json: schema: - $ref: "#/components/schemas/CertificateRenewResponse" - '400': + $ref: "#/components/schemas/VolumeMount" + "400": description: Bad Request - '401': - description: Unauthorized - '404': - description: Certificate not found - '500': + "401": + description: Not Authorized + "404": + description: Not Found + "500": description: Internal Server Error - /certificates/yaml: - post: + delete: tags: - - Certificates - summary: Create a certificate or CA from YAML file - operationId: createCertificateFromYAML + - VolumeMounts + summary: Unlinks volume mount from fog nodes + operationId: unlinkVolumeMount + parameters: + - in: path + name: name + description: Volume mount name + required: true + schema: + type: string security: - userToken: [] requestBody: + required: true content: - multipart/form-data: + application/json: schema: - type: object - properties: - certificate: - type: string - format: binary + $ref: "#/components/schemas/VolumeMountUnlink" responses: - '201': - description: Created + "200": + description: Success content: application/json: schema: - oneOf: - - $ref: "#/components/schemas/CAResponse" - - $ref: "#/components/schemas/CertificateResponse" - '400': + $ref: "#/components/schemas/VolumeMount" + "400": description: Bad Request - '401': - description: Unauthorized - '404': - description: Not Found - Referenced CA not found - '409': - description: Conflict - Certificate or CA already exists + "401": + description: Not Authorized + "404": + description: Not Found + "500": + description: Internal Server Error tags: - name: Controller description: Manage your controller @@ -3661,6 +4508,12 @@ tags: description: Manage your secrets - name: Certificates description: Manage your certificates + - name: Services + description: Manage your services + - name: VolumeMounts + description: Manage your volume mounts + - name: ConfigMap + description: Manage your config maps servers: - url: http://localhost:51121/api/v3 components: @@ -4231,6 +5084,10 @@ components: type: string dockerUrl: type: string + containerEngine: + type: string + deploymentType: + type: string diskLimit: type: number diskDirectory: @@ -4307,6 +5164,12 @@ components: dockerUrl: type: string default: unix:///var/run/docker.sock + containerEngine: + type: string + default: docker + deploymentType: + type: string + default: native diskLimit: type: number default: 50 @@ -4470,6 +5333,10 @@ components: type: string dockerUrl: type: string + containerEngine: + type: string + deploymentType: + type: string diskLimit: type: number diskDirectory: @@ -4513,6 +5380,10 @@ components: type: string dockerUrl: type: string + containerEngine: + type: string + deploymentType: + type: string diskLimit: type: number diskDirectory: @@ -4787,31 +5658,6 @@ components: enum: - tcp - udp - public: - type: object - properties: - enabled: - type: boolean - schemes: - type: array - items: - type: string - protocol: - type: string - enum: - - tcp - - http - router: - type: object - properties: - host: - type: string - port: - type: number - required: [] - required: - - schemes - - protocol required: - internal - external @@ -4828,31 +5674,6 @@ components: enum: - tcp - udp - public: - type: object - properties: - enabled: - type: boolean - schemes: - type: array - items: - type: string - protocol: - type: string - enum: - - tcp - - http - router: - type: object - properties: - host: - type: string - port: - type: number - required: [] - required: - - schemes - - protocol required: - internal - external @@ -4868,31 +5689,6 @@ components: enum: - tcp - udp - public: - type: object - properties: - enabled: - type: boolean - schemes: - type: array - items: - type: string - protocol: - type: string - enum: - - tcp - - http - router: - type: object - properties: - host: - type: string - port: - type: number - required: [] - required: - - schemes - - protocol required: - internal - external @@ -4916,31 +5712,6 @@ components: enum: - tcp - udp - public: - type: object - properties: - enabled: - type: boolean - schemes: - type: array - items: - type: string - protocol: - type: string - enum: - - tcp - - http - router: - type: object - properties: - host: - type: string - port: - type: number - required: [] - required: - - schemes - - protocol required: - internal - external @@ -5820,4 +6591,159 @@ components: description: New validity end date renewed: type: boolean - description: True if certificate was successfully renewed \ No newline at end of file + description: True if certificate was successfully renewed + Service: + type: object + properties: + name: + type: string + type: + type: string + resource: + type: string + defaultBridge: + type: string + bridgePort: + type: number + targetPort: + type: number + tags: + type: array + items: + type: string + ConfigMapCreate: + type: object + required: + - name + - data + properties: + name: + type: string + minLength: 1 + maxLength: 255 + data: + type: object + ConfigMapUpdate: + type: object + required: + - data + properties: + data: + type: object + ConfigMapResponse: + type: object + required: + - id + - name + - data + - created_at + - updated_at + properties: + id: + type: integer + name: + type: string + data: + type: object + created_at: + type: string + format: date-time + updated_at: + type: string + format: date-time + ConfigMapListResponse: + type: object + required: + - configMaps + properties: + configMaps: + type: array + items: + type: object + required: + - id + - name + - created_at + - updated_at + properties: + id: + type: integer + name: + type: string + created_at: + type: string + format: date-time + updated_at: + type: string + format: date-time + VolumeMount: + type: object + properties: + uuid: + type: string + name: + type: string + secretName: + type: string + configMapName: + type: string + version: + type: integer + required: + - uuid + - name + - version + + VolumeMountCreate: + type: object + properties: + name: + type: string + secretName: + type: string + configMapName: + type: string + required: + - name + oneOf: + - required: + - secretName + - required: + - configMapName + + VolumeMountUpdate: + type: object + properties: + name: + type: string + secretName: + type: string + configMapName: + type: string + oneOf: + - required: + - secretName + - required: + - configMapName + + VolumeMountLink: + type: object + properties: + fogUuids: + type: array + items: + type: string + minItems: 1 + required: + - fogUuids + + VolumeMountUnlink: + type: object + properties: + fogUuids: + type: array + items: + type: string + minItems: 1 + required: + - fogUuids \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index db97afda7..f68788513 100644 --- a/package-lock.json +++ b/package-lock.json @@ -19,6 +19,7 @@ "@opentelemetry/resources": "^1.8.0", "@opentelemetry/sdk-node": "^0.200.0", "axios": "1.8.4", + "bignumber.js": "^9.3.0", "body-parser": "^1.20.3", "child_process": "1.0.2", "command-line-args": "5.2.1", @@ -64,6 +65,7 @@ "string-format": "2.0.0", "umzug": "^3.7.0", "underscore": "1.13.6", + "uuid": "11.1.0", "xss-clean": "0.1.1" }, "bin": { @@ -3555,6 +3557,14 @@ } } }, + "node_modules/bignumber.js": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.3.0.tgz", + "integrity": "sha512-EM7aMFTXbptt/wZdMlBv2t8IViwQL+h6SLHosp8Yf0dqJMTnY6iL32opnAB6kAdL0SZPuvcAzFr31o0c/R3/RA==", + "engines": { + "node": "*" + } + }, "node_modules/binary-extensions": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", @@ -8070,6 +8080,15 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/istanbul-lib-processinfo/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==", + "dev": true, + "bin": { + "uuid": "dist/bin/uuid" + } + }, "node_modules/istanbul-lib-report": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", @@ -10847,6 +10866,15 @@ "node": ">=0.10.0" } }, + "node_modules/postman-collection/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==", + "dev": true, + "bin": { + "uuid": "dist/bin/uuid" + } + }, "node_modules/postman-request": { "version": "2.88.1-postman.39", "resolved": "https://registry.npmjs.org/postman-request/-/postman-request-2.88.1-postman.39.tgz", @@ -10889,6 +10917,15 @@ "node": ">=0.6" } }, + "node_modules/postman-request/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==", + "dev": true, + "bin": { + "uuid": "dist/bin/uuid" + } + }, "node_modules/postman-runtime": { "version": "7.41.2", "resolved": "https://registry.npmjs.org/postman-runtime/-/postman-runtime-7.41.2.tgz", @@ -10928,6 +10965,15 @@ "url": "https://github.com/sponsors/panva" } }, + "node_modules/postman-runtime/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==", + "dev": true, + "bin": { + "uuid": "dist/bin/uuid" + } + }, "node_modules/postman-sandbox": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/postman-sandbox/-/postman-sandbox-5.1.1.tgz", @@ -12099,6 +12145,14 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, + "node_modules/sequelize/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/serialised-error": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/serialised-error/-/serialised-error-1.1.3.tgz", @@ -14646,11 +14700,15 @@ } }, "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==", + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.1.0.tgz", + "integrity": "sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], "bin": { - "uuid": "dist/bin/uuid" + "uuid": "dist/esm/bin/uuid" } }, "node_modules/uvm": { diff --git a/package.json b/package.json index d7473c818..9660f9356 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "@datasance/iofogcontroller", "version": "3.5.0", - "description": "ioFog Controller project for Eclipse IoFog @ iofog.org \\nCopyright (c) 2023 Datasance Teknoloji A.S.", + "description": "ioFog Controller project for Datasance PoT @ datasance.com \\nCopyright (c) 2023 Datasance Teknoloji A.S.", "main": "./src/main.js", "author": "Emirhan Durmus", "contributors": [ @@ -59,6 +59,7 @@ "@kubernetes/client-node": "^0.22.3", "axios": "1.8.4", "body-parser": "^1.20.3", + "bignumber.js": "^9.3.0", "child_process": "1.0.2", "command-line-args": "5.2.1", "command-line-usage": "7.0.3", @@ -102,6 +103,7 @@ "sqlite3": "^5.1.7", "string-format": "2.0.0", "umzug": "^3.7.0", + "uuid": "11.1.0", "underscore": "1.13.6", "xss-clean": "0.1.1", "@opentelemetry/api": "^1.9.0", diff --git a/src/config/controller.yaml b/src/config/controller.yaml index 1ff9e67f8..236bccf52 100644 --- a/src/config/controller.yaml +++ b/src/config/controller.yaml @@ -12,10 +12,10 @@ server: # key: "" # SSL key file path # cert: "" # SSL certificate file path # intermediateCert: "" # Intermediate certificate file path - # # base64: - # # key: # SSL key in base64 format - # # cert: # SSL certificate in base64 format - # # intermediateCert: # Intermediate certificate in base64 format + # base64: + # key: # SSL key in base64 format + # cert: # SSL certificate in base64 format + # intermediateCert: # Intermediate certificate in base64 format # Viewer Configuration viewer: @@ -43,13 +43,13 @@ database: # port: 3306 # MySQL port # username: "" # MySQL username # password: "" # MySQL password - # database: "" # MySQL database name + # databaseName: "" # MySQL database name # postgres: # host: "" # PostgreSQL host # port: 5432 # PostgreSQL port # username: "" # PostgreSQL username # password: "" # PostgreSQL password - # database: "" # PostgreSQL database name + # databaseName: "" # PostgreSQL database name sqlite: databaseName: dev_database.sqlite # SQLite database file name logging: false # Enable SQLite query logging @@ -71,18 +71,15 @@ database: # secret: # ControllerClient Client secret # viewerClient: # Viewer client ID -# Public Ports Configuration -publicPorts: - range: "6001-7999" # Public ports range +# Bridge Ports Configuration for Services +bridgePorts: + range: "10024-65535" # Bridge ports range # System Images Configuration systemImages: router: "1": "ghcr.io/datasance/router:latest" "2": "ghcr.io/datasance/router:latest" - proxy: - "1": "ghcr.io/datasance/proxy:latest" - "2": "ghcr.io/datasance/proxy:latest" # Diagnostics Configuration diagnostics: diff --git a/src/config/env-mapping.js b/src/config/env-mapping.js index 5398bdf02..8418a043f 100644 --- a/src/config/env-mapping.js +++ b/src/config/env-mapping.js @@ -7,6 +7,14 @@ module.exports = { 'SERVER_PORT': 'server.port', 'SERVER_DEV_MODE': 'server.devMode', + // SSL Configuration + 'SSL_PATH_KEY': 'server.ssl.path.key', + 'SSL_PATH_CERT': 'server.ssl.path.cert', + 'SSL_PATH_INTERMEDIATE_CERT': 'server.ssl.path.intermediateCert', + 'SSL_BASE64_KEY': 'server.ssl.base64.key', + 'SSL_BASE64_CERT': 'server.ssl.base64.cert', + 'SSL_BASE64_INTERMEDIATE_CERT': 'server.ssl.base64.intermediateCert', + // Viewer Configuration 'VIEWER_PORT': 'viewer.port', 'VIEWER_URL': 'viewer.url', @@ -49,14 +57,12 @@ module.exports = { 'KC_CLIENT_SECRET': 'auth.client.secret', 'KC_VIEWER_CLIENT': 'auth.viewerClient', - // Public Ports Configuration - 'PUBLIC_PORTS_RANGE': 'publicPorts.range', + // Bridge Ports Configuration + 'BRIDGE_PORTS_RANGE': 'bridgePorts.range', // System Images Configuration 'ROUTER_IMAGE_1': 'systemImages.router.1', 'ROUTER_IMAGE_2': 'systemImages.router.2', - 'PROXY_IMAGE_1': 'systemImages.proxy.1', - 'PROXY_IMAGE_2': 'systemImages.proxy.2', // Diagnostics Configuration 'DIAGNOSTICS_DIRECTORY': 'diagnostics.directory', diff --git a/src/config/index.js b/src/config/index.js index 34cfadec8..c6e7da05e 100644 --- a/src/config/index.js +++ b/src/config/index.js @@ -41,10 +41,7 @@ class Config { // Clear any existing configuration nconf.reset() - // Set the entire config as defaults - nconf.defaults(this.config) - - // Set environment variables + // First set environment variables nconf.env({ separator: '_', parseValues: true, @@ -75,7 +72,7 @@ class Config { } }) - // Get all environment overrides + // Get environment overrides first const envOverrides = nconf.get() // Create a deep copy of the base config @@ -98,13 +95,6 @@ class Config { } }) - // Remove any nconf internal keys and the type field - Object.keys(finalConfig).forEach(key => { - if (key.includes(':') || key === 'type') { - delete finalConfig[key] - } - }) - // Reset nconf and set the final merged config nconf.reset() nconf.defaults(finalConfig) diff --git a/src/controllers/agent-controller.js b/src/controllers/agent-controller.js index 223ef9aab..c77ca4cad 100644 --- a/src/controllers/agent-controller.js +++ b/src/controllers/agent-controller.js @@ -58,6 +58,10 @@ const getAgentLinkedEdgeResourcesEndpoint = async function (req, fog) { return { edgeResources: await AgentService.getAgentLinkedEdgeResources(fog) } } +const getAgentLinkedVolumeMountsEndpoint = async function (req, fog) { + return { volumeMounts: await AgentService.getAgentLinkedVolumeMounts(fog) } +} + const getAgentMicroserviceEndPoint = async function (req, fog) { const microserviceUuid = req.params.microserviceUuid @@ -135,5 +139,6 @@ module.exports = { putImageSnapshotEndPoint: AuthDecorator.checkFogToken(putImageSnapshotEndPoint), resetAgentConfigChangesEndPoint: AuthDecorator.checkFogToken(resetAgentConfigChangesEndPoint), getAgentLinkedEdgeResourcesEndpoint: AuthDecorator.checkFogToken(getAgentLinkedEdgeResourcesEndpoint), + getAgentLinkedVolumeMountsEndpoint: AuthDecorator.checkFogToken(getAgentLinkedVolumeMountsEndpoint), getControllerCAEndPoint: AuthDecorator.checkFogToken(getControllerCAEndPoint) } diff --git a/src/controllers/config-map-controller.js b/src/controllers/config-map-controller.js new file mode 100644 index 000000000..ec79358e5 --- /dev/null +++ b/src/controllers/config-map-controller.js @@ -0,0 +1,66 @@ +/* + * ******************************************************************************* + * * Copyright (c) 2023 Datasance Teknoloji A.S. + * * + * * This program and the accompanying materials are made available under the + * * terms of the Eclipse Public License v. 2.0 which is available at + * * http://www.eclipse.org/legal/epl-2.0 + * * + * * SPDX-License-Identifier: EPL-2.0 + * ******************************************************************************* + * + */ + +const ConfigMapService = require('../services/config-map-service') +const YamlParserService = require('../services/yaml-parser-service') + +const createConfigMapEndpoint = async function (req) { + const configMap = req.body + return ConfigMapService.createConfigMapEndpoint(configMap) +} + +const updateConfigMapEndpoint = async function (req) { + const configMap = req.body + const configMapName = req.params.name + return ConfigMapService.updateConfigMapEndpoint(configMapName, configMap) +} + +const getConfigMapEndpoint = async function (req) { + const configMapName = req.params.name + return ConfigMapService.getConfigMapEndpoint(configMapName) +} + +const listConfigMapsEndpoint = async function (req) { + return ConfigMapService.listConfigMapsEndpoint() +} + +const deleteConfigMapEndpoint = async function (req) { + const configMapName = req.params.name + return ConfigMapService.deleteConfigMapEndpoint(configMapName) +} + +const createConfigMapFromYamlEndpoint = async function (req) { + const fileContent = req.file.buffer.toString() + const configMapData = await YamlParserService.parseConfigMapFile(fileContent) + return ConfigMapService.createConfigMapEndpoint(configMapData) +} + +const updateConfigMapFromYamlEndpoint = async function (req) { + const fileContent = req.file.buffer.toString() + const configMapName = req.params.name + const configMapData = await YamlParserService.parseConfigMapFile(fileContent, { + isUpdate: true, + configMapName: configMapName + }) + return ConfigMapService.updateConfigMapEndpoint(configMapName, configMapData) +} + +module.exports = { + createConfigMapEndpoint, + updateConfigMapEndpoint, + getConfigMapEndpoint, + listConfigMapsEndpoint, + deleteConfigMapEndpoint, + createConfigMapFromYamlEndpoint, + updateConfigMapFromYamlEndpoint +} diff --git a/src/controllers/iofog-controller.js b/src/controllers/iofog-controller.js index 3d2f86ccb..b8f876acf 100644 --- a/src/controllers/iofog-controller.js +++ b/src/controllers/iofog-controller.js @@ -41,9 +41,10 @@ async function getFogEndPoint (req) { } async function getFogListEndPoint (req) { - const isSystem = req.query && req.query.system ? req.query.system === 'true' : false + // const isSystem = req.query && req.query.system ? req.query.system === 'true' : false const query = qs.parse(req.query) - return FogService.getFogListEndPoint(query.filters, false, isSystem) + // return FogService.getFogListEndPoint(query.filters, false, isSystem) + return FogService.getFogListEndPoint(query.filters, false) } async function generateProvisionKeyEndPoint (req) { diff --git a/src/controllers/microservices-controller.js b/src/controllers/microservices-controller.js index 55249c4af..fc8418c2b 100644 --- a/src/controllers/microservices-controller.js +++ b/src/controllers/microservices-controller.js @@ -168,8 +168,24 @@ const deleteSystemMicroserviceVolumeMappingEndPoint = async function (req) { return MicroservicesService.deleteSystemVolumeMappingEndPoint(uuid, id, false) } -const listAllPublicPortsEndPoint = async function (req) { - return MicroservicesService.listAllPublicPortsEndPoint() +const createMicroserviceExecEndPoint = async function (req) { + const uuid = req.params.uuid + return MicroservicesService.createExecEndPoint(uuid, false) +} + +const deleteMicroserviceExecEndPoint = async function (req) { + const uuid = req.params.uuid + return MicroservicesService.deleteExecEndPoint(uuid, false) +} + +const createSystemMicroserviceExecEndPoint = async function (req) { + const uuid = req.params.uuid + return MicroservicesService.createSystemExecEndPoint(uuid, false) +} + +const deleteSystemMicroserviceExecEndPoint = async function (req) { + const uuid = req.params.uuid + return MicroservicesService.deleteSystemExecEndPoint(uuid, false) } module.exports = { @@ -195,7 +211,10 @@ module.exports = { listMicroserviceVolumeMappingsEndPoint: (listMicroserviceVolumeMappingsEndPoint), deleteMicroserviceVolumeMappingEndPoint: (deleteMicroserviceVolumeMappingEndPoint), deleteSystemMicroserviceVolumeMappingEndPoint: (deleteSystemMicroserviceVolumeMappingEndPoint), - listAllPublicPortsEndPoint: (listAllPublicPortsEndPoint), createMicroserviceYAMLEndPoint: (createMicroserviceYAMLEndPoint), - updateMicroserviceYAMLEndPoint: (updateMicroserviceYAMLEndPoint) + updateMicroserviceYAMLEndPoint: (updateMicroserviceYAMLEndPoint), + createMicroserviceExecEndPoint: (createMicroserviceExecEndPoint), + deleteMicroserviceExecEndPoint: (deleteMicroserviceExecEndPoint), + createSystemMicroserviceExecEndPoint: (createSystemMicroserviceExecEndPoint), + deleteSystemMicroserviceExecEndPoint: (deleteSystemMicroserviceExecEndPoint) } diff --git a/src/controllers/service-controller.js b/src/controllers/service-controller.js new file mode 100644 index 000000000..b07df17a7 --- /dev/null +++ b/src/controllers/service-controller.js @@ -0,0 +1,66 @@ +/* + * ******************************************************************************* + * * Copyright (c) 2023 Datasance Teknoloji A.S. + * * + * * This program and the accompanying materials are made available under the + * * terms of the Eclipse Public License v. 2.0 which is available at + * * http://www.eclipse.org/legal/epl-2.0 + * * + * * SPDX-License-Identifier: EPL-2.0 + * ******************************************************************************* + * + */ + +const ServiceService = require('../services/services-service') +const YamlParserService = require('../services/yaml-parser-service') + +const createServiceEndpoint = async function (req) { + const serviceData = req.body + return ServiceService.createServiceEndpoint(serviceData) +} + +const updateServiceEndpoint = async function (req) { + const serviceName = req.params.name + const serviceData = req.body + return ServiceService.updateServiceEndpoint(serviceName, serviceData) +} + +const deleteServiceEndpoint = async function (req) { + const serviceName = req.params.name + return ServiceService.deleteServiceEndpoint(serviceName) +} + +const getServiceEndpoint = async function (req) { + const serviceName = req.params.name + return ServiceService.getServiceEndpoint(serviceName) +} + +const listServicesEndpoint = async function (req) { + return ServiceService.getServicesListEndpoint() +} + +const createServiceYAMLEndpoint = async function (req) { + const fileContent = req.file.buffer.toString() + const serviceData = await YamlParserService.parseServiceFile(fileContent) + return ServiceService.createServiceEndpoint(serviceData) +} + +const updateServiceYAMLEndpoint = async function (req) { + const serviceName = req.params.name + const fileContent = req.file.buffer.toString() + const serviceData = await YamlParserService.parseServiceFile(fileContent, { + isUpdate: true, + serviceName: serviceName + }) + return ServiceService.updateServiceEndpoint(serviceName, serviceData) +} + +module.exports = { + createServiceEndpoint, + updateServiceEndpoint, + deleteServiceEndpoint, + getServiceEndpoint, + listServicesEndpoint, + createServiceYAMLEndpoint, + updateServiceYAMLEndpoint +} diff --git a/src/controllers/volume-mount-controller.js b/src/controllers/volume-mount-controller.js new file mode 100644 index 000000000..5a3ce6bef --- /dev/null +++ b/src/controllers/volume-mount-controller.js @@ -0,0 +1,71 @@ +/* + * ******************************************************************************* + * * Copyright (c) 2023 Datasance Teknoloji A.S. + * * + * * This program and the accompanying materials are made available under the + * * terms of the Eclipse Public License v. 2.0 which is available at + * * http://www.eclipse.org/legal/epl-2.0 + * * + * * SPDX-License-Identifier: EPL-2.0 + * ******************************************************************************* + * + */ + +const VolumeMountService = require('../services/volume-mount-service') +const YAMLParserService = require('../services/yaml-parser-service') + +const listVolumeMountsEndpoint = async (req) => { + return VolumeMountService.listVolumeMountsEndpoint() +} + +const getVolumeMountEndpoint = async (req) => { + return VolumeMountService.getVolumeMountEndpoint(req.params.name) +} + +const createVolumeMountEndpoint = async (req) => { + return VolumeMountService.createVolumeMountEndpoint(req.body) +} + +const updateVolumeMountEndpoint = async (req) => { + return VolumeMountService.updateVolumeMountEndpoint(req.params.name, req.body) +} + +const deleteVolumeMountEndpoint = async (req) => { + return VolumeMountService.deleteVolumeMountEndpoint(req.params.name) +} + +const createVolumeMountYamlEndpoint = async (req) => { + const fileContent = req.file.buffer.toString() + const volumeMountData = await YAMLParserService.parseVolumeMountFile(fileContent) + return VolumeMountService.createVolumeMountEndpoint(volumeMountData) +} + +const updateVolumeMountYamlEndpoint = async (req) => { + const fileContent = req.file.buffer.toString() + const name = req.params.name + const volumeMountData = await YAMLParserService.parseVolumeMountFile(fileContent, { + isUpdate: true, + volumeMountName: name + }) + return VolumeMountService.updateVolumeMountEndpoint(name, volumeMountData) +} + +const linkVolumeMountEndpoint = async (req) => { + return VolumeMountService.linkVolumeMountEndpoint(req.params.name, req.body.fogUuids) +} + +const unlinkVolumeMountEndpoint = async (req) => { + return VolumeMountService.unlinkVolumeMountEndpoint(req.params.name, req.body.fogUuids) +} + +module.exports = { + listVolumeMountsEndpoint, + getVolumeMountEndpoint, + createVolumeMountEndpoint, + updateVolumeMountEndpoint, + deleteVolumeMountEndpoint, + createVolumeMountYamlEndpoint, + updateVolumeMountYamlEndpoint, + linkVolumeMountEndpoint, + unlinkVolumeMountEndpoint +} diff --git a/src/data/constants.js b/src/data/constants.js index 3ba4ae4fa..1d17f71eb 100644 --- a/src/data/constants.js +++ b/src/data/constants.js @@ -1,4 +1,3 @@ module.exports = { - ROUTER_CATALOG_NAME: 'Router', - PROXY_CATALOG_NAME: 'Proxy' + ROUTER_CATALOG_NAME: 'Router' } diff --git a/src/data/managers/config-map-manager.js b/src/data/managers/config-map-manager.js new file mode 100644 index 000000000..ee7b6d30b --- /dev/null +++ b/src/data/managers/config-map-manager.js @@ -0,0 +1,54 @@ +const BaseManager = require('./base-manager') +const SecretHelper = require('../../helpers/secret-helper') +const models = require('../models') +const ConfigMap = models.ConfigMap + +class ConfigMapManager extends BaseManager { + getEntity () { + return ConfigMap + } + + async createConfigMap (name, immutable, data, transaction) { + return this.create({ + name, + immutable: immutable, + data: data + }, transaction) + } + + async updateConfigMap (name, immutable, data, transaction) { + const encryptedData = await SecretHelper.encryptSecret(data, name) + return this.update( + { name }, + { immutable: immutable, data: encryptedData }, + transaction + ) + } + + async getConfigMap (name, transaction) { + const configMap = await this.findOne({ name }, transaction) + if (!configMap) { + return null + } + return { + ...configMap.toJSON(), + data: configMap.data + } + } + + async listConfigMaps (transaction) { + const configMaps = await this.findAll({}, transaction) + return configMaps.map(configMap => ({ + id: configMap.id, + name: configMap.name, + created_at: configMap.created_at, + updated_at: configMap.updated_at + })) + } + + async deleteConfigMap (name, transaction) { + return this.delete({ name }, transaction) + } +} + +module.exports = new ConfigMapManager() diff --git a/src/data/managers/iofog-access-token-manager.js b/src/data/managers/iofog-access-token-manager.js deleted file mode 100644 index 0e0bd837f..000000000 --- a/src/data/managers/iofog-access-token-manager.js +++ /dev/null @@ -1,36 +0,0 @@ -/* - * ******************************************************************************* - * * Copyright (c) 2023 Datasance Teknoloji A.S. - * * - * * This program and the accompanying materials are made available under the - * * terms of the Eclipse Public License v. 2.0 which is available at - * * http://www.eclipse.org/legal/epl-2.0 - * * - * * SPDX-License-Identifier: EPL-2.0 - * ******************************************************************************* - * - */ - -const BaseManager = require('./base-manager') -const models = require('../models') -const FogAccessToken = models.FogAccessToken - -class FogAccessTokenManager extends BaseManager { - getEntity () { - return FogAccessToken - } - - // no transaction required here, used by auth decorator - updateExpirationTime (id, newTime) { - return FogAccessToken.update({ - expirationTime: newTime - }, { - where: { - id: id - } - }) - } -} - -const instance = new FogAccessTokenManager() -module.exports = instance diff --git a/src/data/managers/microservice-port-manager.js b/src/data/managers/microservice-port-manager.js index deedb758d..84c7c22f4 100644 --- a/src/data/managers/microservice-port-manager.js +++ b/src/data/managers/microservice-port-manager.js @@ -14,27 +14,11 @@ const BaseManager = require('./base-manager') const models = require('../models') const MicroservicePort = models.MicroservicePort -const MicroservicePublicPort = models.MicroservicePublicPort class MicroservicePortManager extends BaseManager { getEntity () { return MicroservicePort } - - findAllPublicPorts (transaction) { - return MicroservicePort.findAll({ - include: [ - { - model: MicroservicePublicPort, - as: 'publicPort', - required: true, - attributes: ['queueName', 'publicPort', 'protocol', 'isTcp', 'hostId'] - } - ], - where: { isPublic: true }, - attributes: ['microserviceUuid'] - }, { transaction: transaction }) - } } const instance = new MicroservicePortManager() diff --git a/src/data/managers/microservice-public-port-manager.js b/src/data/managers/microservice-public-port-manager.js deleted file mode 100644 index e5e43d977..000000000 --- a/src/data/managers/microservice-public-port-manager.js +++ /dev/null @@ -1,25 +0,0 @@ -/* - * ******************************************************************************* - * * Copyright (c) 2023 Datasance Teknoloji A.S. - * * - * * This program and the accompanying materials are made available under the - * * terms of the Eclipse Public License v. 2.0 which is available at - * * http://www.eclipse.org/legal/epl-2.0 - * * - * * SPDX-License-Identifier: EPL-2.0 - * ******************************************************************************* - * - */ - -const BaseManager = require('./base-manager') -const models = require('../models') -const MicroservicePublicPort = models.MicroservicePublicPort - -class MicroservicePublicPortManager extends BaseManager { - getEntity () { - return MicroservicePublicPort - } -} - -const instance = new MicroservicePublicPortManager() -module.exports = instance diff --git a/src/data/managers/service-manager.js b/src/data/managers/service-manager.js new file mode 100644 index 000000000..9942b36af --- /dev/null +++ b/src/data/managers/service-manager.js @@ -0,0 +1,90 @@ +/* + * ******************************************************************************* + * * Copyright (c) 2023 Datasance Teknoloji A.S. + * * + * * This program and the accompanying materials are made available under the + * * terms of the Eclipse Public License v. 2.0 which is available at + * * http://www.eclipse.org/legal/epl-2.0 + * * + * * SPDX-License-Identifier: EPL-2.0 + * ******************************************************************************* + * + */ + +const BaseManager = require('./base-manager') +const models = require('../models') +const Service = models.Service +const Tags = models.Tags +const ServiceTag = models.ServiceTag + +class ServiceManager extends BaseManager { + getEntity () { + return Service + } + + async findAllWithTags (where, transaction) { + return Service.findAll({ + where: where, + order: [ [ 'name', 'ASC' ] ], + include: [ + { model: Tags, + as: 'tags', + through: { + attributes: [] + } + } + ] + }, { + transaction: transaction + }) + } + + async findOneWithTags (where, transaction) { + return Service.findOne({ + where, + include: [ + { model: Tags, + as: 'tags', + through: { + attributes: [] + } + } + ] + }, { transaction }) + } + + async setTags (serviceId, tagIds, transaction) { + // First remove all existing tags + await ServiceTag.destroy({ + where: { service_id: serviceId } + }, { transaction }) + + // Then add new tags + if (tagIds && tagIds.length > 0) { + const serviceTags = tagIds.map(tagId => ({ + service_id: serviceId, + tag_id: tagId + })) + await ServiceTag.bulkCreate(serviceTags, { transaction }) + } + } + + async addTag (serviceId, tagId, transaction) { + await ServiceTag.create({ + service_id: serviceId, + tag_id: tagId + }, { transaction }) + } + + async removeTag (serviceId, tagId, transaction) { + await ServiceTag.destroy({ + where: { + service_id: serviceId, + tag_id: tagId + } + }, { transaction }) + } +} + +const instance = new ServiceManager() +module.exports = instance diff --git a/src/data/managers/volume-mounting-manager.js b/src/data/managers/volume-mounting-manager.js new file mode 100644 index 000000000..b4f443842 --- /dev/null +++ b/src/data/managers/volume-mounting-manager.js @@ -0,0 +1,62 @@ +/* + * ******************************************************************************* + * * Copyright (c) 2023 Datasance Teknoloji A.S. + * * + * * This program and the accompanying materials are made available under the + * * terms of the Eclipse Public License v. 2.0 which is available at + * * http://www.eclipse.org/legal/epl-2.0 + * * + * * SPDX-License-Identifier: EPL-2.0 + * ******************************************************************************* + * + */ + +const BaseManager = require('./base-manager') +const models = require('../models') +const VolumeMount = models.VolumeMount + +const volumeMountExcludedFields = [ + 'created_at', + 'updated_at' +] + +class VolumeMountingManager extends BaseManager { + getEntity () { + return VolumeMount + } + + getAllExcludeFields (where, transaction) { + return this.findAllWithAttributes(where, { exclude: volumeMountExcludedFields }, transaction) + } + + getAll (where, transaction) { + return VolumeMount.findAll({ + where: where, + attributes: ['uuid', 'name', 'configMapName', 'secretName'] + }, { transaction: transaction }) + } + + getOne (where, transaction) { + return VolumeMount.findOne({ + where: where, + attributes: ['uuid', 'name', 'configMapName', 'secretName', 'version'] + }, { transaction: transaction }) + } + + findOne (where, transaction) { + return VolumeMount.findOne({ + where: where, + attributes: ['uuid', 'name', 'configMapName', 'secretName', 'version'] + }, { transaction: transaction }) + } + + findAll (where, transaction) { + return VolumeMount.findAll({ + where: where, + attributes: ['uuid', 'name', 'configMapName', 'secretName', 'version'] + }, { transaction: transaction }) + } +} + +const instance = new VolumeMountingManager() +module.exports = instance diff --git a/src/data/migrations/mysql/db_migration_mysql_v1.0.2.sql b/src/data/migrations/mysql/db_migration_mysql_v1.0.2.sql index 5cb25c7dc..f3fed8960 100644 --- a/src/data/migrations/mysql/db_migration_mysql_v1.0.2.sql +++ b/src/data/migrations/mysql/db_migration_mysql_v1.0.2.sql @@ -68,7 +68,7 @@ CREATE TABLE IF NOT EXISTS Fogs ( longitude FLOAT, description TEXT, last_active BIGINT, - daemon_status VARCHAR(32) DEFAULT 'UNKNOWN', + daemon_status VARCHAR(32) DEFAULT 'NOT_PROVISIONED', daemon_operating_duration BIGINT DEFAULT 0, daemon_last_start BIGINT, memory_usage FLOAT DEFAULT 0.000, @@ -77,9 +77,9 @@ CREATE TABLE IF NOT EXISTS Fogs ( memory_violation TEXT, disk_violation TEXT, cpu_violation TEXT, - `system-available-disk` BIGINT, - `system-available-memory` BIGINT, - `system-total-cpu` FLOAT, + system_available_disk BIGINT, + system_available_memory BIGINT, + system_total_cpu FLOAT, security_status VARCHAR(32) DEFAULT 'OK', security_violation_info VARCHAR(32) DEFAULT 'No violation', catalog_item_status TEXT, @@ -112,8 +112,8 @@ CREATE TABLE IF NOT EXISTS Fogs ( change_frequency INT DEFAULT 20, device_scan_frequency INT DEFAULT 20, tunnel VARCHAR(255) DEFAULT '', - isolated_docker_container BOOLEAN DEFAULT TRUE, - docker_pruning_freq INT DEFAULT 1, + isolated_docker_container BOOLEAN DEFAULT FALSE, + docker_pruning_freq INT DEFAULT 0, available_disk_threshold FLOAT DEFAULT 20, log_level VARCHAR(10) DEFAULT 'INFO', is_system BOOLEAN DEFAULT FALSE, @@ -568,18 +568,6 @@ ADD COLUMN run_as_user TEXT DEFAULT NULL, ADD COLUMN platform TEXT DEFAULT NULL, ADD COLUMN runtime TEXT DEFAULT NULL; -ALTER TABLE Fogs -RENAME COLUMN `system-available-disk` TO system_available_disk, -RENAME COLUMN `system-available-memory` TO system_available_memory, -RENAME COLUMN `system-total-cpu` TO system_total_cpu; - -ALTER TABLE Routers DROP COLUMN IF EXISTS require_ssl; -ALTER TABLE Routers DROP COLUMN IF EXISTS ssl_profile; -ALTER TABLE Routers DROP COLUMN IF EXISTS sasl_mechanisms; -ALTER TABLE Routers DROP COLUMN IF EXISTS authenticate_peer; -ALTER TABLE Routers DROP COLUMN IF EXISTS ca_cert; -ALTER TABLE Routers DROP COLUMN IF EXISTS tls_cert; -ALTER TABLE Routers DROP COLUMN IF EXISTS tls_key; CREATE TABLE IF NOT EXISTS MicroservicePubTags ( id INT AUTO_INCREMENT PRIMARY KEY NOT NULL, @@ -678,8 +666,8 @@ CREATE TABLE IF NOT EXISTS Certificates ( FOREIGN KEY (secret_id) REFERENCES Secrets (id) ON DELETE CASCADE ); -CREATE UNIQUE INDEX idx_certificates_name_unique ON Certificates ((name(255))); -CREATE INDEX idx_certificates_valid_to ON Certificates ((valid_to)); +CREATE UNIQUE INDEX idx_certificates_name_unique ON Certificates (name(255)); +CREATE INDEX idx_certificates_valid_to ON Certificates (valid_to); CREATE INDEX idx_certificates_is_ca ON Certificates (is_ca); CREATE INDEX idx_certificates_signed_by_id ON Certificates (signed_by_id); CREATE INDEX idx_certificates_secret_id ON Certificates (secret_id); @@ -691,10 +679,12 @@ CREATE TABLE IF NOT EXISTS Services ( resource TEXT NOT NULL, target_port INT NOT NULL, service_port INT, + k8s_type TEXT, bridge_port INT, + default_bridge TEXT, service_endpoint TEXT, created_at DATETIME, - updated_at DATETIME, + updated_at DATETIME ); CREATE INDEX idx_services_name ON Services (name); @@ -713,4 +703,75 @@ CREATE TABLE IF NOT EXISTS ServiceTags ( CREATE INDEX idx_service_tags_service_id ON ServiceTags (service_id); CREATE INDEX idx_service_tags_tag_id ON ServiceTags (tag_id); +ALTER TABLE Fogs ADD COLUMN container_engine VARCHAR(32); +ALTER TABLE Fogs ADD COLUMN deployment_type VARCHAR(32); + +ALTER TABLE MicroserviceExtraHost DROP COLUMN public_port; +ALTER TABLE MicroservicePorts DROP COLUMN is_public; +ALTER TABLE MicroservicePorts DROP COLUMN is_proxy; + +DROP TABLE IF EXISTS MicroservicePublicPorts; + +ALTER TABLE MicroserviceEnvs ADD COLUMN value_from_secret TEXT; +ALTER TABLE MicroserviceEnvs ADD COLUMN value_from_config_map TEXT; + +CREATE TABLE IF NOT EXISTS ConfigMaps ( + id INT AUTO_INCREMENT PRIMARY KEY NOT NULL, + name VARCHAR(255) UNIQUE NOT NULL, + immutable BOOLEAN DEFAULT false, + data TEXT NOT NULL, + created_at DATETIME, + updated_at DATETIME +); + +CREATE INDEX idx_config_maps_name ON ConfigMaps (name); + +CREATE TABLE IF NOT EXISTS VolumeMounts ( + uuid VARCHAR(32) PRIMARY KEY NOT NULL, + name VARCHAR(255) NOT NULL, + config_map_name VARCHAR(255), + secret_name VARCHAR(255), + version INT DEFAULT 1, + created_at DATETIME, + updated_at DATETIME, + FOREIGN KEY (config_map_name) REFERENCES ConfigMaps (name) ON DELETE CASCADE, + FOREIGN KEY (secret_name) REFERENCES Secrets (name) ON DELETE CASCADE +); + +CREATE INDEX idx_volume_mounts_uuid ON VolumeMounts (uuid); +CREATE INDEX idx_volume_mounts_config_map_name ON VolumeMounts (config_map_name); +CREATE INDEX idx_volume_mounts_secret_name ON VolumeMounts (secret_name); + +CREATE TABLE IF NOT EXISTS FogVolumeMounts ( + id INT AUTO_INCREMENT PRIMARY KEY NOT NULL, + fog_uuid VARCHAR(32), + volume_mount_uuid VARCHAR(32), + FOREIGN KEY (fog_uuid) REFERENCES Fogs (uuid) ON DELETE CASCADE, + FOREIGN KEY (volume_mount_uuid) REFERENCES VolumeMounts (uuid) ON DELETE CASCADE +); + +CREATE INDEX idx_fog_volume_mounts_fog_uuid ON FogVolumeMounts (fog_uuid); +CREATE INDEX idx_fog_volume_mounts_volume_mount_uuid ON FogVolumeMounts (volume_mount_uuid); + +ALTER TABLE Fogs ADD COLUMN active_volume_mounts BIGINT DEFAULT 0; +ALTER TABLE Fogs ADD COLUMN volume_mount_last_update BIGINT DEFAULT 0; + +ALTER TABLE ChangeTrackings ADD COLUMN volume_mounts BOOLEAN DEFAULT false; +ALTER TABLE ChangeTrackings ADD COLUMN exec_sessions BOOLEAN DEFAULT false; + +ALTER TABLE Services ADD COLUMN provisioning_status VARCHAR(32) DEFAULT 'pending'; +ALTER TABLE Services ADD COLUMN provisioning_error TEXT; + +ALTER TABLE Fogs ADD COLUMN warning_message TEXT; +ALTER TABLE Fogs ADD COLUMN gps_device VARCHAR(32); +ALTER TABLE Fogs ADD COLUMN gps_scan_frequency INT DEFAULT 60; +ALTER TABLE Fogs ADD COLUMN edge_guard_frequency INT DEFAULT 0; + +ALTER TABLE Microservices ADD COLUMN pid_mode VARCHAR(32); +ALTER TABLE Microservices ADD COLUMN ipc_mode VARCHAR(32); +ALTER TABLE Microservices ADD COLUMN exec_enabled BOOLEAN DEFAULT false; + +ALTER TABLE MicroserviceStatuses ADD COLUMN exec_session_id TEXT; + + COMMIT; \ No newline at end of file diff --git a/src/data/migrations/postgres/db_migration_pg_v1.0.2.sql b/src/data/migrations/postgres/db_migration_pg_v1.0.2.sql index 29faea833..2a0c682a0 100644 --- a/src/data/migrations/postgres/db_migration_pg_v1.0.2.sql +++ b/src/data/migrations/postgres/db_migration_pg_v1.0.2.sql @@ -66,7 +66,7 @@ CREATE TABLE IF NOT EXISTS "Fogs" ( longitude DOUBLE PRECISION, description TEXT, last_active BIGINT, - daemon_status VARCHAR(32) DEFAULT 'UNKNOWN', + daemon_status VARCHAR(32) DEFAULT 'NOT_PROVISIONED', daemon_operating_duration BIGINT DEFAULT 0, daemon_last_start BIGINT, memory_usage DOUBLE PRECISION DEFAULT 0.000, @@ -110,8 +110,8 @@ CREATE TABLE IF NOT EXISTS "Fogs" ( change_frequency INT DEFAULT 20, device_scan_frequency INT DEFAULT 20, tunnel VARCHAR(255) DEFAULT '', - isolated_docker_container BOOLEAN DEFAULT TRUE, - docker_pruning_freq INT DEFAULT 1, + isolated_docker_container BOOLEAN DEFAULT FALSE, + docker_pruning_freq INT DEFAULT 0, available_disk_threshold DOUBLE PRECISION DEFAULT 20, log_level VARCHAR(10) DEFAULT 'INFO', is_system BOOLEAN DEFAULT FALSE, @@ -566,14 +566,6 @@ ADD COLUMN run_as_user TEXT DEFAULT NULL, ADD COLUMN platform TEXT DEFAULT NULL, ADD COLUMN runtime TEXT DEFAULT NULL; -ALTER TABLE "Routers" -ADD COLUMN require_ssl TEXT, -ADD COLUMN ssl_profile TEXT, -ADD COLUMN sasl_mechanisms TEXT, -ADD COLUMN authenticate_peer TEXT, -ADD COLUMN ca_cert TEXT, -ADD COLUMN tls_cert TEXT, -ADD COLUMN tls_key TEXT; CREATE TABLE IF NOT EXISTS "MicroservicePubTags" ( id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY NOT NULL, @@ -686,7 +678,9 @@ CREATE TABLE IF NOT EXISTS "Services" ( resource TEXT NOT NULL, target_port INTEGER NOT NULL, service_port INTEGER, + k8s_type TEXT, bridge_port INTEGER, + default_bridge TEXT, service_endpoint TEXT, created_at TIMESTAMP(0), updated_at TIMESTAMP(0) @@ -708,10 +702,73 @@ CREATE TABLE IF NOT EXISTS "ServiceTags" ( CREATE INDEX idx_service_tags_service_id ON "ServiceTags" (service_id); CREATE INDEX idx_service_tags_tag_id ON "ServiceTags" (tag_id); -ALTER TABLE "Routers" DROP COLUMN IF EXISTS require_ssl; -ALTER TABLE "Routers" DROP COLUMN IF EXISTS ssl_profile; -ALTER TABLE "Routers" DROP COLUMN IF EXISTS sasl_mechanisms; -ALTER TABLE "Routers" DROP COLUMN IF EXISTS authenticate_peer; -ALTER TABLE "Routers" DROP COLUMN IF EXISTS ca_cert; -ALTER TABLE "Routers" DROP COLUMN IF EXISTS tls_cert; -ALTER TABLE "Routers" DROP COLUMN IF EXISTS tls_key; \ No newline at end of file + +ALTER TABLE "Fogs" ADD COLUMN container_engine VARCHAR(32); +ALTER TABLE "Fogs" ADD COLUMN deployment_type VARCHAR(32); + +ALTER TABLE "MicroserviceExtraHost" DROP COLUMN IF EXISTS public_port; +ALTER TABLE "MicroservicePorts" DROP COLUMN IF EXISTS is_public; +ALTER TABLE "MicroservicePorts" DROP COLUMN IF EXISTS is_proxy; + +DROP TABLE IF EXISTS "MicroservicePublicPorts"; + +ALTER TABLE "MicroserviceEnvs" ADD COLUMN value_from_secret TEXT; +ALTER TABLE "MicroserviceEnvs" ADD COLUMN value_from_config_map TEXT; + +CREATE TABLE IF NOT EXISTS "ConfigMaps" ( + id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY NOT NULL, + name VARCHAR(255) UNIQUE NOT NULL, + immutable BOOLEAN DEFAULT false, + data TEXT NOT NULL, + created_at TIMESTAMP(0), + updated_at TIMESTAMP(0) +); + +CREATE INDEX idx_config_maps_name ON "ConfigMaps" (name); + +CREATE TABLE IF NOT EXISTS "VolumeMounts" ( + uuid VARCHAR(32) PRIMARY KEY NOT NULL, + name VARCHAR(255) NOT NULL, + config_map_name VARCHAR(255), + secret_name VARCHAR(255), + version INT DEFAULT 1, + created_at TIMESTAMP(0), + updated_at TIMESTAMP(0), + FOREIGN KEY (config_map_name) REFERENCES "ConfigMaps" (name) ON DELETE CASCADE, + FOREIGN KEY (secret_name) REFERENCES "Secrets" (name) ON DELETE CASCADE +); + +CREATE INDEX idx_volume_mounts_uuid ON "VolumeMounts" (uuid); +CREATE INDEX idx_volume_mounts_config_map_name ON "VolumeMounts" (config_map_name); +CREATE INDEX idx_volume_mounts_secret_name ON "VolumeMounts" (secret_name); + +CREATE TABLE IF NOT EXISTS "FogVolumeMounts" ( + id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY NOT NULL, + fog_uuid VARCHAR(32), + volume_mount_uuid VARCHAR(32), + FOREIGN KEY (fog_uuid) REFERENCES "Fogs" (uuid) ON DELETE CASCADE, + FOREIGN KEY (volume_mount_uuid) REFERENCES "VolumeMounts" (uuid) ON DELETE CASCADE +); + +CREATE INDEX idx_fog_volume_mounts_fog_uuid ON "FogVolumeMounts" (fog_uuid); +CREATE INDEX idx_fog_volume_mounts_volume_mount_uuid ON "FogVolumeMounts" (volume_mount_uuid); + +ALTER TABLE "Fogs" ADD COLUMN active_volume_mounts BIGINT DEFAULT 0; +ALTER TABLE "Fogs" ADD COLUMN volume_mount_last_update BIGINT DEFAULT 0; + +ALTER TABLE "ChangeTrackings" ADD COLUMN volume_mounts BOOLEAN DEFAULT false; +ALTER TABLE "ChangeTrackings" ADD COLUMN exec_sessions BOOLEAN DEFAULT false; + +ALTER TABLE "Services" ADD COLUMN provisioning_status VARCHAR(32) DEFAULT 'pending'; +ALTER TABLE "Services" ADD COLUMN provisioning_error TEXT; + +ALTER TABLE "Fogs" ADD COLUMN warning_message TEXT DEFAULT 'HEALTHY'; +ALTER TABLE "Fogs" ADD COLUMN gps_device VARCHAR(32); +ALTER TABLE "Fogs" ADD COLUMN gps_scan_frequency INT DEFAULT 60; +ALTER TABLE "Fogs" ADD COLUMN edge_guard_frequency INT DEFAULT 0; + +ALTER TABLE "Microservices" ADD COLUMN pid_mode VARCHAR(32); +ALTER TABLE "Microservices" ADD COLUMN ipc_mode VARCHAR(32); +ALTER TABLE "Microservices" ADD COLUMN exec_enabled BOOLEAN DEFAULT false; + +ALTER TABLE "MicroserviceStatuses" ADD COLUMN exec_session_id TEXT; diff --git a/src/data/migrations/sqlite/db_migration_sqlite_v1.0.2.sql b/src/data/migrations/sqlite/db_migration_sqlite_v1.0.2.sql index 7a8a825da..42e98b3b9 100644 --- a/src/data/migrations/sqlite/db_migration_sqlite_v1.0.2.sql +++ b/src/data/migrations/sqlite/db_migration_sqlite_v1.0.2.sql @@ -66,7 +66,7 @@ CREATE TABLE IF NOT EXISTS Fogs ( longitude FLOAT, description TEXT, last_active BIGINT, - daemon_status VARCHAR(32) DEFAULT 'UNKNOWN', + daemon_status VARCHAR(32) DEFAULT 'NOT_PROVISIONED', daemon_operating_duration BIGINT DEFAULT 0, daemon_last_start BIGINT, memory_usage FLOAT DEFAULT 0.000, @@ -110,8 +110,8 @@ CREATE TABLE IF NOT EXISTS Fogs ( change_frequency INT DEFAULT 20, device_scan_frequency INT DEFAULT 20, tunnel VARCHAR(255) DEFAULT '', - isolated_docker_container BOOLEAN DEFAULT TRUE, - docker_pruning_freq INT DEFAULT 1, + isolated_docker_container BOOLEAN DEFAULT FALSE, + docker_pruning_freq INT DEFAULT 0, available_disk_threshold FLOAT DEFAULT 20, log_level VARCHAR(10) DEFAULT 'INFO', is_system BOOLEAN DEFAULT FALSE, @@ -268,7 +268,6 @@ CREATE TABLE IF NOT EXISTS MicroserviceExtraHost ( id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, template_type TEXT, name TEXT, - public_port INT, template TEXT, `value` TEXT, microservice_uuid VARCHAR(32), @@ -288,8 +287,6 @@ CREATE TABLE IF NOT EXISTS MicroservicePorts ( port_internal INT, port_external INT, is_udp BOOLEAN, - is_public BOOLEAN, - is_proxy BOOLEAN, created_at DATETIME, updated_at DATETIME, microservice_uuid VARCHAR(32), @@ -673,10 +670,12 @@ CREATE TABLE IF NOT EXISTS Services ( resource TEXT NOT NULL, target_port INTEGER NOT NULL, service_port INTEGER, + k8s_type TEXT, bridge_port INTEGER, + default_bridge TEXT, service_endpoint TEXT, created_at DATETIME, - updated_at DATETIME, + updated_at DATETIME ); CREATE INDEX idx_services_id ON Services (id); @@ -695,3 +694,68 @@ CREATE TABLE IF NOT EXISTS ServiceTags ( CREATE INDEX idx_service_tags_service_id ON ServiceTags (service_id); CREATE INDEX idx_service_tags_tag_id ON ServiceTags (tag_id); +ALTER TABLE Fogs ADD COLUMN container_engine VARCHAR(32); +ALTER TABLE Fogs ADD COLUMN deployment_type VARCHAR(32); + +DROP TABLE IF EXISTS MicroservicePublicPorts; + +ALTER TABLE MicroserviceEnvs ADD COLUMN value_from_secret TEXT; +ALTER TABLE MicroserviceEnvs ADD COLUMN value_from_config_map TEXT; + +CREATE TABLE IF NOT EXISTS ConfigMaps ( + id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, + name VARCHAR(255) UNIQUE NOT NULL, + immutable BOOLEAN DEFAULT false, + data TEXT NOT NULL, + created_at DATETIME, + updated_at DATETIME +); + +CREATE INDEX idx_config_maps_name ON ConfigMaps (name); + +CREATE TABLE IF NOT EXISTS VolumeMounts ( + uuid VARCHAR(32) PRIMARY KEY NOT NULL, + name VARCHAR(255) NOT NULL, + config_map_name VARCHAR(255), + secret_name VARCHAR(255), + version INTEGER DEFAULT 1, + created_at DATETIME, + updated_at DATETIME, + FOREIGN KEY (config_map_name) REFERENCES ConfigMaps (name) ON DELETE CASCADE, + FOREIGN KEY (secret_name) REFERENCES Secrets (name) ON DELETE CASCADE +); + +CREATE INDEX idx_volume_mounts_uuid ON VolumeMounts (uuid); +CREATE INDEX idx_volume_mounts_config_map_name ON VolumeMounts (config_map_name); +CREATE INDEX idx_volume_mounts_secret_name ON VolumeMounts (secret_name); + +CREATE TABLE IF NOT EXISTS FogVolumeMounts ( + id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, + fog_uuid VARCHAR(32), + volume_mount_uuid VARCHAR(32), + FOREIGN KEY (fog_uuid) REFERENCES Fogs (uuid) ON DELETE CASCADE, + FOREIGN KEY (volume_mount_uuid) REFERENCES VolumeMounts (uuid) ON DELETE CASCADE +); + +CREATE INDEX idx_fog_volume_mounts_fog_uuid ON FogVolumeMounts (fog_uuid); +CREATE INDEX idx_fog_volume_mounts_volume_mount_uuid ON FogVolumeMounts (volume_mount_uuid); + +ALTER TABLE Fogs ADD COLUMN active_volume_mounts BIGINT DEFAULT 0; +ALTER TABLE Fogs ADD COLUMN volume_mount_last_update BIGINT DEFAULT 0; + +ALTER TABLE ChangeTrackings ADD COLUMN volume_mounts BOOLEAN DEFAULT false; +ALTER TABLE ChangeTrackings ADD COLUMN exec_sessions BOOLEAN DEFAULT false; + +ALTER TABLE Services ADD COLUMN provisioning_status VARCHAR(32) DEFAULT 'pending'; +ALTER TABLE Services ADD COLUMN provisioning_error TEXT; + +ALTER TABLE Fogs ADD COLUMN warning_message TEXT DEFAULT 'HEALTHY'; +ALTER TABLE Fogs ADD COLUMN gps_device VARCHAR(32); +ALTER TABLE Fogs ADD COLUMN gps_scan_frequency INT DEFAULT 60; +ALTER TABLE Fogs ADD COLUMN edge_guard_frequency INT DEFAULT 0; + +ALTER TABLE Microservices ADD COLUMN pid_mode VARCHAR(32); +ALTER TABLE Microservices ADD COLUMN ipc_mode VARCHAR(32); +ALTER TABLE Microservices ADD COLUMN exec_enabled BOOLEAN DEFAULT false; + +ALTER TABLE MicroserviceStatuses ADD COLUMN exec_session_id TEXT; \ No newline at end of file diff --git a/src/data/models/changetracking.js b/src/data/models/changetracking.js index ee4d34d92..a3932eb99 100644 --- a/src/data/models/changetracking.js +++ b/src/data/models/changetracking.js @@ -91,6 +91,16 @@ module.exports = (sequelize, DataTypes) => { field: 'linked_edge_resources', defaultValue: false }, + volumeMounts: { + type: DataTypes.BOOLEAN, + field: 'volume_mounts', + defaultValue: false + }, + execSessions: { + type: DataTypes.BOOLEAN, + field: 'exec_sessions', + defaultValue: false + }, lastUpdated: { type: DataTypes.STRING, field: 'last_updated', diff --git a/src/data/models/configMap.js b/src/data/models/configMap.js new file mode 100644 index 000000000..6f0c65415 --- /dev/null +++ b/src/data/models/configMap.js @@ -0,0 +1,77 @@ +'use strict' + +const SecretHelper = require('../../helpers/secret-helper') + +module.exports = (sequelize, DataTypes) => { + const ConfigMap = sequelize.define('ConfigMap', { + id: { + type: DataTypes.INTEGER, + primaryKey: true, + autoIncrement: true, + allowNull: false, + field: 'id' + }, + name: { + type: DataTypes.TEXT, + allowNull: false, + field: 'name', + unique: true + }, + immutable: { + type: DataTypes.BOOLEAN, + allowNull: false, + field: 'immutable', + defaultValue: false + }, + data: { + type: DataTypes.TEXT, + allowNull: false, + field: 'data', + defaultValue: '{}', + get () { + const rawValue = this.getDataValue('data') + return rawValue ? JSON.parse(rawValue) : {} + }, + set (value) { + this.setDataValue('data', JSON.stringify(value)) + } + } + }, { + tableName: 'ConfigMaps', + timestamps: true, + underscored: true, + indexes: [ + { + unique: true, + fields: ['name'] + } + ], + hooks: { + beforeSave: async (configMap) => { + if (configMap.changed('data')) { + const encryptedData = await SecretHelper.encryptSecret( + configMap.data, + configMap.name + ) + configMap.data = encryptedData + } + }, + afterFind: async (configMap) => { + if (configMap && configMap.data) { + try { + const decryptedData = await SecretHelper.decryptSecret( + configMap.data, + configMap.name + ) + configMap.data = decryptedData + } catch (error) { + console.error('Error decrypting ConfigMap data:', error) + configMap.data = {} + } + } + } + } + }) + + return ConfigMap +} diff --git a/src/data/models/fog.js b/src/data/models/fog.js index 3b8a02c89..72d956e26 100644 --- a/src/data/models/fog.js +++ b/src/data/models/fog.js @@ -23,6 +23,15 @@ module.exports = (sequelize, DataTypes) => { type: DataTypes.TEXT, field: 'gps_mode' }, + gpsDevice: { + type: DataTypes.TEXT, + field: 'gps_device' + }, + gpsScanFrequency: { + type: DataTypes.INTEGER, + field: 'gps_scan_frequency', + defaultValue: 60 + }, latitude: { type: DataTypes.FLOAT, field: 'latitude' @@ -44,7 +53,7 @@ module.exports = (sequelize, DataTypes) => { }, daemonStatus: { type: DataTypes.TEXT, - defaultValue: 'UNKNOWN', + defaultValue: 'NOT_PROVISIONED', field: 'daemon_status' }, daemonOperatingDuration: { @@ -193,6 +202,18 @@ module.exports = (sequelize, DataTypes) => { defaultValue: 'unix:///var/run/docker.sock', field: 'docker_url' }, + containerEngine: { + type: DataTypes.ENUM('docker', 'podman'), + allowNull: false, + field: 'container_engine', + defaultValue: 'docker' + }, + deploymentType: { + type: DataTypes.ENUM('native', 'container'), + allowNull: false, + field: 'deployment_type', + defaultValue: 'native' + }, diskLimit: { type: DataTypes.FLOAT, defaultValue: 50, @@ -277,12 +298,17 @@ module.exports = (sequelize, DataTypes) => { }, watchdogEnabled: { type: DataTypes.BOOLEAN, - defaultValue: true, + defaultValue: false, field: 'isolated_docker_container' }, + edgeGuardFrequency: { + type: DataTypes.INTEGER, + defaultValue: 0, + field: 'edge_guard_frequency' + }, dockerPruningFrequency: { type: DataTypes.INTEGER, - defaultValue: 1, + defaultValue: 0, field: 'docker_pruning_freq' }, availableDiskThreshold: { @@ -308,6 +334,26 @@ module.exports = (sequelize, DataTypes) => { timeZone: { type: DataTypes.TEXT, field: 'time_zone' + }, + activeVolumeMounts: { + type: DataTypes.BIGINT, + defaultValue: 0, + get () { + return convertToInt(this.getDataValue('activeVolumeMounts'), 0) + }, + field: 'active_volume_mounts' + }, + volumeMountLastUpdate: { + type: DataTypes.BIGINT, + get () { + return convertToInt(this.getDataValue('volumeMountLastUpdate'), 0) + }, + field: 'volume_mount_last_update' + }, + warningMessage: { + type: DataTypes.TEXT, + field: 'warning_message', + defaultValue: 'HEALTHY' } }, { tableName: 'Fogs', @@ -324,10 +370,10 @@ module.exports = (sequelize, DataTypes) => { defaultValue: 0 }) - Fog.hasOne(models.FogAccessToken, { - foreignKey: 'iofog_uuid', - as: 'accessToken' - }) + // Fog.hasOne(models.FogAccessToken, { + // foreignKey: 'iofog_uuid', + // as: 'accessToken' + // }) Fog.hasOne(models.FogPublicKey, { foreignKey: 'iofog_uuid', @@ -351,6 +397,7 @@ module.exports = (sequelize, DataTypes) => { Fog.belongsToMany(models.Tags, { through: 'IofogTags', as: 'tags' }) Fog.belongsToMany(models.EdgeResource, { through: 'AgentEdgeResources', as: 'edgeResources' }) + Fog.belongsToMany(models.VolumeMount, { through: 'FogVolumeMounts', as: 'volumeMounts' }) } return Fog diff --git a/src/data/models/fogVolumeMounts.js b/src/data/models/fogVolumeMounts.js new file mode 100644 index 000000000..25566a44c --- /dev/null +++ b/src/data/models/fogVolumeMounts.js @@ -0,0 +1,9 @@ +'use strict' +module.exports = (sequelize, DataTypes) => { + const FogVolumeMounts = sequelize.define('FogVolumeMounts', {}, { + tableName: 'FogVolumeMounts', + timestamps: false, + underscored: true + }) + return FogVolumeMounts +} diff --git a/src/data/models/fogaccesstoken.js b/src/data/models/fogaccesstoken.js deleted file mode 100644 index 9eeb29437..000000000 --- a/src/data/models/fogaccesstoken.js +++ /dev/null @@ -1,41 +0,0 @@ -'use strict' - -const { convertToInt } = require('../../helpers/app-helper') - -module.exports = (sequelize, DataTypes) => { - const FogAccessToken = sequelize.define('FogAccessToken', { - id: { - type: DataTypes.INTEGER, - primaryKey: true, - autoIncrement: true, - allowNull: false, - field: 'id' - }, - expirationTime: { - type: DataTypes.BIGINT, - get () { - return convertToInt(this.getDataValue('expirationTime')) - }, - field: 'expiration_time' - }, - token: { - type: DataTypes.TEXT, - field: 'token' - } - }, { - tableName: 'FogAccessTokens', - timestamps: false, - underscored: true - }) - FogAccessToken.associate = function (models) { - FogAccessToken.belongsTo(models.Fog, { - foreignKey: { - name: 'iofogUuid', - field: 'iofog_uuid' - }, - as: 'iofog', - onDelete: 'cascade' - }) - } - return FogAccessToken -} diff --git a/src/data/models/index.js b/src/data/models/index.js index 30b833b76..483a3c8af 100644 --- a/src/data/models/index.js +++ b/src/data/models/index.js @@ -71,7 +71,6 @@ db.initDB = async (isStart) => { // Configure system images const fogTypes = await db.FogType.findAll({}) await configureImage(db, constants.ROUTER_CATALOG_NAME, fogTypes, config.get('systemImages.router', {})) - await configureImage(db, constants.PROXY_CATALOG_NAME, fogTypes, config.get('systemImages.proxy', {})) } } diff --git a/src/data/models/microservice.js b/src/data/models/microservice.js index bc6141cc0..f414fa892 100644 --- a/src/data/models/microservice.js +++ b/src/data/models/microservice.js @@ -65,11 +65,26 @@ module.exports = (sequelize, DataTypes) => { field: 'log_size', defaultValue: 0 }, + pidMode: { + type: DataTypes.TEXT, + field: 'pid_mode', + defaultValue: '' + }, + ipcMode: { + type: DataTypes.TEXT, + field: 'ipc_mode', + defaultValue: '' + }, imageSnapshot: { type: DataTypes.TEXT, field: 'image_snapshot', defaultValue: '' }, + execEnabled: { + type: DataTypes.BOOLEAN, + field: 'exec_enabled', + defaultValue: false + }, delete: { type: DataTypes.BOOLEAN, field: 'delete', @@ -158,6 +173,11 @@ module.exports = (sequelize, DataTypes) => { as: 'env' }) + Microservice.hasMany(models.VolumeMount, { + foreignKey: 'microservice_uuid', + as: 'volumeMounts' + }) + Microservice.hasMany(models.MicroserviceArg, { foreignKey: 'microservice_uuid', as: 'cmd' diff --git a/src/data/models/microserviceExtraHost.js b/src/data/models/microserviceExtraHost.js index 676f62ac4..2f7476233 100644 --- a/src/data/models/microserviceExtraHost.js +++ b/src/data/models/microserviceExtraHost.js @@ -14,9 +14,6 @@ module.exports = (sequelize, DataTypes) => { name: { type: DataTypes.TEXT }, - publicPort: { - type: DataTypes.INTEGER - }, // Only if type is Apps template: { type: DataTypes.TEXT }, // Contains the template string diff --git a/src/data/models/microservicePublicPort.js b/src/data/models/microservicePublicPort.js deleted file mode 100644 index d1f9bc75f..000000000 --- a/src/data/models/microservicePublicPort.js +++ /dev/null @@ -1,88 +0,0 @@ -'use strict' - -module.exports = (sequelize, DataTypes) => { - const MicroservicePublicPort = sequelize.define('MicroservicePublicPort', { - id: { - type: DataTypes.INTEGER, - primaryKey: true, - autoIncrement: true, - allowNull: false, - field: 'id' - }, - portId: { - type: DataTypes.INTEGER, - field: 'port_id' - }, - hostId: { - type: DataTypes.TEXT, - field: 'host_id' - }, - localProxyId: { - type: DataTypes.TEXT, - field: 'local_proxy_id' - }, - remoteProxyId: { - type: DataTypes.TEXT, - field: 'remote_proxy_id' - }, - publicPort: { - type: DataTypes.INTEGER, - field: 'public_port' - }, - queueName: { - type: DataTypes.TEXT, - field: 'queue_name' - }, - schemes: { - type: DataTypes.TEXT, // JSON stringified array of strings - field: 'schemes', - defaultValue: JSON.stringify(['https']) - }, - isTcp: { - type: DataTypes.BOOLEAN, - field: 'is_tcp', - defaultValue: false - }, - protocol: { - type: DataTypes.VIRTUAL, - get () { - return this.getDataValue('isTcp') ? 'tcp' : 'http' - } - } - }, { - tableName: 'MicroservicePublicPorts', - timestamps: true, - underscored: true - }) - MicroservicePublicPort.associate = function (models) { - MicroservicePublicPort.belongsTo(models.MicroservicePort, { - foreignKey: { - name: 'portId', - field: 'port_id' - }, - as: 'port', - onDelete: 'cascade' - }) - - MicroservicePublicPort.belongsTo(models.Fog, { - foreignKey: { - name: 'hostId', - field: 'host_id' - }, - as: 'host', - onDelete: 'cascade' - }) - - MicroservicePublicPort.hasOne(models.Microservice, { - foreignKey: 'uuid', - as: 'localProxy' - }) - - MicroservicePublicPort.hasOne(models.Microservice, { - foreignKey: 'uuid', - as: 'remoteProxy' - }) - } - - return MicroservicePublicPort -} diff --git a/src/data/models/microserviceenv.js b/src/data/models/microserviceenv.js index 837275f5f..977aa5548 100644 --- a/src/data/models/microserviceenv.js +++ b/src/data/models/microserviceenv.js @@ -15,6 +15,14 @@ module.exports = (sequelize, DataTypes) => { value: { type: DataTypes.TEXT, field: 'value' + }, + valueFromSecret: { + type: DataTypes.TEXT, + field: 'value_from_secret' + }, + valueFromConfigMap: { + type: DataTypes.TEXT, + field: 'value_from_config_map' } }, { tableName: 'MicroserviceEnvs', diff --git a/src/data/models/microserviceport.js b/src/data/models/microserviceport.js index a6cee0b28..6fbb67f88 100644 --- a/src/data/models/microserviceport.js +++ b/src/data/models/microserviceport.js @@ -19,14 +19,6 @@ module.exports = (sequelize, DataTypes) => { isUdp: { type: DataTypes.BOOLEAN, field: 'is_udp' - }, - isPublic: { - type: DataTypes.BOOLEAN, - field: 'is_public' - }, - isProxy: { - type: DataTypes.BOOLEAN, - field: 'is_proxy' } }, { tableName: 'MicroservicePorts', @@ -42,11 +34,6 @@ module.exports = (sequelize, DataTypes) => { as: 'microservice', onDelete: 'cascade' }) - - MicroservicePort.hasOne(models.MicroservicePublicPort, { - foreignKey: 'port_id', - as: 'publicPort' - }) } return MicroservicePort } diff --git a/src/data/models/microservicestatus.js b/src/data/models/microservicestatus.js index 136fda266..fde870485 100644 --- a/src/data/models/microservicestatus.js +++ b/src/data/models/microservicestatus.js @@ -65,6 +65,11 @@ module.exports = (sequelize, DataTypes) => { type: DataTypes.TEXT, defaultValue: '', field: 'ip_address' + }, + execSessionId: { + type: DataTypes.TEXT, + defaultValue: '', + field: 'exec_session_id' } }, { tableName: 'MicroserviceStatuses', diff --git a/src/data/models/service.js b/src/data/models/service.js new file mode 100644 index 000000000..86570b49f --- /dev/null +++ b/src/data/models/service.js @@ -0,0 +1,93 @@ +'use strict' +module.exports = (sequelize, DataTypes) => { + const Service = sequelize.define('Service', { + id: { + type: DataTypes.INTEGER, + primaryKey: true, + autoIncrement: true, + allowNull: false, + field: 'id' + }, + name: { + type: DataTypes.TEXT, + allowNull: false, + field: 'name', + unique: true, + index: true + }, + type: { + type: DataTypes.ENUM('microservice', 'k8s', 'agent', 'external'), + allowNull: false, + field: 'type' + }, + resource: { + type: DataTypes.TEXT, + allowNull: false + }, + targetPort: { + type: DataTypes.INTEGER, + allowNull: false, + field: 'target_port' + }, + // protocol: { + // type: DataTypes.ENUM('tcp', 'http'), + // defaultValue: 'tcp', + // allowNull: false + // }, + servicePort: { + type: DataTypes.INTEGER, + allowNull: true, + field: 'service_port' + }, + k8sType: { + type: DataTypes.ENUM('LoadBalancer', 'ClusterIP', 'NodePort'), + allowNull: true, + field: 'k8s_type' + }, + bridgePort: { + type: DataTypes.INTEGER, + allowNull: true, + field: 'bridge_port' + }, + defaultBridge: { + type: DataTypes.TEXT, + allowNull: false, + field: 'default_bridge', + defaultValue: 'default-router' + }, + serviceEndpoint: { + type: DataTypes.TEXT, + field: 'service_endpoint' + }, + provisioningStatus: { + type: DataTypes.ENUM('pending', 'ready', 'failed'), + allowNull: false, + field: 'provisioning_status', + defaultValue: 'pending' + }, + provisioningError: { + type: DataTypes.TEXT, + field: 'provisioning_error' + } + }, { + tableName: 'Services', + timestamps: true, + underscored: true + }) + + Service.associate = function (models) { + Service.belongsTo(models.Microservice, { + foreignKey: { + name: 'resource', + field: 'resource' + }, + as: 'microservice', + // We don't want to enforce this constraint since resource could be various types + constraints: false + }) + // Relationship with tags + Service.belongsToMany(models.Tags, { as: 'tags', through: 'ServiceTags' }) + } + + return Service +} diff --git a/src/data/models/serviceTags.js b/src/data/models/serviceTags.js new file mode 100644 index 000000000..6019d6ea5 --- /dev/null +++ b/src/data/models/serviceTags.js @@ -0,0 +1,9 @@ +'use strict' +module.exports = (sequelize, DataTypes) => { + const ServiceTags = sequelize.define('ServiceTags', {}, { + tableName: 'ServiceTags', + timestamps: false, + underscored: true + }) + return ServiceTags +} diff --git a/src/data/models/tags.js b/src/data/models/tags.js index 356cf4624..9c7957722 100644 --- a/src/data/models/tags.js +++ b/src/data/models/tags.js @@ -24,6 +24,7 @@ module.exports = (sequelize, DataTypes) => { Tags.belongsToMany(models.EdgeResource, { through: 'EdgeResourceOrchestrationTags', as: 'edgeResources' }) Tags.belongsToMany(models.Microservice, { through: 'MicroservicePubTags', as: 'pubMicroservices' }) Tags.belongsToMany(models.Microservice, { through: 'MicroserviceSubTags', as: 'subMicroservices' }) + Tags.belongsToMany(models.Service, { through: 'ServiceTags', as: 'services' }) } return Tags } diff --git a/src/data/models/volumeMount.js b/src/data/models/volumeMount.js new file mode 100644 index 000000000..0bdf2f2f2 --- /dev/null +++ b/src/data/models/volumeMount.js @@ -0,0 +1,43 @@ +'use strict' + +module.exports = (sequelize, DataTypes) => { + const VolumeMount = sequelize.define('VolumeMount', { + uuid: { + type: DataTypes.STRING(32), + primaryKey: true, + allowNull: false, + field: 'uuid' + }, + name: { + type: DataTypes.STRING, + allowNull: false, + field: 'name' + }, + configMapName: { + type: DataTypes.STRING, + allowNull: true, + field: 'config_map_name' + }, + secretName: { + type: DataTypes.STRING, + allowNull: true, + field: 'secret_name' + }, + version: { + type: DataTypes.INTEGER, + allowNull: false, + defaultValue: 1, + field: 'version' + } + }, { + tableName: 'VolumeMounts', + timestamps: true, + underscored: true + }) + + VolumeMount.associate = function (models) { + VolumeMount.belongsToMany(models.Fog, { through: 'FogVolumeMounts', as: 'fogs' }) + } + + return VolumeMount +} diff --git a/src/data/providers/database-provider.js b/src/data/providers/database-provider.js index df1ef454b..2035eb1d3 100644 --- a/src/data/providers/database-provider.js +++ b/src/data/providers/database-provider.js @@ -352,10 +352,19 @@ class DatabaseProvider { try { await db.query(query) } catch (err) { - if (err.code === 'ER_TABLE_EXISTS_ERROR' || - err.code === 'ER_DUP_FIELDNAME' || - err.code === 'ER_DUP_KEYNAME') { - logger.warn(`Ignored MySQL error: ${err.message}`) + // Check both the error and its parent (for Sequelize errors) + const errorToCheck = err.parent || err + if (errorToCheck.code === 'ER_TABLE_EXISTS_ERROR' || + errorToCheck.code === 'ER_DUP_FIELDNAME' || + errorToCheck.code === 'ER_DUP_KEYNAME' || + errorToCheck.code === 'ER_BLOB_KEY_WITHOUT_LENGTH' || + errorToCheck.code === 'ER_CANT_DROP_FIELD_OR_KEY' || + errorToCheck.code === 'duplicate_key' || + errorToCheck.code === 'already_exists' || + errorToCheck.errno === 1091 || + errorToCheck.errno === 1061 || + errorToCheck.errno === 1170) { + logger.warn(`Ignored MySQL error: ${errorToCheck.message}`) } else { await db.query('ROLLBACK') throw err @@ -404,10 +413,33 @@ class DatabaseProvider { try { await db.query(query) } catch (err) { - if (err.code === '42P07' || // duplicate_table - err.code === '42701' || // duplicate_column - err.code === '42P06') { // duplicate_schema - logger.warn(`Ignored PostgreSQL error: ${err.message}`) + // Check both the error and its parent (for Sequelize errors) + const errorToCheck = err.parent || err + + // If transaction is aborted, rollback and start new transaction + if (errorToCheck.code === '25P02') { + logger.warn('Transaction aborted, rolling back and starting new transaction...') + await db.query('ROLLBACK') + await db.query('BEGIN') + continue + } + + if (errorToCheck.code === '42P07' || // duplicate_table + errorToCheck.code === '42701' || // duplicate_column + errorToCheck.code === '42P06' || // duplicate_schema + errorToCheck.code === '23505' || // unique_violation + errorToCheck.code === '23503' || // foreign_key_violation + errorToCheck.code === '42P01' || // undefined_table + errorToCheck.code === '42703' || // undefined_column + errorToCheck.code === '42P16' || // invalid_table_definition + errorToCheck.code === '42P17' || // invalid_table_definition + errorToCheck.code === '42P18' || // invalid_table_definition + (errorToCheck.message && ( + errorToCheck.message.includes('already exists') || + errorToCheck.message.includes('duplicate key') || + errorToCheck.message.includes('relation') + ))) { + logger.warn(`Ignored PostgreSQL error: ${errorToCheck.message}`) } else { await db.query('ROLLBACK') throw err diff --git a/src/data/providers/mysql.js b/src/data/providers/mysql.js index 4225a2041..8cf6e9cc8 100644 --- a/src/data/providers/mysql.js +++ b/src/data/providers/mysql.js @@ -45,7 +45,10 @@ class MySqlDatabaseProvider extends DatabaseProvider { const connection = await mysql.createConnection(this.connectionOptions) await connection.end() } catch (err) { - if (err.code === 'ER_BAD_DB_ERROR') { + // Check both the error and its parent (for Sequelize errors) + const errorToCheck = err.parent || err + + if (errorToCheck.code === 'ER_BAD_DB_ERROR') { // Database doesn't exist, try to create it logger.info('Database does not exist, attempting to create it...') const { database, ...connectionConfig } = this.connectionOptions @@ -56,6 +59,15 @@ class MySqlDatabaseProvider extends DatabaseProvider { } finally { await tempConnection.end() } + } else if (errorToCheck.code === 'ER_DUP_KEYNAME' || + errorToCheck.errno === 1061 || + (errorToCheck.message && ( + errorToCheck.message.includes('Error 1050') || // Table already exists + errorToCheck.message.includes('Error 1060') || // Duplicate column name + errorToCheck.message.includes('Error 1054') || // Unknown column + errorToCheck.message.includes('Error 1061') // Duplicate key name + ))) { + logger.info(`Ignoring known MySQL error: ${errorToCheck.message}`) } else { throw err } diff --git a/src/data/seeders/mysql/db_seeder_mysql_v1.0.2.sql b/src/data/seeders/mysql/db_seeder_mysql_v1.0.2.sql index bfa21802b..c9e84aa97 100644 --- a/src/data/seeders/mysql/db_seeder_mysql_v1.0.2.sql +++ b/src/data/seeders/mysql/db_seeder_mysql_v1.0.2.sql @@ -11,8 +11,7 @@ VALUES ('RESTBlue', 'REST API for Bluetooth Low Energy layer.', 'SYSTEM', 'Datasance', 0, 0, 'none.png', NULL, true, 1), ('HAL', 'REST API for Hardware Abstraction layer.', 'SYSTEM', 'Datasance', 0, 0, 'none.png', NULL, true, 1), ('EdgeGuard', 'Security and monitoring component for edge devices running ioFog Agents.', 'UTILITIES', 'Datasance', 0, 0, 'none.png', NULL, true, 1), - ('Router', 'The built-in router for Datasance PoT.', 'SYSTEM', 'Datasance', 0, 0, 'none.png', NULL, false, 1), - ('Proxy', 'The built-in proxy for Datasance PoT.', 'SYSTEM', 'Datasance', 0, 0, 'none.png', NULL, false, 1); + ('Router', 'The built-in router for Datasance PoT.', 'SYSTEM', 'Datasance', 0, 0, 'none.png', NULL, false, 1); INSERT INTO `FogTypes` (id, name, image, description, network_catalog_item_id, hal_catalog_item_id, bluetooth_catalog_item_id) VALUES @@ -35,9 +34,7 @@ VALUES (4, 1, 'ghcr.io/datasance/edge-guard:latest'), (4, 2, 'ghcr.io/datasance/edge-guard:latest'), (5, 1, 'ghcr.io/datasance/router:latest'), - (5, 2, 'ghcr.io/datasance/router:latest'), - (6, 1, 'ghcr.io/datasance/proxy:latest'), - (6, 2, 'ghcr.io/datasance/proxy:latest'); + (5, 2, 'ghcr.io/datasance/router:latest'); COMMIT; \ No newline at end of file diff --git a/src/data/seeders/postgres/db_seeder_pg_v1.0.2.sql b/src/data/seeders/postgres/db_seeder_pg_v1.0.2.sql index aaa987d9e..629a028ce 100644 --- a/src/data/seeders/postgres/db_seeder_pg_v1.0.2.sql +++ b/src/data/seeders/postgres/db_seeder_pg_v1.0.2.sql @@ -11,8 +11,7 @@ VALUES ('RESTBlue', 'REST API for Bluetooth Low Energy layer.', 'SYSTEM', 'Datasance', 0, 0, 'none.png', NULL, true, 1), ('HAL', 'REST API for Hardware Abstraction layer.', 'SYSTEM', 'Datasance', 0, 0, 'none.png', NULL, true, 1), ('EdgeGuard', 'Security and monitoring component for edge devices running ioFog Agents.', 'UTILITIES', 'Datasance', 0, 0, 'none.png', NULL, true, 1), - ('Router', 'The built-in router for Datasance PoT.', 'SYSTEM', 'Datasance', 0, 0, 'none.png', NULL, false, 1), - ('Proxy', 'The built-in proxy for Datasance PoT.', 'SYSTEM', 'Datasance', 0, 0, 'none.png', NULL, false, 1); + ('Router', 'The built-in router for Datasance PoT.', 'SYSTEM', 'Datasance', 0, 0, 'none.png', NULL, false, 1); INSERT INTO "FogTypes" (id, name, image, description, network_catalog_item_id, hal_catalog_item_id, bluetooth_catalog_item_id) VALUES @@ -35,8 +34,6 @@ VALUES (4, 1, 'ghcr.io/datasance/edge-guard:latest'), (4, 2, 'ghcr.io/datasance/edge-guard:latest'), (5, 1, 'ghcr.io/datasance/router:latest'), - (5, 2, 'ghcr.io/datasance/router:latest'), - (6, 1, 'ghcr.io/datasance/proxy:latest'), - (6, 2, 'ghcr.io/datasance/proxy:latest'); + (5, 2, 'ghcr.io/datasance/router:latest'); COMMIT; \ No newline at end of file diff --git a/src/data/seeders/sqlite/db_seeder_sqlite_v1.0.2.sql b/src/data/seeders/sqlite/db_seeder_sqlite_v1.0.2.sql index 9a2cdccda..3835917c7 100644 --- a/src/data/seeders/sqlite/db_seeder_sqlite_v1.0.2.sql +++ b/src/data/seeders/sqlite/db_seeder_sqlite_v1.0.2.sql @@ -9,8 +9,7 @@ VALUES ('RESTBlue', 'REST API for Bluetooth Low Energy layer.', 'SYSTEM', 'Datasance', 0, 0, 'none.png', NULL, true, 1), ('HAL', 'REST API for Hardware Abstraction layer.', 'SYSTEM', 'Datasance', 0, 0, 'none.png', NULL, true, 1), ('EdgeGuard', 'Security and monitoring component for edge devices running ioFog Agents.', 'UTILITIES', 'Datasance', 0, 0, 'none.png', NULL, true, 1), - ('Router', 'The built-in router for Datasance PoT.', 'SYSTEM', 'Datasance', 0, 0, 'none.png', NULL, false, 1), - ('Proxy', 'The built-in proxy for Datasance PoT.', 'SYSTEM', 'Datasance', 0, 0, 'none.png', NULL, false, 1); + ('Router', 'The built-in router for Datasance PoT.', 'SYSTEM', 'Datasance', 0, 0, 'none.png', NULL, false, 1); INSERT INTO `FogTypes` (id, name, image, description, network_catalog_item_id, hal_catalog_item_id, bluetooth_catalog_item_id) VALUES @@ -33,6 +32,4 @@ VALUES (4, 1, 'ghcr.io/datasance/edge-guard:latest'), (4, 2, 'ghcr.io/datasance/edge-guard:latest'), (5, 1, 'ghcr.io/datasance/router:latest'), - (5, 2, 'ghcr.io/datasance/router:latest'), - (6, 1, 'ghcr.io/datasance/proxy:latest'), - (6, 2, 'ghcr.io/datasance/proxy:latest'); + (5, 2, 'ghcr.io/datasance/router:latest'); diff --git a/src/enums/fog-state.js b/src/enums/fog-state.js index f33d5da4f..8c3a4d09b 100644 --- a/src/enums/fog-state.js +++ b/src/enums/fog-state.js @@ -13,7 +13,13 @@ const fogState = { UNKNOWN: 'UNKNOWN', - RUNNING: 'RUNNING' + RUNNING: 'RUNNING', + STOPPED: 'STOPPED', + WAITING: 'WAITING', + WARNING: 'WARNING', + DEPROVISIONED: 'DEPROVISIONED', + ERROR: 'ERROR', + NOT_PROVISIONED: 'NOT_PROVISIONED' } module.exports = fogState diff --git a/src/helpers/app-helper.js b/src/helpers/app-helper.js index 8a9a26bfd..070b97e02 100644 --- a/src/helpers/app-helper.js +++ b/src/helpers/app-helper.js @@ -13,6 +13,7 @@ const crypto = require('crypto') const Errors = require('./errors') +const { v4: uuidv4 } = require('uuid') const logger = require('../logger') const fs = require('fs') @@ -60,6 +61,10 @@ function generateRandomString (size) { return randString } +function generateUUID () { + return uuidv4() +} + // Checks the status of a single port // returns 'closed' if port is available // returns 'open' if port is not available @@ -194,6 +199,7 @@ module.exports = { encryptText, decryptText, generateRandomString, + generateUUID, isFileExists, isValidPort, isValidDomain, diff --git a/src/helpers/error-messages.js b/src/helpers/error-messages.js index af41a2c55..1e373ab60 100644 --- a/src/helpers/error-messages.js +++ b/src/helpers/error-messages.js @@ -25,6 +25,7 @@ module.exports = { INVALID_IOFOG_UUID: 'Invalid ioFog UUID \'{}\'', INVALID_USER_EMAIL: 'Invalid user email', INVALID_MICROSERVICE_UUID: 'Invalid microservice UUID \'{}\'', + INVALID_MICROSERVICE_NAME: 'Invalid microservice NAME \'{}\'', INVALID_SOURCE_MICROSERVICE_UUID: 'Invalid source microservice UUID \'{}\'', INVALID_DEST_MICROSERVICE_UUID: 'Invalid destination microservice UUID \'{}\'', INVALID_SOURCE_MICROSERVICE_NAME: 'Invalid source microservice name \'{}\'', @@ -102,6 +103,7 @@ module.exports = { PORT_RESERVED: 'Port \'{}\' is reserved for internal use', INVALID_HOST_TEMPLATE: '{} is not a valid host template', NOT_FOUND_HOST_TEMPLATE: 'Could not find {} host template', + NOT_FOUND_APPS_TEMPLATE: 'The microservice you would like to add as an extra host is not in the same fog as the microservice you are adding it to', MISSING_IMAGE: 'Microservice {} does not have a valid image for its Agent type', DUPLICATE_RESOURCE_NAME_VERSION: 'Resource {} version {} already exists', NOT_FOUND_RESOURCE_NAME_VERSION: 'Could not find resource {} version {}', @@ -115,8 +117,8 @@ module.exports = { INVALID_MICROSERVICE_SUB_TAG: 'Invalid microservice Sub Tag \'{}\'', NOTFOUND_MICROSERVICE_PUB_TAG: 'No microservice found for Pub Tag \'{}\'', NOTFOUND_MICROSERVICE_SUB_TAG: 'No microservice found for Sub Tag \'{}\'', - SECRET_ALREADY_EXISTS: 'Secret with name "{0}" already exists', - SECRET_NOT_FOUND: 'Secret with name "{0}" not found', + SECRET_ALREADY_EXISTS: 'Secret with name "{}" already exists', + SECRET_NOT_FOUND: 'Secret with name "{}" not found', // Certificate related error messages CA_ALREADY_EXISTS: 'CA with name %s already exists', CA_NOT_FOUND: 'CA with name %s not found', @@ -125,5 +127,16 @@ module.exports = { INVALID_CERTIFICATE: 'Invalid certificate: %s', INVALID_CA: 'Invalid CA: %s', NOT_KUBERNETES_ENV: 'Controller is not running in Kubernetes environment', - K8S_SECRET_NOT_ALLOWED: 'Kubernetes secret type is not allowed in non-Kubernetes environment' + K8S_SECRET_NOT_ALLOWED: 'Kubernetes secret type is not allowed in non-Kubernetes environment', + INVALID_DEFAULT_BRIDGE: 'Invalid default bridge, If service type is not microservice, defaultBridge must be default-router\'{}\'', + INVALID_ROUTER_CONNECTION: 'Invalid router connection, router {} is not connected to {}', + NO_AVAILABLE_BRIDGE_PORT: 'No bridge port available in range for {}', + CONFIGMAP_ALREADY_EXISTS: 'ConfigMap with name {} already exists', + CONFIGMAP_NOT_FOUND: 'ConfigMap with name {} not found', + INVALID_SECRET_REFERENCE: 'Invalid secret reference: {}', + INVALID_CONFIGMAP_REFERENCE: 'Invalid configmap reference: {}', + SECRET_KEY_NOT_FOUND: 'Secret key {} not found in secret {}', + CONFIGMAP_KEY_NOT_FOUND: 'Configmap key {} not found in configmap {}', + CONFIGMAP_IMMUTABLE: 'Configmap {} is immutable and cannot be updated. If you want to update it, please delete it and create a new configmap.', + VOLUME_MOUNT_NOT_FOUND: 'Volume mount with name {} not found' } diff --git a/src/helpers/template-helper.js b/src/helpers/template-helper.js index 9ecdcf9d8..a75ba093e 100755 --- a/src/helpers/template-helper.js +++ b/src/helpers/template-helper.js @@ -138,7 +138,7 @@ const rvaluesVarSubstition = async (subjects, templateContext) => { let context = templateContext // Due to the recursive nature of this function, user will only be defined on the first iteration context = { - ...templateContext, + ...templateContext // Private context // _user: user // need by edge resource and every on demand request } @@ -169,7 +169,7 @@ const substitutionMiddleware = async (req, res, next) => { if (['POST', 'PUT', 'PATCH'].indexOf(req.method) > -1) { // let user let tmplContext = { - self: req.body, + self: req.body // Private context // _user: user // need by edge resource and every on demand request } diff --git a/src/jobs/fog-status-job.js b/src/jobs/fog-status-job.js index e07370809..8842d1184 100644 --- a/src/jobs/fog-status-job.js +++ b/src/jobs/fog-status-job.js @@ -42,7 +42,10 @@ async function updateFogsConnectionStatus (transaction) { async function _updateFogStatus (transaction) { const statusUpdateTolerance = Config.get('settings.fogStatusUpdateTolerance') - const fogs = await FogManager.findAll({ daemonStatus: FogStates.RUNNING }, transaction) + const fogs = [ + ...await FogManager.findAll({ daemonStatus: FogStates.RUNNING }, transaction), + ...await FogManager.findAll({ daemonStatus: FogStates.WARNING }, transaction) + ] const unknownFogUuids = fogs .filter((fog) => { const statusUpdateToleranceMs = fog.statusFrequency * 1000 * statusUpdateTolerance diff --git a/src/routes/agent.js b/src/routes/agent.js index f43836fbe..9196b4e5d 100644 --- a/src/routes/agent.js +++ b/src/routes/agent.js @@ -245,6 +245,31 @@ module.exports = [ logger.apiRes({ req: req, res: res, responseObject: responseObject }) } }, + { + method: 'get', + path: '/api/v3/agent/volumeMounts', + middleware: async (req, res) => { + logger.apiReq(req) + + const successCode = constants.HTTP_CODE_SUCCESS + const errorCodes = [ + { + code: constants.HTTP_CODE_UNAUTHORIZED, + errors: [Errors.AuthenticationError] + } + ] + + const getAgentLinkedVolumeMountsEndpoint = ResponseDecorator.handleErrors(AgentController.getAgentLinkedVolumeMountsEndpoint, + successCode, errorCodes) + const responseObject = await getAgentLinkedVolumeMountsEndpoint(req) + + res + .status(responseObject.code) + .send(responseObject.body) + + logger.apiRes({ req: req, res: res, responseObject: responseObject }) + } + }, { method: 'get', path: '/api/v3/agent/microservices', diff --git a/src/routes/configMap.js b/src/routes/configMap.js new file mode 100644 index 000000000..4d6484196 --- /dev/null +++ b/src/routes/configMap.js @@ -0,0 +1,246 @@ +/* + * ******************************************************************************* + * * Copyright (c) 2023 Datasance Teknoloji A.S. + * * + * * This program and the accompanying materials are made available under the + * * terms of the Eclipse Public License v. 2.0 which is available at + * * http://www.eclipse.org/legal/epl-2.0 + * * + * * SPDX-License-Identifier: EPL-2.0 + * ******************************************************************************* + * + */ + +const constants = require('../helpers/constants') +const ConfigMapController = require('../controllers/config-map-controller') +const ResponseDecorator = require('../decorators/response-decorator') +const logger = require('../logger') +const Errors = require('../helpers/errors') +const keycloak = require('../config/keycloak.js').initKeycloak() + +module.exports = [ + { + method: 'post', + path: '/api/v3/configmaps', + middleware: async (req, res) => { + logger.apiReq(req) + + const successCode = constants.HTTP_CODE_CREATED + const errorCodes = [ + { + code: constants.HTTP_CODE_UNAUTHORIZED, + errors: [Errors.AuthenticationError] + }, + { + code: constants.HTTP_CODE_BAD_REQUEST, + errors: [Errors.ValidationError] + }, + { + code: constants.HTTP_CODE_CONFLICT, + errors: [Errors.ConflictError] + } + ] + + await keycloak.protect(['SRE', 'Developer'])(req, res, async () => { + const createConfigMapEndpoint = ResponseDecorator.handleErrors(ConfigMapController.createConfigMapEndpoint, successCode, errorCodes) + const responseObject = await createConfigMapEndpoint(req) + const user = req.kauth.grant.access_token.content.preferred_username + res + .status(responseObject.code) + .send(responseObject.body) + + logger.apiRes({ req: req, user: user, res: res, responseObject: responseObject }) + }) + } + }, + { + method: 'post', + path: '/api/v3/configmaps/yaml', + fileInput: 'configMap', + middleware: async (req, res) => { + logger.apiReq(req) + + const successCode = constants.HTTP_CODE_CREATED + const errorCodes = [ + { + code: constants.HTTP_CODE_UNAUTHORIZED, + errors: [Errors.AuthenticationError] + }, + { + code: constants.HTTP_CODE_BAD_REQUEST, + errors: [Errors.ValidationError] + }, + { + code: constants.HTTP_CODE_CONFLICT, + errors: [Errors.ConflictError] + } + ] + + await keycloak.protect(['SRE', 'Developer'])(req, res, async () => { + const createConfigMapFromYamlEndpoint = ResponseDecorator.handleErrors(ConfigMapController.createConfigMapFromYamlEndpoint, successCode, errorCodes) + const responseObject = await createConfigMapFromYamlEndpoint(req) + const user = req.kauth.grant.access_token.content.preferred_username + res + .status(responseObject.code) + .send(responseObject.body) + + logger.apiRes({ req: req, user: user, res: res, responseObject: responseObject }) + }) + } + }, + { + method: 'patch', + path: '/api/v3/configmaps/:name', + middleware: async (req, res) => { + logger.apiReq(req) + + const successCode = constants.HTTP_CODE_SUCCESS + const errorCodes = [ + { + code: constants.HTTP_CODE_UNAUTHORIZED, + errors: [Errors.AuthenticationError] + }, + { + code: constants.HTTP_CODE_BAD_REQUEST, + errors: [Errors.ValidationError] + }, + { + code: constants.HTTP_CODE_NOT_FOUND, + errors: [Errors.NotFoundError] + } + ] + + await keycloak.protect(['SRE', 'Developer'])(req, res, async () => { + const updateConfigMapEndpoint = ResponseDecorator.handleErrors(ConfigMapController.updateConfigMapEndpoint, successCode, errorCodes) + const responseObject = await updateConfigMapEndpoint(req) + const user = req.kauth.grant.access_token.content.preferred_username + res + .status(responseObject.code) + .send(responseObject.body) + + logger.apiRes({ req: req, user: user, res: res, responseObject: responseObject }) + }) + } + }, + { + method: 'patch', + path: '/api/v3/configmaps/yaml/:name', + fileInput: 'configMap', + middleware: async (req, res) => { + logger.apiReq(req) + + const successCode = constants.HTTP_CODE_SUCCESS + const errorCodes = [ + { + code: constants.HTTP_CODE_UNAUTHORIZED, + errors: [Errors.AuthenticationError] + }, + { + code: constants.HTTP_CODE_BAD_REQUEST, + errors: [Errors.ValidationError] + }, + { + code: constants.HTTP_CODE_NOT_FOUND, + errors: [Errors.NotFoundError] + } + ] + + await keycloak.protect(['SRE', 'Developer'])(req, res, async () => { + const updateConfigMapFromYamlEndpoint = ResponseDecorator.handleErrors(ConfigMapController.updateConfigMapFromYamlEndpoint, successCode, errorCodes) + const responseObject = await updateConfigMapFromYamlEndpoint(req) + const user = req.kauth.grant.access_token.content.preferred_username + res + .status(responseObject.code) + .send(responseObject.body) + + logger.apiRes({ req: req, user: user, res: res, responseObject: responseObject }) + }) + } + }, + { + method: 'get', + path: '/api/v3/configmaps/:name', + middleware: async (req, res) => { + logger.apiReq(req) + + const successCode = constants.HTTP_CODE_SUCCESS + const errorCodes = [ + { + code: constants.HTTP_CODE_UNAUTHORIZED, + errors: [Errors.AuthenticationError] + }, + { + code: constants.HTTP_CODE_NOT_FOUND, + errors: [Errors.NotFoundError] + } + ] + + await keycloak.protect(['SRE', 'Developer', 'Viewer'])(req, res, async () => { + const getConfigMapEndpoint = ResponseDecorator.handleErrors(ConfigMapController.getConfigMapEndpoint, successCode, errorCodes) + const responseObject = await getConfigMapEndpoint(req) + const user = req.kauth.grant.access_token.content.preferred_username + res + .status(responseObject.code) + .send(responseObject.body) + + logger.apiRes({ req: req, user: user, res: res, responseObject: responseObject }) + }) + } + }, + { + method: 'get', + path: '/api/v3/configmaps', + middleware: async (req, res) => { + logger.apiReq(req) + + const successCode = constants.HTTP_CODE_SUCCESS + const errorCodes = [ + { + code: constants.HTTP_CODE_UNAUTHORIZED, + errors: [Errors.AuthenticationError] + } + ] + + await keycloak.protect(['SRE', 'Developer', 'Viewer'])(req, res, async () => { + const listConfigMapsEndpoint = ResponseDecorator.handleErrors(ConfigMapController.listConfigMapsEndpoint, successCode, errorCodes) + const responseObject = await listConfigMapsEndpoint(req) + const user = req.kauth.grant.access_token.content.preferred_username + res + .status(responseObject.code) + .send(responseObject.body) + + logger.apiRes({ req: req, user: user, res: res, responseObject: responseObject }) + }) + } + }, + { + method: 'delete', + path: '/api/v3/configmaps/:name', + middleware: async (req, res) => { + logger.apiReq(req) + + const successCode = constants.HTTP_CODE_SUCCESS + const errorCodes = [ + { + code: constants.HTTP_CODE_UNAUTHORIZED, + errors: [Errors.AuthenticationError] + }, + { + code: constants.HTTP_CODE_NOT_FOUND, + errors: [Errors.NotFoundError] + } + ] + + await keycloak.protect(['SRE', 'Developer'])(req, res, async () => { + const deleteConfigMapEndpoint = ResponseDecorator.handleErrors(ConfigMapController.deleteConfigMapEndpoint, successCode, errorCodes) + const responseObject = await deleteConfigMapEndpoint(req) + const user = req.kauth.grant.access_token.content.preferred_username + res + .status(responseObject.code) + .send(responseObject.body) + + logger.apiRes({ req: req, user: user, res: res, responseObject: responseObject }) + }) + } + } +] diff --git a/src/routes/microservices.js b/src/routes/microservices.js index 38bef8d60..7c1d1f029 100644 --- a/src/routes/microservices.js +++ b/src/routes/microservices.js @@ -18,36 +18,6 @@ const logger = require('../logger') const keycloak = require('../config/keycloak.js').initKeycloak() module.exports = [ - { - method: 'get', - path: '/api/v3/microservices/public-ports', - middleware: async (req, res) => { - logger.apiReq(req) - - const successCode = constants.HTTP_CODE_SUCCESS - const errorCodes = [ - { - code: constants.HTTP_CODE_UNAUTHORIZED, - errors: [Errors.AuthenticationError] - } - ] - - await keycloak.protect(['SRE', 'Developer', 'Viewer'])(req, res, async () => { - const listAllPublicPortsEndPoint = ResponseDecorator.handleErrors( - MicroservicesController.listAllPublicPortsEndPoint, - successCode, - errorCodes - ) - const responseObject = await listAllPublicPortsEndPoint(req) - const user = req.kauth.grant.access_token.content.preferred_username - res - .status(responseObject.code) - .send(responseObject.body) - - logger.apiRes({ req: req, user: user, res: res, responseObject: responseObject }) - }) - } - }, { method: 'get', path: '/api/v3/microservices/', @@ -861,5 +831,157 @@ module.exports = [ logger.apiRes({ req: req, user: user, res: res, responseObject: responseObject }) }) } - } + }, + { + method: 'post', + path: '/api/v3/microservices/:uuid/exec', + middleware: async (req, res) => { + logger.apiReq(req) + + const successCode = constants.HTTP_CODE_CREATED + const errorCodes = [ + { + code: constants.HTTP_CODE_BAD_REQUEST, + errors: [Errors.ValidationError] + }, + { + code: constants.HTTP_CODE_UNAUTHORIZED, + errors: [Errors.AuthenticationError] + }, + { + code: constants.HTTP_CODE_NOT_FOUND, + errors: [Errors.NotFoundError] + } + ] + + await keycloak.protect(['SRE', 'Developer'])(req, res, async () => { + const createMicroserviceExecEndPoint = ResponseDecorator.handleErrors( + MicroservicesController.createMicroserviceExecEndPoint, + successCode, + errorCodes + ) + const responseObject = await createMicroserviceExecEndPoint(req) + const user = req.kauth.grant.access_token.content.preferred_username + res + .status(responseObject.code) + .send(responseObject.body) + + logger.apiRes({ req: req, user: user, res: res, responseObject: responseObject }) + }) + } + }, + { + method: 'post', + path: '/api/v3/microservices/system/:uuid/exec', + middleware: async (req, res) => { + logger.apiReq(req) + + const successCode = constants.HTTP_CODE_CREATED + const errorCodes = [ + { + code: constants.HTTP_CODE_BAD_REQUEST, + errors: [Errors.ValidationError] + }, + { + code: constants.HTTP_CODE_UNAUTHORIZED, + errors: [Errors.AuthenticationError] + }, + { + code: constants.HTTP_CODE_NOT_FOUND, + errors: [Errors.NotFoundError] + } + ] + + await keycloak.protect(['SRE'])(req, res, async () => { + const createSystemMicroserviceExecEndPoint = ResponseDecorator.handleErrors( + MicroservicesController.createSystemMicroserviceExecEndPoint, + successCode, + errorCodes + ) + const responseObject = await createSystemMicroserviceExecEndPoint(req) + const user = req.kauth.grant.access_token.content.preferred_username + res + .status(responseObject.code) + .send(responseObject.body) + + logger.apiRes({ req: req, user: user, res: res, responseObject: responseObject }) + }) + } + }, + { + method: 'delete', + path: '/api/v3/microservices/:uuid/exec', + middleware: async (req, res) => { + logger.apiReq(req) + + const successCode = constants.HTTP_CODE_CREATED + const errorCodes = [ + { + code: constants.HTTP_CODE_BAD_REQUEST, + errors: [Errors.ValidationError] + }, + { + code: constants.HTTP_CODE_UNAUTHORIZED, + errors: [Errors.AuthenticationError] + }, + { + code: constants.HTTP_CODE_NOT_FOUND, + errors: [Errors.NotFoundError] + } + ] + + await keycloak.protect(['SRE', 'Developer'])(req, res, async () => { + const deleteMicroserviceExecEndPoint = ResponseDecorator.handleErrors( + MicroservicesController.deleteMicroserviceExecEndPoint, + successCode, + errorCodes + ) + const responseObject = await deleteMicroserviceExecEndPoint(req) + const user = req.kauth.grant.access_token.content.preferred_username + res + .status(responseObject.code) + .send(responseObject.body) + + logger.apiRes({ req: req, user: user, res: res, responseObject: responseObject }) + }) + } + }, + { + method: 'delete', + path: '/api/v3/microservices/system/:uuid/exec', + middleware: async (req, res) => { + logger.apiReq(req) + + const successCode = constants.HTTP_CODE_CREATED + const errorCodes = [ + { + code: constants.HTTP_CODE_BAD_REQUEST, + errors: [Errors.ValidationError] + }, + { + code: constants.HTTP_CODE_UNAUTHORIZED, + errors: [Errors.AuthenticationError] + }, + { + code: constants.HTTP_CODE_NOT_FOUND, + errors: [Errors.NotFoundError] + } + ] + + await keycloak.protect(['SRE'])(req, res, async () => { + const deleteSystemMicroserviceExecEndPoint = ResponseDecorator.handleErrors( + MicroservicesController.deleteSystemMicroserviceExecEndPoint, + successCode, + errorCodes + ) + const responseObject = await deleteSystemMicroserviceExecEndPoint(req) + const user = req.kauth.grant.access_token.content.preferred_username + res + .status(responseObject.code) + .send(responseObject.body) + + logger.apiRes({ req: req, user: user, res: res, responseObject: responseObject }) + }) + } + }, ] diff --git a/src/routes/secret.js b/src/routes/secret.js index 54289adfa..b6c6f55ae 100644 --- a/src/routes/secret.js +++ b/src/routes/secret.js @@ -89,7 +89,7 @@ module.exports = [ } }, { - method: 'put', + method: 'patch', path: '/api/v3/secrets/:name', middleware: async (req, res) => { logger.apiReq(req) @@ -123,7 +123,7 @@ module.exports = [ } }, { - method: 'put', + method: 'patch', path: '/api/v3/secrets/yaml/:name', fileInput: 'secret', middleware: async (req, res) => { diff --git a/src/routes/service.js b/src/routes/service.js new file mode 100644 index 000000000..e3f198ba1 --- /dev/null +++ b/src/routes/service.js @@ -0,0 +1,274 @@ +/* + * ******************************************************************************* + * * Copyright (c) 2023 Datasance Teknoloji A.S. + * * + * * This program and the accompanying materials are made available under the + * * terms of the Eclipse Public License v. 2.0 which is available at + * * http://www.eclipse.org/legal/epl-2.0 + * * + * * SPDX-License-Identifier: EPL-2.0 + * ******************************************************************************* + * + */ + +const constants = require('../helpers/constants') +const ServiceController = require('../controllers/service-controller') +const ResponseDecorator = require('../decorators/response-decorator') +const logger = require('../logger') +const Errors = require('../helpers/errors') +const keycloak = require('../config/keycloak.js').initKeycloak() + +module.exports = [ + { + method: 'get', + path: '/api/v3/services', + middleware: async (req, res) => { + logger.apiReq(req) + + const successCode = constants.HTTP_CODE_SUCCESS + const errorCodes = [ + { + code: constants.HTTP_CODE_UNAUTHORIZED, + errors: [Errors.AuthenticationError] + } + ] + + await keycloak.protect(['SRE', 'Developer', 'Viewer'])(req, res, async () => { + const listServicesEndpoint = ResponseDecorator.handleErrors( + ServiceController.listServicesEndpoint, + successCode, + errorCodes + ) + const responseObject = await listServicesEndpoint(req) + const user = req.kauth.grant.access_token.content.preferred_username + res + .status(responseObject.code) + .send(responseObject.body) + + logger.apiRes({ req: req, user: user, res: res, responseObject: responseObject }) + }) + } + }, + { + method: 'get', + path: '/api/v3/services/:name', + middleware: async (req, res) => { + logger.apiReq(req) + + const successCode = constants.HTTP_CODE_SUCCESS + const errorCodes = [ + { + code: constants.HTTP_CODE_UNAUTHORIZED, + errors: [Errors.AuthenticationError] + }, + { + code: constants.HTTP_CODE_NOT_FOUND, + errors: [Errors.NotFoundError] + } + ] + + await keycloak.protect(['SRE', 'Developer', 'Viewer'])(req, res, async () => { + const getServiceEndpoint = ResponseDecorator.handleErrors( + ServiceController.getServiceEndpoint, + successCode, + errorCodes + ) + const responseObject = await getServiceEndpoint(req) + const user = req.kauth.grant.access_token.content.preferred_username + res + .status(responseObject.code) + .send(responseObject.body) + + logger.apiRes({ req: req, user: user, res: res, responseObject: responseObject }) + }) + } + }, + { + method: 'post', + path: '/api/v3/services', + middleware: async (req, res) => { + logger.apiReq(req) + + const successCode = constants.HTTP_CODE_CREATED + const errorCodes = [ + { + code: constants.HTTP_CODE_BAD_REQUEST, + errors: [Errors.ValidationError] + }, + { + code: constants.HTTP_CODE_UNAUTHORIZED, + errors: [Errors.AuthenticationError] + }, + { + code: constants.HTTP_CODE_BAD_REQUEST, + errors: [Errors.DuplicatePropertyError] + } + ] + + await keycloak.protect(['SRE', 'Developer'])(req, res, async () => { + const createServiceEndpoint = ResponseDecorator.handleErrors( + ServiceController.createServiceEndpoint, + successCode, + errorCodes + ) + const responseObject = await createServiceEndpoint(req) + const user = req.kauth.grant.access_token.content.preferred_username + res + .status(responseObject.code) + .send(responseObject.body) + + logger.apiRes({ req: req, user: user, res: res, responseObject: responseObject }) + }) + } + }, + { + method: 'patch', + path: '/api/v3/services/:name', + middleware: async (req, res) => { + logger.apiReq(req) + + const successCode = constants.HTTP_CODE_NO_CONTENT + const errorCodes = [ + { + code: constants.HTTP_CODE_BAD_REQUEST, + errors: [Errors.ValidationError] + }, + { + code: constants.HTTP_CODE_UNAUTHORIZED, + errors: [Errors.AuthenticationError] + }, + { + code: constants.HTTP_CODE_NOT_FOUND, + errors: [Errors.NotFoundError] + } + ] + + await keycloak.protect(['SRE', 'Developer'])(req, res, async () => { + const updateServiceEndpoint = ResponseDecorator.handleErrors( + ServiceController.updateServiceEndpoint, + successCode, + errorCodes + ) + const responseObject = await updateServiceEndpoint(req) + const user = req.kauth.grant.access_token.content.preferred_username + res + .status(responseObject.code) + .send(responseObject.body) + + logger.apiRes({ req: req, user: user, res: res, responseObject: responseObject }) + }) + } + }, + { + method: 'delete', + path: '/api/v3/services/:name', + middleware: async (req, res) => { + logger.apiReq(req) + + const successCode = constants.HTTP_CODE_NO_CONTENT + const errorCodes = [ + { + code: constants.HTTP_CODE_UNAUTHORIZED, + errors: [Errors.AuthenticationError] + }, + { + code: constants.HTTP_CODE_NOT_FOUND, + errors: [Errors.NotFoundError] + } + ] + + await keycloak.protect(['SRE', 'Developer'])(req, res, async () => { + const deleteServiceEndpoint = ResponseDecorator.handleErrors( + ServiceController.deleteServiceEndpoint, + successCode, + errorCodes + ) + const responseObject = await deleteServiceEndpoint(req) + const user = req.kauth.grant.access_token.content.preferred_username + res + .status(responseObject.code) + .send(responseObject.body) + + logger.apiRes({ req: req, user: user, res: res, responseObject: responseObject }) + }) + } + }, + { + method: 'post', + path: '/api/v3/services/yaml', + fileInput: 'service', + middleware: async (req, res) => { + logger.apiReq(req) + + const successCode = constants.HTTP_CODE_CREATED + const errorCodes = [ + { + code: constants.HTTP_CODE_BAD_REQUEST, + errors: [Errors.ValidationError] + }, + { + code: constants.HTTP_CODE_UNAUTHORIZED, + errors: [Errors.AuthenticationError] + }, + { + code: constants.HTTP_CODE_BAD_REQUEST, + errors: [Errors.DuplicatePropertyError] + } + ] + + await keycloak.protect(['SRE', 'Developer'])(req, res, async () => { + const createServiceYAMLEndpoint = ResponseDecorator.handleErrors( + ServiceController.createServiceYAMLEndpoint, + successCode, + errorCodes + ) + const responseObject = await createServiceYAMLEndpoint(req) + const user = req.kauth.grant.access_token.content.preferred_username + res + .status(responseObject.code) + .send(responseObject.body) + + logger.apiRes({ req: req, user: user, res: res, responseObject: responseObject }) + }) + } + }, + { + method: 'patch', + path: '/api/v3/services/yaml/:name', + fileInput: 'service', + middleware: async (req, res) => { + logger.apiReq(req) + + const successCode = constants.HTTP_CODE_NO_CONTENT + const errorCodes = [ + { + code: constants.HTTP_CODE_BAD_REQUEST, + errors: [Errors.ValidationError] + }, + { + code: constants.HTTP_CODE_UNAUTHORIZED, + errors: [Errors.AuthenticationError] + }, + { + code: constants.HTTP_CODE_NOT_FOUND, + errors: [Errors.NotFoundError] + } + ] + + await keycloak.protect(['SRE', 'Developer'])(req, res, async () => { + const updateServiceYAMLEndpoint = ResponseDecorator.handleErrors( + ServiceController.updateServiceYAMLEndpoint, + successCode, + errorCodes + ) + const responseObject = await updateServiceYAMLEndpoint(req) + const user = req.kauth.grant.access_token.content.preferred_username + res + .status(responseObject.code) + .send(responseObject.body) + + logger.apiRes({ req: req, user: user, res: res, responseObject: responseObject }) + }) + } + } +] diff --git a/src/routes/volumeMount.js b/src/routes/volumeMount.js new file mode 100644 index 000000000..05c20b509 --- /dev/null +++ b/src/routes/volumeMount.js @@ -0,0 +1,312 @@ +/* + * ******************************************************************************* + * * Copyright (c) 2023 Datasance Teknoloji A.S. + * * + * * This program and the accompanying materials are made available under the + * * terms of the Eclipse Public License v. 2.0 which is available at + * * http://www.eclipse.org/legal/epl-2.0 + * * + * * SPDX-License-Identifier: EPL-2.0 + * ******************************************************************************* + * + */ +const constants = require('../helpers/constants') +const VolumeMountController = require('../controllers/volume-mount-controller') +const ResponseDecorator = require('../decorators/response-decorator') +const logger = require('../logger') +const Errors = require('../helpers/errors') +const keycloak = require('../config/keycloak.js').initKeycloak() + +module.exports = [ + { + method: 'get', + path: '/api/v3/volumeMounts', + middleware: async (req, res) => { + logger.apiReq(req) + + const successCode = constants.HTTP_CODE_SUCCESS + const errorCodes = [ + { + code: constants.HTTP_CODE_UNAUTHORIZED, + errors: [Errors.AuthenticationError] + } + ] + + // Add keycloak.protect() middleware to protect the route for SRE role + await keycloak.protect(['SRE', 'Developer', 'Viewer'])(req, res, async () => { + const getVolumeMountsEndpoint = ResponseDecorator.handleErrors(VolumeMountController.listVolumeMountsEndpoint, successCode, errorCodes) + const responseObject = await getVolumeMountsEndpoint(req) + const user = req.kauth.grant.access_token.content.preferred_username + res + .status(responseObject.code) + .send(responseObject.body) + + logger.apiRes({ req: req, user: user, res: res, responseObject: responseObject }) + }) + } + }, + { + method: 'get', + path: '/api/v3/volumeMounts/:name', + middleware: async (req, res) => { + logger.apiReq(req) + + const successCode = constants.HTTP_CODE_SUCCESS + const errorCodes = [ + { + code: constants.HTTP_CODE_UNAUTHORIZED, + errors: [Errors.AuthenticationError] + }, + { + code: constants.HTTP_CODE_NOT_FOUND, + errors: [Errors.NotFoundError] + } + ] + + // Add keycloak.protect() middleware to protect the route for SRE role + await keycloak.protect(['SRE', 'Developer', 'Viewer'])(req, res, async () => { + const getVolumeMountEndpoint = ResponseDecorator.handleErrors(VolumeMountController.getVolumeMountEndpoint, successCode, errorCodes) + const responseObject = await getVolumeMountEndpoint(req) + const user = req.kauth.grant.access_token.content.preferred_username + res + .status(responseObject.code) + .send(responseObject.body) + + logger.apiRes({ req: req, user: user, res: res, responseObject: responseObject }) + }) + } + }, + { + method: 'patch', + path: '/api/v3/volumeMounts/:name', + supportSubstitution: true, + middleware: async (req, res) => { + logger.apiReq(req) + + const successCode = constants.HTTP_CODE_SUCCESS + const errorCodes = [ + { + code: constants.HTTP_CODE_UNAUTHORIZED, + errors: [Errors.AuthenticationError] + }, + { + code: constants.HTTP_CODE_NOT_FOUND, + errors: [Errors.NotFoundError] + }, + { + code: constants.HTTP_CODE_BAD_REQUEST, + errors: [Errors.ValidationError] + } + ] + + // Add keycloak.protect() middleware to protect the route for SRE role + await keycloak.protect(['SRE'])(req, res, async () => { + const updateVolumeMountEndpoint = ResponseDecorator.handleErrors(VolumeMountController.updateVolumeMountEndpoint, successCode, errorCodes) + const responseObject = await updateVolumeMountEndpoint(req) + const user = req.kauth.grant.access_token.content.preferred_username + res + .status(responseObject.code) + .send(responseObject.body) + + logger.apiRes({ req: req, user: user, res: res, responseObject: responseObject }) + }) + } + }, + { + method: 'delete', + path: '/api/v3/volumeMounts/:name', + middleware: async (req, res) => { + logger.apiReq(req) + + const successCode = constants.HTTP_CODE_ACCEPTED + const errorCodes = [ + { + code: constants.HTTP_CODE_UNAUTHORIZED, + errors: [Errors.AuthenticationError] + }, + { + code: constants.HTTP_CODE_NOT_FOUND, + errors: [Errors.NotFoundError] + }, + { + code: constants.HTTP_CODE_BAD_REQUEST, + errors: [Errors.ValidationError] + } + ] + + // Add keycloak.protect() middleware to protect the route for SRE role + await keycloak.protect(['SRE'])(req, res, async () => { + const deleteVolumeMountEndpoint = ResponseDecorator.handleErrors(VolumeMountController.deleteVolumeMountEndpoint, successCode, errorCodes) + const responseObject = await deleteVolumeMountEndpoint(req) + const user = req.kauth.grant.access_token.content.preferred_username + res + .status(responseObject.code) + .send(responseObject.body) + + logger.apiRes({ req: req, user: user, res: res, responseObject: responseObject }) + }) + } + }, + { + method: 'post', + path: '/api/v3/volumeMounts', + supportSubstitution: true, + middleware: async (req, res) => { + logger.apiReq(req) + + const successCode = constants.HTTP_CODE_SUCCESS + const errorCodes = [ + { + code: constants.HTTP_CODE_UNAUTHORIZED, + errors: [Errors.AuthenticationError] + }, + { + code: constants.HTTP_CODE_BAD_REQUEST, + errors: [Errors.ValidationError] + } + ] + + // Add keycloak.protect() middleware to protect the route for SRE role + await keycloak.protect(['SRE'])(req, res, async () => { + const createVolumeMountEndpoint = ResponseDecorator.handleErrors(VolumeMountController.createVolumeMountEndpoint, successCode, errorCodes) + const responseObject = await createVolumeMountEndpoint(req) + const user = req.kauth.grant.access_token.content.preferred_username + res + .status(responseObject.code) + .send(responseObject.body) + + logger.apiRes({ req: req, user: user, res: res, responseObject: responseObject }) + }) + } + }, + { + method: 'post', + path: '/api/v3/volumeMounts/yaml', + fileInput: 'volumeMount', + middleware: async (req, res) => { + logger.apiReq(req) + + const successCode = constants.HTTP_CODE_SUCCESS + const errorCodes = [ + { + code: constants.HTTP_CODE_UNAUTHORIZED, + errors: [Errors.AuthenticationError] + }, + { + code: constants.HTTP_CODE_BAD_REQUEST, + errors: [Errors.ValidationError] + } + ] + + // Add keycloak.protect() middleware to protect the route for SRE role + await keycloak.protect(['SRE'])(req, res, async () => { + const createVolumeMountYamlEndpoint = ResponseDecorator.handleErrors(VolumeMountController.createVolumeMountYamlEndpoint, successCode, errorCodes) + const responseObject = await createVolumeMountYamlEndpoint(req) + const user = req.kauth.grant.access_token.content.preferred_username + res + .status(responseObject.code) + .send(responseObject.body) + + logger.apiRes({ req: req, user: user, res: res, responseObject: responseObject }) + }) + } + }, + { + method: 'patch', + path: '/api/v3/volumeMounts/yaml/:name', + fileInput: 'volumeMount', + middleware: async (req, res) => { + logger.apiReq(req) + + const successCode = constants.HTTP_CODE_SUCCESS + const errorCodes = [ + { + code: constants.HTTP_CODE_UNAUTHORIZED, + errors: [Errors.AuthenticationError] + }, + { + code: constants.HTTP_CODE_NOT_FOUND, + errors: [Errors.NotFoundError] + }, + { + code: constants.HTTP_CODE_BAD_REQUEST, + errors: [Errors.ValidationError] + } + ] + + // Add keycloak.protect() middleware to protect the route for SRE role + await keycloak.protect(['SRE'])(req, res, async () => { + const updateVolumeMountYamlEndpoint = ResponseDecorator.handleErrors(VolumeMountController.updateVolumeMountYamlEndpoint, successCode, errorCodes) + const responseObject = await updateVolumeMountYamlEndpoint(req) + const user = req.kauth.grant.access_token.content.preferred_username + res + .status(responseObject.code) + .send(responseObject.body) + + logger.apiRes({ req: req, user: user, res: res, responseObject: responseObject }) + }) + } + }, + { + method: 'post', + path: '/api/v3/volumeMounts/:name/link', + middleware: async (req, res) => { + logger.apiReq(req) + + const successCode = constants.HTTP_CODE_SUCCESS + const errorCodes = [ + { + code: constants.HTTP_CODE_UNAUTHORIZED, + errors: [Errors.AuthenticationError] + }, + { + code: constants.HTTP_CODE_BAD_REQUEST, + errors: [Errors.ValidationError] + } + ] + + // Add keycloak.protect() middleware to protect the route for SRE role + await keycloak.protect(['SRE', 'Developer'])(req, res, async () => { + const linkVolumeMountEndpoint = ResponseDecorator.handleErrors(VolumeMountController.linkVolumeMountEndpoint, successCode, errorCodes) + const responseObject = await linkVolumeMountEndpoint(req) + const user = req.kauth.grant.access_token.content.preferred_username + res + .status(responseObject.code) + .send(responseObject.body) + + logger.apiRes({ req: req, user: user, res: res, responseObject: responseObject }) + }) + } + }, + { + method: 'delete', + path: '/api/v3/volumeMounts/:name/link', + middleware: async (req, res) => { + logger.apiReq(req) + + const successCode = constants.HTTP_CODE_SUCCESS + const errorCodes = [ + { + code: constants.HTTP_CODE_UNAUTHORIZED, + errors: [Errors.AuthenticationError] + }, + { + code: constants.HTTP_CODE_BAD_REQUEST, + errors: [Errors.ValidationError] + } + ] + + // Add keycloak.protect() middleware to protect the route for SRE role + await keycloak.protect(['SRE', 'Developer'])(req, res, async () => { + const unlinkVolumeMountEndpoint = ResponseDecorator.handleErrors(VolumeMountController.unlinkVolumeMountEndpoint, successCode, errorCodes) + const responseObject = await unlinkVolumeMountEndpoint(req) + const user = req.kauth.grant.access_token.content.preferred_username + res + .status(responseObject.code) + .send(responseObject.body) + + logger.apiRes({ req: req, user: user, res: res, responseObject: responseObject }) + }) + } + } +] diff --git a/src/schemas/agent.js b/src/schemas/agent.js index d14255a22..e42787db0 100644 --- a/src/schemas/agent.js +++ b/src/schemas/agent.js @@ -55,6 +55,9 @@ const updateAgentConfig = { 'latitude': { 'type': 'number', 'minimum': -90, 'maximum': 90 }, 'longitude': { 'type': 'number', 'minimum': -180, 'maximum': 180 }, 'gpsMode': { 'type': 'string' }, + 'gpsDevice': { 'type': 'string' }, + 'gpsScanFrequency': { 'type': 'integer', 'minimum': 0 }, + 'edgeGuardFrequency': { 'type': 'integer', 'minimum': 0 }, 'dockerPruningFrequency': { 'type': 'integer', 'minimum': 0 }, 'availableDiskThreshold': { 'type': 'integer', 'minimum': 0 }, 'logLevel': { 'type': 'string' }, @@ -68,6 +71,7 @@ const updateAgentStatus = { 'type': 'object', 'properties': { 'daemonStatus': { 'type': 'string' }, + 'warningMessage': { 'type': 'string' }, 'daemonOperatingDuration': { 'type': 'integer', 'minimum': 0 }, 'daemonLastStart': { 'type': 'integer', 'minimum': 0 }, 'memoryUsage': { 'type': 'number', 'minimum': 0 }, @@ -92,6 +96,10 @@ const updateAgentStatus = { 'microserviceMessageCounts': { 'type': 'string' }, 'messageSpeed': { 'type': 'number', 'minimum': 0 }, 'lastCommandTime': { 'type': 'integer', 'minimum': 0 }, + 'gpsMode': { 'type': 'string' }, + 'gpsDevice': { 'type': 'string' }, + 'gpsScanFrequency': { 'type': 'integer', 'minimum': 0 }, + 'edgeGuardFrequency': { 'type': 'integer', 'minimum': 0 }, 'tunnelStatus': { 'type': 'string' }, 'version': { 'type': 'string' }, 'isReadyToUpgrade': { 'type': 'boolean' }, @@ -134,7 +142,10 @@ const microserviceStatus = { 'startTime': { 'type': 'integer' }, 'operatingDuration': { 'type': 'integer' }, 'cpuUsage': { 'type': 'number' }, - 'memoryUsage': { 'type': 'number' } + 'memoryUsage': { 'type': 'number' }, + 'ipAddress': { 'type': 'string' }, + 'ipAddressExternal': { 'type': 'string' }, + 'execSessionId': { 'type': 'string' } }, 'required': ['id'], 'additionalProperties': true diff --git a/src/schemas/certificate.js b/src/schemas/certificate.js index 28591cbdd..07e538922 100644 --- a/src/schemas/certificate.js +++ b/src/schemas/certificate.js @@ -11,7 +11,7 @@ const caCreate = { }, secretName: { type: 'string' } }, - required: ['type'], + required: ['type', 'name'], additionalProperties: false, allOf: [ { @@ -43,9 +43,9 @@ const certificateCreate = { type: 'object', properties: { type: { type: 'string', enum: ['k8s-secret', 'direct', 'self-signed'] }, - secretName: { type: 'string' }, - cert: { type: 'string' }, - key: { type: 'string' } + secretName: { type: 'string' } + // cert: { type: 'string' }, + // key: { type: 'string' } }, required: ['type'] } @@ -141,4 +141,3 @@ module.exports = { ], innerSchemas: [] } - \ No newline at end of file diff --git a/src/schemas/config-map.js b/src/schemas/config-map.js new file mode 100644 index 000000000..bccfa9610 --- /dev/null +++ b/src/schemas/config-map.js @@ -0,0 +1,66 @@ +const configMapCreate = { + id: '/configMapCreate', + type: 'object', + properties: { + name: { type: 'string', minLength: 1, maxLength: 255 }, + immutable: { type: 'boolean' }, + data: { type: 'object' } + }, + required: ['name', 'data'], + additionalProperties: false +} + +const configMapUpdate = { + id: '/configMapUpdate', + type: 'object', + properties: { + immutable: { type: 'boolean' }, + data: { type: 'object' } + }, + required: ['data'], + additionalProperties: false +} + +const configMapResponse = { + id: '/configMapResponse', + type: 'object', + properties: { + id: { type: 'integer' }, + name: { type: 'string' }, + immutable: { type: 'boolean' }, + data: { type: 'object' }, + created_at: { type: 'string', format: 'date-time' }, + updated_at: { type: 'string', format: 'date-time' } + }, + required: ['id', 'name', 'data', 'created_at', 'updated_at'], + additionalProperties: false +} + +const configMapListResponse = { + id: '/configMapListResponse', + type: 'object', + properties: { + configMaps: { + type: 'array', + items: { + type: 'object', + properties: { + id: { type: 'integer' }, + name: { type: 'string' }, + immutable: { type: 'boolean' }, + created_at: { type: 'string', format: 'date-time' }, + updated_at: { type: 'string', format: 'date-time' } + }, + required: ['id', 'name', 'created_at', 'updated_at'], + additionalProperties: false + } + } + }, + required: ['configMaps'], + additionalProperties: false +} + +module.exports = { + mainSchemas: [configMapCreate, configMapUpdate, configMapResponse, configMapListResponse], + innerSchemas: [] +} diff --git a/src/schemas/iofog.js b/src/schemas/iofog.js index 80ad9004f..ca423c12a 100644 --- a/src/schemas/iofog.js +++ b/src/schemas/iofog.js @@ -22,6 +22,8 @@ const iofogCreate = { 'description': { 'type': 'string' }, 'networkInterface': { 'type': 'string' }, 'dockerUrl': { 'type': 'string' }, + 'containerEngine': { 'type': 'string', 'enum': ['docker', 'podman'] }, + 'deploymentType': { 'type': 'string', 'enum': ['native', 'container'] }, 'diskLimit': { 'type': 'integer', 'minimum': 0 }, 'diskDirectory': { 'type': 'string' }, 'memoryLimit': { 'type': 'integer', 'minimum': 0 }, @@ -92,6 +94,8 @@ const iofogUpdate = { 'description': { 'type': 'string' }, 'networkInterface': { 'type': 'string' }, 'dockerUrl': { 'type': 'string' }, + 'containerEngine': { 'type': 'string', 'enum': ['docker', 'podman'] }, + 'deploymentType': { 'type': 'string', 'enum': ['native', 'container'] }, 'diskLimit': { 'type': 'integer', 'minimum': 0 }, 'diskDirectory': { 'type': 'string' }, 'memoryLimit': { 'type': 'integer', 'minimum': 0 }, diff --git a/src/schemas/microservice.js b/src/schemas/microservice.js index 386ad3f43..e3bed2744 100644 --- a/src/schemas/microservice.js +++ b/src/schemas/microservice.js @@ -153,9 +153,22 @@ const env = { 'type': 'object', 'properties': { 'key': { 'type': 'string' }, - 'value': { 'type': 'string' } + 'value': { 'type': 'string' }, + 'valueFromSecret': { 'type': 'string' }, + 'valueFromConfigMap': { 'type': 'string' } }, - 'required': ['key', 'value'], + 'required': ['key'], + 'oneOf': [ + { + 'required': ['value'] + }, + { + 'required': ['valueFromSecret'] + }, + { + 'required': ['valueFromConfigMap'] + } + ], 'additionalProperties': true } @@ -176,43 +189,19 @@ const ports = { 'properties': { 'internal': { 'type': 'integer' }, 'external': { 'type': 'integer' }, - 'protocol': { 'enum': ['tcp', 'udp'] }, - 'public': { '$ref': '/publicPort' } + 'protocol': { 'enum': ['tcp', 'udp'] } }, 'required': ['internal', 'external'], 'additionalProperties': true } -const publicPort = { - 'id': '/publicPort', - type: 'object', - properties: { - enabled: { type: 'boolean' }, - schemes: { type: 'array', items: { type: 'string' } }, - protocol: { 'enum': ['tcp', 'http'] }, - router: { '$ref': '/publicPortRouter' } - }, - required: ['schemes', 'protocol'] -} - -const publicPortRouter = { - 'id': '/publicPortRouter', - type: 'object', - properties: { - host: { type: 'string' }, - port: { type: 'number' } - }, - required: [] -} - const portsCreate = { 'id': '/portsCreate', 'type': 'object', 'properties': { 'internal': { 'type': 'integer' }, 'external': { 'type': 'integer' }, - 'protocol': { 'enum': ['tcp', 'udp'] }, - 'public': { '$ref': '/publicPort' } + 'protocol': { 'enum': ['tcp', 'udp'] } }, 'required': ['internal', 'external'], 'additionalProperties': true @@ -232,6 +221,6 @@ const volumeMappings = { } module.exports = { - mainSchemas: [microserviceCreate, microserviceUpdate, env, ports, publicPort, publicPortRouter, extraHosts, portsCreate, microserviceDelete, volumeMappings], - innerSchemas: [volumeMappings, ports, publicPort, publicPortRouter, env, extraHosts, microserviceCreate] + mainSchemas: [microserviceCreate, microserviceUpdate, env, ports, extraHosts, portsCreate, microserviceDelete, volumeMappings], + innerSchemas: [volumeMappings, ports, env, extraHosts, microserviceCreate] } diff --git a/src/schemas/service.js b/src/schemas/service.js new file mode 100644 index 000000000..770661499 --- /dev/null +++ b/src/schemas/service.js @@ -0,0 +1,108 @@ +const { serviceNameRegex } = require('./utils/utils') + +const serviceCreate = { + id: '/serviceCreate', + type: 'object', + required: ['name', 'type', 'resource', 'targetPort'], + properties: { + name: { + type: 'string', + pattern: serviceNameRegex + }, + type: { + type: 'string', + enum: ['microservice', 'k8s', 'agent', 'external'] + }, + resource: { + type: 'string', + required: true + }, + targetPort: { + type: 'integer' + }, + defaultBridge: { + type: 'string' + }, + servicePort: { + type: 'integer' + }, + k8sType: { + type: 'string', + enum: ['LoadBalancer', 'ClusterIP', 'NodePort'] + }, + tags: { + type: 'array', + items: { '$ref': '/serviceTag' } + } + } + // allOf: [ + // { + // if: { + // properties: { type: { const: 'k8s' } } + // }, + // then: { + // required: ['servicePort', 'k8sType'] + // } + // } + // ] +} + +const serviceUpdate = { + id: '/serviceUpdate', + type: 'object', + required: ['name'], + properties: { + name: { + type: 'string', + pattern: serviceNameRegex + }, + type: { + type: 'string', + enum: ['microservice', 'k8s', 'agent', 'external'] + }, + resource: { + type: 'string' + }, + targetPort: { + type: 'integer' + }, + defaultBridge: { + type: 'string' + }, + servicePort: { + type: 'integer' + }, + k8sType: { + type: 'string', + enum: ['LoadBalancer', 'ClusterIP', 'NodePort'] + }, + tags: { + type: 'array', + items: { '$ref': '/serviceTag' } + } + } + // allOf: [ + // { + // if: { + // properties: { type: { const: 'k8s' } } + // }, + // then: { + // required: ['servicePort', 'k8sType'] + // } + // } + // ] +} + +const serviceTag = { + id: '/serviceTag', + type: 'string' +} + +module.exports = { + mainSchemas: [ + serviceCreate, + serviceUpdate, + serviceTag + ], + innerSchemas: [serviceTag] +} diff --git a/src/schemas/utils/utils.js b/src/schemas/utils/utils.js index 8f77b872b..9fcd98e95 100644 --- a/src/schemas/utils/utils.js +++ b/src/schemas/utils/utils.js @@ -1,6 +1,7 @@ /* eslint-disable no-useless-escape */ module.exports = { nameRegex: '^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$', + serviceNameRegex: '^[a-z0-9]([a-z0-9-]*[a-z0-9])?$', // Supports hex, rgb, and rgba colorRegex: '^(#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{8}))|(rgb\(\s*(?:(\d{1,3})\s*,?){3}\))|(rgba\(\s*(?:(\d{1,3})\s*,?){4}\))|$', // https://semver.org/#is-there-a-suggested-regular-expression-regex-to-check-a-semver-string diff --git a/src/schemas/volume-mount.js b/src/schemas/volume-mount.js new file mode 100644 index 000000000..7aabc0eda --- /dev/null +++ b/src/schemas/volume-mount.js @@ -0,0 +1,91 @@ +const { serviceNameRegex } = require('./utils/utils') + +const volumeMountCreate = { + 'id': '/volumeMountCreate', + 'type': 'object', + 'properties': { + 'name': { + 'type': 'string', + 'pattern': serviceNameRegex + }, + 'secretName': { + 'type': 'string' + }, + 'configMapName': { + 'type': 'string' + } + }, + 'required': ['name'], + 'oneOf': [ + { + 'required': ['secretName'] + }, + { + 'required': ['configMapName'] + } + ], + 'additionalProperties': false +} + +const volumeMountUpdate = { + 'id': '/volumeMountUpdate', + 'type': 'object', + 'properties': { + 'name': { + 'type': 'string', + 'pattern': serviceNameRegex + }, + 'secretName': { + 'type': 'string' + }, + 'configMapName': { + 'type': 'string' + } + }, + 'oneOf': [ + { + 'required': ['secretName'] + }, + { + 'required': ['configMapName'] + } + ], + 'additionalProperties': false +} + +const volumeMountLink = { + 'id': '/volumeMountLink', + 'type': 'object', + 'properties': { + 'fogUuids': { + 'type': 'array', + 'items': { + 'type': 'string' + }, + 'minItems': 1 + } + }, + 'required': ['fogUuids'], + 'additionalProperties': false +} + +const volumeMountUnlink = { + 'id': '/volumeMountUnlink', + 'type': 'object', + 'properties': { + 'fogUuids': { + 'type': 'array', + 'items': { + 'type': 'string' + }, + 'minItems': 1 + } + }, + 'required': ['fogUuids'], + 'additionalProperties': false +} + +module.exports = { + mainSchemas: [volumeMountCreate, volumeMountUpdate, volumeMountLink, volumeMountUnlink], + innerSchemas: [volumeMountCreate, volumeMountUpdate] +} diff --git a/src/server.js b/src/server.js index 5a0b8039d..2d180fbab 100755 --- a/src/server.js +++ b/src/server.js @@ -186,14 +186,14 @@ initialize().then(() => { const viewerURL = process.env.VIEWER_URL || config.get('viewer.url') // File-based SSL configuration - const sslKey = process.env.SSL_KEY || config.get('server.ssl.path.key') - const sslCert = process.env.SSL_CERT || config.get('server.ssl.path.cert') - const intermedKey = process.env.INTERMEDIATE_CERT || config.get('server.ssl.path.intermediateCert') + const sslKey = process.env.SSL_PATH_KEY || config.get('server.ssl.path.key') + const sslCert = process.env.SSL_PATH_CERT || config.get('server.ssl.path.cert') + const intermedKey = process.env.SSL_PATH_INTERMEDIATE_CERT || config.get('server.ssl.path.intermediateCert') // Base64 SSL configuration - const sslKeyBase64 = config.get('server.ssl.base64.key') - const sslCertBase64 = config.get('server.ssl.base64.cert') - const intermedKeyBase64 = config.get('server.ssl.base64.intermediateCert') + const sslKeyBase64 = process.env.SSL_BASE64_KEY || config.get('server.ssl.base64.key') + const sslCertBase64 = process.env.SSL_BASE64_CERT || config.get('server.ssl.base64.cert') + const intermedKeyBase64 = process.env.SSL_BASE64_INTERMEDIATE_CERT || config.get('server.ssl.base64.intermediateCert') const hasFileBasedSSL = !devMode && sslKey && sslCert const hasBase64SSL = !devMode && sslKeyBase64 && sslCertBase64 diff --git a/src/services/agent-service.js b/src/services/agent-service.js index ec416cc94..3d0d3bd45 100644 --- a/src/services/agent-service.js +++ b/src/services/agent-service.js @@ -43,9 +43,10 @@ const RouterManager = require('../data/managers/router-manager') const EdgeResourceService = require('./edge-resource-service') const constants = require('../helpers/constants') const SecretManager = require('../data/managers/secret-manager') +const ConfigMapManager = require('../data/managers/config-map-manager') const IncomingForm = formidable.IncomingForm const CHANGE_TRACKING_DEFAULT = {} -const CHANGE_TRACKING_KEYS = ['config', 'version', 'reboot', 'deleteNode', 'microserviceList', 'microserviceConfig', 'routing', 'registries', 'tunnel', 'diagnostics', 'isImageSnapshot', 'prune', 'routerChanged', 'linkedEdgeResources'] +const CHANGE_TRACKING_KEYS = ['config', 'version', 'reboot', 'deleteNode', 'microserviceList', 'microserviceConfig', 'routing', 'registries', 'tunnel', 'diagnostics', 'isImageSnapshot', 'prune', 'routerChanged', 'linkedEdgeResources', 'volumeMounts', 'execSessions'] for (const key of CHANGE_TRACKING_KEYS) { CHANGE_TRACKING_DEFAULT[key] = false } @@ -112,10 +113,10 @@ const agentDeprovision = async function (deprovisionData, fog, transaction) { const _invalidateFogNode = async function (fog, transaction) { const where = { uuid: fog.uuid } - const data = { daemonStatus: FogStates.UNKNOWN, ipAddress: '0.0.0.0', ipAddressExternal: '0.0.0.0' } + const data = { daemonStatus: FogStates.DEPROVISIONED, ipAddress: '0.0.0.0', ipAddressExternal: '0.0.0.0' } await FogManager.update(where, data, transaction) const updatedFog = Object.assign({}, fog) - updatedFog.daemonStatus = FogStates.UNKNOWN + updatedFog.daemonStatus = FogStates.DEPROVISIONED updatedFog.ipAddress = '0.0.0.0' updatedFog.ipAddressExternal = '0.0.0.0' return updatedFog @@ -137,6 +138,10 @@ const getAgentConfig = async function (fog, transaction) { logLimit: fog.logLimit, logDirectory: fog.logDirectory, logFileCount: fog.logFileCount, + gpsMode: fog.gpsMode, + gpsDevice: fog.gpsDevice, + gpsScanFrequency: fog.gpsScanFrequency, + edgeGuardFrequency: fog.edgeGuardFrequency, statusFrequency: fog.statusFrequency, changeFrequency: fog.changeFrequency, deviceScanFrequency: fog.deviceScanFrequency, @@ -175,6 +180,9 @@ const updateAgentConfig = async function (updateData, fog, transaction) { latitude: updateData.latitude, longitude: updateData.longitude, gpsMode: updateData.gpsMode, + gpsDevice: updateData.gpsDevice, + gpsScanFrequency: updateData.gpsScanFrequency, + edgeGuardFrequency: updateData.edgeGuardFrequency, dockerPruningFrequency: updateData.dockerPruningFrequency, availableDiskThreshold: updateData.availableDiskThreshold, logLevel: updateData.logLevel, @@ -198,7 +206,6 @@ const getAgentConfigChanges = async function (ioFog, transaction) { } res.lastUpdated = changeTracking.lastUpdated } - return res } @@ -238,11 +245,31 @@ const updateAgentStatus = async function (agentStatus, fog, transaction) { tunnelStatus: agentStatus.tunnelStatus, version: agentStatus.version, isReadyToUpgrade: agentStatus.isReadyToUpgrade, - isReadyToRollback: agentStatus.isReadyToRollback + isReadyToRollback: agentStatus.isReadyToRollback, + activeVolumeMounts: agentStatus.activeVolumeMounts, + volumeMountLastUpdate: agentStatus.volumeMountLastUpdate } fogStatus = AppHelper.deleteUndefinedFields(fogStatus) + const existingFog = await FogManager.findOne({ + uuid: fog.uuid + }, transaction) + + if (!existingFog.warningMessage.includes('Background orchestration')) { + fogStatus.daemonStatus = agentStatus.daemonStatus + } else { + fogStatus.daemonStatus = FogStates.WARNING + } + + if (agentStatus.warningMessage.includes('HW signature changed') || agentStatus.warningMessage.includes('HW signature mismatch')) { + fogStatus.securityStatus = 'WARNING' + fogStatus.securityViolationInfo = 'HW signature mismatch' + } else { + fogStatus.securityStatus = 'OK' + fogStatus.securityViolationInfo = 'No violation' + } + await FogManager.update({ uuid: fog.uuid }, fogStatus, transaction) @@ -262,7 +289,8 @@ const _updateMicroserviceStatuses = async function (microserviceStatus, fog, tra memoryUsage: status.memoryUsage, percentage: status.percentage, errorMessage: status.errorMessage, - ipAddress: status.ipAddress + ipAddress: status.ipAddress, + execSessionId: status.execSessionId } microserviceStatus = AppHelper.deleteUndefinedFields(microserviceStatus) const microservice = await MicroserviceManager.findOne({ @@ -296,6 +324,7 @@ const getAgentMicroservices = async function (fog, transaction) { const routes = await MicroserviceService.getReceiverMicroservices(microservice, transaction) const isConsumer = await MicroserviceService.isMicroserviceConsumer(microservice, transaction) + const isRouter = await MicroserviceService.isMicroserviceRouter(microservice, transaction) const env = microservice.env && microservice.env.map((it) => { return { @@ -318,6 +347,8 @@ const getAgentMicroservices = async function (fog, transaction) { annotations: microservice.annotations, rebuild: microservice.rebuild, rootHostAccess: microservice.rootHostAccess, + pidMode: microservice.pidMode, + ipcMode: microservice.ipcMode, runAsUser: microservice.runAsUser, platform: microservice.platform, runtime: microservice.runtime, @@ -335,7 +366,9 @@ const getAgentMicroservices = async function (fog, transaction) { capAdd, capDrop, routes, - isConsumer + isConsumer, + isRouter, + execEnabled: microservice.execEnabled } response.push(responseMicroservice) @@ -628,6 +661,59 @@ const getControllerCA = async function (fog, transaction) { throw new Errors.ValidationError('No valid SSL certificate configuration found') } +const getAgentLinkedVolumeMounts = async function (fog, transaction) { + const volumeMounts = [] + const resourceAttributes = [ + 'uuid', + 'name', + 'version', + 'configMapName', + 'secretName' + ] + const resources = await fog.getVolumeMounts({ attributes: resourceAttributes }) + for (const resource of resources) { + const resourceObject = resource.toJSON() + let data = {} + + if (resourceObject.configMapName) { + // Handle ConfigMap + const configMap = await ConfigMapManager.getConfigMap(resourceObject.configMapName, transaction) + if (configMap) { + // For configmaps, we need to base64 encode all values + data = Object.entries(configMap.data).reduce((acc, [key, value]) => { + acc[key] = Buffer.from(value).toString('base64') + return acc + }, {}) + } + } else if (resourceObject.secretName) { + // Handle Secret + const secret = await SecretManager.getSecret(resourceObject.secretName, transaction) + if (secret) { + if (secret.type === 'tls') { + // For TLS secrets, values are already base64 encoded + data = secret.data + } else { + // For opaque secrets, we need to base64 encode all values + data = Object.entries(secret.data).reduce((acc, [key, value]) => { + acc[key] = Buffer.from(value).toString('base64') + return acc + }, {}) + } + } + } + + // Create final response object without configMapName and secretName + const responseObject = { + uuid: resourceObject.uuid, + name: resourceObject.name, + version: resourceObject.version, + data: data + } + volumeMounts.push(responseObject) + } + return volumeMounts +} + module.exports = { agentProvision: TransactionDecorator.generateTransaction(agentProvision), agentDeprovision: TransactionDecorator.generateTransaction(agentDeprovision), @@ -649,5 +735,6 @@ module.exports = { getImageSnapshot: TransactionDecorator.generateTransaction(getImageSnapshot), putImageSnapshot: TransactionDecorator.generateTransaction(putImageSnapshot), getAgentLinkedEdgeResources: TransactionDecorator.generateTransaction(getAgentLinkedEdgeResources), + getAgentLinkedVolumeMounts: TransactionDecorator.generateTransaction(getAgentLinkedVolumeMounts), getControllerCA: TransactionDecorator.generateTransaction(getControllerCA) } diff --git a/src/services/certificate-service.js b/src/services/certificate-service.js index 59d5f1398..97bdc5782 100644 --- a/src/services/certificate-service.js +++ b/src/services/certificate-service.js @@ -12,7 +12,8 @@ const forge = require('node-forge') // Helper function to check Kubernetes environment function checkKubernetesEnvironment () { - const isKubernetes = process.env.CONTROL_PLANE || config.get('app.ControlPlane') === 'kubernetes' + const controlPlane = process.env.CONTROL_PLANE || config.get('app.ControlPlane') + const isKubernetes = controlPlane && controlPlane.toLowerCase() === 'kubernetes' if (!isKubernetes) { throw new Errors.ValidationError(ErrorMessages.NOT_KUBERNETES_ENV) } @@ -113,7 +114,10 @@ async function createCAEndpoint (caData, transaction) { ca = await require('../utils/cert').getCAFromK8sSecret(caData.secretName) certDetails = parseCertificate(ca.certificate) // Store the CA locally with the same name as the secret - await storeCA({ cert: ca.certificate, key: ca.key }, caData.secretName) + const checkedSecret = await SecretManager.findOne({ name: caData.secretName || caData.name }, transaction) + if (!checkedSecret) { + await storeCA({ cert: ca.certificate, key: ca.key }, caData.secretName) + } } else if (caData.type === 'direct') { // Load from internal secret const caObj = await require('../utils/cert').loadCA(caData.secretName) @@ -126,16 +130,18 @@ async function createCAEndpoint (caData, transaction) { // Get the secret that was just created or referenced const secret = await SecretManager.findOne({ name: caData.secretName || caData.name }, transaction) - // Create certificate record in database - await CertificateManager.createCertificateRecord({ - name: caData.secretName || caData.name, // Use secretName if available, otherwise use provided name - subject: certDetails.subject, - isCA: true, - validFrom: certDetails.validFrom, - validTo: certDetails.validTo, - serialNumber: certDetails.serialNumber, - secretId: secret ? secret.id : null - }, transaction) + if (caData.type !== 'k8s-secret') { + // Create certificate record in database + await CertificateManager.createCertificateRecord({ + name: caData.secretName || caData.name, // Use secretName if available, otherwise use provided name + subject: certDetails.subject, + isCA: true, + validFrom: certDetails.validFrom, + validTo: certDetails.validTo, + serialNumber: certDetails.serialNumber, + secretId: secret ? secret.id : null + }, transaction) + } return { name: caData.secretName || caData.name, // Use secretName if available, otherwise use provided name @@ -160,16 +166,20 @@ async function getCAEndpoint (name, transaction) { throw new Errors.NotFoundError(`CA with name ${name} not found`) } + // Normalize line endings in the certificate and private key + const certificate = normalizeLineEndings(Buffer.from(secret.data['tls.crt'], 'base64').toString()) + const privateKey = normalizeLineEndings(Buffer.from(secret.data['tls.key'], 'base64').toString()) + return { name: certRecord.name, subject: certRecord.subject, - is_ca: certRecord.isCA, - valid_from: certRecord.validFrom, - valid_to: certRecord.validTo, - serial_number: certRecord.serialNumber, + isCA: certRecord.isCA, + validFrom: certRecord.validFrom, + validTo: certRecord.validTo, + serialNumber: certRecord.serialNumber, data: { - certificate: Buffer.from(secret.data['tls.crt'], 'base64').toString(), - private_key: Buffer.from(secret.data['tls.key'], 'base64').toString() + certificate, + privateKey: privateKey } } } @@ -360,21 +370,25 @@ async function getCertificateEndpoint (name, transaction) { ? certChain.slice(1).map(c => ({ name: c.name, subject: c.subject })) : [] + // Normalize line endings in the certificate and private key + const certificate = normalizeLineEndings(Buffer.from(secret.data['tls.crt'], 'base64').toString()) + const privateKey = normalizeLineEndings(Buffer.from(secret.data['tls.key'], 'base64').toString()) + return { name: certRecord.name, subject: certRecord.subject, hosts: certRecord.hosts, - is_ca: certRecord.isCA, - valid_from: certRecord.validFrom, - valid_to: certRecord.validTo, - serial_number: certRecord.serialNumber, - ca_name: certRecord.signingCA ? certRecord.signingCA.name : null, - certificate_chain: chainInfo, - days_remaining: certRecord.getDaysUntilExpiration(), - is_expired: certRecord.isExpired(), + isCA: certRecord.isCA, + validFrom: certRecord.validFrom, + validTo: certRecord.validTo, + serialNumber: certRecord.serialNumber, + caName: certRecord.signingCA ? certRecord.signingCA.name : null, + certificateChain: chainInfo, + daysRemaining: certRecord.getDaysUntilExpiration(), + isExpired: certRecord.isExpired(), data: { - certificate: Buffer.from(secret.data['tls.crt'], 'base64').toString(), - private_key: Buffer.from(secret.data['tls.key'], 'base64').toString() + certificate, + privateKey: privateKey } } } @@ -387,12 +401,12 @@ async function listCertificatesEndpoint (transaction) { name: cert.name, subject: cert.subject, hosts: cert.hosts, - is_ca: cert.isCA, - valid_from: cert.validFrom, - valid_to: cert.validTo, - days_remaining: cert.getDaysUntilExpiration(), - is_expired: cert.isExpired(), - ca_name: cert.signingCA ? cert.signingCA.name : null + isCA: cert.isCA, + validFrom: cert.validFrom, + validTo: cert.validTo, + daysRemaining: cert.getDaysUntilExpiration(), + isExpired: cert.isExpired(), + caName: cert.signingCA ? cert.signingCA.name : null })) } } @@ -591,6 +605,18 @@ async function listExpiringCertificatesEndpoint (days = 30, transaction) { } } +/** + * Normalizes line endings to Unix style (\n) + * Handles both \r\n and \n cases to ensure consistent output + * @param {string} str - String to normalize + * @returns {string} - String with normalized line endings + */ +function normalizeLineEndings (str) { + // First replace all \r\n with \n + // Then replace any remaining \r with \n + return str.replace(/\r\n/g, '\n').replace(/\r/g, '\n') +} + module.exports = { createCAEndpoint: TransactionDecorator.generateTransaction(createCAEndpoint), getCAEndpoint: TransactionDecorator.generateTransaction(getCAEndpoint), diff --git a/src/services/change-tracking-service.js b/src/services/change-tracking-service.js index 9fe0885c7..d7e64aeba 100644 --- a/src/services/change-tracking-service.js +++ b/src/services/change-tracking-service.js @@ -29,7 +29,9 @@ const events = Object.freeze({ diagnostics: false, isImageSnapshot: false, prune: false, - routerChanged: false + routerChanged: false, + volumeMounts: false, + execSessions: false }, diagnostics: { diagnostics: true @@ -81,6 +83,12 @@ const events = Object.freeze({ }, prune: { prune: true + }, + volumeMounts: { + volumeMounts: true + }, + microserviceExecSessions: { + execSessions: true } }) diff --git a/src/services/config-map-service.js b/src/services/config-map-service.js new file mode 100644 index 000000000..1ccf0f0df --- /dev/null +++ b/src/services/config-map-service.js @@ -0,0 +1,127 @@ +/* + * ******************************************************************************* + * * Copyright (c) 2023 Datasance Teknoloji A.S. + * * + * * This program and the accompanying materials are made available under the + * * terms of the Eclipse Public License v. 2.0 which is available at + * * http://www.eclipse.org/legal/epl-2.0 + * * + * * SPDX-License-Identifier: EPL-2.0 + * ******************************************************************************* + * + */ + +const TransactionDecorator = require('../decorators/transaction-decorator') +const ConfigMapManager = require('../data/managers/config-map-manager') +const AppHelper = require('../helpers/app-helper') +const Errors = require('../helpers/errors') +const ErrorMessages = require('../helpers/error-messages') +const Validator = require('../schemas/index') +const VolumeMountService = require('./volume-mount-service') +const VolumeMountingManager = require('../data/managers/volume-mounting-manager') + +async function createConfigMapEndpoint (configMapData, transaction) { + const validation = await Validator.validate(configMapData, Validator.schemas.configMapCreate) + if (!validation.valid) { + throw new Errors.ValidationError(validation.error) + } + + const existingConfigMap = await ConfigMapManager.findOne({ name: configMapData.name }, transaction) + if (existingConfigMap) { + throw new Errors.ConflictError(AppHelper.formatMessage(ErrorMessages.CONFIGMAP_ALREADY_EXISTS, configMapData.name)) + } + + const configMap = await ConfigMapManager.createConfigMap(configMapData.name, configMapData.immutable, configMapData.data, transaction) + return { + id: configMap.id, + name: configMap.name, + immutable: configMap.immutable, + created_at: configMap.created_at, + updated_at: configMap.updated_at + } +} + +async function updateConfigMapEndpoint (configMapName, configMapData, transaction) { + const validation = await Validator.validate(configMapData, Validator.schemas.configMapUpdate) + if (!validation.valid) { + throw new Errors.ValidationError(validation.error) + } + + const existingConfigMap = await ConfigMapManager.findOne({ name: configMapName }, transaction) + if (!existingConfigMap) { + throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.CONFIGMAP_NOT_FOUND, configMapName)) + } + + if (existingConfigMap.immutable === true) { + throw new Errors.ValidationError(AppHelper.formatMessage(ErrorMessages.CONFIGMAP_IMMUTABLE, configMapName)) + } + + const configMap = await ConfigMapManager.updateConfigMap(configMapName, configMapData.immutable, configMapData.data, transaction) + await _updateChangeTrackingForFogs(configMapName, transaction) + return { + id: configMap.id, + name: configMap.name, + created_at: configMap.created_at, + updated_at: configMap.updated_at + } +} + +async function getConfigMapEndpoint (configMapName, transaction) { + const configMap = await ConfigMapManager.getConfigMap(configMapName, transaction) + if (!configMap) { + throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.CONFIGMAP_NOT_FOUND, configMapName)) + } + + return { + id: configMap.id, + name: configMap.name, + data: configMap.data, + immutable: configMap.immutable, + created_at: configMap.created_at, + updated_at: configMap.updated_at + } +} + +async function listConfigMapsEndpoint (transaction) { + const configMaps = await ConfigMapManager.listConfigMaps(transaction) + return { + configMaps: configMaps.map(configMap => ({ + id: configMap.id, + name: configMap.name, + immutable: configMap.immutable, + created_at: configMap.created_at, + updated_at: configMap.updated_at + })) + } +} + +async function deleteConfigMapEndpoint (configMapName, transaction) { + const existingConfigMap = await ConfigMapManager.findOne({ name: configMapName }, transaction) + if (!existingConfigMap) { + throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.CONFIGMAP_NOT_FOUND, configMapName)) + } + + await ConfigMapManager.deleteConfigMap(configMapName, transaction) + return {} +} + +async function _updateChangeTrackingForFogs (configMapName, transaction) { + const configMapVolumeMounts = await VolumeMountingManager.findAll({ configMapName: configMapName }, transaction) + if (configMapVolumeMounts.length > 0) { + for (const configMapVolumeMount of configMapVolumeMounts) { + const volumeMountObj = { + name: configMapVolumeMount.name, + configMapName: configMapName + } + await VolumeMountService.updateVolumeMountEndpoint(configMapVolumeMount.name, volumeMountObj, transaction) + } + } +} + +module.exports = { + createConfigMapEndpoint: TransactionDecorator.generateTransaction(createConfigMapEndpoint), + updateConfigMapEndpoint: TransactionDecorator.generateTransaction(updateConfigMapEndpoint), + getConfigMapEndpoint: TransactionDecorator.generateTransaction(getConfigMapEndpoint), + listConfigMapsEndpoint: TransactionDecorator.generateTransaction(listConfigMapsEndpoint), + deleteConfigMapEndpoint: TransactionDecorator.generateTransaction(deleteConfigMapEndpoint) +} diff --git a/src/services/iofog-access-token-service.js b/src/services/iofog-access-token-service.js deleted file mode 100644 index 529fdb6b1..000000000 --- a/src/services/iofog-access-token-service.js +++ /dev/null @@ -1,53 +0,0 @@ -/* - * ******************************************************************************* - * * Copyright (c) 2023 Datasance Teknoloji A.S. - * * - * * This program and the accompanying materials are made available under the - * * terms of the Eclipse Public License v. 2.0 which is available at - * * http://www.eclipse.org/legal/epl-2.0 - * * - * * SPDX-License-Identifier: EPL-2.0 - * ******************************************************************************* - * - */ - -const AppHelper = require('../helpers/app-helper') -const FogAccessTokenManager = require('../data/managers/iofog-access-token-manager') - -const Config = require('../config') - -const generateAccessToken = async function (transaction) { - while (true) { - const newAccessToken = AppHelper.generateRandomString(16) - const exists = await FogAccessTokenManager.findOne({ - token: newAccessToken - }, transaction) - if (!exists) { - const accessTokenExpiryTime = Date.now() + Config.get('Settings:FogTokenExpirationIntervalSeconds') * 1000 - return { - token: newAccessToken, - expirationTime: accessTokenExpiryTime - } - } - } -} - -async function updateAccessToken (fogUuid, newAccessToken, transaction) { - return FogAccessTokenManager.updateOrCreate({ - iofogUuid: fogUuid - }, { - iofogUuid: fogUuid, - token: newAccessToken.token, - expirationTime: newAccessToken.expirationTime - }, transaction) -} - -async function all (transaction) { - return FogAccessTokenManager.findAll(null, transaction) -} - -module.exports = { - generateAccessToken, - updateAccessToken, - all -} diff --git a/src/services/iofog-service.js b/src/services/iofog-service.js index 7172c1ab4..a4ffbf31e 100644 --- a/src/services/iofog-service.js +++ b/src/services/iofog-service.js @@ -40,103 +40,198 @@ const Op = require('sequelize').Op const lget = require('lodash/get') const CertificateService = require('./certificate-service') const logger = require('../logger') +const ServiceManager = require('../data/managers/service-manager') +const FogStates = require('../enums/fog-state') const SITE_CA_CERT = 'pot-site-ca' const DEFAULT_ROUTER_LOCAL_CA = 'default-router-local-ca' +const SERVICE_ANNOTATION_TAG = 'service.datasance.com/tag' + +async function checkKubernetesEnvironment () { + const controlPlane = process.env.CONTROL_PLANE || config.get('app.ControlPlane') + return controlPlane && controlPlane.toLowerCase() === 'kubernetes' +} + +async function getLocalCertificateHosts (isKubernetes, namespace) { + if (isKubernetes) { + return `router-local,router-local.${namespace},router-local.${namespace}.svc.cluster.local` + } + return '127.0.0.1,localhost,host.docker.internal,host.containers.internal' +} + +async function getSiteCertificateHosts (fogData, transaction) { + const hosts = new Set() + // Add existing hosts if isSystem + if (fogData.isSystem) { + if (fogData.host) hosts.add(fogData.host) + if (fogData.ipAddress) hosts.add(fogData.ipAddress) + if (fogData.ipAddressExternal) hosts.add(fogData.ipAddressExternal) + } + // Add default router host if not system + if (!fogData.isSystem) { + const defaultRouter = await RouterManager.findOne({ isDefault: true }, transaction) + if (defaultRouter.host) hosts.add(defaultRouter.host) + } + // Add upstream router hosts + // const upstreamRouters = (fogData.upstreamRouters || []).filter(uuid => uuid !== 'default-router') + // if (upstreamRouters.length) { + // for (const uuid of upstreamRouters) { + // const routerHost = await FogManager.findOne({ uuid: uuid }, transaction) + // if (routerHost.host) hosts.add(routerHost.host) + // if (routerHost.ipAddress) hosts.add(routerHost.ipAddress) + // } + // } + return Array.from(hosts).join(',') || 'localhost' +} + +async function _handleRouterCertificates (fogData, uuid, isRouterModeChanged, transaction) { + logger.debug('Starting _handleRouterCertificates for fog: ' + JSON.stringify({ uuid: uuid, host: fogData.host })) + + // Check if we're in Kubernetes environment + const isKubernetes = await checkKubernetesEnvironment() + const namespace = isKubernetes ? process.env.CONTROLLER_NAMESPACE : null -async function _handleRouterCertificates (fogData, transaction) { // Helper to check CA existence async function ensureCA (name, subject) { + logger.debug('Checking CA existence: ' + JSON.stringify({ name, subject })) try { await CertificateService.getCAEndpoint(name, transaction) + logger.debug('CA already exists: ' + name) // CA exists } catch (err) { if (err.name === 'NotFoundError') { + logger.debug('CA not found, creating new CA: ' + JSON.stringify({ name, subject })) await CertificateService.createCAEndpoint({ name, subject: `${subject}`, expiration: 60, // months type: 'self-signed' }, transaction) + logger.debug('Successfully created CA: ' + name) } else if (err.name === 'ConflictError') { + logger.debug('CA already exists (conflict): ' + name) // Already exists, ignore } else { + logger.error('Error in ensureCA - Name: ' + name + ', Subject: ' + subject + ', Error: ' + err.message + ', Type: ' + err.name + ', Code: ' + err.code) + logger.error('Stack trace: ' + err.stack) throw err } } } // Helper to check cert existence - async function ensureCert (name, subject, hosts, ca) { + async function ensureCert (name, subject, hosts, ca, shouldRecreate = false) { + logger.debug('Checking certificate existence: ' + JSON.stringify({ name, subject, hosts, ca })) try { - await CertificateService.getCertificateEndpoint(name, transaction) - // Cert exists + const existingCert = await CertificateService.getCertificateEndpoint(name, transaction) + if (shouldRecreate && existingCert) { + logger.debug('Certificate exists and needs recreation: ' + name) + await CertificateService.deleteCertificateEndpoint(name, transaction) + logger.debug('Deleted existing certificate: ' + name) + // Create new certificate + await CertificateService.createCertificateEndpoint({ + name, + subject: `${subject}`, + hosts, + ca + }, transaction) + logger.debug('Successfully recreated certificate: ' + name) + } else if (!existingCert) { + logger.debug('Certificate not found, creating new certificate: ' + JSON.stringify({ name, subject, hosts, ca })) + await CertificateService.createCertificateEndpoint({ + name, + subject: `${subject}`, + hosts, + ca + }, transaction) + logger.debug('Successfully created certificate: ' + name) + } else { + logger.debug('Certificate already exists: ' + name) + } } catch (err) { if (err.name === 'NotFoundError') { + logger.debug('Certificate not found, creating new certificate: ' + JSON.stringify({ name, subject, hosts, ca })) await CertificateService.createCertificateEndpoint({ name, subject: `${subject}`, hosts, ca }, transaction) + logger.debug('Successfully created certificate: ' + name) } else if (err.name === 'ConflictError') { + logger.debug('Certificate already exists (conflict): ' + name) // Already exists, ignore } else { + logger.error('Error in ensureCert - Name: ' + name + ', Subject: ' + subject + ', Hosts: ' + hosts + ', CA: ' + JSON.stringify(ca) + ', Error: ' + err.message + ', Type: ' + err.name + ', Code: ' + err.code) + logger.error('Stack trace: ' + err.stack) throw err } } } - // Build hosts string from available fields - const hosts = [ - fogData.host, - fogData.ipAddress, - fogData.ipAddressExternal - ].filter(Boolean).join(',') || 'localhost' - try { // Always ensure SITE_CA_CERT exists + logger.debug('Ensuring SITE_CA_CERT exists') await ensureCA(SITE_CA_CERT, SITE_CA_CERT) + // If routerMode is 'none', only ensure DEFAULT_ROUTER_LOCAL_CA and its signed certificate + if (fogData.routerMode === 'none') { + logger.debug('Router mode is none, ensuring DEFAULT_ROUTER_LOCAL_CA exists') + await ensureCA(DEFAULT_ROUTER_LOCAL_CA, DEFAULT_ROUTER_LOCAL_CA) + logger.debug('Ensuring local-agent certificate signed by DEFAULT_ROUTER_LOCAL_CA') + const localHosts = await getLocalCertificateHosts(isKubernetes, namespace) + await ensureCert( + `${uuid}-local-agent`, + `${uuid}-local-agent`, + localHosts, + { type: 'direct', secretName: DEFAULT_ROUTER_LOCAL_CA }, + isRouterModeChanged + ) + logger.debug('Successfully completed _handleRouterCertificates for routerMode none') + return + } + + // For other router modes, ensure all other certificates // Always ensure site-server cert exists + logger.debug('Ensuring site-server certificate exists') + const siteHosts = await getSiteCertificateHosts(fogData, transaction) await ensureCert( - `${fogData.uuid}-site-server`, - `${fogData.uuid}-site-server`, - hosts, - { type: 'direct', secretName: SITE_CA_CERT } + `${uuid}-site-server`, + `${uuid}-site-server`, + siteHosts, + { type: 'direct', secretName: SITE_CA_CERT }, + false ) // Always ensure local-ca exists - await ensureCA(`${fogData.uuid}-local-ca`, `${fogData.uuid}-local-ca`) + logger.debug('Ensuring local-ca exists') + await ensureCA(`${uuid}-local-ca`, `${uuid}-local-ca`) // Always ensure local-server cert exists + logger.debug('Ensuring local-server certificate exists') + const localHosts = await getLocalCertificateHosts(isKubernetes, namespace) await ensureCert( - `${fogData.uuid}-local-server`, - `${fogData.uuid}-local-server`, - hosts, - { type: 'direct', secretName: `${fogData.uuid}-local-ca` } + `${uuid}-local-server`, + `${uuid}-local-server`, + localHosts, + { type: 'direct', secretName: `${uuid}-local-ca` }, + isRouterModeChanged ) // Always ensure local-agent cert exists + logger.debug('Ensuring local-agent certificate exists') await ensureCert( - `${fogData.uuid}-local-agent`, - `${fogData.uuid}-local-agent`, - hosts, - { type: 'direct', secretName: `${fogData.uuid}-local-ca` } + `${uuid}-local-agent`, + `${uuid}-local-agent`, + localHosts, + { type: 'direct', secretName: `${uuid}-local-ca` }, + isRouterModeChanged ) - // If routerMode is 'none', also ensure DEFAULT_ROUTER_LOCAL_CA and local-agent signed by it - if (fogData.routerMode === 'none') { - await ensureCA(DEFAULT_ROUTER_LOCAL_CA, DEFAULT_ROUTER_LOCAL_CA) - await ensureCert( - `${fogData.uuid}-local-agent`, - `${fogData.uuid}-local-agent`, - hosts, - { type: 'direct', secretName: DEFAULT_ROUTER_LOCAL_CA } - ) - } + logger.debug('Successfully completed _handleRouterCertificates') } catch (error) { - logger.error('Certificate operation failed:', error) + logger.error('Certificate operation failed - UUID: ' + uuid + ', RouterMode: ' + fogData.routerMode + ', Error: ' + error.message + ', Type: ' + error.name + ', Code: ' + error.code) + logger.error('Stack trace: ' + error.stack) } } @@ -144,7 +239,7 @@ async function createFogEndPoint (fogData, isCLI, transaction) { await Validator.validate(fogData, Validator.schemas.iofogCreate) let createFogData = { - uuid: AppHelper.generateRandomString(32), + uuid: AppHelper.generateUUID(), name: fogData.name, location: fogData.location, latitude: fogData.latitude, @@ -153,6 +248,8 @@ async function createFogEndPoint (fogData, isCLI, transaction) { description: fogData.description, networkInterface: fogData.networkInterface, dockerUrl: fogData.dockerUrl, + containerEngine: fogData.containerEngine, + deploymentType: fogData.deploymentType, diskLimit: fogData.diskLimit, diskDirectory: fogData.diskDirectory, memoryLimit: fogData.memoryLimit, @@ -176,9 +273,6 @@ async function createFogEndPoint (fogData, isCLI, transaction) { timeZone: fogData.timeZone } - // Add certificate handling - await _handleRouterCertificates(fogData, transaction) - createFogData = AppHelper.deleteUndefinedFields(createFogData) // Default router is edge @@ -211,32 +305,75 @@ async function createFogEndPoint (fogData, isCLI, transaction) { const fog = await FogManager.create(createFogData, transaction) - // Set tags + // Set tags (synchronously, as this is a simple DB op) await _setTags(fog, fogData.tags, transaction) - if (fogData.routerMode !== 'none') { - if (!fogData.host && !isCLI) { - throw new Errors.ValidationError(ErrorMessages.HOST_IS_REQUIRED) - } - - await RouterService.createRouterForFog(fogData, fog.uuid, upstreamRouters) - } - - const res = { - uuid: fog.uuid - } - - await ChangeTrackingService.create(fog.uuid, transaction) + // Return fog UUID immediately + const res = { uuid: fog.uuid } - if (fogData.abstractedHardwareEnabled) { - await _createHalMicroserviceForFog(fog, null, transaction) - } - - if (fogData.bluetoothEnabled) { - await _createBluetoothMicroserviceForFog(fog, null, transaction) - } + // Start background orchestration + setImmediate(() => { + (async () => { + try { + // --- Begin orchestration logic (previously inside runWithRetries) --- + await _handleRouterCertificates(fogData, createFogData.uuid, false, transaction) + + if (fogData.routerMode !== 'none') { + if (!fogData.host && !isCLI) { + throw new Errors.ValidationError(ErrorMessages.HOST_IS_REQUIRED) + } + await RouterService.createRouterForFog(fogData, fog.uuid, upstreamRouters) + + // Service Distribution Logic + const serviceTags = await _extractServiceTags(fogData.tags) + if (serviceTags.length > 0) { + const services = await _findMatchingServices(serviceTags, transaction) + if (services.length > 0) { + const routerName = `router-${fog.uuid.toLowerCase()}` + const routerMicroservice = await MicroserviceManager.findOne({ name: routerName }, transaction) + if (!routerMicroservice) { + throw new Errors.NotFoundError(`Router microservice not found: ${routerName}`) + } + let config = JSON.parse(routerMicroservice.config || '{}') + for (const service of services) { + const listenerConfig = _buildTcpListenerForFog(service, fog.uuid) + config = _mergeTcpListener(config, listenerConfig) + } + await MicroserviceManager.update( + { uuid: routerMicroservice.uuid }, + { config: JSON.stringify(config) }, + transaction + ) + await ChangeTrackingService.update(fog.uuid, ChangeTrackingService.events.microserviceConfig, transaction) + } + } + } - await ChangeTrackingService.update(createFogData.uuid, ChangeTrackingService.events.microserviceCommon, transaction) + await ChangeTrackingService.create(fog.uuid, transaction) + if (fogData.abstractedHardwareEnabled) { + await _createHalMicroserviceForFog(fog, null, transaction) + } + if (fogData.bluetoothEnabled) { + await _createBluetoothMicroserviceForFog(fog, null, transaction) + } + await ChangeTrackingService.update(createFogData.uuid, ChangeTrackingService.events.microserviceCommon, transaction) + // --- End orchestration logic --- + // Set fog node as healthy + await FogManager.update({ uuid: fog.uuid }, { warningMessage: 'HEALTHY' }, transaction) + } catch (err) { + logger.error('Background orchestration failed in createFogEndPoint:', err) + // Set fog node as warning with error message + await FogManager.update( + { uuid: fog.uuid }, + { + daemonStatus: FogStates.WARNING, + warningMessage: `Background orchestration error: ${err.message}` + }, + transaction + ) + } + })() + }) return res } @@ -269,6 +406,8 @@ async function updateFogEndPoint (fogData, isCLI, transaction) { description: fogData.description, networkInterface: fogData.networkInterface, dockerUrl: fogData.dockerUrl, + containerEngine: fogData.containerEngine, + deploymentType: fogData.deploymentType, diskLimit: fogData.diskLimit, diskDirectory: fogData.diskDirectory, memoryLimit: fogData.memoryLimit, @@ -297,9 +436,6 @@ async function updateFogEndPoint (fogData, isCLI, transaction) { throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.INVALID_IOFOG_UUID, fogData.uuid)) } - // Add certificate handling - await _handleRouterCertificates(fogData, transaction) - // Update tags await _setTags(oldFog, fogData.tags, transaction) @@ -313,7 +449,6 @@ async function updateFogEndPoint (fogData, isCLI, transaction) { } } - // Update router // Get all router config informations const router = await oldFog.getRouter() const host = fogData.host || lget(router, 'host') @@ -325,74 +460,156 @@ async function updateFogEndPoint (fogData, isCLI, transaction) { const edgeRouterPort = fogData.edgeRouterPort || (router ? router.edgeRouterPort : null) let networkRouter - // const isSystem = updateFogData.isSystem === undefined ? oldFog.isSystem : updateFogData.isSystem - // if (isSystem && routerMode !== 'interior') { - // throw new Errors.ValidationError(AppHelper.formatMessage(ErrorMessages.INVALID_ROUTER_MODE, fogData.routerMode)) - // } - - if (routerMode === 'none') { - networkRouter = await RouterService.getNetworkRouter(fogData.networkRouter) - if (!networkRouter) { - throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.INVALID_ROUTER, !fogData.networkRouter ? Constants.DEFAULT_ROUTER_NAME : fogData.networkRouter)) - } - // Only delete previous router if there is a network router - if (router) { - // New router mode is none, delete existing router - await _deleteFogRouter(fogData, transaction) - } - } else { - const defaultRouter = await RouterManager.findOne({ isDefault: true }, transaction) - const upstreamRouters = await RouterService.validateAndReturnUpstreamRouters(upstreamRoutersIofogUuid, oldFog.isSystem, defaultRouter) - if (!router) { - // Router does not exist yet - networkRouter = await RouterService.createRouterForFog(fogData, oldFog.uuid, upstreamRouters) - } else { - // Update existing router - networkRouter = await RouterService.updateRouter(router, { - messagingPort, interRouterPort, edgeRouterPort, isEdge: routerMode === 'edge', host - }, upstreamRouters) - await ChangeTrackingService.update(fogData.uuid, ChangeTrackingService.events.routerChanged, transaction) - } + const isSystem = updateFogData.isSystem === undefined ? oldFog.isSystem : updateFogData.isSystem + if (isSystem && routerMode !== 'interior') { + throw new Errors.ValidationError(AppHelper.formatMessage(ErrorMessages.INVALID_ROUTER_MODE, fogData.routerMode)) } - updateFogData.routerId = networkRouter.id - // If router changed, set routerChanged flag - if (updateFogData.routerId !== oldFog.routerId || updateFogData.routerMode !== oldFog.routerMode) { - await ChangeTrackingService.update(fogData.uuid, ChangeTrackingService.events.routerChanged, transaction) - await ChangeTrackingService.update(fogData.uuid, ChangeTrackingService.events.microserviceList, transaction) + let isRouterModeChanged = false + const oldRouterMode = (router ? (router.isEdge ? 'edge' : 'interior') : 'none') + if (fogData.routerMode && fogData.routerMode !== oldRouterMode) { + if (fogData.routerMode === 'none' || oldRouterMode === 'none') { + isRouterModeChanged = true + } } await FogManager.update(queryFogData, updateFogData, transaction) await ChangeTrackingService.update(fogData.uuid, ChangeTrackingService.events.config, transaction) - let msChanged = false + // Return immediately + const res = { uuid: fogData.uuid } - // Update Microservice extra hosts - if (updateFogData.host && updateFogData.host !== oldFog.host) { - await _updateMicroserviceExtraHosts(fogData.uuid, updateFogData.host, transaction) - } + // Start background orchestration + setImmediate(() => { + (async () => { + try { + // --- Begin orchestration logic --- + await _handleRouterCertificates(fogData, fogData.uuid, isRouterModeChanged, transaction) + + if (routerMode === 'none') { + networkRouter = await RouterService.getNetworkRouter(fogData.networkRouter) + if (!networkRouter) { + throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.INVALID_ROUTER, !fogData.networkRouter ? Constants.DEFAULT_ROUTER_NAME : fogData.networkRouter)) + } + if (router) { + await _deleteFogRouter(fogData, transaction) + } + } else { + const defaultRouter = await RouterManager.findOne({ isDefault: true }, transaction) + const upstreamRouters = await RouterService.validateAndReturnUpstreamRouters(upstreamRoutersIofogUuid, oldFog.isSystem, defaultRouter) + if (!router) { + networkRouter = await RouterService.createRouterForFog(fogData, oldFog.uuid, upstreamRouters) + // --- Service Distribution Logic --- + const serviceTags = await _extractServiceTags(fogData.tags) + if (serviceTags.length > 0) { + const services = await _findMatchingServices(serviceTags, transaction) + if (services.length > 0) { + const routerName = `router-${fogData.uuid.toLowerCase()}` + const routerMicroservice = await MicroserviceManager.findOne({ name: routerName }, transaction) + if (!routerMicroservice) { + throw new Errors.NotFoundError(`Router microservice not found: ${routerName}`) + } + let config = JSON.parse(routerMicroservice.config || '{}') + for (const service of services) { + const listenerConfig = _buildTcpListenerForFog(service, fogData.uuid) + config = _mergeTcpListener(config, listenerConfig) + } + await MicroserviceManager.update( + { uuid: routerMicroservice.uuid }, + { config: JSON.stringify(config) }, + transaction + ) + await ChangeTrackingService.update(fogData.uuid, ChangeTrackingService.events.microserviceConfig, transaction) + } + } + } else { + const existingConnectors = await _extractExistingTcpConnectors(fogData.uuid, transaction) + networkRouter = await RouterService.updateRouter(router, { + messagingPort, interRouterPort, edgeRouterPort, isEdge: routerMode === 'edge', host + }, upstreamRouters, fogData.containerEngine) + // --- Service Distribution Logic --- + const serviceTags = await _extractServiceTags(fogData.tags) + const routerName = `router-${fogData.uuid.toLowerCase()}` + const routerMicroservice = await MicroserviceManager.findOne({ name: routerName }, transaction) + if (!routerMicroservice) { + throw new Errors.NotFoundError(`Router microservice not found: ${routerName}`) + } + let config = JSON.parse(routerMicroservice.config || '{}') + if (serviceTags.length > 0) { + const services = await _findMatchingServices(serviceTags, transaction) + if (services.length > 0) { + for (const service of services) { + const listenerConfig = _buildTcpListenerForFog(service, fogData.uuid) + config = _mergeTcpListener(config, listenerConfig) + } + } + } + // Merge back existing connectors if any + if (existingConnectors && Object.keys(existingConnectors).length > 0) { + for (const connectorName in existingConnectors) { + const connectorObj = existingConnectors[connectorName] + config = _mergeTcpConnector(config, connectorObj) + } + } + await MicroserviceManager.update( + { uuid: routerMicroservice.uuid }, + { config: JSON.stringify(config) }, + transaction + ) + await ChangeTrackingService.update(fogData.uuid, ChangeTrackingService.events.microserviceConfig, transaction) + await ChangeTrackingService.update(fogData.uuid, ChangeTrackingService.events.routerChanged, transaction) + } + } + updateFogData.routerId = networkRouter.id - if (oldFog.abstractedHardwareEnabled === true && fogData.abstractedHardwareEnabled === false) { - await _deleteHalMicroserviceByFog(fogData, transaction) - msChanged = true - } - if (oldFog.abstractedHardwareEnabled === false && fogData.abstractedHardwareEnabled === true) { - await _createHalMicroserviceForFog(fogData, oldFog, transaction) - msChanged = true - } + // If router changed, set routerChanged flag + if (updateFogData.routerId !== oldFog.routerId || updateFogData.routerMode !== oldFog.routerMode) { + await ChangeTrackingService.update(fogData.uuid, ChangeTrackingService.events.routerChanged, transaction) + await ChangeTrackingService.update(fogData.uuid, ChangeTrackingService.events.microserviceList, transaction) + } - if (oldFog.bluetoothEnabled === true && fogData.bluetoothEnabled === false) { - await _deleteBluetoothMicroserviceByFog(fogData, transaction) - msChanged = true - } - if (oldFog.bluetoothEnabled === false && fogData.bluetoothEnabled === true) { - await _createBluetoothMicroserviceForFog(fogData, oldFog, transaction) - msChanged = true - } + let msChanged = false + if (updateFogData.host && updateFogData.host !== oldFog.host) { + await _updateMicroserviceExtraHosts(fogData.uuid, updateFogData.host, transaction) + } + if (oldFog.abstractedHardwareEnabled === true && fogData.abstractedHardwareEnabled === false) { + await _deleteHalMicroserviceByFog(fogData, transaction) + msChanged = true + } + if (oldFog.abstractedHardwareEnabled === false && fogData.abstractedHardwareEnabled === true) { + await _createHalMicroserviceForFog(fogData, oldFog, transaction) + msChanged = true + } + if (oldFog.bluetoothEnabled === true && fogData.bluetoothEnabled === false) { + await _deleteBluetoothMicroserviceByFog(fogData, transaction) + msChanged = true + } + if (oldFog.bluetoothEnabled === false && fogData.bluetoothEnabled === true) { + await _createBluetoothMicroserviceForFog(fogData, oldFog, transaction) + msChanged = true + } + if (msChanged) { + await ChangeTrackingService.update(fogData.uuid, ChangeTrackingService.events.microserviceCommon, transaction) + } + // --- End orchestration logic --- + // Set fog node as healthy + await FogManager.update({ uuid: fogData.uuid }, { warningMessage: 'HEALTHY' }, transaction) + } catch (err) { + logger.error('Background orchestration failed in updateFogEndPoint:', err) + await FogManager.update( + { uuid: fogData.uuid }, + { + daemonStatus: FogStates.WARNING, + warningMessage: `Background orchestration error: ${err.message}` + }, + transaction + ) + } + })() + }) - if (msChanged) { - await ChangeTrackingService.update(fogData.uuid, ChangeTrackingService.events.microserviceCommon, transaction) - } + // Return immediately + return res } async function _updateMicroserviceExtraHosts (fogUuid, host, transaction) { @@ -445,7 +662,7 @@ async function _deleteFogRouter (fogData, transaction) { } // Update router config - await RouterService.updateConfig(router.id, transaction) + await RouterService.updateConfig(router.id, fogData.containerEngine, transaction) // Set routerChanged flag await ChangeTrackingService.update(router.iofogUuid, ChangeTrackingService.events.routerChanged, transaction) } @@ -531,14 +748,33 @@ async function _getFogEdgeResources (fog, transaction) { return resources.map(EdgeResourceService.buildGetObject) } +async function _getFogVolumeMounts (fog, transaction) { + const volumeMountAttributes = [ + 'name', + 'version', + 'configMapName', + 'secretName' + ] + const volumeMounts = await fog.getVolumeMounts({ attributes: volumeMountAttributes }) + return volumeMounts.map(vm => { + return { + name: vm.name, + version: vm.version, + configMapName: vm.configMapName, + secretName: vm.secretName + } + }) +} + async function _getFogExtraInformation (fog, transaction) { const routerConfig = await _getFogRouterConfig(fog, transaction) const edgeResources = await _getFogEdgeResources(fog, transaction) + const volumeMounts = await _getFogVolumeMounts(fog, transaction) // Transform to plain JS object if (fog.toJSON && typeof fog.toJSON === 'function') { fog = fog.toJSON() } - return { ...fog, tags: _mapTags(fog), ...routerConfig, edgeResources } + return { ...fog, tags: _mapTags(fog), ...routerConfig, edgeResources, volumeMounts } } // Map tags to string array @@ -547,6 +783,34 @@ function _mapTags (fog) { return fog.tags ? fog.tags.map(t => t.value) : [] } +/** + * Extracts service-related tags from fog node tags + * @param {Array} fogTags - Array of tags from fog node + * @returns {Array} Array of service tags (e.g., ["all", "foo", "bar"]) + */ +async function _extractServiceTags (fogTags) { + if (!fogTags || !Array.isArray(fogTags)) { + return [] + } + + // Filter tags that start with SERVICE_ANNOTATION_TAG + const serviceTags = fogTags + .filter(tag => tag.startsWith(SERVICE_ANNOTATION_TAG)) + .map(tag => { + // Extract the value after the colon + const parts = tag.split(':') + return parts.length > 1 ? parts[1].trim() : '' + }) + .filter(tag => tag !== '') // Remove empty tags + + // If we have "all" tag, return just that + if (serviceTags.includes('all')) { + return ['all'] + } + + return serviceTags +} + async function getFog (fogData, isCLI, transaction) { await Validator.validate(fogData, Validator.schemas.iofogGet) @@ -564,7 +828,8 @@ async function getFogEndPoint (fogData, isCLI, transaction) { return getFog(fogData, isCLI, transaction) } -async function getFogListEndPoint (filters, isCLI, isSystem, transaction) { +// async function getFogListEndPoint (filters, isCLI, isSystem, transaction) { +async function getFogListEndPoint (filters, isCLI, transaction) { await Validator.validate(filters, Validator.schemas.iofogFilters) // // If listing system agent through REST API, make sure user is authenticated @@ -572,7 +837,8 @@ async function getFogListEndPoint (filters, isCLI, isSystem, transaction) { // throw new Errors.AuthenticationError('Unauthorized') // } - const queryFogData = isSystem ? { isSystem } : (isCLI ? {} : { isSystem: false }) + // const queryFogData = isSystem ? { isSystem } : (isCLI ? {} : { isSystem: false }) + const queryFogData = {} let fogs = await FogManager.findAllWithTags(queryFogData, transaction) fogs = _filterFogs(fogs, filters) @@ -751,7 +1017,7 @@ async function _createHalMicroserviceForFog (fogData, oldFog, transaction) { const halItem = await CatalogService.getHalCatalogItem(transaction) const halMicroserviceData = { - uuid: AppHelper.generateRandomString(32), + uuid: AppHelper.generateUUID(), name: `hal-${fogData.uuid.toLowerCase()}`, config: '{}', catalogItemId: halItem.id, @@ -783,7 +1049,7 @@ async function _createBluetoothMicroserviceForFog (fogData, oldFog, transaction) const bluetoothItem = await CatalogService.getBluetoothCatalogItem(transaction) const bluetoothMicroserviceData = { - uuid: AppHelper.generateRandomString(32), + uuid: AppHelper.generateUUID(), name: `ble-${fogData.uuid.toLowerCase()}`, config: '{}', catalogItemId: bluetoothItem.id, @@ -824,6 +1090,135 @@ async function setFogPruneCommandEndPoint (fogData, isCLI, transaction) { await ChangeTrackingService.update(fogData.uuid, ChangeTrackingService.events.prune, transaction) } +/** + * Finds services that match the fog node's service tags + * @param {Array} serviceTags - Array of service tags from fog node + * @param {Object} transaction - Database transaction + * @returns {Promise>} Array of matching services + */ +async function _findMatchingServices (serviceTags, transaction) { + if (!serviceTags || serviceTags.length === 0) { + return [] + } + + // If 'all' tag is present, get all services + if (serviceTags.includes('all')) { + return ServiceManager.findAllWithTags({}, transaction) + } + + // For each service tag, find matching services + const servicesPromises = serviceTags.map(async (tag) => { + const queryData = { + '$tags.value$': `${tag}` + } + return ServiceManager.findAllWithTags(queryData, transaction) + }) + + // Wait for all queries to complete + const servicesArrays = await Promise.all(servicesPromises) + + // Flatten arrays and remove duplicates based on service name + const seen = new Set() + const uniqueServices = servicesArrays + .flat() + .filter(service => { + if (seen.has(service.name)) { + return false + } + seen.add(service.name) + return true + }) + + return uniqueServices +} + +/** + * Builds TCP listener configuration for a service on a specific fog node + * @param {Object} service - Service object containing name and bridgePort + * @param {string} fogNodeUuid - UUID of the fog node + * @returns {Object} TCP listener configuration + */ +function _buildTcpListenerForFog (service, fogNodeUuid) { + return { + name: `${service.name}-listener`, + port: service.bridgePort.toString(), + address: service.name, + siteId: fogNodeUuid + } +} + +/** + * Gets the router microservice configuration for a fog node + * @param {string} fogNodeUuid - UUID of the fog node + * @param {Object} transaction - Database transaction + * @returns {Promise} Router microservice configuration + */ +async function _getRouterMicroserviceConfig (fogNodeUuid, transaction) { + const routerName = `router-${fogNodeUuid.toLowerCase()}` + const routerMicroservice = await MicroserviceManager.findOne({ name: routerName }, transaction) + if (!routerMicroservice) { + throw new Errors.NotFoundError(`Router microservice not found: ${routerName}`) + } + const routerConfig = JSON.parse(routerMicroservice.config || '{}') + return routerConfig +} + +/** + * Extracts existing TCP connectors from router configuration + * @param {string} fogNodeUuid - UUID of the fog node + * @param {Object} transaction - Database transaction + * @returns {Promise} Object containing TCP connectors + */ +async function _extractExistingTcpConnectors (fogNodeUuid, transaction) { + const routerConfig = await _getRouterMicroserviceConfig(fogNodeUuid, transaction) + // Return empty object if no bridges or tcpConnectors exist + if (!routerConfig.bridges || !routerConfig.bridges.tcpConnectors) { + return {} + } + + return routerConfig.bridges.tcpConnectors +} + +/** + * Merges a single TCP connector into router configuration + * @param {Object} routerConfig - Base router configuration + * @param {Object} connectorObj - TCP connector object (must have 'name' property) + * @returns {Object} Updated router configuration + */ +function _mergeTcpConnector (routerConfig, connectorObj) { + if (!connectorObj || !connectorObj.name) { + throw new Error('Connector object must have a name property') + } + if (!routerConfig.bridges) { + routerConfig.bridges = {} + } + if (!routerConfig.bridges.tcpConnectors) { + routerConfig.bridges.tcpConnectors = {} + } + routerConfig.bridges.tcpConnectors[connectorObj.name] = connectorObj + return routerConfig +} + +/** + * Merges a single TCP listener into router configuration + * @param {Object} routerConfig - Base router configuration + * @param {Object} listenerObj - TCP listener object (must have 'name' property) + * @returns {Object} Updated router configuration + */ +function _mergeTcpListener (routerConfig, listenerObj) { + if (!listenerObj || !listenerObj.name) { + throw new Error('Listener object must have a name property') + } + if (!routerConfig.bridges) { + routerConfig.bridges = {} + } + if (!routerConfig.bridges.tcpListeners) { + routerConfig.bridges.tcpListeners = {} + } + routerConfig.bridges.tcpListeners[listenerObj.name] = listenerObj + return routerConfig +} + module.exports = { createFogEndPoint: TransactionDecorator.generateTransaction(createFogEndPoint), updateFogEndPoint: TransactionDecorator.generateTransaction(updateFogEndPoint), @@ -836,5 +1231,14 @@ module.exports = { getHalHardwareInfoEndPoint: TransactionDecorator.generateTransaction(getHalHardwareInfoEndPoint), getHalUsbInfoEndPoint: TransactionDecorator.generateTransaction(getHalUsbInfoEndPoint), getFog: getFog, - setFogPruneCommandEndPoint: TransactionDecorator.generateTransaction(setFogPruneCommandEndPoint) + setFogPruneCommandEndPoint: TransactionDecorator.generateTransaction(setFogPruneCommandEndPoint), + _extractServiceTags, + _findMatchingServices: TransactionDecorator.generateTransaction(_findMatchingServices), + _buildTcpListenerForFog, + _getRouterMicroserviceConfig: TransactionDecorator.generateTransaction(_getRouterMicroserviceConfig), + _extractExistingTcpConnectors: TransactionDecorator.generateTransaction(_extractExistingTcpConnectors), + _mergeTcpConnector, + _mergeTcpListener, + checkKubernetesEnvironment, + _handleRouterCertificates: TransactionDecorator.generateTransaction(_handleRouterCertificates) } diff --git a/src/services/microservice-ports/microservice-port.js b/src/services/microservice-ports/microservice-port.js new file mode 100644 index 000000000..e866f191b --- /dev/null +++ b/src/services/microservice-ports/microservice-port.js @@ -0,0 +1,211 @@ +/* only "[a-zA-Z0-9][a-zA-Z0-9_.-]" are allowed + * ******************************************************************************* + * * Copyright (c) 2023 Datasance Teknoloji A.S. + * * + * * This program and the accompanying materials are made available under the + * * terms of the Eclipse Public License v. 2.0 which is available at + * * http://www.eclipse.org/legal/epl-2.0 + * * + * * SPDX-License-Identifier: EPL-2.0 + * ******************************************************************************* + * + */ + +const MicroservicePortManager = require('../../data/managers/microservice-port-manager') +const MicroserviceManager = require('../../data/managers/microservice-manager') +const ChangeTrackingService = require('../change-tracking-service') +const AppHelper = require('../../helpers/app-helper') +const Errors = require('../../helpers/errors') +const ErrorMessages = require('../../helpers/error-messages') +const Op = require('sequelize').Op +const FogManager = require('../../data/managers/iofog-manager') + +const { RESERVED_PORTS } = require('../../helpers/constants') + +async function _checkForDuplicatePorts (agent, localPort, transaction) { + if (RESERVED_PORTS.find(port => port === localPort)) { + throw new Errors.ValidationError(AppHelper.formatMessage(ErrorMessages.PORT_RESERVED, localPort)) + } + + const microservices = await agent.getMicroservice() + for (const microservice of microservices) { + const ports = await microservice.getPorts() + if (ports.find(port => port.portExternal === localPort)) { + throw new Errors.ValidationError(AppHelper.formatMessage(ErrorMessages.PORT_NOT_AVAILABLE, localPort)) + } + } +} + +// Validate port and populate, mapping.localAgent +async function validatePortMapping (agent, mapping, transaction) { + await _checkForDuplicatePorts(agent, mapping.external, transaction) +} + +async function validatePortMappings (microserviceData, transaction) { + if (!microserviceData.ports || microserviceData.ports.length === 0) { + return + } + + const localAgent = await FogManager.findOne({ uuid: microserviceData.iofogUuid }, transaction) + if (!localAgent) { + throw new Errors.ValidationError(AppHelper.formatMessage(ErrorMessages.INVALID_IOFOG_UUID, microserviceData.iofogUuid)) + } + + // Will be filled by validatePortMapping + for (const mapping of microserviceData.ports) { + await validatePortMapping(localAgent, mapping, transaction) + } +} + +async function createPortMapping (microservice, portMappingData, transaction) { + if (!microservice.iofogUuid) { + throw new Errors.ValidationError(AppHelper.formatMessage(ErrorMessages.REQUIRED_FOG_NODE)) + } + + const msPorts = await MicroservicePortManager.findOne({ + microserviceUuid: microservice.uuid, + [Op.or]: [] + }, transaction) + if (msPorts) { + throw new Errors.ValidationError(ErrorMessages.PORT_MAPPING_ALREADY_EXISTS) + } + + portMappingData.protocol = portMappingData.protocol || '' + + return _createSimplePortMapping(microservice, portMappingData, transaction) +} + +async function _deletePortMapping (microservice, portMapping, transaction) { + await _deleteSimplePortMapping(microservice, portMapping, transaction) +} + +async function _createSimplePortMapping (microservice, portMappingData, transaction) { + // create port mapping + const mappingData = { + portInternal: portMappingData.internal, + portExternal: portMappingData.external, + isUdp: portMappingData.protocol.toLowerCase() === 'udp', + microserviceUuid: microservice.uuid + } + + await MicroservicePortManager.create(mappingData, transaction) + await switchOnUpdateFlagsForMicroservicesForPortMapping(microservice, transaction) +} + +async function _deleteSimplePortMapping (microservice, msPorts, transaction) { + await MicroservicePortManager.delete({ id: msPorts.id }, transaction) + + const updateRebuildMs = { + rebuild: true + } + await MicroserviceManager.update({ uuid: microservice.uuid }, updateRebuildMs, transaction) + await ChangeTrackingService.update(microservice.iofogUuid, ChangeTrackingService.events.microserviceCommon, transaction) +} + +async function _buildPortsList (portsPairs, transaction) { + const res = [] + for (const ports of portsPairs) { + const portMappingResponseData = { + internal: ports.portInternal, + external: ports.portExternal, + protocol: ports.isUdp ? 'udp' : 'tcp' + } + res.push(portMappingResponseData) + } + return res +} + +async function switchOnUpdateFlagsForMicroservicesForPortMapping (microservice, transaction) { + const updateRebuildMs = { + rebuild: true + } + await MicroserviceManager.update({ uuid: microservice.uuid }, updateRebuildMs, transaction) + + await ChangeTrackingService.update(microservice.iofogUuid, ChangeTrackingService.events.microserviceConfig, transaction) +} + +async function listPortMappings (microserviceUuid, isCLI, transaction) { + const where = isCLI + ? { uuid: microserviceUuid } + : { uuid: microserviceUuid } + const microservice = await MicroserviceManager.findOne(where, transaction) + if (!microservice) { + throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.INVALID_MICROSERVICE_UUID, microserviceUuid)) + } + + const portsPairs = await MicroservicePortManager.findAll({ microserviceUuid }, transaction) + return _buildPortsList(portsPairs, transaction) +} + +async function deletePortMapping (microserviceUuid, internalPort, isCLI, transaction) { + const where = isCLI + ? { uuid: microserviceUuid } + : { uuid: microserviceUuid } + + const microservice = await MicroserviceManager.findMicroserviceOnGet(where, transaction) + if (!microservice) { + throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.INVALID_MICROSERVICE_UUID, microserviceUuid)) + } + + if (!internalPort) { + throw new Errors.ValidationError(ErrorMessages.PORT_MAPPING_INTERNAL_PORT_NOT_PROVIDED) + } + + const msPorts = await MicroservicePortManager.findOne({ + microserviceUuid: microservice.uuid, + portInternal: internalPort + }, transaction) + if (!msPorts) { + throw new Errors.NotFoundError('port mapping not exists') + } + + await _deletePortMapping(microservice, msPorts, transaction) +} + +async function deleteSystemPortMapping (microserviceUuid, internalPort, isCLI, transaction) { + const where = isCLI + ? { uuid: microserviceUuid } + : { uuid: microserviceUuid } + + const microservice = await MicroserviceManager.findOne(where, transaction) + if (!microservice) { + throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.INVALID_MICROSERVICE_UUID, microserviceUuid)) + } + + if (!internalPort) { + throw new Errors.ValidationError(ErrorMessages.PORT_MAPPING_INTERNAL_PORT_NOT_PROVIDED) + } + + const msPorts = await MicroservicePortManager.findOne({ + microserviceUuid: microservice.uuid, + portInternal: internalPort + }, transaction) + if (!msPorts) { + throw new Errors.NotFoundError('port mapping not exists') + } + + await _deletePortMapping(microservice, msPorts, transaction) +} + +async function deletePortMappings (microservice, transaction) { + const portMappings = await MicroservicePortManager.findAll({ microserviceUuid: microservice.uuid }, transaction) + for (const ports of portMappings) { + await _deletePortMapping(microservice, ports, transaction) + } +} + +async function getPortMappings (microserviceUuid, transaction) { + return MicroservicePortManager.findAll({ microserviceUuid }, transaction) +} + +module.exports = { + validatePortMappings, + validatePortMapping, + switchOnUpdateFlagsForMicroservicesForPortMapping, + createPortMapping, + listPortMappings, + deletePortMapping, + deleteSystemPortMapping, + deletePortMappings, + getPortMappings +} diff --git a/src/services/microservices-service.js b/src/services/microservices-service.js index 8a7257208..c98a918da 100644 --- a/src/services/microservices-service.js +++ b/src/services/microservices-service.js @@ -19,9 +19,10 @@ const MicroserviceCdiDevManager = require('../data/managers/microservice-cdi-dev const MicroserviceCapAddManager = require('../data/managers/microservice-cap-add-manager') const MicroserviceCapDropManager = require('../data/managers/microservice-cap-drop-manager') const MicroserviceEnvManager = require('../data/managers/microservice-env-manager') -const MicroservicePortService = require('../services/microservice-ports/default') +const MicroservicePortService = require('../services/microservice-ports/microservice-port') const CatalogItemImageManager = require('../data/managers/catalog-item-image-manager') const RegistryManager = require('../data/managers/registry-manager') +// const RouterManager = require('../data/managers/router-manager') const MicroserviceStates = require('../enums/microservice-state') const VolumeMappingManager = require('../data/managers/volume-mapping-manager') const ChangeTrackingService = require('./change-tracking-service') @@ -33,6 +34,11 @@ const ApplicationManager = require('../data/managers/application-manager') const CatalogService = require('../services/catalog-service') const RoutingManager = require('../data/managers/routing-manager') const RoutingService = require('../services/routing-service') +const ServiceManager = require('../data/managers/service-manager') +const ServiceServices = require('./services-service') +const ConfigMapManager = require('../data/managers/config-map-manager') +const SecretManager = require('../data/managers/secret-manager') + const Op = require('sequelize').Op const FogManager = require('../data/managers/iofog-manager') const MicroserviceExtraHostManager = require('../data/managers/microservice-extra-host-manager') @@ -130,7 +136,7 @@ function _validateImagesAgainstCatalog (catalogItem, images) { } } -async function _validateLocalAppHostTemplate (extraHost, templateArgs, msvc, transaction) { +async function _validateLocalAppHostTemplate (extraHost, templateArgs, msvc, fogUuid, transaction) { if (templateArgs.length !== 4) { throw new Errors.ValidationError(AppHelper.formatMessage(ErrorMessages.INVALID_HOST_TEMPLATE, templateArgs.join('.'))) } @@ -138,13 +144,17 @@ async function _validateLocalAppHostTemplate (extraHost, templateArgs, msvc, tra if (!fog) { throw new Errors.ValidationError(AppHelper.formatMessage(ErrorMessages.NOT_FOUND_HOST_TEMPLATE, templateArgs[2])) } + if (fogUuid !== fog.uuid) { + throw new Errors.ValidationError(AppHelper.formatMessage(ErrorMessages.NOT_FOUND_APPS_TEMPLATE, msvc.name)) + } + extraHost.targetFogUuid = fog.uuid - extraHost.value = fog.host || fog.ipAddress + extraHost.value = `iofog_${msvc.uuid}` return extraHost } -async function _validateAppHostTemplate (extraHost, templateArgs, transaction) { +async function _validateAppHostTemplate (extraHost, templateArgs, fogUuid, transaction) { if (templateArgs.length < 4) { throw new Errors.ValidationError(AppHelper.formatMessage(ErrorMessages.INVALID_HOST_TEMPLATE, templateArgs.join('.'))) } @@ -158,11 +168,8 @@ async function _validateAppHostTemplate (extraHost, templateArgs, transaction) { } extraHost.templateType = 'Apps' extraHost.targetMicroserviceUuid = msvc.uuid - if (templateArgs[3] === 'public') { - return MicroservicePortService.validatePublicPortAppHostTemplate(extraHost, templateArgs, msvc, transaction) - } if (templateArgs[3] === 'local') { - return _validateLocalAppHostTemplate(extraHost, templateArgs, msvc, transaction) + return _validateLocalAppHostTemplate(extraHost, templateArgs, msvc, fogUuid, transaction) } throw new Errors.ValidationError(AppHelper.formatMessage(ErrorMessages.INVALID_HOST_TEMPLATE, templateArgs.join('.'))) } @@ -183,7 +190,10 @@ async function _validateAgentHostTemplate (extraHost, templateArgs, transaction) return extraHost } -async function _validateExtraHost (extraHostData, transaction) { +async function _validateExtraHost (extraHostData, fogUuid, transaction) { + if (extraHostData.name === 'service.local') { + throw new Errors.ValidationError(AppHelper.formatMessage(ErrorMessages.INVALID_HOST_TEMPLATE, 'Extra Host name cannot be service.local')) + } const extraHost = { templateType: 'Litteral', name: extraHostData.name, @@ -197,20 +207,20 @@ async function _validateExtraHost (extraHostData, transaction) { const templateArgs = template.split('.') extraHost.templateType = templateArgs[0] if (templateArgs[0] === 'Apps') { - return _validateAppHostTemplate(extraHost, templateArgs, transaction) + return _validateAppHostTemplate(extraHost, templateArgs, fogUuid, transaction) } else if (templateArgs[0] === 'Agents') { return _validateAgentHostTemplate(extraHost, templateArgs, transaction) } throw new Errors.ValidationError(AppHelper.formatMessage(ErrorMessages.INVALID_HOST_TEMPLATE, template)) } -async function _validateExtraHosts (microserviceData, transaction) { +async function _validateExtraHosts (microserviceData, fogUuid, transaction) { if (!microserviceData.extraHosts || microserviceData.extraHosts.length === 0) { return [] } const extraHosts = [] for (const extraHost of microserviceData.extraHosts) { - extraHosts.push(await _validateExtraHost(extraHost, transaction)) + extraHosts.push(await _validateExtraHost(extraHost, fogUuid, transaction)) } return extraHosts } @@ -270,7 +280,7 @@ async function createMicroserviceEndPoint (microserviceData, isCLI, transaction) } // validate extraHosts - const extraHosts = await _validateExtraHosts(microserviceData, transaction) + const extraHosts = await _validateExtraHosts(microserviceData, fog.uuid, transaction) await MicroservicePortService.validatePortMappings(microserviceData, transaction) @@ -282,26 +292,27 @@ async function createMicroserviceEndPoint (microserviceData, isCLI, transaction) await _createMicroserviceImages(microservice, microserviceData.images, transaction) } - const publicPorts = [] - const proxyPorts = [] + // const publicPorts = [] + // const proxyPorts = [] if (microserviceData.ports) { for (const mapping of microserviceData.ports) { - const res = await MicroservicePortService.createPortMapping(microservice, mapping, transaction) - if (res) { - if (res.publicLinks) { - publicPorts.push({ - internal: mapping.internal, - external: mapping.external, - publicLinks: res.publicLinks - }) - } else if (res.proxy) { - proxyPorts.push({ - internal: mapping.internal, - external: mapping.external, - proxy: res.proxy - }) - } - } + // const res = await MicroservicePortService.createPortMapping(microservice, mapping, transaction) + await MicroservicePortService.createPortMapping(microservice, mapping, transaction) + // if (res) { + // if (res.publicLinks) { + // publicPorts.push({ + // internal: mapping.internal, + // external: mapping.external, + // publicLinks: res.publicLinks + // }) + // } else if (res.proxy) { + // proxyPorts.push({ + // internal: mapping.internal, + // external: mapping.external, + // proxy: res.proxy + // }) + // } + // } } } @@ -379,12 +390,12 @@ async function createMicroserviceEndPoint (microserviceData, isCLI, transaction) uuid: microservice.uuid, name: microservice.name } - if (publicPorts.length) { - res.publicPorts = publicPorts - } - if (proxyPorts.length) { - res.proxies = proxyPorts - } + // if (publicPorts.length) { + // res.publicPorts = publicPorts + // } + // if (proxyPorts.length) { + // res.proxies = proxyPorts + // } return res } @@ -416,11 +427,15 @@ async function _updateRelatedExtraHostTargetFog (extraHost, newFogUuid, transact async function _updateRelatedExtraHosts (updatedMicroservice, transaction) { const extraHosts = await MicroserviceExtraHostManager.findAll({ targetMicroserviceUuid: updatedMicroservice.uuid }, transaction) for (const extraHost of extraHosts) { - if (!extraHost.publicPort) { - // Local port, update target fog and host if microservice moved - if (extraHost.targetFogUuid !== updatedMicroservice.iofogUuid) { - await _updateRelatedExtraHostTargetFog(extraHost, updatedMicroservice.iofogUuid, transaction) - } + // if (!extraHost.publicPort) { + // // Local port, update target fog and host if microservice moved + // if (extraHost.targetFogUuid !== updatedMicroservice.iofogUuid) { + // await _updateRelatedExtraHostTargetFog(extraHost, updatedMicroservice.iofogUuid, transaction) + // } + // } + // Local port, update target fog and host if microservice moved + if (extraHost.targetFogUuid !== updatedMicroservice.iofogUuid) { + await _updateRelatedExtraHostTargetFog(extraHost, updatedMicroservice.iofogUuid, transaction) } } } @@ -436,14 +451,15 @@ async function updateSystemMicroserviceEndPoint (microserviceUuid, microserviceD uuid: microserviceUuid } + const newFog = await _findFog(microserviceData, isCLI, transaction) || {} // validate extraHosts - const extraHosts = microserviceData.extraHosts ? await _validateExtraHosts(microserviceData, transaction) : null + const extraHosts = microserviceData.extraHosts ? await _validateExtraHosts(microserviceData, newFog.uuid, transaction) : null const config = _validateMicroserviceConfig(microserviceData.config) const annotations = _validateMicroserviceAnnotations(microserviceData.annotations) - const newFog = await _findFog(microserviceData, isCLI, transaction) || {} + // const newFog = await _findFog(microserviceData, isCLI, transaction) || {} const microserviceToUpdate = { name: microserviceData.name, config: config, @@ -453,6 +469,8 @@ async function updateSystemMicroserviceEndPoint (microserviceUuid, microserviceD rebuild: microserviceData.rebuild, iofogUuid: newFog.uuid, rootHostAccess: microserviceData.rootHostAccess, + pidMode: microserviceData.pidMode, + ipcMode: microserviceData.ipcMode, cdiDevices: microserviceData.cdiDevices, capAdd: microserviceData.capAdd, capDrop: microserviceData.capDrop, @@ -568,6 +586,8 @@ async function updateSystemMicroserviceEndPoint (microserviceUuid, microserviceD // Set rebuild flag if needed microserviceDataUpdate.rebuild = microserviceDataUpdate.rebuild || !!( (microserviceDataUpdate.rootHostAccess !== undefined && microservice.rootHostAccess !== microserviceDataUpdate.rootHostAccess) || + microserviceDataUpdate.pidMode || + microserviceDataUpdate.ipcMode || microserviceDataUpdate.env || microserviceDataUpdate.cmd || microserviceDataUpdate.cdiDevices || @@ -614,10 +634,6 @@ async function updateSystemMicroserviceEndPoint (microserviceUuid, microserviceD await _updateCapDrop(microserviceDataUpdate.capDrop, microserviceUuid, transaction) } - if (microserviceDataUpdate.iofogUuid && microserviceDataUpdate.iofogUuid !== microservice.iofogUuid) { - await MicroservicePortService.movePublicPortsToNewFog(updatedMicroservice, transaction) - } - if (needStatusReset) { const microserviceStatus = { status: MicroserviceStates.QUEUED, @@ -658,14 +674,15 @@ async function updateMicroserviceEndPoint (microserviceUuid, microserviceData, i uuid: microserviceUuid } + const newFog = await _findFog(microserviceData, isCLI, transaction) || {} // validate extraHosts - const extraHosts = microserviceData.extraHosts ? await _validateExtraHosts(microserviceData, transaction) : null + const extraHosts = microserviceData.extraHosts ? await _validateExtraHosts(microserviceData, newFog.uuid, transaction) : null const config = _validateMicroserviceConfig(microserviceData.config) const annotations = _validateMicroserviceAnnotations(microserviceData.annotations) - const newFog = await _findFog(microserviceData, isCLI, transaction) || {} + // const newFog = await _findFog(microserviceData, isCLI, transaction) || {} const microserviceToUpdate = { name: microserviceData.name, config: config, @@ -675,6 +692,8 @@ async function updateMicroserviceEndPoint (microserviceUuid, microserviceData, i rebuild: microserviceData.rebuild, iofogUuid: newFog.uuid, rootHostAccess: microserviceData.rootHostAccess, + pidMode: microserviceData.pidMode, + ipcMode: microserviceData.ipcMode, cdiDevices: microserviceData.cdiDevices, capAdd: microserviceData.capAdd, capDrop: microserviceData.capDrop, @@ -794,6 +813,8 @@ async function updateMicroserviceEndPoint (microserviceUuid, microserviceData, i // Set rebuild flag if needed microserviceDataUpdate.rebuild = microserviceDataUpdate.rebuild || !!( (microserviceDataUpdate.rootHostAccess !== undefined && microservice.rootHostAccess !== microserviceDataUpdate.rootHostAccess) || + microserviceDataUpdate.pidMode || + microserviceDataUpdate.ipcMode || microserviceDataUpdate.env || microserviceDataUpdate.cmd || microserviceDataUpdate.cdiDevices || @@ -839,9 +860,10 @@ async function updateMicroserviceEndPoint (microserviceUuid, microserviceData, i if (microserviceDataUpdate.capDrop) { await _updateCapDrop(microserviceDataUpdate.capDrop, microserviceUuid, transaction) } - - if (microserviceDataUpdate.iofogUuid && microserviceDataUpdate.iofogUuid !== microservice.iofogUuid) { - await MicroservicePortService.movePublicPortsToNewFog(updatedMicroservice, transaction) + // TODO: Implement moveServiceToNewFog + const existingService = await ServiceManager.findOne({ type: `microservice`, resource: microservice.uuid }, transaction) + if (microserviceDataUpdate.iofogUuid && microserviceDataUpdate.iofogUuid !== microservice.iofogUuid && existingService) { + await ServiceServices.moveMicroserviceTcpBridgeToNewFog(existingService, microserviceDataUpdate.iofogUuid, microservice.iofogUuid, transaction) } // Update tags @@ -990,6 +1012,11 @@ async function deleteMicroserviceEndPoint (microserviceUuid, microserviceData, i await deleteMicroserviceWithRoutesAndPortMappings(microservice, transaction) + const existingService = await ServiceManager.findOne({ type: `microservice`, resource: microservice.uuid }, transaction) + if (existingService) { + logger.info(`Deleting service ${existingService.name}`) + await ServiceServices.deleteServiceEndpoint(existingService.name, transaction) + } await _updateChangeTracking(false, microservice.iofogUuid, transaction) } @@ -1099,8 +1126,51 @@ async function _createEnv (microservice, envData, transaction) { microserviceUuid: microservice.uuid } + // Handle valueFromSecret + if (envData.valueFromSecret) { + const [secretName, dataKey] = envData.valueFromSecret.split('/') + if (!secretName || !dataKey) { + throw new Errors.ValidationError(AppHelper.formatMessage(ErrorMessages.INVALID_SECRET_REFERENCE, envData.valueFromSecret)) + } + const secret = await SecretManager.getSecret(secretName, transaction) + if (!secret) { + throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.SECRET_NOT_FOUND, secretName)) + } + if (!secret.data[dataKey]) { + throw new Errors.ValidationError(AppHelper.formatMessage(ErrorMessages.SECRET_KEY_NOT_FOUND, dataKey, secretName)) + } + // If it's a TLS secret, decode the base64 value + if (secret.type === 'tls') { + try { + msEnvData.value = Buffer.from(secret.data[dataKey], 'base64').toString('utf-8') + } catch (error) { + throw new Errors.ValidationError(AppHelper.formatMessage(ErrorMessages.INVALID_BASE64_VALUE, dataKey, secretName)) + } + } else { + msEnvData.value = secret.data[dataKey] + } + msEnvData.valueFromSecret = envData.valueFromSecret + } + + // Handle valueFromConfigMap + if (envData.valueFromConfigMap) { + const [configMapName, dataKey] = envData.valueFromConfigMap.split('/') + if (!configMapName || !dataKey) { + throw new Errors.ValidationError(AppHelper.formatMessage(ErrorMessages.INVALID_CONFIGMAP_REFERENCE, envData.valueFromConfigMap)) + } + const configMap = await ConfigMapManager.getConfigMap(configMapName, transaction) + if (!configMap) { + throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.CONFIGMAP_NOT_FOUND, configMapName)) + } + if (!configMap.data[dataKey]) { + throw new Errors.ValidationError(AppHelper.formatMessage(ErrorMessages.CONFIGMAP_KEY_NOT_FOUND, dataKey, configMapName)) + } + msEnvData.value = configMap.data[dataKey] + msEnvData.valueFromConfigMap = envData.valueFromConfigMap + } + await MicroserviceEnvManager.create(msEnvData, transaction) - await MicroservicePortService.switchOnUpdateFlagsForMicroservicesForPortMapping(microservice, false, transaction) + await MicroservicePortService.switchOnUpdateFlagsForMicroservicesForPortMapping(microservice, transaction) } async function _createArg (microservice, arg, transaction) { @@ -1114,7 +1184,7 @@ async function _createArg (microservice, arg, transaction) { } await MicroserviceArgManager.create(msArgData, transaction) - await MicroservicePortService.switchOnUpdateFlagsForMicroservicesForPortMapping(microservice, false, transaction) + await MicroservicePortService.switchOnUpdateFlagsForMicroservicesForPortMapping(microservice, transaction) } async function _createCdiDevices (microservice, cdiDevices, transaction) { @@ -1128,7 +1198,7 @@ async function _createCdiDevices (microservice, cdiDevices, transaction) { } await MicroserviceCdiDevManager.create(msCdiDevicesData, transaction) - await MicroservicePortService.switchOnUpdateFlagsForMicroservicesForPortMapping(microservice, false, transaction) + await MicroservicePortService.switchOnUpdateFlagsForMicroservicesForPortMapping(microservice, transaction) } async function _createCapAdd (microservice, capAdd, transaction) { @@ -1142,7 +1212,7 @@ async function _createCapAdd (microservice, capAdd, transaction) { } await MicroserviceCapAddManager.create(msCapAddData, transaction) - await MicroservicePortService.switchOnUpdateFlagsForMicroservicesForPortMapping(microservice, false, transaction) + await MicroservicePortService.switchOnUpdateFlagsForMicroservicesForPortMapping(microservice, transaction) } async function _createCapDrop (microservice, capDrop, transaction) { @@ -1156,7 +1226,7 @@ async function _createCapDrop (microservice, capDrop, transaction) { } await MicroserviceCapDropManager.create(msCapDropData, transaction) - await MicroservicePortService.switchOnUpdateFlagsForMicroservicesForPortMapping(microservice, false, transaction) + await MicroservicePortService.switchOnUpdateFlagsForMicroservicesForPortMapping(microservice, transaction) } async function deletePortMappingEndPoint (microserviceUuid, internalPort, isCLI, transaction) { @@ -1234,6 +1304,16 @@ async function isMicroserviceConsumer (microservice, transaction) { return false } +async function isMicroserviceRouter (microservice, transaction) { + if (microservice.name === `router-${microservice.iofogUuid.toLowerCase()}`) { + const app = await ApplicationManager.findOne({ id: microservice.applicationId }, transaction) + if (app.isSystem === true) { + return true + } + } + return false +} + async function createVolumeMappingEndPoint (microserviceUuid, volumeMappingData, isCLI, transaction) { await Validator.validate(volumeMappingData, Validator.schemas.volumeMappings) @@ -1388,13 +1468,15 @@ async function _createMicroservice (microserviceData, isCLI, transaction) { const annotations = _validateMicroserviceAnnotations(microserviceData.annotations) let newMicroservice = { - uuid: AppHelper.generateRandomString(32), + uuid: AppHelper.generateUUID(), name: microserviceData.name, config: config, annotations: annotations, catalogItemId: microserviceData.catalogItemId, iofogUuid: microserviceData.iofogUuid, rootHostAccess: microserviceData.rootHostAccess, + pidMode: microserviceData.pidMode, + ipcMode: microserviceData.ipcMode, cdiDevices: microserviceData.cdiDevices, capAdd: microserviceData.capAdd, capDrop: microserviceData.capDrop, @@ -1538,6 +1620,49 @@ async function _updateEnv (env, microserviceUuid, transaction) { value: envData.value } + // Handle valueFromSecret + if (envData.valueFromSecret) { + const [secretName, dataKey] = envData.valueFromSecret.split('/') + if (!secretName || !dataKey) { + throw new Errors.ValidationError(AppHelper.formatMessage(ErrorMessages.INVALID_SECRET_REFERENCE, envData.valueFromSecret)) + } + const secret = await SecretManager.getSecret(secretName, transaction) + if (!secret) { + throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.SECRET_NOT_FOUND, secretName)) + } + if (!secret.data[dataKey]) { + throw new Errors.ValidationError(AppHelper.formatMessage(ErrorMessages.SECRET_KEY_NOT_FOUND, dataKey, secretName)) + } + // If it's a TLS secret, decode the base64 value + if (secret.type === 'tls') { + try { + envObj.value = Buffer.from(secret.data[dataKey], 'base64').toString('utf-8') + } catch (error) { + throw new Errors.ValidationError(AppHelper.formatMessage(ErrorMessages.INVALID_BASE64_VALUE, dataKey, secretName)) + } + } else { + envObj.value = secret.data[dataKey] + } + envObj.valueFromSecret = envData.valueFromSecret + } + + // Handle valueFromConfigMap + if (envData.valueFromConfigMap) { + const [configMapName, dataKey] = envData.valueFromConfigMap.split('/') + if (!configMapName || !dataKey) { + throw new Errors.ValidationError(AppHelper.formatMessage(ErrorMessages.INVALID_CONFIGMAP_REFERENCE, envData.valueFromConfigMap)) + } + const configMap = await ConfigMapManager.getConfigMap(configMapName, transaction) + if (!configMap) { + throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.CONFIGMAP_NOT_FOUND, configMapName)) + } + if (!configMap.data[dataKey]) { + throw new Errors.ValidationError(AppHelper.formatMessage(ErrorMessages.CONFIGMAP_KEY_NOT_FOUND, dataKey, configMapName)) + } + envObj.value = configMap.data[dataKey] + envObj.valueFromConfigMap = envData.valueFromConfigMap + } + await MicroserviceEnvManager.create(envObj, transaction) } } @@ -1714,7 +1839,7 @@ async function _buildGetMicroserviceResponse (microservice, transaction) { res.ports = [] for (const pm of portMappings) { const mapping = { internal: pm.portInternal, external: pm.portExternal, protocol: pm.isUdp ? 'udp' : 'tcp' } - await MicroservicePortService.buildPublicPortMapping(pm, mapping, transaction) + // await MicroservicePortService.buildPublicPortMapping(pm, mapping, transaction) res.ports.push(mapping) } res.volumeMappings = volumeMappings.map((vm) => vm.dataValues) @@ -1742,10 +1867,6 @@ async function _buildGetMicroserviceResponse (microservice, transaction) { return res } -function listAllPublicPortsEndPoint (transaction) { - return MicroservicePortService.listAllPublicPorts(transaction) -} - async function listMicroserviceByPubTagEndPoint (pubTag, transaction) { const where = { delete: false, @@ -1780,6 +1901,85 @@ async function listMicroserviceBySubTagEndPoint (subTag, transaction) { } } +async function createExecEndPoint (microserviceUuid, transaction) { + const microservice = await MicroserviceManager.findOneWithCategory({ uuid: microserviceUuid }, transaction) + if (microservice.catalogItem && microservice.catalogItem.category === 'SYSTEM') { + throw new Errors.ValidationError(AppHelper.formatMessage(ErrorMessages.SYSTEM_MICROSERVICE_UPDATE, microserviceUuid)) + } + if (!microservice) { + throw new Errors.NotFoundError(ErrorMessages.INVALID_MICROSERVICE_USER) + } + + await MicroserviceManager.update({ uuid: microservice.uuid }, { execEnabled: true }, transaction) + await ChangeTrackingService.update(microservice.iofogUuid, ChangeTrackingService.events.microserviceExecSessions, transaction) + + const updatedMicroservice = await MicroserviceManager.findOneWithCategory({ uuid: microservice.uuid }, transaction) + + return { + uuid: microservice.uuid, + execEnabled: updatedMicroservice.execEnabled + } +} + +async function deleteExecEndPoint (microserviceUuid, transaction) { + const microservice = await MicroserviceManager.findOneWithCategory({ uuid: microserviceUuid }, transaction) + if (microservice.catalogItem && microservice.catalogItem.category === 'SYSTEM') { + throw new Errors.ValidationError(AppHelper.formatMessage(ErrorMessages.SYSTEM_MICROSERVICE_UPDATE, microserviceUuid)) + } + if (!microservice) { + throw new Errors.NotFoundError(ErrorMessages.INVALID_MICROSERVICE_USER) + } + + await MicroserviceManager.update({ uuid: microservice.uuid }, { execEnabled: false }, transaction) + await ChangeTrackingService.update(microservice.iofogUuid, ChangeTrackingService.events.microserviceExecSessions, transaction) + + const updatedMicroservice = await MicroserviceManager.findOneWithCategory({ uuid: microservice.uuid }, transaction) + + return { + uuid: microservice.uuid, + execEnabled: updatedMicroservice.execEnabled + } +} + +async function createSystemExecEndPoint (microserviceUuid, isCLI, transaction) { + const microservice = await MicroserviceManager.findOneWithCategory({ uuid: microserviceUuid }, transaction) + // if (microservice.catalogItem && microservice.catalogItem.category !== 'SYSTEM') { + // throw new Errors.ValidationError(AppHelper.formatMessage(ErrorMessages.SYSTEM_MICROSERVICE_UPDATE, microserviceUuid)) + // } + if (!microservice) { + throw new Errors.NotFoundError(ErrorMessages.INVALID_MICROSERVICE_USER) + } + await MicroserviceManager.update({ uuid: microservice.uuid }, { execEnabled: true }, transaction) + await ChangeTrackingService.update(microservice.iofogUuid, ChangeTrackingService.events.microserviceExecSessions, transaction) + + const updatedMicroservice = await MicroserviceManager.findOneWithCategory({ uuid: microservice.uuid }, transaction) + + return { + uuid: microservice.uuid, + execEnabled: updatedMicroservice.execEnabled + } +} + +async function deleteSystemExecEndPoint (microserviceUuid, isCLI, transaction) { + const microservice = await MicroserviceManager.findOneWithCategory({ uuid: microserviceUuid }, transaction) + // if (microservice.catalogItem && microservice.catalogItem.category !== 'SYSTEM') { + // throw new Errors.ValidationError(AppHelper.formatMessage(ErrorMessages.SYSTEM_MICROSERVICE_UPDATE, microserviceUuid)) + // } + if (!microservice) { + throw new Errors.NotFoundError(ErrorMessages.INVALID_MICROSERVICE_USER) + } + + await MicroserviceManager.update({ uuid: microservice.uuid }, { execEnabled: false }, transaction) + await ChangeTrackingService.update(microservice.iofogUuid, ChangeTrackingService.events.microserviceExecSessions, transaction) + + const updatedMicroservice = await MicroserviceManager.findOneWithCategory({ uuid: microservice.uuid }, transaction) + + return { + uuid: microservice.uuid, + execEnabled: updatedMicroservice.execEnabled + } +} + module.exports = { createMicroserviceEndPoint: TransactionDecorator.generateTransaction(createMicroserviceEndPoint), createPortMappingEndPoint: TransactionDecorator.generateTransaction(createPortMappingEndPoint), @@ -1798,7 +1998,7 @@ module.exports = { getMicroserviceEndPoint: TransactionDecorator.generateTransaction(getMicroserviceEndPoint), getReceiverMicroservices, isMicroserviceConsumer, - listAllPublicPortsEndPoint: TransactionDecorator.generateTransaction(listAllPublicPortsEndPoint), + isMicroserviceRouter, listMicroservicePortMappingsEndPoint: TransactionDecorator.generateTransaction(listPortMappingsEndPoint), listMicroservicesEndPoint: TransactionDecorator.generateTransaction(listMicroservicesEndPoint), listVolumeMappingsEndPoint: TransactionDecorator.generateTransaction(listVolumeMappingsEndPoint), @@ -1809,5 +2009,9 @@ module.exports = { buildGetMicroserviceResponse: _buildGetMicroserviceResponse, updateChangeTracking: _updateChangeTracking, listMicroserviceByPubTagEndPoint: TransactionDecorator.generateTransaction(listMicroserviceByPubTagEndPoint), - listMicroserviceBySubTagEndPoint: TransactionDecorator.generateTransaction(listMicroserviceBySubTagEndPoint) + listMicroserviceBySubTagEndPoint: TransactionDecorator.generateTransaction(listMicroserviceBySubTagEndPoint), + createExecEndPoint: TransactionDecorator.generateTransaction(createExecEndPoint), + deleteExecEndPoint: TransactionDecorator.generateTransaction(deleteExecEndPoint), + createSystemExecEndPoint: TransactionDecorator.generateTransaction(createSystemExecEndPoint), + deleteSystemExecEndPoint: TransactionDecorator.generateTransaction(deleteSystemExecEndPoint) } diff --git a/src/services/router-service.js b/src/services/router-service.js index e1d4821cd..8d9569bf9 100644 --- a/src/services/router-service.js +++ b/src/services/router-service.js @@ -76,7 +76,7 @@ async function createRouterForFog (fogData, uuid, upstreamRouters, transaction) const router = await RouterManager.create(routerData, transaction) - const microserviceConfig = await _getRouterMicroserviceConfig(isEdge, uuid, messagingPort, router.interRouterPort, router.edgeRouterPort, transaction) + const microserviceConfig = await _getRouterMicroserviceConfig(isEdge, uuid, messagingPort, router.interRouterPort, router.edgeRouterPort, fogData.containerEngine, transaction) for (const upstreamRouter of upstreamRouters) { await RouterConnectionManager.create({ sourceRouter: router.id, destRouter: upstreamRouter.id }, transaction) @@ -94,7 +94,7 @@ async function createRouterForFog (fogData, uuid, upstreamRouters, transaction) return router } -async function updateRouter (oldRouter, newRouterData, upstreamRouters, transaction) { +async function updateRouter (oldRouter, newRouterData, upstreamRouters, containerEngine, transaction) { const routerCatalog = await CatalogService.getRouterCatalogItem(transaction) const routerMicroservice = await MicroserviceManager.findOne({ catalogItemId: routerCatalog.id, @@ -132,19 +132,19 @@ async function updateRouter (oldRouter, newRouterData, upstreamRouters, transact await RouterConnectionManager.bulkCreate(upstreamToCreate.map(router => ({ sourceRouter: oldRouter.id, destRouter: router.id })), transaction) // Update proxy microservice (If port or host changed) - const proxyCatalog = await CatalogService.getProxyCatalogItem(transaction) - const existingProxy = await MicroserviceManager.findOne({ iofogUuid: oldRouter.iofogUuid, catalogItemId: proxyCatalog.id }, transaction) - if (existingProxy) { - const config = JSON.parse(existingProxy.config || '{}') - config.networkRouter = { - host: newRouterData.host || oldRouter.host, - port: newRouterData.messagingPort - } - await MicroserviceManager.updateIfChanged({ uuid: existingProxy.uuid }, { config: JSON.stringify(config) }, transaction) - } + // const proxyCatalog = await CatalogService.getProxyCatalogItem(transaction) + // const existingProxy = await MicroserviceManager.findOne({ iofogUuid: oldRouter.iofogUuid, catalogItemId: proxyCatalog.id }, transaction) + // if (existingProxy) { + // const config = JSON.parse(existingProxy.config || '{}') + // config.networkRouter = { + // host: newRouterData.host || oldRouter.host, + // port: newRouterData.messagingPort + // } + // await MicroserviceManager.updateIfChanged({ uuid: existingProxy.uuid }, { config: JSON.stringify(config) }, transaction) + // } // Update config if needed - await updateConfig(oldRouter.id, transaction) + await updateConfig(oldRouter.id, containerEngine, transaction) await ChangeTrackingService.update(oldRouter.iofogUuid, ChangeTrackingService.events.routerChanged, transaction) await ChangeTrackingService.update(oldRouter.iofogUuid, ChangeTrackingService.events.microserviceList, transaction) await ChangeTrackingService.update(oldRouter.iofogUuid, ChangeTrackingService.events.microserviceConfig, transaction) @@ -171,7 +171,7 @@ async function _updateRouterPorts (routerMicroserviceUuid, router, transaction) } } -async function updateConfig (routerID, transaction) { +async function updateConfig (routerID, containerEngine, transaction) { const router = await RouterManager.findOne({ id: routerID }, transaction) if (!router) { throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.INVALID_ROUTER, routerID)) @@ -197,6 +197,7 @@ async function updateConfig (routerID, transaction) { router.messagingPort, router.interRouterPort, router.edgeRouterPort, + containerEngine, transaction ) @@ -252,12 +253,22 @@ async function updateConfig (routerID, transaction) { } function _listenersChanged (currentListeners, newListeners) { - if (currentListeners.length !== newListeners.length) { + if (!currentListeners || !newListeners) { return true } - for (const listener of currentListeners) { - if (newListeners.findIndex(l => l.port === listener.port) === -1) { + // Convert to arrays if they're objects + const currentArray = Object.values(currentListeners) + const newArray = Object.values(newListeners) + + if (currentArray.length !== newArray.length) { + return true + } + + // Compare only port property + for (const currentListener of currentArray) { + const matchingListener = newArray.find(l => l.port === currentListener.port) + if (!matchingListener) { return true } } @@ -272,7 +283,7 @@ function _createRouterPorts (routerMicroserviceUuid, port, transaction) { } const mappingData = { - isPublic: false, + // isPublic: false, portInternal: port, portExternal: port, microserviceUuid: routerMicroserviceUuid @@ -290,7 +301,7 @@ async function _createRouterMicroservice (isEdge, uuid, microserviceConfig, tran isSystem: true } const routerMicroserviceData = { - uuid: AppHelper.generateRandomString(32), + uuid: AppHelper.generateUUID(), name: `router-${uuid.toLowerCase()}`, config: JSON.stringify(microserviceConfig), catalogItemId: routerCatalog.id, @@ -354,7 +365,16 @@ function _getRouterConnectorConfig (isEdge, dest, uuid) { return config } -async function _getRouterMicroserviceConfig (isEdge, uuid, messagingPort, interRouterPort, edgeRouterPort, transaction) { +async function _getRouterMicroserviceConfig (isEdge, uuid, messagingPort, interRouterPort, edgeRouterPort, containerEngine, transaction) { + let platform = 'docker' + if (containerEngine === 'podman') { + platform = 'podman' + } + + let namespace = SITE_CONFIG_NAMESPACE + if (process.env.CONTROLLER_NAMESPACE) { + namespace = process.env.CONTROLLER_NAMESPACE + } const config = { addresses: { mc: { @@ -381,8 +401,8 @@ async function _getRouterMicroserviceConfig (isEdge, uuid, messagingPort, interR }, siteConfig: { name: uuid, - namespace: SITE_CONFIG_NAMESPACE, - platform: 'docker', + namespace: namespace, + platform: platform, version: SITE_CONFIG_VERSION }, sslProfiles: {} diff --git a/src/services/secret-service.js b/src/services/secret-service.js index 160847028..a51e11a6f 100644 --- a/src/services/secret-service.js +++ b/src/services/secret-service.js @@ -17,6 +17,8 @@ const AppHelper = require('../helpers/app-helper') const Errors = require('../helpers/errors') const ErrorMessages = require('../helpers/error-messages') const Validator = require('../schemas/index') +const VolumeMountService = require('./volume-mount-service') +const VolumeMountingManager = require('../data/managers/volume-mounting-manager') function validateBase64 (value) { try { @@ -79,6 +81,7 @@ async function updateSecretEndpoint (secretName, secretData, transaction) { validateSecretData(existingSecret.type, secretData.data) const secret = await SecretManager.updateSecret(secretName, secretData.data, transaction) + await _updateChangeTrackingForFogs(secretName, transaction) return { id: secret.id, name: secret.name, @@ -127,6 +130,19 @@ async function deleteSecretEndpoint (secretName, transaction) { return {} } +async function _updateChangeTrackingForFogs (secretName, transaction) { + const secretVolumeMounts = await VolumeMountingManager.findAll({ secretName: secretName }, transaction) + if (secretVolumeMounts.length > 0) { + for (const secretVolumeMount of secretVolumeMounts) { + const volumeMountObj = { + name: secretVolumeMount.name, + secretName: secretName + } + await VolumeMountService.updateVolumeMountEndpoint(secretVolumeMount.name, volumeMountObj, transaction) + } + } +} + module.exports = { createSecretEndpoint: TransactionDecorator.generateTransaction(createSecretEndpoint), updateSecretEndpoint: TransactionDecorator.generateTransaction(updateSecretEndpoint), diff --git a/src/services/services-service.js b/src/services/services-service.js new file mode 100644 index 000000000..3518d3aa6 --- /dev/null +++ b/src/services/services-service.js @@ -0,0 +1,1209 @@ +/* + * ******************************************************************************* + * * Copyright (c) 2023 Datasance Teknoloji A.S. + * * + * * This program and the accompanying materials are made available under the + * * terms of the Eclipse Public License v. 2.0 which is available at + * * http://www.eclipse.org/legal/epl-2.0 + * * + * * SPDX-License-Identifier: EPL-2.0 + * ******************************************************************************* + * + */ + +const TransactionDecorator = require('../decorators/transaction-decorator') +const ServiceManager = require('../data/managers/service-manager') +const MicroserviceManager = require('../data/managers/microservice-manager') +const RouterManager = require('../data/managers/router-manager') +const RouterConnectionManager = require('../data/managers/router-connection-manager') +const K8sClient = require('../utils/k8s-client') +const AppHelper = require('../helpers/app-helper') +const config = require('../config') +const Errors = require('../helpers/errors') +const ErrorMessages = require('../helpers/error-messages') +const Validator = require('../schemas') +const logger = require('../logger') +const FogManager = require('../data/managers/iofog-manager') +const TagsManager = require('../data/managers/tags-manager') +const ChangeTrackingService = require('./change-tracking-service') +const ApplicationManager = require('../data/managers/application-manager') +// const { Op } = require('sequelize') + +const K8S_ROUTER_CONFIG_MAP = 'pot-router' +const SERVICE_ANNOTATION_TAG = 'service.datasance.com/tag' + +// Map service tags to string array +// Return plain JS object +function _mapTags (service) { + return service.tags ? service.tags.map(t => t.value) : [] +} + +async function _setTags (serviceModel, tagsArray, transaction) { + if (tagsArray) { + let tags = [] + for (const tag of tagsArray) { + let tagModel = await TagsManager.findOne({ value: tag }, transaction) + if (!tagModel) { + tagModel = await TagsManager.create({ value: tag }, transaction) + } + tags.push(tagModel) + } + await serviceModel.setTags(tags) + } +} + +async function handleServiceDistribution (serviceTags, transaction) { + // Always find fog nodes with 'all' tag + const allTaggedFogNodes = await FogManager.findAllWithTags({ + '$tags.value$': `${SERVICE_ANNOTATION_TAG}: all` + }, transaction) + + // If serviceTags is null or empty, return only fog nodes with 'all' tag + if (!serviceTags || serviceTags.length === 0) { + const uuids = allTaggedFogNodes.map(fog => fog.uuid) + return uuids + } + + // Filter tags that don't contain ':' or '=' + const filteredServiceTags = serviceTags + .filter(tag => tag != null) + .map(tag => String(tag)) + .filter(tag => !tag.includes(':') && !tag.includes('=')) + .filter(tag => tag.length > 0) + + if (filteredServiceTags.length === 0) { + const uuids = allTaggedFogNodes.map(fog => fog.uuid) + return uuids + } + + // Find fog nodes for each filtered tag + const specificTaggedFogNodes = new Set() + for (const tag of filteredServiceTags) { + const fogNodes = await FogManager.findAllWithTags({ + '$tags.value$': `${SERVICE_ANNOTATION_TAG}: ${tag}` + }, transaction) + fogNodes.forEach(fog => specificTaggedFogNodes.add(fog.uuid)) + } + + // Get all tag fog node UUIDs + const allTagUuids = allTaggedFogNodes.map(fog => fog.uuid) + + // Combine both sets of fog nodes and remove duplicates + const allFogUuids = new Set([...allTagUuids, ...Array.from(specificTaggedFogNodes)]) + + return Array.from(allFogUuids) +} + +async function checkKubernetesEnvironment () { + const controlPlane = process.env.CONTROL_PLANE || config.get('app.ControlPlane') + return controlPlane && controlPlane.toLowerCase() === 'kubernetes' +} + +async function validateNonK8sType (serviceConfig) { + const isK8s = await checkKubernetesEnvironment() + if (serviceConfig.type.toLowerCase() !== 'k8s' && isK8s) { + if (!serviceConfig.k8sType || !serviceConfig.servicePort) { + throw new Errors.ValidationError('Kubernetes environment is required for k8s service type(LoadBalancer or ClusterIP or NodePort) and service port') + } + } +} + +async function _validateServiceName (serviceConfig) { + if (serviceConfig.name.toLowerCase() === 'controller' || serviceConfig.name.toLowerCase() === 'router' || serviceConfig.name.toLowerCase() === 'router-internal' || serviceConfig.name.toLowerCase() === 'docker' || serviceConfig.name.toLowerCase() === 'podman' || serviceConfig.name.toLowerCase() === 'kubernetes') { + throw new Errors.ValidationError('Service name cannot be "controller" or "router" or "router-internal" or "docker"') + } +} + +async function validateMicroserviceType (serviceConfig, transaction) { + if (serviceConfig.type.toLowerCase() !== 'microservice') { + return + } + + let microserviceUuid = serviceConfig.resource + + // If resource contains "/", it means user provided "/" + if (serviceConfig.resource.includes('/')) { + const [appName, microserviceName] = serviceConfig.resource.split('/') + const app = await ApplicationManager.findOne({ name: appName }, transaction) + if (!app) { + throw new Errors.ValidationError(AppHelper.formatMessage(ErrorMessages.INVALID_APPLICATION_NAME, appName)) + } + const microservice = await MicroserviceManager.findOne({ + name: microserviceName, + applicationId: app.id + }, transaction) + + if (!microservice) { + throw new Errors.ValidationError(AppHelper.formatMessage(ErrorMessages.INVALID_MICROSERVICE_NAME, serviceConfig.resource)) + } + + microserviceUuid = microservice.uuid + } else { + // User provided UUID directly, validate if microservice exists + const microservice = await MicroserviceManager.findOne({ uuid: serviceConfig.resource }, transaction) + if (!microservice) { + throw new Errors.ValidationError(AppHelper.formatMessage(ErrorMessages.INVALID_MICROSERVICE_UUID, serviceConfig.resource)) + } + } + + // Update resource to be the microservice UUID + serviceConfig.resource = microserviceUuid +} + +async function validateFogServiceType (serviceConfig, transaction) { + if (serviceConfig.type.toLowerCase() !== 'agent') { + return + } + + // First try to find fog node by name + let fogNode = await FogManager.findOne({ name: serviceConfig.resource }, transaction) + + // If not found by name, try to find by UUID + if (!fogNode) { + fogNode = await FogManager.findOne({ uuid: serviceConfig.resource }, transaction) + } + + // If still not found, throw error + if (!fogNode) { + throw new Errors.ValidationError(AppHelper.formatMessage(ErrorMessages.INVALID_IOFOG_UUID, serviceConfig.resource)) + } + + // Always set resource to be the fog node UUID + serviceConfig.resource = fogNode.uuid +} + +async function validateDefaultBridge (serviceConfig, transaction) { + // If defaultBridge is empty, set it to 'default-router' + if (!serviceConfig.defaultBridge) { + logger.debug('Setting default bridge to default-router') + serviceConfig.defaultBridge = 'default-router' + return + } + + // If service type is not microservice or agent, defaultBridge must be 'default-router' + if (serviceConfig.type.toLowerCase() !== 'microservice' && serviceConfig.type.toLowerCase() !== 'agent') { + if (serviceConfig.defaultBridge !== 'default-router') { + throw new Errors.ValidationError(AppHelper.formatMessage(ErrorMessages.INVALID_DEFAULT_BRIDGE, serviceConfig.defaultBridge)) + } + return + } + + // For microservice or agent type, if user provided a UUID instead of 'default-router' + if (serviceConfig.defaultBridge !== 'default-router') { + let iofogUuid + + if (serviceConfig.type.toLowerCase() === 'microservice') { + // Get the microservice to find its iofog node + const microservice = await MicroserviceManager.findOne({ uuid: serviceConfig.resource }, transaction) + if (!microservice) { + throw new Errors.ValidationError(AppHelper.formatMessage(ErrorMessages.INVALID_MICROSERVICE_UUID, serviceConfig.resource)) + } + iofogUuid = microservice.iofogUuid + } else if (serviceConfig.type.toLowerCase() === 'agent') { + // For agent type, the resource is the agent UUID + iofogUuid = serviceConfig.resource + } + + // Get the router for the iofog node + const router = await RouterManager.findOne({ iofogUuid: iofogUuid }, transaction) + if (!router) { + throw new Errors.ValidationError(AppHelper.formatMessage(ErrorMessages.INVALID_ROUTER, iofogUuid)) + } + + // Check if the router has a connection to the specified upstream router + const upstreamRouter = await RouterManager.findOne({ iofogUuid: serviceConfig.defaultBridge }, transaction) + if (!upstreamRouter) { + throw new Errors.ValidationError(AppHelper.formatMessage(ErrorMessages.INVALID_ROUTER, serviceConfig.defaultBridge)) + } + + const routerConnection = await RouterConnectionManager.findOne({ + sourceRouter: router.id, + destRouter: upstreamRouter.id + }, transaction) + + if (!routerConnection) { + throw new Errors.ValidationError(AppHelper.formatMessage(ErrorMessages.INVALID_ROUTER_CONNECTION, serviceConfig.defaultBridge, router.id)) + } + } +} + +async function defineBridgePort (serviceConfig, transaction) { + // Get bridge port range from environment or config + const bridgePortRangeStr = process.env.BRIDGE_PORTS_RANGE || config.get('bridgePorts.range') || '10024-65535' + const [startStr, endStr] = bridgePortRangeStr.split('-') + const start = parseInt(startStr) + const end = parseInt(endStr) + + // Get all existing services to check used ports + const existingServices = await ServiceManager.findAll({}, transaction) + const usedPorts = new Set(existingServices.map(service => service.bridgePort)) + + // Find the first available port in the range + let bridgePort = start + while (bridgePort <= end) { + if (!usedPorts.has(bridgePort)) { + serviceConfig.bridgePort = bridgePort + return + } + bridgePort++ + } + + // If we get here, no ports are available + throw new Errors.ValidationError(AppHelper.formatMessage(ErrorMessages.NO_AVAILABLE_BRIDGE_PORT, bridgePortRangeStr)) +} + +// Helper function to determine host based on service type +async function _determineConnectorHost (serviceConfig, transaction) { + switch (serviceConfig.type.toLowerCase()) { + case 'microservice': + const microservice = await MicroserviceManager.findOne({ uuid: serviceConfig.resource }, transaction) + if (microservice.rootHostAccess) { + return 'iofog' + } else { + return `iofog_${serviceConfig.resource}` + } + case 'agent': + return 'iofog' + case 'k8s': + case 'external': + return serviceConfig.resource + default: + throw new Errors.ValidationError(`Invalid service type: ${serviceConfig.type}`) + } +} + +// Helper function to determine siteId for connector +async function _determineConnectorSiteId (serviceConfig, transaction) { + switch (serviceConfig.type.toLowerCase()) { + case 'microservice': { + const microservice = await MicroserviceManager.findOne({ uuid: serviceConfig.resource }, transaction) + if (!microservice) { + throw new Errors.NotFoundError(`Microservice not found: ${serviceConfig.resource}`) + } + return microservice.iofogUuid + } + case 'agent': + return serviceConfig.resource + case 'k8s': + case 'external': + return 'default-router' + default: + throw new Errors.ValidationError(`Invalid service type: ${serviceConfig.type}`) + } +} + +// Helper function to determine processId for connector +async function _determineConnectorProcessId (serviceConfig) { + switch (serviceConfig.type.toLowerCase()) { + case 'microservice': + return serviceConfig.resource + case 'agent': + return `${serviceConfig.resource}-local-${serviceConfig.targetPort}` + case 'k8s': + return `${serviceConfig.resource}-k8s-${serviceConfig.targetPort}` + case 'external': + return `${serviceConfig.resource}-external-${serviceConfig.targetPort}` + default: + throw new Errors.ValidationError(`Invalid service type: ${serviceConfig.type}`) + } +} + +// Helper function to build tcpConnector configuration +async function _buildTcpConnector (serviceConfig, transaction) { + const host = await _determineConnectorHost(serviceConfig, transaction) + const siteId = await _determineConnectorSiteId(serviceConfig, transaction) + const processId = await _determineConnectorProcessId(serviceConfig) + + return { + name: `${serviceConfig.name}-connector`, + host, + port: serviceConfig.targetPort.toString(), + address: serviceConfig.name, + siteId, + processId + } +} + +// Helper function to build tcpListener configuration +async function _buildTcpListener (serviceConfig, fogNodeUuid = null) { + const listener = { + name: `${serviceConfig.name}-listener`, + port: serviceConfig.bridgePort.toString(), + address: serviceConfig.name, + siteId: fogNodeUuid || serviceConfig.defaultBridge + } + return listener +} + +// Helper function to get router microservice by fog node UUID +async function _getRouterMicroservice (fogNodeUuid, transaction) { + const routerName = `router-${fogNodeUuid.toLowerCase()}` + const routerMicroservice = await MicroserviceManager.findOne({ name: routerName }, transaction) + if (!routerMicroservice) { + throw new Errors.NotFoundError(`Router microservice not found: ${routerName}`) + } + return routerMicroservice +} + +// Helper function to update router config in Kubernetes environment +async function _updateK8sRouterConfig (config) { + const configMap = await K8sClient.getConfigMap(K8S_ROUTER_CONFIG_MAP) + if (!configMap) { + throw new Errors.NotFoundError(`ConfigMap not found: ${K8S_ROUTER_CONFIG_MAP}`) + } + + const patchData = { + data: { + 'skrouterd.json': JSON.stringify(config) + } + } + + await K8sClient.patchConfigMap(K8S_ROUTER_CONFIG_MAP, patchData) +} + +// Helper function to update router microservice config +async function _updateRouterMicroserviceConfig (fogNodeUuid, config, transaction) { + const routerMicroservice = await _getRouterMicroservice(fogNodeUuid, transaction) + + // Update microservice with the provided config + await MicroserviceManager.update( + { uuid: routerMicroservice.uuid }, + { config: JSON.stringify(config) }, + transaction + ) + + // Update change tracking + await ChangeTrackingService.update(fogNodeUuid, ChangeTrackingService.events.microserviceConfig, transaction) +} + +// Helper function to add tcpConnector to router config +async function _addTcpConnector (serviceConfig, transaction) { + const isK8s = await checkKubernetesEnvironment() + const connector = await _buildTcpConnector(serviceConfig, transaction) + const siteId = connector.siteId + + if (siteId === 'default-router') { + if (isK8s) { + // Update K8s router config + logger.debug('Updating K8s router config') + const configMap = await K8sClient.getConfigMap(K8S_ROUTER_CONFIG_MAP) + if (!configMap) { + logger.error('ConfigMap not found:' + K8S_ROUTER_CONFIG_MAP) + throw new Errors.NotFoundError(`ConfigMap not found: ${K8S_ROUTER_CONFIG_MAP}`) + } + + const routerConfig = JSON.parse(configMap.data['skrouterd.json']) + // Add new connector to the array + routerConfig.push(['tcpConnector', connector]) + + await _updateK8sRouterConfig(routerConfig) + } else { + // Update default router microservice config + const defaultRouter = await RouterManager.findOne({ isDefault: true }, transaction) + if (!defaultRouter) { + logger.error('Default router not found') + throw new Errors.NotFoundError('Default router not found') + } + const fogNodeUuid = defaultRouter.iofogUuid + const routerMicroservice = await _getRouterMicroservice(fogNodeUuid, transaction) + const currentConfig = JSON.parse(routerMicroservice.config || '{}') + + if (!currentConfig.bridges) { + currentConfig.bridges = {} + } + if (!currentConfig.bridges.tcpConnectors) { + currentConfig.bridges.tcpConnectors = {} + } + currentConfig.bridges.tcpConnectors[connector.name] = connector + + await _updateRouterMicroserviceConfig(fogNodeUuid, currentConfig, transaction) + } + } else { + // Update specific router microservice config + const fogNodeUuid = siteId + const routerMicroservice = await _getRouterMicroservice(fogNodeUuid, transaction) + const currentConfig = JSON.parse(routerMicroservice.config || '{}') + + if (!currentConfig.bridges) { + currentConfig.bridges = {} + } + if (!currentConfig.bridges.tcpConnectors) { + currentConfig.bridges.tcpConnectors = {} + } + currentConfig.bridges.tcpConnectors[connector.name] = connector + + await _updateRouterMicroserviceConfig(fogNodeUuid, currentConfig, transaction) + } +} + +// Helper function to add tcpListener to router config +async function _addTcpListener (serviceConfig, transaction) { + const isK8s = await checkKubernetesEnvironment() + + // First handle K8s case if we're in K8s environment + if (isK8s) { + const k8sListener = await _buildTcpListener(serviceConfig, null) // null for K8s case + const configMap = await K8sClient.getConfigMap(K8S_ROUTER_CONFIG_MAP) + if (!configMap) { + logger.error('ConfigMap not found:' + K8S_ROUTER_CONFIG_MAP) + throw new Errors.NotFoundError(`ConfigMap not found: ${K8S_ROUTER_CONFIG_MAP}`) + } + + const routerConfig = JSON.parse(configMap.data['skrouterd.json']) + // Add new listener to the array + routerConfig.push(['tcpListener', k8sListener]) + + await _updateK8sRouterConfig(routerConfig) + } + + // Handle distributed router microservice cases + // Get list of fog nodes that need this listener + const fogNodeUuids = await handleServiceDistribution(serviceConfig.tags, transaction) + + // If not in K8s environment, always include default router + if (!isK8s) { + const defaultRouter = await RouterManager.findOne({ isDefault: true }, transaction) + if (!defaultRouter) { + logger.error('Default router not found') + throw new Errors.NotFoundError('Default router not found') + } + // Add default router if not already in the list + if (!fogNodeUuids.includes(defaultRouter.iofogUuid)) { + fogNodeUuids.push(defaultRouter.iofogUuid) + } + } + // else if (!fogNodeUuids || fogNodeUuids.length === 0) { + // // If in K8s and no fog nodes found, add default router + // const defaultRouter = await RouterManager.findOne({ isDefault: true }, transaction) + // if (!defaultRouter) { + // logger.error('Default router not found') + // throw new Errors.NotFoundError('Default router not found') + // } + // fogNodeUuids.push(defaultRouter.iofogUuid) + // } + + // Add listener to each router microservice + for (const fogNodeUuid of fogNodeUuids) { + try { + const listener = await _buildTcpListener(serviceConfig, fogNodeUuid) + const routerMicroservice = await _getRouterMicroservice(fogNodeUuid, transaction) + const currentConfig = JSON.parse(routerMicroservice.config || '{}') + if (!currentConfig.bridges) currentConfig.bridges = {} + if (!currentConfig.bridges.tcpListeners) currentConfig.bridges.tcpListeners = {} + currentConfig.bridges.tcpListeners[listener.name] = listener + await _updateRouterMicroserviceConfig(fogNodeUuid, currentConfig, transaction) + } catch (err) { + if (err instanceof Errors.NotFoundError) { + logger.info(`Router microservice not found for fogNodeUuid ${fogNodeUuid}, skipping.`) + continue + } + throw err + } + } +} + +// Helper function to update tcpConnector in router config +async function _updateTcpConnector (serviceConfig, transaction) { + const isK8s = await checkKubernetesEnvironment() + const connector = await _buildTcpConnector(serviceConfig, transaction) + const siteId = connector.siteId + + if (siteId === 'default-router') { + if (isK8s) { + // Update K8s router config + const configMap = await K8sClient.getConfigMap(K8S_ROUTER_CONFIG_MAP) + if (!configMap) { + throw new Errors.NotFoundError(`ConfigMap not found: ${K8S_ROUTER_CONFIG_MAP}`) + } + + const routerConfig = JSON.parse(configMap.data['skrouterd.json']) + // Find and update the existing connector + const connectorIndex = routerConfig.findIndex(item => + item[0] === 'tcpConnector' && item[1].name === connector.name + ) + if (connectorIndex !== -1) { + routerConfig[connectorIndex] = ['tcpConnector', connector] + } + + await _updateK8sRouterConfig(routerConfig) + } else { + // Update default router microservice config + const defaultRouter = await RouterManager.findOne({ isDefault: true }, transaction) + if (!defaultRouter) { + throw new Errors.NotFoundError('Default router not found') + } + const fogNodeUuid = defaultRouter.iofogUuid + const routerMicroservice = await _getRouterMicroservice(fogNodeUuid, transaction) + const currentConfig = JSON.parse(routerMicroservice.config || '{}') + + if (!currentConfig.bridges) { + currentConfig.bridges = {} + } + if (!currentConfig.bridges.tcpConnectors) { + currentConfig.bridges.tcpConnectors = {} + } + // Update the connector with the same name + currentConfig.bridges.tcpConnectors[connector.name] = connector + + await _updateRouterMicroserviceConfig(fogNodeUuid, currentConfig, transaction) + } + } else { + // Update specific router microservice config + const fogNodeUuid = siteId + const routerMicroservice = await _getRouterMicroservice(fogNodeUuid, transaction) + const currentConfig = JSON.parse(routerMicroservice.config || '{}') + + if (!currentConfig.bridges) { + currentConfig.bridges = {} + } + if (!currentConfig.bridges.tcpConnectors) { + currentConfig.bridges.tcpConnectors = {} + } + // Update the connector with the same name + currentConfig.bridges.tcpConnectors[connector.name] = connector + + await _updateRouterMicroserviceConfig(fogNodeUuid, currentConfig, transaction) + } +} + +// // Helper function to update tcpListener in router config +// async function _updateTcpListener (serviceConfig, transaction) { +// const isK8s = await checkKubernetesEnvironment() + +// // First handle K8s case if we're in K8s environment +// if (isK8s) { +// const k8sListener = await _buildTcpListener(serviceConfig, null) // null for K8s case +// const configMap = await K8sClient.getConfigMap(K8S_ROUTER_CONFIG_MAP) +// if (!configMap) { +// throw new Errors.NotFoundError(`ConfigMap not found: ${K8S_ROUTER_CONFIG_MAP}`) +// } + +// const routerConfig = JSON.parse(configMap.data['skrouterd.json']) +// // Update the listener in the array +// const listenerIndex = routerConfig.findIndex(item => +// item[0] === 'tcpListener' && item[1].name === k8sListener.name +// ) +// if (listenerIndex !== -1) { +// routerConfig[listenerIndex] = ['tcpListener', k8sListener] +// } else { +// routerConfig.push(['tcpListener', k8sListener]) +// } + +// await _updateK8sRouterConfig(routerConfig) +// } + +// // Handle distributed router microservice cases +// // Get list of fog nodes that need this listener +// const fogNodeUuids = await handleServiceDistribution(serviceConfig.tags, transaction) +// // If not in K8s environment, always include default router +// if (!isK8s) { +// const defaultRouter = await RouterManager.findOne({ isDefault: true }, transaction) +// if (!defaultRouter) { +// throw new Errors.NotFoundError('Default router not found') +// } +// // Add default router if not already in the list +// if (!fogNodeUuids.includes(defaultRouter.iofogUuid)) { +// fogNodeUuids.push(defaultRouter.iofogUuid) +// } +// } +// // else if (!fogNodeUuids || fogNodeUuids.length === 0) { +// // // If in K8s and no fog nodes found, add default router +// // const defaultRouter = await RouterManager.findOne({ isDefault: true }, transaction) +// // if (!defaultRouter) { +// // throw new Errors.NotFoundError('Default router not found') +// // } +// // fogNodeUuids.push(defaultRouter.iofogUuid) +// // } + +// // Update listener in each router microservice +// for (const fogNodeUuid of fogNodeUuids) { +// try { +// const listener = await _buildTcpListener(serviceConfig, fogNodeUuid) +// const routerMicroservice = await _getRouterMicroservice(fogNodeUuid, transaction) +// const currentConfig = JSON.parse(routerMicroservice.config || '{}') + +// if (!currentConfig.bridges) { +// currentConfig.bridges = {} +// } +// if (!currentConfig.bridges.tcpListeners) { +// currentConfig.bridges.tcpListeners = {} +// } +// // Update listener with its name as key +// currentConfig.bridges.tcpListeners[listener.name] = listener + +// await _updateRouterMicroserviceConfig(fogNodeUuid, currentConfig, transaction) +// } catch (err) { +// if (err instanceof Errors.NotFoundError) { +// logger.info(`Router microservice not found for fogNodeUuid ${fogNodeUuid}, skipping.`) +// continue +// } +// throw err +// } +// } +// } + +// Helper function to delete tcpConnector from router config +async function _deleteTcpConnector (serviceName, transaction) { + const isK8s = await checkKubernetesEnvironment() + const connectorName = `${serviceName}-connector` + + // Get service to determine if it's using default router + const service = await ServiceManager.findOne({ name: serviceName }, transaction) + if (!service) { + throw new Errors.NotFoundError(`Service not found: ${serviceName}`) + } + + const isDefaultRouter = service.defaultBridge === 'default-router' + let microserviceSource = null + if (service.type === 'microservice') { + microserviceSource = await MicroserviceManager.findOne({ uuid: service.resource }, transaction) + } + + if (isDefaultRouter && !microserviceSource) { + if (isK8s) { + // Update K8s router config + const configMap = await K8sClient.getConfigMap(K8S_ROUTER_CONFIG_MAP) + if (!configMap) { + throw new Errors.NotFoundError(`ConfigMap not found: ${K8S_ROUTER_CONFIG_MAP}`) + } + + const routerConfig = JSON.parse(configMap.data['skrouterd.json']) + // Remove the connector from the array + const updatedConfig = routerConfig.filter(item => + !(item[0] === 'tcpConnector' && item[1].name === connectorName) + ) + + await _updateK8sRouterConfig(updatedConfig) + } else { + // Update default router microservice config + const defaultRouter = await RouterManager.findOne({ isDefault: true }, transaction) + if (!defaultRouter) { + throw new Errors.NotFoundError('Default router not found') + } + const fogNodeUuid = defaultRouter.iofogUuid + const routerMicroservice = await _getRouterMicroservice(fogNodeUuid, transaction) + const currentConfig = JSON.parse(routerMicroservice.config || '{}') + + if (currentConfig.bridges && currentConfig.bridges.tcpConnectors) { + delete currentConfig.bridges.tcpConnectors[connectorName] + } + + await _updateRouterMicroserviceConfig(fogNodeUuid, currentConfig, transaction) + } + } else { + let fogNodeUuid = null + if (microserviceSource) { + fogNodeUuid = microserviceSource.iofogUuid + } else { + fogNodeUuid = service.defaultBridge // This is the actual fogNodeUuid for non-default router + } + const routerMicroservice = await _getRouterMicroservice(fogNodeUuid, transaction) + const currentConfig = JSON.parse(routerMicroservice.config || '{}') + + if (currentConfig.bridges && currentConfig.bridges.tcpConnectors) { + delete currentConfig.bridges.tcpConnectors[connectorName] + } + + await _updateRouterMicroserviceConfig(fogNodeUuid, currentConfig, transaction) + } +} + +// Helper function to delete tcpListener from router config +async function _deleteTcpListener (serviceName, transaction) { + const isK8s = await checkKubernetesEnvironment() + const listenerName = `${serviceName}-listener` + + // First handle K8s case if we're in K8s environment + if (isK8s) { + const configMap = await K8sClient.getConfigMap(K8S_ROUTER_CONFIG_MAP) + if (!configMap) { + throw new Errors.NotFoundError(`ConfigMap not found: ${K8S_ROUTER_CONFIG_MAP}`) + } + + const routerConfig = JSON.parse(configMap.data['skrouterd.json']) + // Remove the listener from the array + const updatedConfig = routerConfig.filter(item => + !(item[0] === 'tcpListener' && item[1].name === listenerName) + ) + + await _updateK8sRouterConfig(updatedConfig) + } + + // Get service to determine its tags for distribution + const service = await ServiceManager.findOneWithTags({ name: serviceName }, transaction) + if (!service) { + throw new Errors.NotFoundError(`Service not found: ${serviceName}`) + } + + let microserviceSource = null + if (service.type === 'microservice') { + microserviceSource = await MicroserviceManager.findOne({ uuid: service.resource }, transaction) + } + // Handle distributed router microservice cases + // Get list of fog nodes that need this listener removed + const serviceTags = service.tags.map(tag => tag.value) + const fogNodeUuids = await handleServiceDistribution(serviceTags, transaction) + + if (microserviceSource) { + if (!fogNodeUuids.includes(microserviceSource.iofogUuid)) { + fogNodeUuids.push(microserviceSource.iofogUuid) + } + } + // If not in K8s environment, always include default router + if (!isK8s) { + const defaultRouter = await RouterManager.findOne({ isDefault: true }, transaction) + if (!defaultRouter) { + throw new Errors.NotFoundError('Default router not found') + } + // Add default router if not already in the list + if (!fogNodeUuids.includes(defaultRouter.iofogUuid)) { + fogNodeUuids.push(defaultRouter.iofogUuid) + } + } + // else if (!fogNodeUuids || fogNodeUuids.length === 0) { + // // If in K8s and no fog nodes found, add default router + // const defaultRouter = await RouterManager.findOne({ isDefault: true }, transaction) + // if (!defaultRouter) { + // throw new Errors.NotFoundError('Default router not found') + // } + // fogNodeUuids.push(defaultRouter.iofogUuid) + // } + + // Remove listener from each router microservice + for (const fogNodeUuid of fogNodeUuids) { + try { + const routerMicroservice = await _getRouterMicroservice(fogNodeUuid, transaction) + const currentConfig = JSON.parse(routerMicroservice.config || '{}') + if (currentConfig.bridges && currentConfig.bridges.tcpListeners) { + delete currentConfig.bridges.tcpListeners[listenerName] + } + await _updateRouterMicroserviceConfig(fogNodeUuid, currentConfig, transaction) + } catch (err) { + if (err instanceof Errors.NotFoundError) { + logger.info(`Router microservice not found for fogNodeUuid ${fogNodeUuid}, skipping.`) + continue + } + throw err + } + } +} + +// Helper function to create Kubernetes service +async function _createK8sService (serviceConfig, transaction) { + const normalizedTags = serviceConfig.tags.map(tag => tag.includes(':') ? tag : `${tag}:`) + const serviceSpec = { + apiVersion: 'v1', + kind: 'Service', + metadata: { + name: serviceConfig.name, + annotations: normalizedTags.reduce((acc, tag) => { + const [key, value] = tag.split(':') + acc[key] = value || '' + return acc + }, {}) + }, + spec: { + type: serviceConfig.k8sType, + selector: { + application: 'interior-router', + name: 'router', + 'skupper.io/component': 'router' + }, + ports: [{ + port: parseInt(serviceConfig.bridgePort), + targetPort: parseInt(serviceConfig.servicePort), + protocol: 'TCP' + }] + } + } + + const service = await K8sClient.createService(serviceSpec) + + // If LoadBalancer type, wait for and set the external IP + if (serviceConfig.k8sType === 'LoadBalancer') { + const loadBalancerIP = await K8sClient.watchLoadBalancerIP(serviceConfig.name) + if (loadBalancerIP) { + await ServiceManager.update( + { name: serviceConfig.name }, + { serviceEndpoint: loadBalancerIP }, + transaction + ) + } + } + + return service +} + +// Helper function to update Kubernetes service +async function _updateK8sService (serviceConfig, transaction) { + const normalizedTags = serviceConfig.tags.map(tag => tag.includes(':') ? tag : `${tag}:`) + const patchData = { + metadata: { + annotations: normalizedTags.reduce((acc, tag) => { + const [key, value] = tag.split(':') + acc[key] = value || '' + return acc + }, {}) + }, + spec: { + type: serviceConfig.k8sType, + selector: { + application: 'interior-router', + name: 'router', + 'skupper.io/component': 'router' + }, + ports: [{ + port: parseInt(serviceConfig.bridgePort), + targetPort: parseInt(serviceConfig.servicePort), + protocol: 'TCP' + }] + } + } + + logger.debug(`Updating service: ${serviceConfig.name}`) + const service = await K8sClient.updateService(serviceConfig.name, patchData) + + // If LoadBalancer type, wait for and set the external IP + if (serviceConfig.k8sType === 'LoadBalancer') { + const loadBalancerIP = await K8sClient.watchLoadBalancerIP(serviceConfig.name) + if (loadBalancerIP) { + await ServiceManager.update( + { name: serviceConfig.name }, + { serviceEndpoint: loadBalancerIP }, + transaction + ) + } + } + + return service +} + +// Helper function to delete Kubernetes service +async function _deleteK8sService (serviceName) { + await K8sClient.deleteService(serviceName) +} + +// Create service endpoint +async function createServiceEndpoint (serviceData, transaction) { + logger.debug('Creating service with data:' + JSON.stringify(serviceData)) + + // 1. Validate from schemas validator + await Validator.validate(serviceData, Validator.schemas.serviceCreate) + await _validateServiceName(serviceData) + + // 2. Check K8s environment if type is k8s + const isK8s = await checkKubernetesEnvironment() + if (serviceData.type === 'k8s' && !isK8s) { + throw new Errors.ValidationError('Kubernetes environment is required for k8s service type') + } + + if (serviceData.type !== 'k8s' && isK8s) { + logger.debug('Validating non k8s service type') + await validateNonK8sType(serviceData) + } + + // 3. Validate microservice type + if (serviceData.type === 'microservice') { + await validateMicroserviceType(serviceData, transaction) + } + + // 4. Validate agent type + if (serviceData.type === 'agent') { + logger.debug('Validating agent service type') + await validateFogServiceType(serviceData, transaction) + } + + // 5. Validate default bridge + logger.debug('Validating default bridge') + await validateDefaultBridge(serviceData, transaction) + + logger.debug('Defining bridge port') + // 6. Define bridge port + await defineBridgePort(serviceData, transaction) + + // Set provisioning fields + serviceData.provisioningStatus = 'pending' + serviceData.provisioningError = null + + // 7. Create service in database first + logger.debug('Creating service in database') + const service = await ServiceManager.create(serviceData, transaction) + + // 8. Start background orchestration + setImmediate(async () => { + try { + // Set tags if provided + logger.debug('Setting tags (background)') + if (serviceData.tags && serviceData.tags.length > 0) { + await _setTags(service, serviceData.tags, transaction) + } + + // Add TCP connector + logger.debug('Adding TCP connector (background)') + await _addTcpConnector(serviceData, transaction) + + // Add TCP listener + logger.debug('Adding TCP listener (background)') + await _addTcpListener(serviceData, transaction) + + // Create K8s service if needed + if ((serviceData.type === 'microservice' || serviceData.type === 'agent' || serviceData.type === 'external') && isK8s) { + logger.debug('Creating K8s service (background)') + await _createK8sService(serviceData, transaction) + } + + // Update provisioning status to ready + await ServiceManager.update({ id: service.id }, { provisioningStatus: 'ready', provisioningError: null }, transaction) + } catch (err) { + logger.error('Background provisioning failed:', err) + // Update provisioning status to failed and set error message + await ServiceManager.update({ id: service.id }, { provisioningStatus: 'failed', provisioningError: err.message }, transaction) + } + }) + + // 9. Return service immediately + return service +} + +// Update service endpoint +async function updateServiceEndpoint (serviceName, serviceData, transaction) { + // 1. Validate from schemas validator + await Validator.validate(serviceData, Validator.schemas.serviceUpdate) + await _validateServiceName(serviceData) + + // 2. Get existing service + const existingService = await ServiceManager.findOneWithTags({ name: serviceName }, transaction) + if (!existingService) { + throw new Errors.NotFoundError(`Service with name ${serviceName} not found`) + } + + // 3. Check if service type is being changed + if (serviceData.type && serviceData.type !== existingService.type) { + throw new Errors.ValidationError('Changing service type is not allowed. Please delete the service and create a new one with the desired type.') + } + + // 4. Check K8s environment if type is k8s + const isK8s = await checkKubernetesEnvironment() + if (existingService.type === 'k8s' && !isK8s) { + throw new Errors.ValidationError('Kubernetes environment is required for k8s service type') + } + + if (serviceData.type !== 'k8s' && isK8s) { + logger.debug('Validating non k8s service type') + await validateNonK8sType(serviceData) + } + + // 5. Validate microservice type if needed + if (existingService.type === 'microservice') { + await validateMicroserviceType(serviceData, transaction) + } + + // 6. Validate agent type if needed + if (existingService.type === 'agent') { + await validateFogServiceType(serviceData, transaction) + } + + // 7. Validate default bridge if needed + if (serviceData.defaultBridge) { + await validateDefaultBridge(serviceData, transaction) + } + + serviceData.bridgePort = existingService.bridgePort + + // Set provisioning fields + serviceData.provisioningStatus = 'pending' + serviceData.provisioningError = null + + // 8. Update service in database + const updatedService = await ServiceManager.update( + { name: serviceName }, + serviceData, + transaction + ) + + // 9. Start background orchestration + setImmediate(async () => { + try { + // Update tags if provided + if (serviceData.tags) { + await _setTags(existingService, serviceData.tags, transaction) + } + + // Handle resource changes + if (serviceData.resource && + JSON.stringify(serviceData.resource) !== JSON.stringify(existingService.resource)) { + await _deleteTcpConnector(serviceName, transaction) + await _addTcpConnector(serviceData, transaction) + } else { + await _updateTcpConnector(serviceData, transaction) + // await _updateTcpListener(serviceData, transaction) + } + + // Update K8s service if needed + if ((existingService.type === 'microservice' || existingService.type === 'agent' || existingService.type === 'external') && isK8s) { + await _updateK8sService(serviceData, transaction) + } + + // Update provisioning status to ready + await ServiceManager.update( + { name: serviceName }, + { provisioningStatus: 'ready', provisioningError: null }, + transaction + ) + } catch (err) { + logger.error('Background provisioning failed (update):', err) + // Update provisioning status to failed and set error message + await ServiceManager.update( + { name: serviceName }, + { provisioningStatus: 'failed', provisioningError: err.message }, + transaction + ) + } + }) + + // 10. Return updated service immediately + return updatedService +} + +// Delete service endpoint +async function deleteServiceEndpoint (serviceName, transaction) { + // Get existing service + const existingService = await ServiceManager.findOne({ name: serviceName }, transaction) + if (!existingService) { + throw new Errors.NotFoundError(`Service with name ${serviceName} not found`) + } + + const isK8s = await checkKubernetesEnvironment() + + try { + // Delete TCP connector + await _deleteTcpConnector(serviceName, transaction) + + // Delete TCP listener + await _deleteTcpListener(serviceName, transaction) + + // Delete K8s service if needed + if (isK8s && existingService.type !== 'k8s') { + await _deleteK8sService(serviceName) + } + + // Finally delete the service from database + await ServiceManager.delete({ name: serviceName }, transaction) + + return { message: `Service ${serviceName} deleted successfully` } + } catch (error) { + logger.error('Error deleting service:', { + error: error.message, + stack: error.stack, + serviceName: serviceName, + serviceType: existingService.type + }) + + // Wrap the error in a proper error type if it's not already + if (!(error instanceof Errors.ValidationError) && + !(error instanceof Errors.NotFoundError) && + !(error instanceof Errors.TransactionError) && + !(error instanceof Errors.DuplicatePropertyError)) { + throw new Errors.ValidationError(`Failed to delete service: ${error.message}`) + } + throw error + } +} + +// List services endpoint +async function getServicesListEndpoint (transaction) { + const queryFogData = {} + const services = await ServiceManager.findAllWithTags(queryFogData, transaction) + return services.map(service => ({ + name: service.name, + type: service.type, + resource: service.resource, + defaultBridge: service.defaultBridge, + bridgePort: service.bridgePort, + targetPort: service.targetPort, + servicePort: service.servicePort, + k8sType: service.k8sType, + serviceEndpoint: service.serviceEndpoint, + tags: _mapTags(service), + provisioningStatus: service.provisioningStatus, + provisioningError: service.provisioningError + })) +} + +// Get service endpoint +async function getServiceEndpoint (serviceName, transaction) { + const queryFogData = { name: serviceName } + const service = await ServiceManager.findOneWithTags(queryFogData, transaction) + if (!service) { + throw new Errors.NotFoundError(`Service with name ${serviceName} not found`) + } + return { + name: service.name, + type: service.type, + resource: service.resource, + defaultBridge: service.defaultBridge, + bridgePort: service.bridgePort, + targetPort: service.targetPort, + servicePort: service.servicePort, + k8sType: service.k8sType, + serviceEndpoint: service.serviceEndpoint, + tags: _mapTags(service), + provisioningStatus: service.provisioningStatus, + provisioningError: service.provisioningError + } +} + +async function moveMicroserviceTcpBridgeToNewFog (service, newFogUuid, oldFogUuid, transaction) { + const listenerName = `${service.name}-listener` + const connectorName = `${service.name}-connector` + + const oldRouterMicroservice = await _getRouterMicroservice(oldFogUuid, transaction) + const oldRouterConfig = JSON.parse(oldRouterMicroservice.config || '{}') + const newRouterMicroservice = await _getRouterMicroservice(newFogUuid, transaction) + const newRouterConfig = JSON.parse(newRouterMicroservice.config || '{}') + + const connector = oldRouterConfig.bridges.tcpConnectors[connectorName] + const listener = oldRouterConfig.bridges.tcpListeners[listenerName] + + if (oldRouterConfig.bridges.tcpConnectors[connectorName]) { + delete oldRouterConfig.bridges.tcpConnectors[connectorName] + } + if (oldRouterConfig.bridges.tcpListeners[listenerName]) { + delete oldRouterConfig.bridges.tcpListeners[listenerName] + } + + if (!newRouterConfig.bridges) { + newRouterConfig.bridges = {} + } + if (!newRouterConfig.bridges.tcpConnectors) { + newRouterConfig.bridges.tcpConnectors = {} + } + + newRouterConfig.bridges.tcpConnectors[connectorName] = connector + newRouterConfig.bridges.tcpListeners[listenerName] = listener + + await _updateRouterMicroserviceConfig(oldFogUuid, oldRouterConfig, transaction) + await _updateRouterMicroserviceConfig(newFogUuid, newRouterConfig, transaction) +} + +module.exports = { + checkKubernetesEnvironment, + validateMicroserviceType: TransactionDecorator.generateTransaction(validateMicroserviceType), + validateNonK8sType, + _validateServiceName, + validateFogServiceType: TransactionDecorator.generateTransaction(validateFogServiceType), + validateDefaultBridge: TransactionDecorator.generateTransaction(validateDefaultBridge), + defineBridgePort: TransactionDecorator.generateTransaction(defineBridgePort), + handleServiceDistribution: TransactionDecorator.generateTransaction(handleServiceDistribution), + _mapTags, + _setTags: TransactionDecorator.generateTransaction(_setTags), + _createK8sService, + _updateK8sService, + _deleteK8sService, + createServiceEndpoint: TransactionDecorator.generateTransaction(createServiceEndpoint), + updateServiceEndpoint: TransactionDecorator.generateTransaction(updateServiceEndpoint), + deleteServiceEndpoint: TransactionDecorator.generateTransaction(deleteServiceEndpoint), + getServicesListEndpoint: TransactionDecorator.generateTransaction(getServicesListEndpoint), + getServiceEndpoint: TransactionDecorator.generateTransaction(getServiceEndpoint), + moveMicroserviceTcpBridgeToNewFog: TransactionDecorator.generateTransaction(moveMicroserviceTcpBridgeToNewFog) +} diff --git a/src/services/volume-mount-service.js b/src/services/volume-mount-service.js new file mode 100644 index 000000000..403afb1a5 --- /dev/null +++ b/src/services/volume-mount-service.js @@ -0,0 +1,196 @@ +const Errors = require('../helpers/errors') +const ErrorMessages = require('../helpers/error-messages') +const AppHelper = require('../helpers/app-helper') +const VolumeMountingManager = require('../data/managers/volume-mounting-manager') +const SecretManager = require('../data/managers/secret-manager') +const ConfigMapManager = require('../data/managers/config-map-manager') +const ChangeTrackingService = require('./change-tracking-service') +const FogManager = require('../data/managers/iofog-manager') +const TransactionDecorator = require('../decorators/transaction-decorator') +const Validator = require('../schemas') + +async function findVolumeMountedFogNodes (volumeMountName, transaction) { + const volumeMount = await VolumeMountingManager.findOne({ + name: volumeMountName + }, transaction) + + if (!volumeMount) { + throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.VOLUME_MOUNT_NOT_FOUND, volumeMountName)) + } + + const fogs = await volumeMount.getFogs({}, transaction) + return fogs.map(fog => fog.uuid) +} + +async function _updateChangeTrackingForFogs (fogUuids, transaction) { + for (const fogUuid of fogUuids) { + await ChangeTrackingService.update(fogUuid, ChangeTrackingService.events.volumeMounts, transaction) + } +} + +async function listVolumeMountsEndpoint (transaction) { + return VolumeMountingManager.findAll({}, transaction) +} + +async function getVolumeMountEndpoint (name, transaction) { + const volumeMount = await VolumeMountingManager.findOne({ + name: name + }, transaction) + + if (!volumeMount) { + throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.VOLUME_MOUNT_NOT_FOUND, name)) + } + + return volumeMount +} + +async function createVolumeMountEndpoint (data, transaction) { + await Validator.validate(data, Validator.schemas.volumeMountCreate) + // Validate that either secretName or configMapName is provided + if (!data.secretName && !data.configMapName) { + throw new Errors.ValidationError('Must specify either secretName or configMapName') + } + + // Validate that both are not provided + if (data.secretName && data.configMapName) { + throw new Errors.ValidationError('Cannot specify both secretName and configMapName') + } + + const existingVolumeMount = await VolumeMountingManager.findOne({ name: data.name }, transaction) + if (existingVolumeMount) { + throw new Errors.ValidationError(AppHelper.formatMessage(ErrorMessages.DUPLICATE_NAME, data.name)) + } + + // Check if secret/configMap exists + if (data.secretName) { + const secret = await SecretManager.getSecret(data.secretName, transaction) + if (!secret) { + throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.SECRET_NOT_FOUND, data.secretName)) + } + } + + if (data.configMapName) { + const configMap = await ConfigMapManager.getConfigMap(data.configMapName, transaction) + if (!configMap) { + throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.CONFIGMAP_NOT_FOUND, data.configMapName)) + } + } + const volumeMountObj = { + uuid: AppHelper.generateUUID(), + version: 1, + name: data.name, + configMapName: data.configMapName, + secretName: data.secretName + } + return VolumeMountingManager.create(volumeMountObj, transaction) +} + +async function updateVolumeMountEndpoint (name, data, transaction) { + await Validator.validate(data, Validator.schemas.volumeMountUpdate) + const volumeMount = await getVolumeMountEndpoint(name, transaction) + const existingVersion = volumeMount.version + + // Validate that either secretName or configMapName is provided + if (!data.secretName && !data.configMapName) { + throw new Errors.ValidationError('Must specify either secretName or configMapName') + } + + // Validate that both are not provided + if (data.secretName && data.configMapName) { + throw new Errors.ValidationError('Cannot specify both secretName and configMapName') + } + // Check if secret/configMap exists + if (data.secretName) { + const secret = await SecretManager.getSecret(data.secretName, transaction) + if (!secret) { + throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.SECRET_NOT_FOUND, data.secretName)) + } + } + + if (data.configMapName) { + const configMap = await ConfigMapManager.getConfigMap(data.configMapName, transaction) + if (!configMap) { + throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.CONFIGMAP_NOT_FOUND, data.configMapName)) + } + } + + // Get linked fog nodes before update + const linkedFogUuids = await findVolumeMountedFogNodes(name, transaction) + + // Update volume mount + const updatedVolumeMountObj = { + uuid: volumeMount.uuid, + version: existingVersion + 1, + name: volumeMount.name, + configMapName: data.configMapName, + secretName: data.secretName + } + await VolumeMountingManager.update({ name: name }, updatedVolumeMountObj, transaction) + + // Update change tracking for all linked fog nodes + await _updateChangeTrackingForFogs(linkedFogUuids, transaction) + + return getVolumeMountEndpoint(name, transaction) +} + +async function deleteVolumeMountEndpoint (name, transaction) { + // Get linked fog nodes before deletion + const linkedFogUuids = await findVolumeMountedFogNodes(name, transaction) + + // Delete volume mount + await VolumeMountingManager.delete({ name: name }, transaction) + + // Update change tracking for all linked fog nodes + await _updateChangeTrackingForFogs(linkedFogUuids, transaction) + + return {} +} + +async function linkVolumeMountEndpoint (name, fogUuids, transaction) { + await Validator.validate({ fogUuids }, Validator.schemas.volumeMountLink) + + const volumeMount = await getVolumeMountEndpoint(name, transaction) + + for (const fogUuid of fogUuids) { + const agent = await FogManager.findOne({ uuid: fogUuid }, transaction) + if (!agent) { + throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.NOT_FOUND_AGENT_NAME, fogUuid)) + } + await agent.addVolumeMount(volumeMount.uuid, transaction) + } + + // Update change tracking for all linked fog nodes + await _updateChangeTrackingForFogs(fogUuids, transaction) + + return getVolumeMountEndpoint(name, transaction) +} + +async function unlinkVolumeMountEndpoint (name, fogUuids, transaction) { + await Validator.validate({ fogUuids }, Validator.schemas.volumeMountUnlink) + + const volumeMount = await getVolumeMountEndpoint(name, transaction) + + for (const fogUuid of fogUuids) { + const agent = await FogManager.findOne({ uuid: fogUuid }, transaction) + if (!agent) { + throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.NOT_FOUND_AGENT_NAME, fogUuid)) + } + await agent.removeVolumeMount(volumeMount.uuid, transaction) + } + + // Update change tracking for all unlinked fog nodes + await _updateChangeTrackingForFogs(fogUuids, transaction) + + return {} +} + +module.exports = { + listVolumeMountsEndpoint: TransactionDecorator.generateTransaction(listVolumeMountsEndpoint), + getVolumeMountEndpoint: TransactionDecorator.generateTransaction(getVolumeMountEndpoint), + createVolumeMountEndpoint: TransactionDecorator.generateTransaction(createVolumeMountEndpoint), + updateVolumeMountEndpoint: TransactionDecorator.generateTransaction(updateVolumeMountEndpoint), + deleteVolumeMountEndpoint: TransactionDecorator.generateTransaction(deleteVolumeMountEndpoint), + linkVolumeMountEndpoint: TransactionDecorator.generateTransaction(linkVolumeMountEndpoint), + unlinkVolumeMountEndpoint: TransactionDecorator.generateTransaction(unlinkVolumeMountEndpoint), + findVolumeMountedFogNodes: TransactionDecorator.generateTransaction(findVolumeMountedFogNodes) +} diff --git a/src/services/yaml-parser-service.js b/src/services/yaml-parser-service.js index aa33472c5..b620450ce 100644 --- a/src/services/yaml-parser-service.js +++ b/src/services/yaml-parser-service.js @@ -53,7 +53,7 @@ async function parseSecretFile (fileContent, options = {}) { if (doc.kind !== 'Secret') { throw new Errors.ValidationError(`Invalid kind ${doc.kind}`) } - if (doc.metadata == null || doc.spec == null) { + if (doc.metadata == null || doc.type == null || doc.data == null) { throw new Errors.ValidationError('Invalid YAML format: missing metadata or spec') } @@ -65,15 +65,153 @@ async function parseSecretFile (fileContent, options = {}) { // For updates, we only need the data return { - data: doc.spec.data + data: doc.data + } + } + + // For creates, return full object + return { + name: lget(doc, 'metadata.name', undefined), + type: doc.spec.type, + data: doc.data + } + } catch (error) { + if (error instanceof Errors.ValidationError) { + throw error + } + throw new Errors.ValidationError(`Error parsing YAML: ${error.message}`) + } +} + +async function parseVolumeMountFile (fileContent, options = {}) { + try { + const doc = yaml.load(fileContent) + if (!doc || !doc.kind) { + throw new Errors.ValidationError(`Invalid YAML format: missing kind field`) + } + if (doc.kind !== 'VolumeMount') { + throw new Errors.ValidationError(`Invalid kind ${doc.kind}`) + } + if (doc.metadata == null || doc.spec == null) { + throw new Errors.ValidationError('Invalid YAML format: missing metadata or spec') + } + + // Validate that either secretName or configMapName is provided, but not both + if (doc.spec.secretName && doc.spec.configMapName) { + throw new Errors.ValidationError('Cannot specify both secretName and configMapName') + } + if (!doc.spec.secretName && !doc.spec.configMapName) { + throw new Errors.ValidationError('Must specify either secretName or configMapName') + } + + // If this is an update, validate that the name matches + if (options.isUpdate && options.volumeMountName) { + if (doc.metadata.name !== options.volumeMountName) { + throw new Errors.ValidationError(`VolumeMount name in YAML (${doc.metadata.name}) doesn't match endpoint path (${options.volumeMountName})`) + } + + return { + name: lget(doc, 'metadata.name', undefined), + secretName: doc.spec.secretName, + configMapName: doc.spec.configMapName + } + } + + // For creates, return full object + return { + name: lget(doc, 'metadata.name', undefined), + secretName: doc.spec.secretName, + configMapName: doc.spec.configMapName + } + } catch (error) { + if (error instanceof Errors.ValidationError) { + throw error + } + throw new Errors.ValidationError(`Error parsing YAML: ${error.message}`) + } +} + +async function parseConfigMapFile (fileContent, options = {}) { + try { + const doc = yaml.load(fileContent) + if (!doc || !doc.kind) { + throw new Errors.ValidationError(`Invalid YAML format: missing kind field`) + } + if (doc.kind !== 'ConfigMap') { + throw new Errors.ValidationError(`Invalid kind ${doc.kind}`) + } + if (doc.metadata == null || doc.data == null) { + throw new Errors.ValidationError('Invalid YAML format: missing metadata or spec') + } + + // If this is an update, validate that the name matches + if (options.isUpdate && options.configMapName) { + if (doc.metadata.name !== options.configMapName) { + throw new Errors.ValidationError(`ConfigMap name in YAML (${doc.metadata.name}) doesn't match endpoint path (${options.configMapName})`) + } + + // For updates, we only need the data + return { + data: doc.data + } + } + + // For creates, return full object + return { + name: lget(doc, 'metadata.name', undefined), + data: doc.data, + immutable: doc.spec.immutable + } + } catch (error) { + if (error instanceof Errors.ValidationError) { + throw error + } + throw new Errors.ValidationError(`Error parsing YAML: ${error.message}`) + } +} + +async function parseServiceFile (fileContent, options = {}) { + try { + const doc = yaml.load(fileContent) + if (!doc || !doc.kind) { + throw new Errors.ValidationError(`Invalid YAML format: missing kind field`) + } + if (doc.kind !== 'Service') { + throw new Errors.ValidationError(`Invalid kind ${doc.kind}`) + } + if (doc.metadata == null || doc.spec == null) { + throw new Errors.ValidationError('Invalid YAML format: missing metadata or spec') + } + + // If this is an update, validate that the name matches + if (options.isUpdate && options.serviceName) { + if (doc.metadata.name !== options.serviceName) { + throw new Errors.ValidationError(`Service name in YAML (${doc.metadata.name}) doesn't match endpoint path (${options.serviceName})`) + } + + // For updates, we only need the spec and tags fields + return { + name: lget(doc, 'metadata.name', undefined), + tags: lget(doc, 'metadata.tags', []), + type: doc.spec.type, + resource: doc.spec.resource, + targetPort: doc.spec.targetPort, + defaultBridge: doc.spec.defaultBridge, + servicePort: doc.spec.servicePort, + k8sType: doc.spec.k8sType } } // For creates, return full object return { name: lget(doc, 'metadata.name', undefined), + tags: lget(doc, 'metadata.tags', []), type: doc.spec.type, - data: doc.spec.data + resource: doc.spec.resource, + targetPort: doc.spec.targetPort, + defaultBridge: doc.spec.defaultBridge, + servicePort: doc.spec.servicePort, + k8sType: doc.spec.k8sType } } catch (error) { if (error instanceof Errors.ValidationError) { @@ -127,6 +265,9 @@ const parseMicroserviceYAML = async (microservice) => { agentName: lget(microservice, 'agent.name'), registryId, ...container, + rootHostAccess: lget(microservice, 'rootHostAccess', false), + pidMode: lget(microservice, 'pidMode', ''), + ipcMode: lget(microservice, 'ipcMode', ''), annotations: container.annotations != null ? JSON.stringify(container.annotations) : undefined, capAdd: lget(microservice, 'container.capAdd', []), capDrop: lget(microservice, 'container.capDrop', []), @@ -216,5 +357,8 @@ module.exports = { parseAppFile: parseAppFile, parseMicroserviceFile: parseMicroserviceFile, parseSecretFile: parseSecretFile, - parseCertificateFile: parseCertificateFile + parseVolumeMountFile: parseVolumeMountFile, + parseConfigMapFile: parseConfigMapFile, + parseCertificateFile: parseCertificateFile, + parseServiceFile: parseServiceFile } diff --git a/src/utils/cert.js b/src/utils/cert.js index 91398b5f8..8865ab474 100644 --- a/src/utils/cert.js +++ b/src/utils/cert.js @@ -1,5 +1,6 @@ const forge = require('node-forge') const k8sClient = require('./k8s-client') +const BigNumber = require('bignumber.js') // Types for CA input const CA_TYPES = { @@ -120,7 +121,7 @@ async function loadCA (name) { if (secret.type !== 'tls') { throw new Error(`Secret ${name} is not a TLS secret`) - } + } if (!secret.data || !secret.data['tls.crt'] || !secret.data['tls.key']) { throw new Error(`Invalid TLS secret data for ${name}`) @@ -136,6 +137,18 @@ async function loadCA (name) { } } +/** + * Generates a random serial number between 0 and 2^128-1 + * @returns {string} - Serial number as a decimal string + */ +function generateSerialNumber () { + // Create a random 16-byte buffer + const randomBytes = forge.random.getBytesSync(16) + // Convert to BigNumber + const serialNumber = new BigNumber('0x' + forge.util.bytesToHex(randomBytes)) + return serialNumber.toString() +} + /** * Generates a self-signed CA certificate * @param {string} subject - CA subject name @@ -152,7 +165,7 @@ async function generateSelfSignedCA (subject, expiration = 5 * 365 * 24 * 60 * 6 // Set certificate fields cert.publicKey = keys.publicKey - cert.serialNumber = forge.util.bytesToHex(forge.random.getBytesSync(16)) + cert.serialNumber = generateSerialNumber() // Set validity period const now = new Date() @@ -224,8 +237,8 @@ async function getCAFromK8sSecret (secretName) { return null } if (!secret.data['tls.crt'] || !secret.data['tls.key']) { - return null - } + return null + } const cert = Buffer.from(secret.data['tls.crt'], 'base64').toString() const key = Buffer.from(secret.data['tls.key'], 'base64').toString() @@ -362,7 +375,8 @@ async function generateCertificate ({ if (host.match(/^(\d{1,3}\.){3}\d{1,3}$/)) { // IP address altNames.push({ type: 7, ip: host }) - } else { + altNames.push({ type: 2, value: host }) + } else { // DNS name altNames.push({ type: 2, value: host }) } @@ -413,31 +427,31 @@ async function generateCertificate ({ cert.setIssuer(subjectAttrs) // Add extensions for a self-signed server certificate - cert.setExtensions([ - { - name: 'basicConstraints', + cert.setExtensions([ + { + name: 'basicConstraints', cA: false, critical: true - }, - { - name: 'keyUsage', - digitalSignature: true, - keyEncipherment: true, + }, + { + name: 'keyUsage', + digitalSignature: true, + keyEncipherment: true, critical: true - }, - { - name: 'extKeyUsage', - serverAuth: true, - clientAuth: true - }, - { - name: 'subjectAltName', + }, + { + name: 'extKeyUsage', + serverAuth: true, + clientAuth: true + }, + { + name: 'subjectAltName', altNames: altNames }, { name: 'subjectKeyIdentifier' - } - ]) + } + ]) // Self-sign the certificate cert.sign(keys.privateKey, forge.md.sha256.create()) @@ -454,7 +468,7 @@ async function generateCertificate ({ 'ca.crt': Buffer.from(caCert ? caCert.certPem || caCert.crtData : certPem).toString('base64') } - const secret = { + const secret = { name: name, type: 'tls', data: secretData diff --git a/src/utils/k8s-client.js b/src/utils/k8s-client.js index e84afda13..65896321a 100644 --- a/src/utils/k8s-client.js +++ b/src/utils/k8s-client.js @@ -1,4 +1,24 @@ const logger = require('../logger') +const config = require('../config') + +// Only set CONTROLLER_NAMESPACE if running in Kubernetes mode +let CONTROLLER_NAMESPACE = null + +function checkKubernetesEnvironment () { + const controlPlane = process.env.CONTROL_PLANE || config.get('app.ControlPlane') + return controlPlane && controlPlane.toLowerCase() === 'kubernetes' +} + +if (checkKubernetesEnvironment()) { + CONTROLLER_NAMESPACE = process.env.CONTROLLER_NAMESPACE + + // Validate that CONTROLLER_NAMESPACE is set when in Kubernetes mode + if (!CONTROLLER_NAMESPACE) { + logger.error('CONTROLLER_NAMESPACE environment variable is not set') + throw new Error('CONTROLLER_NAMESPACE environment variable is not set') + } +} + let k8sApi = null async function initializeK8sClient () { @@ -9,17 +29,18 @@ async function initializeK8sClient () { // Use the in-cluster configuration kubeConfig.loadFromCluster() + // kubeConfig.loadFromDefault() k8sApi = kubeConfig.makeApiClient(k8s.CoreV1Api) logger.info('Kubernetes client initialized successfully') } return k8sApi } -async function getSecret (secretName, namespace) { - logger.debug(`Getting secret: ${secretName} in namespace: ${namespace}`) +async function getSecret (secretName) { + logger.debug(`Getting secret: ${secretName} in namespace: ${CONTROLLER_NAMESPACE}`) try { const api = await initializeK8sClient() - const response = await api.readNamespacedSecret(secretName, namespace) + const response = await api.readNamespacedSecret(secretName, CONTROLLER_NAMESPACE) logger.info(`Successfully retrieved secret: ${secretName}`) return response.body } catch (error) { @@ -29,11 +50,11 @@ async function getSecret (secretName, namespace) { } // ConfigMap methods -async function getConfigMap (configMapName, namespace) { - logger.debug(`Getting ConfigMap: ${configMapName} in namespace: ${namespace}`) +async function getConfigMap (configMapName) { + logger.debug(`Getting ConfigMap: ${configMapName} in namespace: ${CONTROLLER_NAMESPACE}`) try { const api = await initializeK8sClient() - const response = await api.readNamespacedConfigMap(configMapName, namespace) + const response = await api.readNamespacedConfigMap(configMapName, CONTROLLER_NAMESPACE) logger.info(`Successfully retrieved ConfigMap: ${configMapName}`) return response.body } catch (error) { @@ -42,60 +63,82 @@ async function getConfigMap (configMapName, namespace) { } } -async function patchConfigMap (configMapName, namespace, patchData) { - logger.debug(`Patching ConfigMap: ${configMapName} in namespace: ${namespace}`) +async function patchConfigMap (configMapName, patchData) { + logger.debug(`Patching ConfigMap: ${configMapName} in namespace: ${CONTROLLER_NAMESPACE}`) try { const api = await initializeK8sClient() - // Pass all options in one object - much cleaner than multiple undefined parameters - const response = await api.patchNamespacedConfigMap( - configMapName, - namespace, - patchData, + + // Create JSON Patch operation with formatted JSON + const patch = [ { - headers: { 'Content-Type': 'application/strategic-merge-patch+json' } + op: 'replace', + path: '/data/skrouterd.json', + value: typeof patchData.data['skrouterd.json'] === 'string' + ? JSON.stringify(JSON.parse(patchData.data['skrouterd.json']), null, 2) + : JSON.stringify(patchData.data['skrouterd.json'], null, 2) } + ] + + const { body: configMap } = await api.patchNamespacedConfigMap( + configMapName, + CONTROLLER_NAMESPACE, + patch, + undefined, + undefined, + undefined, + undefined, + undefined, + { headers: { 'content-type': 'application/json-patch+json' } } ) logger.info(`Successfully patched ConfigMap: ${configMapName}`) - return response.body + return configMap } catch (error) { logger.error(`Failed to patch ConfigMap ${configMapName}: ${error.message}`) + if (error.response) { + logger.error(`Response status: ${error.response.status}`) + logger.error(`Response body: ${JSON.stringify(error.response.body)}`) + } throw error } } // Service methods -async function getNamespacedServices (namespace) { - logger.debug(`Listing services in namespace: ${namespace}`) +async function getNamespacedServices () { + logger.debug(`Listing services in namespace: ${CONTROLLER_NAMESPACE}`) try { const api = await initializeK8sClient() - const response = await api.listNamespacedService(namespace) - logger.info(`Successfully retrieved ${response.body.items.length} services in namespace: ${namespace}`) + const response = await api.listNamespacedService(CONTROLLER_NAMESPACE) + logger.info(`Successfully retrieved ${response.body.items.length} services in namespace: ${CONTROLLER_NAMESPACE}`) return response.body } catch (error) { - logger.error(`Failed to list services in namespace ${namespace}: ${error.message}`) + logger.error(`Failed to list services in namespace ${CONTROLLER_NAMESPACE}: ${error.message}`) throw error } } -async function createService (namespace, serviceSpec) { - logger.debug(`Creating service in namespace: ${namespace}`) +async function createService (serviceSpec) { + logger.debug(`Creating service in namespace: ${CONTROLLER_NAMESPACE}`) try { const api = await initializeK8sClient() - const response = await api.createNamespacedService(namespace, serviceSpec) - logger.info(`Successfully created service: ${response.body.metadata.name} in namespace: ${namespace}`) + const response = await api.createNamespacedService(CONTROLLER_NAMESPACE, serviceSpec) + logger.info(`Successfully created service: ${response.body.metadata.name} in namespace: ${CONTROLLER_NAMESPACE}`) return response.body } catch (error) { - logger.error(`Failed to create service in namespace ${namespace}: ${error.message}`) + logger.error(`Failed to create service in namespace ${CONTROLLER_NAMESPACE}: ${error.message}`) + if (error.response) { + logger.error(`Response status: ${error.response.status}`) + logger.error(`Response body: ${JSON.stringify(error.response.body)}`) + } throw error } } -async function deleteService (serviceName, namespace) { - logger.debug(`Deleting service: ${serviceName} in namespace: ${namespace}`) +async function deleteService (serviceName) { + logger.debug(`Deleting service: ${serviceName} in namespace: ${CONTROLLER_NAMESPACE}`) try { const api = await initializeK8sClient() - const response = await api.deleteNamespacedService(serviceName, namespace) - logger.info(`Successfully deleted service: ${serviceName} from namespace: ${namespace}`) + const response = await api.deleteNamespacedService(serviceName, CONTROLLER_NAMESPACE) + logger.info(`Successfully deleted service: ${serviceName} from namespace: ${CONTROLLER_NAMESPACE}`) return response.body } catch (error) { logger.error(`Failed to delete service ${serviceName}: ${error.message}`) @@ -103,43 +146,93 @@ async function deleteService (serviceName, namespace) { } } +/** + * Updates a service using strategic merge patch + * @param {string} serviceName - The name of the service to update + * @param {Object} patchData - The patch data to apply to the service + * @returns {Promise} The updated service object + */ +async function updateService (serviceName, patchData) { + logger.debug(`Updating service: ${serviceName} in namespace: ${CONTROLLER_NAMESPACE}`) + try { + const api = await initializeK8sClient() + + // For strategic merge patch, we send the data as a map + const patch = { + spec: patchData.spec, + metadata: patchData.metadata + } + + const response = await api.patchNamespacedService( + serviceName, + CONTROLLER_NAMESPACE, + patch, + undefined, + undefined, + undefined, + undefined, + undefined, + { headers: { 'Content-Type': 'application/strategic-merge-patch+json' } } + ) + logger.info(`Successfully updated service: ${serviceName} in namespace: ${CONTROLLER_NAMESPACE}`) + return response.body + } catch (error) { + logger.error(`Failed to update service ${serviceName}: ${error.message}`) + if (error.response) { + logger.error(`Response status: ${error.response.status}`) + logger.error(`Response body: ${JSON.stringify(error.response.body)}`) + } + throw error + } +} + /** * Gets the LoadBalancer IP for a service if it exists * @param {string} serviceName - The name of the service - * @param {string} namespace - The namespace of the service - * @returns {Promise} The LoadBalancer IP or null if not available + * @param {number} maxRetries - Maximum number of retries (default: 30) + * @param {number} retryInterval - Interval between retries in milliseconds (default: 2000) + * @returns {Promise} The LoadBalancer IP or null if not available after timeout */ -async function watchLoadBalancerIP (serviceName, namespace) { - logger.debug(`Checking LoadBalancer IP for service: ${serviceName} in namespace: ${namespace}`) +async function watchLoadBalancerIP (serviceName, maxRetries = 10, retryInterval = 2000) { + logger.debug(`Checking LoadBalancer IP for service: ${serviceName} in namespace: ${CONTROLLER_NAMESPACE}`) const api = await initializeK8sClient() - try { - const response = await api.readNamespacedService(serviceName, namespace) - const service = response.body - - // Check if the service type is LoadBalancer - if (service.spec && service.spec.type === 'LoadBalancer') { - // Check if the LoadBalancer IP exists - if (service.status && - service.status.loadBalancer && - service.status.loadBalancer.ingress && - service.status.loadBalancer.ingress.length > 0) { - const ip = service.status.loadBalancer.ingress[0].ip - if (ip) { - logger.info(`Found LoadBalancer IP: ${ip} for service: ${serviceName}`) - return ip + + for (let attempt = 0; attempt < maxRetries; attempt++) { + try { + const response = await api.readNamespacedService(serviceName, CONTROLLER_NAMESPACE) + const service = response.body + + // Check if the service type is LoadBalancer + if (service.spec && service.spec.type === 'LoadBalancer') { + // Check if the LoadBalancer IP exists + if (service.status && + service.status.loadBalancer && + service.status.loadBalancer.ingress && + service.status.loadBalancer.ingress.length > 0) { + const ip = service.status.loadBalancer.ingress[0].ip + if (ip) { + logger.info(`Found LoadBalancer IP: ${ip} for service: ${serviceName}`) + return ip + } } + logger.info(`Service ${serviceName} is LoadBalancer type but IP not yet assigned (attempt ${attempt + 1}/${maxRetries})`) + } else { + const serviceType = service.spec && service.spec.type ? service.spec.type : 'unknown' + logger.info(`Service ${serviceName} is not of type LoadBalancer (type: ${serviceType})`) + return null } - logger.info(`Service ${serviceName} is LoadBalancer type but IP not yet assigned`) - } else { - const serviceType = service.spec && service.spec.type ? service.spec.type : 'unknown' - logger.info(`Service ${serviceName} is not of type LoadBalancer (type: ${serviceType})`) + + // Wait before next retry + await new Promise(resolve => setTimeout(resolve, retryInterval)) + } catch (error) { + logger.error(`Error getting LoadBalancer IP for service ${serviceName}: ${error.message}`) + // Wait before next retry even if there's an error + await new Promise(resolve => setTimeout(resolve, retryInterval)) } - // Return null if the service is not a LoadBalancer or IP is not yet assigned - return null - } catch (error) { - logger.error(`Error getting LoadBalancer IP for service ${serviceName}: ${error.message}`) - return null } + + logger.warn(`LoadBalancer IP not assigned for service ${serviceName} after ${maxRetries} attempts`) + return null } module.exports = { @@ -149,5 +242,7 @@ module.exports = { getNamespacedServices, createService, deleteService, - watchLoadBalancerIP + updateService, + watchLoadBalancerIP, + checkKubernetesEnvironment } diff --git a/src/utils/ssl-utils.js b/src/utils/ssl-utils.js index 988eca7a8..6a0a12005 100644 --- a/src/utils/ssl-utils.js +++ b/src/utils/ssl-utils.js @@ -58,9 +58,14 @@ function createSSLOptions ({ key, cert, intermedKey, isBase64 = false }) { rejectUnauthorized: false } - // Only add CA if intermediate certificate is provided + // Only add CA if intermediate certificate is provided and exists if (intermedKey) { try { + // Check if file exists when not using base64 + if (!isBase64 && !fs.existsSync(intermedKey)) { + logger.warn(`Intermediate certificate file not found at path: ${intermedKey}, continuing without it`) + return sslOptions + } sslOptions.ca = loadCertificate(intermedKey, isBase64) } catch (e) { logger.warn('Intermediate certificate could not be loaded, continuing without it') diff --git a/test/backup/iofog-service.js b/test/backup/iofog-service.js new file mode 100644 index 000000000..bf90d94b5 --- /dev/null +++ b/test/backup/iofog-service.js @@ -0,0 +1,1250 @@ +/* + * ******************************************************************************* + * * Copyright (c) 2023 Datasance Teknoloji A.S. + * * + * * This program and the accompanying materials are made available under the + * * terms of the Eclipse Public License v. 2.0 which is available at + * * http://www.eclipse.org/legal/epl-2.0 + * * + * * SPDX-License-Identifier: EPL-2.0 + * ******************************************************************************* + * + */ + +const config = require('../config') +const fs = require('fs') +const TransactionDecorator = require('../decorators/transaction-decorator') +const AppHelper = require('../helpers/app-helper') +const FogManager = require('../data/managers/iofog-manager') +const FogProvisionKeyManager = require('../data/managers/iofog-provision-key-manager') +const FogVersionCommandManager = require('../data/managers/iofog-version-command-manager') +const ChangeTrackingService = require('./change-tracking-service') +const Errors = require('../helpers/errors') +const ErrorMessages = require('../helpers/error-messages') +const Validator = require('../schemas') +const HWInfoManager = require('../data/managers/hw-info-manager') +const USBInfoManager = require('../data/managers/usb-info-manager') +const CatalogService = require('./catalog-service') +const MicroserviceManager = require('../data/managers/microservice-manager') +const ApplicationManager = require('../data/managers/application-manager') +const TagsManager = require('../data/managers/tags-manager') +const MicroserviceService = require('./microservices-service') +const EdgeResourceService = require('./edge-resource-service') +const VolumeMountService = require('./volume-mount-service') +const RouterManager = require('../data/managers/router-manager') +const MicroserviceExtraHostManager = require('../data/managers/microservice-extra-host-manager') +const MicroserviceStatusManager = require('../data/managers/microservice-status-manager') +const RouterConnectionManager = require('../data/managers/router-connection-manager') +const RouterService = require('./router-service') +const Constants = require('../helpers/constants') +const Op = require('sequelize').Op +const lget = require('lodash/get') +const CertificateService = require('./certificate-service') +const logger = require('../logger') +const ServiceManager = require('../data/managers/service-manager') + +const SITE_CA_CERT = 'pot-site-ca' +const DEFAULT_ROUTER_LOCAL_CA = 'default-router-local-ca' +const SERVICE_ANNOTATION_TAG = 'service.datasance.com/tag' + +async function checkKubernetesEnvironment () { + const controlPlane = process.env.CONTROL_PLANE || config.get('app.ControlPlane') + return controlPlane && controlPlane.toLowerCase() === 'kubernetes' +} + +async function getLocalCertificateHosts (isKubernetes, namespace) { + if (isKubernetes) { + return `router-local,router-local.${namespace},router-local.${namespace}.svc.cluster.local` + } + return '127.0.0.1,localhost,host.docker.internal,host.containers.internal' +} + +async function getSiteCertificateHosts (fogData, transaction) { + const hosts = new Set() + // Add existing hosts if isSystem + if (fogData.isSystem) { + if (fogData.host) hosts.add(fogData.host) + if (fogData.ipAddress) hosts.add(fogData.ipAddress) + if (fogData.ipAddressExternal) hosts.add(fogData.ipAddressExternal) + } + // Add default router host if not system + if (!fogData.isSystem) { + const defaultRouter = await RouterManager.findOne({ isDefault: true }, transaction) + if (defaultRouter.host) hosts.add(defaultRouter.host) + } + // Add upstream router hosts + // const upstreamRouters = (fogData.upstreamRouters || []).filter(uuid => uuid !== 'default-router') + // if (upstreamRouters.length) { + // for (const uuid of upstreamRouters) { + // const routerHost = await FogManager.findOne({ uuid: uuid }, transaction) + // if (routerHost.host) hosts.add(routerHost.host) + // if (routerHost.ipAddress) hosts.add(routerHost.ipAddress) + // } + // } + return Array.from(hosts).join(',') || 'localhost' +} + +async function _handleRouterCertificates (fogData, uuid, isRouterModeChanged, transaction) { + logger.debug('Starting _handleRouterCertificates for fog: ' + JSON.stringify({ uuid: uuid, host: fogData.host })) + + // Check if we're in Kubernetes environment + const isKubernetes = await checkKubernetesEnvironment() + const namespace = isKubernetes ? process.env.CONTROLLER_NAMESPACE : null + + // Helper to check CA existence + async function ensureCA (name, subject) { + logger.debug('Checking CA existence: ' + JSON.stringify({ name, subject })) + try { + await CertificateService.getCAEndpoint(name, transaction) + logger.debug('CA already exists: ' + name) + // CA exists + } catch (err) { + if (err.name === 'NotFoundError') { + logger.debug('CA not found, creating new CA: ' + JSON.stringify({ name, subject })) + await CertificateService.createCAEndpoint({ + name, + subject: `${subject}`, + expiration: 60, // months + type: 'self-signed' + }, transaction) + logger.debug('Successfully created CA: ' + name) + } else if (err.name === 'ConflictError') { + logger.debug('CA already exists (conflict): ' + name) + // Already exists, ignore + } else { + logger.error('Error in ensureCA - Name: ' + name + ', Subject: ' + subject + ', Error: ' + err.message + ', Type: ' + err.name + ', Code: ' + err.code) + logger.error('Stack trace: ' + err.stack) + throw err + } + } + } + + // Helper to check cert existence + async function ensureCert (name, subject, hosts, ca, shouldRecreate = false) { + logger.debug('Checking certificate existence: ' + JSON.stringify({ name, subject, hosts, ca })) + try { + const existingCert = await CertificateService.getCertificateEndpoint(name, transaction) + if (shouldRecreate && existingCert) { + logger.debug('Certificate exists and needs recreation: ' + name) + await CertificateService.deleteCertificateEndpoint(name, transaction) + logger.debug('Deleted existing certificate: ' + name) + // Create new certificate + await CertificateService.createCertificateEndpoint({ + name, + subject: `${subject}`, + hosts, + ca + }, transaction) + logger.debug('Successfully recreated certificate: ' + name) + } else if (!existingCert) { + logger.debug('Certificate not found, creating new certificate: ' + JSON.stringify({ name, subject, hosts, ca })) + await CertificateService.createCertificateEndpoint({ + name, + subject: `${subject}`, + hosts, + ca + }, transaction) + logger.debug('Successfully created certificate: ' + name) + } else { + logger.debug('Certificate already exists: ' + name) + } + } catch (err) { + if (err.name === 'NotFoundError') { + logger.debug('Certificate not found, creating new certificate: ' + JSON.stringify({ name, subject, hosts, ca })) + await CertificateService.createCertificateEndpoint({ + name, + subject: `${subject}`, + hosts, + ca + }, transaction) + logger.debug('Successfully created certificate: ' + name) + } else if (err.name === 'ConflictError') { + logger.debug('Certificate already exists (conflict): ' + name) + // Already exists, ignore + } else { + logger.error('Error in ensureCert - Name: ' + name + ', Subject: ' + subject + ', Hosts: ' + hosts + ', CA: ' + JSON.stringify(ca) + ', Error: ' + err.message + ', Type: ' + err.name + ', Code: ' + err.code) + logger.error('Stack trace: ' + err.stack) + throw err + } + } + } + + try { + // Always ensure SITE_CA_CERT exists + logger.debug('Ensuring SITE_CA_CERT exists') + await ensureCA(SITE_CA_CERT, SITE_CA_CERT) + + // If routerMode is 'none', only ensure DEFAULT_ROUTER_LOCAL_CA and its signed certificate + if (fogData.routerMode === 'none') { + logger.debug('Router mode is none, ensuring DEFAULT_ROUTER_LOCAL_CA exists') + await ensureCA(DEFAULT_ROUTER_LOCAL_CA, DEFAULT_ROUTER_LOCAL_CA) + logger.debug('Ensuring local-agent certificate signed by DEFAULT_ROUTER_LOCAL_CA') + const localHosts = await getLocalCertificateHosts(isKubernetes, namespace) + await ensureCert( + `${uuid}-local-agent`, + `${uuid}-local-agent`, + localHosts, + { type: 'direct', secretName: DEFAULT_ROUTER_LOCAL_CA }, + isRouterModeChanged + ) + logger.debug('Successfully completed _handleRouterCertificates for routerMode none') + return + } + + // For other router modes, ensure all other certificates + // Always ensure site-server cert exists + logger.debug('Ensuring site-server certificate exists') + const siteHosts = await getSiteCertificateHosts(fogData, transaction) + await ensureCert( + `${uuid}-site-server`, + `${uuid}-site-server`, + siteHosts, + { type: 'direct', secretName: SITE_CA_CERT }, + false + ) + + // Always ensure local-ca exists + logger.debug('Ensuring local-ca exists') + await ensureCA(`${uuid}-local-ca`, `${uuid}-local-ca`) + + // Always ensure local-server cert exists + logger.debug('Ensuring local-server certificate exists') + const localHosts = await getLocalCertificateHosts(isKubernetes, namespace) + await ensureCert( + `${uuid}-local-server`, + `${uuid}-local-server`, + localHosts, + { type: 'direct', secretName: `${uuid}-local-ca` }, + isRouterModeChanged + ) + + // Always ensure local-agent cert exists + logger.debug('Ensuring local-agent certificate exists') + await ensureCert( + `${uuid}-local-agent`, + `${uuid}-local-agent`, + localHosts, + { type: 'direct', secretName: `${uuid}-local-ca` }, + isRouterModeChanged + ) + + logger.debug('Successfully completed _handleRouterCertificates') + } catch (error) { + logger.error('Certificate operation failed - UUID: ' + uuid + ', RouterMode: ' + fogData.routerMode + ', Error: ' + error.message + ', Type: ' + error.name + ', Code: ' + error.code) + logger.error('Stack trace: ' + error.stack) + } +} + +async function createFogEndPoint (fogData, isCLI, transaction) { + await Validator.validate(fogData, Validator.schemas.iofogCreate) + + let createFogData = { + uuid: AppHelper.generateUUID(), + name: fogData.name, + location: fogData.location, + latitude: fogData.latitude, + longitude: fogData.longitude, + gpsMode: fogData.latitude || fogData.longitude ? 'manual' : undefined, + description: fogData.description, + networkInterface: fogData.networkInterface, + dockerUrl: fogData.dockerUrl, + containerEngine: fogData.containerEngine, + deploymentType: fogData.deploymentType, + diskLimit: fogData.diskLimit, + diskDirectory: fogData.diskDirectory, + memoryLimit: fogData.memoryLimit, + cpuLimit: fogData.cpuLimit, + logLimit: fogData.logLimit, + logDirectory: fogData.logDirectory, + logFileCount: fogData.logFileCount, + statusFrequency: fogData.statusFrequency, + changeFrequency: fogData.changeFrequency, + deviceScanFrequency: fogData.deviceScanFrequency, + bluetoothEnabled: fogData.bluetoothEnabled, + watchdogEnabled: fogData.watchdogEnabled, + abstractedHardwareEnabled: fogData.abstractedHardwareEnabled, + fogTypeId: fogData.fogType, + logLevel: fogData.logLevel, + dockerPruningFrequency: fogData.dockerPruningFrequency, + availableDiskThreshold: fogData.availableDiskThreshold, + isSystem: fogData.isSystem, + host: fogData.host, + routerId: null, + timeZone: fogData.timeZone + } + + createFogData = AppHelper.deleteUndefinedFields(createFogData) + + // Default router is edge + fogData.routerMode = fogData.routerMode || 'edge' + + if (fogData.isSystem && fogData.routerMode !== 'interior') { + throw new Errors.ValidationError(AppHelper.formatMessage(ErrorMessages.INVALID_ROUTER_MODE, fogData.routerMode)) + } + + if (fogData.isSystem && !!(await FogManager.findOne({ isSystem: true }, transaction))) { + throw new Errors.ValidationError(AppHelper.formatMessage(ErrorMessages.DUPLICATE_SYSTEM_FOG)) + } + + const existingFog = await FogManager.findOne({ name: createFogData.name }, transaction) + if (existingFog) { + throw new Errors.ValidationError(AppHelper.formatMessage(ErrorMessages.DUPLICATE_NAME, createFogData.name)) + } + + let defaultRouter, upstreamRouters + if (fogData.routerMode === 'none') { + const networkRouter = await RouterService.getNetworkRouter(fogData.networkRouter) + if (!networkRouter) { + throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.INVALID_ROUTER, !fogData.networkRouter ? Constants.DEFAULT_ROUTER_NAME : fogData.networkRouter)) + } + createFogData.routerId = networkRouter.id + } else { + defaultRouter = await RouterManager.findOne({ isDefault: true }, transaction) + upstreamRouters = await RouterService.validateAndReturnUpstreamRouters(fogData.upstreamRouters, fogData.isSystem, defaultRouter) + } + + const fog = await FogManager.create(createFogData, transaction) + + // Set tags + await _setTags(fog, fogData.tags, transaction) + + // Add certificate handling + await _handleRouterCertificates(fogData, createFogData.uuid, false, transaction) + + if (fogData.routerMode !== 'none') { + if (!fogData.host && !isCLI) { + throw new Errors.ValidationError(ErrorMessages.HOST_IS_REQUIRED) + } + + await RouterService.createRouterForFog(fogData, fog.uuid, upstreamRouters) + + // --- Service Distribution Logic --- + // 1. Extract service tags + const serviceTags = await _extractServiceTags(fogData.tags) + + // 2. If service tags are not empty, find matching services + if (serviceTags.length > 0) { + const services = await _findMatchingServices(serviceTags, transaction) + + // 3. If services are not empty, build listeners and update router config + if (services.length > 0) { + // Get router microservice + const routerName = `router-${fog.uuid.toLowerCase()}` + const routerMicroservice = await MicroserviceManager.findOne({ name: routerName }, transaction) + if (!routerMicroservice) { + throw new Errors.NotFoundError(`Router microservice not found: ${routerName}`) + } + let config = JSON.parse(routerMicroservice.config || '{}') + + // For each service, build listener and merge + for (const service of services) { + const listenerConfig = _buildTcpListenerForFog(service, fog.uuid) + config = _mergeTcpListener(config, listenerConfig) + } + + // Update router microservice config + await MicroserviceManager.update( + { uuid: routerMicroservice.uuid }, + { config: JSON.stringify(config) }, + transaction + ) + + // Update change tracking + await ChangeTrackingService.update(fog.uuid, ChangeTrackingService.events.microserviceConfig, transaction) + } + } + } + + const res = { + uuid: fog.uuid + } + + await ChangeTrackingService.create(fog.uuid, transaction) + + if (fogData.abstractedHardwareEnabled) { + await _createHalMicroserviceForFog(fog, null, transaction) + } + + if (fogData.bluetoothEnabled) { + await _createBluetoothMicroserviceForFog(fog, null, transaction) + } + + await ChangeTrackingService.update(createFogData.uuid, ChangeTrackingService.events.microserviceCommon, transaction) + + return res +} + +async function _setTags (fogModel, tagsArray, transaction) { + if (tagsArray) { + let tags = [] + for (const tag of tagsArray) { + let tagModel = await TagsManager.findOne({ value: tag }, transaction) + if (!tagModel) { + tagModel = await TagsManager.create({ value: tag }, transaction) + } + tags.push(tagModel) + } + await fogModel.setTags(tags) + } +} + +async function updateFogEndPoint (fogData, isCLI, transaction) { + await Validator.validate(fogData, Validator.schemas.iofogUpdate) + + const queryFogData = { uuid: fogData.uuid } + + let updateFogData = { + name: fogData.name, + location: fogData.location, + latitude: fogData.latitude, + longitude: fogData.longitude, + gpsMode: fogData.latitude || fogData.longitude ? 'manual' : undefined, + description: fogData.description, + networkInterface: fogData.networkInterface, + dockerUrl: fogData.dockerUrl, + containerEngine: fogData.containerEngine, + deploymentType: fogData.deploymentType, + diskLimit: fogData.diskLimit, + diskDirectory: fogData.diskDirectory, + memoryLimit: fogData.memoryLimit, + cpuLimit: fogData.cpuLimit, + logLimit: fogData.logLimit, + logDirectory: fogData.logDirectory, + logFileCount: fogData.logFileCount, + statusFrequency: fogData.statusFrequency, + changeFrequency: fogData.changeFrequency, + deviceScanFrequency: fogData.deviceScanFrequency, + bluetoothEnabled: fogData.bluetoothEnabled, + watchdogEnabled: fogData.watchdogEnabled, + isSystem: fogData.isSystem, + abstractedHardwareEnabled: fogData.abstractedHardwareEnabled, + fogTypeId: fogData.fogType, + logLevel: fogData.logLevel, + dockerPruningFrequency: fogData.dockerPruningFrequency, + host: fogData.host, + availableDiskThreshold: fogData.availableDiskThreshold, + timeZone: fogData.timeZone + } + updateFogData = AppHelper.deleteUndefinedFields(updateFogData) + + const oldFog = await FogManager.findOne(queryFogData, transaction) + if (!oldFog) { + throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.INVALID_IOFOG_UUID, fogData.uuid)) + } + + // Update tags + await _setTags(oldFog, fogData.tags, transaction) + + if (updateFogData.name) { + const conflictQuery = isCLI + ? { name: updateFogData.name, uuid: { [Op.not]: fogData.uuid } } + : { name: updateFogData.name, uuid: { [Op.not]: fogData.uuid } } + const conflict = await FogManager.findOne(conflictQuery, transaction) + if (conflict) { + throw new Errors.ValidationError(AppHelper.formatMessage(ErrorMessages.DUPLICATE_NAME, updateFogData.name)) + } + } + + // Update router + // Get all router config informations + const router = await oldFog.getRouter() + const host = fogData.host || lget(router, 'host') + const upstreamRoutersConnections = router ? (await RouterConnectionManager.findAllWithRouters({ sourceRouter: router.id }, transaction) || []) : [] + const upstreamRoutersIofogUuid = fogData.upstreamRouters || await Promise.all(upstreamRoutersConnections.map(connection => connection.dest.iofogUuid)) + const routerMode = fogData.routerMode || (router ? (router.isEdge ? 'edge' : 'interior') : 'none') + const messagingPort = fogData.messagingPort || (router ? router.messagingPort : null) + const interRouterPort = fogData.interRouterPort || (router ? router.interRouterPort : null) + const edgeRouterPort = fogData.edgeRouterPort || (router ? router.edgeRouterPort : null) + let networkRouter + + const isSystem = updateFogData.isSystem === undefined ? oldFog.isSystem : updateFogData.isSystem + if (isSystem && routerMode !== 'interior') { + throw new Errors.ValidationError(AppHelper.formatMessage(ErrorMessages.INVALID_ROUTER_MODE, fogData.routerMode)) + } + + let isRouterModeChanged = false + const oldRouterMode = (router ? (router.isEdge ? 'edge' : 'interior') : 'none') + if (fogData.routerMode && fogData.routerMode !== oldRouterMode) { + if (fogData.routerMode === 'none' || oldRouterMode === 'none') { + isRouterModeChanged = true + } + } + // Add certificate handling + await _handleRouterCertificates(fogData, fogData.uuid, isRouterModeChanged, transaction) + + if (routerMode === 'none') { + networkRouter = await RouterService.getNetworkRouter(fogData.networkRouter) + if (!networkRouter) { + throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.INVALID_ROUTER, !fogData.networkRouter ? Constants.DEFAULT_ROUTER_NAME : fogData.networkRouter)) + } + // Only delete previous router if there is a network router + if (router) { + // New router mode is none, delete existing router + await _deleteFogRouter(fogData, transaction) + } + } else { + const defaultRouter = await RouterManager.findOne({ isDefault: true }, transaction) + const upstreamRouters = await RouterService.validateAndReturnUpstreamRouters(upstreamRoutersIofogUuid, oldFog.isSystem, defaultRouter) + if (!router) { + // Router does not exist yet + networkRouter = await RouterService.createRouterForFog(fogData, oldFog.uuid, upstreamRouters) + // --- Service Distribution Logic --- + // 1. Extract service tags + const serviceTags = await _extractServiceTags(fogData.tags) + + // 2. If service tags are not empty, find matching services + if (serviceTags.length > 0) { + const services = await _findMatchingServices(serviceTags, transaction) + + // 3. If services are not empty, build listeners and update router config + if (services.length > 0) { + // Get router microservice + const routerName = `router-${fogData.uuid.toLowerCase()}` + const routerMicroservice = await MicroserviceManager.findOne({ name: routerName }, transaction) + if (!routerMicroservice) { + throw new Errors.NotFoundError(`Router microservice not found: ${routerName}`) + } + let config = JSON.parse(routerMicroservice.config || '{}') + + // For each service, build listener and merge + for (const service of services) { + const listenerConfig = _buildTcpListenerForFog(service, fogData.uuid) + config = _mergeTcpListener(config, listenerConfig) + } + + // Update router microservice config + await MicroserviceManager.update( + { uuid: routerMicroservice.uuid }, + { config: JSON.stringify(config) }, + transaction + ) + + // Update change tracking + await ChangeTrackingService.update(fogData.uuid, ChangeTrackingService.events.microserviceConfig, transaction) + } + } + } else { + // Extract existing TCP connectors before updating config + const existingConnectors = await _extractExistingTcpConnectors(fogData.uuid, transaction) + // Update existing router + networkRouter = await RouterService.updateRouter(router, { + messagingPort, interRouterPort, edgeRouterPort, isEdge: routerMode === 'edge', host + }, upstreamRouters, fogData.containerEngine) + + // --- Service Distribution Logic --- + // 1. Extract service tags + const serviceTags = await _extractServiceTags(fogData.tags) + + // Get router microservice for config updates + const routerName = `router-${fogData.uuid.toLowerCase()}` + const routerMicroservice = await MicroserviceManager.findOne({ name: routerName }, transaction) + if (!routerMicroservice) { + throw new Errors.NotFoundError(`Router microservice not found: ${routerName}`) + } + let config = JSON.parse(routerMicroservice.config || '{}') + + // 2. If service tags are not empty, find matching services and build listeners + if (serviceTags.length > 0) { + const services = await _findMatchingServices(serviceTags, transaction) + + // 3. If services are not empty, build and merge listeners + if (services.length > 0) { + // For each service, build listener and merge + for (const service of services) { + const listenerConfig = _buildTcpListenerForFog(service, fogData.uuid) + config = _mergeTcpListener(config, listenerConfig) + } + } + } + + // 4. Merge back existing connectors if any + if (existingConnectors && Object.keys(existingConnectors).length > 0) { + for (const connectorName in existingConnectors) { + const connectorObj = existingConnectors[connectorName] + config = _mergeTcpConnector(config, connectorObj) + } + } + + // Update router microservice config + await MicroserviceManager.update( + { uuid: routerMicroservice.uuid }, + { config: JSON.stringify(config) }, + transaction + ) + + // Update change tracking + await ChangeTrackingService.update(fogData.uuid, ChangeTrackingService.events.microserviceConfig, transaction) + await ChangeTrackingService.update(fogData.uuid, ChangeTrackingService.events.routerChanged, transaction) + } + } + updateFogData.routerId = networkRouter.id + + // If router changed, set routerChanged flag + if (updateFogData.routerId !== oldFog.routerId || updateFogData.routerMode !== oldFog.routerMode) { + await ChangeTrackingService.update(fogData.uuid, ChangeTrackingService.events.routerChanged, transaction) + await ChangeTrackingService.update(fogData.uuid, ChangeTrackingService.events.microserviceList, transaction) + } + + await FogManager.update(queryFogData, updateFogData, transaction) + await ChangeTrackingService.update(fogData.uuid, ChangeTrackingService.events.config, transaction) + + let msChanged = false + + // Update Microservice extra hosts + if (updateFogData.host && updateFogData.host !== oldFog.host) { + await _updateMicroserviceExtraHosts(fogData.uuid, updateFogData.host, transaction) + } + + if (oldFog.abstractedHardwareEnabled === true && fogData.abstractedHardwareEnabled === false) { + await _deleteHalMicroserviceByFog(fogData, transaction) + msChanged = true + } + if (oldFog.abstractedHardwareEnabled === false && fogData.abstractedHardwareEnabled === true) { + await _createHalMicroserviceForFog(fogData, oldFog, transaction) + msChanged = true + } + + if (oldFog.bluetoothEnabled === true && fogData.bluetoothEnabled === false) { + await _deleteBluetoothMicroserviceByFog(fogData, transaction) + msChanged = true + } + if (oldFog.bluetoothEnabled === false && fogData.bluetoothEnabled === true) { + await _createBluetoothMicroserviceForFog(fogData, oldFog, transaction) + msChanged = true + } + + if (msChanged) { + await ChangeTrackingService.update(fogData.uuid, ChangeTrackingService.events.microserviceCommon, transaction) + } +} + +async function _updateMicroserviceExtraHosts (fogUuid, host, transaction) { + const microserviceExtraHosts = await MicroserviceExtraHostManager.findAll({ targetFogUuid: fogUuid }, transaction) + for (const extraHost of microserviceExtraHosts) { + extraHost.value = host + await extraHost.save() + // Update tracking change for microservice + await MicroserviceExtraHostManager.updateOriginMicroserviceChangeTracking(extraHost, transaction) + } +} + +async function _updateProxyRouters (fogId, router, transaction) { + const proxyCatalog = await CatalogService.getProxyCatalogItem(transaction) + const proxyMicroservices = await MicroserviceManager.findAll({ catalogItemId: proxyCatalog.id, iofogUuid: fogId }, transaction) + for (const proxyMicroservice of proxyMicroservices) { + const config = JSON.parse(proxyMicroservice.config || '{}') + config.networkRouter = { + host: router.host, + port: router.messagingPort + } + await MicroserviceManager.updateIfChanged({ uuid: proxyMicroservice.uuid }, { config: JSON.stringify(config) }, transaction) + await ChangeTrackingService.update(fogId, ChangeTrackingService.events.microserviceConfig, transaction) + } +} + +async function _deleteFogRouter (fogData, transaction) { + const router = await RouterManager.findOne({ iofogUuid: fogData.uuid }, transaction) + const defaultRouter = await RouterManager.findOne({ isDefault: true }, transaction) + + // If agent had a router, delete router and update linked routers + if (!router) { + // Router mode is none, there is nothing to do + return + } + + const routerId = router.id + const routerConnections = await RouterConnectionManager.findAllWithRouters({ [Op.or]: [{ destRouter: routerId }, { sourceRouter: routerId }] }, transaction) + // Delete all router connections, and set routerChanged flag for linked routers + if (routerConnections) { + for (const connection of routerConnections) { + const router = connection.source.id === routerId ? connection.dest : connection.source + // Delete router connection + await RouterConnectionManager.delete({ id: connection.id }, transaction) + // Update config for downstream routers + if (connection.dest.id === routerId) { + // in order to keep downstream routers in the network, we connect them to default router + if (defaultRouter) { + await RouterConnectionManager.create({ sourceRouter: router.id, destRouter: defaultRouter.id }, transaction) + } + + // Update router config + await RouterService.updateConfig(router.id, fogData.containerEngine, transaction) + // Set routerChanged flag + await ChangeTrackingService.update(router.iofogUuid, ChangeTrackingService.events.routerChanged, transaction) + } + } + } + + // Connect the agents to default router + if (defaultRouter) { + const connectedAgents = await FogManager.findAll({ routerId }, transaction) + for (const connectedAgent of connectedAgents) { + await FogManager.update({ uuid: connectedAgent.uuid }, { routerId: defaultRouter.id }, transaction) + await _updateProxyRouters(connectedAgent.uuid, defaultRouter, transaction) + await ChangeTrackingService.update(connectedAgent.uuid, ChangeTrackingService.events.routerChanged, transaction) + } + } + // Delete router + await RouterManager.delete({ iofogUuid: fogData.uuid }, transaction) + // Delete router msvc + const routerCatalog = await CatalogService.getRouterCatalogItem(transaction) + await MicroserviceManager.delete({ catalogItemId: routerCatalog.id, iofogUuid: fogData.uuid }, transaction) + await ApplicationManager.delete({ name: `system-${fogData.uuid.toLowerCase()}` }, transaction) +} + +async function deleteFogEndPoint (fogData, isCLI, transaction) { + await Validator.validate(fogData, Validator.schemas.iofogDelete) + + const queryFogData = { uuid: fogData.uuid } + + const fog = await FogManager.findOne(queryFogData, transaction) + if (!fog) { + throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.INVALID_IOFOG_UUID, fogData.uuid)) + } + + await _deleteFogRouter(fogData, transaction) + + await _processDeleteCommand(fog, transaction) +} + +function _getRouterUuid (router, defaultRouter) { + return (defaultRouter && (router.id === defaultRouter.id)) ? Constants.DEFAULT_ROUTER_NAME : router.iofogUuid +} + +async function _getFogRouterConfig (fog, transaction) { + // Get fog router config + const defaultRouter = await RouterManager.findOne({ isDefault: true }, transaction) + const router = await fog.getRouter() + const routerConfig = { + + } + // Router mode is either interior or edge + if (router) { + routerConfig.routerMode = router.isEdge ? 'edge' : 'interior' + routerConfig.messagingPort = router.messagingPort + if (routerConfig.routerMode === 'interior') { + routerConfig.interRouterPort = router.interRouterPort + routerConfig.edgeRouterPort = router.edgeRouterPort + } + // Get upstream routers + const upstreamRoutersConnections = await RouterConnectionManager.findAllWithRouters({ sourceRouter: router.id }, transaction) + routerConfig.upstreamRouters = upstreamRoutersConnections ? upstreamRoutersConnections.map(r => _getRouterUuid(r.dest, defaultRouter)) : [] + } else { + routerConfig.routerMode = 'none' + const networkRouter = await RouterManager.findOne({ id: fog.routerId }, transaction) + if (networkRouter) { + routerConfig.networkRouter = _getRouterUuid(networkRouter, defaultRouter) + } + } + + return routerConfig +} + +async function _getFogEdgeResources (fog, transaction) { + const resourceAttributes = [ + 'name', + 'version', + 'description', + 'interfaceProtocol', + 'displayName', + 'displayIcon', + 'displayColor' + ] + const resources = await fog.getEdgeResources({ attributes: resourceAttributes }) + return resources.map(EdgeResourceService.buildGetObject) +} + +async function _getFogVolumeMounts (fog, transaction) { + const volumeMountAttributes = [ + 'name', + 'version', + 'configMapName', + 'secretName' + ] + const volumeMounts = await fog.getVolumeMounts({ attributes: volumeMountAttributes }) + return volumeMounts.map(vm => { + return { + name: vm.name, + version: vm.version, + configMapName: vm.configMapName, + secretName: vm.secretName + } + }) +} + +async function _getFogExtraInformation (fog, transaction) { + const routerConfig = await _getFogRouterConfig(fog, transaction) + const edgeResources = await _getFogEdgeResources(fog, transaction) + const volumeMounts = await _getFogVolumeMounts(fog, transaction) + // Transform to plain JS object + if (fog.toJSON && typeof fog.toJSON === 'function') { + fog = fog.toJSON() + } + return { ...fog, tags: _mapTags(fog), ...routerConfig, edgeResources, volumeMounts } +} + +// Map tags to string array +// Return plain JS object +function _mapTags (fog) { + return fog.tags ? fog.tags.map(t => t.value) : [] +} + +/** + * Extracts service-related tags from fog node tags + * @param {Array} fogTags - Array of tags from fog node + * @returns {Array} Array of service tags (e.g., ["all", "foo", "bar"]) + */ +async function _extractServiceTags (fogTags) { + if (!fogTags || !Array.isArray(fogTags)) { + return [] + } + + // Filter tags that start with SERVICE_ANNOTATION_TAG + const serviceTags = fogTags + .filter(tag => tag.startsWith(SERVICE_ANNOTATION_TAG)) + .map(tag => { + // Extract the value after the colon + const parts = tag.split(':') + return parts.length > 1 ? parts[1].trim() : '' + }) + .filter(tag => tag !== '') // Remove empty tags + + // If we have "all" tag, return just that + if (serviceTags.includes('all')) { + return ['all'] + } + + return serviceTags +} + +async function getFog (fogData, isCLI, transaction) { + await Validator.validate(fogData, Validator.schemas.iofogGet) + + const queryFogData = fogData.uuid ? { uuid: fogData.uuid } : { name: fogData.name } + + const fog = await FogManager.findOneWithTags(queryFogData, transaction) + if (!fog) { + throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.INVALID_IOFOG_UUID, fogData.uuid)) + } + + return _getFogExtraInformation(fog, transaction) +} + +async function getFogEndPoint (fogData, isCLI, transaction) { + return getFog(fogData, isCLI, transaction) +} + +// async function getFogListEndPoint (filters, isCLI, isSystem, transaction) { +async function getFogListEndPoint (filters, isCLI, transaction) { + await Validator.validate(filters, Validator.schemas.iofogFilters) + + // // If listing system agent through REST API, make sure user is authenticated + // if (isSystem && !isCLI && !lget('id')) { + // throw new Errors.AuthenticationError('Unauthorized') + // } + + // const queryFogData = isSystem ? { isSystem } : (isCLI ? {} : { isSystem: false }) + const queryFogData = {} + + let fogs = await FogManager.findAllWithTags(queryFogData, transaction) + fogs = _filterFogs(fogs, filters) + + // Map all tags + // Get router config info for all fogs + fogs = await Promise.all(fogs.map(async (fog) => _getFogExtraInformation(fog, transaction))) + return { + fogs + } +} + +async function generateProvisioningKeyEndPoint (fogData, isCLI, transaction) { + await Validator.validate(fogData, Validator.schemas.iofogGenerateProvision) + + const queryFogData = { uuid: fogData.uuid } + + const newProvision = { + iofogUuid: fogData.uuid, + provisionKey: AppHelper.generateRandomString(16), + expirationTime: new Date().getTime() + (10 * 60 * 1000) + } + + const fog = await FogManager.findOne(queryFogData, transaction) + if (!fog) { + throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.INVALID_IOFOG_UUID, fogData.uuid)) + } + + const provisioningKeyData = await FogProvisionKeyManager.updateOrCreate({ iofogUuid: fogData.uuid }, newProvision, transaction) + + const devMode = process.env.DEV_MODE || config.get('server.devMode') + const sslCert = process.env.SSL_CERT || config.get('server.ssl.path.cert') + const intermedKey = process.env.INTERMEDIATE_CERT || config.get('server.ssl.path.intermediateCert') + const sslCertBase64 = config.get('server.ssl.base64.cert') + const intermedKeyBase64 = config.get('server.ssl.base64.intermediateCert') + const hasFileBasedSSL = !devMode && sslCert + const hasBase64SSL = !devMode && sslCertBase64 + let caCert = '' + + if (!devMode) { + if (hasFileBasedSSL) { + try { + if (intermedKey) { + const certData = fs.readFileSync(intermedKey) + caCert = Buffer.from(certData).toString('base64') + } else { + const certData = fs.readFileSync(sslCert) + caCert = Buffer.from(certData).toString('base64') + } + } catch (error) { + throw new Errors.ValidationError('Failed to read SSL certificate file') + } + } + if (hasBase64SSL) { + if (intermedKeyBase64) { + caCert = intermedKeyBase64 + } else if (sslCertBase64) { + caCert = sslCertBase64 + } + } + } + return { + key: provisioningKeyData.provisionKey, + expirationTime: provisioningKeyData.expirationTime, + caCert: caCert + } +} + +async function setFogVersionCommandEndPoint (fogVersionData, isCLI, transaction) { + await Validator.validate(fogVersionData, Validator.schemas.iofogSetVersionCommand) + + const queryFogData = { uuid: fogVersionData.uuid } + + const newVersionCommand = { + iofogUuid: fogVersionData.uuid, + versionCommand: fogVersionData.versionCommand + } + + const fog = await FogManager.findOne(queryFogData, transaction) + if (!fog) { + throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.INVALID_IOFOG_UUID, queryFogData.uuid)) + } + + if (!fog.isReadyToRollback && fogVersionData.versionCommand === 'rollback') { + throw new Errors.ValidationError(ErrorMessages.INVALID_VERSION_COMMAND_ROLLBACK) + } + if (!fog.isReadyToUpgrade && fogVersionData.versionCommand === 'upgrade') { + throw new Errors.ValidationError(ErrorMessages.INVALID_VERSION_COMMAND_UPGRADE) + } + + await generateProvisioningKeyEndPoint({ uuid: fogVersionData.uuid }, isCLI, transaction) + await FogVersionCommandManager.updateOrCreate({ iofogUuid: fogVersionData.uuid }, newVersionCommand, transaction) + await ChangeTrackingService.update(fogVersionData.uuid, ChangeTrackingService.events.version, transaction) +} + +async function setFogRebootCommandEndPoint (fogData, isCLI, transaction) { + await Validator.validate(fogData, Validator.schemas.iofogReboot) + + const queryFogData = { uuid: fogData.uuid } + + const fog = await FogManager.findOne(queryFogData, transaction) + if (!fog) { + throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.INVALID_IOFOG_UUID, fogData.uuid)) + } + + await ChangeTrackingService.update(fogData.uuid, ChangeTrackingService.events.reboot, transaction) +} + +async function getHalHardwareInfoEndPoint (uuidObj, isCLI, transaction) { + await Validator.validate(uuidObj, Validator.schemas.halGet) + + const fog = await FogManager.findOne({ + uuid: uuidObj.uuid + }, transaction) + if (!fog) { + throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.INVALID_IOFOG_UUID, uuidObj.uuid)) + } + + return HWInfoManager.findOne({ + iofogUuid: uuidObj.uuid + }, transaction) +} + +async function getHalUsbInfoEndPoint (uuidObj, isCLI, transaction) { + await Validator.validate(uuidObj, Validator.schemas.halGet) + + const fog = await FogManager.findOne({ + uuid: uuidObj.uuid + }, transaction) + if (!fog) { + throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.INVALID_IOFOG_UUID, uuidObj.uuid)) + } + + return USBInfoManager.findOne({ + iofogUuid: uuidObj.uuid + }, transaction) +} + +function _filterFogs (fogs, filters) { + if (!filters) { + return fogs + } + + const filtered = [] + fogs.forEach((fog) => { + let isMatchFog = true + filters.some((filter) => { + const fld = filter.key + const val = filter.value + const condition = filter.condition + const isMatchField = (condition === 'equals' && fog[fld] && fog[fld] === val) || + (condition === 'has' && fog[fld] && fog[fld].includes(val)) + if (!isMatchField) { + isMatchFog = false + return false + } + }) + if (isMatchFog) { + filtered.push(fog) + } + }) + return filtered +} + +async function _processDeleteCommand (fog, transaction) { + const microservices = await MicroserviceManager.findAll({ iofogUuid: fog.uuid }, transaction) + for (const microservice of microservices) { + await MicroserviceService.deleteMicroserviceWithRoutesAndPortMappings(microservice, transaction) + } + + await ChangeTrackingService.update(fog.uuid, ChangeTrackingService.events.deleteNode, transaction) + await FogManager.delete({ uuid: fog.uuid }, transaction) +} + +async function _createHalMicroserviceForFog (fogData, oldFog, transaction) { + const halItem = await CatalogService.getHalCatalogItem(transaction) + + const halMicroserviceData = { + uuid: AppHelper.generateUUID(), + name: `hal-${fogData.uuid.toLowerCase()}`, + config: '{}', + catalogItemId: halItem.id, + iofogUuid: fogData.uuid, + rootHostAccess: true, + logSize: Constants.MICROSERVICE_DEFAULT_LOG_SIZE, + configLastUpdated: Date.now() + } + + const application = await ApplicationManager.findOne({ name: `system-${fogData.uuid.toLowerCase()}` }, transaction) + halMicroserviceData.applicationId = application.id + await MicroserviceManager.create(halMicroserviceData, transaction) + await MicroserviceStatusManager.create({ microserviceUuid: halMicroserviceData.uuid }, transaction) +} + +async function _deleteHalMicroserviceByFog (fogData, transaction) { + const halItem = await CatalogService.getHalCatalogItem(transaction) + const deleteHalMicroserviceData = { + iofogUuid: fogData.uuid, + catalogItemId: halItem.id + } + + const application = await ApplicationManager.findOne({ name: `system-${fogData.uuid.toLowerCase()}` }, transaction) + deleteHalMicroserviceData.applicationId = application.id + await MicroserviceManager.delete(deleteHalMicroserviceData, transaction) +} + +async function _createBluetoothMicroserviceForFog (fogData, oldFog, transaction) { + const bluetoothItem = await CatalogService.getBluetoothCatalogItem(transaction) + + const bluetoothMicroserviceData = { + uuid: AppHelper.generateUUID(), + name: `ble-${fogData.uuid.toLowerCase()}`, + config: '{}', + catalogItemId: bluetoothItem.id, + iofogUuid: fogData.uuid, + rootHostAccess: true, + logSize: Constants.MICROSERVICE_DEFAULT_LOG_SIZE, + configLastUpdated: Date.now() + } + + const application = await ApplicationManager.findOne({ name: `system-${fogData.uuid.toLowerCase()}` }, transaction) + bluetoothMicroserviceData.applicationId = application.id + await MicroserviceManager.create(bluetoothMicroserviceData, transaction) + await MicroserviceStatusManager.create({ microserviceUuid: bluetoothMicroserviceData.uuid }, transaction) +} + +async function _deleteBluetoothMicroserviceByFog (fogData, transaction) { + const bluetoothItem = await CatalogService.getBluetoothCatalogItem(transaction) + const deleteBluetoothMicroserviceData = { + iofogUuid: fogData.uuid, + catalogItemId: bluetoothItem.id + } + const application = await ApplicationManager.findOne({ name: `system-${fogData.uuid.toLowerCase()}` }, transaction) + deleteBluetoothMicroserviceData.applicationId = application.id + + await MicroserviceManager.delete(deleteBluetoothMicroserviceData, transaction) +} + +async function setFogPruneCommandEndPoint (fogData, isCLI, transaction) { + await Validator.validate(fogData, Validator.schemas.iofogPrune) + + const queryFogData = { uuid: fogData.uuid } + + const fog = await FogManager.findOne(queryFogData, transaction) + if (!fog) { + throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.INVALID_IOFOG_UUID, fogData.uuid)) + } + + await ChangeTrackingService.update(fogData.uuid, ChangeTrackingService.events.prune, transaction) +} + +/** + * Finds services that match the fog node's service tags + * @param {Array} serviceTags - Array of service tags from fog node + * @param {Object} transaction - Database transaction + * @returns {Promise>} Array of matching services + */ +async function _findMatchingServices (serviceTags, transaction) { + if (!serviceTags || serviceTags.length === 0) { + return [] + } + + // If 'all' tag is present, get all services + if (serviceTags.includes('all')) { + return ServiceManager.findAllWithTags({}, transaction) + } + + // For each service tag, find matching services + const servicesPromises = serviceTags.map(async (tag) => { + const queryData = { + '$tags.value$': `${tag}` + } + return ServiceManager.findAllWithTags(queryData, transaction) + }) + + // Wait for all queries to complete + const servicesArrays = await Promise.all(servicesPromises) + + // Flatten arrays and remove duplicates based on service name + const seen = new Set() + const uniqueServices = servicesArrays + .flat() + .filter(service => { + if (seen.has(service.name)) { + return false + } + seen.add(service.name) + return true + }) + + return uniqueServices +} + +/** + * Builds TCP listener configuration for a service on a specific fog node + * @param {Object} service - Service object containing name and bridgePort + * @param {string} fogNodeUuid - UUID of the fog node + * @returns {Object} TCP listener configuration + */ +function _buildTcpListenerForFog (service, fogNodeUuid) { + return { + name: `${service.name}-listener`, + port: service.bridgePort.toString(), + address: service.name, + siteId: fogNodeUuid + } +} + +/** + * Gets the router microservice configuration for a fog node + * @param {string} fogNodeUuid - UUID of the fog node + * @param {Object} transaction - Database transaction + * @returns {Promise} Router microservice configuration + */ +async function _getRouterMicroserviceConfig (fogNodeUuid, transaction) { + const routerName = `router-${fogNodeUuid.toLowerCase()}` + const routerMicroservice = await MicroserviceManager.findOne({ name: routerName }, transaction) + if (!routerMicroservice) { + throw new Errors.NotFoundError(`Router microservice not found: ${routerName}`) + } + const routerConfig = JSON.parse(routerMicroservice.config || '{}') + return routerConfig +} + +/** + * Extracts existing TCP connectors from router configuration + * @param {string} fogNodeUuid - UUID of the fog node + * @param {Object} transaction - Database transaction + * @returns {Promise} Object containing TCP connectors + */ +async function _extractExistingTcpConnectors (fogNodeUuid, transaction) { + const routerConfig = await _getRouterMicroserviceConfig(fogNodeUuid, transaction) + // Return empty object if no bridges or tcpConnectors exist + if (!routerConfig.bridges || !routerConfig.bridges.tcpConnectors) { + return {} + } + + return routerConfig.bridges.tcpConnectors +} + +/** + * Merges a single TCP connector into router configuration + * @param {Object} routerConfig - Base router configuration + * @param {Object} connectorObj - TCP connector object (must have 'name' property) + * @returns {Object} Updated router configuration + */ +function _mergeTcpConnector (routerConfig, connectorObj) { + if (!connectorObj || !connectorObj.name) { + throw new Error('Connector object must have a name property') + } + if (!routerConfig.bridges) { + routerConfig.bridges = {} + } + if (!routerConfig.bridges.tcpConnectors) { + routerConfig.bridges.tcpConnectors = {} + } + routerConfig.bridges.tcpConnectors[connectorObj.name] = connectorObj + return routerConfig +} + +/** + * Merges a single TCP listener into router configuration + * @param {Object} routerConfig - Base router configuration + * @param {Object} listenerObj - TCP listener object (must have 'name' property) + * @returns {Object} Updated router configuration + */ +function _mergeTcpListener (routerConfig, listenerObj) { + if (!listenerObj || !listenerObj.name) { + throw new Error('Listener object must have a name property') + } + if (!routerConfig.bridges) { + routerConfig.bridges = {} + } + if (!routerConfig.bridges.tcpListeners) { + routerConfig.bridges.tcpListeners = {} + } + routerConfig.bridges.tcpListeners[listenerObj.name] = listenerObj + return routerConfig +} + +module.exports = { + createFogEndPoint: TransactionDecorator.generateTransaction(createFogEndPoint), + updateFogEndPoint: TransactionDecorator.generateTransaction(updateFogEndPoint), + deleteFogEndPoint: TransactionDecorator.generateTransaction(deleteFogEndPoint), + getFogEndPoint: TransactionDecorator.generateTransaction(getFogEndPoint), + getFogListEndPoint: TransactionDecorator.generateTransaction(getFogListEndPoint), + generateProvisioningKeyEndPoint: TransactionDecorator.generateTransaction(generateProvisioningKeyEndPoint), + setFogVersionCommandEndPoint: TransactionDecorator.generateTransaction(setFogVersionCommandEndPoint), + setFogRebootCommandEndPoint: TransactionDecorator.generateTransaction(setFogRebootCommandEndPoint), + getHalHardwareInfoEndPoint: TransactionDecorator.generateTransaction(getHalHardwareInfoEndPoint), + getHalUsbInfoEndPoint: TransactionDecorator.generateTransaction(getHalUsbInfoEndPoint), + getFog: getFog, + setFogPruneCommandEndPoint: TransactionDecorator.generateTransaction(setFogPruneCommandEndPoint), + _extractServiceTags, + _findMatchingServices: TransactionDecorator.generateTransaction(_findMatchingServices), + _buildTcpListenerForFog, + _getRouterMicroserviceConfig: TransactionDecorator.generateTransaction(_getRouterMicroserviceConfig), + _extractExistingTcpConnectors: TransactionDecorator.generateTransaction(_extractExistingTcpConnectors), + _mergeTcpConnector, + _mergeTcpListener, + checkKubernetesEnvironment, + _handleRouterCertificates: TransactionDecorator.generateTransaction(_handleRouterCertificates) +} diff --git a/test/backup/services-service.js b/test/backup/services-service.js new file mode 100644 index 000000000..f2dd81ca2 --- /dev/null +++ b/test/backup/services-service.js @@ -0,0 +1,1261 @@ +/* + * ******************************************************************************* + * * Copyright (c) 2023 Datasance Teknoloji A.S. + * * + * * This program and the accompanying materials are made available under the + * * terms of the Eclipse Public License v. 2.0 which is available at + * * http://www.eclipse.org/legal/epl-2.0 + * * + * * SPDX-License-Identifier: EPL-2.0 + * ******************************************************************************* + * + */ + +const TransactionDecorator = require('../decorators/transaction-decorator') +const ServiceManager = require('../data/managers/service-manager') +const MicroserviceManager = require('../data/managers/microservice-manager') +const RouterManager = require('../data/managers/router-manager') +const RouterConnectionManager = require('../data/managers/router-connection-manager') +const K8sClient = require('../utils/k8s-client') +const AppHelper = require('../helpers/app-helper') +const config = require('../config') +const Errors = require('../helpers/errors') +const ErrorMessages = require('../helpers/error-messages') +const Validator = require('../schemas') +const logger = require('../logger') +const FogManager = require('../data/managers/iofog-manager') +const TagsManager = require('../data/managers/tags-manager') +const ChangeTrackingService = require('./change-tracking-service') +const ApplicationManager = require('../data/managers/application-manager') +// const { Op } = require('sequelize') + +const K8S_ROUTER_CONFIG_MAP = 'pot-router' +const SERVICE_ANNOTATION_TAG = 'service.datasance.com/tag' + +// Map service tags to string array +// Return plain JS object +function _mapTags (service) { + return service.tags ? service.tags.map(t => t.value) : [] +} + +async function _setTags (serviceModel, tagsArray, transaction) { + if (tagsArray) { + let tags = [] + for (const tag of tagsArray) { + let tagModel = await TagsManager.findOne({ value: tag }, transaction) + if (!tagModel) { + tagModel = await TagsManager.create({ value: tag }, transaction) + } + tags.push(tagModel) + } + await serviceModel.setTags(tags) + } +} + +async function handleServiceDistribution (serviceTags, transaction) { + // Always find fog nodes with 'all' tag + const allTaggedFogNodes = await FogManager.findAllWithTags({ + '$tags.value$': `${SERVICE_ANNOTATION_TAG}: all` + }, transaction) + + // If serviceTags is null or empty, return only fog nodes with 'all' tag + if (!serviceTags || serviceTags.length === 0) { + const uuids = allTaggedFogNodes.map(fog => fog.uuid) + return uuids + } + + // Filter tags that don't contain ':' or '=' + const filteredServiceTags = serviceTags + .filter(tag => tag != null) + .map(tag => String(tag)) + .filter(tag => !tag.includes(':') && !tag.includes('=')) + .filter(tag => tag.length > 0) + + if (filteredServiceTags.length === 0) { + const uuids = allTaggedFogNodes.map(fog => fog.uuid) + return uuids + } + + // Find fog nodes for each filtered tag + const specificTaggedFogNodes = new Set() + for (const tag of filteredServiceTags) { + const fogNodes = await FogManager.findAllWithTags({ + '$tags.value$': `${SERVICE_ANNOTATION_TAG}: ${tag}` + }, transaction) + fogNodes.forEach(fog => specificTaggedFogNodes.add(fog.uuid)) + } + + // Get all tag fog node UUIDs + const allTagUuids = allTaggedFogNodes.map(fog => fog.uuid) + + // Combine both sets of fog nodes and remove duplicates + const allFogUuids = new Set([...allTagUuids, ...Array.from(specificTaggedFogNodes)]) + + return Array.from(allFogUuids) +} + +async function checkKubernetesEnvironment () { + const controlPlane = process.env.CONTROL_PLANE || config.get('app.ControlPlane') + return controlPlane && controlPlane.toLowerCase() === 'kubernetes' +} + +async function validateNonK8sType (serviceConfig) { + const isK8s = await checkKubernetesEnvironment() + if (serviceConfig.type.toLowerCase() !== 'k8s' && isK8s) { + if (!serviceConfig.k8sType || !serviceConfig.servicePort) { + throw new Errors.ValidationError('Kubernetes environment is required for k8s service type(LoadBalancer or ClusterIP or NodePort) and service port') + } + } +} + +async function _validateServiceName (serviceConfig) { + if (serviceConfig.name.toLowerCase() === 'controller' || serviceConfig.name.toLowerCase() === 'router' || serviceConfig.name.toLowerCase() === 'router-internal' || serviceConfig.name.toLowerCase() === 'docker' || serviceConfig.name.toLowerCase() === 'podman' || serviceConfig.name.toLowerCase() === 'kubernetes') { + throw new Errors.ValidationError('Service name cannot be "controller" or "router" or "router-internal" or "docker"') + } +} + +async function validateMicroserviceType (serviceConfig, transaction) { + if (serviceConfig.type.toLowerCase() !== 'microservice') { + return + } + + let microserviceUuid = serviceConfig.resource + + // If resource contains "/", it means user provided "/" + if (serviceConfig.resource.includes('/')) { + const [appName, microserviceName] = serviceConfig.resource.split('/') + const app = await ApplicationManager.findOne({ name: appName }, transaction) + if (!app) { + throw new Errors.ValidationError(AppHelper.formatMessage(ErrorMessages.INVALID_APPLICATION_NAME, appName)) + } + const microservice = await MicroserviceManager.findOne({ + name: microserviceName, + applicationId: app.id + }, transaction) + + if (!microservice) { + throw new Errors.ValidationError(AppHelper.formatMessage(ErrorMessages.INVALID_MICROSERVICE_NAME, serviceConfig.resource)) + } + + microserviceUuid = microservice.uuid + } else { + // User provided UUID directly, validate if microservice exists + const microservice = await MicroserviceManager.findOne({ uuid: serviceConfig.resource }, transaction) + if (!microservice) { + throw new Errors.ValidationError(AppHelper.formatMessage(ErrorMessages.INVALID_MICROSERVICE_UUID, serviceConfig.resource)) + } + } + + // Update resource to be the microservice UUID + serviceConfig.resource = microserviceUuid +} + +async function validateFogServiceType (serviceConfig, transaction) { + if (serviceConfig.type.toLowerCase() !== 'agent') { + return + } + + // First try to find fog node by name + let fogNode = await FogManager.findOne({ name: serviceConfig.resource }, transaction) + + // If not found by name, try to find by UUID + if (!fogNode) { + fogNode = await FogManager.findOne({ uuid: serviceConfig.resource }, transaction) + } + + // If still not found, throw error + if (!fogNode) { + throw new Errors.ValidationError(AppHelper.formatMessage(ErrorMessages.INVALID_IOFOG_UUID, serviceConfig.resource)) + } + + // Always set resource to be the fog node UUID + serviceConfig.resource = fogNode.uuid +} + +async function validateDefaultBridge (serviceConfig, transaction) { + // If defaultBridge is empty, set it to 'default-router' + if (!serviceConfig.defaultBridge) { + logger.debug('Setting default bridge to default-router') + serviceConfig.defaultBridge = 'default-router' + return + } + + // If service type is not microservice or agent, defaultBridge must be 'default-router' + if (serviceConfig.type.toLowerCase() !== 'microservice' && serviceConfig.type.toLowerCase() !== 'agent') { + if (serviceConfig.defaultBridge !== 'default-router') { + throw new Errors.ValidationError(AppHelper.formatMessage(ErrorMessages.INVALID_DEFAULT_BRIDGE, serviceConfig.defaultBridge)) + } + return + } + + // For microservice or agent type, if user provided a UUID instead of 'default-router' + if (serviceConfig.defaultBridge !== 'default-router') { + let iofogUuid + + if (serviceConfig.type.toLowerCase() === 'microservice') { + // Get the microservice to find its iofog node + const microservice = await MicroserviceManager.findOne({ uuid: serviceConfig.resource }, transaction) + if (!microservice) { + throw new Errors.ValidationError(AppHelper.formatMessage(ErrorMessages.INVALID_MICROSERVICE_UUID, serviceConfig.resource)) + } + iofogUuid = microservice.iofogUuid + } else if (serviceConfig.type.toLowerCase() === 'agent') { + // For agent type, the resource is the agent UUID + iofogUuid = serviceConfig.resource + } + + // Get the router for the iofog node + const router = await RouterManager.findOne({ iofogUuid: iofogUuid }, transaction) + if (!router) { + throw new Errors.ValidationError(AppHelper.formatMessage(ErrorMessages.INVALID_ROUTER, iofogUuid)) + } + + // Check if the router has a connection to the specified upstream router + const upstreamRouter = await RouterManager.findOne({ iofogUuid: serviceConfig.defaultBridge }, transaction) + if (!upstreamRouter) { + throw new Errors.ValidationError(AppHelper.formatMessage(ErrorMessages.INVALID_ROUTER, serviceConfig.defaultBridge)) + } + + const routerConnection = await RouterConnectionManager.findOne({ + sourceRouter: router.id, + destRouter: upstreamRouter.id + }, transaction) + + if (!routerConnection) { + throw new Errors.ValidationError(AppHelper.formatMessage(ErrorMessages.INVALID_ROUTER_CONNECTION, serviceConfig.defaultBridge, router.id)) + } + } +} + +async function defineBridgePort (serviceConfig, transaction) { + // Get bridge port range from environment or config + const bridgePortRangeStr = process.env.BRIDGE_PORTS_RANGE || config.get('bridgePorts.range') || '10024-65535' + const [startStr, endStr] = bridgePortRangeStr.split('-') + const start = parseInt(startStr) + const end = parseInt(endStr) + + // Get all existing services to check used ports + const existingServices = await ServiceManager.findAll({}, transaction) + const usedPorts = new Set(existingServices.map(service => service.bridgePort)) + + // Find the first available port in the range + let bridgePort = start + while (bridgePort <= end) { + if (!usedPorts.has(bridgePort)) { + serviceConfig.bridgePort = bridgePort + return + } + bridgePort++ + } + + // If we get here, no ports are available + throw new Errors.ValidationError(AppHelper.formatMessage(ErrorMessages.NO_AVAILABLE_BRIDGE_PORT, bridgePortRangeStr)) +} + +// Helper function to determine host based on service type +async function _determineConnectorHost (serviceConfig, transaction) { + switch (serviceConfig.type.toLowerCase()) { + case 'microservice': + const microservice = await MicroserviceManager.findOne({ uuid: serviceConfig.resource }, transaction) + if (microservice.rootHostAccess) { + return 'iofog' + } else { + return `iofog_${serviceConfig.resource}` + } + case 'agent': + return 'iofog' + case 'k8s': + case 'external': + return serviceConfig.resource + default: + throw new Errors.ValidationError(`Invalid service type: ${serviceConfig.type}`) + } +} + +// Helper function to determine siteId for connector +async function _determineConnectorSiteId (serviceConfig, transaction) { + switch (serviceConfig.type.toLowerCase()) { + case 'microservice': { + const microservice = await MicroserviceManager.findOne({ uuid: serviceConfig.resource }, transaction) + if (!microservice) { + throw new Errors.NotFoundError(`Microservice not found: ${serviceConfig.resource}`) + } + return microservice.iofogUuid + } + case 'agent': + return serviceConfig.resource + case 'k8s': + case 'external': + return 'default-router' + default: + throw new Errors.ValidationError(`Invalid service type: ${serviceConfig.type}`) + } +} + +// Helper function to determine processId for connector +async function _determineConnectorProcessId (serviceConfig) { + switch (serviceConfig.type.toLowerCase()) { + case 'microservice': + return serviceConfig.resource + case 'agent': + return `${serviceConfig.resource}-local-${serviceConfig.targetPort}` + case 'k8s': + return `${serviceConfig.resource}-k8s-${serviceConfig.targetPort}` + case 'external': + return `${serviceConfig.resource}-external-${serviceConfig.targetPort}` + default: + throw new Errors.ValidationError(`Invalid service type: ${serviceConfig.type}`) + } +} + +// Helper function to build tcpConnector configuration +async function _buildTcpConnector (serviceConfig, transaction) { + const host = await _determineConnectorHost(serviceConfig, transaction) + const siteId = await _determineConnectorSiteId(serviceConfig, transaction) + const processId = await _determineConnectorProcessId(serviceConfig) + + return { + name: `${serviceConfig.name}-connector`, + host, + port: serviceConfig.targetPort.toString(), + address: serviceConfig.name, + siteId, + processId + } +} + +// Helper function to build tcpListener configuration +async function _buildTcpListener (serviceConfig, fogNodeUuid = null) { + const listener = { + name: `${serviceConfig.name}-listener`, + port: serviceConfig.bridgePort.toString(), + address: serviceConfig.name, + siteId: fogNodeUuid || serviceConfig.defaultBridge + } + return listener +} + +// Helper function to get router microservice by fog node UUID +async function _getRouterMicroservice (fogNodeUuid, transaction) { + const routerName = `router-${fogNodeUuid.toLowerCase()}` + const routerMicroservice = await MicroserviceManager.findOne({ name: routerName }, transaction) + if (!routerMicroservice) { + throw new Errors.NotFoundError(`Router microservice not found: ${routerName}`) + } + return routerMicroservice +} + +// Helper function to update router config in Kubernetes environment +async function _updateK8sRouterConfig (config) { + const configMap = await K8sClient.getConfigMap(K8S_ROUTER_CONFIG_MAP) + if (!configMap) { + throw new Errors.NotFoundError(`ConfigMap not found: ${K8S_ROUTER_CONFIG_MAP}`) + } + + const patchData = { + data: { + 'skrouterd.json': JSON.stringify(config) + } + } + + await K8sClient.patchConfigMap(K8S_ROUTER_CONFIG_MAP, patchData) +} + +// Helper function to update router microservice config +async function _updateRouterMicroserviceConfig (fogNodeUuid, config, transaction) { + const routerMicroservice = await _getRouterMicroservice(fogNodeUuid, transaction) + + // Update microservice with the provided config + await MicroserviceManager.update( + { uuid: routerMicroservice.uuid }, + { config: JSON.stringify(config) }, + transaction + ) + + // Update change tracking + await ChangeTrackingService.update(fogNodeUuid, ChangeTrackingService.events.microserviceConfig, transaction) +} + +// Helper function to add tcpConnector to router config +async function _addTcpConnector (serviceConfig, transaction) { + const isK8s = await checkKubernetesEnvironment() + const connector = await _buildTcpConnector(serviceConfig, transaction) + const siteId = connector.siteId + + if (siteId === 'default-router') { + if (isK8s) { + // Update K8s router config + logger.debug('Updating K8s router config') + const configMap = await K8sClient.getConfigMap(K8S_ROUTER_CONFIG_MAP) + if (!configMap) { + logger.error('ConfigMap not found:' + K8S_ROUTER_CONFIG_MAP) + throw new Errors.NotFoundError(`ConfigMap not found: ${K8S_ROUTER_CONFIG_MAP}`) + } + + const routerConfig = JSON.parse(configMap.data['skrouterd.json']) + // Add new connector to the array + routerConfig.push(['tcpConnector', connector]) + + await _updateK8sRouterConfig(routerConfig) + } else { + // Update default router microservice config + const defaultRouter = await RouterManager.findOne({ isDefault: true }, transaction) + if (!defaultRouter) { + logger.error('Default router not found') + throw new Errors.NotFoundError('Default router not found') + } + const fogNodeUuid = defaultRouter.iofogUuid + const routerMicroservice = await _getRouterMicroservice(fogNodeUuid, transaction) + const currentConfig = JSON.parse(routerMicroservice.config || '{}') + + if (!currentConfig.bridges) { + currentConfig.bridges = {} + } + if (!currentConfig.bridges.tcpConnectors) { + currentConfig.bridges.tcpConnectors = {} + } + currentConfig.bridges.tcpConnectors[connector.name] = connector + + await _updateRouterMicroserviceConfig(fogNodeUuid, currentConfig, transaction) + } + } else { + // Update specific router microservice config + const fogNodeUuid = siteId + const routerMicroservice = await _getRouterMicroservice(fogNodeUuid, transaction) + const currentConfig = JSON.parse(routerMicroservice.config || '{}') + + if (!currentConfig.bridges) { + currentConfig.bridges = {} + } + if (!currentConfig.bridges.tcpConnectors) { + currentConfig.bridges.tcpConnectors = {} + } + currentConfig.bridges.tcpConnectors[connector.name] = connector + + await _updateRouterMicroserviceConfig(fogNodeUuid, currentConfig, transaction) + } +} + +// Helper function to add tcpListener to router config +async function _addTcpListener (serviceConfig, transaction) { + const isK8s = await checkKubernetesEnvironment() + + // First handle K8s case if we're in K8s environment + if (isK8s) { + const k8sListener = await _buildTcpListener(serviceConfig, null) // null for K8s case + const configMap = await K8sClient.getConfigMap(K8S_ROUTER_CONFIG_MAP) + if (!configMap) { + logger.error('ConfigMap not found:' + K8S_ROUTER_CONFIG_MAP) + throw new Errors.NotFoundError(`ConfigMap not found: ${K8S_ROUTER_CONFIG_MAP}`) + } + + const routerConfig = JSON.parse(configMap.data['skrouterd.json']) + // Add new listener to the array + routerConfig.push(['tcpListener', k8sListener]) + + await _updateK8sRouterConfig(routerConfig) + } + + // Handle distributed router microservice cases + // Get list of fog nodes that need this listener + const fogNodeUuids = await handleServiceDistribution(serviceConfig.tags, transaction) + + // If not in K8s environment, always include default router + if (!isK8s) { + const defaultRouter = await RouterManager.findOne({ isDefault: true }, transaction) + if (!defaultRouter) { + logger.error('Default router not found') + throw new Errors.NotFoundError('Default router not found') + } + // Add default router if not already in the list + if (!fogNodeUuids.includes(defaultRouter.iofogUuid)) { + fogNodeUuids.push(defaultRouter.iofogUuid) + } + } + // else if (!fogNodeUuids || fogNodeUuids.length === 0) { + // // If in K8s and no fog nodes found, add default router + // const defaultRouter = await RouterManager.findOne({ isDefault: true }, transaction) + // if (!defaultRouter) { + // logger.error('Default router not found') + // throw new Errors.NotFoundError('Default router not found') + // } + // fogNodeUuids.push(defaultRouter.iofogUuid) + // } + + // Add listener to each router microservice + for (const fogNodeUuid of fogNodeUuids) { + try { + const listener = await _buildTcpListener(serviceConfig, fogNodeUuid) + const routerMicroservice = await _getRouterMicroservice(fogNodeUuid, transaction) + const currentConfig = JSON.parse(routerMicroservice.config || '{}') + if (!currentConfig.bridges) currentConfig.bridges = {} + if (!currentConfig.bridges.tcpListeners) currentConfig.bridges.tcpListeners = {} + currentConfig.bridges.tcpListeners[listener.name] = listener + await _updateRouterMicroserviceConfig(fogNodeUuid, currentConfig, transaction) + } catch (err) { + if (err instanceof Errors.NotFoundError) { + logger.info(`Router microservice not found for fogNodeUuid ${fogNodeUuid}, skipping.`) + continue + } + throw err + } + } +} + +// Helper function to update tcpConnector in router config +async function _updateTcpConnector (serviceConfig, transaction) { + const isK8s = await checkKubernetesEnvironment() + const connector = await _buildTcpConnector(serviceConfig, transaction) + const siteId = connector.siteId + + if (siteId === 'default-router') { + if (isK8s) { + // Update K8s router config + const configMap = await K8sClient.getConfigMap(K8S_ROUTER_CONFIG_MAP) + if (!configMap) { + throw new Errors.NotFoundError(`ConfigMap not found: ${K8S_ROUTER_CONFIG_MAP}`) + } + + const routerConfig = JSON.parse(configMap.data['skrouterd.json']) + // Find and update the existing connector + const connectorIndex = routerConfig.findIndex(item => + item[0] === 'tcpConnector' && item[1].name === connector.name + ) + if (connectorIndex !== -1) { + routerConfig[connectorIndex] = ['tcpConnector', connector] + } + + await _updateK8sRouterConfig(routerConfig) + } else { + // Update default router microservice config + const defaultRouter = await RouterManager.findOne({ isDefault: true }, transaction) + if (!defaultRouter) { + throw new Errors.NotFoundError('Default router not found') + } + const fogNodeUuid = defaultRouter.iofogUuid + const routerMicroservice = await _getRouterMicroservice(fogNodeUuid, transaction) + const currentConfig = JSON.parse(routerMicroservice.config || '{}') + + if (!currentConfig.bridges) { + currentConfig.bridges = {} + } + if (!currentConfig.bridges.tcpConnectors) { + currentConfig.bridges.tcpConnectors = {} + } + // Update the connector with the same name + currentConfig.bridges.tcpConnectors[connector.name] = connector + + await _updateRouterMicroserviceConfig(fogNodeUuid, currentConfig, transaction) + } + } else { + // Update specific router microservice config + const fogNodeUuid = siteId + const routerMicroservice = await _getRouterMicroservice(fogNodeUuid, transaction) + const currentConfig = JSON.parse(routerMicroservice.config || '{}') + + if (!currentConfig.bridges) { + currentConfig.bridges = {} + } + if (!currentConfig.bridges.tcpConnectors) { + currentConfig.bridges.tcpConnectors = {} + } + // Update the connector with the same name + currentConfig.bridges.tcpConnectors[connector.name] = connector + + await _updateRouterMicroserviceConfig(fogNodeUuid, currentConfig, transaction) + } +} + +// Helper function to update tcpListener in router config +async function _updateTcpListener (serviceConfig, transaction) { + const isK8s = await checkKubernetesEnvironment() + + // First handle K8s case if we're in K8s environment + if (isK8s) { + const k8sListener = await _buildTcpListener(serviceConfig, null) // null for K8s case + const configMap = await K8sClient.getConfigMap(K8S_ROUTER_CONFIG_MAP) + if (!configMap) { + throw new Errors.NotFoundError(`ConfigMap not found: ${K8S_ROUTER_CONFIG_MAP}`) + } + + const routerConfig = JSON.parse(configMap.data['skrouterd.json']) + // Update the listener in the array + const listenerIndex = routerConfig.findIndex(item => + item[0] === 'tcpListener' && item[1].name === k8sListener.name + ) + if (listenerIndex !== -1) { + routerConfig[listenerIndex] = ['tcpListener', k8sListener] + } else { + routerConfig.push(['tcpListener', k8sListener]) + } + + await _updateK8sRouterConfig(routerConfig) + } + + // Handle distributed router microservice cases + // Get list of fog nodes that need this listener + const fogNodeUuids = await handleServiceDistribution(serviceConfig.tags, transaction) + // If not in K8s environment, always include default router + if (!isK8s) { + const defaultRouter = await RouterManager.findOne({ isDefault: true }, transaction) + if (!defaultRouter) { + throw new Errors.NotFoundError('Default router not found') + } + // Add default router if not already in the list + if (!fogNodeUuids.includes(defaultRouter.iofogUuid)) { + fogNodeUuids.push(defaultRouter.iofogUuid) + } + } + // else if (!fogNodeUuids || fogNodeUuids.length === 0) { + // // If in K8s and no fog nodes found, add default router + // const defaultRouter = await RouterManager.findOne({ isDefault: true }, transaction) + // if (!defaultRouter) { + // throw new Errors.NotFoundError('Default router not found') + // } + // fogNodeUuids.push(defaultRouter.iofogUuid) + // } + + // Update listener in each router microservice + for (const fogNodeUuid of fogNodeUuids) { + try { + const listener = await _buildTcpListener(serviceConfig, fogNodeUuid) + const routerMicroservice = await _getRouterMicroservice(fogNodeUuid, transaction) + const currentConfig = JSON.parse(routerMicroservice.config || '{}') + + if (!currentConfig.bridges) { + currentConfig.bridges = {} + } + if (!currentConfig.bridges.tcpListeners) { + currentConfig.bridges.tcpListeners = {} + } + // Update listener with its name as key + currentConfig.bridges.tcpListeners[listener.name] = listener + + await _updateRouterMicroserviceConfig(fogNodeUuid, currentConfig, transaction) + } catch (err) { + if (err instanceof Errors.NotFoundError) { + logger.info(`Router microservice not found for fogNodeUuid ${fogNodeUuid}, skipping.`) + continue + } + throw err + } + } +} + +// Helper function to delete tcpConnector from router config +async function _deleteTcpConnector (serviceName, transaction) { + const isK8s = await checkKubernetesEnvironment() + const connectorName = `${serviceName}-connector` + + // Get service to determine if it's using default router + const service = await ServiceManager.findOne({ name: serviceName }, transaction) + if (!service) { + throw new Errors.NotFoundError(`Service not found: ${serviceName}`) + } + + const isDefaultRouter = service.defaultBridge === 'default-router' + let microserviceSource = null + if (service.type === 'microservice') { + microserviceSource = await MicroserviceManager.findOne({ uuid: service.resource }, transaction) + } + + if (isDefaultRouter && !microserviceSource) { + if (isK8s) { + // Update K8s router config + const configMap = await K8sClient.getConfigMap(K8S_ROUTER_CONFIG_MAP) + if (!configMap) { + throw new Errors.NotFoundError(`ConfigMap not found: ${K8S_ROUTER_CONFIG_MAP}`) + } + + const routerConfig = JSON.parse(configMap.data['skrouterd.json']) + // Remove the connector from the array + const updatedConfig = routerConfig.filter(item => + !(item[0] === 'tcpConnector' && item[1].name === connectorName) + ) + + await _updateK8sRouterConfig(updatedConfig) + } else { + // Update default router microservice config + const defaultRouter = await RouterManager.findOne({ isDefault: true }, transaction) + if (!defaultRouter) { + throw new Errors.NotFoundError('Default router not found') + } + const fogNodeUuid = defaultRouter.iofogUuid + const routerMicroservice = await _getRouterMicroservice(fogNodeUuid, transaction) + const currentConfig = JSON.parse(routerMicroservice.config || '{}') + + if (currentConfig.bridges && currentConfig.bridges.tcpConnectors) { + delete currentConfig.bridges.tcpConnectors[connectorName] + } + + await _updateRouterMicroserviceConfig(fogNodeUuid, currentConfig, transaction) + } + } else { + let fogNodeUuid = null + if (microserviceSource) { + fogNodeUuid = microserviceSource.iofogUuid + } else { + fogNodeUuid = service.defaultBridge // This is the actual fogNodeUuid for non-default router + } + const routerMicroservice = await _getRouterMicroservice(fogNodeUuid, transaction) + const currentConfig = JSON.parse(routerMicroservice.config || '{}') + + if (currentConfig.bridges && currentConfig.bridges.tcpConnectors) { + delete currentConfig.bridges.tcpConnectors[connectorName] + } + + await _updateRouterMicroserviceConfig(fogNodeUuid, currentConfig, transaction) + } +} + +// Helper function to delete tcpListener from router config +async function _deleteTcpListener (serviceName, transaction) { + const isK8s = await checkKubernetesEnvironment() + const listenerName = `${serviceName}-listener` + + // First handle K8s case if we're in K8s environment + if (isK8s) { + const configMap = await K8sClient.getConfigMap(K8S_ROUTER_CONFIG_MAP) + if (!configMap) { + throw new Errors.NotFoundError(`ConfigMap not found: ${K8S_ROUTER_CONFIG_MAP}`) + } + + const routerConfig = JSON.parse(configMap.data['skrouterd.json']) + // Remove the listener from the array + const updatedConfig = routerConfig.filter(item => + !(item[0] === 'tcpListener' && item[1].name === listenerName) + ) + + await _updateK8sRouterConfig(updatedConfig) + } + + // Get service to determine its tags for distribution + const service = await ServiceManager.findOneWithTags({ name: serviceName }, transaction) + if (!service) { + throw new Errors.NotFoundError(`Service not found: ${serviceName}`) + } + + let microserviceSource = null + if (service.type === 'microservice') { + microserviceSource = await MicroserviceManager.findOne({ uuid: service.resource }, transaction) + } + // Handle distributed router microservice cases + // Get list of fog nodes that need this listener removed + const serviceTags = service.tags.map(tag => tag.value) + const fogNodeUuids = await handleServiceDistribution(serviceTags, transaction) + + if (microserviceSource) { + if (!fogNodeUuids.includes(microserviceSource.iofogUuid)) { + fogNodeUuids.push(microserviceSource.iofogUuid) + } + } + // If not in K8s environment, always include default router + if (!isK8s) { + const defaultRouter = await RouterManager.findOne({ isDefault: true }, transaction) + if (!defaultRouter) { + throw new Errors.NotFoundError('Default router not found') + } + // Add default router if not already in the list + if (!fogNodeUuids.includes(defaultRouter.iofogUuid)) { + fogNodeUuids.push(defaultRouter.iofogUuid) + } + } + // else if (!fogNodeUuids || fogNodeUuids.length === 0) { + // // If in K8s and no fog nodes found, add default router + // const defaultRouter = await RouterManager.findOne({ isDefault: true }, transaction) + // if (!defaultRouter) { + // throw new Errors.NotFoundError('Default router not found') + // } + // fogNodeUuids.push(defaultRouter.iofogUuid) + // } + + // Remove listener from each router microservice + for (const fogNodeUuid of fogNodeUuids) { + try { + const routerMicroservice = await _getRouterMicroservice(fogNodeUuid, transaction) + const currentConfig = JSON.parse(routerMicroservice.config || '{}') + if (currentConfig.bridges && currentConfig.bridges.tcpListeners) { + delete currentConfig.bridges.tcpListeners[listenerName] + } + await _updateRouterMicroserviceConfig(fogNodeUuid, currentConfig, transaction) + } catch (err) { + if (err instanceof Errors.NotFoundError) { + logger.info(`Router microservice not found for fogNodeUuid ${fogNodeUuid}, skipping.`) + continue + } + throw err + } + } +} + +// Helper function to create Kubernetes service +async function _createK8sService (serviceConfig, transaction) { + const normalizedTags = serviceConfig.tags.map(tag => tag.includes(':') ? tag : `${tag}:`) + const serviceSpec = { + apiVersion: 'v1', + kind: 'Service', + metadata: { + name: serviceConfig.name, + annotations: normalizedTags.reduce((acc, tag) => { + const [key, value] = tag.split(':') + acc[key] = value || '' + return acc + }, {}) + }, + spec: { + type: serviceConfig.k8sType, + selector: { + application: 'interior-router', + name: 'router', + 'skupper.io/component': 'router' + }, + ports: [{ + port: parseInt(serviceConfig.bridgePort), + targetPort: parseInt(serviceConfig.servicePort), + protocol: 'TCP' + }] + } + } + + const service = await K8sClient.createService(serviceSpec) + + // If LoadBalancer type, wait for and set the external IP + if (serviceConfig.k8sType === 'LoadBalancer') { + const loadBalancerIP = await K8sClient.watchLoadBalancerIP(serviceConfig.name) + if (loadBalancerIP) { + await ServiceManager.update( + { name: serviceConfig.name }, + { serviceEndpoint: loadBalancerIP }, + transaction + ) + } + } + + return service +} + +// Helper function to update Kubernetes service +async function _updateK8sService (serviceConfig, transaction) { + const normalizedTags = serviceConfig.tags.map(tag => tag.includes(':') ? tag : `${tag}:`) + const patchData = { + metadata: { + annotations: normalizedTags.reduce((acc, tag) => { + const [key, value] = tag.split(':') + acc[key] = value || '' + return acc + }, {}) + }, + spec: { + type: serviceConfig.k8sType, + selector: { + application: 'interior-router', + name: 'router', + 'skupper.io/component': 'router' + }, + ports: [{ + port: parseInt(serviceConfig.bridgePort), + targetPort: parseInt(serviceConfig.servicePort), + protocol: 'TCP' + }] + } + } + + logger.debug(`Updating service: ${serviceConfig.name}`) + const service = await K8sClient.updateService(serviceConfig.name, patchData) + + // If LoadBalancer type, wait for and set the external IP + if (serviceConfig.k8sType === 'LoadBalancer') { + const loadBalancerIP = await K8sClient.watchLoadBalancerIP(serviceConfig.name) + if (loadBalancerIP) { + await ServiceManager.update( + { name: serviceConfig.name }, + { serviceEndpoint: loadBalancerIP }, + transaction + ) + } + } + + return service +} + +// Helper function to delete Kubernetes service +async function _deleteK8sService (serviceName) { + await K8sClient.deleteService(serviceName) +} + +// Create service endpoint +async function createServiceEndpoint (serviceData, transaction) { + logger.debug('Creating service with data:' + JSON.stringify(serviceData)) + + // 1. Validate from schemas validator + await Validator.validate(serviceData, Validator.schemas.serviceCreate) + await _validateServiceName(serviceData) + + // 2. Check K8s environment if type is k8s + const isK8s = await checkKubernetesEnvironment() + if (serviceData.type === 'k8s' && !isK8s) { + throw new Errors.ValidationError('Kubernetes environment is required for k8s service type') + } + + if (serviceData.type !== 'k8s' && isK8s) { + logger.debug('Validating non k8s service type') + await validateNonK8sType(serviceData) + } + + // 3. Validate microservice type + if (serviceData.type === 'microservice') { + await validateMicroserviceType(serviceData, transaction) + } + + // 4. Validate agent type + if (serviceData.type === 'agent') { + logger.debug('Validating agent service type') + await validateFogServiceType(serviceData, transaction) + } + + // 5. Validate default bridge + logger.debug('Validating default bridge') + await validateDefaultBridge(serviceData, transaction) + + logger.debug('Defining bridge port') + // 6. Define bridge port + await defineBridgePort(serviceData, transaction) + + let service + try { + // Create service in database first + logger.debug('Creating service in database') + service = await ServiceManager.create(serviceData, transaction) + + // Set tags if provided + logger.debug('Setting tags') + if (serviceData.tags && serviceData.tags.length > 0) { + await _setTags(service, serviceData.tags, transaction) + } + + // 7. Add TCP connector + logger.debug('Adding TCP connector') + await _addTcpConnector(serviceData, transaction) + + // 8. Add TCP listener + logger.debug('Adding TCP listener') + try { + await _addTcpListener(serviceData, transaction) + } catch (error) { + logger.error('Error adding TCP listener:' + error.message + ' ' + error.stack + ' ' + serviceData.name) + throw error + } + + // 9. Create K8s service if needed + if ((serviceData.type === 'microservice' || serviceData.type === 'agent' || serviceData.type === 'external') && isK8s) { + logger.debug('Creating K8s service') + try { + await _createK8sService(serviceData, transaction) + } catch (error) { + logger.error('Error creating K8s service:' + error.message + ' ' + error.stack + ' ' + serviceData.name) + throw error + } + } + + return service + } catch (error) { + logger.error('Error creating service:' + error.message + ' ' + error.stack + ' ' + serviceData.name + ' ' + serviceData.type + ' ' + error.validationStep) + + // If any error occurs after service creation, clean up + if (service) { + try { + // Delete K8s service if it was created + if ((serviceData.type === 'microservice' || serviceData.type === 'agent' || serviceData.type === 'external') && isK8s) { + await _deleteK8sService(serviceData.name) + } + // Delete TCP listener if it was added + await _deleteTcpListener(serviceData.name, transaction) + // Delete TCP connector if it was added + await _deleteTcpConnector(serviceData.name, transaction) + // Finally delete the service from database + await ServiceManager.delete({ id: service.id }, transaction) + } catch (cleanupError) { + logger.error('Error during service creation cleanup:', { + error: cleanupError.message, + stack: cleanupError.stack, + serviceName: serviceData.name + }) + } + } + + // Wrap the error in a proper error type if it's not already + if (!(error instanceof Errors.ValidationError) && + !(error instanceof Errors.NotFoundError) && + !(error instanceof Errors.TransactionError) && + !(error instanceof Errors.DuplicatePropertyError)) { + throw new Errors.ValidationError(`Failed to create service: ${error.message}`) + } + throw error + } +} + +// Update service endpoint +async function updateServiceEndpoint (serviceName, serviceData, transaction) { + // 1. Validate from schemas validator + await Validator.validate(serviceData, Validator.schemas.serviceUpdate) + await _validateServiceName(serviceData) + + // 2. Get existing service + const existingService = await ServiceManager.findOneWithTags({ name: serviceName }, transaction) + if (!existingService) { + throw new Errors.NotFoundError(`Service with name ${serviceName} not found`) + } + + // 3. Check if service type is being changed + if (serviceData.type && serviceData.type !== existingService.type) { + throw new Errors.ValidationError('Changing service type is not allowed. Please delete the service and create a new one with the desired type.') + } + + // 4. Check K8s environment if type is k8s + const isK8s = await checkKubernetesEnvironment() + if (existingService.type === 'k8s' && !isK8s) { + throw new Errors.ValidationError('Kubernetes environment is required for k8s service type') + } + + if (serviceData.type !== 'k8s' && isK8s) { + logger.debug('Validating non k8s service type') + await validateNonK8sType(serviceData) + } + + // 5. Validate microservice type if needed + if (existingService.type === 'microservice') { + await validateMicroserviceType(serviceData, transaction) + } + + // 6. Validate agent type if needed + if (existingService.type === 'agent') { + await validateFogServiceType(serviceData, transaction) + } + + // 7. Validate default bridge if needed + if (serviceData.defaultBridge) { + await validateDefaultBridge(serviceData, transaction) + } + + serviceData.bridgePort = existingService.bridgePort + + let updatedService + try { + // Update service in database + updatedService = await ServiceManager.update( + { name: serviceName }, + serviceData, + transaction + ) + + // Update tags if provided + if (serviceData.tags) { + await _setTags(existingService, serviceData.tags, transaction) + } + + // Handle resource changes + if (serviceData.resource && + JSON.stringify(serviceData.resource) !== JSON.stringify(existingService.resource)) { + // If resource changed, delete and recreate connector + await _deleteTcpConnector(serviceName, transaction) + await _addTcpConnector(serviceData, transaction) + } else { + // If resource didn't change, just update connector and listener + await _updateTcpConnector(serviceData, transaction) + // await _updateTcpListener(serviceData, transaction) + } + + // Update K8s service if needed + if ((existingService.type === 'microservice' || existingService.type === 'agent' || existingService.type === 'external') && isK8s) { + await _updateK8sService(serviceData, transaction) + } + + return updatedService + } catch (error) { + logger.error('Error updating service:', { + error: error.message, + stack: error.stack, + serviceName: serviceName, + serviceType: existingService.type + }) + + // If any error occurs after service update, attempt to rollback + if (updatedService) { + try { + // Rollback K8s service if it was updated + if ((existingService.type === 'microservice' || existingService.type === 'agent' || existingService.type === 'external') && isK8s) { + await _updateK8sService(existingService, transaction) + } + // Rollback TCP connector and listener + if (serviceData.resource && + JSON.stringify(serviceData.resource) !== JSON.stringify(existingService.resource)) { + await _deleteTcpConnector(serviceName, transaction) + await _addTcpConnector(existingService, transaction) + } else { + await _updateTcpConnector(existingService, transaction) + await _updateTcpListener(existingService, transaction) + } + // Rollback service in database + await ServiceManager.update( + { name: serviceName }, + existingService, + transaction + ) + } catch (rollbackError) { + logger.error('Error during service update rollback:', { + error: rollbackError.message, + stack: rollbackError.stack, + serviceName: serviceName + }) + } + } + + // Wrap the error in a proper error type if it's not already + if (!(error instanceof Errors.ValidationError) && + !(error instanceof Errors.NotFoundError) && + !(error instanceof Errors.TransactionError) && + !(error instanceof Errors.DuplicatePropertyError)) { + throw new Errors.ValidationError(`Failed to update service: ${error.message}`) + } + throw error + } +} + +// Delete service endpoint +async function deleteServiceEndpoint (serviceName, transaction) { + // Get existing service + const existingService = await ServiceManager.findOne({ name: serviceName }, transaction) + if (!existingService) { + throw new Errors.NotFoundError(`Service with name ${serviceName} not found`) + } + + const isK8s = await checkKubernetesEnvironment() + + try { + // Delete TCP connector + await _deleteTcpConnector(serviceName, transaction) + + // Delete TCP listener + await _deleteTcpListener(serviceName, transaction) + + // Delete K8s service if needed + if (isK8s && existingService.type !== 'k8s') { + await _deleteK8sService(serviceName) + } + + // Finally delete the service from database + await ServiceManager.delete({ name: serviceName }, transaction) + + return { message: `Service ${serviceName} deleted successfully` } + } catch (error) { + logger.error('Error deleting service:', { + error: error.message, + stack: error.stack, + serviceName: serviceName, + serviceType: existingService.type + }) + + // Wrap the error in a proper error type if it's not already + if (!(error instanceof Errors.ValidationError) && + !(error instanceof Errors.NotFoundError) && + !(error instanceof Errors.TransactionError) && + !(error instanceof Errors.DuplicatePropertyError)) { + throw new Errors.ValidationError(`Failed to delete service: ${error.message}`) + } + throw error + } +} + +// List services endpoint +async function getServicesListEndpoint (transaction) { + const queryFogData = {} + const services = await ServiceManager.findAllWithTags(queryFogData, transaction) + return services.map(service => ({ + name: service.name, + type: service.type, + resource: service.resource, + defaultBridge: service.defaultBridge, + bridgePort: service.bridgePort, + targetPort: service.targetPort, + servicePort: service.servicePort, + k8sType: service.k8sType, + serviceEndpoint: service.serviceEndpoint, + tags: _mapTags(service) + })) +} + +// Get service endpoint +async function getServiceEndpoint (serviceName, transaction) { + const queryFogData = { name: serviceName } + const service = await ServiceManager.findOneWithTags(queryFogData, transaction) + if (!service) { + throw new Errors.NotFoundError(`Service with name ${serviceName} not found`) + } + return { + name: service.name, + type: service.type, + resource: service.resource, + defaultBridge: service.defaultBridge, + bridgePort: service.bridgePort, + targetPort: service.targetPort, + servicePort: service.servicePort, + k8sType: service.k8sType, + serviceEndpoint: service.serviceEndpoint, + tags: _mapTags(service) + } +} + +async function moveMicroserviceTcpBridgeToNewFog (service, newFogUuid, oldFogUuid, transaction) { + const listenerName = `${service.name}-listener` + const connectorName = `${service.name}-connector` + + const oldRouterMicroservice = await _getRouterMicroservice(oldFogUuid, transaction) + const oldRouterConfig = JSON.parse(oldRouterMicroservice.config || '{}') + const newRouterMicroservice = await _getRouterMicroservice(newFogUuid, transaction) + const newRouterConfig = JSON.parse(newRouterMicroservice.config || '{}') + + const connector = oldRouterConfig.bridges.tcpConnectors[connectorName] + const listener = oldRouterConfig.bridges.tcpListeners[listenerName] + + if (oldRouterConfig.bridges.tcpConnectors[connectorName]) { + delete oldRouterConfig.bridges.tcpConnectors[connectorName] + } + if (oldRouterConfig.bridges.tcpListeners[listenerName]) { + delete oldRouterConfig.bridges.tcpListeners[listenerName] + } + + if (!newRouterConfig.bridges) { + newRouterConfig.bridges = {} + } + if (!newRouterConfig.bridges.tcpConnectors) { + newRouterConfig.bridges.tcpConnectors = {} + } + + newRouterConfig.bridges.tcpConnectors[connectorName] = connector + newRouterConfig.bridges.tcpListeners[listenerName] = listener + + await _updateRouterMicroserviceConfig(oldFogUuid, oldRouterConfig, transaction) + await _updateRouterMicroserviceConfig(newFogUuid, newRouterConfig, transaction) +} + +module.exports = { + checkKubernetesEnvironment, + validateMicroserviceType: TransactionDecorator.generateTransaction(validateMicroserviceType), + validateNonK8sType, + _validateServiceName, + validateFogServiceType: TransactionDecorator.generateTransaction(validateFogServiceType), + validateDefaultBridge: TransactionDecorator.generateTransaction(validateDefaultBridge), + defineBridgePort: TransactionDecorator.generateTransaction(defineBridgePort), + handleServiceDistribution: TransactionDecorator.generateTransaction(handleServiceDistribution), + _mapTags, + _setTags: TransactionDecorator.generateTransaction(_setTags), + _createK8sService, + _updateK8sService, + _deleteK8sService, + createServiceEndpoint: TransactionDecorator.generateTransaction(createServiceEndpoint), + updateServiceEndpoint: TransactionDecorator.generateTransaction(updateServiceEndpoint), + deleteServiceEndpoint: TransactionDecorator.generateTransaction(deleteServiceEndpoint), + getServicesListEndpoint: TransactionDecorator.generateTransaction(getServicesListEndpoint), + getServiceEndpoint: TransactionDecorator.generateTransaction(getServiceEndpoint), + moveMicroserviceTcpBridgeToNewFog: TransactionDecorator.generateTransaction(moveMicroserviceTcpBridgeToNewFog) +} From 05ffaa607af282d8a711552354add53b4c8ce3ad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emirhan=20Durmu=C5=9F?= Date: Fri, 20 Jun 2025 01:01:37 +0300 Subject: [PATCH 155/178] websocket api server for exec session. ws message forward between user and agent microservice session. system application handling. Container scheduler, node debugger catalog item, microservice exec status --- docs/swagger-test.yaml | 7638 +++++++++++++++++ generate-swagger.sh | 3 +- package-lock.json | 5661 ++++++------ package.json | 32 +- scripts/generate-swagger.js | 778 ++ src/config/controller.yaml | 21 +- src/config/env-mapping.js | 12 + src/controllers/application-controller.js | 7 + src/controllers/iofog-controller.js | 21 +- src/controllers/microservices-controller.js | 24 + src/data/constants.js | 3 +- .../microservice-exec-status-manager.js | 37 + src/data/managers/microservice-manager.js | 30 + .../mysql/db_migration_mysql_v1.0.2.sql | 15 +- .../postgres/db_migration_pg_v1.0.2.sql | 16 +- .../sqlite/db_migration_sqlite_v1.0.2.sql | 16 +- src/data/models/index.js | 1 + src/data/models/microservice.js | 10 + src/data/models/microserviceExecStatus.js | 36 + src/data/models/microservicestatus.js | 17 +- .../seeders/mysql/db_seeder_mysql_v1.0.2.sql | 7 +- .../seeders/postgres/db_seeder_pg_v1.0.2.sql | 7 +- .../sqlite/db_seeder_sqlite_v1.0.2.sql | 7 +- src/enums/fog-state.js | 1 + src/enums/microservice-state.js | 8 +- src/jobs/fog-status-job.js | 9 +- src/jobs/stopped-app-status-job.js | 19 +- src/routes/agent.js | 45 +- src/routes/application.js | 33 + src/routes/iofog.js | 70 + src/routes/microservices.js | 139 + src/schemas/agent.js | 2 +- src/schemas/iofog.js | 37 +- src/schemas/microservice.js | 10 + src/server.js | 35 +- src/services/agent-service.js | 16 +- src/services/application-service.js | 22 +- src/services/catalog-service.js | 26 +- src/services/iofog-service.js | 189 +- src/services/microservices-service.js | 100 +- src/services/router-service.js | 3 + src/services/yaml-parser-service.js | 9 +- src/websocket/error-handler.js | 54 + src/websocket/server.js | 1022 +++ src/websocket/session-manager.js | 495 ++ swagger.js | 29 +- 46 files changed, 13855 insertions(+), 2917 deletions(-) create mode 100644 docs/swagger-test.yaml create mode 100644 scripts/generate-swagger.js create mode 100644 src/data/managers/microservice-exec-status-manager.js create mode 100644 src/data/models/microserviceExecStatus.js create mode 100644 src/websocket/error-handler.js create mode 100644 src/websocket/server.js create mode 100644 src/websocket/session-manager.js diff --git a/docs/swagger-test.yaml b/docs/swagger-test.yaml new file mode 100644 index 000000000..f9dc88414 --- /dev/null +++ b/docs/swagger-test.yaml @@ -0,0 +1,7638 @@ +openapi: 3.0.0 +info: + title: Datasance PoT Controller + version: 3.5.0 + description: Datasance PoT Controller REST API Documentation +servers: + - url: http://localhost:51121/api/v3 +tags: + - name: Controller + description: Manage your controller + - name: ioFog + description: Manage your agents + - name: Application + description: Manage your applications + - name: Application Template + description: Manage your application templates + - name: Catalog + description: Manage your catalog + - name: Registries + description: Manage your registries + - name: Microservices + description: Manage your microservices + - name: Routing + description: Manage your routes + - name: Router + description: Manage your Default Router + - name: Edge Resource + description: Manage your Edge Resources + - name: Diagnostics + description: Diagnostic your microservices + - name: Tunnel + description: Manage ssh tunnels + - name: Agent + description: Used by your agents to communicate with your controller + - name: User + description: Manage your users + - name: Secrets + description: Manage your secrets + - name: Certificates + description: Manage your certificates + - name: Services + description: Manage your services + - name: VolumeMounts + description: Manage your volume mounts + - name: ConfigMap + description: Manage your config maps +components: + securitySchemes: + authToken: + type: http + scheme: bearer + bearerFormat: JWT + description: JWT token for authentication (user or agent) + schemas: + image: + type: object + properties: + containerImage: + type: string + fogTypeId: + type: integer + minimum: 1 + maximum: 2 + required: + - containerImage + - fogTypeId + volumeMappings: + type: object + properties: + hostDestination: + type: string + containerDestination: + type: string + accessMode: + type: string + type: + enum: + - volume + - bind + required: + - hostDestination + - containerDestination + - accessMode + ports: + type: object + properties: + internal: + type: integer + external: + type: integer + protocol: + enum: + - tcp + - udp + required: + - internal + - external + extraHosts: + type: object + properties: + name: + type: string + address: + type: string + required: + - name + - address + env: + type: object + properties: + key: + type: string + value: + type: string + valueFromSecret: + type: string + valueFromConfigMap: + type: string + required: + - key + oneOf: + - required: + - value + - required: + - valueFromSecret + - required: + - valueFromConfigMap + straceData: + type: object + properties: + microserviceUuid: + type: string + buffer: + type: string + required: + - microserviceUuid + - buffer + microserviceStatus: + type: object + properties: + id: + type: string + containerId: + type: string + status: + type: string + startTime: + type: integer + operatingDuration: + type: integer + cpuUsage: + type: number + memoryUsage: + type: number + ipAddress: + type: string + ipAddressExternal: + type: string + execSessionIds: + type: array + items: + type: string + required: + - id + agentProvision: + type: object + properties: + type: + type: integer + minimum: 0 + maximum: 2 + key: + type: string + required: + - type + - key + agentDeprovision: + type: object + properties: + microserviceUuids: + type: array + items: + type: string + required: + - microserviceUuids + updateAgentConfig: + type: object + properties: + networkInterface: + type: string + dockerUrl: + type: string + diskLimit: + type: integer + minimum: 0 + diskDirectory: + type: string + memoryLimit: + type: integer + minimum: 0 + cpuLimit: + type: integer + minimum: 0 + logLimit: + type: integer + minimum: 0 + logDirectory: + type: string + logFileCount: + type: integer + minimum: 0 + statusFrequency: + type: integer + minimum: 0 + changeFrequency: + type: integer + minimum: 0 + deviceScanFrequency: + type: integer + minimum: 0 + watchdogEnabled: + type: boolean + latitude: + type: number + minimum: -90 + maximum: 90 + longitude: + type: number + minimum: -180 + maximum: 180 + gpsMode: + type: string + gpsDevice: + type: string + gpsScanFrequency: + type: integer + minimum: 0 + edgeGuardFrequency: + type: integer + minimum: 0 + dockerPruningFrequency: + type: integer + minimum: 0 + availableDiskThreshold: + type: integer + minimum: 0 + logLevel: + type: string + timeZone: + type: string + updateAgentStatus: + type: object + properties: + daemonStatus: + type: string + warningMessage: + type: string + daemonOperatingDuration: + type: integer + minimum: 0 + daemonLastStart: + type: integer + minimum: 0 + memoryUsage: + type: number + minimum: 0 + diskUsage: + type: number + minimum: 0 + cpuUsage: + type: number + minimum: 0 + memoryViolation: + type: boolean + diskViolation: + type: boolean + cpuViolation: + type: boolean + systemAvailableDisk: + type: integer + systemAvailableMemory: + type: integer + systemTotalCpu: + type: number + securityStatus: + type: string + securityViolationInfo: + type: string + microserviceStatus: + type: string + repositoryCount: + type: integer + minimum: 0 + repositoryStatus: + type: string + systemTime: + type: integer + minimum: 0 + lastStatusTime: + type: integer + minimum: 0 + ipAddress: + type: string + ipAddressExternal: + type: string + processedMessages: + type: integer + minimum: 0 + microserviceMessageCounts: + type: string + messageSpeed: + type: number + minimum: 0 + lastCommandTime: + type: integer + minimum: 0 + gpsMode: + type: string + gpsDevice: + type: string + gpsScanFrequency: + type: integer + minimum: 0 + edgeGuardFrequency: + type: integer + minimum: 0 + tunnelStatus: + type: string + version: + type: string + isReadyToUpgrade: + type: boolean + isReadyToRollback: + type: boolean + updateAgentStrace: + type: object + properties: + straceData: + type: array + items: + $ref: '#/components/schemas/straceData' + updateHardwareInfo: + type: object + properties: + info: + type: string + required: + - info + updateUsbInfo: + type: object + properties: + info: + type: string + required: + - info + applicationTemplateVariable: + type: object + properties: + key: + type: string + minLength: 1 + pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$ + description: + type: string + required: + - key + applicationTemplateCreate: + type: object + properties: + name: + type: string + minLength: 1 + pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$ + description: + type: string + variables: + type: array + items: + $ref: '#/components/schemas/applicationTemplateVariable' + required: + - name + applicationTemplateUpdate: + type: object + properties: + name: + type: string + minLength: 1 + pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$ + description: + type: string + applicationJSON: + $ref: '#/components/schemas/applicationCreate' + variables: + type: array + items: + $ref: '#/components/schemas/applicationTemplateVariable' + applicationTemplatePatch: + type: object + properties: + name: + type: string + minLength: 1 + pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$ + description: + type: string + applicationTemplateDeploy: + type: object + properties: + name: + type: string + minLength: 1 + pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$ + description: + type: string + isActivated: + type: boolean + isSystem: + type: boolean + variables: + type: array + items: + type: object + properties: + key: + type: string + value: + type: string + required: + - name + applicationCreate: + type: object + properties: + name: + type: string + minLength: 1 + pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$ + routes: + type: array + items: + $ref: '#/components/schemas/routingCreate' + microservices: + type: array + items: + $ref: '#/components/schemas/microserviceCreate' + description: + type: string + isActivated: + type: boolean + isSystem: + type: boolean + required: + - name + applicationUpdate: + type: object + properties: + name: + type: string + minLength: 1 + pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$ + microservices: + type: array + items: + $ref: '#/components/schemas/microserviceCreate' + routes: + type: array + items: + $ref: '#/components/schemas/routingCreate' + description: + type: string + isActivated: + type: boolean + isSystem: + type: boolean + applicationPatch: + type: object + properties: + name: + type: string + minLength: 1 + pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$ + description: + type: string + isActivated: + type: boolean + isSystem: + type: boolean + type: + type: object + properties: + infoType: + type: string + infoFormat: + type: string + catalogItemCreate: + type: object + properties: + name: + type: string + minLength: 1 + description: + type: string + category: + type: string + publisher: + type: string + diskRequired: + type: integer + ramRequired: + type: integer + picture: + type: string + isPublic: + type: boolean + registryId: + type: integer + configExample: + type: string + images: + type: array + minItems: 1 + maxItems: 2 + items: + $ref: '#/components/schemas/image' + inputType: + $ref: '#/components/schemas/type' + outputType: + $ref: '#/components/schemas/type' + required: + - name + - registryId + - images + catalogItemUpdate: + type: object + properties: + name: + type: string + minLength: 1 + description: + type: string + category: + type: string + publisher: + type: string + diskRequired: + type: integer + ramRequired: + type: integer + picture: + type: string + isPublic: + type: boolean + registryId: + type: integer + configExample: + type: string + images: + type: array + maxItems: 2 + items: + $ref: '#/components/schemas/image' + inputType: + $ref: '#/components/schemas/type' + outputType: + $ref: '#/components/schemas/type' + caCreate: + type: object + properties: + name: + type: string + minLength: 1 + maxLength: 255 + subject: + type: string + minLength: 1 + expiration: + type: integer + minimum: 0 + type: + type: string + enum: + - k8s-secret + - direct + - self-signed + secretName: + type: string + required: + - type + - name + allOf: + - {} + - {} + certificateCreate: + type: object + properties: + name: + type: string + minLength: 1 + maxLength: 255 + subject: + type: string + minLength: 1 + hosts: + type: string + minLength: 1 + expiration: + type: integer + minimum: 0 + ca: + type: object + properties: + type: + type: string + enum: + - k8s-secret + - direct + - self-signed + secretName: + type: string + required: + - type + required: + - name + - subject + - hosts + caResponse: + type: object + properties: + name: + type: string + subject: + type: string + type: + type: string + created_at: + type: string + format: date-time + updated_at: + type: string + format: date-time + required: + - name + - subject + - type + - created_at + - updated_at + certificateResponse: + type: object + properties: + name: + type: string + subject: + type: string + hosts: + type: string + created_at: + type: string + format: date-time + updated_at: + type: string + format: date-time + required: + - name + - subject + - hosts + - created_at + - updated_at + caListResponse: + type: object + properties: + cas: + type: array + items: + type: object + properties: + name: + type: string + subject: + type: string + type: + type: string + created_at: + type: string + format: date-time + updated_at: + type: string + format: date-time + required: + - name + - subject + - type + - created_at + - updated_at + required: + - cas + certificateListResponse: + type: object + properties: + certificates: + type: array + items: + type: object + properties: + name: + type: string + subject: + type: string + hosts: + type: string + created_at: + type: string + format: date-time + updated_at: + type: string + format: date-time + required: + - name + - subject + - hosts + - created_at + - updated_at + required: + - certificates + configMapCreate: + type: object + properties: + name: + type: string + minLength: 1 + maxLength: 255 + immutable: + type: boolean + data: + type: object + required: + - name + - data + configMapUpdate: + type: object + properties: + immutable: + type: boolean + data: + type: object + required: + - data + configMapResponse: + type: object + properties: + id: + type: integer + name: + type: string + immutable: + type: boolean + data: + type: object + created_at: + type: string + format: date-time + updated_at: + type: string + format: date-time + required: + - id + - name + - data + - created_at + - updated_at + configMapListResponse: + type: object + properties: + configMaps: + type: array + items: + type: object + properties: + id: + type: integer + name: + type: string + immutable: + type: boolean + created_at: + type: string + format: date-time + updated_at: + type: string + format: date-time + required: + - id + - name + - created_at + - updated_at + required: + - configMaps + configUpdate: + type: object + properties: + port: + type: integer + minimum: 0 + maximum: 65535 + sslCert: + type: string + sslKey: + type: string + intermediateCert: + type: string + logDir: + type: string + logSize: + type: integer + configElement: + type: object + properties: + key: + type: string + minLength: 1 + value: + type: string + required: + - key + - value + profile: + type: object + properties: {} + straceStateUpdate: + type: object + properties: + enable: + type: boolean + required: + - enable + straceGetData: + type: object + properties: + format: + enum: + - string + - file + required: + - format + stracePostToFtp: + type: object + properties: + ftpHost: + type: string + ftpPort: + type: integer + minimum: 0 + ftpUser: + type: string + ftpPass: + type: string + ftpDestDir: + type: string + required: + - ftpHost + - ftpPort + - ftpUser + - ftpPass + - ftpDestDir + edgeResourceDisplay: + type: object + properties: + name: + type: string + color: + type: string + pattern: ^(#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{8}))|(rgb(s*(?:(d{1,3})s*,?){3}))|(rgba(s*(?:(d{1,3})s*,?){4}))|$ + icon: + type: string + edgeResourceHTTPEndpoint: + type: object + properties: + name: + type: string + pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$ + description: + type: string + method: + enum: + - GET + - POST + - PUT + - PATCH + - DELETE + - HEAD + - OPTIONS + url: + type: string + requestType: + type: string + responseType: + type: string + requestPayloadExample: + type: string + responsePayloadExample: + type: string + edgeResource: + type: object + properties: + display: + $ref: '#/components/schemas/edgeResourceDisplay' + name: + type: string + minLength: 1 + pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$ + version: + type: string + minLength: 1 + pattern: ^v?(0|[1-9]d*).(0|[1-9]d*).(0|[1-9]d*)(?:-((?:0|[1-9]d*|d*[a-zA-Z-][0-9a-zA-Z-]*)(?:.(?:0|[1-9]d*|d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:[+]([0-9a-zA-Z-]+(?:.[0-9a-zA-Z-]+)*))?$ + description: + type: string + orchestrationTags: + type: array + items: + type: string + interfaceProtocol: + enum: + - http + - https + - ws + - wss + oneOf: + - properties: + interfaceProtocol: + enum: + - http + - https + - ws + - wss + interface: + type: object + properties: + endpoints: + type: array + items: + $ref: /edgeResourceHTTPEndpoint + edgeResourceCreate: + type: object + allOf: + - $ref: '#/components/schemas/edgeResource' + required: + - name + - version + edgeResourceUpdate: + type: object + allOf: + - $ref: '#/components/schemas/edgeResource' + filter: + type: object + properties: + key: + type: string + value: + type: string + condition: + enum: + - has + - equals + required: + - key + - value + - condition + iofogTag: + type: string + iofogCreate: + type: object + properties: + name: + type: string + minLength: 1 + location: + type: string + latitude: + type: number + minimum: -90 + maximum: 90 + longitude: + type: number + minimum: -180 + maximum: 180 + description: + type: string + networkInterface: + type: string + dockerUrl: + type: string + containerEngine: + type: string + enum: + - docker + - podman + deploymentType: + type: string + enum: + - native + - container + diskLimit: + type: integer + minimum: 0 + diskDirectory: + type: string + memoryLimit: + type: integer + minimum: 0 + cpuLimit: + type: integer + minimum: 0 + logLimit: + type: integer + minimum: 0 + logDirectory: + type: string + logFileCount: + type: integer + minimum: 0 + statusFrequency: + type: integer + minimum: 0 + changeFrequency: + type: integer + minimum: 0 + deviceScanFrequency: + type: integer + minimum: 0 + bluetoothEnabled: + type: boolean + watchdogEnabled: + type: boolean + abstractedHardwareEnabled: + type: boolean + fogType: + type: integer + minimum: 0 + maximum: 2 + dockerPruningFrequency: + type: integer + minimum: 0 + availableDiskThreshold: + type: integer + minimum: 0 + logLevel: + type: string + isSystem: + type: boolean + routerMode: + enum: + - none + - edge + - interior + default: edge + messagingPort: + type: integer + minimum: 1 + maximum: 65535 + interRouterPort: + type: integer + minimum: 1 + maximum: 65535 + edgeRouterPort: + type: integer + minimum: 1 + maximum: 65535 + host: + type: string + tags: + type: array + items: + $ref: '#/components/schemas/iofogTag' + upstreamRouters: + type: array + items: + type: string + minLength: 1 + networkRouter: + type: string + timeZone: + type: string + anyOf: + - properties: + routerMode: {} + required: + - interRouterPort + - edgeRouterPort + - host + - properties: + routerMode: {} + required: + - host + - properties: + routerMode: {} + required: + - name + - fogType + iofogUpdate: + type: object + properties: + uuid: + type: string + name: + type: string + minLength: 1 + location: + type: string + latitude: + type: number + minimum: -90 + maximum: 90 + longitude: + type: number + minimum: -180 + maximum: 180 + description: + type: string + networkInterface: + type: string + dockerUrl: + type: string + containerEngine: + type: string + enum: + - docker + - podman + deploymentType: + type: string + enum: + - native + - container + diskLimit: + type: integer + minimum: 0 + diskDirectory: + type: string + memoryLimit: + type: integer + minimum: 0 + cpuLimit: + type: integer + minimum: 0 + logLimit: + type: integer + minimum: 0 + logDirectory: + type: string + logFileCount: + type: integer + minimum: 0 + statusFrequency: + type: integer + minimum: 0 + changeFrequency: + type: integer + minimum: 0 + deviceScanFrequency: + type: integer + minimum: 0 + bluetoothEnabled: + type: boolean + watchdogEnabled: + type: boolean + abstractedHardwareEnabled: + type: boolean + fogType: + type: integer + minimum: 0 + maximum: 2 + dockerPruningFrequency: + type: integer + minimum: 0 + availableDiskThreshold: + type: integer + minimum: 0 + logLevel: + type: string + isSystem: + type: boolean + routerMode: + enum: + - none + - edge + - interior + messagingPort: + type: integer + minimum: 1 + maximum: 65535 + interRouterPort: + type: integer + minimum: 1 + maximum: 65535 + edgeRouterPort: + type: integer + minimum: 1 + maximum: 65535 + host: + type: string + upstreamRouters: + type: array + items: + type: string + minLength: 1 + tags: + type: array + items: + $ref: '#/components/schemas/iofogTag' + networkRouter: + type: string + minLength: 1 + timeZone: + type: string + anyOf: + - properties: + routerMode: {} + required: + - interRouterPort + - edgeRouterPort + - host + - properties: + routerMode: {} + - properties: + routerMode: {} + required: + - uuid + iofogDelete: + type: object + properties: + uuid: + type: string + required: + - uuid + iofogGet: + type: object + properties: + uuid: + type: string + name: + type: string + oneOf: + - required: + - uuid + - required: + - name + iofogGenerateProvision: + type: object + properties: + uuid: + type: string + required: + - uuid + iofogSetVersionCommand: + type: object + properties: + uuid: + type: string + versionCommand: + enum: + - upgrade + - rollback + required: + - uuid + - versionCommand + iofogReboot: + type: object + properties: + uuid: + type: string + required: + - uuid + iofogFilters: + type: array + items: + $ref: '#/components/schemas/filter' + halGet: + type: object + properties: + uuid: + type: string + required: + - uuid + iofogPrune: + type: object + properties: + uuid: + type: string + required: + - uuid + defaultRouterCreate: + type: object + properties: + messagingPort: + type: integer + minimum: 1 + maximum: 65535 + interRouterPort: + type: integer + minimum: 1 + maximum: 65535 + edgeRouterPort: + type: integer + minimum: 1 + maximum: 65535 + requireSsl: + type: string + sslProfile: + type: string + saslMechanisms: + type: string + authenticatePeer: + type: string + caCert: + type: string + tlsCert: + type: string + tlsKey: + type: string + host: + type: string + required: + - host + microserviceCreate: + type: object + properties: + name: + type: string + pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$ + config: + type: string + annotations: + type: string + catalogItemId: + type: integer + minimum: 4 + images: + type: array + maxItems: 2 + items: + $ref: '#/components/schemas/image' + registryId: + type: integer + application: + anyOf: + - type: string + - type: number + iofogUuid: + type: string + agentName: + type: string + rootHostAccess: + type: boolean + schedule: + type: integer + minimum: 0 + maximum: 100 + logSize: + type: integer + imageSnapshot: + type: string + volumeMappings: + type: array + items: + $ref: '#/components/schemas/volumeMappings' + ports: + type: array + items: + $ref: '#/components/schemas/ports' + extraHosts: + type: array + items: + $ref: '#/components/schemas/extraHosts' + routes: + type: array + items: + type: string + env: + type: array + items: + $ref: '#/components/schemas/env' + cmd: + type: array + items: + type: string + cdiDevices: + type: array + items: + type: string + capAdd: + type: array + items: + type: string + capDrop: + type: array + items: + type: string + runAsUser: + type: string + platform: + type: string + runtime: + type: string + pubTags: + type: array + items: + type: string + subTags: + type: array + items: + type: string + required: + - name + microserviceUpdate: + type: object + properties: + name: + type: string + pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$ + config: + type: string + annotations: + type: string + rebuild: + type: boolean + iofogUuid: + type: string + agentName: + type: string + rootHostAccess: + type: boolean + logSize: + type: integer + minimum: 0 + schedule: + type: integer + minimum: 0 + maximum: 100 + volumeMappings: + type: array + items: + $ref: '#/components/schemas/volumeMappings' + images: + type: array + maxItems: 2 + minItems: 1 + items: + $ref: '#/components/schemas/image' + ports: + type: array + items: + $ref: '#/components/schemas/ports' + extraHosts: + type: array + items: + $ref: '#/components/schemas/extraHosts' + env: + type: array + items: + $ref: '#/components/schemas/env' + cmd: + type: array + items: + type: string + cdiDevices: + type: array + items: + type: string + capAdd: + type: array + items: + type: string + capDrop: + type: array + items: + type: string + runAsUser: + type: string + platform: + type: string + runtime: + type: string + pubTags: + type: array + items: + type: string + subTags: + type: array + items: + type: string + portsCreate: + type: object + properties: + internal: + type: integer + external: + type: integer + protocol: + enum: + - tcp + - udp + required: + - internal + - external + microserviceDelete: + type: object + properties: + withCleanup: + type: boolean + additionalProperties: + type: object + additionalProperties: true + registryCreate: + type: object + properties: + url: + type: string + minLength: 1 + isPublic: + type: boolean + username: + type: string + minLength: 1 + password: + type: string + email: + type: string + pattern: ^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$ + requiresCert: + type: boolean + certificate: + type: string + required: + - url + - isPublic + - username + - password + - email + registryDelete: + type: object + properties: + id: + type: integer + required: + - id + registryUpdate: + type: object + properties: + url: + type: string + minLength: 1 + isPublic: + type: boolean + username: + type: string + minLength: 1 + password: + type: string + email: + type: string + pattern: ^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$ + requiresCert: + type: boolean + certificate: + type: string + routingCreate: + type: object + properties: + name: + type: string + pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$ + oneOf: + - properties: + from: + type: string + pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$ + to: + type: string + pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$ + application: + type: string + pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$ + required: + - name + - from + - to + - properties: + sourceMicroserviceUuid: + type: string + destMicroserviceUuid: + type: string + required: + - name + - sourceMicroserviceUuid + - destMicroserviceUuid + routingUpdate: + type: object + properties: + name: + type: string + pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$ + oneOf: + - properties: + from: + type: string + pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$ + to: + type: string + pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$ + application: + type: string + pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$ + required: + - from + - to + - application + - properties: + sourceMicroserviceUuid: + type: string + destMicroserviceUuid: + type: string + required: + - sourceMicroserviceUuid + - destMicroserviceUuid + secretCreate: + type: object + properties: + name: + type: string + minLength: 1 + maxLength: 255 + type: + type: string + enum: + - opaque + - tls + data: + type: object + required: + - name + - type + - data + secretUpdate: + type: object + properties: + data: + type: object + required: + - data + secretResponse: + type: object + properties: + id: + type: integer + name: + type: string + type: + type: string + enum: + - opaque + - tls + data: + type: object + created_at: + type: string + format: date-time + updated_at: + type: string + format: date-time + required: + - id + - name + - type + - data + - created_at + - updated_at + secretListResponse: + type: object + properties: + secrets: + type: array + items: + type: object + properties: + id: + type: integer + name: + type: string + type: + type: string + enum: + - opaque + - tls + created_at: + type: string + format: date-time + updated_at: + type: string + format: date-time + required: + - id + - name + - type + - created_at + - updated_at + required: + - secrets + serviceTag: + type: string + serviceCreate: + type: object + required: + - name + - type + - resource + - targetPort + properties: + name: + type: string + pattern: ^[a-z0-9]([a-z0-9-]*[a-z0-9])?$ + type: + type: string + enum: + - microservice + - k8s + - agent + - external + resource: + type: string + required: + - cpu + - memory + targetPort: + type: integer + defaultBridge: + type: string + servicePort: + type: integer + k8sType: + type: string + enum: + - LoadBalancer + - ClusterIP + - NodePort + tags: + type: array + items: + $ref: '#/components/schemas/serviceTag' + serviceUpdate: + type: object + required: + - name + properties: + name: + type: string + pattern: ^[a-z0-9]([a-z0-9-]*[a-z0-9])?$ + type: + type: string + enum: + - microservice + - k8s + - agent + - external + resource: + type: string + targetPort: + type: integer + defaultBridge: + type: string + servicePort: + type: integer + k8sType: + type: string + enum: + - LoadBalancer + - ClusterIP + - NodePort + tags: + type: array + items: + $ref: '#/components/schemas/serviceTag' + tunnelCreate: + type: object + properties: + iofogUuid: + type: string + username: + type: string + minLength: 1 + password: + type: string + rsakey: + type: string + lport: + type: integer + minimum: 0 + maximum: 65535 + rport: + type: integer + minimum: 0 + maximum: 65535 + required: + - iofogUuid + - username + - password + - lport + - rport + login: + type: object + properties: + email: + type: string + pattern: ^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$ + password: + type: string + totp: + type: string + required: + - email + - password + refresh: + type: object + properties: + refreshToken: + type: string + required: + - refreshToken + volumeMountCreate: + type: object + properties: + name: + type: string + pattern: ^[a-z0-9]([a-z0-9-]*[a-z0-9])?$ + secretName: + type: string + configMapName: + type: string + required: + - name + oneOf: + - required: + - secretName + - required: + - configMapName + volumeMountUpdate: + type: object + properties: + name: + type: string + pattern: ^[a-z0-9]([a-z0-9-]*[a-z0-9])?$ + secretName: + type: string + configMapName: + type: string + oneOf: + - required: + - secretName + - required: + - configMapName + volumeMountLink: + type: object + properties: + fogUuids: + type: array + items: + type: string + minItems: 1 + required: + - fogUuids + volumeMountUnlink: + type: object + properties: + fogUuids: + type: array + items: + type: string + minItems: 1 + required: + - fogUuids +security: + - authToken: [] +paths: + /agent/provision: + post: + tags: + - Agent + summary: POST /api/v3/agent/provision + security: + - authToken: [] + parameters: [] + responses: + '201': + description: Created + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + content: + application/json: + schema: + type: object + '400': + description: Bad Request + '401': + description: Not Authorized + '409': + description: Duplicate Name + '500': + description: Internal Server Error + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/agentProvision' + /agent/deprovision: + post: + tags: + - Agent + summary: POST /api/v3/agent/deprovision + security: + - authToken: [] + parameters: [] + responses: + '201': + description: Created + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + content: + application/json: + schema: + type: object + '400': + description: Bad Request + '401': + description: Not Authorized + '409': + description: Duplicate Name + '500': + description: Internal Server Error + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/agentProvision' + /agent/config: + get: + tags: + - Agent + summary: GET /api/v3/agent/config + security: + - authToken: [] + parameters: [] + responses: + '200': + description: Success + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + content: + application/json: + schema: + type: object + '401': + description: Not Authorized + '404': + description: Not Found + '500': + description: Internal Server Error + patch: + tags: + - Agent + summary: PATCH /api/v3/agent/config + security: + - authToken: [] + parameters: [] + responses: + '200': + description: Success + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + content: + application/json: + schema: + type: object + '401': + description: Not Authorized + '404': + description: Not Found + '500': + description: Internal Server Error + requestBody: + required: true + content: + application/json: + schema: + type: object + /agent/config/changes: + get: + tags: + - Agent + summary: GET /api/v3/agent/config/changes + security: + - authToken: [] + parameters: [] + responses: + '200': + description: Success + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + content: + application/json: + schema: + type: object + '401': + description: Not Authorized + '404': + description: Not Found + '500': + description: Internal Server Error + patch: + tags: + - Agent + summary: PATCH /api/v3/agent/config/changes + security: + - authToken: [] + parameters: [] + responses: + '200': + description: Success + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + content: + application/json: + schema: + type: object + '401': + description: Not Authorized + '404': + description: Not Found + '500': + description: Internal Server Error + requestBody: + required: true + content: + application/json: + schema: + type: object + /agent/status: + put: + tags: + - Agent + summary: PUT /api/v3/agent/status + security: + - authToken: [] + parameters: [] + responses: + '200': + description: Success + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + content: + application/json: + schema: + type: object + '400': + description: Bad Request + '401': + description: Not Authorized + '404': + description: Not Found + '500': + description: Internal Server Error + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/updateAgentConfig' + /agent/edgeResources: + get: + tags: + - Agent + summary: GET /api/v3/agent/edgeResources + security: + - authToken: [] + parameters: [] + responses: + '200': + description: Success + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + content: + application/json: + schema: + type: object + '401': + description: Not Authorized + '404': + description: Not Found + '500': + description: Internal Server Error + /agent/volumeMounts: + get: + tags: + - Agent + summary: GET /api/v3/agent/volumeMounts + security: + - authToken: [] + parameters: [] + responses: + '200': + description: Success + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + content: + application/json: + schema: + type: object + '401': + description: Not Authorized + '404': + description: Not Found + '500': + description: Internal Server Error + /agent/microservices: + get: + tags: + - Agent + summary: GET /api/v3/agent/microservices + security: + - authToken: [] + parameters: [] + responses: + '200': + description: Success + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + content: + application/json: + schema: + type: object + properties: + microservices: + type: array + items: + type: object + properties: + uuid: + type: string + name: + type: string + config: + type: object + '401': + description: Not Authorized + '404': + description: Not Found + '500': + description: Internal Server Error + /agent/microservices/{microserviceUuid}: + get: + tags: + - Agent + summary: GET /api/v3/agent/microservices/:microserviceUuid + security: + - authToken: [] + parameters: + - name: microserviceUuid + in: path + required: true + schema: + type: string + responses: + '200': + description: Success + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + content: + application/json: + schema: + type: object + properties: + microservices: + type: array + items: + type: object + properties: + uuid: + type: string + name: + type: string + config: + type: object + '401': + description: Not Authorized + '404': + description: Not Found + '500': + description: Internal Server Error + /agent/registries: + get: + tags: + - Agent + summary: GET /api/v3/agent/registries + security: + - authToken: [] + parameters: [] + responses: + '200': + description: Success + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + content: + application/json: + schema: + type: object + '401': + description: Not Authorized + '404': + description: Not Found + '500': + description: Internal Server Error + /agent/tunnel: + get: + tags: + - Agent + summary: GET /api/v3/agent/tunnel + security: + - authToken: [] + parameters: [] + responses: + '200': + description: Success + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + content: + application/json: + schema: + type: object + '401': + description: Not Authorized + '404': + description: Not Found + '500': + description: Internal Server Error + /agent/strace: + get: + tags: + - Agent + summary: GET /api/v3/agent/strace + security: + - authToken: [] + parameters: [] + responses: + '200': + description: Success + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + content: + application/json: + schema: + type: object + '401': + description: Not Authorized + '404': + description: Not Found + '500': + description: Internal Server Error + put: + tags: + - Agent + summary: PUT /api/v3/agent/strace + security: + - authToken: [] + parameters: [] + responses: + '200': + description: Success + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + content: + application/json: + schema: + type: object + '400': + description: Bad Request + '401': + description: Not Authorized + '404': + description: Not Found + '500': + description: Internal Server Error + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/updateAgentConfig' + /agent/version: + get: + tags: + - Agent + summary: GET /api/v3/agent/version + security: + - authToken: [] + parameters: [] + responses: + '200': + description: Success + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + content: + application/json: + schema: + type: object + '401': + description: Not Authorized + '404': + description: Not Found + '500': + description: Internal Server Error + /agent/hal/hw: + put: + tags: + - Agent + summary: PUT /api/v3/agent/hal/hw + security: + - authToken: [] + parameters: [] + responses: + '200': + description: Success + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + content: + application/json: + schema: + type: object + '400': + description: Bad Request + '401': + description: Not Authorized + '404': + description: Not Found + '500': + description: Internal Server Error + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/updateAgentConfig' + /agent/hal/usb: + put: + tags: + - Agent + summary: PUT /api/v3/agent/hal/usb + security: + - authToken: [] + parameters: [] + responses: + '200': + description: Success + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + content: + application/json: + schema: + type: object + '400': + description: Bad Request + '401': + description: Not Authorized + '404': + description: Not Found + '500': + description: Internal Server Error + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/updateAgentConfig' + /agent/delete-node: + delete: + tags: + - Agent + summary: DELETE /api/v3/agent/delete-node + security: + - authToken: [] + parameters: [] + responses: + '204': + description: Success + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + '401': + description: Not Authorized + '404': + description: Not Found + '500': + description: Internal Server Error + /agent/image-snapshot: + get: + tags: + - Agent + summary: GET /api/v3/agent/image-snapshot + security: + - authToken: [] + parameters: [] + responses: + '200': + description: Success + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + content: + application/json: + schema: + type: object + '401': + description: Not Authorized + '404': + description: Not Found + '500': + description: Internal Server Error + put: + tags: + - Agent + summary: PUT /api/v3/agent/image-snapshot + security: + - authToken: [] + parameters: [] + responses: + '200': + description: Success + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + content: + application/json: + schema: + type: object + '400': + description: Bad Request + '401': + description: Not Authorized + '404': + description: Not Found + '500': + description: Internal Server Error + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/updateAgentConfig' + /agent/cert: + get: + tags: + - Agent + summary: GET /api/v3/agent/cert + security: + - authToken: [] + parameters: [] + responses: + '200': + description: Success + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + content: + application/json: + schema: + type: object + '401': + description: Not Authorized + '404': + description: Not Found + '500': + description: Internal Server Error + /application: + get: + tags: + - Application + summary: GET /api/v3/application + security: + - authToken: [] + parameters: [] + responses: + '200': + description: Success + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + content: + application/json: + schema: + type: object + properties: + applications: + type: array + items: + type: object + properties: + name: + type: string + description: + type: string + version: + type: string + microservices: + type: array + items: + type: object + properties: + name: + type: string + config: + type: object + '401': + description: Not Authorized + '404': + description: Not Found + '500': + description: Internal Server Error + post: + tags: + - Application + summary: POST /api/v3/application + security: + - authToken: [] + parameters: [] + responses: + '201': + description: Created + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + content: + application/json: + schema: + type: object + '400': + description: Bad Request + '401': + description: Not Authorized + '409': + description: Duplicate Name + '500': + description: Internal Server Error + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/applicationCreate' + /application/system: + get: + tags: + - Application + summary: GET /api/v3/application/system + security: + - authToken: [] + parameters: [] + responses: + '200': + description: Success + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + content: + application/json: + schema: + type: object + properties: + applications: + type: array + items: + type: object + properties: + name: + type: string + description: + type: string + version: + type: string + microservices: + type: array + items: + type: object + properties: + name: + type: string + config: + type: object + '401': + description: Not Authorized + '404': + description: Not Found + '500': + description: Internal Server Error + /application/yaml: + post: + tags: + - Application + summary: POST /api/v3/application/yaml + security: + - authToken: [] + parameters: [] + responses: + '201': + description: Created + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + content: + application/json: + schema: + type: object + '400': + description: Bad Request + '401': + description: Not Authorized + '409': + description: Duplicate Name + '500': + description: Internal Server Error + requestBody: + required: true + content: + multipart/form-data: + schema: + type: object + properties: + application: + type: string + format: binary + /application/{name}: + get: + tags: + - Application + summary: GET /api/v3/application/:name + security: + - authToken: [] + parameters: + - name: name + in: path + required: true + schema: + type: string + responses: + '200': + description: Success + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + content: + application/json: + schema: + type: object + properties: + applications: + type: array + items: + type: object + properties: + name: + type: string + description: + type: string + version: + type: string + microservices: + type: array + items: + type: object + properties: + name: + type: string + config: + type: object + '401': + description: Not Authorized + '404': + description: Not Found + '500': + description: Internal Server Error + patch: + tags: + - Application + summary: PATCH /api/v3/application/:name + security: + - authToken: [] + parameters: + - name: name + in: path + required: true + schema: + type: string + responses: + '200': + description: Success + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + content: + application/json: + schema: + type: object + '401': + description: Not Authorized + '404': + description: Not Found + '500': + description: Internal Server Error + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/applicationPatch' + put: + tags: + - Application + summary: PUT /api/v3/application/:name + security: + - authToken: [] + parameters: + - name: name + in: path + required: true + schema: + type: string + responses: + '200': + description: Success + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + content: + application/json: + schema: + type: object + '400': + description: Bad Request + '401': + description: Not Authorized + '404': + description: Not Found + '500': + description: Internal Server Error + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/applicationUpdate' + delete: + tags: + - Application + summary: DELETE /api/v3/application/:name + security: + - authToken: [] + parameters: + - name: name + in: path + required: true + schema: + type: string + responses: + '204': + description: Success + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + '401': + description: Not Authorized + '404': + description: Not Found + '500': + description: Internal Server Error + /application/system/{name}: + get: + tags: + - Application + summary: GET /api/v3/application/system/:name + security: + - authToken: [] + parameters: + - name: name + in: path + required: true + schema: + type: string + responses: + '200': + description: Success + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + content: + application/json: + schema: + type: object + properties: + applications: + type: array + items: + type: object + properties: + name: + type: string + description: + type: string + version: + type: string + microservices: + type: array + items: + type: object + properties: + name: + type: string + config: + type: object + '401': + description: Not Authorized + '404': + description: Not Found + '500': + description: Internal Server Error + delete: + tags: + - Application + summary: DELETE /api/v3/application/system/:name + security: + - authToken: [] + parameters: + - name: name + in: path + required: true + schema: + type: string + responses: + '204': + description: Success + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + '401': + description: Not Authorized + '404': + description: Not Found + '500': + description: Internal Server Error + /application/yaml/{name}: + put: + tags: + - Application + summary: PUT /api/v3/application/yaml/:name + security: + - authToken: [] + parameters: + - name: name + in: path + required: true + schema: + type: string + responses: + '200': + description: Success + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + content: + application/json: + schema: + type: object + '400': + description: Bad Request + '401': + description: Not Authorized + '404': + description: Not Found + '500': + description: Internal Server Error + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/applicationUpdate' + /applicationTemplates: + get: + tags: + - Application + summary: GET /api/v3/applicationTemplates + security: + - authToken: [] + parameters: [] + responses: + '200': + description: Success + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + content: + application/json: + schema: + type: object + properties: + applications: + type: array + items: + type: object + properties: + name: + type: string + description: + type: string + version: + type: string + microservices: + type: array + items: + type: object + properties: + name: + type: string + config: + type: object + '401': + description: Not Authorized + '404': + description: Not Found + '500': + description: Internal Server Error + /applicationTemplate: + post: + tags: + - Application + summary: POST /api/v3/applicationTemplate + security: + - authToken: [] + parameters: [] + responses: + '201': + description: Created + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + content: + application/json: + schema: + type: object + '400': + description: Bad Request + '401': + description: Not Authorized + '409': + description: Duplicate Name + '500': + description: Internal Server Error + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/applicationCreate' + /applicationTemplate/yaml: + post: + tags: + - Application + summary: POST /api/v3/applicationTemplate/yaml + security: + - authToken: [] + parameters: [] + responses: + '201': + description: Created + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + content: + application/json: + schema: + type: object + '400': + description: Bad Request + '401': + description: Not Authorized + '409': + description: Duplicate Name + '500': + description: Internal Server Error + requestBody: + required: true + content: + multipart/form-data: + schema: + type: object + properties: + application: + type: string + format: binary + /applicationTemplate/{name}: + get: + tags: + - Application + summary: GET /api/v3/applicationTemplate/:name + security: + - authToken: [] + parameters: + - name: name + in: path + required: true + schema: + type: string + responses: + '200': + description: Success + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + content: + application/json: + schema: + type: object + properties: + applications: + type: array + items: + type: object + properties: + name: + type: string + description: + type: string + version: + type: string + microservices: + type: array + items: + type: object + properties: + name: + type: string + config: + type: object + '401': + description: Not Authorized + '404': + description: Not Found + '500': + description: Internal Server Error + patch: + tags: + - Application + summary: PATCH /api/v3/applicationTemplate/:name + security: + - authToken: [] + parameters: + - name: name + in: path + required: true + schema: + type: string + responses: + '200': + description: Success + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + content: + application/json: + schema: + type: object + '401': + description: Not Authorized + '404': + description: Not Found + '500': + description: Internal Server Error + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/applicationPatch' + put: + tags: + - Application + summary: PUT /api/v3/applicationTemplate/:name + security: + - authToken: [] + parameters: + - name: name + in: path + required: true + schema: + type: string + responses: + '200': + description: Success + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + content: + application/json: + schema: + type: object + '400': + description: Bad Request + '401': + description: Not Authorized + '404': + description: Not Found + '500': + description: Internal Server Error + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/applicationUpdate' + delete: + tags: + - Application + summary: DELETE /api/v3/applicationTemplate/:name + security: + - authToken: [] + parameters: + - name: name + in: path + required: true + schema: + type: string + responses: + '204': + description: Success + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + '401': + description: Not Authorized + '404': + description: Not Found + '500': + description: Internal Server Error + /applicationTemplate/yaml/{name}: + put: + tags: + - Application + summary: PUT /api/v3/applicationTemplate/yaml/:name + security: + - authToken: [] + parameters: + - name: name + in: path + required: true + schema: + type: string + responses: + '200': + description: Success + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + content: + application/json: + schema: + type: object + '400': + description: Bad Request + '401': + description: Not Authorized + '404': + description: Not Found + '500': + description: Internal Server Error + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/applicationUpdate' + /capabilities/edgeResources: + head: + tags: + - Controller + summary: HEAD /api/v3/capabilities/edgeResources + security: + - authToken: [] + parameters: [] + responses: + '200': + description: Success + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + content: + application/json: + schema: + type: object + '401': + description: Not Authorized + '404': + description: Not Found + '500': + description: Internal Server Error + /capabilities/applicationTemplates: + head: + tags: + - Controller + summary: HEAD /api/v3/capabilities/applicationTemplates + security: + - authToken: [] + parameters: [] + responses: + '200': + description: Success + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + content: + application/json: + schema: + type: object + '401': + description: Not Authorized + '404': + description: Not Found + '500': + description: Internal Server Error + /catalog/microservices: + get: + tags: + - Catalog + summary: GET /api/v3/catalog/microservices + security: + - authToken: [] + parameters: [] + responses: + '200': + description: Success + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + content: + application/json: + schema: + type: object + properties: + microservices: + type: array + items: + type: object + properties: + uuid: + type: string + name: + type: string + config: + type: object + '401': + description: Not Authorized + '404': + description: Not Found + '500': + description: Internal Server Error + post: + tags: + - Catalog + summary: POST /api/v3/catalog/microservices + security: + - authToken: [] + parameters: [] + responses: + '201': + description: Created + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + content: + application/json: + schema: + type: object + '400': + description: Bad Request + '401': + description: Not Authorized + '409': + description: Duplicate Name + '500': + description: Internal Server Error + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/microserviceCreate' + /catalog/microservices/{id}: + get: + tags: + - Catalog + summary: GET /api/v3/catalog/microservices/:id + security: + - authToken: [] + parameters: + - name: id + in: path + required: true + schema: + type: string + responses: + '200': + description: Success + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + content: + application/json: + schema: + type: object + properties: + microservices: + type: array + items: + type: object + properties: + uuid: + type: string + name: + type: string + config: + type: object + '401': + description: Not Authorized + '404': + description: Not Found + '500': + description: Internal Server Error + patch: + tags: + - Catalog + summary: PATCH /api/v3/catalog/microservices/:id + security: + - authToken: [] + parameters: + - name: id + in: path + required: true + schema: + type: string + responses: + '200': + description: Success + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + content: + application/json: + schema: + type: object + '401': + description: Not Authorized + '404': + description: Not Found + '500': + description: Internal Server Error + requestBody: + required: true + content: + application/json: + schema: + type: object + delete: + tags: + - Catalog + summary: DELETE /api/v3/catalog/microservices/:id + security: + - authToken: [] + parameters: + - name: id + in: path + required: true + schema: + type: string + responses: + '204': + description: Success + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + '401': + description: Not Authorized + '404': + description: Not Found + '500': + description: Internal Server Error + /certificates/ca: + post: + tags: + - Certificates + summary: POST /api/v3/certificates/ca + security: + - authToken: [] + parameters: [] + responses: + '201': + description: Created + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + content: + application/json: + schema: + type: object + '400': + description: Bad Request + '401': + description: Not Authorized + '409': + description: Duplicate Name + '500': + description: Internal Server Error + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/certificateCreate' + get: + tags: + - Certificates + summary: GET /api/v3/certificates/ca + security: + - authToken: [] + parameters: [] + responses: + '200': + description: Success + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + content: + application/json: + schema: + type: object + '401': + description: Not Authorized + '404': + description: Not Found + '500': + description: Internal Server Error + /certificates/ca/{name}: + get: + tags: + - Certificates + summary: GET /api/v3/certificates/ca/:name + security: + - authToken: [] + parameters: + - name: name + in: path + required: true + schema: + type: string + responses: + '200': + description: Success + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + content: + application/json: + schema: + type: object + '401': + description: Not Authorized + '404': + description: Not Found + '500': + description: Internal Server Error + delete: + tags: + - Certificates + summary: DELETE /api/v3/certificates/ca/:name + security: + - authToken: [] + parameters: + - name: name + in: path + required: true + schema: + type: string + responses: + '204': + description: Success + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + '401': + description: Not Authorized + '404': + description: Not Found + '500': + description: Internal Server Error + /certificates: + post: + tags: + - Certificates + summary: POST /api/v3/certificates + security: + - authToken: [] + parameters: [] + responses: + '201': + description: Created + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + content: + application/json: + schema: + type: object + '400': + description: Bad Request + '401': + description: Not Authorized + '409': + description: Duplicate Name + '500': + description: Internal Server Error + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/certificateCreate' + get: + tags: + - Certificates + summary: GET /api/v3/certificates + security: + - authToken: [] + parameters: [] + responses: + '200': + description: Success + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + content: + application/json: + schema: + type: object + '401': + description: Not Authorized + '404': + description: Not Found + '500': + description: Internal Server Error + /certificates/expiring: + get: + tags: + - Certificates + summary: GET /api/v3/certificates/expiring + security: + - authToken: [] + parameters: [] + responses: + '200': + description: Success + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + content: + application/json: + schema: + type: object + '401': + description: Not Authorized + '404': + description: Not Found + '500': + description: Internal Server Error + /certificates/{name}: + get: + tags: + - Certificates + summary: GET /api/v3/certificates/:name + security: + - authToken: [] + parameters: + - name: name + in: path + required: true + schema: + type: string + responses: + '200': + description: Success + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + content: + application/json: + schema: + type: object + '401': + description: Not Authorized + '404': + description: Not Found + '500': + description: Internal Server Error + delete: + tags: + - Certificates + summary: DELETE /api/v3/certificates/:name + security: + - authToken: [] + parameters: + - name: name + in: path + required: true + schema: + type: string + responses: + '204': + description: Success + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + '401': + description: Not Authorized + '404': + description: Not Found + '500': + description: Internal Server Error + /certificates/{name}/renew: + post: + tags: + - Certificates + summary: POST /api/v3/certificates/:name/renew + security: + - authToken: [] + parameters: + - name: name + in: path + required: true + schema: + type: string + responses: + '201': + description: Created + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + content: + application/json: + schema: + type: object + '400': + description: Bad Request + '401': + description: Not Authorized + '409': + description: Duplicate Name + '500': + description: Internal Server Error + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/certificateCreate' + /certificates/yaml: + post: + tags: + - Certificates + summary: POST /api/v3/certificates/yaml + security: + - authToken: [] + parameters: [] + responses: + '201': + description: Created + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + content: + application/json: + schema: + type: object + '400': + description: Bad Request + '401': + description: Not Authorized + '409': + description: Duplicate Name + '500': + description: Internal Server Error + requestBody: + required: true + content: + multipart/form-data: + schema: + type: object + properties: + application: + type: string + format: binary + /config: + get: + tags: + - ConfigMap + summary: GET /api/v3/config + security: + - authToken: [] + parameters: [] + responses: + '200': + description: Success + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + content: + application/json: + schema: + type: object + '401': + description: Not Authorized + '404': + description: Not Found + '500': + description: Internal Server Error + put: + tags: + - ConfigMap + summary: PUT /api/v3/config + security: + - authToken: [] + parameters: [] + responses: + '200': + description: Success + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + content: + application/json: + schema: + type: object + '400': + description: Bad Request + '401': + description: Not Authorized + '404': + description: Not Found + '500': + description: Internal Server Error + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/configUpdate' + /config/{key}: + get: + tags: + - ConfigMap + summary: GET /api/v3/config/:key + security: + - authToken: [] + parameters: + - name: key + in: path + required: true + schema: + type: string + responses: + '200': + description: Success + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + content: + application/json: + schema: + type: object + '401': + description: Not Authorized + '404': + description: Not Found + '500': + description: Internal Server Error + /configmaps: + post: + tags: + - ConfigMap + summary: POST /api/v3/configmaps + security: + - authToken: [] + parameters: [] + responses: + '201': + description: Created + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + content: + application/json: + schema: + type: object + '400': + description: Bad Request + '401': + description: Not Authorized + '409': + description: Duplicate Name + '500': + description: Internal Server Error + requestBody: + required: true + content: + application/json: + schema: + type: object + get: + tags: + - ConfigMap + summary: GET /api/v3/configmaps + security: + - authToken: [] + parameters: [] + responses: + '200': + description: Success + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + content: + application/json: + schema: + type: object + '401': + description: Not Authorized + '404': + description: Not Found + '500': + description: Internal Server Error + /configmaps/yaml: + post: + tags: + - ConfigMap + summary: POST /api/v3/configmaps/yaml + security: + - authToken: [] + parameters: [] + responses: + '201': + description: Created + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + content: + application/json: + schema: + type: object + '400': + description: Bad Request + '401': + description: Not Authorized + '409': + description: Duplicate Name + '500': + description: Internal Server Error + requestBody: + required: true + content: + multipart/form-data: + schema: + type: object + properties: + application: + type: string + format: binary + /configmaps/{name}: + patch: + tags: + - ConfigMap + summary: PATCH /api/v3/configmaps/:name + security: + - authToken: [] + parameters: + - name: name + in: path + required: true + schema: + type: string + responses: + '200': + description: Success + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + content: + application/json: + schema: + type: object + '401': + description: Not Authorized + '404': + description: Not Found + '500': + description: Internal Server Error + requestBody: + required: true + content: + application/json: + schema: + type: object + get: + tags: + - ConfigMap + summary: GET /api/v3/configmaps/:name + security: + - authToken: [] + parameters: + - name: name + in: path + required: true + schema: + type: string + responses: + '200': + description: Success + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + content: + application/json: + schema: + type: object + '401': + description: Not Authorized + '404': + description: Not Found + '500': + description: Internal Server Error + delete: + tags: + - ConfigMap + summary: DELETE /api/v3/configmaps/:name + security: + - authToken: [] + parameters: + - name: name + in: path + required: true + schema: + type: string + responses: + '204': + description: Success + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + '401': + description: Not Authorized + '404': + description: Not Found + '500': + description: Internal Server Error + /configmaps/yaml/{name}: + patch: + tags: + - ConfigMap + summary: PATCH /api/v3/configmaps/yaml/:name + security: + - authToken: [] + parameters: + - name: name + in: path + required: true + schema: + type: string + responses: + '200': + description: Success + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + content: + application/json: + schema: + type: object + '401': + description: Not Authorized + '404': + description: Not Found + '500': + description: Internal Server Error + requestBody: + required: true + content: + application/json: + schema: + type: object + /status: + get: + tags: + - Controller + summary: GET /api/v3/status + security: + - authToken: [] + parameters: [] + responses: + '200': + description: Success + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + content: + application/json: + schema: + type: object + '401': + description: Not Authorized + '404': + description: Not Found + '500': + description: Internal Server Error + /fog-types/: + get: + tags: + - Controller + summary: GET /api/v3/fog-types/ + security: + - authToken: [] + parameters: [] + responses: + '200': + description: Success + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + content: + application/json: + schema: + type: object + '401': + description: Not Authorized + '404': + description: Not Found + '500': + description: Internal Server Error + /microservices/{uuid}/image-snapshot: + post: + tags: + - Microservices + summary: POST /api/v3/microservices/:uuid/image-snapshot + security: + - authToken: [] + parameters: + - name: uuid + in: path + required: true + schema: + type: string + responses: + '201': + description: Created + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + content: + application/json: + schema: + type: object + '400': + description: Bad Request + '401': + description: Not Authorized + '409': + description: Duplicate Name + '500': + description: Internal Server Error + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/microserviceCreate' + get: + tags: + - Microservices + summary: GET /api/v3/microservices/:uuid/image-snapshot + security: + - authToken: [] + parameters: + - name: uuid + in: path + required: true + schema: + type: string + responses: + '200': + description: Success + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + content: + application/json: + schema: + type: object + properties: + microservices: + type: array + items: + type: object + properties: + uuid: + type: string + name: + type: string + config: + type: object + '401': + description: Not Authorized + '404': + description: Not Found + '500': + description: Internal Server Error + /microservices/{uuid}/strace: + patch: + tags: + - Microservices + summary: PATCH /api/v3/microservices/:uuid/strace + security: + - authToken: [] + parameters: + - name: uuid + in: path + required: true + schema: + type: string + responses: + '200': + description: Success + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + content: + application/json: + schema: + type: object + '401': + description: Not Authorized + '404': + description: Not Found + '500': + description: Internal Server Error + requestBody: + required: true + content: + application/json: + schema: + type: object + get: + tags: + - Microservices + summary: GET /api/v3/microservices/:uuid/strace + security: + - authToken: [] + parameters: + - name: uuid + in: path + required: true + schema: + type: string + responses: + '200': + description: Success + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + content: + application/json: + schema: + type: object + properties: + microservices: + type: array + items: + type: object + properties: + uuid: + type: string + name: + type: string + config: + type: object + '401': + description: Not Authorized + '404': + description: Not Found + '500': + description: Internal Server Error + put: + tags: + - Microservices + summary: PUT /api/v3/microservices/:uuid/strace + security: + - authToken: [] + parameters: + - name: uuid + in: path + required: true + schema: + type: string + responses: + '200': + description: Success + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + content: + application/json: + schema: + type: object + '400': + description: Bad Request + '401': + description: Not Authorized + '404': + description: Not Found + '500': + description: Internal Server Error + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/microserviceUpdate' + /edgeResources: + get: + tags: + - Edge Resource + summary: GET /api/v3/edgeResources + security: + - authToken: [] + parameters: [] + responses: + '200': + description: Success + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + content: + application/json: + schema: + type: object + '401': + description: Not Authorized + '404': + description: Not Found + '500': + description: Internal Server Error + /edgeResource/{name}/{version}: + get: + tags: + - Edge Resource + summary: GET /api/v3/edgeResource/:name/:version + security: + - authToken: [] + parameters: + - name: name + in: path + required: true + schema: + type: string + - name: version + in: path + required: true + schema: + type: string + responses: + '200': + description: Success + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + content: + application/json: + schema: + type: object + '401': + description: Not Authorized + '404': + description: Not Found + '500': + description: Internal Server Error + put: + tags: + - Edge Resource + summary: PUT /api/v3/edgeResource/:name/:version + security: + - authToken: [] + parameters: + - name: name + in: path + required: true + schema: + type: string + - name: version + in: path + required: true + schema: + type: string + responses: + '200': + description: Success + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + content: + application/json: + schema: + type: object + '400': + description: Bad Request + '401': + description: Not Authorized + '404': + description: Not Found + '500': + description: Internal Server Error + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/edgeResourceUpdate' + delete: + tags: + - Edge Resource + summary: DELETE /api/v3/edgeResource/:name/:version + security: + - authToken: [] + parameters: + - name: name + in: path + required: true + schema: + type: string + - name: version + in: path + required: true + schema: + type: string + responses: + '204': + description: Success + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + '401': + description: Not Authorized + '404': + description: Not Found + '500': + description: Internal Server Error + /edgeResource/{name}: + get: + tags: + - Edge Resource + summary: GET /api/v3/edgeResource/:name + security: + - authToken: [] + parameters: + - name: name + in: path + required: true + schema: + type: string + responses: + '200': + description: Success + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + content: + application/json: + schema: + type: object + '401': + description: Not Authorized + '404': + description: Not Found + '500': + description: Internal Server Error + /edgeResource: + post: + tags: + - Edge Resource + summary: POST /api/v3/edgeResource + security: + - authToken: [] + parameters: [] + responses: + '201': + description: Created + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + content: + application/json: + schema: + type: object + '400': + description: Bad Request + '401': + description: Not Authorized + '409': + description: Duplicate Name + '500': + description: Internal Server Error + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/edgeResourceCreate' + /edgeResource/{name}/{version}/link: + post: + tags: + - Edge Resource + summary: POST /api/v3/edgeResource/:name/:version/link + security: + - authToken: [] + parameters: + - name: name + in: path + required: true + schema: + type: string + - name: version + in: path + required: true + schema: + type: string + responses: + '201': + description: Created + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + content: + application/json: + schema: + type: object + '400': + description: Bad Request + '401': + description: Not Authorized + '409': + description: Duplicate Name + '500': + description: Internal Server Error + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/edgeResourceCreate' + delete: + tags: + - Edge Resource + summary: DELETE /api/v3/edgeResource/:name/:version/link + security: + - authToken: [] + parameters: + - name: name + in: path + required: true + schema: + type: string + - name: version + in: path + required: true + schema: + type: string + responses: + '204': + description: Success + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + '401': + description: Not Authorized + '404': + description: Not Found + '500': + description: Internal Server Error + /flow: + get: + tags: + - Application + summary: GET /api/v3/flow + security: + - authToken: [] + parameters: [] + responses: + '200': + description: Success + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + content: + application/json: + schema: + type: object + '401': + description: Not Authorized + '404': + description: Not Found + '500': + description: Internal Server Error + post: + tags: + - Application + summary: POST /api/v3/flow + security: + - authToken: [] + parameters: [] + responses: + '201': + description: Created + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + content: + application/json: + schema: + type: object + '400': + description: Bad Request + '401': + description: Not Authorized + '409': + description: Duplicate Name + '500': + description: Internal Server Error + requestBody: + required: true + content: + application/json: + schema: + type: object + /flow/{id}: + get: + tags: + - Application + summary: GET /api/v3/flow/:id + security: + - authToken: [] + parameters: + - name: id + in: path + required: true + schema: + type: string + responses: + '200': + description: Success + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + content: + application/json: + schema: + type: object + '401': + description: Not Authorized + '404': + description: Not Found + '500': + description: Internal Server Error + patch: + tags: + - Application + summary: PATCH /api/v3/flow/:id + security: + - authToken: [] + parameters: + - name: id + in: path + required: true + schema: + type: string + responses: + '200': + description: Success + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + content: + application/json: + schema: + type: object + '401': + description: Not Authorized + '404': + description: Not Found + '500': + description: Internal Server Error + requestBody: + required: true + content: + application/json: + schema: + type: object + delete: + tags: + - Application + summary: DELETE /api/v3/flow/:id + security: + - authToken: [] + parameters: + - name: id + in: path + required: true + schema: + type: string + responses: + '204': + description: Success + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + '401': + description: Not Authorized + '404': + description: Not Found + '500': + description: Internal Server Error + /iofog-list: + get: + tags: + - ioFog + summary: GET /api/v3/iofog-list + security: + - authToken: [] + parameters: [] + responses: + '200': + description: Success + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + content: + application/json: + schema: + type: object + '401': + description: Not Authorized + '404': + description: Not Found + '500': + description: Internal Server Error + /iofog: + post: + tags: + - ioFog + summary: POST /api/v3/iofog + security: + - authToken: [] + parameters: [] + responses: + '201': + description: Created + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + content: + application/json: + schema: + type: object + '400': + description: Bad Request + '401': + description: Not Authorized + '409': + description: Duplicate Name + '500': + description: Internal Server Error + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/iofogCreate' + /iofog/{uuid}: + patch: + tags: + - ioFog + summary: PATCH /api/v3/iofog/:uuid + security: + - authToken: [] + parameters: + - name: uuid + in: path + required: true + schema: + type: string + responses: + '200': + description: Success + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + content: + application/json: + schema: + type: object + '401': + description: Not Authorized + '404': + description: Not Found + '500': + description: Internal Server Error + requestBody: + required: true + content: + application/json: + schema: + type: object + delete: + tags: + - ioFog + summary: DELETE /api/v3/iofog/:uuid + security: + - authToken: [] + parameters: + - name: uuid + in: path + required: true + schema: + type: string + responses: + '204': + description: Success + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + '401': + description: Not Authorized + '404': + description: Not Found + '500': + description: Internal Server Error + get: + tags: + - ioFog + summary: GET /api/v3/iofog/:uuid + security: + - authToken: [] + parameters: + - name: uuid + in: path + required: true + schema: + type: string + responses: + '200': + description: Success + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + content: + application/json: + schema: + type: object + '401': + description: Not Authorized + '404': + description: Not Found + '500': + description: Internal Server Error + /iofog/{uuid}/provisioning-key: + get: + tags: + - ioFog + summary: GET /api/v3/iofog/:uuid/provisioning-key + security: + - authToken: [] + parameters: + - name: uuid + in: path + required: true + schema: + type: string + responses: + '200': + description: Success + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + content: + application/json: + schema: + type: object + '401': + description: Not Authorized + '404': + description: Not Found + '500': + description: Internal Server Error + /iofog/{uuid}/version/{versionCommand}: + post: + tags: + - ioFog + summary: POST /api/v3/iofog/:uuid/version/:versionCommand + security: + - authToken: [] + parameters: + - name: uuid + in: path + required: true + schema: + type: string + - name: versionCommand + in: path + required: true + schema: + type: string + responses: + '201': + description: Created + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + content: + application/json: + schema: + type: object + '400': + description: Bad Request + '401': + description: Not Authorized + '409': + description: Duplicate Name + '500': + description: Internal Server Error + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/iofogCreate' + /iofog/{uuid}/reboot: + post: + tags: + - ioFog + summary: POST /api/v3/iofog/:uuid/reboot + security: + - authToken: [] + parameters: + - name: uuid + in: path + required: true + schema: + type: string + responses: + '201': + description: Created + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + content: + application/json: + schema: + type: object + '400': + description: Bad Request + '401': + description: Not Authorized + '409': + description: Duplicate Name + '500': + description: Internal Server Error + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/iofogCreate' + /iofog/{uuid}/hal/hw: + get: + tags: + - ioFog + summary: GET /api/v3/iofog/:uuid/hal/hw + security: + - authToken: [] + parameters: + - name: uuid + in: path + required: true + schema: + type: string + responses: + '200': + description: Success + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + content: + application/json: + schema: + type: object + '401': + description: Not Authorized + '404': + description: Not Found + '500': + description: Internal Server Error + /iofog/{uuid}/hal/usb: + get: + tags: + - ioFog + summary: GET /api/v3/iofog/:uuid/hal/usb + security: + - authToken: [] + parameters: + - name: uuid + in: path + required: true + schema: + type: string + responses: + '200': + description: Success + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + content: + application/json: + schema: + type: object + '401': + description: Not Authorized + '404': + description: Not Found + '500': + description: Internal Server Error + /iofog/{uuid}/prune: + post: + tags: + - ioFog + summary: POST /api/v3/iofog/:uuid/prune + security: + - authToken: [] + parameters: + - name: uuid + in: path + required: true + schema: + type: string + responses: + '201': + description: Created + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + content: + application/json: + schema: + type: object + '400': + description: Bad Request + '401': + description: Not Authorized + '409': + description: Duplicate Name + '500': + description: Internal Server Error + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/iofogCreate' + /microservices/: + get: + tags: + - Microservices + summary: GET /api/v3/microservices/ + security: + - authToken: [] + parameters: [] + responses: + '200': + description: Success + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + content: + application/json: + schema: + type: object + properties: + microservices: + type: array + items: + type: object + properties: + uuid: + type: string + name: + type: string + config: + type: object + '401': + description: Not Authorized + '404': + description: Not Found + '500': + description: Internal Server Error + /microservices/system: + get: + tags: + - Microservices + summary: GET /api/v3/microservices/system + security: + - authToken: [] + parameters: [] + responses: + '200': + description: Success + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + content: + application/json: + schema: + type: object + properties: + microservices: + type: array + items: + type: object + properties: + uuid: + type: string + name: + type: string + config: + type: object + '401': + description: Not Authorized + '404': + description: Not Found + '500': + description: Internal Server Error + /microservices: + post: + tags: + - Microservices + summary: POST /api/v3/microservices + security: + - authToken: [] + parameters: [] + responses: + '201': + description: Created + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + content: + application/json: + schema: + type: object + '400': + description: Bad Request + '401': + description: Not Authorized + '409': + description: Duplicate Name + '500': + description: Internal Server Error + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/microserviceCreate' + /microservices/yaml: + post: + tags: + - Microservices + summary: POST /api/v3/microservices/yaml + security: + - authToken: [] + parameters: [] + responses: + '201': + description: Created + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + content: + application/json: + schema: + type: object + '400': + description: Bad Request + '401': + description: Not Authorized + '409': + description: Duplicate Name + '500': + description: Internal Server Error + requestBody: + required: true + content: + multipart/form-data: + schema: + type: object + properties: + application: + type: string + format: binary + /microservices/{uuid}: + get: + tags: + - Microservices + summary: GET /api/v3/microservices/:uuid + security: + - authToken: [] + parameters: + - name: uuid + in: path + required: true + schema: + type: string + responses: + '200': + description: Success + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + content: + application/json: + schema: + type: object + properties: + microservices: + type: array + items: + type: object + properties: + uuid: + type: string + name: + type: string + config: + type: object + '401': + description: Not Authorized + '404': + description: Not Found + '500': + description: Internal Server Error + patch: + tags: + - Microservices + summary: PATCH /api/v3/microservices/:uuid + security: + - authToken: [] + parameters: + - name: uuid + in: path + required: true + schema: + type: string + responses: + '200': + description: Success + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + content: + application/json: + schema: + type: object + '401': + description: Not Authorized + '404': + description: Not Found + '500': + description: Internal Server Error + requestBody: + required: true + content: + application/json: + schema: + type: object + delete: + tags: + - Microservices + summary: DELETE /api/v3/microservices/:uuid + security: + - authToken: [] + parameters: + - name: uuid + in: path + required: true + schema: + type: string + responses: + '204': + description: Success + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + '401': + description: Not Authorized + '404': + description: Not Found + '500': + description: Internal Server Error + /microservices/system/{uuid}: + get: + tags: + - Microservices + summary: GET /api/v3/microservices/system/:uuid + security: + - authToken: [] + parameters: + - name: uuid + in: path + required: true + schema: + type: string + responses: + '200': + description: Success + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + content: + application/json: + schema: + type: object + properties: + microservices: + type: array + items: + type: object + properties: + uuid: + type: string + name: + type: string + config: + type: object + '401': + description: Not Authorized + '404': + description: Not Found + '500': + description: Internal Server Error + patch: + tags: + - Microservices + summary: PATCH /api/v3/microservices/system/:uuid + security: + - authToken: [] + parameters: + - name: uuid + in: path + required: true + schema: + type: string + responses: + '200': + description: Success + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + content: + application/json: + schema: + type: object + '401': + description: Not Authorized + '404': + description: Not Found + '500': + description: Internal Server Error + requestBody: + required: true + content: + application/json: + schema: + type: object + /microservices/pub/{tag}: + get: + tags: + - Microservices + summary: GET /api/v3/microservices/pub/:tag + security: + - authToken: [] + parameters: + - name: tag + in: path + required: true + schema: + type: string + responses: + '200': + description: Success + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + content: + application/json: + schema: + type: object + properties: + microservices: + type: array + items: + type: object + properties: + uuid: + type: string + name: + type: string + config: + type: object + '401': + description: Not Authorized + '404': + description: Not Found + '500': + description: Internal Server Error + /microservices/sub/{tag}: + get: + tags: + - Microservices + summary: GET /api/v3/microservices/sub/:tag + security: + - authToken: [] + parameters: + - name: tag + in: path + required: true + schema: + type: string + responses: + '200': + description: Success + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + content: + application/json: + schema: + type: object + properties: + microservices: + type: array + items: + type: object + properties: + uuid: + type: string + name: + type: string + config: + type: object + '401': + description: Not Authorized + '404': + description: Not Found + '500': + description: Internal Server Error + /microservices/{uuid}/rebuild: + patch: + tags: + - Microservices + summary: PATCH /api/v3/microservices/:uuid/rebuild + security: + - authToken: [] + parameters: + - name: uuid + in: path + required: true + schema: + type: string + responses: + '200': + description: Success + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + content: + application/json: + schema: + type: object + '401': + description: Not Authorized + '404': + description: Not Found + '500': + description: Internal Server Error + requestBody: + required: true + content: + application/json: + schema: + type: object + /microservices/system/{uuid}/rebuild: + patch: + tags: + - Microservices + summary: PATCH /api/v3/microservices/system/:uuid/rebuild + security: + - authToken: [] + parameters: + - name: uuid + in: path + required: true + schema: + type: string + responses: + '200': + description: Success + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + content: + application/json: + schema: + type: object + '401': + description: Not Authorized + '404': + description: Not Found + '500': + description: Internal Server Error + requestBody: + required: true + content: + application/json: + schema: + type: object + /microservices/yaml/{uuid}: + patch: + tags: + - Microservices + summary: PATCH /api/v3/microservices/yaml/:uuid + security: + - authToken: [] + parameters: + - name: uuid + in: path + required: true + schema: + type: string + responses: + '200': + description: Success + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + content: + application/json: + schema: + type: object + '401': + description: Not Authorized + '404': + description: Not Found + '500': + description: Internal Server Error + requestBody: + required: true + content: + application/json: + schema: + type: object + /microservices/system/yaml/{uuid}: + patch: + tags: + - Microservices + summary: PATCH /api/v3/microservices/system/yaml/:uuid + security: + - authToken: [] + parameters: + - name: uuid + in: path + required: true + schema: + type: string + responses: + '200': + description: Success + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + content: + application/json: + schema: + type: object + '401': + description: Not Authorized + '404': + description: Not Found + '500': + description: Internal Server Error + requestBody: + required: true + content: + application/json: + schema: + type: object + /microservices/{uuid}/routes/{receiverUuid}: + post: + tags: + - Microservices + summary: POST /api/v3/microservices/:uuid/routes/:receiverUuid + security: + - authToken: [] + parameters: + - name: uuid + in: path + required: true + schema: + type: string + - name: receiverUuid + in: path + required: true + schema: + type: string + responses: + '201': + description: Created + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + content: + application/json: + schema: + type: object + '400': + description: Bad Request + '401': + description: Not Authorized + '409': + description: Duplicate Name + '500': + description: Internal Server Error + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/microserviceCreate' + delete: + tags: + - Microservices + summary: DELETE /api/v3/microservices/:uuid/routes/:receiverUuid + security: + - authToken: [] + parameters: + - name: uuid + in: path + required: true + schema: + type: string + - name: receiverUuid + in: path + required: true + schema: + type: string + responses: + '204': + description: Success + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + '401': + description: Not Authorized + '404': + description: Not Found + '500': + description: Internal Server Error + /microservices/{uuid}/port-mapping: + post: + tags: + - Microservices + summary: POST /api/v3/microservices/:uuid/port-mapping + security: + - authToken: [] + parameters: + - name: uuid + in: path + required: true + schema: + type: string + responses: + '201': + description: Created + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + content: + application/json: + schema: + type: object + '400': + description: Bad Request + '401': + description: Not Authorized + '409': + description: Duplicate Name + '500': + description: Internal Server Error + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/microserviceCreate' + get: + tags: + - Microservices + summary: GET /api/v3/microservices/:uuid/port-mapping + security: + - authToken: [] + parameters: + - name: uuid + in: path + required: true + schema: + type: string + responses: + '200': + description: Success + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + content: + application/json: + schema: + type: object + properties: + microservices: + type: array + items: + type: object + properties: + uuid: + type: string + name: + type: string + config: + type: object + '401': + description: Not Authorized + '404': + description: Not Found + '500': + description: Internal Server Error + /microservices/system/{uuid}/port-mapping: + post: + tags: + - Microservices + summary: POST /api/v3/microservices/system/:uuid/port-mapping + security: + - authToken: [] + parameters: + - name: uuid + in: path + required: true + schema: + type: string + responses: + '201': + description: Created + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + content: + application/json: + schema: + type: object + '400': + description: Bad Request + '401': + description: Not Authorized + '409': + description: Duplicate Name + '500': + description: Internal Server Error + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/microserviceCreate' + /microservices/{uuid}/port-mapping/{internalPort}: + delete: + tags: + - Microservices + summary: DELETE /api/v3/microservices/:uuid/port-mapping/:internalPort + security: + - authToken: [] + parameters: + - name: uuid + in: path + required: true + schema: + type: string + - name: internalPort + in: path + required: true + schema: + type: string + responses: + '204': + description: Success + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + '401': + description: Not Authorized + '404': + description: Not Found + '500': + description: Internal Server Error + /microservices/system/{uuid}/port-mapping/{internalPort}: + delete: + tags: + - Microservices + summary: DELETE /api/v3/microservices/system/:uuid/port-mapping/:internalPort + security: + - authToken: [] + parameters: + - name: uuid + in: path + required: true + schema: + type: string + - name: internalPort + in: path + required: true + schema: + type: string + responses: + '204': + description: Success + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + '401': + description: Not Authorized + '404': + description: Not Found + '500': + description: Internal Server Error + /microservices/{uuid}/volume-mapping: + get: + tags: + - Microservices + summary: GET /api/v3/microservices/:uuid/volume-mapping + security: + - authToken: [] + parameters: + - name: uuid + in: path + required: true + schema: + type: string + responses: + '200': + description: Success + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + content: + application/json: + schema: + type: object + properties: + microservices: + type: array + items: + type: object + properties: + uuid: + type: string + name: + type: string + config: + type: object + '401': + description: Not Authorized + '404': + description: Not Found + '500': + description: Internal Server Error + post: + tags: + - Microservices + summary: POST /api/v3/microservices/:uuid/volume-mapping + security: + - authToken: [] + parameters: + - name: uuid + in: path + required: true + schema: + type: string + responses: + '201': + description: Created + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + content: + application/json: + schema: + type: object + '400': + description: Bad Request + '401': + description: Not Authorized + '409': + description: Duplicate Name + '500': + description: Internal Server Error + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/microserviceCreate' + /microservices/system/{uuid}/volume-mapping: + post: + tags: + - Microservices + summary: POST /api/v3/microservices/system/:uuid/volume-mapping + security: + - authToken: [] + parameters: + - name: uuid + in: path + required: true + schema: + type: string + responses: + '201': + description: Created + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + content: + application/json: + schema: + type: object + '400': + description: Bad Request + '401': + description: Not Authorized + '409': + description: Duplicate Name + '500': + description: Internal Server Error + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/microserviceCreate' + /microservices/{uuid}/volume-mapping/{id}: + delete: + tags: + - Microservices + summary: DELETE /api/v3/microservices/:uuid/volume-mapping/:id + security: + - authToken: [] + parameters: + - name: uuid + in: path + required: true + schema: + type: string + - name: id + in: path + required: true + schema: + type: string + responses: + '204': + description: Success + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + '401': + description: Not Authorized + '404': + description: Not Found + '500': + description: Internal Server Error + /microservices/system/{uuid}/volume-mapping/{id}: + delete: + tags: + - Microservices + summary: DELETE /api/v3/microservices/system/:uuid/volume-mapping/:id + security: + - authToken: [] + parameters: + - name: uuid + in: path + required: true + schema: + type: string + - name: id + in: path + required: true + schema: + type: string + responses: + '204': + description: Success + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + '401': + description: Not Authorized + '404': + description: Not Found + '500': + description: Internal Server Error + /microservices/{uuid}/exec: + post: + tags: + - Microservices + summary: POST /api/v3/microservices/:uuid/exec + security: + - authToken: [] + parameters: + - name: uuid + in: path + required: true + schema: + type: string + responses: + '201': + description: Created + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + content: + application/json: + schema: + type: object + '400': + description: Bad Request + '401': + description: Not Authorized + '409': + description: Duplicate Name + '500': + description: Internal Server Error + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/microserviceCreate' + delete: + tags: + - Microservices + summary: DELETE /api/v3/microservices/:uuid/exec + security: + - authToken: [] + parameters: + - name: uuid + in: path + required: true + schema: + type: string + responses: + '204': + description: Success + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + '401': + description: Not Authorized + '404': + description: Not Found + '500': + description: Internal Server Error + /microservices/system/{uuid}/exec: + post: + tags: + - Microservices + summary: POST /api/v3/microservices/system/:uuid/exec + security: + - authToken: [] + parameters: + - name: uuid + in: path + required: true + schema: + type: string + responses: + '201': + description: Created + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + content: + application/json: + schema: + type: object + '400': + description: Bad Request + '401': + description: Not Authorized + '409': + description: Duplicate Name + '500': + description: Internal Server Error + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/microserviceCreate' + delete: + tags: + - Microservices + summary: DELETE /api/v3/microservices/system/:uuid/exec + security: + - authToken: [] + parameters: + - name: uuid + in: path + required: true + schema: + type: string + responses: + '204': + description: Success + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + '401': + description: Not Authorized + '404': + description: Not Found + '500': + description: Internal Server Error + /registries: + post: + tags: + - Registries + summary: POST /api/v3/registries + security: + - authToken: [] + parameters: [] + responses: + '201': + description: Created + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + content: + application/json: + schema: + type: object + '400': + description: Bad Request + '401': + description: Not Authorized + '409': + description: Duplicate Name + '500': + description: Internal Server Error + requestBody: + required: true + content: + application/json: + schema: + type: object + get: + tags: + - Registries + summary: GET /api/v3/registries + security: + - authToken: [] + parameters: [] + responses: + '200': + description: Success + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + content: + application/json: + schema: + type: object + '401': + description: Not Authorized + '404': + description: Not Found + '500': + description: Internal Server Error + /registries/{id}: + delete: + tags: + - Registries + summary: DELETE /api/v3/registries/:id + security: + - authToken: [] + parameters: + - name: id + in: path + required: true + schema: + type: string + responses: + '204': + description: Success + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + '401': + description: Not Authorized + '404': + description: Not Found + '500': + description: Internal Server Error + patch: + tags: + - Registries + summary: PATCH /api/v3/registries/:id + security: + - authToken: [] + parameters: + - name: id + in: path + required: true + schema: + type: string + responses: + '200': + description: Success + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + content: + application/json: + schema: + type: object + '401': + description: Not Authorized + '404': + description: Not Found + '500': + description: Internal Server Error + requestBody: + required: true + content: + application/json: + schema: + type: object + /router: + get: + tags: + - Router + summary: GET /api/v3/router + security: + - authToken: [] + parameters: [] + responses: + '200': + description: Success + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + content: + application/json: + schema: + type: object + '401': + description: Not Authorized + '404': + description: Not Found + '500': + description: Internal Server Error + put: + tags: + - Router + summary: PUT /api/v3/router + security: + - authToken: [] + parameters: [] + responses: + '200': + description: Success + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + content: + application/json: + schema: + type: object + '400': + description: Bad Request + '401': + description: Not Authorized + '404': + description: Not Found + '500': + description: Internal Server Error + requestBody: + required: true + content: + application/json: + schema: + type: object + /routes: + get: + tags: + - Routing + summary: GET /api/v3/routes + security: + - authToken: [] + parameters: [] + responses: + '200': + description: Success + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + content: + application/json: + schema: + type: object + '401': + description: Not Authorized + '404': + description: Not Found + '500': + description: Internal Server Error + post: + tags: + - Routing + summary: POST /api/v3/routes + security: + - authToken: [] + parameters: [] + responses: + '201': + description: Created + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + content: + application/json: + schema: + type: object + '400': + description: Bad Request + '401': + description: Not Authorized + '409': + description: Duplicate Name + '500': + description: Internal Server Error + requestBody: + required: true + content: + application/json: + schema: + type: object + /routes/{appName}/{name}: + get: + tags: + - Routing + summary: GET /api/v3/routes/:appName/:name + security: + - authToken: [] + parameters: + - name: appName + in: path + required: true + schema: + type: string + - name: name + in: path + required: true + schema: + type: string + responses: + '200': + description: Success + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + content: + application/json: + schema: + type: object + '401': + description: Not Authorized + '404': + description: Not Found + '500': + description: Internal Server Error + patch: + tags: + - Routing + summary: PATCH /api/v3/routes/:appName/:name + security: + - authToken: [] + parameters: + - name: appName + in: path + required: true + schema: + type: string + - name: name + in: path + required: true + schema: + type: string + responses: + '200': + description: Success + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + content: + application/json: + schema: + type: object + '401': + description: Not Authorized + '404': + description: Not Found + '500': + description: Internal Server Error + requestBody: + required: true + content: + application/json: + schema: + type: object + delete: + tags: + - Routing + summary: DELETE /api/v3/routes/:appName/:name + security: + - authToken: [] + parameters: + - name: appName + in: path + required: true + schema: + type: string + - name: name + in: path + required: true + schema: + type: string + responses: + '204': + description: Success + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + '401': + description: Not Authorized + '404': + description: Not Found + '500': + description: Internal Server Error + /secrets: + post: + tags: + - Secrets + summary: POST /api/v3/secrets + security: + - authToken: [] + parameters: [] + responses: + '201': + description: Created + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + content: + application/json: + schema: + type: object + '400': + description: Bad Request + '401': + description: Not Authorized + '409': + description: Duplicate Name + '500': + description: Internal Server Error + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/secretCreate' + get: + tags: + - Secrets + summary: GET /api/v3/secrets + security: + - authToken: [] + parameters: [] + responses: + '200': + description: Success + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + content: + application/json: + schema: + type: object + '401': + description: Not Authorized + '404': + description: Not Found + '500': + description: Internal Server Error + /secrets/yaml: + post: + tags: + - Secrets + summary: POST /api/v3/secrets/yaml + security: + - authToken: [] + parameters: [] + responses: + '201': + description: Created + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + content: + application/json: + schema: + type: object + '400': + description: Bad Request + '401': + description: Not Authorized + '409': + description: Duplicate Name + '500': + description: Internal Server Error + requestBody: + required: true + content: + multipart/form-data: + schema: + type: object + properties: + application: + type: string + format: binary + /secrets/{name}: + patch: + tags: + - Secrets + summary: PATCH /api/v3/secrets/:name + security: + - authToken: [] + parameters: + - name: name + in: path + required: true + schema: + type: string + responses: + '200': + description: Success + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + content: + application/json: + schema: + type: object + '401': + description: Not Authorized + '404': + description: Not Found + '500': + description: Internal Server Error + requestBody: + required: true + content: + application/json: + schema: + type: object + get: + tags: + - Secrets + summary: GET /api/v3/secrets/:name + security: + - authToken: [] + parameters: + - name: name + in: path + required: true + schema: + type: string + responses: + '200': + description: Success + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + content: + application/json: + schema: + type: object + '401': + description: Not Authorized + '404': + description: Not Found + '500': + description: Internal Server Error + delete: + tags: + - Secrets + summary: DELETE /api/v3/secrets/:name + security: + - authToken: [] + parameters: + - name: name + in: path + required: true + schema: + type: string + responses: + '204': + description: Success + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + '401': + description: Not Authorized + '404': + description: Not Found + '500': + description: Internal Server Error + /secrets/yaml/{name}: + patch: + tags: + - Secrets + summary: PATCH /api/v3/secrets/yaml/:name + security: + - authToken: [] + parameters: + - name: name + in: path + required: true + schema: + type: string + responses: + '200': + description: Success + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + content: + application/json: + schema: + type: object + '401': + description: Not Authorized + '404': + description: Not Found + '500': + description: Internal Server Error + requestBody: + required: true + content: + application/json: + schema: + type: object + /services: + get: + tags: + - Services + summary: GET /api/v3/services + security: + - authToken: [] + parameters: [] + responses: + '200': + description: Success + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + content: + application/json: + schema: + type: object + '401': + description: Not Authorized + '404': + description: Not Found + '500': + description: Internal Server Error + post: + tags: + - Services + summary: POST /api/v3/services + security: + - authToken: [] + parameters: [] + responses: + '201': + description: Created + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + content: + application/json: + schema: + type: object + '400': + description: Bad Request + '401': + description: Not Authorized + '409': + description: Duplicate Name + '500': + description: Internal Server Error + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/serviceCreate' + /services/{name}: + get: + tags: + - Services + summary: GET /api/v3/services/:name + security: + - authToken: [] + parameters: + - name: name + in: path + required: true + schema: + type: string + responses: + '200': + description: Success + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + content: + application/json: + schema: + type: object + '401': + description: Not Authorized + '404': + description: Not Found + '500': + description: Internal Server Error + patch: + tags: + - Services + summary: PATCH /api/v3/services/:name + security: + - authToken: [] + parameters: + - name: name + in: path + required: true + schema: + type: string + responses: + '200': + description: Success + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + content: + application/json: + schema: + type: object + '401': + description: Not Authorized + '404': + description: Not Found + '500': + description: Internal Server Error + requestBody: + required: true + content: + application/json: + schema: + type: object + delete: + tags: + - Services + summary: DELETE /api/v3/services/:name + security: + - authToken: [] + parameters: + - name: name + in: path + required: true + schema: + type: string + responses: + '204': + description: Success + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + '401': + description: Not Authorized + '404': + description: Not Found + '500': + description: Internal Server Error + /services/yaml: + post: + tags: + - Services + summary: POST /api/v3/services/yaml + security: + - authToken: [] + parameters: [] + responses: + '201': + description: Created + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + content: + application/json: + schema: + type: object + '400': + description: Bad Request + '401': + description: Not Authorized + '409': + description: Duplicate Name + '500': + description: Internal Server Error + requestBody: + required: true + content: + multipart/form-data: + schema: + type: object + properties: + application: + type: string + format: binary + /services/yaml/{name}: + patch: + tags: + - Services + summary: PATCH /api/v3/services/yaml/:name + security: + - authToken: [] + parameters: + - name: name + in: path + required: true + schema: + type: string + responses: + '200': + description: Success + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + content: + application/json: + schema: + type: object + '401': + description: Not Authorized + '404': + description: Not Found + '500': + description: Internal Server Error + requestBody: + required: true + content: + application/json: + schema: + type: object + /iofog/{id}/tunnel: + patch: + tags: + - ioFog + summary: PATCH /api/v3/iofog/:id/tunnel + security: + - authToken: [] + parameters: + - name: id + in: path + required: true + schema: + type: string + responses: + '200': + description: Success + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + content: + application/json: + schema: + type: object + '401': + description: Not Authorized + '404': + description: Not Found + '500': + description: Internal Server Error + requestBody: + required: true + content: + application/json: + schema: + type: object + get: + tags: + - ioFog + summary: GET /api/v3/iofog/:id/tunnel + security: + - authToken: [] + parameters: + - name: id + in: path + required: true + schema: + type: string + responses: + '200': + description: Success + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + content: + application/json: + schema: + type: object + '401': + description: Not Authorized + '404': + description: Not Found + '500': + description: Internal Server Error + /user/login: + post: + tags: + - User + summary: POST /api/v3/user/login + security: + - authToken: [] + parameters: [] + responses: + '201': + description: Created + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + content: + application/json: + schema: + type: object + '400': + description: Bad Request + '401': + description: Not Authorized + '409': + description: Duplicate Name + '500': + description: Internal Server Error + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/login' + /user/refresh: + post: + tags: + - User + summary: POST /api/v3/user/refresh + security: + - authToken: [] + parameters: [] + responses: + '201': + description: Created + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + content: + application/json: + schema: + type: object + '400': + description: Bad Request + '401': + description: Not Authorized + '409': + description: Duplicate Name + '500': + description: Internal Server Error + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/login' + /user/profile: + get: + tags: + - User + summary: GET /api/v3/user/profile + security: + - authToken: [] + parameters: [] + responses: + '200': + description: Success + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + content: + application/json: + schema: + type: object + '401': + description: Not Authorized + '404': + description: Not Found + '500': + description: Internal Server Error + /user/logout: + post: + tags: + - User + summary: POST /api/v3/user/logout + security: + - authToken: [] + parameters: [] + responses: + '201': + description: Created + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + content: + application/json: + schema: + type: object + '400': + description: Bad Request + '401': + description: Not Authorized + '409': + description: Duplicate Name + '500': + description: Internal Server Error + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/login' + /volumeMounts: + get: + tags: + - VolumeMounts + summary: GET /api/v3/volumeMounts + security: + - authToken: [] + parameters: [] + responses: + '200': + description: Success + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + content: + application/json: + schema: + type: object + '401': + description: Not Authorized + '404': + description: Not Found + '500': + description: Internal Server Error + post: + tags: + - VolumeMounts + summary: POST /api/v3/volumeMounts + security: + - authToken: [] + parameters: [] + responses: + '201': + description: Created + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + content: + application/json: + schema: + type: object + '400': + description: Bad Request + '401': + description: Not Authorized + '409': + description: Duplicate Name + '500': + description: Internal Server Error + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/volumeMountCreate' + /volumeMounts/{name}: + get: + tags: + - VolumeMounts + summary: GET /api/v3/volumeMounts/:name + security: + - authToken: [] + parameters: + - name: name + in: path + required: true + schema: + type: string + responses: + '200': + description: Success + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + content: + application/json: + schema: + type: object + '401': + description: Not Authorized + '404': + description: Not Found + '500': + description: Internal Server Error + patch: + tags: + - VolumeMounts + summary: PATCH /api/v3/volumeMounts/:name + security: + - authToken: [] + parameters: + - name: name + in: path + required: true + schema: + type: string + responses: + '200': + description: Success + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + content: + application/json: + schema: + type: object + '401': + description: Not Authorized + '404': + description: Not Found + '500': + description: Internal Server Error + requestBody: + required: true + content: + application/json: + schema: + type: object + delete: + tags: + - VolumeMounts + summary: DELETE /api/v3/volumeMounts/:name + security: + - authToken: [] + parameters: + - name: name + in: path + required: true + schema: + type: string + responses: + '204': + description: Success + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + '401': + description: Not Authorized + '404': + description: Not Found + '500': + description: Internal Server Error + /volumeMounts/yaml: + post: + tags: + - VolumeMounts + summary: POST /api/v3/volumeMounts/yaml + security: + - authToken: [] + parameters: [] + responses: + '201': + description: Created + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + content: + application/json: + schema: + type: object + '400': + description: Bad Request + '401': + description: Not Authorized + '409': + description: Duplicate Name + '500': + description: Internal Server Error + requestBody: + required: true + content: + multipart/form-data: + schema: + type: object + properties: + application: + type: string + format: binary + /volumeMounts/yaml/{name}: + patch: + tags: + - VolumeMounts + summary: PATCH /api/v3/volumeMounts/yaml/:name + security: + - authToken: [] + parameters: + - name: name + in: path + required: true + schema: + type: string + responses: + '200': + description: Success + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + content: + application/json: + schema: + type: object + '401': + description: Not Authorized + '404': + description: Not Found + '500': + description: Internal Server Error + requestBody: + required: true + content: + application/json: + schema: + type: object + /volumeMounts/{name}/link: + post: + tags: + - VolumeMounts + summary: POST /api/v3/volumeMounts/:name/link + security: + - authToken: [] + parameters: + - name: name + in: path + required: true + schema: + type: string + responses: + '201': + description: Created + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + content: + application/json: + schema: + type: object + '400': + description: Bad Request + '401': + description: Not Authorized + '409': + description: Duplicate Name + '500': + description: Internal Server Error + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/volumeMountCreate' + delete: + tags: + - VolumeMounts + summary: DELETE /api/v3/volumeMounts/:name/link + security: + - authToken: [] + parameters: + - name: name + in: path + required: true + schema: + type: string + responses: + '204': + description: Success + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + '401': + description: Not Authorized + '404': + description: Not Found + '500': + description: Internal Server Error diff --git a/generate-swagger.sh b/generate-swagger.sh index 77bc013bb..3b4587500 100755 --- a/generate-swagger.sh +++ b/generate-swagger.sh @@ -1 +1,2 @@ -docker run -v ./docs:/docs mitjaziv/swagger-codegen-cli generate -i /docs/swagger.yaml -l swagger -o /docs \ No newline at end of file +#!/bin/bash +node scripts/generate-swagger.js \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index f68788513..497560557 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,6 +12,7 @@ "dependencies": { "@datasance/ecn-viewer": "0.5.4", "@kubernetes/client-node": "^0.22.3", + "@msgpack/msgpack": "^3.1.2", "@opentelemetry/api": "^1.9.0", "@opentelemetry/exporter-trace-otlp-http": "^0.200.0", "@opentelemetry/instrumentation-express": "^0.48.1", @@ -66,6 +67,7 @@ "umzug": "^3.7.0", "underscore": "1.13.6", "uuid": "11.1.0", + "ws": "^8.18.0", "xss-clean": "0.1.1" }, "bin": { @@ -77,11 +79,12 @@ "chai": "5.1.1", "chai-as-promised": "7.1.2", "chai-http": "4.4.0", - "eslint": "9.16.0", + "eslint": "9.28.0", "eslint-config-google": "0.14.0", + "js-yaml": "^4.1.0", "mocha": "10.6.0", "mocha-junit-reporter": "2.2.1", - "newman": "^6.2.0", + "newman": "^6.2.1", "newman-reporter-junitfull": "1.1.1", "nyc": "15.1.0", "sequelize-cli": "6.6.2", @@ -105,44 +108,44 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.26.2", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", - "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", + "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", "dev": true, "dependencies": { - "@babel/helper-validator-identifier": "^7.25.9", + "@babel/helper-validator-identifier": "^7.27.1", "js-tokens": "^4.0.0", - "picocolors": "^1.0.0" + "picocolors": "^1.1.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/compat-data": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.4.tgz", - "integrity": "sha512-vg8Gih2MLK+kOkHJp4gBEIkyaIi00jgWot2D9QOmmfLC8jINSOzmCLta6Bvz/JSBCqnegV0L80jhxkol5GWNfQ==", + "version": "7.27.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.27.5.tgz", + "integrity": "sha512-KiRAp/VoJaWkkte84TvUd9qjdbZAdiqyvMxrGl1N6vzFogKmaLgoM3L1kgtLicp2HP5fBJS8JrZKLVIZGVJAVg==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.5.tgz", - "integrity": "sha512-tVQRucExLQ02Boi4vdPp49svNGcfL2GhdTCT9aldhXgCJVAI21EtRfBettiuLUwce/7r6bFdgs6JFkcdTiFttA==", + "version": "7.27.4", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.27.4.tgz", + "integrity": "sha512-bXYxrXFubeYdvB0NhD/NBB3Qi6aZeV20GOWVI47t2dkecCEoneR4NPVcb7abpXDEvejgrUfFtG6vG/zxAKmg+g==", "dev": true, "dependencies": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.24.2", - "@babel/generator": "^7.24.5", - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-module-transforms": "^7.24.5", - "@babel/helpers": "^7.24.5", - "@babel/parser": "^7.24.5", - "@babel/template": "^7.24.0", - "@babel/traverse": "^7.24.5", - "@babel/types": "^7.24.5", + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.27.3", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-module-transforms": "^7.27.3", + "@babel/helpers": "^7.27.4", + "@babel/parser": "^7.27.4", + "@babel/template": "^7.27.2", + "@babel/traverse": "^7.27.4", + "@babel/types": "^7.27.3", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -164,12 +167,12 @@ "dev": true }, "node_modules/@babel/core/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", "dev": true, "dependencies": { - "ms": "2.1.2" + "ms": "^2.1.3" }, "engines": { "node": ">=6.0" @@ -181,9 +184,9 @@ } }, "node_modules/@babel/core/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==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dev": true }, "node_modules/@babel/core/node_modules/semver": { @@ -196,29 +199,30 @@ } }, "node_modules/@babel/generator": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.5.tgz", - "integrity": "sha512-x32i4hEXvr+iI0NEoEfDKzlemF8AmtOP8CcrRaEcpzysWuoEb1KknpcvMsHKPONoKZiDuItklgWhB18xEhr9PA==", + "version": "7.27.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.27.5.tgz", + "integrity": "sha512-ZGhA37l0e/g2s1Cnzdix0O3aLYm66eF8aufiVteOgnwxgnRP8GoyMj7VWsgWnQbVKXyge7hqrFh2K2TQM6t1Hw==", "dev": true, "dependencies": { - "@babel/types": "^7.24.5", + "@babel/parser": "^7.27.5", + "@babel/types": "^7.27.3", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", - "jsesc": "^2.5.1" + "jsesc": "^3.0.2" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz", - "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==", + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz", + "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.23.5", - "@babel/helper-validator-option": "^7.23.5", - "browserslist": "^4.22.2", + "@babel/compat-data": "^7.27.2", + "@babel/helper-validator-option": "^7.27.1", + "browserslist": "^4.24.0", "lru-cache": "^5.1.1", "semver": "^6.3.1" }, @@ -250,63 +254,28 @@ "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", "dev": true }, - "node_modules/@babel/helper-environment-visitor": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", - "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-function-name": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", - "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", - "dev": true, - "dependencies": { - "@babel/template": "^7.22.15", - "@babel/types": "^7.23.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-hoist-variables": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", - "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helper-module-imports": { - "version": "7.24.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.3.tgz", - "integrity": "sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", + "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", "dev": true, "dependencies": { - "@babel/types": "^7.24.0" + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.24.5.tgz", - "integrity": "sha512-9GxeY8c2d2mdQUP1Dye0ks3VDyIMS98kt/llQ2nUId8IsWqTF0l1LkSX0/uP7l7MCDrzXS009Hyhe2gzTiGW8A==", + "version": "7.27.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.27.3.tgz", + "integrity": "sha512-dSOvYwvyLsWBeIRyOeHXp5vPj5l1I011r52FM1+r1jCERv+aFXYk4whgQccYEGYxK2H3ZAIA8nuPkQ0HaUo3qg==", "dev": true, "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-module-imports": "^7.24.3", - "@babel/helper-simple-access": "^7.24.5", - "@babel/helper-split-export-declaration": "^7.24.5", - "@babel/helper-validator-identifier": "^7.24.5" + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1", + "@babel/traverse": "^7.27.3" }, "engines": { "node": ">=6.9.0" @@ -315,77 +284,53 @@ "@babel/core": "^7.0.0" } }, - "node_modules/@babel/helper-simple-access": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.5.tgz", - "integrity": "sha512-uH3Hmf5q5n7n8mz7arjUlDOCbttY/DW4DYhE6FUsjKJ/oYC1kQQUvwEQWxRwUpX9qQKRXeqLwWxrqilMrf32sQ==", - "dev": true, - "dependencies": { - "@babel/types": "^7.24.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-split-export-declaration": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.5.tgz", - "integrity": "sha512-5CHncttXohrHk8GWOFCcCl4oRD9fKosWlIRgWm4ql9VYioKm52Mk2xsmoohvm7f3JoiLSM5ZgJuRaf5QZZYd3Q==", - "dev": true, - "dependencies": { - "@babel/types": "^7.24.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helper-string-parser": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", - "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", - "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", + "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-option": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz", - "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.0.tgz", - "integrity": "sha512-U5eyP/CTFPuNE3qk+WZMxFkp/4zUzdceQlfzf7DdGdhp+Fezd7HD+i8Y24ZuTMKX3wQBld449jijbGq6OdGNQg==", + "version": "7.27.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.6.tgz", + "integrity": "sha512-muE8Tt8M22638HU31A3CgfSUciwz1fhATfoVai05aPXGor//CdWDCbnlY1yvBPo07njuVOCNGCSp/GTt12lIug==", "dev": true, "dependencies": { - "@babel/template": "^7.27.0", - "@babel/types": "^7.27.0" + "@babel/template": "^7.27.2", + "@babel/types": "^7.27.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/parser": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.0.tgz", - "integrity": "sha512-iaepho73/2Pz7w2eMS0Q5f83+0RKI7i4xmiYeBmDzfRVbQtTOG7Ts0S4HzJVsTMGI9keU8rNfuZr8DKfSt7Yyg==", + "version": "7.27.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.5.tgz", + "integrity": "sha512-OsQd175SxWkGlzbny8J3K8TnnDD0N3lrIUtB92xwyRpzaenGZhxDvxN/JgU00U3CDZNj9tPuDJ5H0WS4Nt3vKg==", "dev": true, "dependencies": { - "@babel/types": "^7.27.0" + "@babel/types": "^7.27.3" }, "bin": { "parser": "bin/babel-parser.js" @@ -395,33 +340,30 @@ } }, "node_modules/@babel/template": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.0.tgz", - "integrity": "sha512-2ncevenBqXI6qRMukPlXwHKHchC7RyMuu4xv5JBXRfOGVcTy1mXCD12qrp7Jsoxll1EV3+9sE4GugBVRjT2jFA==", + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", + "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.26.2", - "@babel/parser": "^7.27.0", - "@babel/types": "^7.27.0" + "@babel/code-frame": "^7.27.1", + "@babel/parser": "^7.27.2", + "@babel/types": "^7.27.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.5.tgz", - "integrity": "sha512-7aaBLeDQ4zYcUFDUD41lJc1fG8+5IU9DaNSJAgal866FGvmD5EbWQgnEC6kO1gGLsX0esNkfnJSndbTXA3r7UA==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.24.2", - "@babel/generator": "^7.24.5", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.24.5", - "@babel/parser": "^7.24.5", - "@babel/types": "^7.24.5", + "version": "7.27.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.27.4.tgz", + "integrity": "sha512-oNcu2QbHqts9BtOWJosOVJapWjBDSxGCpFvikNR5TGDYDQf3JwpIoMzIKrvfoti93cLfPJEG4tH9SPVeyCGgdA==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.27.3", + "@babel/parser": "^7.27.4", + "@babel/template": "^7.27.2", + "@babel/types": "^7.27.3", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -430,12 +372,12 @@ } }, "node_modules/@babel/traverse/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", "dev": true, "dependencies": { - "ms": "2.1.2" + "ms": "^2.1.3" }, "engines": { "node": ">=6.0" @@ -456,19 +398,19 @@ } }, "node_modules/@babel/traverse/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==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dev": true }, "node_modules/@babel/types": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.0.tgz", - "integrity": "sha512-H45s8fVLYjbhFH62dIJ3WtmJ6RSPt/3DRO0ZcT2SUiYiQyz3BLVb9ADEnLl91m74aQPS3AzzeajZHYOalWe3bg==", + "version": "7.27.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.6.tgz", + "integrity": "sha512-ETyHEk2VHHvl9b9jZP5IHPavHYk57EhanlRRuae9XCpb/j5bDCbPPMOBfCWhnl/7EDJz0jEMCi/RhccCE8r1+Q==", "dev": true, "dependencies": { - "@babel/helper-string-parser": "^7.25.9", - "@babel/helper-validator-identifier": "^7.25.9" + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -490,16 +432,19 @@ "integrity": "sha512-Eu8BhBAhHyU6S3RdOPyiKpq3DhRUcEQQlU02BBWTdI5e6j5Iqv6Q72AFBw+AaE0NeO7PSNz8x7jQj77OX7jU5g==" }, "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==", + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.7.0.tgz", + "integrity": "sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==", "dev": true, "dependencies": { - "eslint-visitor-keys": "^3.3.0" + "eslint-visitor-keys": "^3.4.3" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, + "funding": { + "url": "https://opencollective.com/eslint" + }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } @@ -526,12 +471,12 @@ } }, "node_modules/@eslint/config-array": { - "version": "0.19.0", - "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.19.0.tgz", - "integrity": "sha512-zdHg2FPIFNKPdcHWtiNT+jEFCHYVplAXRDlQDyqy0zGx/q2parwh7brGJSiTxRk/TSMkbM//zt/f5CHgyTyaSQ==", + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.20.1.tgz", + "integrity": "sha512-OL0RJzC/CBzli0DrrR31qzj6d6i6Mm3HByuhflhl4LOBiWxN+3i6/t/ZQQNii4tjksXi8r2CRW1wMpWA2ULUEw==", "dev": true, "dependencies": { - "@eslint/object-schema": "^2.1.4", + "@eslint/object-schema": "^2.1.6", "debug": "^4.3.1", "minimatch": "^3.1.2" }, @@ -540,9 +485,9 @@ } }, "node_modules/@eslint/config-array/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==", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, "dependencies": { "balanced-match": "^1.0.0", @@ -550,9 +495,9 @@ } }, "node_modules/@eslint/config-array/node_modules/debug": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", - "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", "dev": true, "dependencies": { "ms": "^2.1.3" @@ -584,19 +529,31 @@ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dev": true }, + "node_modules/@eslint/config-helpers": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.2.3.tgz", + "integrity": "sha512-u180qk2Um1le4yf0ruXH3PYFeEZeYC3p/4wCTKrr2U1CmGdzGi3KtY0nuPDH48UJxlKCC5RDzbcbh4X0XlqgHg==", + "dev": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, "node_modules/@eslint/core": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.9.0.tgz", - "integrity": "sha512-7ATR9F0e4W85D/0w7cU0SNj7qkAexMG+bAHEZOjo9akvGuhHE2m7umzWzfnpa0XAg5Kxc1BWmtPMV67jJ+9VUg==", + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.14.0.tgz", + "integrity": "sha512-qIbV0/JZr7iSDjqAc60IqbLdsj9GDt16xQtWD+B78d/HAlvysGdZZ6rpJHGAc2T0FQx1X6thsSPdnoiGKdNtdg==", "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.15" + }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, "node_modules/@eslint/eslintrc": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.2.0.tgz", - "integrity": "sha512-grOjVNN8P3hjJn/eIETF1wwd12DdnwFDoyceUJLYYdkpbwq3nLi+4fqrTAONx7XDALqlL220wC/RHSC/QTI/0w==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.1.tgz", + "integrity": "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==", "dev": true, "dependencies": { "ajv": "^6.12.4", @@ -617,9 +574,9 @@ } }, "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, "dependencies": { "balanced-match": "^1.0.0", @@ -627,9 +584,9 @@ } }, "node_modules/@eslint/eslintrc/node_modules/debug": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", - "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", "dev": true, "dependencies": { "ms": "^2.1.3" @@ -662,39 +619,56 @@ "dev": true }, "node_modules/@eslint/js": { - "version": "9.16.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.16.0.tgz", - "integrity": "sha512-tw2HxzQkrbeuvyj1tG2Yqq+0H9wGoI2IMk4EOsQeX+vmd75FtJAzf+gTA69WF+baUKRYQ3x2kbLE08js5OsTVg==", + "version": "9.28.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.28.0.tgz", + "integrity": "sha512-fnqSjGWd/CoIp4EXIxWVK/sHA6DOHN4+8Ix2cX5ycOY7LG0UY8nHCU5pIp2eaE1Mc7Qd8kHspYNzYXT2ojPLzg==", "dev": true, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" } }, "node_modules/@eslint/object-schema": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.4.tgz", - "integrity": "sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ==", + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.6.tgz", + "integrity": "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==", "dev": true, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, "node_modules/@eslint/plugin-kit": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.3.tgz", - "integrity": "sha512-2b/g5hRmpbb1o4GnTZax9N9m0FXzz9OV42ZzI4rDDMDuHUqigAiQCEWChBWCY4ztAGVRjoWT19v0yMmc5/L5kA==", + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.3.2.tgz", + "integrity": "sha512-4SaFZCNfJqvk/kenHpI8xvN42DMaoycy4PzKc5otHxRswww1kAt82OlBuwRVLofCACCTZEcla2Ydxv8scMXaTg==", "dev": true, "dependencies": { + "@eslint/core": "^0.15.0", "levn": "^0.4.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, + "node_modules/@eslint/plugin-kit/node_modules/@eslint/core": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.15.0.tgz", + "integrity": "sha512-b7ePw78tEWWkpgZCDYkbqDOP8dmM6qe+AOC6iuJqlq1R/0ahMAeH3qynpnqKFGkMltrp44ohV4ubGyvLX28tzw==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, "node_modules/@faker-js/faker": { "version": "5.5.3", "resolved": "https://registry.npmjs.org/@faker-js/faker/-/faker-5.5.3.tgz", "integrity": "sha512-R11tGE6yIFwqpaIqcfkcg7AICXzFg14+5h5v0TfF/9+RMDL6jhzCy/pxHVOfbALGdtVYdt6JdR21tuxEgl34dw==", + "deprecated": "Please update to a newer version.", "dev": true }, "node_modules/@gar/promisify": { @@ -704,9 +678,9 @@ "optional": true }, "node_modules/@grpc/grpc-js": { - "version": "1.13.3", - "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.13.3.tgz", - "integrity": "sha512-FTXHdOoPbZrBjlVLHuKbDZnsTxXv2BlHF57xw6LuThXacXvtkahEPED0CKMk6obZDf65Hv4k3z62eyPNpvinIg==", + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.13.4.tgz", + "integrity": "sha512-GsFaMXCkMqkKIvwCQjCrwH+GHbPKBjhwo/8ZuUkWHqbI73Kky9I+pQltrlT0+MWpedCoosda53lgjYfyEPgxBg==", "dependencies": { "@grpc/proto-loader": "^0.7.13", "@js-sdsl/ordered-map": "^4.4.2" @@ -716,9 +690,9 @@ } }, "node_modules/@grpc/proto-loader": { - "version": "0.7.14", - "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.14.tgz", - "integrity": "sha512-oS0FyK8eGNBJC6aB/qsS4LOxCYQlBniNzp6W8IdjlRVRGs0FOK9dS84OV+kXGaZf8Ozeos8fbUMJUGGzSpOCzQ==", + "version": "0.7.15", + "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.15.tgz", + "integrity": "sha512-tMXdRCfYVixjuFK+Hk0Q1s38gV9zDiDJfWL3h1rv4Qc39oILCu1TRTDt7+fGUI8K4G1Fj125Hx/ru3azECWTyQ==", "dependencies": { "lodash.camelcase": "^4.3.0", "long": "^5.0.0", @@ -732,60 +706,6 @@ "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/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/@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/@humanfs/core": { "version": "0.19.1", "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", @@ -835,9 +755,9 @@ } }, "node_modules/@humanwhocodes/retry": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.1.tgz", - "integrity": "sha512-c7hNEllBlenFTHBky65mhq8WD2kbN9Q6gk0bTk8lSBvc554jpXSkST1iePudpt7+A/AQvuHs9EMqjHDXMY1lrA==", + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", + "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", "dev": true, "engines": { "node": ">=18.18" @@ -865,9 +785,9 @@ } }, "node_modules/@isaacs/cliui/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==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", "dev": true, "engines": { "node": ">=12" @@ -876,6 +796,18 @@ "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, + "node_modules/@isaacs/cliui/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/@isaacs/cliui/node_modules/emoji-regex": { "version": "9.2.2", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", @@ -914,6 +846,23 @@ "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, + "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, "node_modules/@isaacs/fs-minipass": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", @@ -1048,9 +997,9 @@ } }, "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", - "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", + "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", "dev": true, "dependencies": { "@jridgewell/set-array": "^1.2.1", @@ -1080,9 +1029,9 @@ } }, "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==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", "dev": true }, "node_modules/@jridgewell/trace-mapping": { @@ -1147,66 +1096,91 @@ } }, "node_modules/@kubernetes/client-node/@cypress/request@3.0.8": {}, - "node_modules/@kubernetes/client-node/node_modules/chownr": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", - "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", + "node_modules/@msgpack/msgpack": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@msgpack/msgpack/-/msgpack-3.1.2.tgz", + "integrity": "sha512-JEW4DEtBzfe8HvUYecLU9e6+XJnKDlUAIve8FvPzF3Kzs6Xo/KuZkZJsDH0wJXl/qEZbeeE7edxDNY3kMs39hQ==", "engines": { - "node": ">=18" + "node": ">= 18" } }, - "node_modules/@kubernetes/client-node/node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "node_modules/@noble/hashes": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz", + "integrity": "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==", "engines": { - "node": ">=16 || 14 >=14.17" + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" } }, - "node_modules/@kubernetes/client-node/node_modules/minizlib": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.0.2.tgz", - "integrity": "sha512-oG62iEk+CYt5Xj2YqI5Xi9xWUeZhDI8jjQmC5oThVH5JGCTgIjr7ciJDzC7MBzYd//WvR1OTmP5Q38Q8ShQtVA==", + "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": { - "minipass": "^7.1.2" + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" }, "engines": { - "node": ">= 18" + "node": ">= 8" } }, - "node_modules/@kubernetes/client-node/node_modules/tar": { - "version": "7.4.3", - "resolved": "https://registry.npmjs.org/tar/-/tar-7.4.3.tgz", - "integrity": "sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==", + "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": { - "@isaacs/fs-minipass": "^4.0.0", - "chownr": "^3.0.0", - "minipass": "^7.1.2", - "minizlib": "^3.0.1", - "mkdirp": "^3.0.1", - "yallist": "^5.0.0" + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" }, "engines": { - "node": ">=18" + "node": ">= 8" } }, - "node_modules/@kubernetes/client-node/node_modules/yallist": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", - "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", - "engines": { - "node": ">=18" + "node_modules/@npmcli/fs": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-1.1.1.tgz", + "integrity": "sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ==", + "optional": true, + "dependencies": { + "@gar/promisify": "^1.0.1", + "semver": "^7.3.5" } }, - "node_modules/@noble/hashes": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz", - "integrity": "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==", + "node_modules/@npmcli/move-file": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.1.2.tgz", + "integrity": "sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==", + "deprecated": "This functionality has been moved to @npmcli/fs", + "optional": true, + "dependencies": { + "mkdirp": "^1.0.4", + "rimraf": "^3.0.2" + }, "engines": { - "node": "^14.21.3 || >=16" + "node": ">=10" + } + }, + "node_modules/@npmcli/move-file/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "optional": true, + "bin": { + "mkdirp": "bin/cmd.js" }, - "funding": { - "url": "https://paulmillr.com/funding/" + "engines": { + "node": ">=10" } }, "node_modules/@one-ini/wasm": { @@ -1223,39 +1197,42 @@ "node": ">=8.0.0" } }, - "node_modules/@opentelemetry/context-async-hooks": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/context-async-hooks/-/context-async-hooks-2.0.0.tgz", - "integrity": "sha512-IEkJGzK1A9v3/EHjXh3s2IiFc6L4jfK+lNgKVgUjeUJQRRhnVFMIO3TAvKwonm9O1HebCuoOt98v8bZW7oVQHA==", - "engines": { - "node": "^18.19.0 || >=20.6.0" + "node_modules/@opentelemetry/api-logs": { + "version": "0.200.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.200.0.tgz", + "integrity": "sha512-IKJBQxh91qJ+3ssRly5hYEJ8NDHu9oY/B1PXVSCWf7zytmYO9RNLB0Ox9XQ/fJ8m6gY6Q6NtBWlmXfaXt5Uc4Q==", + "dependencies": { + "@opentelemetry/api": "^1.3.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@opentelemetry/context-async-hooks": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/context-async-hooks/-/context-async-hooks-2.0.0.tgz", + "integrity": "sha512-IEkJGzK1A9v3/EHjXh3s2IiFc6L4jfK+lNgKVgUjeUJQRRhnVFMIO3TAvKwonm9O1HebCuoOt98v8bZW7oVQHA==", + "engines": { + "node": "^18.19.0 || >=20.6.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "node_modules/@opentelemetry/core": { - "version": "1.30.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.30.1.tgz", - "integrity": "sha512-OOCM2C/QIURhJMuKaekP3TRBxBKxG/TWWA0TL2J6nXUtDnuCtccy49LUJF8xPFXMX+0LMcxFpCo8M9cGY1W6rQ==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.0.0.tgz", + "integrity": "sha512-SLX36allrcnVaPYG3R78F/UZZsBsvbc7lMCLx37LyH5MJ1KAAZ2E3mW9OAD3zGz0G8q/BtoS5VUrjzDydhD6LQ==", "dependencies": { - "@opentelemetry/semantic-conventions": "1.28.0" + "@opentelemetry/semantic-conventions": "^1.29.0" }, "engines": { - "node": ">=14" + "node": "^18.19.0 || >=20.6.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, - "node_modules/@opentelemetry/core/node_modules/@opentelemetry/semantic-conventions": { - "version": "1.28.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.28.0.tgz", - "integrity": "sha512-lp4qAiMTD4sNWW4DbKLBkfiMZ4jbAboJIGOQr5DvciMRI494OapieI9qiODpOt0XBr1LjIDy1xAGAnVs5supTA==", - "engines": { - "node": ">=14" - } - }, "node_modules/@opentelemetry/exporter-logs-otlp-grpc": { "version": "0.200.0", "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-logs-otlp-grpc/-/exporter-logs-otlp-grpc-0.200.0.tgz", @@ -1275,20 +1252,6 @@ "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/exporter-logs-otlp-grpc/node_modules/@opentelemetry/core": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.0.0.tgz", - "integrity": "sha512-SLX36allrcnVaPYG3R78F/UZZsBsvbc7lMCLx37LyH5MJ1KAAZ2E3mW9OAD3zGz0G8q/BtoS5VUrjzDydhD6LQ==", - "dependencies": { - "@opentelemetry/semantic-conventions": "^1.29.0" - }, - "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" - } - }, "node_modules/@opentelemetry/exporter-logs-otlp-http": { "version": "0.200.0", "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-logs-otlp-http/-/exporter-logs-otlp-http-0.200.0.tgz", @@ -1307,31 +1270,6 @@ "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/exporter-logs-otlp-http/node_modules/@opentelemetry/api-logs": { - "version": "0.200.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.200.0.tgz", - "integrity": "sha512-IKJBQxh91qJ+3ssRly5hYEJ8NDHu9oY/B1PXVSCWf7zytmYO9RNLB0Ox9XQ/fJ8m6gY6Q6NtBWlmXfaXt5Uc4Q==", - "dependencies": { - "@opentelemetry/api": "^1.3.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@opentelemetry/exporter-logs-otlp-http/node_modules/@opentelemetry/core": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.0.0.tgz", - "integrity": "sha512-SLX36allrcnVaPYG3R78F/UZZsBsvbc7lMCLx37LyH5MJ1KAAZ2E3mW9OAD3zGz0G8q/BtoS5VUrjzDydhD6LQ==", - "dependencies": { - "@opentelemetry/semantic-conventions": "^1.29.0" - }, - "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" - } - }, "node_modules/@opentelemetry/exporter-logs-otlp-proto": { "version": "0.200.0", "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-logs-otlp-proto/-/exporter-logs-otlp-proto-0.200.0.tgz", @@ -1352,31 +1290,6 @@ "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/exporter-logs-otlp-proto/node_modules/@opentelemetry/api-logs": { - "version": "0.200.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.200.0.tgz", - "integrity": "sha512-IKJBQxh91qJ+3ssRly5hYEJ8NDHu9oY/B1PXVSCWf7zytmYO9RNLB0Ox9XQ/fJ8m6gY6Q6NtBWlmXfaXt5Uc4Q==", - "dependencies": { - "@opentelemetry/api": "^1.3.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@opentelemetry/exporter-logs-otlp-proto/node_modules/@opentelemetry/core": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.0.0.tgz", - "integrity": "sha512-SLX36allrcnVaPYG3R78F/UZZsBsvbc7lMCLx37LyH5MJ1KAAZ2E3mW9OAD3zGz0G8q/BtoS5VUrjzDydhD6LQ==", - "dependencies": { - "@opentelemetry/semantic-conventions": "^1.29.0" - }, - "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" - } - }, "node_modules/@opentelemetry/exporter-logs-otlp-proto/node_modules/@opentelemetry/resources": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.0.0.tgz", @@ -1413,21 +1326,22 @@ "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/exporter-metrics-otlp-grpc/node_modules/@opentelemetry/core": { + "node_modules/@opentelemetry/exporter-metrics-otlp-grpc/node_modules/@opentelemetry/resources": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.0.0.tgz", - "integrity": "sha512-SLX36allrcnVaPYG3R78F/UZZsBsvbc7lMCLx37LyH5MJ1KAAZ2E3mW9OAD3zGz0G8q/BtoS5VUrjzDydhD6LQ==", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.0.0.tgz", + "integrity": "sha512-rnZr6dML2z4IARI4zPGQV4arDikF/9OXZQzrC01dLmn0CZxU5U5OLd/m1T7YkGRj5UitjeoCtg/zorlgMQcdTg==", "dependencies": { + "@opentelemetry/core": "2.0.0", "@opentelemetry/semantic-conventions": "^1.29.0" }, "engines": { "node": "^18.19.0 || >=20.6.0" }, "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" + "@opentelemetry/api": ">=1.3.0 <1.10.0" } }, - "node_modules/@opentelemetry/exporter-metrics-otlp-grpc/node_modules/@opentelemetry/exporter-metrics-otlp-http": { + "node_modules/@opentelemetry/exporter-metrics-otlp-http": { "version": "0.200.0", "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-metrics-otlp-http/-/exporter-metrics-otlp-http-0.200.0.tgz", "integrity": "sha512-5BiR6i8yHc9+qW7F6LqkuUnIzVNA7lt0qRxIKcKT+gq3eGUPHZ3DY29sfxI3tkvnwMgtnHDMNze5DdxW39HsAw==", @@ -1445,7 +1359,7 @@ "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/exporter-metrics-otlp-grpc/node_modules/@opentelemetry/resources": { + "node_modules/@opentelemetry/exporter-metrics-otlp-http/node_modules/@opentelemetry/resources": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.0.0.tgz", "integrity": "sha512-rnZr6dML2z4IARI4zPGQV4arDikF/9OXZQzrC01dLmn0CZxU5U5OLd/m1T7YkGRj5UitjeoCtg/zorlgMQcdTg==", @@ -1460,21 +1374,6 @@ "@opentelemetry/api": ">=1.3.0 <1.10.0" } }, - "node_modules/@opentelemetry/exporter-metrics-otlp-grpc/node_modules/@opentelemetry/sdk-metrics": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-2.0.0.tgz", - "integrity": "sha512-Bvy8QDjO05umd0+j+gDeWcTaVa1/R2lDj/eOvjzpm8VQj1K1vVZJuyjThpV5/lSHyYW2JaHF2IQ7Z8twJFAhjA==", - "dependencies": { - "@opentelemetry/core": "2.0.0", - "@opentelemetry/resources": "2.0.0" - }, - "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.9.0 <1.10.0" - } - }, "node_modules/@opentelemetry/exporter-metrics-otlp-proto": { "version": "0.200.0", "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-metrics-otlp-proto/-/exporter-metrics-otlp-proto-0.200.0.tgz", @@ -1494,38 +1393,6 @@ "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/exporter-metrics-otlp-proto/node_modules/@opentelemetry/core": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.0.0.tgz", - "integrity": "sha512-SLX36allrcnVaPYG3R78F/UZZsBsvbc7lMCLx37LyH5MJ1KAAZ2E3mW9OAD3zGz0G8q/BtoS5VUrjzDydhD6LQ==", - "dependencies": { - "@opentelemetry/semantic-conventions": "^1.29.0" - }, - "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/exporter-metrics-otlp-proto/node_modules/@opentelemetry/exporter-metrics-otlp-http": { - "version": "0.200.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-metrics-otlp-http/-/exporter-metrics-otlp-http-0.200.0.tgz", - "integrity": "sha512-5BiR6i8yHc9+qW7F6LqkuUnIzVNA7lt0qRxIKcKT+gq3eGUPHZ3DY29sfxI3tkvnwMgtnHDMNze5DdxW39HsAw==", - "dependencies": { - "@opentelemetry/core": "2.0.0", - "@opentelemetry/otlp-exporter-base": "0.200.0", - "@opentelemetry/otlp-transformer": "0.200.0", - "@opentelemetry/resources": "2.0.0", - "@opentelemetry/sdk-metrics": "2.0.0" - }, - "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, "node_modules/@opentelemetry/exporter-metrics-otlp-proto/node_modules/@opentelemetry/resources": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.0.0.tgz", @@ -1541,21 +1408,6 @@ "@opentelemetry/api": ">=1.3.0 <1.10.0" } }, - "node_modules/@opentelemetry/exporter-metrics-otlp-proto/node_modules/@opentelemetry/sdk-metrics": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-2.0.0.tgz", - "integrity": "sha512-Bvy8QDjO05umd0+j+gDeWcTaVa1/R2lDj/eOvjzpm8VQj1K1vVZJuyjThpV5/lSHyYW2JaHF2IQ7Z8twJFAhjA==", - "dependencies": { - "@opentelemetry/core": "2.0.0", - "@opentelemetry/resources": "2.0.0" - }, - "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.9.0 <1.10.0" - } - }, "node_modules/@opentelemetry/exporter-prometheus": { "version": "0.200.0", "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-prometheus/-/exporter-prometheus-0.200.0.tgz", @@ -1572,20 +1424,6 @@ "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/exporter-prometheus/node_modules/@opentelemetry/core": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.0.0.tgz", - "integrity": "sha512-SLX36allrcnVaPYG3R78F/UZZsBsvbc7lMCLx37LyH5MJ1KAAZ2E3mW9OAD3zGz0G8q/BtoS5VUrjzDydhD6LQ==", - "dependencies": { - "@opentelemetry/semantic-conventions": "^1.29.0" - }, - "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" - } - }, "node_modules/@opentelemetry/exporter-prometheus/node_modules/@opentelemetry/resources": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.0.0.tgz", @@ -1601,21 +1439,6 @@ "@opentelemetry/api": ">=1.3.0 <1.10.0" } }, - "node_modules/@opentelemetry/exporter-prometheus/node_modules/@opentelemetry/sdk-metrics": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-2.0.0.tgz", - "integrity": "sha512-Bvy8QDjO05umd0+j+gDeWcTaVa1/R2lDj/eOvjzpm8VQj1K1vVZJuyjThpV5/lSHyYW2JaHF2IQ7Z8twJFAhjA==", - "dependencies": { - "@opentelemetry/core": "2.0.0", - "@opentelemetry/resources": "2.0.0" - }, - "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.9.0 <1.10.0" - } - }, "node_modules/@opentelemetry/exporter-trace-otlp-grpc": { "version": "0.200.0", "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-grpc/-/exporter-trace-otlp-grpc-0.200.0.tgz", @@ -1636,20 +1459,6 @@ "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/exporter-trace-otlp-grpc/node_modules/@opentelemetry/core": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.0.0.tgz", - "integrity": "sha512-SLX36allrcnVaPYG3R78F/UZZsBsvbc7lMCLx37LyH5MJ1KAAZ2E3mW9OAD3zGz0G8q/BtoS5VUrjzDydhD6LQ==", - "dependencies": { - "@opentelemetry/semantic-conventions": "^1.29.0" - }, - "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" - } - }, "node_modules/@opentelemetry/exporter-trace-otlp-grpc/node_modules/@opentelemetry/resources": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.0.0.tgz", @@ -1683,20 +1492,6 @@ "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/exporter-trace-otlp-http/node_modules/@opentelemetry/core": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.0.0.tgz", - "integrity": "sha512-SLX36allrcnVaPYG3R78F/UZZsBsvbc7lMCLx37LyH5MJ1KAAZ2E3mW9OAD3zGz0G8q/BtoS5VUrjzDydhD6LQ==", - "dependencies": { - "@opentelemetry/semantic-conventions": "^1.29.0" - }, - "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" - } - }, "node_modules/@opentelemetry/exporter-trace-otlp-http/node_modules/@opentelemetry/resources": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.0.0.tgz", @@ -1730,20 +1525,6 @@ "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/exporter-trace-otlp-proto/node_modules/@opentelemetry/core": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.0.0.tgz", - "integrity": "sha512-SLX36allrcnVaPYG3R78F/UZZsBsvbc7lMCLx37LyH5MJ1KAAZ2E3mW9OAD3zGz0G8q/BtoS5VUrjzDydhD6LQ==", - "dependencies": { - "@opentelemetry/semantic-conventions": "^1.29.0" - }, - "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" - } - }, "node_modules/@opentelemetry/exporter-trace-otlp-proto/node_modules/@opentelemetry/resources": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.0.0.tgz", @@ -1776,33 +1557,37 @@ "@opentelemetry/api": "^1.0.0" } }, - "node_modules/@opentelemetry/exporter-zipkin/node_modules/@opentelemetry/core": { + "node_modules/@opentelemetry/exporter-zipkin/node_modules/@opentelemetry/resources": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.0.0.tgz", - "integrity": "sha512-SLX36allrcnVaPYG3R78F/UZZsBsvbc7lMCLx37LyH5MJ1KAAZ2E3mW9OAD3zGz0G8q/BtoS5VUrjzDydhD6LQ==", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.0.0.tgz", + "integrity": "sha512-rnZr6dML2z4IARI4zPGQV4arDikF/9OXZQzrC01dLmn0CZxU5U5OLd/m1T7YkGRj5UitjeoCtg/zorlgMQcdTg==", "dependencies": { + "@opentelemetry/core": "2.0.0", "@opentelemetry/semantic-conventions": "^1.29.0" }, "engines": { "node": "^18.19.0 || >=20.6.0" }, "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" + "@opentelemetry/api": ">=1.3.0 <1.10.0" } }, - "node_modules/@opentelemetry/exporter-zipkin/node_modules/@opentelemetry/resources": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.0.0.tgz", - "integrity": "sha512-rnZr6dML2z4IARI4zPGQV4arDikF/9OXZQzrC01dLmn0CZxU5U5OLd/m1T7YkGRj5UitjeoCtg/zorlgMQcdTg==", + "node_modules/@opentelemetry/instrumentation": { + "version": "0.200.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.200.0.tgz", + "integrity": "sha512-pmPlzfJd+vvgaZd/reMsC8RWgTXn2WY1OWT5RT42m3aOn5532TozwXNDhg1vzqJ+jnvmkREcdLr27ebJEQt0Jg==", "dependencies": { - "@opentelemetry/core": "2.0.0", - "@opentelemetry/semantic-conventions": "^1.29.0" + "@opentelemetry/api-logs": "0.200.0", + "@types/shimmer": "^1.2.0", + "import-in-the-middle": "^1.8.1", + "require-in-the-middle": "^7.1.1", + "shimmer": "^1.2.1" }, "engines": { "node": "^18.19.0 || >=20.6.0" }, "peerDependencies": { - "@opentelemetry/api": ">=1.3.0 <1.10.0" + "@opentelemetry/api": "^1.3.0" } }, "node_modules/@opentelemetry/instrumentation-express": { @@ -1821,75 +1606,10 @@ "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/instrumentation-express/node_modules/@opentelemetry/api-logs": { + "node_modules/@opentelemetry/instrumentation-http": { "version": "0.200.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.200.0.tgz", - "integrity": "sha512-IKJBQxh91qJ+3ssRly5hYEJ8NDHu9oY/B1PXVSCWf7zytmYO9RNLB0Ox9XQ/fJ8m6gY6Q6NtBWlmXfaXt5Uc4Q==", - "dependencies": { - "@opentelemetry/api": "^1.3.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@opentelemetry/instrumentation-express/node_modules/@opentelemetry/core": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.0.0.tgz", - "integrity": "sha512-SLX36allrcnVaPYG3R78F/UZZsBsvbc7lMCLx37LyH5MJ1KAAZ2E3mW9OAD3zGz0G8q/BtoS5VUrjzDydhD6LQ==", - "dependencies": { - "@opentelemetry/semantic-conventions": "^1.29.0" - }, - "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/instrumentation-express/node_modules/@opentelemetry/instrumentation": { - "version": "0.200.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.200.0.tgz", - "integrity": "sha512-pmPlzfJd+vvgaZd/reMsC8RWgTXn2WY1OWT5RT42m3aOn5532TozwXNDhg1vzqJ+jnvmkREcdLr27ebJEQt0Jg==", - "dependencies": { - "@opentelemetry/api-logs": "0.200.0", - "@types/shimmer": "^1.2.0", - "import-in-the-middle": "^1.8.1", - "require-in-the-middle": "^7.1.1", - "shimmer": "^1.2.1" - }, - "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-express/node_modules/acorn": { - "version": "8.14.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz", - "integrity": "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/@opentelemetry/instrumentation-express/node_modules/import-in-the-middle": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-1.13.1.tgz", - "integrity": "sha512-k2V9wNm9B+ysuelDTHjI9d5KPc4l8zAZTGqj+pcynvWkypZd857ryzN8jNC7Pg2YZXNMJcHRPpaDyCBbNyVRpA==", - "dependencies": { - "acorn": "^8.14.0", - "acorn-import-attributes": "^1.9.5", - "cjs-module-lexer": "^1.2.2", - "module-details-from-path": "^1.0.3" - } - }, - "node_modules/@opentelemetry/instrumentation-http": { - "version": "0.200.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-http/-/instrumentation-http-0.200.0.tgz", - "integrity": "sha512-9tqGbCJikhYU68y3k9mi6yWsMyMeCcwoQuHvIXan5VvvPPQ5WIZaV6Mxu/MCVe4swRNoFs8Th+qyj0TZV5ELvw==", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-http/-/instrumentation-http-0.200.0.tgz", + "integrity": "sha512-9tqGbCJikhYU68y3k9mi6yWsMyMeCcwoQuHvIXan5VvvPPQ5WIZaV6Mxu/MCVe4swRNoFs8Th+qyj0TZV5ELvw==", "dependencies": { "@opentelemetry/core": "2.0.0", "@opentelemetry/instrumentation": "0.200.0", @@ -1903,71 +1623,6 @@ "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/instrumentation-http/node_modules/@opentelemetry/api-logs": { - "version": "0.200.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.200.0.tgz", - "integrity": "sha512-IKJBQxh91qJ+3ssRly5hYEJ8NDHu9oY/B1PXVSCWf7zytmYO9RNLB0Ox9XQ/fJ8m6gY6Q6NtBWlmXfaXt5Uc4Q==", - "dependencies": { - "@opentelemetry/api": "^1.3.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@opentelemetry/instrumentation-http/node_modules/@opentelemetry/core": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.0.0.tgz", - "integrity": "sha512-SLX36allrcnVaPYG3R78F/UZZsBsvbc7lMCLx37LyH5MJ1KAAZ2E3mW9OAD3zGz0G8q/BtoS5VUrjzDydhD6LQ==", - "dependencies": { - "@opentelemetry/semantic-conventions": "^1.29.0" - }, - "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/instrumentation-http/node_modules/@opentelemetry/instrumentation": { - "version": "0.200.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.200.0.tgz", - "integrity": "sha512-pmPlzfJd+vvgaZd/reMsC8RWgTXn2WY1OWT5RT42m3aOn5532TozwXNDhg1vzqJ+jnvmkREcdLr27ebJEQt0Jg==", - "dependencies": { - "@opentelemetry/api-logs": "0.200.0", - "@types/shimmer": "^1.2.0", - "import-in-the-middle": "^1.8.1", - "require-in-the-middle": "^7.1.1", - "shimmer": "^1.2.1" - }, - "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-http/node_modules/acorn": { - "version": "8.14.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz", - "integrity": "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/@opentelemetry/instrumentation-http/node_modules/import-in-the-middle": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-1.13.1.tgz", - "integrity": "sha512-k2V9wNm9B+ysuelDTHjI9d5KPc4l8zAZTGqj+pcynvWkypZd857ryzN8jNC7Pg2YZXNMJcHRPpaDyCBbNyVRpA==", - "dependencies": { - "acorn": "^8.14.0", - "acorn-import-attributes": "^1.9.5", - "cjs-module-lexer": "^1.2.2", - "module-details-from-path": "^1.0.3" - } - }, "node_modules/@opentelemetry/otlp-exporter-base": { "version": "0.200.0", "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-exporter-base/-/otlp-exporter-base-0.200.0.tgz", @@ -1983,20 +1638,6 @@ "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/otlp-exporter-base/node_modules/@opentelemetry/core": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.0.0.tgz", - "integrity": "sha512-SLX36allrcnVaPYG3R78F/UZZsBsvbc7lMCLx37LyH5MJ1KAAZ2E3mW9OAD3zGz0G8q/BtoS5VUrjzDydhD6LQ==", - "dependencies": { - "@opentelemetry/semantic-conventions": "^1.29.0" - }, - "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" - } - }, "node_modules/@opentelemetry/otlp-grpc-exporter-base": { "version": "0.200.0", "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-grpc-exporter-base/-/otlp-grpc-exporter-base-0.200.0.tgz", @@ -2014,20 +1655,6 @@ "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/otlp-grpc-exporter-base/node_modules/@opentelemetry/core": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.0.0.tgz", - "integrity": "sha512-SLX36allrcnVaPYG3R78F/UZZsBsvbc7lMCLx37LyH5MJ1KAAZ2E3mW9OAD3zGz0G8q/BtoS5VUrjzDydhD6LQ==", - "dependencies": { - "@opentelemetry/semantic-conventions": "^1.29.0" - }, - "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" - } - }, "node_modules/@opentelemetry/otlp-transformer": { "version": "0.200.0", "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-transformer/-/otlp-transformer-0.200.0.tgz", @@ -2048,31 +1675,6 @@ "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/otlp-transformer/node_modules/@opentelemetry/api-logs": { - "version": "0.200.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.200.0.tgz", - "integrity": "sha512-IKJBQxh91qJ+3ssRly5hYEJ8NDHu9oY/B1PXVSCWf7zytmYO9RNLB0Ox9XQ/fJ8m6gY6Q6NtBWlmXfaXt5Uc4Q==", - "dependencies": { - "@opentelemetry/api": "^1.3.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@opentelemetry/otlp-transformer/node_modules/@opentelemetry/core": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.0.0.tgz", - "integrity": "sha512-SLX36allrcnVaPYG3R78F/UZZsBsvbc7lMCLx37LyH5MJ1KAAZ2E3mW9OAD3zGz0G8q/BtoS5VUrjzDydhD6LQ==", - "dependencies": { - "@opentelemetry/semantic-conventions": "^1.29.0" - }, - "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" - } - }, "node_modules/@opentelemetry/otlp-transformer/node_modules/@opentelemetry/resources": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.0.0.tgz", @@ -2088,21 +1690,6 @@ "@opentelemetry/api": ">=1.3.0 <1.10.0" } }, - "node_modules/@opentelemetry/otlp-transformer/node_modules/@opentelemetry/sdk-metrics": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-2.0.0.tgz", - "integrity": "sha512-Bvy8QDjO05umd0+j+gDeWcTaVa1/R2lDj/eOvjzpm8VQj1K1vVZJuyjThpV5/lSHyYW2JaHF2IQ7Z8twJFAhjA==", - "dependencies": { - "@opentelemetry/core": "2.0.0", - "@opentelemetry/resources": "2.0.0" - }, - "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.9.0 <1.10.0" - } - }, "node_modules/@opentelemetry/propagator-b3": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-b3/-/propagator-b3-2.0.0.tgz", @@ -2117,20 +1704,6 @@ "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, - "node_modules/@opentelemetry/propagator-b3/node_modules/@opentelemetry/core": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.0.0.tgz", - "integrity": "sha512-SLX36allrcnVaPYG3R78F/UZZsBsvbc7lMCLx37LyH5MJ1KAAZ2E3mW9OAD3zGz0G8q/BtoS5VUrjzDydhD6LQ==", - "dependencies": { - "@opentelemetry/semantic-conventions": "^1.29.0" - }, - "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" - } - }, "node_modules/@opentelemetry/propagator-jaeger": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-jaeger/-/propagator-jaeger-2.0.0.tgz", @@ -2145,26 +1718,26 @@ "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, - "node_modules/@opentelemetry/propagator-jaeger/node_modules/@opentelemetry/core": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.0.0.tgz", - "integrity": "sha512-SLX36allrcnVaPYG3R78F/UZZsBsvbc7lMCLx37LyH5MJ1KAAZ2E3mW9OAD3zGz0G8q/BtoS5VUrjzDydhD6LQ==", + "node_modules/@opentelemetry/resources": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.30.1.tgz", + "integrity": "sha512-5UxZqiAgLYGFjS4s9qm5mBVo433u+dSPUFWVWXmLAD4wB65oMCoXaJP1KJa9DIYYMeHu3z4BZcStG3LC593cWA==", "dependencies": { - "@opentelemetry/semantic-conventions": "^1.29.0" + "@opentelemetry/core": "1.30.1", + "@opentelemetry/semantic-conventions": "1.28.0" }, "engines": { - "node": "^18.19.0 || >=20.6.0" + "node": ">=14" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, - "node_modules/@opentelemetry/resources": { + "node_modules/@opentelemetry/resources/node_modules/@opentelemetry/core": { "version": "1.30.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.30.1.tgz", - "integrity": "sha512-5UxZqiAgLYGFjS4s9qm5mBVo433u+dSPUFWVWXmLAD4wB65oMCoXaJP1KJa9DIYYMeHu3z4BZcStG3LC593cWA==", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.30.1.tgz", + "integrity": "sha512-OOCM2C/QIURhJMuKaekP3TRBxBKxG/TWWA0TL2J6nXUtDnuCtccy49LUJF8xPFXMX+0LMcxFpCo8M9cGY1W6rQ==", "dependencies": { - "@opentelemetry/core": "1.30.1", "@opentelemetry/semantic-conventions": "1.28.0" }, "engines": { @@ -2198,32 +1771,37 @@ "@opentelemetry/api": ">=1.4.0 <1.10.0" } }, - "node_modules/@opentelemetry/sdk-logs/node_modules/@opentelemetry/api-logs": { - "version": "0.200.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.200.0.tgz", - "integrity": "sha512-IKJBQxh91qJ+3ssRly5hYEJ8NDHu9oY/B1PXVSCWf7zytmYO9RNLB0Ox9XQ/fJ8m6gY6Q6NtBWlmXfaXt5Uc4Q==", + "node_modules/@opentelemetry/sdk-logs/node_modules/@opentelemetry/resources": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.0.0.tgz", + "integrity": "sha512-rnZr6dML2z4IARI4zPGQV4arDikF/9OXZQzrC01dLmn0CZxU5U5OLd/m1T7YkGRj5UitjeoCtg/zorlgMQcdTg==", "dependencies": { - "@opentelemetry/api": "^1.3.0" + "@opentelemetry/core": "2.0.0", + "@opentelemetry/semantic-conventions": "^1.29.0" }, "engines": { - "node": ">=8.0.0" + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.3.0 <1.10.0" } }, - "node_modules/@opentelemetry/sdk-logs/node_modules/@opentelemetry/core": { + "node_modules/@opentelemetry/sdk-metrics": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.0.0.tgz", - "integrity": "sha512-SLX36allrcnVaPYG3R78F/UZZsBsvbc7lMCLx37LyH5MJ1KAAZ2E3mW9OAD3zGz0G8q/BtoS5VUrjzDydhD6LQ==", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-2.0.0.tgz", + "integrity": "sha512-Bvy8QDjO05umd0+j+gDeWcTaVa1/R2lDj/eOvjzpm8VQj1K1vVZJuyjThpV5/lSHyYW2JaHF2IQ7Z8twJFAhjA==", "dependencies": { - "@opentelemetry/semantic-conventions": "^1.29.0" + "@opentelemetry/core": "2.0.0", + "@opentelemetry/resources": "2.0.0" }, "engines": { "node": "^18.19.0 || >=20.6.0" }, "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" + "@opentelemetry/api": ">=1.9.0 <1.10.0" } }, - "node_modules/@opentelemetry/sdk-logs/node_modules/@opentelemetry/resources": { + "node_modules/@opentelemetry/sdk-metrics/node_modules/@opentelemetry/resources": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.0.0.tgz", "integrity": "sha512-rnZr6dML2z4IARI4zPGQV4arDikF/9OXZQzrC01dLmn0CZxU5U5OLd/m1T7YkGRj5UitjeoCtg/zorlgMQcdTg==", @@ -2273,127 +1851,29 @@ "@opentelemetry/api": ">=1.3.0 <1.10.0" } }, - "node_modules/@opentelemetry/sdk-node/node_modules/@opentelemetry/api-logs": { - "version": "0.200.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.200.0.tgz", - "integrity": "sha512-IKJBQxh91qJ+3ssRly5hYEJ8NDHu9oY/B1PXVSCWf7zytmYO9RNLB0Ox9XQ/fJ8m6gY6Q6NtBWlmXfaXt5Uc4Q==", - "dependencies": { - "@opentelemetry/api": "^1.3.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@opentelemetry/sdk-node/node_modules/@opentelemetry/core": { + "node_modules/@opentelemetry/sdk-node/node_modules/@opentelemetry/resources": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.0.0.tgz", - "integrity": "sha512-SLX36allrcnVaPYG3R78F/UZZsBsvbc7lMCLx37LyH5MJ1KAAZ2E3mW9OAD3zGz0G8q/BtoS5VUrjzDydhD6LQ==", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.0.0.tgz", + "integrity": "sha512-rnZr6dML2z4IARI4zPGQV4arDikF/9OXZQzrC01dLmn0CZxU5U5OLd/m1T7YkGRj5UitjeoCtg/zorlgMQcdTg==", "dependencies": { + "@opentelemetry/core": "2.0.0", "@opentelemetry/semantic-conventions": "^1.29.0" }, "engines": { "node": "^18.19.0 || >=20.6.0" }, "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" + "@opentelemetry/api": ">=1.3.0 <1.10.0" } }, - "node_modules/@opentelemetry/sdk-node/node_modules/@opentelemetry/exporter-metrics-otlp-http": { - "version": "0.200.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-metrics-otlp-http/-/exporter-metrics-otlp-http-0.200.0.tgz", - "integrity": "sha512-5BiR6i8yHc9+qW7F6LqkuUnIzVNA7lt0qRxIKcKT+gq3eGUPHZ3DY29sfxI3tkvnwMgtnHDMNze5DdxW39HsAw==", + "node_modules/@opentelemetry/sdk-trace-base": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-2.0.0.tgz", + "integrity": "sha512-qQnYdX+ZCkonM7tA5iU4fSRsVxbFGml8jbxOgipRGMFHKaXKHQ30js03rTobYjKjIfnOsZSbHKWF0/0v0OQGfw==", "dependencies": { "@opentelemetry/core": "2.0.0", - "@opentelemetry/otlp-exporter-base": "0.200.0", - "@opentelemetry/otlp-transformer": "0.200.0", "@opentelemetry/resources": "2.0.0", - "@opentelemetry/sdk-metrics": "2.0.0" - }, - "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/sdk-node/node_modules/@opentelemetry/instrumentation": { - "version": "0.200.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.200.0.tgz", - "integrity": "sha512-pmPlzfJd+vvgaZd/reMsC8RWgTXn2WY1OWT5RT42m3aOn5532TozwXNDhg1vzqJ+jnvmkREcdLr27ebJEQt0Jg==", - "dependencies": { - "@opentelemetry/api-logs": "0.200.0", - "@types/shimmer": "^1.2.0", - "import-in-the-middle": "^1.8.1", - "require-in-the-middle": "^7.1.1", - "shimmer": "^1.2.1" - }, - "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/sdk-node/node_modules/@opentelemetry/resources": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.0.0.tgz", - "integrity": "sha512-rnZr6dML2z4IARI4zPGQV4arDikF/9OXZQzrC01dLmn0CZxU5U5OLd/m1T7YkGRj5UitjeoCtg/zorlgMQcdTg==", - "dependencies": { - "@opentelemetry/core": "2.0.0", - "@opentelemetry/semantic-conventions": "^1.29.0" - }, - "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.3.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/sdk-node/node_modules/@opentelemetry/sdk-metrics": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-2.0.0.tgz", - "integrity": "sha512-Bvy8QDjO05umd0+j+gDeWcTaVa1/R2lDj/eOvjzpm8VQj1K1vVZJuyjThpV5/lSHyYW2JaHF2IQ7Z8twJFAhjA==", - "dependencies": { - "@opentelemetry/core": "2.0.0", - "@opentelemetry/resources": "2.0.0" - }, - "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.9.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/sdk-node/node_modules/acorn": { - "version": "8.14.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz", - "integrity": "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/@opentelemetry/sdk-node/node_modules/import-in-the-middle": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-1.13.1.tgz", - "integrity": "sha512-k2V9wNm9B+ysuelDTHjI9d5KPc4l8zAZTGqj+pcynvWkypZd857ryzN8jNC7Pg2YZXNMJcHRPpaDyCBbNyVRpA==", - "dependencies": { - "acorn": "^8.14.0", - "acorn-import-attributes": "^1.9.5", - "cjs-module-lexer": "^1.2.2", - "module-details-from-path": "^1.0.3" - } - }, - "node_modules/@opentelemetry/sdk-trace-base": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-2.0.0.tgz", - "integrity": "sha512-qQnYdX+ZCkonM7tA5iU4fSRsVxbFGml8jbxOgipRGMFHKaXKHQ30js03rTobYjKjIfnOsZSbHKWF0/0v0OQGfw==", - "dependencies": { - "@opentelemetry/core": "2.0.0", - "@opentelemetry/resources": "2.0.0", - "@opentelemetry/semantic-conventions": "^1.29.0" + "@opentelemetry/semantic-conventions": "^1.29.0" }, "engines": { "node": "^18.19.0 || >=20.6.0" @@ -2402,20 +1882,6 @@ "@opentelemetry/api": ">=1.3.0 <1.10.0" } }, - "node_modules/@opentelemetry/sdk-trace-base/node_modules/@opentelemetry/core": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.0.0.tgz", - "integrity": "sha512-SLX36allrcnVaPYG3R78F/UZZsBsvbc7lMCLx37LyH5MJ1KAAZ2E3mW9OAD3zGz0G8q/BtoS5VUrjzDydhD6LQ==", - "dependencies": { - "@opentelemetry/semantic-conventions": "^1.29.0" - }, - "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" - } - }, "node_modules/@opentelemetry/sdk-trace-base/node_modules/@opentelemetry/resources": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.0.0.tgz", @@ -2447,24 +1913,10 @@ "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, - "node_modules/@opentelemetry/sdk-trace-node/node_modules/@opentelemetry/core": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.0.0.tgz", - "integrity": "sha512-SLX36allrcnVaPYG3R78F/UZZsBsvbc7lMCLx37LyH5MJ1KAAZ2E3mW9OAD3zGz0G8q/BtoS5VUrjzDydhD6LQ==", - "dependencies": { - "@opentelemetry/semantic-conventions": "^1.29.0" - }, - "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" - } - }, "node_modules/@opentelemetry/semantic-conventions": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.32.0.tgz", - "integrity": "sha512-s0OpmpQFSfMrmedAn9Lhg4KWJELHCU6uU9dtIJ28N8UGhf9Y55im5X8fEzwhwDwiSqN+ZPSNrDJF7ivf/AuRPQ==", + "version": "1.34.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.34.0.tgz", + "integrity": "sha512-aKcOkyrorBGlajjRdVoJWHTxfxO1vCNHLJVlSDaRHDIdjU+pX8IYQPvPDkYiujKLbRnWU+1TBwEt0QRgSm4SGA==", "engines": { "node": ">=14" } @@ -2583,16 +2035,18 @@ "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==" }, "node_modules/@rushstack/node-core-library": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/@rushstack/node-core-library/-/node-core-library-4.3.0.tgz", - "integrity": "sha512-JuNZ7lwaYQ4R1TugpryyWBn4lIxK+L7fF+muibFp0by5WklG22nsvH868fuBoZMLo5FqAs6WFOifNos4PJjWSA==", - "dependencies": { - "fs-extra": "~7.0.1", + "version": "5.13.0", + "resolved": "https://registry.npmjs.org/@rushstack/node-core-library/-/node-core-library-5.13.0.tgz", + "integrity": "sha512-IGVhy+JgUacAdCGXKUrRhwHMTzqhWwZUI+qEPcdzsb80heOw0QPbhhoVsoiMF7Klp8eYsp7hzpScMXmOa3Uhfg==", + "dependencies": { + "ajv": "~8.13.0", + "ajv-draft-04": "~1.0.0", + "ajv-formats": "~3.0.1", + "fs-extra": "~11.3.0", "import-lazy": "~4.0.0", "jju": "~1.4.0", "resolve": "~1.22.1", - "semver": "~7.5.4", - "z-schema": "~5.0.2" + "semver": "~7.5.4" }, "peerDependencies": { "@types/node": "*" @@ -2603,26 +2057,51 @@ } } }, + "node_modules/@rushstack/node-core-library/node_modules/ajv": { + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.13.0.tgz", + "integrity": "sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA==", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.4.1" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@rushstack/node-core-library/node_modules/ajv-draft-04": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/ajv-draft-04/-/ajv-draft-04-1.0.0.tgz", + "integrity": "sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw==", + "peerDependencies": { + "ajv": "^8.5.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, "node_modules/@rushstack/node-core-library/node_modules/fs-extra": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", - "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "version": "11.3.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.0.tgz", + "integrity": "sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew==", "dependencies": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" }, "engines": { - "node": ">=6 <7 || >=8" + "node": ">=14.14" } }, - "node_modules/@rushstack/node-core-library/node_modules/jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } + "node_modules/@rushstack/node-core-library/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" }, "node_modules/@rushstack/node-core-library/node_modules/lru-cache": { "version": "6.0.0", @@ -2650,19 +2129,19 @@ } }, "node_modules/@rushstack/node-core-library/node_modules/universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", "engines": { - "node": ">= 4.0.0" + "node": ">= 10.0.0" } }, "node_modules/@rushstack/terminal": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@rushstack/terminal/-/terminal-0.11.0.tgz", - "integrity": "sha512-LKz7pv0G9Py5uULahNSixK1pTqIIKd103pAGhDW51YfzPojvmO5wfITe0PEUNAJZjuufN/KgeRW83dJo1gL2rQ==", + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/@rushstack/terminal/-/terminal-0.15.2.tgz", + "integrity": "sha512-7Hmc0ysK5077R/IkLS9hYu0QuNafm+TbZbtYVzCMbeOdMjaRboLKrhryjwZSRJGJzu+TV1ON7qZHeqf58XfLpA==", "dependencies": { - "@rushstack/node-core-library": "4.3.0", + "@rushstack/node-core-library": "5.13.0", "supports-color": "~8.1.1" }, "peerDependencies": { @@ -2689,11 +2168,11 @@ } }, "node_modules/@rushstack/ts-command-line": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/@rushstack/ts-command-line/-/ts-command-line-4.21.0.tgz", - "integrity": "sha512-z38FLUCn8M9FQf19gJ9eltdwkvc47PxvJmVZS6aKwbBAa3Pis3r3A+ZcBCVPNb9h/Tbga+i0tHdzoSGUoji9GQ==", + "version": "4.23.7", + "resolved": "https://registry.npmjs.org/@rushstack/ts-command-line/-/ts-command-line-4.23.7.tgz", + "integrity": "sha512-Gr9cB7DGe6uz5vq2wdr89WbVDKz0UeuFEn5H2CfWDe7JvjFFaiV15gi6mqDBTbHhHCWS7w8mF1h3BnIfUndqdA==", "dependencies": { - "@rushstack/terminal": "0.11.0", + "@rushstack/terminal": "0.15.2", "@types/argparse": "1.0.38", "argparse": "~1.0.9", "string-argv": "~0.3.1" @@ -2713,41 +2192,41 @@ "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" }, "node_modules/@sentry-internal/tracing": { - "version": "7.115.0", - "resolved": "https://registry.npmjs.org/@sentry-internal/tracing/-/tracing-7.115.0.tgz", - "integrity": "sha512-n1w3eJadvzkL4HebjtJGHre8Z9WbYpPw5GxSNI8ZFM+OTnhzzCAEcNL2C4tr7ssD2Lkao4+N3KaigJi54geOmg==", + "version": "7.120.3", + "resolved": "https://registry.npmjs.org/@sentry-internal/tracing/-/tracing-7.120.3.tgz", + "integrity": "sha512-Ausx+Jw1pAMbIBHStoQ6ZqDZR60PsCByvHdw/jdH9AqPrNE9xlBSf9EwcycvmrzwyKspSLaB52grlje2cRIUMg==", "dev": true, "dependencies": { - "@sentry/core": "7.115.0", - "@sentry/types": "7.115.0", - "@sentry/utils": "7.115.0" + "@sentry/core": "7.120.3", + "@sentry/types": "7.120.3", + "@sentry/utils": "7.120.3" }, "engines": { "node": ">=8" } }, "node_modules/@sentry/core": { - "version": "7.115.0", - "resolved": "https://registry.npmjs.org/@sentry/core/-/core-7.115.0.tgz", - "integrity": "sha512-LSacE6rY/pJY4esXdLex5qVjo82DX6sQuvDLcEcR00bvRWGWMxSi2SipeW4RLbKmYyi0Ub+T+tUJxIOViyqyXw==", + "version": "7.120.3", + "resolved": "https://registry.npmjs.org/@sentry/core/-/core-7.120.3.tgz", + "integrity": "sha512-vyy11fCGpkGK3qI5DSXOjgIboBZTriw0YDx/0KyX5CjIjDDNgp5AGgpgFkfZyiYiaU2Ww3iFuKo4wHmBusz1uA==", "dev": true, "dependencies": { - "@sentry/types": "7.115.0", - "@sentry/utils": "7.115.0" + "@sentry/types": "7.120.3", + "@sentry/utils": "7.120.3" }, "engines": { "node": ">=8" } }, "node_modules/@sentry/integrations": { - "version": "7.115.0", - "resolved": "https://registry.npmjs.org/@sentry/integrations/-/integrations-7.115.0.tgz", - "integrity": "sha512-0a75FIfG2mLPTmQ2QYFYoh3yvHqGT+D4SBAcsWVZEG24lNCiofSHnjffzIOXZX+2Spi1nY+cxIt9ItSyS2Z8VQ==", + "version": "7.120.3", + "resolved": "https://registry.npmjs.org/@sentry/integrations/-/integrations-7.120.3.tgz", + "integrity": "sha512-6i/lYp0BubHPDTg91/uxHvNui427df9r17SsIEXa2eKDwQ9gW2qRx5IWgvnxs2GV/GfSbwcx4swUB3RfEWrXrQ==", "dev": true, "dependencies": { - "@sentry/core": "7.115.0", - "@sentry/types": "7.115.0", - "@sentry/utils": "7.115.0", + "@sentry/core": "7.120.3", + "@sentry/types": "7.120.3", + "@sentry/utils": "7.120.3", "localforage": "^1.8.1" }, "engines": { @@ -2755,37 +2234,37 @@ } }, "node_modules/@sentry/node": { - "version": "7.115.0", - "resolved": "https://registry.npmjs.org/@sentry/node/-/node-7.115.0.tgz", - "integrity": "sha512-Y8kiwHqiICLkraSTsm7O/MWkfakRXOjhwpv4f3f+5CmPIigW0YCMTQZ3sSX+NhnvDhdkmakWy3tH9CX8+T2Ykg==", + "version": "7.120.3", + "resolved": "https://registry.npmjs.org/@sentry/node/-/node-7.120.3.tgz", + "integrity": "sha512-t+QtekZedEfiZjbkRAk1QWJPnJlFBH/ti96tQhEq7wmlk3VszDXraZvLWZA0P2vXyglKzbWRGkT31aD3/kX+5Q==", "dev": true, "dependencies": { - "@sentry-internal/tracing": "7.115.0", - "@sentry/core": "7.115.0", - "@sentry/integrations": "7.115.0", - "@sentry/types": "7.115.0", - "@sentry/utils": "7.115.0" + "@sentry-internal/tracing": "7.120.3", + "@sentry/core": "7.120.3", + "@sentry/integrations": "7.120.3", + "@sentry/types": "7.120.3", + "@sentry/utils": "7.120.3" }, "engines": { "node": ">=8" } }, "node_modules/@sentry/types": { - "version": "7.115.0", - "resolved": "https://registry.npmjs.org/@sentry/types/-/types-7.115.0.tgz", - "integrity": "sha512-KbhDS0DX+lk9VFCCR4AwPdiU9KUAH+vI+5HBLlgCNMY7KRGxRLnpXi3VyGi80iRdt2gi8sg2ncsVhc+SunBx7w==", + "version": "7.120.3", + "resolved": "https://registry.npmjs.org/@sentry/types/-/types-7.120.3.tgz", + "integrity": "sha512-C4z+3kGWNFJ303FC+FxAd4KkHvxpNFYAFN8iMIgBwJdpIl25KZ8Q/VdGn0MLLUEHNLvjob0+wvwlcRBBNLXOow==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/@sentry/utils": { - "version": "7.115.0", - "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-7.115.0.tgz", - "integrity": "sha512-MhrpHOMPwsjlXE3vnfFFyexneozPluaMCgL7MzH2iL0m7FxXG8A9CEe7W9sVG8hh1kw8ksYz1ryb2Mx2L+UTJA==", + "version": "7.120.3", + "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-7.120.3.tgz", + "integrity": "sha512-UDAOQJtJDxZHQ5Nm1olycBIsz2wdGX8SdzyGVHmD8EOQYAeDZQyIlQYohDe9nazdIOQLZCIc3fU0G9gqVLkaGQ==", "dev": true, "dependencies": { - "@sentry/types": "7.115.0" + "@sentry/types": "7.120.3" }, "engines": { "node": ">=8" @@ -2801,38 +2280,38 @@ } }, "node_modules/@sinonjs/fake-timers": { - "version": "11.2.2", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-11.2.2.tgz", - "integrity": "sha512-G2piCSxQ7oWOxwGSAyFHfPIsyeJGXYtc6mFbnFA+kRXkiEnTl8c/8jul2S329iFBnDI9HGoeWWAZvuvOkZccgw==", + "version": "11.3.1", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-11.3.1.tgz", + "integrity": "sha512-EVJO7nW5M/F5Tur0Rf2z/QoMo+1Ia963RiMtapiQrEWvY0iBUvADo8Beegwjpnle5BHkyHuoxSTW3jF43H1XRA==", "dev": true, "dependencies": { - "@sinonjs/commons": "^3.0.0" + "@sinonjs/commons": "^3.0.1" } }, "node_modules/@sinonjs/samsam": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-8.0.0.tgz", - "integrity": "sha512-Bp8KUVlLp8ibJZrnvq2foVhP0IVX2CIprMJPK0vqGqgrDa0OHVKeZyBykqskkrdxV6yKBPmGasO8LVjAKR3Gew==", + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-8.0.2.tgz", + "integrity": "sha512-v46t/fwnhejRSFTGqbpn9u+LQ9xJDse10gNnPgAcxgdoCDMXj/G2asWAC/8Qs+BAZDicX+MNZouXT1A7c83kVw==", "dev": true, "dependencies": { - "@sinonjs/commons": "^2.0.0", + "@sinonjs/commons": "^3.0.1", "lodash.get": "^4.4.2", - "type-detect": "^4.0.8" + "type-detect": "^4.1.0" } }, - "node_modules/@sinonjs/samsam/node_modules/@sinonjs/commons": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-2.0.0.tgz", - "integrity": "sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==", + "node_modules/@sinonjs/samsam/node_modules/type-detect": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.1.0.tgz", + "integrity": "sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==", "dev": true, - "dependencies": { - "type-detect": "4.0.8" + "engines": { + "node": ">=4" } }, "node_modules/@sinonjs/text-encoding": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.2.tgz", - "integrity": "sha512-sXXKG+uL9IrKqViTtao2Ws6dy0znu9sOaP1di/jKGW1M6VssO8vlpXCQcpZ+jisQ1tTFAC5Jo/EOzFbggBagFQ==", + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.3.tgz", + "integrity": "sha512-DE427ROAphMQzU4ENbliGYrBSYPXF+TtLg9S8vzeA+OF4ZKzoDdzfL8sxuMUGS/lgRhM6j1URSk9ghf7Xo1tyA==", "dev": true }, "node_modules/@testim/chrome-version": { @@ -2841,6 +2320,15 @@ "integrity": "sha512-kIhULpw9TrGYnHp/8VfdcneIcxKnLixmADtukQRtJUmsVlMg0niMkwV0xZmi8hqa57xqilIHjWFA0GKvEjVU5g==", "optional": true }, + "node_modules/@tootallnate/once": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", + "optional": true, + "engines": { + "node": ">= 6" + } + }, "node_modules/@tootallnate/quickjs-emscripten": { "version": "0.23.0", "resolved": "https://registry.npmjs.org/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz", @@ -2853,9 +2341,9 @@ "integrity": "sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA==" }, "node_modules/@types/chai": { - "version": "4.3.16", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.16.tgz", - "integrity": "sha512-PatH4iOdyh3MyWtmHVFXLWCCIhUbopaltqddG9BzB+gMIzee2MJrvd+jouii9Z3wzQJruGWAm7WOMjgfG8hQlQ==", + "version": "4.3.20", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.20.tgz", + "integrity": "sha512-/pC9HAB5I/xMlc5FP77qjCnI16ChlJfW0tGa0IUcFn38VJrTV6DeZ60NU5KZBtaOZqjdpwTWohz5HU1RrhiYxQ==", "dev": true }, "node_modules/@types/cookiejar": { @@ -2873,9 +2361,9 @@ } }, "node_modules/@types/estree": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", - "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", "dev": true }, "node_modules/@types/json-schema": { @@ -2885,16 +2373,16 @@ "dev": true }, "node_modules/@types/ms": { - "version": "0.7.34", - "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz", - "integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==" + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", + "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==" }, "node_modules/@types/node": { - "version": "22.15.17", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.15.17.tgz", - "integrity": "sha512-wIX2aSZL5FE+MR0JlvF87BNVrtFWf6AE6rxSE9X7OwnVvoyCQjpzSRJ+M87se/4QCkCiebQAqrJ0y6fwIyi7nw==", + "version": "24.0.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.0.1.tgz", + "integrity": "sha512-MX4Zioh39chHlDJbKmEgydJDS3tspMP/lnQC67G3SWsTnb9NeYVWOjkxpOSy4oMfPs4StcWHwBrvUb4ybfnuaw==", "dependencies": { - "undici-types": "~6.21.0" + "undici-types": "~7.8.0" } }, "node_modules/@types/shimmer": { @@ -2913,9 +2401,9 @@ } }, "node_modules/@types/validator": { - "version": "13.11.10", - "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.11.10.tgz", - "integrity": "sha512-e2PNXoXLr6Z+dbfx5zSh9TRlXJrELycxiaXznp4S5+D2M3b9bqJEitNHA5923jhnB2zzFiZHa2f0SI1HoIahpg==" + "version": "13.15.1", + "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.15.1.tgz", + "integrity": "sha512-9gG6ogYcoI2mCMLdcO0NYI0AYrbxIjv0MDmy/5Ywo6CpWWrqYayc+mmgxRsCgtcGJm9BSbXkMsmxGah1iGHAAQ==" }, "node_modules/@types/yauzl": { "version": "2.10.3", @@ -2927,10 +2415,13 @@ } }, "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==", - "optional": true + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-2.0.0.tgz", + "integrity": "sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } }, "node_modules/abort-controller": { "version": "3.0.0", @@ -2992,44 +2483,18 @@ } }, "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==", - "optional": true, - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/agent-base/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz", + "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==", "optional": true, - "dependencies": { - "ms": "2.1.2" - }, "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "node": ">= 14" } }, - "node_modules/agent-base/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==", - "optional": true - }, "node_modules/agentkeepalive": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.5.0.tgz", - "integrity": "sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==", + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.6.0.tgz", + "integrity": "sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ==", "optional": true, "dependencies": { "humanize-ms": "^1.2.1" @@ -3067,6 +2532,42 @@ "url": "https://github.com/sponsors/epoberezkin" } }, + "node_modules/ajv-formats": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", + "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ajv-formats/node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, "node_modules/ajv-keywords": { "version": "3.5.2", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", @@ -3162,6 +2663,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz", "integrity": "sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==", + "deprecated": "This package is no longer supported.", "optional": true, "dependencies": { "delegates": "^1.0.0", @@ -3208,13 +2710,13 @@ } }, "node_modules/array-buffer-byte-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", - "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", + "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", "dev": true, "dependencies": { - "call-bind": "^1.0.5", - "is-array-buffer": "^3.0.4" + "call-bound": "^1.0.3", + "is-array-buffer": "^3.0.5" }, "engines": { "node": ">= 0.4" @@ -3229,17 +2731,19 @@ "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" }, "node_modules/array-includes": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz", - "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==", + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.9.tgz", + "integrity": "sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-object-atoms": "^1.0.0", - "get-intrinsic": "^1.2.4", - "is-string": "^1.0.7" + "es-abstract": "^1.24.0", + "es-object-atoms": "^1.1.1", + "get-intrinsic": "^1.3.0", + "is-string": "^1.1.1", + "math-intrinsics": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -3249,19 +2753,18 @@ } }, "node_modules/arraybuffer.prototype.slice": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", - "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", + "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", "dev": true, "dependencies": { "array-buffer-byte-length": "^1.0.1", - "call-bind": "^1.0.5", + "call-bind": "^1.0.8", "define-properties": "^1.2.1", - "es-abstract": "^1.22.3", - "es-errors": "^1.2.1", - "get-intrinsic": "^1.2.3", - "is-array-buffer": "^3.0.4", - "is-shared-array-buffer": "^1.0.2" + "es-abstract": "^1.23.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "is-array-buffer": "^3.0.4" }, "engines": { "node": ">= 0.4" @@ -3326,9 +2829,18 @@ } }, "node_modules/async": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz", - "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==" + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", + "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==" + }, + "node_modules/async-function": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz", + "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==", + "dev": true, + "engines": { + "node": ">= 0.4" + } }, "node_modules/asynckit": { "version": "0.4.0", @@ -3377,9 +2889,9 @@ } }, "node_modules/aws4": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.13.1.tgz", - "integrity": "sha512-u5w79Rd7SU4JaIlA/zFqG+gOiuq25q5VLyZ8E+ijJeILuTxVzZgp2CaGw/UTw6pXYN9XMO9yiqj/nEHmhTG5CA==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.13.2.tgz", + "integrity": "sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw==", "dev": true }, "node_modules/axios": { @@ -3623,9 +3135,9 @@ "dev": true }, "node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.2.tgz", + "integrity": "sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw==" }, "node_modules/body-parser": { "version": "1.20.3", @@ -3668,12 +3180,13 @@ "version": "3.2.0", "resolved": "https://registry.npmjs.org/boolean/-/boolean-3.2.0.tgz", "integrity": "sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", "dev": true }, "node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "dependencies": { "balanced-match": "^1.0.0" } @@ -3682,7 +3195,6 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "dev": true, "dependencies": { "fill-range": "^7.1.1" }, @@ -3711,9 +3223,9 @@ "dev": true }, "node_modules/browserslist": { - "version": "4.23.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz", - "integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==", + "version": "4.25.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.25.0.tgz", + "integrity": "sha512-PJ8gYKeS5e/whHBh8xrwYK+dAvEj7JXtz6uTucnMRB8OiGTsKccFekoRrjajPBHV8oOY+2tI4uxeceSimKwMFA==", "dev": true, "funding": [ { @@ -3730,10 +3242,10 @@ } ], "dependencies": { - "caniuse-lite": "^1.0.30001587", - "electron-to-chromium": "^1.4.668", - "node-releases": "^2.0.14", - "update-browserslist-db": "^1.0.13" + "caniuse-lite": "^1.0.30001718", + "electron-to-chromium": "^1.5.160", + "node-releases": "^2.0.19", + "update-browserslist-db": "^1.1.3" }, "bin": { "browserslist": "cli.js" @@ -3806,31 +3318,195 @@ "node": ">= 0.8" } }, - "node_modules/caching-transform": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-4.0.0.tgz", - "integrity": "sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==", - "dev": true, + "node_modules/cacache": { + "version": "15.3.0", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.3.0.tgz", + "integrity": "sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==", + "optional": true, "dependencies": { - "hasha": "^5.0.0", - "make-dir": "^3.0.0", - "package-hash": "^4.0.0", - "write-file-atomic": "^3.0.0" - }, - "engines": { - "node": ">=8" - } + "@npmcli/fs": "^1.0.0", + "@npmcli/move-file": "^1.0.1", + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "glob": "^7.1.4", + "infer-owner": "^1.0.4", + "lru-cache": "^6.0.0", + "minipass": "^3.1.1", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.2", + "mkdirp": "^1.0.3", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^8.0.1", + "tar": "^6.0.2", + "unique-filename": "^1.1.1" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/cacache/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "optional": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/cacache/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "optional": 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/cacache/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==", + "optional": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/cacache/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "optional": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/cacache/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "optional": true, + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/cacache/node_modules/p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "optional": true, + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cacache/node_modules/tar": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", + "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", + "optional": 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/cacache/node_modules/tar/node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "optional": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/caching-transform": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-4.0.0.tgz", + "integrity": "sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==", + "dev": true, + "dependencies": { + "hasha": "^5.0.0", + "make-dir": "^3.0.0", + "package-hash": "^4.0.0", + "write-file-atomic": "^3.0.0" + }, + "engines": { + "node": ">=8" + } }, "node_modules/call-bind": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", - "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", + "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", + "dev": true, "dependencies": { + "call-bind-apply-helpers": "^1.0.0", "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.1" + "set-function-length": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" }, "engines": { "node": ">= 0.4" @@ -3879,9 +3555,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001620", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001620.tgz", - "integrity": "sha512-WJvYsOjd1/BYUY6SNGUosK9DUidBPDTnOARHp3fSmFO1ekdxaY6nKRttEVrfMmYi80ctS0kz1wiWmm14fVc3ew==", + "version": "1.0.30001722", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001722.tgz", + "integrity": "sha512-DCQHBBZtiK6JVkAGw7drvAMK0Q0POD/xZvEmDp6baiMMP6QXXk9HpD6mNYBZWhOPG6LvIDb82ITqtWjhDckHCA==", "dev": true, "funding": [ { @@ -4042,16 +3718,10 @@ "integrity": "sha512-Wmza/JzL0SiWz7kl6MhIKT5ceIlnFPJX+lwUGj7Clhy5MMldsSoJR0+uvRzOS5Kv45Mq7t1PoE8TsOA9bzvb6g==" }, "node_modules/chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", @@ -4064,6 +3734,9 @@ "engines": { "node": ">= 8.10.0" }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, "optionalDependencies": { "fsevents": "~2.3.2" } @@ -4089,14 +3762,14 @@ } }, "node_modules/chromedriver": { - "version": "125.0.0", - "resolved": "https://registry.npmjs.org/chromedriver/-/chromedriver-125.0.0.tgz", - "integrity": "sha512-wWXrxWLWqXRTmRZDtPigs+ys44srlpHTpsL7MHnZc9iaE1oIB0hslSVeem6TcsEb1Ou8nvPx3vs5bPwCI6+VHg==", + "version": "137.0.3", + "resolved": "https://registry.npmjs.org/chromedriver/-/chromedriver-137.0.3.tgz", + "integrity": "sha512-ceBxOxaXl/3ddvxZicgASpL8HfxmUK/q/VI3STcyl0t+SvgydNqXQO1XWwqUIA/tMfREpUunumQvwH7r6hdT0Q==", "hasInstallScript": true, "optional": true, "dependencies": { "@testim/chrome-version": "^1.1.4", - "axios": "^1.6.7", + "axios": "^1.7.4", "compare-versions": "^6.1.0", "extract-zip": "^2.0.1", "proxy-agent": "^6.4.0", @@ -4107,7 +3780,7 @@ "chromedriver": "bin/chromedriver" }, "engines": { - "node": ">=18" + "node": ">=20" } }, "node_modules/circular-json": { @@ -4193,29 +3866,16 @@ "dev": true }, "node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", "dependencies": { "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", + "strip-ansi": "^6.0.1", "wrap-ansi": "^7.0.0" - } - }, - "node_modules/cliui/node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "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": ">=12" } }, "node_modules/color-convert": { @@ -4300,9 +3960,9 @@ } }, "node_modules/command-line-usage/node_modules/typical": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/typical/-/typical-7.1.1.tgz", - "integrity": "sha512-T+tKVNs6Wu7IWiAce5BgMd7OZfNYUndHwc5MknN+UHOudi7sGZzuHdCadllRuqJ3fPtgFtIH9+lt9qRv6lmpfA==", + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/typical/-/typical-7.3.0.tgz", + "integrity": "sha512-ya4mg/30vm+DOWfBg4YK3j2WD6TWtRkCbasOJr40CseYENzCUby/7rIvXA99JGsQHeNxLbnXdyLLxKSv3tauFw==", "engines": { "node": ">=12.17" } @@ -4323,9 +3983,9 @@ "dev": true }, "node_modules/compare-versions": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-6.1.0.tgz", - "integrity": "sha512-LNZQXhqUvqUTotpZ00qLSaify3b4VFD588aRr8MKFw4CMUr98ytzCW5wDH5qx/DEY5kCDXcbcRuCqL0szEf2tg==", + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-6.1.1.tgz", + "integrity": "sha512-4hm4VPpIecmlg59CHXnRDnqGplJFrbLG4aFEl5vl6cK1u76ws3LLvX7ikFnTDl5vo39sjWD6AaDPYodJp/NNHg==", "optional": true }, "node_modules/component-emitter": { @@ -4589,14 +4249,14 @@ } }, "node_modules/data-view-buffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", - "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", + "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.6", + "call-bound": "^1.0.3", "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" + "is-data-view": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -4606,29 +4266,29 @@ } }, "node_modules/data-view-byte-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz", - "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", + "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.7", + "call-bound": "^1.0.3", "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" + "is-data-view": "^1.0.2" }, "engines": { "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/inspect-js" } }, "node_modules/data-view-byte-offset": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz", - "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", + "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.6", + "call-bound": "^1.0.2", "es-errors": "^1.3.0", "is-data-view": "^1.0.1" }, @@ -4680,9 +4340,9 @@ } }, "node_modules/deep-eql": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.1.tgz", - "integrity": "sha512-nwQCf6ne2gez3o1MxWifqkciwt0zhl0LO1/UwVu4uMBuPmflWM4oQ70XMqHqnBJA+nhzncaqL9HVL6KkHJ28lw==", + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz", + "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==", "dev": true, "engines": { "node": ">=6" @@ -4721,6 +4381,7 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dev": true, "dependencies": { "es-define-property": "^1.0.0", "es-errors": "^1.3.0", @@ -4787,9 +4448,9 @@ } }, "node_modules/deglob/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==", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, "dependencies": { "balanced-match": "^1.0.0", @@ -4800,6 +4461,7 @@ "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, "dependencies": { "fs.realpath": "^1.0.0", @@ -4884,9 +4546,9 @@ } }, "node_modules/detect-libc": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", - "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.4.tgz", + "integrity": "sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==", "engines": { "node": ">=8" } @@ -4943,6 +4605,19 @@ "resolved": "https://registry.npmjs.org/dottie/-/dottie-2.0.6.tgz", "integrity": "sha512-iGCHkfUc5kFekGiqhe8B/mdaurD+lakO9txNnTvKtA6PISrw86LgqHvRzWYPyoE2Ph5aMIrCw9/uko6XHTKCwA==" }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/eastasianwidth": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", @@ -5027,9 +4702,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.772", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.772.tgz", - "integrity": "sha512-jFfEbxR/abTTJA3ci+2ok1NTuOBBtB4jH+UT6PUmRN+DY3WSD4FFRsgoVQ+QNIJ0T7wrXwzsWCI2WKC46b++2A==", + "version": "1.5.167", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.167.tgz", + "integrity": "sha512-LxcRvnYO5ez2bMOFpbuuVuAI5QNeY1ncVytE/KXaL6ZNfzX1yPlAO0nSOyIHx2fVAuUprMqPs/TdVhUFZy7SIQ==", "dev": true }, "node_modules/elliptic": { @@ -5130,57 +4805,65 @@ } }, "node_modules/es-abstract": { - "version": "1.23.3", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz", - "integrity": "sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==", + "version": "1.24.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.0.tgz", + "integrity": "sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==", "dev": true, "dependencies": { - "array-buffer-byte-length": "^1.0.1", - "arraybuffer.prototype.slice": "^1.0.3", + "array-buffer-byte-length": "^1.0.2", + "arraybuffer.prototype.slice": "^1.0.4", "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.7", - "data-view-buffer": "^1.0.1", - "data-view-byte-length": "^1.0.1", - "data-view-byte-offset": "^1.0.0", - "es-define-property": "^1.0.0", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "data-view-buffer": "^1.0.2", + "data-view-byte-length": "^1.0.2", + "data-view-byte-offset": "^1.0.1", + "es-define-property": "^1.0.1", "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "es-set-tostringtag": "^2.0.3", - "es-to-primitive": "^1.2.1", - "function.prototype.name": "^1.1.6", - "get-intrinsic": "^1.2.4", - "get-symbol-description": "^1.0.2", - "globalthis": "^1.0.3", - "gopd": "^1.0.1", + "es-object-atoms": "^1.1.1", + "es-set-tostringtag": "^2.1.0", + "es-to-primitive": "^1.3.0", + "function.prototype.name": "^1.1.8", + "get-intrinsic": "^1.3.0", + "get-proto": "^1.0.1", + "get-symbol-description": "^1.1.0", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", "has-property-descriptors": "^1.0.2", - "has-proto": "^1.0.3", - "has-symbols": "^1.0.3", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", "hasown": "^2.0.2", - "internal-slot": "^1.0.7", - "is-array-buffer": "^3.0.4", + "internal-slot": "^1.1.0", + "is-array-buffer": "^3.0.5", "is-callable": "^1.2.7", - "is-data-view": "^1.0.1", + "is-data-view": "^1.0.2", "is-negative-zero": "^2.0.3", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.3", - "is-string": "^1.0.7", - "is-typed-array": "^1.1.13", - "is-weakref": "^1.0.2", - "object-inspect": "^1.13.1", + "is-regex": "^1.2.1", + "is-set": "^2.0.3", + "is-shared-array-buffer": "^1.0.4", + "is-string": "^1.1.1", + "is-typed-array": "^1.1.15", + "is-weakref": "^1.1.1", + "math-intrinsics": "^1.1.0", + "object-inspect": "^1.13.4", "object-keys": "^1.1.1", - "object.assign": "^4.1.5", - "regexp.prototype.flags": "^1.5.2", - "safe-array-concat": "^1.1.2", - "safe-regex-test": "^1.0.3", - "string.prototype.trim": "^1.2.9", - "string.prototype.trimend": "^1.0.8", + "object.assign": "^4.1.7", + "own-keys": "^1.0.1", + "regexp.prototype.flags": "^1.5.4", + "safe-array-concat": "^1.1.3", + "safe-push-apply": "^1.0.0", + "safe-regex-test": "^1.1.0", + "set-proto": "^1.0.0", + "stop-iteration-iterator": "^1.1.0", + "string.prototype.trim": "^1.2.10", + "string.prototype.trimend": "^1.0.9", "string.prototype.trimstart": "^1.0.8", - "typed-array-buffer": "^1.0.2", - "typed-array-byte-length": "^1.0.1", - "typed-array-byte-offset": "^1.0.2", - "typed-array-length": "^1.0.6", - "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.15" + "typed-array-buffer": "^1.0.3", + "typed-array-byte-length": "^1.0.3", + "typed-array-byte-offset": "^1.0.4", + "typed-array-length": "^1.0.7", + "unbox-primitive": "^1.1.0", + "which-typed-array": "^1.1.19" }, "engines": { "node": ">= 0.4" @@ -5190,12 +4873,9 @@ } }, "node_modules/es-define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", - "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", - "dependencies": { - "get-intrinsic": "^1.2.4" - }, + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", "engines": { "node": ">= 0.4" } @@ -5209,10 +4889,9 @@ } }, "node_modules/es-object-atoms": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", - "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", - "dev": true, + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", "dependencies": { "es-errors": "^1.3.0" }, @@ -5221,28 +4900,28 @@ } }, "node_modules/es-set-tostringtag": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", - "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", - "dev": true, + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", "dependencies": { - "get-intrinsic": "^1.2.4", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", "has-tostringtag": "^1.0.2", - "hasown": "^2.0.1" + "hasown": "^2.0.2" }, "engines": { "node": ">= 0.4" } }, "node_modules/es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz", + "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", "dev": true, "dependencies": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" + "is-callable": "^1.2.7", + "is-date-object": "^1.0.5", + "is-symbol": "^1.0.4" }, "engines": { "node": ">= 0.4" @@ -5310,9 +4989,9 @@ } }, "node_modules/escalade": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", - "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", "engines": { "node": ">=6" } @@ -5356,29 +5035,30 @@ } }, "node_modules/eslint": { - "version": "9.16.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.16.0.tgz", - "integrity": "sha512-whp8mSQI4C8VXd+fLgSM0lh3UlmcFtVwUQjyKCFfsp+2ItAIYhlq/hqGahGqHE6cv9unM41VlqKk2VtKYR2TaA==", + "version": "9.28.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.28.0.tgz", + "integrity": "sha512-ocgh41VhRlf9+fVpe7QKzwLj9c92fDiqOj8Y3Sd4/ZmVA4Btx4PlUYPq4pp9JDyupkf1upbEXecxL2mwNV7jPQ==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.12.1", - "@eslint/config-array": "^0.19.0", - "@eslint/core": "^0.9.0", - "@eslint/eslintrc": "^3.2.0", - "@eslint/js": "9.16.0", - "@eslint/plugin-kit": "^0.2.3", + "@eslint/config-array": "^0.20.0", + "@eslint/config-helpers": "^0.2.1", + "@eslint/core": "^0.14.0", + "@eslint/eslintrc": "^3.3.1", + "@eslint/js": "9.28.0", + "@eslint/plugin-kit": "^0.3.1", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", - "@humanwhocodes/retry": "^0.4.1", + "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", "@types/json-schema": "^7.0.15", "ajv": "^6.12.4", "chalk": "^4.0.0", - "cross-spawn": "^7.0.5", + "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^8.2.0", + "eslint-scope": "^8.3.0", "eslint-visitor-keys": "^4.2.0", "espree": "^10.3.0", "esquery": "^1.5.0", @@ -5453,9 +5133,9 @@ "dev": true }, "node_modules/eslint-module-utils": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.1.tgz", - "integrity": "sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==", + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.0.tgz", + "integrity": "sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg==", "dev": true, "dependencies": { "debug": "^3.2.7" @@ -5521,9 +5201,9 @@ } }, "node_modules/eslint-plugin-node/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==", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, "dependencies": { "balanced-match": "^1.0.0", @@ -5593,9 +5273,9 @@ } }, "node_modules/eslint-scope": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.2.0.tgz", - "integrity": "sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A==", + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", + "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", "dev": true, "dependencies": { "esrecurse": "^4.3.0", @@ -5630,9 +5310,9 @@ } }, "node_modules/eslint-visitor-keys": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", - "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", "dev": true, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -5642,9 +5322,9 @@ } }, "node_modules/eslint/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==", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, "dependencies": { "balanced-match": "^1.0.0", @@ -5652,12 +5332,12 @@ } }, "node_modules/eslint/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", "dev": true, "dependencies": { - "ms": "2.1.2" + "ms": "^2.1.3" }, "engines": { "node": ">=6.0" @@ -5681,9 +5361,9 @@ } }, "node_modules/eslint/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==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dev": true }, "node_modules/esniff": { @@ -5702,14 +5382,14 @@ } }, "node_modules/espree": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-10.3.0.tgz", - "integrity": "sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==", + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", + "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", "dev": true, "dependencies": { - "acorn": "^8.14.0", + "acorn": "^8.15.0", "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^4.2.0" + "eslint-visitor-keys": "^4.2.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -5719,9 +5399,9 @@ } }, "node_modules/espree/node_modules/acorn": { - "version": "8.14.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", - "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "dev": true, "bin": { "acorn": "bin/acorn" @@ -5744,9 +5424,9 @@ } }, "node_modules/esquery": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", - "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", "dev": true, "dependencies": { "estraverse": "^5.1.0" @@ -6069,12 +5749,12 @@ } }, "node_modules/extract-zip/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", "optional": true, "dependencies": { - "ms": "2.1.2" + "ms": "^2.1.3" }, "engines": { "node": ">=6.0" @@ -6101,9 +5781,9 @@ } }, "node_modules/extract-zip/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==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "optional": true }, "node_modules/extsprintf": { @@ -6118,8 +5798,33 @@ "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 + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "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.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "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-json-stable-stringify": { "version": "2.1.0", @@ -6147,6 +5852,29 @@ "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==", "dev": true }, + "node_modules/fast-uri": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.6.tgz", + "integrity": "sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ] + }, + "node_modules/fastq": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", + "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", + "dependencies": { + "reusify": "^1.0.4" + } + }, "node_modules/fd-slicer": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", @@ -6235,7 +5963,6 @@ "version": "7.1.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "dev": true, "dependencies": { "to-regex-range": "^5.0.1" }, @@ -6333,15 +6060,15 @@ } }, "node_modules/flatted": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", - "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", + "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", "dev": true }, "node_modules/follow-redirects": { - "version": "1.15.6", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", - "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", + "version": "1.15.9", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", + "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", "funding": [ { "type": "individual", @@ -6358,12 +6085,18 @@ } }, "node_modules/for-each": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", - "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", + "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", "dev": true, "dependencies": { - "is-callable": "^1.1.3" + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/foreground-child": { @@ -6389,12 +6122,14 @@ } }, "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==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.3.tgz", + "integrity": "sha512-qsITQPfmvMOSAdeyZ+12I1c+CKSstAFAwu+97zrnWAbIr5u8wfsExUzCesVLC8NgHuRUqNN4Zy6UPWUTRGslcA==", "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", "mime-types": "^2.1.12" }, "engines": { @@ -6472,32 +6207,45 @@ "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" }, "node_modules/fs-extra": { - "version": "11.2.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", - "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", - "optional": true, + "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": ">=14.14" + "node": ">=10" } }, "node_modules/fs-extra/node_modules/universalify": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "optional": true, + "dev": true, "engines": { "node": ">= 10.0.0" } }, + "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.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "devOptional": true }, "node_modules/fsevents": { "version": "2.3.3", @@ -6534,15 +6282,17 @@ } }, "node_modules/function.prototype.name": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", - "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz", + "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "functions-have-names": "^1.2.3" + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "functions-have-names": "^1.2.3", + "hasown": "^2.0.2", + "is-callable": "^1.2.7" }, "engines": { "node": ">= 0.4" @@ -6570,6 +6320,7 @@ "version": "4.0.4", "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz", "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==", + "deprecated": "This package is no longer supported.", "optional": true, "dependencies": { "aproba": "^1.0.3 || ^2.0.0", @@ -6620,15 +6371,20 @@ } }, "node_modules/get-intrinsic": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", - "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", "function-bind": "^1.1.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -6646,6 +6402,27 @@ "node": ">=8.0.0" } }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-stdin": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-6.0.0.tgz", + "integrity": "sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, "node_modules/get-stream": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", @@ -6658,14 +6435,14 @@ } }, "node_modules/get-symbol-description": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", - "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", + "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", "dev": true, "dependencies": { - "call-bind": "^1.0.5", + "call-bound": "^1.0.3", "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4" + "get-intrinsic": "^1.2.6" }, "engines": { "node": ">= 0.4" @@ -6675,27 +6452,26 @@ } }, "node_modules/get-uri": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-6.0.3.tgz", - "integrity": "sha512-BzUrJBS9EcUb4cFol8r4W3v1cPsSyajLSthNkz5BxbpDcHN5tIrM10E2eNvfnvBn3DaT3DUgx0OpsBKkaOpanw==", + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-6.0.4.tgz", + "integrity": "sha512-E1b1lFFLvLgak2whF2xDBcOy6NLVGZBqqjJjsIhvopKfWWEi64pLVTWWehV8KlLerZkfNTA95sTe2OdJKm1OzQ==", "optional": true, "dependencies": { "basic-ftp": "^5.0.2", "data-uri-to-buffer": "^6.0.2", - "debug": "^4.3.4", - "fs-extra": "^11.2.0" + "debug": "^4.3.4" }, "engines": { "node": ">= 14" } }, "node_modules/get-uri/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", "optional": true, "dependencies": { - "ms": "2.1.2" + "ms": "^2.1.3" }, "engines": { "node": ">=6.0" @@ -6707,9 +6483,9 @@ } }, "node_modules/get-uri/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==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "optional": true }, "node_modules/getpass": { @@ -6730,6 +6506,8 @@ "version": "8.1.0", "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -6760,6 +6538,7 @@ "version": "5.1.6", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, "dependencies": { "brace-expansion": "^2.0.1" }, @@ -6818,11 +6597,11 @@ } }, "node_modules/gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dependencies": { - "get-intrinsic": "^1.1.3" + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -6908,10 +6687,13 @@ } }, "node_modules/has-bigints": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", - "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", + "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", "dev": true, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -6928,6 +6710,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, "dependencies": { "es-define-property": "^1.0.0" }, @@ -6936,9 +6719,13 @@ } }, "node_modules/has-proto": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", - "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", + "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", + "dev": true, + "dependencies": { + "dunder-proto": "^1.0.0" + }, "engines": { "node": ">= 0.4" }, @@ -6947,9 +6734,9 @@ } }, "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==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", "engines": { "node": ">= 0.4" }, @@ -6961,7 +6748,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", - "dev": true, "dependencies": { "has-symbols": "^1.0.3" }, @@ -7043,15 +6829,6 @@ "node": ">=16.0.0" } }, - "node_modules/hexoid": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/hexoid/-/hexoid-1.0.0.tgz", - "integrity": "sha512-QFLV0taWQOZtvIRIAdBChesmogZrtuXvVWsFHZTk2SU+anspqZ2vMnoLg7IE1+Uk16N19APic1BuF8bC8c2m5g==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/hmac-drbg": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", @@ -7062,6 +6839,12 @@ "minimalistic-crypto-utils": "^1.0.1" } }, + "node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true + }, "node_modules/html-escaper": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", @@ -7069,9 +6852,9 @@ "dev": true }, "node_modules/http-cache-semantics": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", - "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", + "integrity": "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==", "optional": true }, "node_modules/http-errors": { @@ -7089,6 +6872,42 @@ "node": ">= 0.8" } }, + "node_modules/http-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "optional": true, + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/http-proxy-agent/node_modules/debug": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", + "optional": true, + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/http-proxy-agent/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==", + "optional": true + }, "node_modules/http-reasons": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/http-reasons/-/http-reasons-0.1.0.tgz", @@ -7155,25 +6974,25 @@ "integrity": "sha512-4EC57ddXrkaF0x83Oj8sM6SLQHAWXw90Skqu2M4AEWENZ3F02dFJE/GARA8igO79tcgYqGrD7ae4f5L3um2lgg==" }, "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==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", "optional": true, "dependencies": { - "agent-base": "6", + "agent-base": "^7.1.2", "debug": "4" }, "engines": { - "node": ">= 6" + "node": ">= 14" } }, "node_modules/https-proxy-agent/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", "optional": true, "dependencies": { - "ms": "2.1.2" + "ms": "^2.1.3" }, "engines": { "node": ">=6.0" @@ -7185,9 +7004,9 @@ } }, "node_modules/https-proxy-agent/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==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "optional": true }, "node_modules/humanize-ms": { @@ -7245,9 +7064,9 @@ "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==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", "dev": true, "dependencies": { "parent-module": "^1.0.0", @@ -7260,6 +7079,28 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/import-in-the-middle": { + "version": "1.14.0", + "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-1.14.0.tgz", + "integrity": "sha512-g5zLT0HaztRJWysayWYiUq/7E5H825QIiecMD2pI5QO7Wzr847l6GDvPvmZaDIdrDtS2w7qRczywxiK6SL5vRw==", + "dependencies": { + "acorn": "^8.14.0", + "acorn-import-attributes": "^1.9.5", + "cjs-module-lexer": "^1.2.2", + "module-details-from-path": "^1.0.3" + } + }, + "node_modules/import-in-the-middle/node_modules/acorn": { + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/import-lazy": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz", @@ -7304,6 +7145,8 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "devOptional": true, "dependencies": { "once": "^1.3.0", "wrappy": "1" @@ -7461,14 +7304,14 @@ } }, "node_modules/internal-slot": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", - "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", + "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", "dev": true, "dependencies": { "es-errors": "^1.3.0", - "hasown": "^2.0.0", - "side-channel": "^1.0.4" + "hasown": "^2.0.2", + "side-channel": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -7516,13 +7359,14 @@ } }, "node_modules/is-array-buffer": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", - "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", + "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.1" + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" }, "engines": { "node": ">= 0.4" @@ -7537,13 +7381,35 @@ "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", "dev": true }, + "node_modules/is-async-function": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz", + "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==", + "dev": true, + "dependencies": { + "async-function": "^1.0.0", + "call-bound": "^1.0.3", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-bigint": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", + "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", "dev": true, "dependencies": { - "has-bigints": "^1.0.1" + "has-bigints": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -7562,13 +7428,13 @@ } }, "node_modules/is-boolean-object": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz", + "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -7596,22 +7462,27 @@ } }, "node_modules/is-core-module": { - "version": "2.13.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", - "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", "dependencies": { - "hasown": "^2.0.0" + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-data-view": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz", - "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", + "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", "dev": true, "dependencies": { + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", "is-typed-array": "^1.1.13" }, "engines": { @@ -7622,12 +7493,13 @@ } }, "node_modules/is-date-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", + "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", "dev": true, "dependencies": { - "has-tostringtag": "^1.0.0" + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -7652,11 +7524,25 @@ "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-finalizationregistry": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", + "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", + "dev": true, + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "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", @@ -7665,11 +7551,28 @@ "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==", + "node_modules/is-generator-function": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.0.tgz", + "integrity": "sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==", "dev": true, + "dependencies": { + "call-bound": "^1.0.3", + "get-proto": "^1.0.0", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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" }, @@ -7695,6 +7598,18 @@ "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==", "optional": true }, + "node_modules/is-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-negative-zero": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", @@ -7711,7 +7626,6 @@ "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" } @@ -7725,12 +7639,13 @@ } }, "node_modules/is-number-object": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", - "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", + "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", "dev": true, "dependencies": { - "has-tostringtag": "^1.0.0" + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -7760,13 +7675,15 @@ "integrity": "sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g==" }, "node_modules/is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", + "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" }, "engines": { "node": ">= 0.4" @@ -7789,13 +7706,25 @@ "node": ">=6" } }, + "node_modules/is-set": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-shared-array-buffer": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", - "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", + "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", "dev": true, "dependencies": { - "call-bind": "^1.0.7" + "call-bound": "^1.0.3" }, "engines": { "node": ">= 0.4" @@ -7813,12 +7742,13 @@ } }, "node_modules/is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", + "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", "dev": true, "dependencies": { - "has-tostringtag": "^1.0.0" + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -7828,12 +7758,14 @@ } }, "node_modules/is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", + "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", "dev": true, "dependencies": { - "has-symbols": "^1.0.2" + "call-bound": "^1.0.2", + "has-symbols": "^1.1.0", + "safe-regex-test": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -7843,12 +7775,12 @@ } }, "node_modules/is-typed-array": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", - "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", + "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", "dev": true, "dependencies": { - "which-typed-array": "^1.1.14" + "which-typed-array": "^1.1.16" }, "engines": { "node": ">= 0.4" @@ -7881,13 +7813,44 @@ "integrity": "sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==", "optional": true }, + "node_modules/is-weakmap": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", + "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-weakref": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", - "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz", + "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==", + "dev": true, + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakset": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", + "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.2" + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -8011,75 +7974,6 @@ "node": ">=8" } }, - "node_modules/istanbul-lib-processinfo/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/istanbul-lib-processinfo/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/istanbul-lib-processinfo/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/istanbul-lib-processinfo/node_modules/p-map": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", - "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", - "dev": true, - "dependencies": { - "aggregate-error": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-processinfo/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/istanbul-lib-processinfo/node_modules/uuid": { "version": "8.3.2", "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", @@ -8133,12 +8027,12 @@ } }, "node_modules/istanbul-lib-source-maps/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", "dev": true, "dependencies": { - "ms": "2.1.2" + "ms": "^2.1.3" }, "engines": { "node": ">=6.0" @@ -8150,9 +8044,9 @@ } }, "node_modules/istanbul-lib-source-maps/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==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dev": true }, "node_modules/istanbul-reports": { @@ -8169,16 +8063,13 @@ } }, "node_modules/jackspeak": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", - "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", "dev": true, "dependencies": { "@isaacs/cliui": "^8.0.2" }, - "engines": { - "node": ">=14" - }, "funding": { "url": "https://github.com/sponsors/isaacs" }, @@ -8187,9 +8078,9 @@ } }, "node_modules/jake": { - "version": "10.9.1", - "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.1.tgz", - "integrity": "sha512-61btcOHNnLnsOdtLgA5efqQWjnSi/vow5HbI7HMdKKWqvrKR1bLK3BPlJn9gcSaP2ewuamUSMB5XEy76KUIS2w==", + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.2.tgz", + "integrity": "sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==", "dependencies": { "async": "^3.2.3", "chalk": "^4.0.2", @@ -8204,9 +8095,9 @@ } }, "node_modules/jake/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==", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -8237,16 +8128,16 @@ } }, "node_modules/js-beautify": { - "version": "1.15.1", - "resolved": "https://registry.npmjs.org/js-beautify/-/js-beautify-1.15.1.tgz", - "integrity": "sha512-ESjNzSlt/sWE8sciZH8kBF8BPlwXPwhR6pWKAw8bw4Bwj+iZcnKW6ONWUutJ7eObuBZQpiIb8S7OYspWrKt7rA==", + "version": "1.15.4", + "resolved": "https://registry.npmjs.org/js-beautify/-/js-beautify-1.15.4.tgz", + "integrity": "sha512-9/KXeZUKKJwqCXUdBxFJ3vPh467OCckSBmYDwSK/EtV090K+iMJ7zx2S3HLVDIWFQdqMIsZWbnaGiba18aWhaA==", "dev": true, "dependencies": { "config-chain": "^1.1.13", "editorconfig": "^1.0.4", - "glob": "^10.3.3", + "glob": "^10.4.2", "js-cookie": "^3.0.5", - "nopt": "^7.2.0" + "nopt": "^7.2.1" }, "bin": { "css-beautify": "js/bin/css-beautify.js", @@ -8257,22 +8148,13 @@ "node": ">=14" } }, - "node_modules/js-beautify/node_modules/abbrev": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-2.0.0.tgz", - "integrity": "sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==", - "dev": true, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, "node_modules/js-beautify/node_modules/foreground-child": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", - "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", "dev": true, "dependencies": { - "cross-spawn": "^7.0.0", + "cross-spawn": "^7.0.6", "signal-exit": "^4.0.1" }, "engines": { @@ -8283,23 +8165,21 @@ } }, "node_modules/js-beautify/node_modules/glob": { - "version": "10.3.15", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.15.tgz", - "integrity": "sha512-0c6RlJt1TICLyvJYIApxb8GsXoai0KUP7AxKKAtsYXdgJR1mGEUa7DgwShbdk1nly0PYoZj01xd4hzbq3fsjpw==", + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", "dev": true, "dependencies": { "foreground-child": "^3.1.0", - "jackspeak": "^2.3.6", - "minimatch": "^9.0.1", - "minipass": "^7.0.4", - "path-scurry": "^1.11.0" + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" }, "bin": { "glob": "dist/esm/bin.mjs" }, - "engines": { - "node": ">=16 || 14 >=14.18" - }, "funding": { "url": "https://github.com/sponsors/isaacs" } @@ -8320,29 +8200,14 @@ } }, "node_modules/js-beautify/node_modules/minipass": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.1.tgz", - "integrity": "sha512-UZ7eQ+h8ywIRAW1hIEl2AqdwzJucU/Kp59+8kkZeSvafXhZjul247BvIJjEVFVeON6d7lM46XX1HXCduKAS8VA==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", "dev": true, "engines": { "node": ">=16 || 14 >=14.17" } }, - "node_modules/js-beautify/node_modules/nopt": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-7.2.1.tgz", - "integrity": "sha512-taM24ViiimT/XntxbPyJQzCG+p4EKOpgD3mxFwW38mGjVUrfERQOeY4EDHjdnptttfHuHQXFx+lTP08Q+mLa/w==", - "dev": true, - "dependencies": { - "abbrev": "^2.0.0" - }, - "bin": { - "nopt": "bin/nopt.js" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, "node_modules/js-beautify/node_modules/signal-exit": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", @@ -8408,15 +8273,15 @@ } }, "node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", "dev": true, "bin": { "jsesc": "bin/jsesc" }, "engines": { - "node": ">=4" + "node": ">=6" } }, "node_modules/json-buffer": { @@ -8470,7 +8335,6 @@ "version": "6.1.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "devOptional": true, "dependencies": { "universalify": "^2.0.0" }, @@ -8482,7 +8346,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "devOptional": true, "engines": { "node": ">= 10.0.0" } @@ -8547,12 +8410,12 @@ "dev": true }, "node_modules/jwk-to-pem": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/jwk-to-pem/-/jwk-to-pem-2.0.5.tgz", - "integrity": "sha512-L90jwellhO8jRKYwbssU9ifaMVqajzj3fpRjDKcsDzrslU9syRbFqfkXtT4B89HYAap+xsxNcxgBSB09ig+a7A==", + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/jwk-to-pem/-/jwk-to-pem-2.0.7.tgz", + "integrity": "sha512-cSVphrmWr6reVchuKQZdfSs4U9c5Y4hwZggPoz6cbVnTpAVgGRpEuQng86IyqLeGZlhTh+c4MAreB6KbdQDKHQ==", "dependencies": { "asn1.js": "^5.3.0", - "elliptic": "^6.5.4", + "elliptic": "^6.6.1", "safe-buffer": "^5.0.1" } }, @@ -8677,12 +8540,9 @@ "node_modules/lodash.get": { "version": "4.4.2", "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", - "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==" - }, - "node_modules/lodash.isequal": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", - "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==" + "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==", + "deprecated": "This package is deprecated. Use the optional chaining (?.) operator instead.", + "dev": true }, "node_modules/lodash.isfinite": { "version": "3.3.2", @@ -8712,9 +8572,9 @@ } }, "node_modules/long": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz", - "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==" + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/long/-/long-5.3.2.tgz", + "integrity": "sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==" }, "node_modules/long-timeout": { "version": "0.1.1", @@ -8734,13 +8594,10 @@ } }, "node_modules/loupe": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.1.tgz", - "integrity": "sha512-edNu/8D5MKVfGVFRhFf8aAxiTM6Wumfz5XsaatSxlD3w4R1d/WEKUTydCdPGbl9K7QG/Ca3GnDV2sIKIpXRQcw==", - "dev": true, - "dependencies": { - "get-func-name": "^2.0.1" - } + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.3.tgz", + "integrity": "sha512-kkIp7XSkP78ZxJEsSxW3712C6teJVoeHHwgo9zJ380de7IYyJ2ISlxojcH2pC5OFLewESmnRi/+XCDIEEVyoug==", + "dev": true }, "node_modules/lru-cache": { "version": "8.0.5", @@ -8791,51 +8648,177 @@ "semver": "bin/semver.js" } }, - "node_modules/matcher": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/matcher/-/matcher-3.0.0.tgz", - "integrity": "sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==", - "dev": true, + "node_modules/make-fetch-happen": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-9.1.0.tgz", + "integrity": "sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg==", + "optional": true, "dependencies": { - "escape-string-regexp": "^4.0.0" + "agentkeepalive": "^4.1.3", + "cacache": "^15.2.0", + "http-cache-semantics": "^4.1.0", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^6.0.0", + "minipass": "^3.1.3", + "minipass-collect": "^1.0.2", + "minipass-fetch": "^1.3.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.2", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^6.0.0", + "ssri": "^8.0.0" }, "engines": { - "node": ">=10" + "node": ">= 10" } }, - "node_modules/md5": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/md5/-/md5-2.3.0.tgz", - "integrity": "sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==", - "dev": true, + "node_modules/make-fetch-happen/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==", + "optional": true, "dependencies": { - "charenc": "0.0.2", - "crypt": "0.0.2", - "is-buffer": "~1.1.6" - } - }, - "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==", + "debug": "4" + }, "engines": { - "node": ">= 0.6" + "node": ">= 6.0.0" } }, - "node_modules/memoizee": { - "version": "0.4.15", - "resolved": "https://registry.npmjs.org/memoizee/-/memoizee-0.4.15.tgz", - "integrity": "sha512-UBWmJpLZd5STPm7PMUlOw/TSy972M+z8gcyQ5veOnSDRREz/0bmpyTfKt3/51DhEBqCZQn1udM/5flcSPYhkdQ==", - "dev": true, + "node_modules/make-fetch-happen/node_modules/debug": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", + "optional": true, "dependencies": { - "d": "^1.0.1", - "es5-ext": "^0.10.53", - "es6-weak-map": "^2.0.3", - "event-emitter": "^0.3.5", + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/make-fetch-happen/node_modules/http-proxy-agent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", + "optional": true, + "dependencies": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/make-fetch-happen/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==", + "optional": true, + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/make-fetch-happen/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==", + "optional": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/make-fetch-happen/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==", + "optional": true + }, + "node_modules/make-fetch-happen/node_modules/socks-proxy-agent": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-6.2.1.tgz", + "integrity": "sha512-a6KW9G+6B3nWZ1yB8G7pJwL3ggLy1uTzKAgCb7ttblwqdz9fMGJUuTy3uFzEP48FAs9FLILlmzDlE2JJhVQaXQ==", + "optional": true, + "dependencies": { + "agent-base": "^6.0.2", + "debug": "^4.3.3", + "socks": "^2.6.2" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/matcher": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/matcher/-/matcher-3.0.0.tgz", + "integrity": "sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/md5": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/md5/-/md5-2.3.0.tgz", + "integrity": "sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==", + "dev": true, + "dependencies": { + "charenc": "0.0.2", + "crypt": "0.0.2", + "is-buffer": "~1.1.6" + } + }, + "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/memoizee": { + "version": "0.4.17", + "resolved": "https://registry.npmjs.org/memoizee/-/memoizee-0.4.17.tgz", + "integrity": "sha512-DGqD7Hjpi/1or4F/aYAspXKNm5Yili0QDAFAY4QYvpqpgiY6+1jOfqpmByzjxbWd/T9mChbCArXAbDAsTm5oXA==", + "dev": true, + "dependencies": { + "d": "^1.0.2", + "es5-ext": "^0.10.64", + "es6-weak-map": "^2.0.3", + "event-emitter": "^0.3.5", "is-promise": "^2.2.2", "lru-queue": "^0.1.0", "next-tick": "^1.1.0", "timers-ext": "^0.1.7" + }, + "engines": { + "node": ">=0.12" } }, "node_modules/merge-descriptors": { @@ -8846,6 +8829,14 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "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", @@ -8854,6 +8845,18 @@ "node": ">= 0.6" } }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dependencies": { + "braces": "^3.0.3", + "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", @@ -8946,9 +8949,12 @@ } }, "node_modules/minipass": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", - "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "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" } @@ -8965,16 +8971,21 @@ "node": ">= 8" } }, - "node_modules/minipass-collect/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "node_modules/minipass-fetch": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-1.4.1.tgz", + "integrity": "sha512-CGH1eblLq26Y15+Azk7ey4xh0J/XfJfrCox5LDJiKqI2Q2iwOLOKrlmIaODiSQS8d18jalF6y2K2ePUm0CmShw==", "optional": true, "dependencies": { - "yallist": "^4.0.0" + "minipass": "^3.1.0", + "minipass-sized": "^1.0.3", + "minizlib": "^2.0.0" }, "engines": { "node": ">=8" + }, + "optionalDependencies": { + "encoding": "^0.1.12" } }, "node_modules/minipass-flush": { @@ -8989,18 +9000,6 @@ "node": ">= 8" } }, - "node_modules/minipass-flush/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "optional": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/minipass-pipeline": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", @@ -9013,18 +9012,6 @@ "node": ">=8" } }, - "node_modules/minipass-pipeline/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "optional": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/minipass-sized": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", @@ -9037,18 +9024,6 @@ "node": ">=8" } }, - "node_modules/minipass-sized/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "optional": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/minizlib": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", @@ -9061,17 +9036,6 @@ "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": "3.0.1", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz", @@ -9143,12 +9107,12 @@ } }, "node_modules/mocha-junit-reporter/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", "dev": true, "dependencies": { - "ms": "2.1.2" + "ms": "^2.1.3" }, "engines": { "node": ">=6.0" @@ -9160,18 +9124,29 @@ } }, "node_modules/mocha-junit-reporter/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==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dev": true }, + "node_modules/mocha/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/mocha/node_modules/debug": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", - "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", "dev": true, "dependencies": { - "ms": "2.1.2" + "ms": "^2.1.3" }, "engines": { "node": ">=6.0" @@ -9182,12 +9157,6 @@ } } }, - "node_modules/mocha/node_modules/debug/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/mocha/node_modules/minimatch": { "version": "5.1.6", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", @@ -9221,10 +9190,28 @@ "url": "https://github.com/chalk/supports-color?sponsor=1" } }, + "node_modules/mocha/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/module-details-from-path": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/module-details-from-path/-/module-details-from-path-1.0.3.tgz", - "integrity": "sha512-ySViT69/76t8VhE1xXHK6Ch4NcDd26gx0MzKXLO+F7NOtnqH68d9zF94nT8ZWSxXh8ELOERsnJO/sWt1xZYw5A==" + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/module-details-from-path/-/module-details-from-path-1.0.4.tgz", + "integrity": "sha512-EGWKgxALGMgzvxYF1UyGTy0HXX/2vHLkw6+NvDKW2jypWbHpjQuj4UMcqQWXHERJhVGKikolT06G3bcKe4fi7w==" }, "node_modules/moment": { "version": "2.30.1", @@ -9280,6 +9267,7 @@ "version": "1.4.5-lts.1", "resolved": "https://registry.npmjs.org/multer/-/multer-1.4.5-lts.1.tgz", "integrity": "sha512-ywPWvcDMeH+z9gQq5qYHCCy+ethsk4goepZ45GLD63fOu0YcNecQxi64nDs3qluZB+murG3/D4dJ7+dGctcCQQ==", + "deprecated": "Multer 1.x is impacted by a number of vulnerabilities, which have been patched in 2.x. You should upgrade to the latest 2.x version.", "dependencies": { "append-field": "^1.0.0", "busboy": "^1.0.0", @@ -9367,9 +9355,9 @@ } }, "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==" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-2.0.0.tgz", + "integrity": "sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==" }, "node_modules/natural-compare": { "version": "1.4.0", @@ -9391,21 +9379,48 @@ "node": ">= 0.4.0" } }, - "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/nconf/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/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/netmask": { + "node_modules/nconf/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/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/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/netmask": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz", "integrity": "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==", @@ -9415,9 +9430,9 @@ } }, "node_modules/newman": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/newman/-/newman-6.2.0.tgz", - "integrity": "sha512-CHo/wMv+Q9B3YcIJ18pdmY9XN9X8mc2hXso8yybeclV0BVPSFz1+P5vJELWg5DB/qJgxJOh+B+k+i9tTqfzcbw==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/newman/-/newman-6.2.1.tgz", + "integrity": "sha512-Zq8Sr5GFF+OXs5yIbyglLMKMh1WNMjYVV0yZaSBZ+DIgQOIWcxT8QTfbrl/YUGrLyT4rjpu+yZ/Z+kozw79GEA==", "dev": true, "dependencies": { "@postman/tough-cookie": "4.1.3-postman.1", @@ -9432,10 +9447,10 @@ "liquid-json": "0.3.1", "lodash": "4.17.21", "mkdirp": "3.0.1", - "postman-collection": "4.5.0", + "postman-collection": "4.4.0", "postman-collection-transformer": "4.1.8", - "postman-request": "2.88.1-postman.39", - "postman-runtime": "7.41.2", + "postman-request": "2.88.1-postman.34", + "postman-runtime": "7.39.1", "pretty-ms": "7.0.1", "semver": "7.6.3", "serialised-error": "1.1.3", @@ -9475,6 +9490,12 @@ "node": ">=4.0" } }, + "node_modules/newman/node_modules/async": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz", + "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==", + "dev": true + }, "node_modules/next-tick": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", @@ -9506,9 +9527,9 @@ "dev": true }, "node_modules/node-abi": { - "version": "3.62.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.62.0.tgz", - "integrity": "sha512-CPMcGa+y33xuL1E0TcNIu4YyaZCxnnvkVaEXrsosR3FxN+fV8xvb7Mzpb7IgKler10qeMkE6+Dp8qJhpzdq35g==", + "version": "3.75.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.75.0.tgz", + "integrity": "sha512-OhYaY5sDsIka7H7AtijtI9jwGYLyl29eQn/W623DiN/MIv5sUqc4g7BIDThX+gb7di9f6xK02nkp8sdfFWZLTg==", "dependencies": { "semver": "^7.3.5" }, @@ -9517,12 +9538,9 @@ } }, "node_modules/node-addon-api": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.0.tgz", - "integrity": "sha512-mNcltoe1R8o7STTegSOHdnJNN7s5EUvhoS7ShnTHDyOSd+8H+UdWODq6qSv67PjC8Zc5JRT8+oLAMCr0SIXw7g==", - "engines": { - "node": "^16 || ^18 || >= 20" - } + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", + "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==" }, "node_modules/node-fetch-npm": { "version": "2.0.4", @@ -9546,6 +9564,132 @@ "node": ">= 6.13.0" } }, + "node_modules/node-gyp": { + "version": "8.4.1", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-8.4.1.tgz", + "integrity": "sha512-olTJRgUtAb/hOXG0E93wZDs5YiJlgbXxTwQAFHyNlRsXQnYzUaF2aGgujZbw+hR8aF4ZG/rST57bWMWD16jr9w==", + "optional": true, + "dependencies": { + "env-paths": "^2.2.0", + "glob": "^7.1.4", + "graceful-fs": "^4.2.6", + "make-fetch-happen": "^9.1.0", + "nopt": "^5.0.0", + "npmlog": "^6.0.0", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.2", + "which": "^2.0.2" + }, + "bin": { + "node-gyp": "bin/node-gyp.js" + }, + "engines": { + "node": ">= 10.12.0" + } + }, + "node_modules/node-gyp/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==", + "optional": true + }, + "node_modules/node-gyp/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "optional": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/node-gyp/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "optional": 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/node-gyp/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "optional": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/node-gyp/node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "optional": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/node-gyp/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "optional": true, + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/node-gyp/node_modules/nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "optional": true, + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/node-gyp/node_modules/tar": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", + "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", + "optional": 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/node-oauth1": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/node-oauth1/-/node-oauth1-1.3.0.tgz", @@ -9565,9 +9709,9 @@ } }, "node_modules/node-releases": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", - "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", + "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", "dev": true }, "node_modules/node-schedule": { @@ -9583,6 +9727,42 @@ "node": ">=6" } }, + "node_modules/nopt": { + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-7.2.1.tgz", + "integrity": "sha512-taM24ViiimT/XntxbPyJQzCG+p4EKOpgD3mxFwW38mGjVUrfERQOeY4EDHjdnptttfHuHQXFx+lTP08Q+mLa/w==", + "dev": true, + "dependencies": { + "abbrev": "^2.0.0" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/normalize-package-data/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/normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", @@ -9615,6 +9795,7 @@ "version": "6.0.2", "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz", "integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==", + "deprecated": "This package is no longer supported.", "optional": true, "dependencies": { "are-we-there-yet": "^3.0.0", @@ -9668,9 +9849,9 @@ } }, "node_modules/nyc/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==", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, "dependencies": { "balanced-match": "^1.0.0", @@ -9705,6 +9886,7 @@ "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, "dependencies": { "fs.realpath": "^1.0.0", @@ -9772,18 +9954,6 @@ "node": ">=8" } }, - "node_modules/nyc/node_modules/p-map": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", - "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", - "dev": true, - "dependencies": { - "aggregate-error": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/nyc/node_modules/resolve-from": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", @@ -9793,21 +9963,6 @@ "node": ">=8" } }, - "node_modules/nyc/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/nyc/node_modules/wrap-ansi": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", @@ -9873,9 +10028,9 @@ } }, "node_modules/oauth4webapi": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/oauth4webapi/-/oauth4webapi-3.5.1.tgz", - "integrity": "sha512-txg/jZQwcbaF7PMJgY7aoxc9QuCxHVFMiEkDIJ60DwDz3PbtXPQnrzo+3X4IRYGChIwWLabRBRpf1k9hO9+xrQ==", + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/oauth4webapi/-/oauth4webapi-3.5.2.tgz", + "integrity": "sha512-VYz5BaP3izIrUc1GAVzIoz4JnljiW0YAUFObMBwsqDnfHxz2sjLu3W7/8vE8Ms9IbMewN9+1kcvhY3tMscAeGQ==", "optional": true, "funding": { "url": "https://github.com/sponsors/panva" @@ -9899,9 +10054,12 @@ } }, "node_modules/object-inspect": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", - "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -9916,14 +10074,16 @@ } }, "node_modules/object.assign": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", - "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", + "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", "dev": true, "dependencies": { - "call-bind": "^1.0.5", + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", "define-properties": "^1.2.1", - "has-symbols": "^1.0.3", + "es-object-atoms": "^1.0.0", + "has-symbols": "^1.1.0", "object-keys": "^1.1.1" }, "engines": { @@ -9986,13 +10146,13 @@ } }, "node_modules/openid-client": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/openid-client/-/openid-client-6.5.0.tgz", - "integrity": "sha512-fAfYaTnOYE2kQCqEJGX9KDObW2aw7IQy4jWpU/+3D3WoCFLbix5Hg6qIPQ6Js9r7f8jDUmsnnguRNCSw4wU/IQ==", + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/openid-client/-/openid-client-6.5.1.tgz", + "integrity": "sha512-DNq7s+Tm9wfMUTltl+kUJzwi+bsbeiZycDm1gJQbX6MTHwo1+Q0I3F+ccsxi1T3mYMaHATCSnWDridkZ3hnu1g==", "optional": true, "dependencies": { - "jose": "^6.0.10", - "oauth4webapi": "^3.5.1" + "jose": "^6.0.11", + "oauth4webapi": "^3.5.2" }, "funding": { "url": "https://github.com/sponsors/panva" @@ -10038,6 +10198,23 @@ "node": ">=0.10.0" } }, + "node_modules/own-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz", + "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.6", + "object-keys": "^1.1.1", + "safe-push-apply": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/p-finally": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", @@ -10077,18 +10254,15 @@ } }, "node_modules/p-map": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", - "optional": true, + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", + "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", + "dev": true, "dependencies": { "aggregate-error": "^3.0.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8" } }, "node_modules/p-try": { @@ -10101,43 +10275,31 @@ } }, "node_modules/pac-proxy-agent": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-7.0.1.tgz", - "integrity": "sha512-ASV8yU4LLKBAjqIPMbrgtaKIvxQri/yh2OpI+S6hVa9JRkUI3Y3NPFbfngDtY7oFtSMD3w31Xns89mDa3Feo5A==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-7.2.0.tgz", + "integrity": "sha512-TEB8ESquiLMc0lV8vcd5Ql/JAKAoyzHFXaStwjkzpOpC5Yv+pIzLfHvjTSdf3vpa2bMiUQrg9i6276yn8666aA==", "optional": true, "dependencies": { "@tootallnate/quickjs-emscripten": "^0.23.0", - "agent-base": "^7.0.2", + "agent-base": "^7.1.2", "debug": "^4.3.4", "get-uri": "^6.0.1", "http-proxy-agent": "^7.0.0", - "https-proxy-agent": "^7.0.2", - "pac-resolver": "^7.0.0", - "socks-proxy-agent": "^8.0.2" + "https-proxy-agent": "^7.0.6", + "pac-resolver": "^7.0.1", + "socks-proxy-agent": "^8.0.5" }, "engines": { "node": ">= 14" } }, - "node_modules/pac-proxy-agent/node_modules/agent-base": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", - "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", + "node_modules/pac-proxy-agent/node_modules/debug": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", "optional": true, "dependencies": { - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/pac-proxy-agent/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "optional": true, - "dependencies": { - "ms": "2.1.2" + "ms": "^2.1.3" }, "engines": { "node": ">=6.0" @@ -10148,36 +10310,10 @@ } } }, - "node_modules/pac-proxy-agent/node_modules/http-proxy-agent": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", - "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", - "optional": true, - "dependencies": { - "agent-base": "^7.1.0", - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/pac-proxy-agent/node_modules/https-proxy-agent": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.4.tgz", - "integrity": "sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg==", - "optional": true, - "dependencies": { - "agent-base": "^7.0.2", - "debug": "4" - }, - "engines": { - "node": ">= 14" - } - }, "node_modules/pac-proxy-agent/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==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "optional": true }, "node_modules/pac-resolver": { @@ -10208,6 +10344,12 @@ "node": ">=8" } }, + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", + "dev": true + }, "node_modules/parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -10314,12 +10456,18 @@ } }, "node_modules/path-scurry/node_modules/lru-cache": { - "version": "10.2.2", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.2.tgz", - "integrity": "sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==", + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true + }, + "node_modules/path-scurry/node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", "dev": true, "engines": { - "node": "14 || >=16.14" + "node": ">=16 || 14 >=14.17" } }, "node_modules/path-to-regexp": { @@ -10327,6 +10475,27 @@ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==" }, + "node_modules/path-type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", + "integrity": "sha512-dUnb5dXUf+kzhC/W/F4e5/SkluXIFf5VUHolW1Eg1irn1hGWjPGdsRcvYJ1nD6lhk8Ir7VM0bHJKsYTx8Jx9OQ==", + "dev": true, + "dependencies": { + "pify": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/path-type/node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/pathval": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.0.tgz", @@ -10375,15 +10544,15 @@ } }, "node_modules/pg-cloudflare": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/pg-cloudflare/-/pg-cloudflare-1.1.1.tgz", - "integrity": "sha512-xWPagP/4B6BgFO+EKz3JONXv3YDgvkbVrGw2mTo3D6tVDQRh1e7cqVGvyR3BE+eQgAvx1XhW/iEASj4/jCWl3Q==", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/pg-cloudflare/-/pg-cloudflare-1.2.5.tgz", + "integrity": "sha512-OOX22Vt0vOSRrdoUPKJ8Wi2OpE/o/h9T8X1s4qSkCedbNah9ei2W2765be8iMVxQUsvgT7zIAT2eIa9fs5+vtg==", "optional": true }, "node_modules/pg-connection-string": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.6.4.tgz", - "integrity": "sha512-v+Z7W/0EO707aNMaAEfiGnGL9sxxumwLl2fJvCQtMn9Fxsg+lPpPkdcyBSv/KFgpGdYkMfn+EI1Or2EHjpgLCA==" + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.9.0.tgz", + "integrity": "sha512-P2DEBKuvh5RClafLngkAuGe9OUlFV7ebu8w1kmaaOgPcpJd1RIFh7otETfI6hAR8YupOLFTY7nuvvIn7PLciUQ==" }, "node_modules/pg-int8": { "version": "1.0.1", @@ -10394,17 +10563,17 @@ } }, "node_modules/pg-pool": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.6.2.tgz", - "integrity": "sha512-Htjbg8BlwXqSBQ9V8Vjtc+vzf/6fVUuak/3/XXKA9oxZprwW3IMDQTGHP+KDmVL7rtd+R1QjbnCFPuTHm3G4hg==", + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.10.0.tgz", + "integrity": "sha512-DzZ26On4sQ0KmqnO34muPcmKbhrjmyiO4lCCR0VwEd7MjmiKf5NTg/6+apUEu0NF7ESa37CGzFxH513CoUmWnA==", "peerDependencies": { "pg": ">=8.0" } }, "node_modules/pg-protocol": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.6.1.tgz", - "integrity": "sha512-jPIlvgoD63hrEuihvIg+tJhoGjUsLPn6poJY9N5CnlPd91c2T18T/9zBtLxZSb1EhYxBRoZJtzScCaWlYLtktg==" + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.10.0.tgz", + "integrity": "sha512-IpdytjudNuLv8nhlHs/UrVBhU0e78J0oIS/0AVdTbWxSOkFUVdsHC/NrorO6nXsQNDTT1kzDSOMJubBQviX18Q==" }, "node_modules/pg-types": { "version": "2.2.0", @@ -10430,16 +10599,15 @@ } }, "node_modules/picocolors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", - "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", "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" }, @@ -10510,9 +10678,9 @@ } }, "node_modules/pino-abstract-transport/node_modules/readable-stream": { - "version": "4.5.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.5.2.tgz", - "integrity": "sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==", + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz", + "integrity": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==", "dependencies": { "abort-controller": "^3.0.0", "buffer": "^6.0.3", @@ -10734,9 +10902,9 @@ } }, "node_modules/possible-typed-array-names": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", - "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", + "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", "dev": true, "engines": { "node": ">= 0.4" @@ -10778,9 +10946,9 @@ } }, "node_modules/postman-collection": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/postman-collection/-/postman-collection-4.5.0.tgz", - "integrity": "sha512-152JSW9pdbaoJihwjc7Q8lc3nPg/PC9lPTHdMk7SHnHhu/GBJB7b2yb9zG7Qua578+3PxkQ/HYBuXpDSvsf7GQ==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/postman-collection/-/postman-collection-4.4.0.tgz", + "integrity": "sha512-2BGDFcUwlK08CqZFUlIC8kwRJueVzPjZnnokWPtJCd9f2J06HBQpGL7t2P1Ud1NEsK9NHq9wdipUhWLOPj5s/Q==", "dev": true, "dependencies": { "@faker-js/faker": "5.5.3", @@ -10792,7 +10960,7 @@ "mime-format": "2.0.1", "mime-types": "2.1.35", "postman-url-encoder": "3.0.5", - "semver": "7.6.3", + "semver": "7.5.4", "uuid": "8.3.2" }, "engines": { @@ -10866,6 +11034,33 @@ "node": ">=0.10.0" } }, + "node_modules/postman-collection/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/postman-collection/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/postman-collection/node_modules/uuid": { "version": "8.3.2", "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", @@ -10876,14 +11071,14 @@ } }, "node_modules/postman-request": { - "version": "2.88.1-postman.39", - "resolved": "https://registry.npmjs.org/postman-request/-/postman-request-2.88.1-postman.39.tgz", - "integrity": "sha512-rsncxxDlbn1YpygXSgJqbJzIjGlHFcZjbYDzeBPTQHMDfLuSTzZz735JHV8i1+lOROuJ7MjNap4eaSD3UijHzQ==", + "version": "2.88.1-postman.34", + "resolved": "https://registry.npmjs.org/postman-request/-/postman-request-2.88.1-postman.34.tgz", + "integrity": "sha512-GkolJ4cIzgamcwHRDkeZc/taFWO1u2HuGNML47K9ZAsFH2LdEkS5Yy8QanpzhjydzV3WWthl9v60J8E7SjKodQ==", "dev": true, "dependencies": { "@postman/form-data": "~3.1.1", "@postman/tough-cookie": "~4.1.3-postman.1", - "@postman/tunnel-agent": "^0.6.4", + "@postman/tunnel-agent": "^0.6.3", "aws-sign2": "~0.7.0", "aws4": "^1.12.0", "brotli": "^1.3.3", @@ -10905,7 +11100,7 @@ "uuid": "^8.3.2" }, "engines": { - "node": ">= 16" + "node": ">= 6" } }, "node_modules/postman-request/node_modules/qs": { @@ -10927,39 +11122,51 @@ } }, "node_modules/postman-runtime": { - "version": "7.41.2", - "resolved": "https://registry.npmjs.org/postman-runtime/-/postman-runtime-7.41.2.tgz", - "integrity": "sha512-efKnii+yBfqZMRjV5zFh4VXogLeZB58HmLkgT+/sZcjglth23wzp+QRlkl4nbgcL2SZX6e5cLI2/aG2Of3wMyg==", + "version": "7.39.1", + "resolved": "https://registry.npmjs.org/postman-runtime/-/postman-runtime-7.39.1.tgz", + "integrity": "sha512-IRNrBE0l1K3ZqQhQVYgF6MPuqOB9HqYncal+a7RpSS+sysKLhJMkC9SfUn1HVuOpokdPkK92ykvPzj8kCOLYAg==", "dev": true, "dependencies": { "@postman/tough-cookie": "4.1.3-postman.1", "async": "3.2.5", - "aws4": "1.13.1", + "aws4": "1.12.0", "handlebars": "4.7.8", "httpntlm": "1.8.13", - "jose": "5.6.3", + "jose": "4.14.4", "js-sha512": "0.9.0", "lodash": "4.17.21", "mime-types": "2.1.35", "node-forge": "1.3.1", "node-oauth1": "1.3.0", "performance-now": "2.1.0", - "postman-collection": "4.5.0", - "postman-request": "2.88.1-postman.39", - "postman-sandbox": "5.1.1", + "postman-collection": "4.4.0", + "postman-request": "2.88.1-postman.34", + "postman-sandbox": "4.7.1", "postman-url-encoder": "3.0.5", "serialised-error": "1.1.3", "strip-json-comments": "3.1.1", "uuid": "8.3.2" }, "engines": { - "node": ">=16" + "node": ">=12" } }, + "node_modules/postman-runtime/node_modules/async": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz", + "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==", + "dev": true + }, + "node_modules/postman-runtime/node_modules/aws4": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz", + "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==", + "dev": true + }, "node_modules/postman-runtime/node_modules/jose": { - "version": "5.6.3", - "resolved": "https://registry.npmjs.org/jose/-/jose-5.6.3.tgz", - "integrity": "sha512-1Jh//hEEwMhNYPDDLwXHa2ePWgWiFNNUadVmguAAw2IJ6sj9mNxV5tGXJNqlMkJAybF6Lgw1mISDxTePP/187g==", + "version": "4.14.4", + "resolved": "https://registry.npmjs.org/jose/-/jose-4.14.4.tgz", + "integrity": "sha512-j8GhLiKmUAh+dsFXlX1aJCbt5KMibuKb+d7j1JaOJG6s2UjX1PQlW+OKB/sD4a/5ZYF4RcmYmLSndOoU3Lt/3g==", "dev": true, "funding": { "url": "https://github.com/sponsors/panva" @@ -10975,18 +11182,18 @@ } }, "node_modules/postman-sandbox": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postman-sandbox/-/postman-sandbox-5.1.1.tgz", - "integrity": "sha512-RfCTMwz3OaqhYYgtoe3VlHGiQl9hEmJ9sPh/XOlNcuvd/km6ARSFkKXFvQaLFsTHyXcHaqpInKaQSJi23uTynA==", + "version": "4.7.1", + "resolved": "https://registry.npmjs.org/postman-sandbox/-/postman-sandbox-4.7.1.tgz", + "integrity": "sha512-H2wYSLK0mB588IaxoLrLoPbpmxsIcwFtgaK2c8gAsAQ+TgYFePwb4qdeVcYDMqmwrLd77/ViXkjasP/sBMz1sQ==", "dev": true, "dependencies": { "lodash": "4.17.21", - "postman-collection": "4.5.0", + "postman-collection": "4.4.0", "teleport-javascript": "1.0.0", - "uvm": "3.0.0" + "uvm": "2.1.1" }, "engines": { - "node": ">=16" + "node": ">=10" } }, "node_modules/postman-url-encoder": { @@ -11002,16 +11209,16 @@ } }, "node_modules/prebuild-install": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.2.tgz", - "integrity": "sha512-UnNke3IQb6sgarcZIDU3gbMeTp/9SSU1DAIkil7PrqG1vZlBtY5msYccSKSHDqa3hNg436IXK+SNImReuA1wEQ==", + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.3.tgz", + "integrity": "sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==", "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", + "napi-build-utils": "^2.0.0", "node-abi": "^3.3.0", "pump": "^3.0.0", "rc": "^1.2.7", @@ -11064,9 +11271,9 @@ "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" }, "node_modules/process-on-spawn": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/process-on-spawn/-/process-on-spawn-1.0.0.tgz", - "integrity": "sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/process-on-spawn/-/process-on-spawn-1.1.0.tgz", + "integrity": "sha512-JOnOPQ/8TZgjs1JIH/m9ni7FfimjNa/PRx7y/Wb5qdItsnhO0jE4AT7fC0HjC28DUQWDr50dwSYZLdRMlqDq3Q==", "dev": true, "dependencies": { "fromentries": "^1.2.0" @@ -11140,9 +11347,9 @@ "dev": true }, "node_modules/protobufjs": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.5.0.tgz", - "integrity": "sha512-Z2E/kOY1QjoMlCytmexzYfDm/w5fKAiRwpSzGtdnXW1zC88Z2yXazHHrOtwCzn+7wSxyE8PYM4rvVcMphF9sOA==", + "version": "7.5.3", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.5.3.tgz", + "integrity": "sha512-sildjKwVqOI2kmFDiXQ6aEB0fjYTafpEvIBs8tOR8qI4spuL9OPROLVu2qZqi/xgCfsHIwVqlaF8JBjWFHnKbw==", "hasInstallScript": true, "dependencies": { "@protobufjs/aspromise": "^1.1.2", @@ -11175,43 +11382,31 @@ } }, "node_modules/proxy-agent": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.4.0.tgz", - "integrity": "sha512-u0piLU+nCOHMgGjRbimiXmA9kM/L9EHh3zL81xCdp7m+Y2pHIsnmbdDoEDoAz5geaonNR6q6+yOPQs6n4T6sBQ==", + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.5.0.tgz", + "integrity": "sha512-TmatMXdr2KlRiA2CyDu8GqR8EjahTG3aY3nXjdzFyoZbmB8hrBsTyMezhULIXKnC0jpfjlmiZ3+EaCzoInSu/A==", "optional": true, "dependencies": { - "agent-base": "^7.0.2", + "agent-base": "^7.1.2", "debug": "^4.3.4", "http-proxy-agent": "^7.0.1", - "https-proxy-agent": "^7.0.3", + "https-proxy-agent": "^7.0.6", "lru-cache": "^7.14.1", - "pac-proxy-agent": "^7.0.1", + "pac-proxy-agent": "^7.1.0", "proxy-from-env": "^1.1.0", - "socks-proxy-agent": "^8.0.2" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/proxy-agent/node_modules/agent-base": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", - "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", - "optional": true, - "dependencies": { - "debug": "^4.3.4" + "socks-proxy-agent": "^8.0.5" }, "engines": { "node": ">= 14" } }, "node_modules/proxy-agent/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", "optional": true, "dependencies": { - "ms": "2.1.2" + "ms": "^2.1.3" }, "engines": { "node": ">=6.0" @@ -11222,32 +11417,6 @@ } } }, - "node_modules/proxy-agent/node_modules/http-proxy-agent": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", - "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", - "optional": true, - "dependencies": { - "agent-base": "^7.1.0", - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/proxy-agent/node_modules/https-proxy-agent": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.4.tgz", - "integrity": "sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg==", - "optional": true, - "dependencies": { - "agent-base": "^7.0.2", - "debug": "4" - }, - "engines": { - "node": ">= 14" - } - }, "node_modules/proxy-agent/node_modules/lru-cache": { "version": "7.18.3", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", @@ -11258,9 +11427,9 @@ } }, "node_modules/proxy-agent/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==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "optional": true }, "node_modules/proxy-from-env": { @@ -11269,15 +11438,21 @@ "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" }, "node_modules/psl": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", - "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", - "dev": true + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.15.0.tgz", + "integrity": "sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==", + "dev": true, + "dependencies": { + "punycode": "^2.3.1" + }, + "funding": { + "url": "https://github.com/sponsors/lupomontero" + } }, "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==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.2.tgz", + "integrity": "sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==", "dependencies": { "end-of-stream": "^1.1.0", "once": "^1.3.1" @@ -11287,7 +11462,6 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "dev": true, "engines": { "node": ">=6" } @@ -11316,7 +11490,6 @@ "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", @@ -11503,12 +11676,6 @@ "node": ">=4" } }, - "node_modules/read-pkg/node_modules/hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true - }, "node_modules/read-pkg/node_modules/load-json-file": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", @@ -11524,18 +11691,6 @@ "node": ">=4" } }, - "node_modules/read-pkg/node_modules/normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, - "dependencies": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, "node_modules/read-pkg/node_modules/parse-json": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", @@ -11548,18 +11703,6 @@ "node": ">=0.10.0" } }, - "node_modules/read-pkg/node_modules/path-type": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", - "integrity": "sha512-dUnb5dXUf+kzhC/W/F4e5/SkluXIFf5VUHolW1Eg1irn1hGWjPGdsRcvYJ1nD6lhk8Ir7VM0bHJKsYTx8Jx9OQ==", - "dev": true, - "dependencies": { - "pify": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/read-pkg/node_modules/pify": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", @@ -11569,15 +11712,6 @@ "node": ">=0.10.0" } }, - "node_modules/read-pkg/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/read-pkg/node_modules/strip-bom": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", @@ -11618,16 +11752,40 @@ "node": ">= 12.13.0" } }, + "node_modules/reflect.getprototypeof": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", + "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.7", + "get-proto": "^1.0.1", + "which-builtin-type": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/regexp.prototype.flags": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", - "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", + "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", "dev": true, "dependencies": { - "call-bind": "^1.0.6", + "call-bind": "^1.0.8", "define-properties": "^1.2.1", "es-errors": "^1.3.0", - "set-function-name": "^2.0.1" + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "set-function-name": "^2.0.2" }, "engines": { "node": ">= 0.4" @@ -11669,6 +11827,14 @@ "node": ">=0.10.0" } }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/require-in-the-middle": { "version": "7.5.2", "resolved": "https://registry.npmjs.org/require-in-the-middle/-/require-in-the-middle-7.5.2.tgz", @@ -11683,9 +11849,9 @@ } }, "node_modules/require-in-the-middle/node_modules/debug": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", "dependencies": { "ms": "^2.1.3" }, @@ -11738,17 +11904,20 @@ "dev": true }, "node_modules/resolve": { - "version": "1.22.8", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", - "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "version": "1.22.10", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", + "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", "dependencies": { - "is-core-module": "^2.13.0", + "is-core-module": "^2.16.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" }, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -11789,30 +11958,98 @@ "resolved": "https://registry.npmjs.org/retry-as-promised/-/retry-as-promised-7.0.4.tgz", "integrity": "sha512-XgmCoxKWkDofwH8WddD0w85ZfqYz+ZHlr5yo+3YUCfycWawU56T5ckWXsScsj5B8tqUcIG67DxXByo3VUgiAdA==" }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, "node_modules/rfc4648": { "version": "1.5.4", "resolved": "https://registry.npmjs.org/rfc4648/-/rfc4648-1.5.4.tgz", "integrity": "sha512-rRg/6Lb+IGfJqO05HZkN50UtY7K/JhxJag1kP23+zyMfrvoB0B7RWv06MbOzoc79RgCdNTiUaNsTT1AJZ7Z+cg==" }, - "node_modules/roarr": { - "version": "2.15.4", - "resolved": "https://registry.npmjs.org/roarr/-/roarr-2.15.4.tgz", - "integrity": "sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A==", - "dev": true, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "devOptional": true, "dependencies": { - "boolean": "^3.0.1", - "detect-node": "^2.0.4", - "globalthis": "^1.0.1", - "json-stringify-safe": "^5.0.1", - "semver-compare": "^1.0.0", - "sprintf-js": "^1.1.2" + "glob": "^7.1.3" }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/run-async": { - "version": "2.4.1", + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "devOptional": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/rimraf/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "devOptional": 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/rimraf/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "devOptional": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/roarr": { + "version": "2.15.4", + "resolved": "https://registry.npmjs.org/roarr/-/roarr-2.15.4.tgz", + "integrity": "sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A==", + "dev": true, + "dependencies": { + "boolean": "^3.0.1", + "detect-node": "^2.0.4", + "globalthis": "^1.0.1", + "json-stringify-safe": "^5.0.1", + "semver-compare": "^1.0.0", + "sprintf-js": "^1.1.2" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/run-async": { + "version": "2.4.1", "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", "dev": true, @@ -11824,7 +12061,6 @@ "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", @@ -11856,14 +12092,15 @@ } }, "node_modules/safe-array-concat": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz", - "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz", + "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==", "dev": true, "dependencies": { - "call-bind": "^1.0.7", - "get-intrinsic": "^1.2.4", - "has-symbols": "^1.0.3", + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "has-symbols": "^1.1.0", "isarray": "^2.0.5" }, "engines": { @@ -11898,15 +12135,37 @@ } ] }, + "node_modules/safe-push-apply": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", + "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-push-apply/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + }, "node_modules/safe-regex-test": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", - "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", + "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", "dev": true, "dependencies": { - "call-bind": "^1.0.6", + "call-bound": "^1.0.2", "es-errors": "^1.3.0", - "is-regex": "^1.1.4" + "is-regex": "^1.2.1" }, "engines": { "node": ">= 0.4" @@ -11916,9 +12175,9 @@ } }, "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==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz", + "integrity": "sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==", "engines": { "node": ">=10" } @@ -12080,19 +12339,15 @@ "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", "dev": true }, - "node_modules/sequelize-cli/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==", + "node_modules/sequelize-cli/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": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=10" + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" } }, "node_modules/sequelize-cli/node_modules/umzug": { @@ -12107,13 +12362,22 @@ "node": ">=6.0.0" } }, - "node_modules/sequelize-cli/node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "node_modules/sequelize-cli/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.0.0" + "node": ">=10" } }, "node_modules/sequelize-pool": { @@ -12125,11 +12389,11 @@ } }, "node_modules/sequelize/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", "dependencies": { - "ms": "2.1.2" + "ms": "^2.1.3" }, "engines": { "node": ">=6.0" @@ -12141,9 +12405,9 @@ } }, "node_modules/sequelize/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==" + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" }, "node_modules/sequelize/node_modules/uuid": { "version": "8.3.2", @@ -12234,6 +12498,7 @@ "version": "1.2.2", "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dev": true, "dependencies": { "define-data-property": "^1.1.4", "es-errors": "^1.3.0", @@ -12261,6 +12526,20 @@ "node": ">= 0.4" } }, + "node_modules/set-proto": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz", + "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", + "dev": true, + "dependencies": { + "dunder-proto": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", @@ -12298,14 +12577,65 @@ "integrity": "sha512-sQTKC1Re/rM6XyFM6fIAGHRPVGvyXfgzIDvzoq608vM+jeyVD0Tu1E6Np0Kc2zAIFWIj963V2800iF/9LPieQw==" }, "node_modules/side-channel": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", - "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", "dependencies": { - "call-bind": "^1.0.7", "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4", - "object-inspect": "^1.13.1" + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" }, "engines": { "node": ">= 0.4" @@ -12422,9 +12752,9 @@ } }, "node_modules/snyk": { - "version": "1.1291.0", - "resolved": "https://registry.npmjs.org/snyk/-/snyk-1.1291.0.tgz", - "integrity": "sha512-CNm2VGBLMACNfmPcM1ByF9tpGlJUL7AlPFpwqqVKlLNnFIQk6o7EjmYJtQZzV6xbBy3+h2jWVh/OwfhFV/BeFg==", + "version": "1.1297.1", + "resolved": "https://registry.npmjs.org/snyk/-/snyk-1.1297.1.tgz", + "integrity": "sha512-l4bQPu90DvIKHs5h4aCo6ie4WwFq5pEB9IrLHONJzRwCY7ukT/z7rj0abYxR+aot/tnsQXcM/LgGIzIyy+3DVw==", "dev": true, "hasInstallScript": true, "dependencies": { @@ -12439,9 +12769,9 @@ } }, "node_modules/socks": { - "version": "2.8.3", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.3.tgz", - "integrity": "sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==", + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.5.tgz", + "integrity": "sha512-iF+tNDQla22geJdTyJB1wM/qrX9DMRwWrciEPwWLPRWAUEM8sQiyxgckLxWT1f7+9VabJS0jTGGr4QgBuvi6Ww==", "optional": true, "dependencies": { "ip-address": "^9.0.5", @@ -12466,19 +12796,10 @@ "node": ">= 14" } }, - "node_modules/socks-proxy-agent/node_modules/agent-base": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz", - "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==", - "optional": true, - "engines": { - "node": ">= 14" - } - }, "node_modules/socks-proxy-agent/node_modules/debug": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", "optional": true, "dependencies": { "ms": "^2.1.3" @@ -12499,9 +12820,9 @@ "optional": true }, "node_modules/sonic-boom": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-4.0.1.tgz", - "integrity": "sha512-hTSD/6JMLyT4r9zeof6UtuBDpjJ9sO08/nmS5djaA9eozT9oOlNdpXSnzcgj4FTqpk3nkLrs61l4gip9r1HCrQ==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-4.2.0.tgz", + "integrity": "sha512-INb7TM37/mAcsGmc9hyyI6+QR3rR1zVRu36B0NeGXKnOOLiZOfER5SA+N7X7k3yUYRzLWafduTDvJAfDswwEww==", "dependencies": { "atomic-sleep": "^1.0.0" } @@ -12512,486 +12833,133 @@ "integrity": "sha512-2sqgzeFlid6N4Z2fUQ1cvFmTOLRi/sEDzSQ0OKYchqgoPmQBVyM3959qYx3fpS6Esef80KjmpgPeEr028dP3OA==" }, "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==", - "devOptional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/spawn-wrap": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-2.0.0.tgz", - "integrity": "sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==", - "dev": true, - "dependencies": { - "foreground-child": "^2.0.0", - "is-windows": "^1.0.2", - "make-dir": "^3.0.0", - "rimraf": "^3.0.0", - "signal-exit": "^3.0.2", - "which": "^2.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/spawn-wrap/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/spawn-wrap/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/spawn-wrap/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/spawn-wrap/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/spdx-correct": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", - "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", - "dev": true, - "dependencies": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-exceptions": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", - "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", - "dev": true - }, - "node_modules/spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "dev": true, - "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-license-ids": { - "version": "3.0.17", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.17.tgz", - "integrity": "sha512-sh8PWc/ftMqAAdFiBu6Fy6JUOYjqDJBJvIhpfDMyHrr0Rbp5liZqd4TjtQ/RgfLjKFZb+LMx5hpml5qOWy0qvg==", - "dev": true - }, - "node_modules/split2": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", - "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", - "engines": { - "node": ">= 10.x" - } - }, - "node_modules/sprintf-js": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", - "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", - "devOptional": true - }, - "node_modules/sqlite3": { - "version": "5.1.7", - "resolved": "https://registry.npmjs.org/sqlite3/-/sqlite3-5.1.7.tgz", - "integrity": "sha512-GGIyOiFaG+TUra3JIfkI/zGP8yZYLPQ0pl1bH+ODjiX57sPhrLU5sQJn1y9bDKZUFYkX1crlrPfSYt0BKKdkog==", - "hasInstallScript": true, - "dependencies": { - "bindings": "^1.5.0", - "node-addon-api": "^7.0.0", - "prebuild-install": "^7.1.1", - "tar": "^6.1.11" - }, - "optionalDependencies": { - "node-gyp": "8.x" - }, - "peerDependencies": { - "node-gyp": "8.x" - }, - "peerDependenciesMeta": { - "node-gyp": { - "optional": true - } - } - }, - "node_modules/sqlite3/node_modules/@npmcli/fs": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-1.1.1.tgz", - "integrity": "sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ==", - "optional": true, - "dependencies": { - "@gar/promisify": "^1.0.1", - "semver": "^7.3.5" - } - }, - "node_modules/sqlite3/node_modules/@npmcli/move-file": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.1.2.tgz", - "integrity": "sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==", - "deprecated": "This functionality has been moved to @npmcli/fs", - "optional": true, - "dependencies": { - "mkdirp": "^1.0.4", - "rimraf": "^3.0.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/sqlite3/node_modules/@tootallnate/once": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", - "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", - "optional": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/sqlite3/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==", - "optional": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/sqlite3/node_modules/cacache": { - "version": "15.3.0", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.3.0.tgz", - "integrity": "sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==", - "optional": true, - "dependencies": { - "@npmcli/fs": "^1.0.0", - "@npmcli/move-file": "^1.0.1", - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "glob": "^7.1.4", - "infer-owner": "^1.0.4", - "lru-cache": "^6.0.0", - "minipass": "^3.1.1", - "minipass-collect": "^1.0.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.2", - "mkdirp": "^1.0.3", - "p-map": "^4.0.0", - "promise-inflight": "^1.0.1", - "rimraf": "^3.0.2", - "ssri": "^8.0.1", - "tar": "^6.0.2", - "unique-filename": "^1.1.1" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/sqlite3/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "optional": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/sqlite3/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==", - "optional": true, - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/sqlite3/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "optional": 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/sqlite3/node_modules/http-proxy-agent": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", - "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", - "optional": true, - "dependencies": { - "@tootallnate/once": "1", - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/sqlite3/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==", - "optional": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/sqlite3/node_modules/make-fetch-happen": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-9.1.0.tgz", - "integrity": "sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg==", - "optional": true, - "dependencies": { - "agentkeepalive": "^4.1.3", - "cacache": "^15.2.0", - "http-cache-semantics": "^4.1.0", - "http-proxy-agent": "^4.0.1", - "https-proxy-agent": "^5.0.0", - "is-lambda": "^1.0.1", - "lru-cache": "^6.0.0", - "minipass": "^3.1.3", - "minipass-collect": "^1.0.2", - "minipass-fetch": "^1.3.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.2", - "promise-retry": "^2.0.1", - "socks-proxy-agent": "^6.0.0", - "ssri": "^8.0.0" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/sqlite3/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "optional": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "devOptional": true, "engines": { - "node": "*" + "node": ">=0.10.0" } }, - "node_modules/sqlite3/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "optional": true, + "node_modules/spawn-wrap": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-2.0.0.tgz", + "integrity": "sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==", + "dev": true, "dependencies": { - "yallist": "^4.0.0" + "foreground-child": "^2.0.0", + "is-windows": "^1.0.2", + "make-dir": "^3.0.0", + "rimraf": "^3.0.0", + "signal-exit": "^3.0.2", + "which": "^2.0.1" }, "engines": { "node": ">=8" } }, - "node_modules/sqlite3/node_modules/minipass-fetch": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-1.4.1.tgz", - "integrity": "sha512-CGH1eblLq26Y15+Azk7ey4xh0J/XfJfrCox5LDJiKqI2Q2iwOLOKrlmIaODiSQS8d18jalF6y2K2ePUm0CmShw==", - "optional": true, + "node_modules/spdx-correct": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", + "dev": true, "dependencies": { - "minipass": "^3.1.0", - "minipass-sized": "^1.0.3", - "minizlib": "^2.0.0" - }, - "engines": { - "node": ">=8" - }, - "optionalDependencies": { - "encoding": "^0.1.12" + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" } }, - "node_modules/sqlite3/node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "optional": true, - "bin": { - "mkdirp": "bin/cmd.js" - }, + "node_modules/spdx-exceptions": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", + "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", + "dev": true + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.21", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.21.tgz", + "integrity": "sha512-Bvg/8F5XephndSK3JffaRqdT+gyhfqIPwDHpX80tJrF8QQRYMo8sNMeaZ2Dp5+jhwKnUmIOyFFQfHRkjJm5nXg==", + "dev": true + }, + "node_modules/split2": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", + "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", "engines": { - "node": ">=10" + "node": ">= 10.x" } }, - "node_modules/sqlite3/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==", - "optional": true + "node_modules/sprintf-js": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", + "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", + "devOptional": true }, - "node_modules/sqlite3/node_modules/node-gyp": { - "version": "8.4.1", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-8.4.1.tgz", - "integrity": "sha512-olTJRgUtAb/hOXG0E93wZDs5YiJlgbXxTwQAFHyNlRsXQnYzUaF2aGgujZbw+hR8aF4ZG/rST57bWMWD16jr9w==", - "optional": true, + "node_modules/sqlite3": { + "version": "5.1.7", + "resolved": "https://registry.npmjs.org/sqlite3/-/sqlite3-5.1.7.tgz", + "integrity": "sha512-GGIyOiFaG+TUra3JIfkI/zGP8yZYLPQ0pl1bH+ODjiX57sPhrLU5sQJn1y9bDKZUFYkX1crlrPfSYt0BKKdkog==", + "hasInstallScript": true, "dependencies": { - "env-paths": "^2.2.0", - "glob": "^7.1.4", - "graceful-fs": "^4.2.6", - "make-fetch-happen": "^9.1.0", - "nopt": "^5.0.0", - "npmlog": "^6.0.0", - "rimraf": "^3.0.2", - "semver": "^7.3.5", - "tar": "^6.1.2", - "which": "^2.0.2" + "bindings": "^1.5.0", + "node-addon-api": "^7.0.0", + "prebuild-install": "^7.1.1", + "tar": "^6.1.11" }, - "bin": { - "node-gyp": "bin/node-gyp.js" + "optionalDependencies": { + "node-gyp": "8.x" }, - "engines": { - "node": ">= 10.12.0" + "peerDependencies": { + "node-gyp": "8.x" + }, + "peerDependenciesMeta": { + "node-gyp": { + "optional": true + } } }, - "node_modules/sqlite3/node_modules/nopt": { + "node_modules/sqlite3/node_modules/minipass": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", - "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", - "optional": true, - "dependencies": { - "abbrev": "1" - }, - "bin": { - "nopt": "bin/nopt.js" - }, + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", "engines": { - "node": ">=6" + "node": ">=8" } }, - "node_modules/sqlite3/node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "optional": true, - "dependencies": { - "glob": "^7.1.3" - }, + "node_modules/sqlite3/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/sqlite3/node_modules/socks-proxy-agent": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-6.2.1.tgz", - "integrity": "sha512-a6KW9G+6B3nWZ1yB8G7pJwL3ggLy1uTzKAgCb7ttblwqdz9fMGJUuTy3uFzEP48FAs9FLILlmzDlE2JJhVQaXQ==", - "optional": true, - "dependencies": { - "agent-base": "^6.0.2", - "debug": "^4.3.3", - "socks": "^2.6.2" + "mkdirp": "bin/cmd.js" }, "engines": { - "node": ">= 10" + "node": ">=10" } }, - "node_modules/sqlite3/node_modules/ssri": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz", - "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==", - "optional": true, + "node_modules/sqlite3/node_modules/tar": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", + "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", "dependencies": { - "minipass": "^3.1.1" + "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": ">= 8" - } - }, - "node_modules/sqlite3/node_modules/unique-filename": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", - "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", - "optional": true, - "dependencies": { - "unique-slug": "^2.0.0" - } - }, - "node_modules/sqlite3/node_modules/unique-slug": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", - "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", - "optional": true, - "dependencies": { - "imurmurhash": "^0.1.4" + "node": ">=10" } }, "node_modules/sqlstring": { @@ -13033,6 +13001,18 @@ "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==", "dev": true }, + "node_modules/ssri": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz", + "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==", + "optional": true, + "dependencies": { + "minipass": "^3.1.1" + }, + "engines": { + "node": ">= 8" + } + }, "node_modules/stack-trace": { "version": "0.0.9", "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.9.tgz", @@ -13077,15 +13057,6 @@ "pkg-conf": "^2.0.0" } }, - "node_modules/standard-engine/node_modules/get-stdin": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-6.0.0.tgz", - "integrity": "sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/standard/node_modules/acorn": { "version": "6.4.2", "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", @@ -13129,9 +13100,9 @@ } }, "node_modules/standard/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==", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, "dependencies": { "balanced-match": "^1.0.0", @@ -13196,6 +13167,7 @@ "version": "5.4.0", "resolved": "https://registry.npmjs.org/eslint/-/eslint-5.4.0.tgz", "integrity": "sha512-UIpL91XGex3qtL6qwyCQJar2j3osKxK9e3ano3OcGEIRM4oWIpCkDg9x95AXEC2wMs7PnxzOkPZ2gq+tsMS9yg==", + "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", "dev": true, "dependencies": { "ajv": "^6.5.0", @@ -13409,6 +13381,7 @@ "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, "dependencies": { "fs.realpath": "^1.0.0", @@ -13553,6 +13526,7 @@ "version": "2.6.3", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", "dev": true, "dependencies": { "glob": "^7.1.3" @@ -13662,6 +13636,19 @@ "node": ">= 0.8" } }, + "node_modules/stop-iteration-iterator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz", + "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0", + "internal-slot": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/stream-buffers": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/stream-buffers/-/stream-buffers-3.0.3.tgz", @@ -13734,15 +13721,18 @@ } }, "node_modules/string.prototype.trim": { - "version": "1.2.9", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz", - "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==", + "version": "1.2.10", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz", + "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==", "dev": true, "dependencies": { - "call-bind": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-data-property": "^1.1.4", "define-properties": "^1.2.1", - "es-abstract": "^1.23.0", - "es-object-atoms": "^1.0.0" + "es-abstract": "^1.23.5", + "es-object-atoms": "^1.0.0", + "has-property-descriptors": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -13752,15 +13742,19 @@ } }, "node_modules/string.prototype.trimend": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz", - "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==", + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz", + "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", "define-properties": "^1.2.1", "es-object-atoms": "^1.0.0" }, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -13858,12 +13852,12 @@ } }, "node_modules/superagent/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", "dev": true, "dependencies": { - "ms": "2.1.2" + "ms": "^2.1.3" }, "engines": { "node": ">=6.0" @@ -13875,13 +13869,13 @@ } }, "node_modules/superagent/node_modules/formidable": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/formidable/-/formidable-2.1.2.tgz", - "integrity": "sha512-CM3GuJ57US06mlpQ47YcunuUZ9jpm8Vx+P2CGt2j7HpgkKZO/DJYQ0Bobim8G6PFQmK5lOqOOdUXboU+h73A4g==", + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/formidable/-/formidable-2.1.5.tgz", + "integrity": "sha512-Oz5Hwvwak/DCaXVVUtPn4oLMLLy1CdclLKO1LFgU7XzDpVMUU5UjlSLpGMocyQNNk8F6IJW9M/YdooSn2MRI+Q==", "dev": true, "dependencies": { + "@paralleldrive/cuid2": "^2.2.2", "dezalgo": "^1.0.4", - "hexoid": "^1.0.0", "once": "^1.4.0", "qs": "^6.11.0" }, @@ -13902,9 +13896,9 @@ } }, "node_modules/superagent/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==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dev": true }, "node_modules/superagent/node_modules/once": { @@ -14098,26 +14092,26 @@ "node": ">=4" } }, - "node_modules/tar": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", - "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", - "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" + "node_modules/tar": { + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.4.3.tgz", + "integrity": "sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==", + "dependencies": { + "@isaacs/fs-minipass": "^4.0.0", + "chownr": "^3.0.0", + "minipass": "^7.1.2", + "minizlib": "^3.0.1", + "mkdirp": "^3.0.1", + "yallist": "^5.0.0" }, "engines": { - "node": ">=10" + "node": ">=18" } }, "node_modules/tar-fs": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.2.tgz", - "integrity": "sha512-EsaAXwxmx8UB7FRKqeozqEPop69DXcmYwTQwXvyAPF352HJsPdkVhvTaDPYqfNgruveJIJy3TA2l+2zj8LJIJA==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.3.tgz", + "integrity": "sha512-090nwYJDmlhwFwEW3QQl+vaNnxsO2yVsd45eTKRBzSzu+hlb1w2K9inVq5b0ngXuLVqQ4ApvsUHHnu/zQNkWAg==", "dependencies": { "chownr": "^1.1.1", "mkdirp-classic": "^0.5.2", @@ -14166,37 +14160,39 @@ "safe-buffer": "~5.2.0" } }, - "node_modules/tar/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" - }, + "node_modules/tar/node_modules/chownr": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", + "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", "engines": { - "node": ">= 8" + "node": ">=18" } }, - "node_modules/tar/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==", + "node_modules/tar/node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/tar/node_modules/minizlib": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.0.2.tgz", + "integrity": "sha512-oG62iEk+CYt5Xj2YqI5Xi9xWUeZhDI8jjQmC5oThVH5JGCTgIjr7ciJDzC7MBzYd//WvR1OTmP5Q38Q8ShQtVA==", "dependencies": { - "yallist": "^4.0.0" + "minipass": "^7.1.2" }, "engines": { - "node": ">=8" + "node": ">= 18" } }, - "node_modules/tar/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" - }, + "node_modules/tar/node_modules/yallist": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", + "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", "engines": { - "node": ">=10" + "node": ">=18" } }, "node_modules/tcp-port-used": { @@ -14253,9 +14249,9 @@ } }, "node_modules/test-exclude/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==", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, "dependencies": { "balanced-match": "^1.0.0", @@ -14266,6 +14262,7 @@ "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, "dependencies": { "fs.realpath": "^1.0.0", @@ -14301,9 +14298,9 @@ "dev": true }, "node_modules/thread-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/thread-stream/-/thread-stream-3.0.0.tgz", - "integrity": "sha512-oUIFjxaUT6knhPtWgDMc29zF1FcSl0yXpapkyrQrCGEfYA2HUZXCilUtKyYIv6HkCyqSPAMkY+EG0GbyIrNDQg==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/thread-stream/-/thread-stream-3.1.0.tgz", + "integrity": "sha512-OqyPZ9u96VohAyMfJykzmivOrY2wfMSf3C5TtFJVgN+Hm6aj+voFhlK+kZEIv2FBh1X6Xp3DlnCOfEQ3B2J86A==", "dependencies": { "real-require": "^0.2.0" } @@ -14315,13 +14312,16 @@ "dev": true }, "node_modules/timers-ext": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/timers-ext/-/timers-ext-0.1.7.tgz", - "integrity": "sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ==", + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/timers-ext/-/timers-ext-0.1.8.tgz", + "integrity": "sha512-wFH7+SEAcKfJpfLPkrgMPvvwnEtj8W4IurvEyrKsDleXnKLCDw71w8jltvfLa8Rm4qQxxT4jmDBYbJG/z7qoww==", "dev": true, "dependencies": { - "es5-ext": "~0.10.46", - "next-tick": "1" + "es5-ext": "^0.10.64", + "next-tick": "^1.1.0" + }, + "engines": { + "node": ">=0.12" } }, "node_modules/tmp": { @@ -14340,7 +14340,6 @@ "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" }, @@ -14362,9 +14361,9 @@ "integrity": "sha512-OsLcGGbYF3rMjPUf8oKktyvCiUxSbqMMS39m33MAjLTC1DVIH6x3WSt63/M77ihI09+Sdfk1AXvfhCEeUmC7mg==" }, "node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==" }, "node_modules/tunnel-agent": { "version": "0.6.0", @@ -14384,9 +14383,9 @@ "dev": true }, "node_modules/type": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/type/-/type-2.7.2.tgz", - "integrity": "sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==", + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/type/-/type-2.7.3.tgz", + "integrity": "sha512-8j+1QmAbPvLZow5Qpi6NCaN8FB60p/6x8/vfNqOk/hC+HuvFZhL4+WfekuhQLiqFZXOgQdrs3B+XxEmCc6b3FQ==", "dev": true }, "node_modules/type-check": { @@ -14432,30 +14431,30 @@ } }, "node_modules/typed-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", - "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", + "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", "dev": true, "dependencies": { - "call-bind": "^1.0.7", + "call-bound": "^1.0.3", "es-errors": "^1.3.0", - "is-typed-array": "^1.1.13" + "is-typed-array": "^1.1.14" }, "engines": { "node": ">= 0.4" } }, "node_modules/typed-array-byte-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", - "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", + "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", "dev": true, "dependencies": { - "call-bind": "^1.0.7", + "call-bind": "^1.0.8", "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-proto": "^1.0.3", - "is-typed-array": "^1.1.13" + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.14" }, "engines": { "node": ">= 0.4" @@ -14465,17 +14464,18 @@ } }, "node_modules/typed-array-byte-offset": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz", - "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", + "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", "dev": true, "dependencies": { "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.7", + "call-bind": "^1.0.8", "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-proto": "^1.0.3", - "is-typed-array": "^1.1.13" + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.15", + "reflect.getprototypeof": "^1.0.9" }, "engines": { "node": ">= 0.4" @@ -14485,17 +14485,17 @@ } }, "node_modules/typed-array-length": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz", - "integrity": "sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz", + "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==", "dev": true, "dependencies": { "call-bind": "^1.0.7", "for-each": "^0.3.3", "gopd": "^1.0.1", - "has-proto": "^1.0.3", "is-typed-array": "^1.1.13", - "possible-typed-array-names": "^1.0.0" + "possible-typed-array-names": "^1.0.0", + "reflect.getprototypeof": "^1.0.6" }, "engines": { "node": ">= 0.4" @@ -14527,9 +14527,9 @@ } }, "node_modules/uglify-js": { - "version": "3.19.2", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.2.tgz", - "integrity": "sha512-S8KA6DDI47nQXJSi2ctQ629YzwOVs+bQML6DAtvy0wgNdpi+0ySpQK0g2pxBq2xfF2z3YCscu7NNA8nXT9PlIQ==", + "version": "3.19.3", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.3.tgz", + "integrity": "sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==", "dev": true, "optional": true, "bin": { @@ -14551,13 +14551,13 @@ } }, "node_modules/umzug": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/umzug/-/umzug-3.7.0.tgz", - "integrity": "sha512-r/L2Zlilgv3SKhmP2nkA9x2Xi1PKtu2K34/i/s7AYJ2mLjEO+IxETJAK7CKf6l3QOvoy5/ChykeX9qt6ykRz6Q==", + "version": "3.8.2", + "resolved": "https://registry.npmjs.org/umzug/-/umzug-3.8.2.tgz", + "integrity": "sha512-BEWEF8OJjTYVC56GjELeHl/1XjFejrD7aHzn+HldRJTx+pL1siBrKHZC8n4K/xL3bEzVA9o++qD1tK2CpZu4KA==", "dependencies": { "@rushstack/ts-command-line": "^4.12.2", "emittery": "^0.13.0", - "glob": "^8.0.3", + "fast-glob": "^3.3.2", "pony-cause": "^2.1.4", "type-fest": "^4.0.0" }, @@ -14566,9 +14566,9 @@ } }, "node_modules/umzug/node_modules/type-fest": { - "version": "4.18.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.18.2.tgz", - "integrity": "sha512-+suCYpfJLAe4OXS6+PPXjW3urOS4IoP9waSiLuXfLgqZODKw/aWwASvzqE886wA0kQgGy0mIWyhd87VpqIy6Xg==", + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", + "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", "engines": { "node": ">=16" }, @@ -14577,15 +14577,18 @@ } }, "node_modules/unbox-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", - "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", + "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", + "call-bound": "^1.0.3", "has-bigints": "^1.0.2", - "has-symbols": "^1.0.3", - "which-boxed-primitive": "^1.0.2" + "has-symbols": "^1.1.0", + "which-boxed-primitive": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -14597,9 +14600,9 @@ "integrity": "sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==" }, "node_modules/undici-types": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", - "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==" + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.8.0.tgz", + "integrity": "sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw==" }, "node_modules/uniq": { "version": "1.0.1", @@ -14607,6 +14610,24 @@ "integrity": "sha512-Gw+zz50YNKPDKXs+9d+aKAjVwpjNwqzvNpLigIruT4HA9lMZNdMqs9x07kKHB/L9WRzqp4+DlTU5s4wG2esdoA==", "dev": true }, + "node_modules/unique-filename": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", + "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", + "optional": true, + "dependencies": { + "unique-slug": "^2.0.0" + } + }, + "node_modules/unique-slug": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", + "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", + "optional": true, + "dependencies": { + "imurmurhash": "^0.1.4" + } + }, "node_modules/universalify": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", @@ -14625,9 +14646,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.0.16", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.16.tgz", - "integrity": "sha512-KVbTxlBYlckhF5wgfyZXTWnMn7MMZjMu9XG8bPlliUOP9ThaF4QnhP8qrjrH7DRzHfSk0oQv1wToW+iA5GajEQ==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", + "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", "dev": true, "funding": [ { @@ -14644,8 +14665,8 @@ } ], "dependencies": { - "escalade": "^3.1.2", - "picocolors": "^1.0.1" + "escalade": "^3.2.0", + "picocolors": "^1.1.1" }, "bin": { "update-browserslist-db": "cli.js" @@ -14658,7 +14679,6 @@ "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" } @@ -14712,17 +14732,23 @@ } }, "node_modules/uvm": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/uvm/-/uvm-3.0.0.tgz", - "integrity": "sha512-dATVpxsNfFBpHNdq6sy4/CV2UnoRbV8tvvkK0VrUPnm+o7dK6fnir4LEm8czeDdpbw2KKDKjIPcRSZY4AEwEZA==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/uvm/-/uvm-2.1.1.tgz", + "integrity": "sha512-BZ5w8adTpNNr+zczOBRpaX/hH8UPKAf7fmCnidrcsqt3bn8KT9bDIfuS7hgRU9RXgiN01su2pwysBONY6w8W5w==", "dev": true, "dependencies": { - "flatted": "3.3.1" + "flatted": "3.2.6" }, "engines": { - "node": ">=16" + "node": ">=10" } }, + "node_modules/uvm/node_modules/flatted": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.6.tgz", + "integrity": "sha512-0sQoMh9s0BYsm+12Huy/rkKxVu4R1+r96YX5cG44rHV0pQ6iC3Q+mkoMFaGWObMFYQxCVT+ssG1ksneA2MI9KQ==", + "dev": true + }, "node_modules/validate-npm-package-license": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", @@ -14734,9 +14760,9 @@ } }, "node_modules/validator": { - "version": "13.12.0", - "resolved": "https://registry.npmjs.org/validator/-/validator-13.12.0.tgz", - "integrity": "sha512-c1Q0mCiPlgdTVVVIJIrBuxNicYE+t/7oKeI9MWLj3fh/uq2Pxh/3eeWbVZ4OcGW1TUf53At0njHw5SMdA3tmMg==", + "version": "13.15.15", + "resolved": "https://registry.npmjs.org/validator/-/validator-13.15.15.tgz", + "integrity": "sha512-BgWVbCI72aIQy937xbawcs+hrVaN/CZ2UwutgaJ36hGqRrLNM+f5LUT/YPRbo8IV/ASeFzXszezV+y2+rq3l8A==", "engines": { "node": ">= 0.10" } @@ -14785,16 +14811,70 @@ } }, "node_modules/which-boxed-primitive": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", + "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", + "dev": true, + "dependencies": { + "is-bigint": "^1.1.0", + "is-boolean-object": "^1.2.1", + "is-number-object": "^1.1.1", + "is-string": "^1.1.1", + "is-symbol": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-builtin-type": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz", + "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", + "dev": true, + "dependencies": { + "call-bound": "^1.0.2", + "function.prototype.name": "^1.1.6", + "has-tostringtag": "^1.0.2", + "is-async-function": "^2.0.0", + "is-date-object": "^1.1.0", + "is-finalizationregistry": "^1.1.0", + "is-generator-function": "^1.0.10", + "is-regex": "^1.2.1", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.1.0", + "which-collection": "^1.0.2", + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-builtin-type/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + }, + "node_modules/which-collection": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", + "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", "dev": true, "dependencies": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" + "is-map": "^2.0.3", + "is-set": "^2.0.3", + "is-weakmap": "^2.0.2", + "is-weakset": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -14807,15 +14887,17 @@ "dev": true }, "node_modules/which-typed-array": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", - "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", + "version": "1.1.19", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz", + "integrity": "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==", "dev": true, "dependencies": { "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "for-each": "^0.3.5", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", "has-tostringtag": "^1.0.2" }, "engines": { @@ -14872,17 +14954,16 @@ "dev": true }, "node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "dev": true, + "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": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" }, "engines": { - "node": ">=12" + "node": ">=10" }, "funding": { "url": "https://github.com/chalk/wrap-ansi?sponsor=1" @@ -14906,68 +14987,6 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/wrap-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/wrap-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/wrap-ansi/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/wrap-ansi/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/wrap-ansi/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/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", @@ -15088,20 +15107,20 @@ "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==", + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", "dependencies": { - "cliui": "^7.0.2", + "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", - "string-width": "^4.2.0", + "string-width": "^4.2.3", "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" + "yargs-parser": "^21.1.1" }, "engines": { - "node": ">=10" + "node": ">=12" } }, "node_modules/yargs-parser": { @@ -15151,6 +15170,14 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/yargs/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/yauzl": { "version": "2.10.0", "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", @@ -15172,34 +15199,6 @@ "funding": { "url": "https://github.com/sponsors/sindresorhus" } - }, - "node_modules/z-schema": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/z-schema/-/z-schema-5.0.5.tgz", - "integrity": "sha512-D7eujBWkLa3p2sIpJA0d1pr7es+a7m0vFAnZLlCEKq/Ij2k0MLi9Br2UPxoxdYystm5K1yeBGzub0FlYUEWj2Q==", - "dependencies": { - "lodash.get": "^4.4.2", - "lodash.isequal": "^4.5.0", - "validator": "^13.7.0" - }, - "bin": { - "z-schema": "bin/z-schema" - }, - "engines": { - "node": ">=8.0.0" - }, - "optionalDependencies": { - "commander": "^9.4.1" - } - }, - "node_modules/z-schema/node_modules/commander": { - "version": "9.5.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", - "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", - "optional": true, - "engines": { - "node": "^12.20.0 || >=14" - } } } } diff --git a/package.json b/package.json index 9660f9356..d5061e204 100644 --- a/package.json +++ b/package.json @@ -57,9 +57,16 @@ "dependencies": { "@datasance/ecn-viewer": "0.5.4", "@kubernetes/client-node": "^0.22.3", + "@msgpack/msgpack": "^3.1.2", + "@opentelemetry/api": "^1.9.0", + "@opentelemetry/exporter-trace-otlp-http": "^0.200.0", + "@opentelemetry/instrumentation-express": "^0.48.1", + "@opentelemetry/instrumentation-http": "^0.200.0", + "@opentelemetry/resources": "^1.8.0", + "@opentelemetry/sdk-node": "^0.200.0", "axios": "1.8.4", - "body-parser": "^1.20.3", "bignumber.js": "^9.3.0", + "body-parser": "^1.20.3", "child_process": "1.0.2", "command-line-args": "5.2.1", "command-line-usage": "7.0.3", @@ -103,15 +110,10 @@ "sqlite3": "^5.1.7", "string-format": "2.0.0", "umzug": "^3.7.0", - "uuid": "11.1.0", "underscore": "1.13.6", - "xss-clean": "0.1.1", - "@opentelemetry/api": "^1.9.0", - "@opentelemetry/resources": "^1.8.0", - "@opentelemetry/sdk-node": "^0.200.0", - "@opentelemetry/exporter-trace-otlp-http": "^0.200.0", - "@opentelemetry/instrumentation-http": "^0.200.0", - "@opentelemetry/instrumentation-express": "^0.48.1" + "uuid": "11.1.0", + "ws": "^8.18.0", + "xss-clean": "0.1.1" }, "devDependencies": { "acorn": "8.11.3", @@ -119,18 +121,19 @@ "chai": "5.1.1", "chai-as-promised": "7.1.2", "chai-http": "4.4.0", - "eslint": "9.16.0", + "eslint": "9.28.0", "eslint-config-google": "0.14.0", "mocha": "10.6.0", "mocha-junit-reporter": "2.2.1", - "newman": "^6.2.0", + "newman": "^6.2.1", "newman-reporter-junitfull": "1.1.1", "nyc": "15.1.0", "sequelize-cli": "6.6.2", "sinon": "17.0.1", "sinon-chai": "3.7.0", "snyk": "^1.1291.0", - "standard": "12.0.1" + "standard": "12.0.1", + "js-yaml": "^4.1.0" }, "files": [ "/scripts", @@ -145,6 +148,11 @@ "overrides": { "@kubernetes/client-node": { "request": "@cypress/request@3.0.8" + }, + "sqlite3": { + "prebuild-install": { + "tar-fs": "^2.1.3" + } } } } diff --git a/scripts/generate-swagger.js b/scripts/generate-swagger.js new file mode 100644 index 000000000..e04a61eea --- /dev/null +++ b/scripts/generate-swagger.js @@ -0,0 +1,778 @@ +const fs = require('fs') +const path = require('path') +const yaml = require('js-yaml') + +// Base Swagger configuration +const swaggerBase = { + openapi: '3.0.0', + info: { + title: 'Datasance PoT Controller', + version: '3.5.0', + description: 'Datasance PoT Controller REST API Documentation' + }, + servers: [ + { + url: 'http://localhost:51121/api/v3' + } + ], + tags: [ + { name: 'Controller', description: 'Manage your controller' }, + { name: 'ioFog', description: 'Manage your agents' }, + { name: 'Application', description: 'Manage your applications' }, + { name: 'Application Template', description: 'Manage your application templates' }, + { name: 'Catalog', description: 'Manage your catalog' }, + { name: 'Registries', description: 'Manage your registries' }, + { name: 'Microservices', description: 'Manage your microservices' }, + { name: 'Routing', description: 'Manage your routes' }, + { name: 'Router', description: 'Manage your Default Router' }, + { name: 'Edge Resource', description: 'Manage your Edge Resources' }, + { name: 'Diagnostics', description: 'Diagnostic your microservices' }, + { name: 'Tunnel', description: 'Manage ssh tunnels' }, + { name: 'Agent', description: 'Used by your agents to communicate with your controller' }, + { name: 'User', description: 'Manage your users' }, + { name: 'Secrets', description: 'Manage your secrets' }, + { name: 'Certificates', description: 'Manage your certificates' }, + { name: 'Services', description: 'Manage your services' }, + { name: 'VolumeMounts', description: 'Manage your volume mounts' }, + { name: 'ConfigMap', description: 'Manage your config maps' } + ], + components: { + securitySchemes: { + authToken: { + type: 'http', + scheme: 'bearer', + bearerFormat: 'JWT', + description: 'JWT token for authentication (user or agent)' + } + }, + schemas: {} + }, + security: [ + { + authToken: [] + } + ], + paths: {} +} + +// Common response headers +const commonHeaders = { + 'X-Timestamp': { + description: 'FogController server timestamp', + schema: { + type: 'number' + } + } +} + +// Map HTTP methods to response schemas +const responseSchemas = { + get: { + '200': { + description: 'Success', + headers: commonHeaders, + content: { + 'application/json': { + schema: { + type: 'object' + } + } + } + }, + '401': { + description: 'Not Authorized' + }, + '404': { + description: 'Not Found' + }, + '500': { + description: 'Internal Server Error' + } + }, + post: { + '201': { + description: 'Created', + headers: commonHeaders, + content: { + 'application/json': { + schema: { + type: 'object' + } + } + } + }, + '400': { + description: 'Bad Request' + }, + '401': { + description: 'Not Authorized' + }, + '409': { + description: 'Duplicate Name' + }, + '500': { + description: 'Internal Server Error' + } + }, + put: { + '200': { + description: 'Success', + headers: commonHeaders, + content: { + 'application/json': { + schema: { + type: 'object' + } + } + } + }, + '400': { + description: 'Bad Request' + }, + '401': { + description: 'Not Authorized' + }, + '404': { + description: 'Not Found' + }, + '500': { + description: 'Internal Server Error' + } + }, + delete: { + '204': { + description: 'Success', + headers: commonHeaders + }, + '401': { + description: 'Not Authorized' + }, + '404': { + description: 'Not Found' + }, + '500': { + description: 'Internal Server Error' + } + } +} + +// Convert JSON Schema to OpenAPI Schema +function convertJsonSchemaToOpenAPI (schema) { + if (!schema) return {} + const openAPISchema = { ...schema } + + // Remove JSON Schema specific properties + delete openAPISchema.id + delete openAPISchema.$schema + + // Remove OpenAPI-incompatible properties + delete openAPISchema.if + delete openAPISchema.then + delete openAPISchema.const + delete openAPISchema.optional + + // Handle required arrays + if (openAPISchema.required && Array.isArray(openAPISchema.required) && openAPISchema.required.length === 0) { + delete openAPISchema.required + } + + // Convert $ref to OpenAPI format + if (openAPISchema.$ref) { + const refPath = openAPISchema.$ref.replace(/^\//, '') + // Only add #/components/schemas/ if it's not already there + if (!refPath.startsWith('#/components/schemas/')) { + openAPISchema.$ref = `#/components/schemas/${refPath}` + } else { + openAPISchema.$ref = refPath + } + } + + // Handle properties + if (openAPISchema.properties) { + Object.keys(openAPISchema.properties).forEach(key => { + if (openAPISchema.properties[key].$ref) { + const refPath = openAPISchema.properties[key].$ref.replace(/^\//, '') + // Only add #/components/schemas/ if it's not already there + if (!refPath.startsWith('#/components/schemas/')) { + openAPISchema.properties[key].$ref = `#/components/schemas/${refPath}` + } else { + openAPISchema.properties[key].$ref = refPath + } + } + // Remove additional properties from nested objects + if (openAPISchema.properties[key].type === 'object') { + delete openAPISchema.properties[key].additionalProperties + } + // Handle items in arrays + if (openAPISchema.properties[key].items) { + if (openAPISchema.properties[key].items.type === 'object') { + delete openAPISchema.properties[key].items.additionalProperties + // Convert key/value pairs to properties + if (openAPISchema.properties[key].items.key && openAPISchema.properties[key].items.value) { + openAPISchema.properties[key].items = { + type: 'object', + properties: { + key: openAPISchema.properties[key].items.key, + value: openAPISchema.properties[key].items.value + } + } + } + } + // Handle array item references + if (openAPISchema.properties[key].items.$ref) { + const refPath = openAPISchema.properties[key].items.$ref.replace(/^\//, '') + // Only add #/components/schemas/ if it's not already there + if (!refPath.startsWith('#/components/schemas/')) { + openAPISchema.properties[key].items = { + $ref: `#/components/schemas/${refPath}` + } + } else { + openAPISchema.properties[key].items = { + $ref: refPath + } + } + } + } + // Handle required arrays in properties + if (openAPISchema.properties[key].required && Array.isArray(openAPISchema.properties[key].required)) { + if (openAPISchema.properties[key].required.length === 0) { + delete openAPISchema.properties[key].required + } + } + // Handle intermediateCert optional property + if (key === 'intermediateCert') { + delete openAPISchema.properties[key].optional + } + // Handle microserviceDelete additionalProperties + if (key === 'additionalProperties') { + openAPISchema.properties[key] = { + type: 'object', + additionalProperties: true + } + } + // Handle serviceCreate resource required + if (key === 'resource' && openAPISchema.properties[key].required) { + if (!Array.isArray(openAPISchema.properties[key].required)) { + openAPISchema.properties[key].required = ['cpu', 'memory'] + } + } + }) + } + + // Handle array items + if (openAPISchema.items) { + if (openAPISchema.items.$ref) { + const refPath = openAPISchema.items.$ref.replace(/^\//, '') + // Only add #/components/schemas/ if it's not already there + if (!refPath.startsWith('#/components/schemas/')) { + openAPISchema.items.$ref = `#/components/schemas/${refPath}` + } else { + openAPISchema.items.$ref = refPath + } + } + // Remove additional properties from array items + if (openAPISchema.items.type === 'object') { + delete openAPISchema.items.additionalProperties + } + } + + // Handle allOf/anyOf + if (openAPISchema.allOf) { + openAPISchema.allOf = openAPISchema.allOf.map(item => { + const converted = convertJsonSchemaToOpenAPI(item) + // Remove const from routerMode in anyOf/allOf + if (converted.properties && converted.properties.routerMode) { + delete converted.properties.routerMode.const + } + return converted + }) + } + if (openAPISchema.anyOf) { + openAPISchema.anyOf = openAPISchema.anyOf.map(item => { + const converted = convertJsonSchemaToOpenAPI(item) + // Remove const from routerMode in anyOf/allOf + if (converted.properties && converted.properties.routerMode) { + delete converted.properties.routerMode.const + } + return converted + }) + } + + // Remove additionalProperties at root level + delete openAPISchema.additionalProperties + + return openAPISchema +} + +// Convert path parameters from :param to {param} format and remove /api/v3 prefix +function convertPathParameters (path) { + // Remove /api/v3 prefix if present + const pathWithoutPrefix = path.replace(/^\/api\/v3/, '') + // Convert :param to {param} + return pathWithoutPrefix.replace(/:([^/]+)/g, '{$1}') +} + +// Get response schema based on route path and method +function getResponseSchema (path, method) { + const baseResponse = JSON.parse(JSON.stringify(responseSchemas[method] || responseSchemas.get)) + // Customize response schema based on path + if (path.includes('/application')) { + if (method === 'get') { + baseResponse['200'].content['application/json'].schema = { + type: 'object', + properties: { + applications: { + type: 'array', + items: { + type: 'object', + properties: { + name: { type: 'string' }, + description: { type: 'string' }, + version: { type: 'string' }, + microservices: { + type: 'array', + items: { + type: 'object', + properties: { + name: { type: 'string' }, + config: { type: 'object' } + } + } + } + } + } + } + } + } + } + } else if (path.includes('/microservices')) { + if (method === 'get') { + baseResponse['200'].content['application/json'].schema = { + type: 'object', + properties: { + microservices: { + type: 'array', + items: { + type: 'object', + properties: { + uuid: { type: 'string' }, + name: { type: 'string' }, + config: { type: 'object' } + } + } + } + } + } + } + } + return baseResponse +} + +// Get request body schema based on route path and method +function getRequestBodySchema (path, method) { + // Handle YAML file upload endpoints + if (path.endsWith('/yaml')) { + return { + required: true, + content: { + 'multipart/form-data': { + schema: { + type: 'object', + properties: { + application: { + type: 'string', + format: 'binary' + } + } + } + } + } + } + } + + // Map routes to their corresponding schemas based on service validations + const schemaMapping = { + // Application routes + '/application': { + post: 'applicationCreate', + put: 'applicationUpdate', + patch: 'applicationPatch' + }, + // Microservice routes + '/microservices': { + post: 'microserviceCreate', + put: 'microserviceUpdate' + }, + // Iofog routes + '/iofog': { + post: 'iofogCreate', + put: 'iofogUpdate' + }, + // Agent routes + '/agent': { + post: 'agentProvision', + put: 'updateAgentConfig' + }, + // Routing routes + '/routing': { + post: 'routingCreate', + put: 'routingUpdate' + }, + // Secret routes + '/secret': { + post: 'secretCreate', + put: 'secretUpdate' + }, + // Service routes + '/service': { + post: 'serviceCreate', + put: 'serviceUpdate' + }, + // Certificate routes + '/certificate': { + post: 'certificateCreate', + put: 'caCreate' + }, + // Config map routes + '/configMap': { + post: 'configMapCreate', + put: 'configMapUpdate' + }, + // Volume mount routes + '/volumeMount': { + post: 'volumeMountCreate', + put: 'volumeMountUpdate' + }, + // Edge resource routes + '/edgeResource': { + post: 'edgeResourceCreate', + put: 'edgeResourceUpdate' + }, + // Application template routes + '/applicationTemplate': { + post: 'applicationTemplateCreate', + put: 'applicationTemplateUpdate', + patch: 'applicationTemplatePatch' + }, + // User routes + '/user': { + post: 'login', + put: 'refresh' + }, + // Catalog routes + '/catalog': { + post: 'catalogItemCreate', + put: 'catalogItemUpdate' + }, + // Registry routes + '/registry': { + post: 'registryCreate', + put: 'registryUpdate' + }, + // Tunnel routes + '/tunnel': { + post: 'tunnelCreate' + }, + // Config routes + '/config': { + put: 'configUpdate' + } + } + + // Find the matching schema for this path and method + for (const [routePath, methods] of Object.entries(schemaMapping)) { + if (path.includes(routePath) && methods[method]) { + const schemaName = methods[method] + return { + required: true, + content: { + 'application/json': { + schema: { + $ref: `#/components/schemas/${schemaName}` + } + } + } + } + } + } + + // Default JSON request body + return { + required: true, + content: { + 'application/json': { + schema: { + type: 'object' + } + } + } + } +} + +// Find the most similar tag from the tag list +function findMostSimilarTag (path) { + const pathSegments = path.split('/').filter(Boolean) + if (pathSegments.length === 0) return 'Controller' + + // Get the first meaningful segment (skip empty strings) + const firstSegment = pathSegments[0] + + // Define tag mapping for common paths + const tagMapping = { + 'application': 'Application', + 'applications': 'Application', + 'flow': 'Application', + 'flows': 'Application', + 'template': 'Application Template', + 'templates': 'Application Template', + 'catalog': 'Catalog', + 'registry': 'Registries', + 'registries': 'Registries', + 'microservice': 'Microservices', + 'microservices': 'Microservices', + 'route': 'Routing', + 'routes': 'Routing', + 'routing': 'Routing', + 'router': 'Router', + 'edgeResource': 'Edge Resource', + 'edgeResources': 'Edge Resource', + 'edge-resource': 'Edge Resource', + 'edge-resources': 'Edge Resource', + 'edge_resource': 'Edge Resource', + 'edge_resources': 'Edge Resource', + 'diagnostic': 'Diagnostics', + 'diagnostics': 'Diagnostics', + 'tunnel': 'Tunnel', + 'tunnels': 'Tunnel', + 'agent': 'Agent', + 'agents': 'Agent', + 'user': 'User', + 'users': 'User', + 'secret': 'Secrets', + 'secrets': 'Secrets', + 'certificate': 'Certificates', + 'certificates': 'Certificates', + 'service': 'Services', + 'services': 'Services', + 'volume': 'VolumeMounts', + 'volumes': 'VolumeMounts', + 'config': 'ConfigMap', + 'configs': 'ConfigMap', + 'iofog': 'ioFog' + } + + // Try to find an exact match first (case-insensitive) + const lowerFirstSegment = firstSegment.toLowerCase() + if (tagMapping[lowerFirstSegment]) { + return tagMapping[lowerFirstSegment] + } + + // Try to find a match with different case formats + const possibleFormats = [ + firstSegment, + firstSegment.toLowerCase(), + firstSegment.toUpperCase(), + firstSegment.replace(/([A-Z])/g, '-$1').toLowerCase(), + firstSegment.replace(/([A-Z])/g, '_$1').toLowerCase(), + firstSegment.charAt(0).toUpperCase() + firstSegment.slice(1) + ] + + for (const format of possibleFormats) { + if (tagMapping[format]) { + return tagMapping[format] + } + } + + // If no exact match, try to find the most similar tag + const tagNames = swaggerBase.tags.map(tag => tag.name.toLowerCase()) + let bestMatch = 'Controller' + let bestScore = 0 + + for (const tagName of tagNames) { + // Check if the path segment contains the tag name or vice versa + if (lowerFirstSegment.includes(tagName) || tagName.includes(lowerFirstSegment)) { + const score = Math.min(lowerFirstSegment.length, tagName.length) + if (score > bestScore) { + bestScore = score + bestMatch = swaggerBase.tags.find(tag => tag.name.toLowerCase() === tagName).name + } + } + } + + return bestMatch +} + +// Process route file +function processRouteFile (filePath) { + const routeFile = require(filePath) + const paths = {} + routeFile.forEach(route => { + // Skip WebSocket endpoints + if (route.method.toLowerCase() === 'ws') { + return + } + + const originalPath = route.path + const path = convertPathParameters(originalPath) + const method = route.method.toLowerCase() + if (!paths[path]) { + paths[path] = {} + } + // Extract parameters from path + const pathParams = [] + const pathRegex = /{([^}]+)}/g + let match + while ((match = pathRegex.exec(path)) !== null) { + pathParams.push({ + name: match[1], + in: 'path', + required: true, + schema: { + type: 'string' + } + }) + } + // Create path object + paths[path][method] = { + tags: [findMostSimilarTag(path)], + summary: `${method.toUpperCase()} ${originalPath}`, + security: [{ authToken: [] }], + parameters: pathParams, + responses: getResponseSchema(path, method) + } + // Add request body for POST/PUT/PATCH + if (['post', 'put', 'patch'].includes(method)) { + paths[path][method].requestBody = getRequestBodySchema(path, method) + } + }) + return paths +} + +// Process schema file +function processSchemaFile (filePath) { + const schemaFile = require(filePath) + const schemas = {} + + // Process all inner schemas first + if (schemaFile.innerSchemas) { + schemaFile.innerSchemas.forEach(schema => { + if (schema.id) { + const schemaName = schema.id.replace(/^\//, '') + schemas[schemaName] = convertJsonSchemaToOpenAPI(schema) + } + }) + } + + // Then process main schemas + if (schemaFile.mainSchemas) { + schemaFile.mainSchemas.forEach(schema => { + if (schema.id) { + const schemaName = schema.id.replace(/^\//, '') + schemas[schemaName] = convertJsonSchemaToOpenAPI(schema) + } + }) + } + + // Handle direct schema exports + Object.keys(schemaFile).forEach(key => { + if (typeof schemaFile[key] === 'object' && schemaFile[key].type) { + const schemaName = key + schemas[schemaName] = convertJsonSchemaToOpenAPI(schemaFile[key]) + } + }) + + return schemas +} + +// Main function +function generateSwagger () { + const routesDir = path.join(__dirname, '../src/routes') + const schemasDir = path.join(__dirname, '../src/schemas') + + // First, add base schemas that are commonly referenced + const baseSchemas = { + image: { + type: 'object', + properties: { + name: { type: 'string' }, + registry: { type: 'string' } + }, + required: ['name'] + }, + volumeMappings: { + type: 'object', + properties: { + hostDestination: { type: 'string' }, + containerDestination: { type: 'string' }, + accessMode: { type: 'string' }, + type: { type: 'string', enum: ['volume', 'bind'] } + }, + required: ['hostDestination', 'containerDestination', 'accessMode'] + }, + ports: { + type: 'object', + properties: { + internal: { type: 'integer' }, + external: { type: 'integer' }, + protocol: { type: 'string', enum: ['tcp', 'udp'] } + }, + required: ['internal', 'external'] + }, + extraHosts: { + type: 'object', + properties: { + name: { type: 'string' }, + address: { type: 'string' } + }, + required: ['name', 'address'] + }, + env: { + type: 'object', + properties: { + key: { type: 'string' }, + value: { type: 'string' }, + valueFromSecret: { type: 'string' }, + valueFromConfigMap: { type: 'string' } + }, + required: ['key'], + oneOf: [ + { required: ['value'] }, + { required: ['valueFromSecret'] }, + { required: ['valueFromConfigMap'] } + ] + } + } + + // Initialize schemas with base schemas + const allSchemas = { ...baseSchemas } + + // Process all schema files + fs.readdirSync(schemasDir) + .filter(file => file.endsWith('.js')) + .forEach(file => { + const schemaDefinitions = processSchemaFile(path.join(schemasDir, file)) + Object.assign(allSchemas, schemaDefinitions) + }) + + // Add all schemas to the OpenAPI document + swaggerBase.components.schemas = allSchemas + + // Process all route files + fs.readdirSync(routesDir) + .filter(file => file.endsWith('.js')) + .forEach(file => { + const routePaths = processRouteFile(path.join(routesDir, file)) + Object.assign(swaggerBase.paths, routePaths) + }) + + // Write to YAML file + const yamlStr = yaml.dump(swaggerBase, { + noRefs: true, // Disable YAML anchors and references + lineWidth: -1, // Disable line wrapping + noCompatMode: true // Use modern YAML features + }) + fs.writeFileSync(path.join(__dirname, '../docs/swagger-test.yaml'), yamlStr) + console.log('Swagger YAML generated successfully!') +} + +generateSwagger() diff --git a/src/config/controller.yaml b/src/config/controller.yaml index 236bccf52..58f58c47b 100644 --- a/src/config/controller.yaml +++ b/src/config/controller.yaml @@ -6,7 +6,23 @@ app: # Server Configuration server: port: 51121 # Server port number - devMode: true # Development mode flag + devMode: true + webSocket: + perMessageDeflate: false + allowExtensions: false # Disable all extensions + pingInterval: 30000 # Ping interval in milliseconds (30 seconds) + pongTimeout: 10000 # Pong timeout in milliseconds (10 seconds) + handshakeTimeout: 10000 # 10 seconds + maxPayload: 1048576 # 1MB + maxFrameSize: 65536 # 64KB + session: + timeout: 3600000 # Session timeout in milliseconds (1 hour) + maxConnections: 100 # Maximum connections per session + cleanupInterval: 30000 # Session cleanup interval (30 seconds) + security: + maxConnectionsPerIp: 10 + maxRequestsPerMinute: 60 + maxPayload: 1048576 # 1MB # ssl: # path: # key: "" # SSL key file path @@ -80,6 +96,9 @@ systemImages: router: "1": "ghcr.io/datasance/router:latest" "2": "ghcr.io/datasance/router:latest" + debug: + "1": "ghcr.io/datasance/node-debugger:latest" + "2": "ghcr.io/datasance/node-debugger:latest" # Diagnostics Configuration diagnostics: diff --git a/src/config/env-mapping.js b/src/config/env-mapping.js index 8418a043f..b125c3236 100644 --- a/src/config/env-mapping.js +++ b/src/config/env-mapping.js @@ -7,6 +7,16 @@ module.exports = { 'SERVER_PORT': 'server.port', 'SERVER_DEV_MODE': 'server.devMode', + 'WS_PING_INTERVAL': 'server.webSocket.pingInterval', + 'WS_PONG_TIMEOUT': 'server.webSocket.pongTimeout', + 'WS_MAX_PAYLOAD': 'server.webSocket.maxPayload', + 'WS_SESSION_TIMEOUT': 'server.webSocket.session.timeout', + 'WS_SESSION_MAX_CONNECTIONS': 'server.webSocket.session.maxConnections', + 'WS_CLEANUP_INTERVAL': 'server.webSocket.session.cleanupInterval', + 'WS_SECURITY_MAX_CONNECTIONS_PER_IP': 'server.webSocket.security.maxConnectionsPerIp', + 'WS_SECURITY_MAX_REQUESTS_PER_MINUTE': 'server.webSocket.security.maxRequestsPerMinute', + 'WS_SECURITY_MAX_PAYLOAD': 'server.webSocket.security.maxPayload', + // SSL Configuration 'SSL_PATH_KEY': 'server.ssl.path.key', 'SSL_PATH_CERT': 'server.ssl.path.cert', @@ -63,6 +73,8 @@ module.exports = { // System Images Configuration 'ROUTER_IMAGE_1': 'systemImages.router.1', 'ROUTER_IMAGE_2': 'systemImages.router.2', + 'DEBUG_IMAGE_1': 'systemImages.debug.1', + 'DEBUG_IMAGE_2': 'systemImages.debug.2', // Diagnostics Configuration 'DIAGNOSTICS_DIRECTORY': 'diagnostics.directory', diff --git a/src/controllers/application-controller.js b/src/controllers/application-controller.js index a0dc79bba..dc3623143 100644 --- a/src/controllers/application-controller.js +++ b/src/controllers/application-controller.js @@ -49,6 +49,12 @@ const getApplicationEndPoint = async function (req) { return application } +const getSystemApplicationEndPoint = async function (req) { + const name = req.params.name + const application = await ApplicationService.getSystemApplicationEndPoint({ name }, false) + return application +} + const patchApplicationEndPoint = async function (req) { const application = req.body const name = req.params.name @@ -115,6 +121,7 @@ module.exports = { getApplicationsByUserEndPoint: (getApplicationsByUserEndPoint), getApplicationsBySystemEndPoint: (getApplicationsBySystemEndPoint), getApplicationEndPoint: (getApplicationEndPoint), + getSystemApplicationEndPoint: (getSystemApplicationEndPoint), getApplicationByIdEndPoint: (getApplicationByIdEndPoint), updateApplicationEndPoint: (updateApplicationEndPoint), updateApplicationYAMLEndPoint: (updateApplicationYAMLEndPoint), diff --git a/src/controllers/iofog-controller.js b/src/controllers/iofog-controller.js index b8f876acf..a89950f29 100644 --- a/src/controllers/iofog-controller.js +++ b/src/controllers/iofog-controller.js @@ -94,6 +94,23 @@ async function setFogPruneCommandEndPoint (req) { return FogService.setFogPruneCommandEndPoint(fog, false) } +async function enableNodeExecEndPoint (req) { + const execData = { + uuid: req.params.uuid, + image: req.body.image + } + + return FogService.enableNodeExecEndPoint(execData, false) +} + +async function disableNodeExecEndPoint (req) { + const fogData = { + uuid: req.params.uuid + } + + return FogService.disableNodeExecEndPoint(fogData, false) +} + module.exports = { createFogEndPoint: (createFogEndPoint), updateFogEndPoint: (updateFogEndPoint), @@ -105,5 +122,7 @@ module.exports = { setFogRebootCommandEndPoint: (setFogRebootCommandEndPoint), getHalHardwareInfoEndPoint: (getHalHardwareInfoEndPoint), getHalUsbInfoEndPoint: (getHalUsbInfoEndPoint), - setFogPruneCommandEndPoint: (setFogPruneCommandEndPoint) + setFogPruneCommandEndPoint: (setFogPruneCommandEndPoint), + enableNodeExecEndPoint: (enableNodeExecEndPoint), + disableNodeExecEndPoint: (disableNodeExecEndPoint) } diff --git a/src/controllers/microservices-controller.js b/src/controllers/microservices-controller.js index fc8418c2b..c599fbb54 100644 --- a/src/controllers/microservices-controller.js +++ b/src/controllers/microservices-controller.js @@ -32,6 +32,11 @@ const getMicroserviceEndPoint = async function (req) { return MicroservicesService.getMicroserviceEndPoint(microserviceUuid, false) } +const getSystemMicroserviceEndPoint = async function (req) { + const microserviceUuid = req.params.uuid + return MicroservicesService.getSystemMicroserviceEndPoint(microserviceUuid, false) +} + const listMicroserviceByPubTagEndPoint = async function (req) { const pubTag = req.params.tag return MicroservicesService.listMicroserviceByPubTagEndPoint(pubTag) @@ -72,6 +77,14 @@ const updateMicroserviceYAMLEndPoint = async function (req) { return MicroservicesService.updateMicroserviceEndPoint(microserviceUuid, microservice, false) } +const updateSystemMicroserviceYAMLEndPoint = async function (req) { + const microserviceUuid = req.params.uuid + const fileContent = req.file.buffer.toString() + const microservice = await YAMLParserService.parseMicroserviceFile(fileContent) + await rvaluesVarSubstition(microservice, { self: microservice }) + return MicroservicesService.updateSystemMicroserviceEndPoint(microserviceUuid, microservice, false) +} + const deleteMicroserviceEndPoint = async function (req) { const microserviceUuid = req.params.uuid const microserviceData = req.body || {} @@ -86,6 +99,14 @@ const getMicroservicesByApplicationEndPoint = async function (req) { return MicroservicesService.listMicroservicesEndPoint({ applicationName, flowId }, false) } +const getSystemMicroservicesByApplicationEndPoint = async function (req) { + // API Retro compatibility + const flowId = req.query.flowId + + const applicationName = req.query.application + return MicroservicesService.listSystemMicroservicesEndPoint({ applicationName, flowId }, false) +} + const createMicroserviceRouteEndPoint = async function (req) { const sourceUuid = req.params.uuid const destUuid = req.params.receiverUuid @@ -191,6 +212,7 @@ const deleteSystemMicroserviceExecEndPoint = async function (req) { module.exports = { createMicroserviceOnFogEndPoint: (createMicroserviceOnFogEndPoint), getMicroserviceEndPoint: (getMicroserviceEndPoint), + getSystemMicroserviceEndPoint: (getSystemMicroserviceEndPoint), listMicroserviceByPubTagEndPoint: (listMicroserviceByPubTagEndPoint), listMicroserviceBySubTagEndPoint: (listMicroserviceBySubTagEndPoint), updateMicroserviceEndPoint: (updateMicroserviceEndPoint), @@ -199,6 +221,7 @@ module.exports = { rebuildSystemMicroserviceEndPoint: (rebuildSystemMicroserviceEndPoint), deleteMicroserviceEndPoint: (deleteMicroserviceEndPoint), getMicroservicesByApplicationEndPoint: (getMicroservicesByApplicationEndPoint), + getSystemMicroservicesByApplicationEndPoint: (getSystemMicroservicesByApplicationEndPoint), createMicroserviceRouteEndPoint: (createMicroserviceRouteEndPoint), deleteMicroserviceRouteEndPoint: (deleteMicroserviceRouteEndPoint), createMicroservicePortMappingEndPoint: (createMicroservicePortMappingEndPoint), @@ -213,6 +236,7 @@ module.exports = { deleteSystemMicroserviceVolumeMappingEndPoint: (deleteSystemMicroserviceVolumeMappingEndPoint), createMicroserviceYAMLEndPoint: (createMicroserviceYAMLEndPoint), updateMicroserviceYAMLEndPoint: (updateMicroserviceYAMLEndPoint), + updateSystemMicroserviceYAMLEndPoint: (updateSystemMicroserviceYAMLEndPoint), createMicroserviceExecEndPoint: (createMicroserviceExecEndPoint), deleteMicroserviceExecEndPoint: (deleteMicroserviceExecEndPoint), createSystemMicroserviceExecEndPoint: (createSystemMicroserviceExecEndPoint), diff --git a/src/data/constants.js b/src/data/constants.js index 1d17f71eb..4c75fdb28 100644 --- a/src/data/constants.js +++ b/src/data/constants.js @@ -1,3 +1,4 @@ module.exports = { - ROUTER_CATALOG_NAME: 'Router' + ROUTER_CATALOG_NAME: 'Router', + DEBUG_CATALOG_NAME: 'Debug' } diff --git a/src/data/managers/microservice-exec-status-manager.js b/src/data/managers/microservice-exec-status-manager.js new file mode 100644 index 000000000..ff5edec7f --- /dev/null +++ b/src/data/managers/microservice-exec-status-manager.js @@ -0,0 +1,37 @@ +/* + * ******************************************************************************* + * * Copyright (c) 2023 Datasance Teknoloji A.S. + * * + * * This program and the accompanying materials are made available under the + * * terms of the Eclipse Public License v. 2.0 which is available at + * * http://www.eclipse.org/legal/epl-2.0 + * * + * * SPDX-License-Identifier: EPL-2.0 + * ******************************************************************************* + * + */ + +const BaseManager = require('./base-manager') +const models = require('../models') +const MicroserviceExecStatus = models.MicroserviceExecStatus + +const microserviceExecStatusExcludedFields = [ + 'id', + 'microservice_uuid', + 'microserviceUuid', + 'created_at', + 'updated_at' +] + +class MicroserviceExecStatusManager extends BaseManager { + getEntity () { + return MicroserviceExecStatus + } + + findAllExcludeFields (where, transaction) { + return this.findAllWithAttributes(where, { exclude: microserviceExecStatusExcludedFields }, transaction) + } +} + +const instance = new MicroserviceExecStatusManager() +module.exports = instance diff --git a/src/data/managers/microservice-manager.js b/src/data/managers/microservice-manager.js index 68ca789e7..6d361ef68 100644 --- a/src/data/managers/microservice-manager.js +++ b/src/data/managers/microservice-manager.js @@ -492,6 +492,36 @@ class MicroserviceManager extends BaseManager { }, { transaction: transaction }) } + async findAllSystemExcludeFields (where, transaction) { + return Microservice.findAll({ + include: [ + { + model: Application, + as: 'application', + required: true, + where: { isSystem: true } + }, + { + model: Tags, + as: 'pubTags', + attributes: ['value'], + through: { attributes: [] } + }, + { + model: Tags, + as: 'subTags', + attributes: ['value'], + through: { attributes: [] } + } + ], + where: where, + order: [['name', 'ASC']], + attributes: { + exclude: microserviceExcludedFields + } + }, { transaction: transaction }) + } + findOneWithCategory (where, transaction) { return Microservice.findOne({ include: [ diff --git a/src/data/migrations/mysql/db_migration_mysql_v1.0.2.sql b/src/data/migrations/mysql/db_migration_mysql_v1.0.2.sql index f3fed8960..e87893b12 100644 --- a/src/data/migrations/mysql/db_migration_mysql_v1.0.2.sql +++ b/src/data/migrations/mysql/db_migration_mysql_v1.0.2.sql @@ -771,7 +771,20 @@ ALTER TABLE Microservices ADD COLUMN pid_mode VARCHAR(32); ALTER TABLE Microservices ADD COLUMN ipc_mode VARCHAR(32); ALTER TABLE Microservices ADD COLUMN exec_enabled BOOLEAN DEFAULT false; -ALTER TABLE MicroserviceStatuses ADD COLUMN exec_session_id TEXT; +ALTER TABLE MicroserviceStatuses ADD COLUMN exec_session_ids TEXT; +ALTER TABLE Microservices ADD COLUMN schedule INT DEFAULT 50; + +CREATE TABLE IF NOT EXISTS MicroserviceExecStatuses ( + id INT AUTO_INCREMENT PRIMARY KEY NOT NULL, + status VARCHAR(255) DEFAULT 'PENDING', + exec_session_id VARCHAR(255), + microservice_uuid VARCHAR(32), + created_at DATETIME, + updated_at DATETIME, + FOREIGN KEY (microservice_uuid) REFERENCES Microservices (uuid) ON DELETE CASCADE +); + +CREATE INDEX idx_microservice_exec_status_microservice_uuid ON MicroserviceExecStatuses (microservice_uuid); COMMIT; \ No newline at end of file diff --git a/src/data/migrations/postgres/db_migration_pg_v1.0.2.sql b/src/data/migrations/postgres/db_migration_pg_v1.0.2.sql index 2a0c682a0..74cca3e7e 100644 --- a/src/data/migrations/postgres/db_migration_pg_v1.0.2.sql +++ b/src/data/migrations/postgres/db_migration_pg_v1.0.2.sql @@ -771,4 +771,18 @@ ALTER TABLE "Microservices" ADD COLUMN pid_mode VARCHAR(32); ALTER TABLE "Microservices" ADD COLUMN ipc_mode VARCHAR(32); ALTER TABLE "Microservices" ADD COLUMN exec_enabled BOOLEAN DEFAULT false; -ALTER TABLE "MicroserviceStatuses" ADD COLUMN exec_session_id TEXT; +ALTER TABLE "MicroserviceStatuses" ADD COLUMN exec_session_ids TEXT; + +ALTER TABLE "Microservices" ADD COLUMN schedule INT DEFAULT 50; + +CREATE TABLE IF NOT EXISTS "MicroserviceExecStatuses" ( + id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY NOT NULL, + status VARCHAR(255) DEFAULT 'PENDING', + exec_session_id VARCHAR(255), + microservice_uuid VARCHAR(32), + created_at TIMESTAMP(0), + updated_at TIMESTAMP(0), + FOREIGN KEY (microservice_uuid) REFERENCES "Microservices" (uuid) ON DELETE CASCADE +); + +CREATE INDEX idx_microservice_exec_status_microservice_uuid ON "MicroserviceExecStatuses" (microservice_uuid); diff --git a/src/data/migrations/sqlite/db_migration_sqlite_v1.0.2.sql b/src/data/migrations/sqlite/db_migration_sqlite_v1.0.2.sql index 42e98b3b9..75b56bf1e 100644 --- a/src/data/migrations/sqlite/db_migration_sqlite_v1.0.2.sql +++ b/src/data/migrations/sqlite/db_migration_sqlite_v1.0.2.sql @@ -758,4 +758,18 @@ ALTER TABLE Microservices ADD COLUMN pid_mode VARCHAR(32); ALTER TABLE Microservices ADD COLUMN ipc_mode VARCHAR(32); ALTER TABLE Microservices ADD COLUMN exec_enabled BOOLEAN DEFAULT false; -ALTER TABLE MicroserviceStatuses ADD COLUMN exec_session_id TEXT; \ No newline at end of file +ALTER TABLE MicroserviceStatuses ADD COLUMN exec_session_ids TEXT; + +ALTER TABLE Microservices ADD COLUMN schedule INT DEFAULT 50; + +CREATE TABLE IF NOT EXISTS MicroserviceExecStatuses ( + id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, + status VARCHAR(255) DEFAULT 'PENDING', + exec_session_id VARCHAR(255), + microservice_uuid VARCHAR(32), + created_at DATETIME, + updated_at DATETIME, + FOREIGN KEY (microservice_uuid) REFERENCES Microservices (uuid) ON DELETE CASCADE +); + +CREATE INDEX idx_microservice_exec_status_microservice_uuid ON MicroserviceExecStatuses (microservice_uuid); \ No newline at end of file diff --git a/src/data/models/index.js b/src/data/models/index.js index 483a3c8af..4eb51ae1b 100644 --- a/src/data/models/index.js +++ b/src/data/models/index.js @@ -71,6 +71,7 @@ db.initDB = async (isStart) => { // Configure system images const fogTypes = await db.FogType.findAll({}) await configureImage(db, constants.ROUTER_CATALOG_NAME, fogTypes, config.get('systemImages.router', {})) + await configureImage(db, constants.DEBUG_CATALOG_NAME, fogTypes, config.get('systemImages.debug', {})) } } diff --git a/src/data/models/microservice.js b/src/data/models/microservice.js index f414fa892..7806b3890 100644 --- a/src/data/models/microservice.js +++ b/src/data/models/microservice.js @@ -75,6 +75,11 @@ module.exports = (sequelize, DataTypes) => { field: 'ipc_mode', defaultValue: '' }, + schedule: { + type: DataTypes.INTEGER, + field: 'schedule', + defaultValue: 50 + }, imageSnapshot: { type: DataTypes.TEXT, field: 'image_snapshot', @@ -168,6 +173,11 @@ module.exports = (sequelize, DataTypes) => { as: 'microserviceStatus' }) + Microservice.hasOne(models.MicroserviceExecStatus, { + foreignKey: 'microservice_uuid', + as: 'microserviceExecStatus' + }) + Microservice.hasMany(models.MicroserviceEnv, { foreignKey: 'microservice_uuid', as: 'env' diff --git a/src/data/models/microserviceExecStatus.js b/src/data/models/microserviceExecStatus.js new file mode 100644 index 000000000..d9688405a --- /dev/null +++ b/src/data/models/microserviceExecStatus.js @@ -0,0 +1,36 @@ +'use strict' +module.exports = (sequelize, DataTypes) => { + const MicroserviceExecStatus = sequelize.define('MicroserviceExecStatus', { + id: { + type: DataTypes.INTEGER, + primaryKey: true, + autoIncrement: true, + allowNull: false, + field: 'id' + }, + status: { + type: DataTypes.TEXT, + field: 'status' + }, + execSessionId: { + type: DataTypes.TEXT, + field: 'exec_session_id' + } + }, { + tableName: 'MicroserviceExecStatuses', + // add the timestamp attributes (updatedAt, createdAt) + timestamps: true, + underscored: true + }) + MicroserviceExecStatus.associate = function (models) { + MicroserviceExecStatus.belongsTo(models.Microservice, { + foreignKey: { + name: 'microserviceUuid', + field: 'microservice_uuid' + }, + as: 'microservice', + onDelete: 'cascade' + }) + } + return MicroserviceExecStatus +} diff --git a/src/data/models/microservicestatus.js b/src/data/models/microservicestatus.js index fde870485..61a71b37f 100644 --- a/src/data/models/microservicestatus.js +++ b/src/data/models/microservicestatus.js @@ -66,10 +66,21 @@ module.exports = (sequelize, DataTypes) => { defaultValue: '', field: 'ip_address' }, - execSessionId: { + execSessionIds: { type: DataTypes.TEXT, - defaultValue: '', - field: 'exec_session_id' + defaultValue: '[]', + field: 'exec_session_ids', + get () { + const value = this.getDataValue('execSessionIds') + try { + return JSON.parse(value) + } catch (e) { + return [] + } + }, + set (value) { + this.setDataValue('execSessionIds', JSON.stringify(value)) + } } }, { tableName: 'MicroserviceStatuses', diff --git a/src/data/seeders/mysql/db_seeder_mysql_v1.0.2.sql b/src/data/seeders/mysql/db_seeder_mysql_v1.0.2.sql index c9e84aa97..62c66bc5b 100644 --- a/src/data/seeders/mysql/db_seeder_mysql_v1.0.2.sql +++ b/src/data/seeders/mysql/db_seeder_mysql_v1.0.2.sql @@ -11,7 +11,8 @@ VALUES ('RESTBlue', 'REST API for Bluetooth Low Energy layer.', 'SYSTEM', 'Datasance', 0, 0, 'none.png', NULL, true, 1), ('HAL', 'REST API for Hardware Abstraction layer.', 'SYSTEM', 'Datasance', 0, 0, 'none.png', NULL, true, 1), ('EdgeGuard', 'Security and monitoring component for edge devices running ioFog Agents.', 'UTILITIES', 'Datasance', 0, 0, 'none.png', NULL, true, 1), - ('Router', 'The built-in router for Datasance PoT.', 'SYSTEM', 'Datasance', 0, 0, 'none.png', NULL, false, 1); + ('Router', 'The built-in router for Datasance PoT.', 'SYSTEM', 'Datasance', 0, 0, 'none.png', NULL, false, 1), + ('Debug', 'The built-in debugger for Datasance PoT IoFog Agent.', 'SYSTEM', 'Datasance', 0, 0, 'none.png', NULL, false, 1); INSERT INTO `FogTypes` (id, name, image, description, network_catalog_item_id, hal_catalog_item_id, bluetooth_catalog_item_id) VALUES @@ -34,7 +35,9 @@ VALUES (4, 1, 'ghcr.io/datasance/edge-guard:latest'), (4, 2, 'ghcr.io/datasance/edge-guard:latest'), (5, 1, 'ghcr.io/datasance/router:latest'), - (5, 2, 'ghcr.io/datasance/router:latest'); + (5, 2, 'ghcr.io/datasance/router:latest'), + (6, 1, 'ghcr.io/datasance/node-debugger:latest'), + (6, 2, 'ghcr.io/datasance/node-debugger:latest'); COMMIT; \ No newline at end of file diff --git a/src/data/seeders/postgres/db_seeder_pg_v1.0.2.sql b/src/data/seeders/postgres/db_seeder_pg_v1.0.2.sql index 629a028ce..19a9ae043 100644 --- a/src/data/seeders/postgres/db_seeder_pg_v1.0.2.sql +++ b/src/data/seeders/postgres/db_seeder_pg_v1.0.2.sql @@ -11,7 +11,8 @@ VALUES ('RESTBlue', 'REST API for Bluetooth Low Energy layer.', 'SYSTEM', 'Datasance', 0, 0, 'none.png', NULL, true, 1), ('HAL', 'REST API for Hardware Abstraction layer.', 'SYSTEM', 'Datasance', 0, 0, 'none.png', NULL, true, 1), ('EdgeGuard', 'Security and monitoring component for edge devices running ioFog Agents.', 'UTILITIES', 'Datasance', 0, 0, 'none.png', NULL, true, 1), - ('Router', 'The built-in router for Datasance PoT.', 'SYSTEM', 'Datasance', 0, 0, 'none.png', NULL, false, 1); + ('Router', 'The built-in router for Datasance PoT.', 'SYSTEM', 'Datasance', 0, 0, 'none.png', NULL, false, 1), + ('Debug', 'The built-in debugger for Datasance PoT IoFog Agent.', 'SYSTEM', 'Datasance', 0, 0, 'none.png', NULL, false, 1); INSERT INTO "FogTypes" (id, name, image, description, network_catalog_item_id, hal_catalog_item_id, bluetooth_catalog_item_id) VALUES @@ -34,6 +35,8 @@ VALUES (4, 1, 'ghcr.io/datasance/edge-guard:latest'), (4, 2, 'ghcr.io/datasance/edge-guard:latest'), (5, 1, 'ghcr.io/datasance/router:latest'), - (5, 2, 'ghcr.io/datasance/router:latest'); + (5, 2, 'ghcr.io/datasance/router:latest'), + (6, 1, 'ghcr.io/datasance/node-debugger:latest'), + (6, 2, 'ghcr.io/datasance/node-debugger:latest'); COMMIT; \ No newline at end of file diff --git a/src/data/seeders/sqlite/db_seeder_sqlite_v1.0.2.sql b/src/data/seeders/sqlite/db_seeder_sqlite_v1.0.2.sql index 3835917c7..da57229f2 100644 --- a/src/data/seeders/sqlite/db_seeder_sqlite_v1.0.2.sql +++ b/src/data/seeders/sqlite/db_seeder_sqlite_v1.0.2.sql @@ -9,7 +9,8 @@ VALUES ('RESTBlue', 'REST API for Bluetooth Low Energy layer.', 'SYSTEM', 'Datasance', 0, 0, 'none.png', NULL, true, 1), ('HAL', 'REST API for Hardware Abstraction layer.', 'SYSTEM', 'Datasance', 0, 0, 'none.png', NULL, true, 1), ('EdgeGuard', 'Security and monitoring component for edge devices running ioFog Agents.', 'UTILITIES', 'Datasance', 0, 0, 'none.png', NULL, true, 1), - ('Router', 'The built-in router for Datasance PoT.', 'SYSTEM', 'Datasance', 0, 0, 'none.png', NULL, false, 1); + ('Router', 'The built-in router for Datasance PoT.', 'SYSTEM', 'Datasance', 0, 0, 'none.png', NULL, false, 1), + ('Debug', 'The built-in debugger for Datasance PoT IoFog Agent.', 'SYSTEM', 'Datasance', 0, 0, 'none.png', NULL, false, 1); INSERT INTO `FogTypes` (id, name, image, description, network_catalog_item_id, hal_catalog_item_id, bluetooth_catalog_item_id) VALUES @@ -32,4 +33,6 @@ VALUES (4, 1, 'ghcr.io/datasance/edge-guard:latest'), (4, 2, 'ghcr.io/datasance/edge-guard:latest'), (5, 1, 'ghcr.io/datasance/router:latest'), - (5, 2, 'ghcr.io/datasance/router:latest'); + (5, 2, 'ghcr.io/datasance/router:latest'), + (6, 1, 'ghcr.io/datasance/node-debugger:latest'), + (6, 2, 'ghcr.io/datasance/node-debugger:latest'); diff --git a/src/enums/fog-state.js b/src/enums/fog-state.js index 8c3a4d09b..2c7d712af 100644 --- a/src/enums/fog-state.js +++ b/src/enums/fog-state.js @@ -17,6 +17,7 @@ const fogState = { STOPPED: 'STOPPED', WAITING: 'WAITING', WARNING: 'WARNING', + DEBUGGING: 'DEBUGGING', DEPROVISIONED: 'DEPROVISIONED', ERROR: 'ERROR', NOT_PROVISIONED: 'NOT_PROVISIONED' diff --git a/src/enums/microservice-state.js b/src/enums/microservice-state.js index 6a596c408..ac985f44c 100644 --- a/src/enums/microservice-state.js +++ b/src/enums/microservice-state.js @@ -30,4 +30,10 @@ const microserviceState = { CREATING: 'CREATING' } -module.exports = microserviceState +const microserviceExecState = { + PENDING: 'PENDING', + ACTIVE: 'ACTIVE', + INACTIVE: 'INACTIVE' +} + +module.exports = { microserviceState, microserviceExecState } diff --git a/src/jobs/fog-status-job.js b/src/jobs/fog-status-job.js index 8842d1184..6f96ff7a0 100644 --- a/src/jobs/fog-status-job.js +++ b/src/jobs/fog-status-job.js @@ -16,8 +16,9 @@ const TransactionDecorator = require('../decorators/transaction-decorator') const FogManager = require('../data/managers/iofog-manager') const MicroserviceManager = require('../data/managers/microservice-manager') const MicroserviceStatusManager = require('../data/managers/microservice-status-manager') +const MicroserviceExecStatusManager = require('../data/managers/microservice-exec-status-manager') const MicroserviceService = require('../services/microservices-service') -const MicroserviceStates = require('../enums/microservice-state') +const { microserviceState, microserviceExecState } = require('../enums/microservice-state') const FogStates = require('../enums/fog-state') const Config = require('../config') @@ -64,7 +65,11 @@ async function _updateMicroserviceStatus (unknownFogUuids, transaction) { const microserviceStatusIds = microservices .filter((microservice) => microservice.microserviceStatus) .map((microservice) => microservice.microserviceStatus.id) - await MicroserviceStatusManager.update({ id: microserviceStatusIds }, { status: MicroserviceStates.UNKNOWN }, transaction) + const microserviceExecStatusIds = microservices + .filter((microservice) => microservice.microserviceExecStatus) + .map((microservice) => microservice.microserviceExecStatus.id) + await MicroserviceStatusManager.update({ id: microserviceStatusIds }, { status: microserviceState.UNKNOWN }, transaction) + await MicroserviceExecStatusManager.update({ id: microserviceExecStatusIds }, { execSesssionId: '', status: microserviceExecState.INACTIVE }, transaction) return microservices } diff --git a/src/jobs/stopped-app-status-job.js b/src/jobs/stopped-app-status-job.js index e6cf6f255..c31b77e84 100644 --- a/src/jobs/stopped-app-status-job.js +++ b/src/jobs/stopped-app-status-job.js @@ -15,7 +15,9 @@ const TransactionDecorator = require('../decorators/transaction-decorator') const MicroserviceManager = require('../data/managers/microservice-manager') const MicroserviceStatusManager = require('../data/managers/microservice-status-manager') -const MicroserviceStates = require('../enums/microservice-state') +const MicroserviceExecStatusManager = require('../data/managers/microservice-exec-status-manager') +const { microserviceState, microserviceExecState } = require('../enums/microservice-state') + const Config = require('../config') const ApplicationManager = require('../data/managers/application-manager') @@ -41,10 +43,19 @@ async function _updateMicroserviceStatusStopped (stoppedMicroservices, transacti const microserviceUuids = stoppedMicroservices.map((microservice) => microservice.uuid) const microservices = await MicroserviceManager.findAllWithStatuses({ uuid: microserviceUuids }, transaction) const microserviceStatusIds = microservices - .filter((microservice) => microservice.microserviceStatus && (microservice.microserviceStatus.status === MicroserviceStates.DELETED || - microservice.microserviceStatus.status === MicroserviceStates.DELETING)) + .filter((microservice) => microservice.microserviceStatus && (microservice.microserviceStatus.status === microserviceState.DELETED || + microservice.microserviceStatus.status === microserviceState.DELETING)) .map((microservice) => microservice.microserviceStatus.id) - await MicroserviceStatusManager.update({ id: microserviceStatusIds }, { status: MicroserviceStates.STOPPED }, transaction) + const microserviceExecStatusIds = microservices + .filter((microservice) => + microservice.microserviceStatus && + (microservice.microserviceStatus.status === microserviceState.DELETED || + microservice.microserviceStatus.status === microserviceState.DELETING) && + microservice.microserviceExecStatus + ) + .map((microservice) => microservice.microserviceExecStatus.id) + await MicroserviceStatusManager.update({ id: microserviceStatusIds }, { status: microserviceState.STOPPED }, transaction) + await MicroserviceExecStatusManager.update({ id: microserviceExecStatusIds }, { execSesssionId: '', status: microserviceExecState.INACTIVE }, transaction) return microservices } diff --git a/src/routes/agent.js b/src/routes/agent.js index 9196b4e5d..ccfa6a7b7 100644 --- a/src/routes/agent.js +++ b/src/routes/agent.js @@ -14,7 +14,7 @@ const constants = require('../helpers/constants') const AgentController = require('../controllers/agent-controller') const ResponseDecorator = require('../decorators/response-decorator') - +const WebSocketServer = require('../websocket/server') const Errors = require('../helpers/errors') const logger = require('../logger') @@ -638,5 +638,48 @@ module.exports = [ logger.apiRes({ req: req, res: res, responseObject: responseObject }) } + }, + { + method: 'ws', + path: '/api/v3/agent/exec/:microserviceUuid', + middleware: async (ws, req) => { + logger.apiReq(req) + try { + const token = req.headers.authorization + if (!token) { + logger.error('WebSocket connection failed: Missing authentication token') + try { + ws.close(1008, 'Missing authentication token') + } catch (error) { + logger.error('Error closing WebSocket:' + JSON.stringify({ + error: error.message, + originalError: 'Missing authentication token' + })) + } + return + } + + // Initialize WebSocket connection for agent + const wsServer = WebSocketServer.getInstance() + await wsServer.handleConnection(ws, req) + } catch (error) { + logger.error('Error in agent WebSocket connection:' + JSON.stringify({ + error: error.message, + stack: error.stack, + url: req.url, + microserviceUuid: req.params.microserviceUuid + })) + try { + if (ws.readyState === ws.OPEN) { + ws.close(1008, error.message || 'Authentication failed') + } + } catch (closeError) { + logger.error('Error closing agent WebSocket:' + JSON.stringify({ + error: closeError.message, + originalError: error.message + })) + } + } + } } ] diff --git a/src/routes/application.js b/src/routes/application.js index 0a6e6f60c..3feb7c945 100644 --- a/src/routes/application.js +++ b/src/routes/application.js @@ -173,6 +173,39 @@ module.exports = [ }) } }, + { + method: 'get', + path: '/api/v3/application/system/:name', + middleware: async (req, res) => { + logger.apiReq(req) + + const successCode = constants.HTTP_CODE_SUCCESS + const errorCodes = [ + { + code: constants.HTTP_CODE_UNAUTHORIZED, + errors: [Errors.AuthenticationError] + }, + { + code: constants.HTTP_CODE_NOT_FOUND, + errors: [Errors.NotFoundError] + } + ] + + const getSystemApplicationEndPoint = ResponseDecorator.handleErrors(ApplicationController.getSystemApplicationEndPoint, successCode, errorCodes) + + // Add keycloak.protect() middleware to protect the route + await keycloak.protect(['SRE', 'Developer', 'Viewer'])(req, res, async () => { + const responseObject = await getSystemApplicationEndPoint(req) + const user = req.kauth.grant.access_token.content.preferred_username + res + .status(responseObject.code) + .send(responseObject.body) + + logger.apiRes({ req: req, user: user, res: res, responseObject: responseObject }) + return null + }) + } + }, { method: 'patch', path: '/api/v3/application/:name', diff --git a/src/routes/iofog.js b/src/routes/iofog.js index 73ab91ac7..aae10cab6 100644 --- a/src/routes/iofog.js +++ b/src/routes/iofog.js @@ -372,6 +372,76 @@ module.exports = [ .status(responseObject.code) .send(responseObject.body) + logger.apiRes({ req: req, user: user, res: res, responseObject: responseObject }) + }) + } + }, + { + method: 'post', + path: '/api/v3/iofog/:uuid/exec', + middleware: async (req, res) => { + logger.apiReq(req) + + const successCode = constants.HTTP_CODE_NO_CONTENT + const errCodes = [ + { + code: 400, + errors: [Errors.ValidationError] + }, + { + code: 401, + errors: [Errors.AuthenticationError] + }, + { + code: 404, + errors: [Errors.NotFoundError] + } + ] + + await keycloak.protect(['SRE'])(req, res, async () => { + const enableNodeExecEndPoint = ResponseDecorator.handleErrors(FogController.enableNodeExecEndPoint, + successCode, errCodes) + const responseObject = await enableNodeExecEndPoint(req) + const user = req.kauth.grant.access_token.content.preferred_username + res + .status(responseObject.code) + .send(responseObject.body) + + logger.apiRes({ req: req, user: user, res: res, responseObject: responseObject }) + }) + } + }, + { + method: 'delete', + path: '/api/v3/iofog/:uuid/exec', + middleware: async (req, res) => { + logger.apiReq(req) + + const successCode = constants.HTTP_CODE_NO_CONTENT + const errCodes = [ + { + code: 400, + errors: [Errors.ValidationError] + }, + { + code: 401, + errors: [Errors.AuthenticationError] + }, + { + code: 404, + errors: [Errors.NotFoundError] + } + ] + + await keycloak.protect(['SRE'])(req, res, async () => { + const disableNodeExecEndPoint = ResponseDecorator.handleErrors(FogController.disableNodeExecEndPoint, + successCode, errCodes) + const responseObject = await disableNodeExecEndPoint(req) + const user = req.kauth.grant.access_token.content.preferred_username + res + .status(responseObject.code) + .send(responseObject.body) + logger.apiRes({ req: req, user: user, res: res, responseObject: responseObject }) }) } diff --git a/src/routes/microservices.js b/src/routes/microservices.js index 7c1d1f029..b0b08a5f5 100644 --- a/src/routes/microservices.js +++ b/src/routes/microservices.js @@ -16,6 +16,7 @@ const ResponseDecorator = require('../decorators/response-decorator') const Errors = require('../helpers/errors') const logger = require('../logger') const keycloak = require('../config/keycloak.js').initKeycloak() +const WebSocketServer = require('../websocket/server') module.exports = [ { @@ -45,6 +46,33 @@ module.exports = [ }) } }, + { + method: 'get', + path: '/api/v3/microservices/system', + middleware: async (req, res) => { + logger.apiReq(req) + + const successCode = constants.HTTP_CODE_SUCCESS + const errorCodes = [ + { + code: constants.HTTP_CODE_UNAUTHORIZED, + errors: [Errors.AuthenticationError] + } + ] + + await keycloak.protect(['SRE', 'Developer', 'Viewer'])(req, res, async () => { + const getSystemMicroservicesByApplicationEndPoint = ResponseDecorator.handleErrors(MicroservicesController.getSystemMicroservicesByApplicationEndPoint, + successCode, errorCodes) + const responseObject = await getSystemMicroservicesByApplicationEndPoint(req) + const user = req.kauth.grant.access_token.content.preferred_username + res + .status(responseObject.code) + .send(responseObject.body) + + logger.apiRes({ req: req, user: user, res: res, responseObject: responseObject }) + }) + } + }, { method: 'post', path: '/api/v3/microservices', @@ -141,6 +169,37 @@ module.exports = [ }) } }, + { + method: 'get', + path: '/api/v3/microservices/system/:uuid', + middleware: async (req, res) => { + logger.apiReq(req) + + const successCode = constants.HTTP_CODE_SUCCESS + const errorCodes = [ + { + code: constants.HTTP_CODE_UNAUTHORIZED, + errors: [Errors.AuthenticationError] + }, + { + code: constants.HTTP_CODE_NOT_FOUND, + errors: [Errors.NotFoundError] + } + ] + + await keycloak.protect(['SRE', 'Developer', 'Viewer'])(req, res, async () => { + const getSystemMicroserviceEndPoint = ResponseDecorator.handleErrors(MicroservicesController.getSystemMicroserviceEndPoint, + successCode, errorCodes) + const responseObject = await getSystemMicroserviceEndPoint(req) + const user = req.kauth.grant.access_token.content.preferred_username + res + .status(responseObject.code) + .send(responseObject.body) + + logger.apiRes({ req: req, user: user, res: res, responseObject: responseObject }) + }) + } + }, { method: 'get', path: '/api/v3/microservices/pub/:tag', @@ -382,6 +441,43 @@ module.exports = [ }) } }, + { + method: 'patch', + path: '/api/v3/microservices/system/yaml/:uuid', + supportSubstitution: true, + fileInput: 'microservice', + middleware: async (req, res) => { + logger.apiReq(req) + + const successCode = constants.HTTP_CODE_NO_CONTENT + const errorCodes = [ + { + code: constants.HTTP_CODE_BAD_REQUEST, + errors: [Errors.ValidationError] + }, + { + code: constants.HTTP_CODE_UNAUTHORIZED, + errors: [Errors.AuthenticationError] + }, + { + code: constants.HTTP_CODE_NOT_FOUND, + errors: [Errors.NotFoundError] + } + ] + + await keycloak.protect(['SRE'])(req, res, async () => { + const updateSystemMicroserviceYAMLEndPoint = ResponseDecorator.handleErrors(MicroservicesController.updateSystemMicroserviceYAMLEndPoint, + successCode, errorCodes) + const responseObject = await updateSystemMicroserviceYAMLEndPoint(req) + const user = req.kauth.grant.access_token.content.preferred_username + res + .status(responseObject.code) + .send(responseObject.body) + + logger.apiRes({ req: req, user: user, res: res, responseObject: responseObject }) + }) + } + }, { method: 'delete', path: '/api/v3/microservices/:uuid', @@ -984,4 +1080,47 @@ module.exports = [ }) } }, + { + method: 'ws', + path: '/api/v3/microservices/exec/:microserviceUuid', + middleware: async (ws, req) => { + logger.apiReq(req) + try { + const token = req.headers.authorization + if (!token) { + logger.error('WebSocket connection failed: Missing authentication token') + try { + ws.close(1008, 'Missing authentication token') + } catch (error) { + logger.error('Error closing WebSocket:' + JSON.stringify({ + error: error.message, + originalError: 'Missing authentication token' + })) + } + return + } + + // Initialize WebSocket connection for microservice + const wsServer = WebSocketServer.getInstance() + await wsServer.handleConnection(ws, req) + } catch (error) { + logger.error('Error in microservice WebSocket connection:' + JSON.stringify({ + error: error.message, + stack: error.stack, + url: req.url, + microserviceUuid: req.params.microserviceUuid + })) + try { + if (ws.readyState === ws.OPEN) { + ws.close(1008, error.message || 'Authentication failed') + } + } catch (closeError) { + logger.error('Error closing microservice WebSocket:' + JSON.stringify({ + error: closeError.message, + originalError: error.message + })) + } + } + } + } ] diff --git a/src/schemas/agent.js b/src/schemas/agent.js index e42787db0..cf4e6c9c0 100644 --- a/src/schemas/agent.js +++ b/src/schemas/agent.js @@ -145,7 +145,7 @@ const microserviceStatus = { 'memoryUsage': { 'type': 'number' }, 'ipAddress': { 'type': 'string' }, 'ipAddressExternal': { 'type': 'string' }, - 'execSessionId': { 'type': 'string' } + 'execSessionIds': { 'type': 'array', 'items': { 'type': 'string' } } }, 'required': ['id'], 'additionalProperties': true diff --git a/src/schemas/iofog.js b/src/schemas/iofog.js index ca423c12a..eaf608bc9 100644 --- a/src/schemas/iofog.js +++ b/src/schemas/iofog.js @@ -46,13 +46,6 @@ const iofogCreate = { 'messagingPort': { 'type': 'integer', 'minimum': 1, 'maximum': 65535 }, 'interRouterPort': { 'type': 'integer', 'minimum': 1, 'maximum': 65535 }, 'edgeRouterPort': { 'type': 'integer', 'minimum': 1, 'maximum': 65535 }, - 'requireSsl': { 'type': 'string' }, - 'sslProfile': { 'type': 'string' }, - 'saslMechanisms': { 'type': 'string' }, - 'authenticatePeer': { 'type': 'string' }, - 'caCert': { 'type': 'string' }, - 'tlsCert': { 'type': 'string' }, - 'tlsKey': { 'type': 'string' }, 'host': { 'type': 'string' }, 'tags': { 'type': 'array', @@ -118,13 +111,6 @@ const iofogUpdate = { 'messagingPort': { 'type': 'integer', 'minimum': 1, 'maximum': 65535 }, 'interRouterPort': { 'type': 'integer', 'minimum': 1, 'maximum': 65535 }, 'edgeRouterPort': { 'type': 'integer', 'minimum': 1, 'maximum': 65535 }, - 'requireSsl': { 'type': 'string' }, - 'sslProfile': { 'type': 'string' }, - 'saslMechanisms': { 'type': 'string' }, - 'authenticatePeer': { 'type': 'string' }, - 'caCert': { 'type': 'string' }, - 'tlsCert': { 'type': 'string' }, - 'tlsKey': { 'type': 'string' }, 'host': { 'type': 'string' }, 'upstreamRouters': { 'type': 'array', @@ -277,9 +263,30 @@ const iofogTag = { 'type': 'string' } +const enableNodeExec = { + 'id': '/enableNodeExec', + 'type': 'object', + 'properties': { + 'uuid': { 'type': 'string' }, + 'image': { 'type': 'string' } + }, + 'required': ['uuid'], + 'additionalProperties': true +} + +const disableNodeExec = { + 'id': '/disableNodeExec', + 'type': 'object', + 'properties': { + 'uuid': { 'type': 'string' } + }, + 'required': ['uuid'], + 'additionalProperties': true +} + module.exports = { mainSchemas: [iofogCreate, iofogUpdate, iofogDelete, iofogGet, iofogGenerateProvision, iofogSetVersionCommand, - iofogReboot, iofogFilters, halGet, iofogPrune, defaultRouterCreate, iofogTag], + iofogReboot, iofogFilters, halGet, iofogPrune, defaultRouterCreate, iofogTag, enableNodeExec, disableNodeExec], innerSchemas: [filter, iofogTag] } diff --git a/src/schemas/microservice.js b/src/schemas/microservice.js index e3bed2744..44aacc3df 100644 --- a/src/schemas/microservice.js +++ b/src/schemas/microservice.js @@ -31,6 +31,11 @@ const microserviceCreate = { 'iofogUuid': { 'type': 'string' }, 'agentName': { 'type': 'string' }, 'rootHostAccess': { 'type': 'boolean' }, + 'schedule': { + 'type': 'integer', + 'minimum': 0, + 'maximum': 100 + }, 'logSize': { 'type': 'integer' }, 'imageSnapshot': { 'type': 'string' }, 'volumeMappings': { @@ -91,6 +96,11 @@ const microserviceUpdate = { 'agentName': { 'type': 'string' }, 'rootHostAccess': { 'type': 'boolean' }, 'logSize': { 'type': 'integer', 'minimum': 0 }, + 'schedule': { + 'type': 'integer', + 'minimum': 0, + 'maximum': 100 + }, 'volumeMappings': { 'type': 'array', 'items': { '$ref': '/volumeMappings' } diff --git a/src/server.js b/src/server.js index 2d180fbab..30ad6b035 100755 --- a/src/server.js +++ b/src/server.js @@ -18,6 +18,7 @@ initialize().then(() => { const logger = require('./logger') const db = require('./data/models') const CleanupService = require('./services/cleanup-service') + const WebSocketServer = require('./websocket/server') const bodyParser = require('body-parser') const cookieParser = require('cookie-parser') @@ -88,14 +89,21 @@ initialize().then(() => { global.appRoot = path.resolve(__dirname) const registerRoute = (route) => { - const middlewares = [route.middleware] - if (route.supportSubstitution) { - middlewares.unshift(substitutionMiddleware) - } - if (route.fileInput) { - middlewares.unshift(uploadFile(route.fileInput)) + if (route.method.toLowerCase() === 'ws') { + // Handle WebSocket routes by registering them with our custom WebSocket server + const wsServer = WebSocketServer.getInstance() + wsServer.registerRoute(route.path, route.middleware) + } else { + // Handle HTTP routes + const middlewares = [route.middleware] + if (route.supportSubstitution) { + middlewares.unshift(substitutionMiddleware) + } + if (route.fileInput) { + middlewares.unshift(uploadFile(route.fileInput)) + } + app[route.method.toLowerCase()](route.path, ...middlewares) } - app[route.method.toLowerCase()](route.path, ...middlewares) } const setupMiddleware = function (routeName) { @@ -145,6 +153,12 @@ initialize().then(() => { logger.info(`==> 🌎 API Listening on port ${ports.api}. Open up http://localhost:${ports.api}/ in your browser.`) jobs.forEach((job) => job.run()) }) + + // Initialize WebSocket server + const wsConfig = config.get('server.webSocket') + const wsServer = new WebSocketServer(wsConfig) + wsServer.initialize(apiServer) + logger.info(`==> 🌎 Webscoker API server listening on port ${ports.api}. Open up ws://localhost:${ports.api}/.`) registerServers(apiServer, viewerServer) } @@ -174,6 +188,13 @@ initialize().then(() => { logger.info(`==> 🌎 HTTPS API server listening on port ${ports.api}. Open up https://localhost:${ports.api}/ in your browser.`) jobs.forEach((job) => job.run()) }) + + // Initialize WebSocket server with SSL + const wsConfig = config.get('server.webSocket') + const wsServer = new WebSocketServer(wsConfig) + wsServer.initialize(apiServer) + logger.info(`==> 🌎 WSS API server listening on port ${ports.api}. Open up wss://localhost:${ports.api}/.`) + registerServers(apiServer, viewerServer) } catch (e) { logger.error('Error loading SSL certificates. Please check your configuration.') diff --git a/src/services/agent-service.js b/src/services/agent-service.js index 3d0d3bd45..fa0ff1d84 100644 --- a/src/services/agent-service.js +++ b/src/services/agent-service.js @@ -28,7 +28,8 @@ const FogVersionCommandManager = require('../data/managers/iofog-version-command const StraceManager = require('../data/managers/strace-manager') const RegistryManager = require('../data/managers/registry-manager') const MicroserviceStatusManager = require('../data/managers/microservice-status-manager') -const MicroserviceStates = require('../enums/microservice-state') +const MicroserviceExecStatusManager = require('../data/managers/microservice-exec-status-manager') +const { microserviceState, microserviceExecState } = require('../enums/microservice-state') const FogStates = require('../enums/fog-state') const Validator = require('../schemas') const Errors = require('../helpers/errors') @@ -104,7 +105,13 @@ const agentDeprovision = async function (deprovisionData, fog, transaction) { await MicroserviceStatusManager.update( { microserviceUuid: deprovisionData.microserviceUuids }, - { status: MicroserviceStates.DELETING }, + { status: microserviceState.DELETING }, + transaction + ) + + await MicroserviceExecStatusManager.update( + { microserviceUuid: deprovisionData.microserviceUuids }, + { status: microserviceExecState.INACTIVE }, transaction ) @@ -290,7 +297,7 @@ const _updateMicroserviceStatuses = async function (microserviceStatus, fog, tra percentage: status.percentage, errorMessage: status.errorMessage, ipAddress: status.ipAddress, - execSessionId: status.execSessionId + execSessionIds: status.execSessionIds } microserviceStatus = AppHelper.deleteUndefinedFields(microserviceStatus) const microservice = await MicroserviceManager.findOne({ @@ -368,7 +375,8 @@ const getAgentMicroservices = async function (fog, transaction) { routes, isConsumer, isRouter, - execEnabled: microservice.execEnabled + execEnabled: microservice.execEnabled, + schedule: microservice.schedule } response.push(responseMicroservice) diff --git a/src/services/application-service.js b/src/services/application-service.js index 4b806ebc6..4e0aee1ae 100644 --- a/src/services/application-service.js +++ b/src/services/application-service.js @@ -344,6 +344,20 @@ async function getApplication (conditions, isCLI, transaction) { return application } +async function getSystemApplication (conditions, isCLI, transaction) { + const where = isCLI + ? { ...conditions, isSystem: true } + : { ...conditions, isSystem: true } + const attributes = { exclude: ['created_at', 'updated_at'] } + + const applicationRaw = await ApplicationManager.findOnePopulated(where, attributes, transaction) + if (!applicationRaw) { + throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.INVALID_FLOW_ID, conditions.name || conditions.id)) + } + const application = await _buildApplicationObject(applicationRaw, transaction) + return application +} + const getApplicationEndPoint = async function (conditions, isCLI, transaction) { const application = await getApplication(conditions, isCLI, transaction) return application @@ -362,6 +376,10 @@ const _checkForDuplicateName = async function (name, applicationId, transaction) } } +const getSystemApplicationEndPoint = async function (conditions, isCLI, transaction) { + const application = await getSystemApplication(conditions, isCLI, transaction) + return application +} async function _updateChangeTrackingsAndDeleteMicroservicesByApplicationId (conditions, deleteMicroservices, transaction) { const microservices = await ApplicationManager.findApplicationMicroservices(conditions, transaction) if (!microservices) { @@ -392,5 +410,7 @@ module.exports = { getSystemApplicationsEndPoint: TransactionDecorator.generateTransaction(getSystemApplicationsEndPoint), getAllApplicationsEndPoint: TransactionDecorator.generateTransaction(getAllApplicationsEndPoint), getApplicationEndPoint: TransactionDecorator.generateTransaction(getApplicationEndPoint), - getApplication: getApplication + getSystemApplicationEndPoint: TransactionDecorator.generateTransaction(getSystemApplicationEndPoint), + getApplication: getApplication, + getSystemApplication: getSystemApplication } diff --git a/src/services/catalog-service.js b/src/services/catalog-service.js index 5c0b7883c..ae0be7db2 100644 --- a/src/services/catalog-service.js +++ b/src/services/catalog-service.js @@ -60,9 +60,10 @@ const updateCatalogItemEndPoint = async function (id, data, isCLI, transaction) const listCatalogItemsEndPoint = async function (isCLI, transaction) { const where = isCLI ? {} - : { - [Op.or]: [{ category: { [Op.ne]: 'SYSTEM' } }, { category: null }] - } + // : { + // [Op.or]: [{ category: { [Op.ne]: 'SYSTEM' } }, { category: null }] + // } + : {} const attributes = isCLI ? {} @@ -77,10 +78,11 @@ const listCatalogItemsEndPoint = async function (isCLI, transaction) { async function getCatalogItem (id, isCLI, transaction) { const where = isCLI ? { id: id } - : { - id: id, - [Op.or]: [{ category: { [Op.ne]: 'SYSTEM' } }, { category: null }] - } + // : { + // id: id, + // [Op.or]: [{ category: { [Op.ne]: 'SYSTEM' } }, { category: null }] + // } + : { id: id } const attributes = isCLI ? {} @@ -161,6 +163,15 @@ async function getProxyCatalogItem (transaction) { }, transaction) } +async function getDebugCatalogItem (transaction) { + return CatalogItemManager.findOne({ + name: DBConstants.DEBUG_CATALOG_NAME, + category: 'SYSTEM', + publisher: 'Datasance', + registry_id: 1 + }, transaction) +} + async function getBluetoothCatalogItem (transaction) { return CatalogItemManager.findOne({ name: 'RESTBlue', @@ -379,5 +390,6 @@ module.exports = { getBluetoothCatalogItem: getBluetoothCatalogItem, getHalCatalogItem: getHalCatalogItem, getRouterCatalogItem: getRouterCatalogItem, + getDebugCatalogItem: getDebugCatalogItem, getProxyCatalogItem: getProxyCatalogItem } diff --git a/src/services/iofog-service.js b/src/services/iofog-service.js index a4ffbf31e..2c8853cdb 100644 --- a/src/services/iofog-service.js +++ b/src/services/iofog-service.js @@ -33,7 +33,9 @@ const EdgeResourceService = require('./edge-resource-service') const RouterManager = require('../data/managers/router-manager') const MicroserviceExtraHostManager = require('../data/managers/microservice-extra-host-manager') const MicroserviceStatusManager = require('../data/managers/microservice-status-manager') +const MicroserviceExecStatusManager = require('../data/managers/microservice-exec-status-manager') const RouterConnectionManager = require('../data/managers/router-connection-manager') +const CatalogItemImageManager = require('../data/managers/catalog-item-image-manager') const RouterService = require('./router-service') const Constants = require('../helpers/constants') const Op = require('sequelize').Op @@ -683,7 +685,7 @@ async function _deleteFogRouter (fogData, transaction) { // Delete router msvc const routerCatalog = await CatalogService.getRouterCatalogItem(transaction) await MicroserviceManager.delete({ catalogItemId: routerCatalog.id, iofogUuid: fogData.uuid }, transaction) - await ApplicationManager.delete({ name: `system-${fogData.uuid.toLowerCase()}` }, transaction) + // await ApplicationManager.delete({ name: `system-${fogData.uuid.toLowerCase()}` }, transaction) } async function deleteFogEndPoint (fogData, isCLI, transaction) { @@ -858,7 +860,7 @@ async function generateProvisioningKeyEndPoint (fogData, isCLI, transaction) { const newProvision = { iofogUuid: fogData.uuid, - provisionKey: AppHelper.generateRandomString(16), + provisionKey: AppHelper.generateUUID(), expirationTime: new Date().getTime() + (10 * 60 * 1000) } @@ -1024,13 +1026,26 @@ async function _createHalMicroserviceForFog (fogData, oldFog, transaction) { iofogUuid: fogData.uuid, rootHostAccess: true, logSize: Constants.MICROSERVICE_DEFAULT_LOG_SIZE, + schedule: 1, configLastUpdated: Date.now() } - const application = await ApplicationManager.findOne({ name: `system-${fogData.uuid.toLowerCase()}` }, transaction) + let application + try { + application = await ApplicationManager.findOne({ name: `system-${fogData.uuid.toLowerCase()}` }, transaction) + } catch (error) { + const systemApplicationData = { + name: `system-${fogData.uuid.toLowerCase()}`, + isActivated: true, + isSystem: true + } + await ApplicationManager.create(systemApplicationData, transaction) + application = await ApplicationManager.findOne({ name: `system-${fogData.uuid.toLowerCase()}` }, transaction) + } halMicroserviceData.applicationId = application.id await MicroserviceManager.create(halMicroserviceData, transaction) await MicroserviceStatusManager.create({ microserviceUuid: halMicroserviceData.uuid }, transaction) + await MicroserviceExecStatusManager.create({ microserviceUuid: halMicroserviceData.uuid }, transaction) } async function _deleteHalMicroserviceByFog (fogData, transaction) { @@ -1056,13 +1071,26 @@ async function _createBluetoothMicroserviceForFog (fogData, oldFog, transaction) iofogUuid: fogData.uuid, rootHostAccess: true, logSize: Constants.MICROSERVICE_DEFAULT_LOG_SIZE, + schedule: 1, configLastUpdated: Date.now() } - const application = await ApplicationManager.findOne({ name: `system-${fogData.uuid.toLowerCase()}` }, transaction) + let application + try { + application = await ApplicationManager.findOne({ name: `system-${fogData.uuid.toLowerCase()}` }, transaction) + } catch (error) { + const systemApplicationData = { + name: `system-${fogData.uuid.toLowerCase()}`, + isActivated: true, + isSystem: true + } + await ApplicationManager.create(systemApplicationData, transaction) + application = await ApplicationManager.findOne({ name: `system-${fogData.uuid.toLowerCase()}` }, transaction) + } bluetoothMicroserviceData.applicationId = application.id await MicroserviceManager.create(bluetoothMicroserviceData, transaction) await MicroserviceStatusManager.create({ microserviceUuid: bluetoothMicroserviceData.uuid }, transaction) + await MicroserviceExecStatusManager.create({ microserviceUuid: bluetoothMicroserviceData.uuid }, transaction) } async function _deleteBluetoothMicroserviceByFog (fogData, transaction) { @@ -1090,6 +1118,140 @@ async function setFogPruneCommandEndPoint (fogData, isCLI, transaction) { await ChangeTrackingService.update(fogData.uuid, ChangeTrackingService.events.prune, transaction) } +async function enableNodeExecEndPoint (execData, isCLI, transaction) { + await Validator.validate(execData, Validator.schemas.enableNodeExec) + const fog = await FogManager.findOne({ uuid: execData.uuid }, transaction) + if (!fog) { + throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.INVALID_IOFOG_UUID, execData.uuid)) + } + + const debugMicroserviceData = { + uuid: AppHelper.generateUUID(), + name: `debug-${execData.uuid.toLowerCase()}`, + config: '{}', + iofogUuid: execData.uuid, + ipcMode: 'host', + pidMode: 'host', + rootHostAccess: true, + logSize: Constants.MICROSERVICE_DEFAULT_LOG_SIZE, + schedule: 0, + execEnabled: true, + configLastUpdated: Date.now() + } + + if (execData.image) { + const images = [ + { fogTypeId: 1, containerImage: execData.image }, + { fogTypeId: 2, containerImage: execData.image } + ] + debugMicroserviceData.images = images + } else { + const debugCatalog = await CatalogService.getDebugCatalogItem(transaction) + debugMicroserviceData.catalogItemId = debugCatalog.id + } + + let application + try { + application = await ApplicationManager.findOne({ name: `system-${execData.uuid.toLowerCase()}` }, transaction) + } catch (error) { + const systemApplicationData = { + name: `system-${execData.uuid.toLowerCase()}`, + isActivated: true, + isSystem: true + } + await ApplicationManager.create(systemApplicationData, transaction) + application = await ApplicationManager.findOne({ name: `system-${execData.uuid.toLowerCase()}` }, transaction) + } + debugMicroserviceData.applicationId = application.id + let microservice + + // Check if microservice already exists + const existingMicroservice = await MicroserviceManager.findOneWithCategory({ name: `debug-${execData.uuid.toLowerCase()}` }, transaction) + + if (existingMicroservice) { + // Update existing microservice + const updateData = { + ipcMode: debugMicroserviceData.ipcMode, + pidMode: debugMicroserviceData.pidMode, + rootHostAccess: debugMicroserviceData.rootHostAccess, + logSize: debugMicroserviceData.logSize, + schedule: debugMicroserviceData.schedule, + configLastUpdated: debugMicroserviceData.configLastUpdated, + execEnabled: debugMicroserviceData.execEnabled + } + + if (execData.image) { + updateData.images = debugMicroserviceData.images + } else { + updateData.catalogItemId = debugMicroserviceData.images + } + + microservice = await MicroserviceManager.updateAndFind( + { uuid: existingMicroservice.uuid }, + updateData, + transaction + ) + + if (execData.image) { + const images = [ + { fogTypeId: 1, containerImage: execData.image }, + { fogTypeId: 2, containerImage: execData.image } + ] + await _updateImages(images, existingMicroservice.uuid, transaction) + } + + await ChangeTrackingService.update(execData.uuid, ChangeTrackingService.events.microserviceList, transaction) + await ChangeTrackingService.update(execData.uuid, ChangeTrackingService.events.microserviceExecSessions, transaction) + return microservice + } else { + // Create new microservice + try { + const microservice = await MicroserviceManager.create(debugMicroserviceData, transaction) + await MicroserviceStatusManager.create({ microserviceUuid: debugMicroserviceData.uuid }, transaction) + await MicroserviceExecStatusManager.create({ microserviceUuid: debugMicroserviceData.uuid }, transaction) + + if (execData.image) { + const images = [ + { fogTypeId: 1, containerImage: execData.image }, + { fogTypeId: 2, containerImage: execData.image } + ] + await _createMicroserviceImages(microservice, images, transaction) + } + + await ChangeTrackingService.update(execData.uuid, ChangeTrackingService.events.microserviceList, transaction) + await ChangeTrackingService.update(execData.uuid, ChangeTrackingService.events.microserviceExecSessions, transaction) + + return microservice + } catch (error) { + logger.error(`Error in enableNodeExecEndPoint: ${error.message}`) + throw error + } + } +} + +async function disableNodeExecEndPoint (fogData, isCLI, transaction) { + await Validator.validate(fogData, Validator.schemas.disableNodeExec) + + try { + const fog = await FogManager.findOne({ uuid: fogData.uuid }, transaction) + if (!fog) { + throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.INVALID_IOFOG_UUID, fogData.uuid)) + } + + const microservice = await MicroserviceManager.findOne({ name: `debug-${fogData.uuid.toLowerCase()}` }, transaction) + if (!microservice) { + throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.INVALID_MICROSERVICE_UUID, fogData.uuid)) + } + + await MicroserviceManager.delete({ uuid: microservice.uuid }, transaction) + await ChangeTrackingService.update(fogData.uuid, ChangeTrackingService.events.microserviceList, transaction) + await ChangeTrackingService.update(fogData.uuid, ChangeTrackingService.events.microserviceExecSessions, transaction) + } catch (error) { + logger.error(`Error in disableNodeExecEndPoint: ${error.message}`) + throw error + } +} + /** * Finds services that match the fog node's service tags * @param {Array} serviceTags - Array of service tags from fog node @@ -1219,6 +1381,23 @@ function _mergeTcpListener (routerConfig, listenerObj) { return routerConfig } +async function _createMicroserviceImages (microservice, images, transaction) { + const newImages = [] + for (const img of images) { + const newImg = Object.assign({}, img) + newImg.microserviceUuid = microservice.uuid + newImages.push(newImg) + } + return CatalogItemImageManager.bulkCreate(newImages, transaction) +} + +async function _updateImages (images, microserviceUuid, transaction) { + await CatalogItemImageManager.delete({ + microserviceUuid: microserviceUuid + }, transaction) + return _createMicroserviceImages({ uuid: microserviceUuid }, images, transaction) +} + module.exports = { createFogEndPoint: TransactionDecorator.generateTransaction(createFogEndPoint), updateFogEndPoint: TransactionDecorator.generateTransaction(updateFogEndPoint), @@ -1232,6 +1411,8 @@ module.exports = { getHalUsbInfoEndPoint: TransactionDecorator.generateTransaction(getHalUsbInfoEndPoint), getFog: getFog, setFogPruneCommandEndPoint: TransactionDecorator.generateTransaction(setFogPruneCommandEndPoint), + enableNodeExecEndPoint: TransactionDecorator.generateTransaction(enableNodeExecEndPoint), + disableNodeExecEndPoint: TransactionDecorator.generateTransaction(disableNodeExecEndPoint), _extractServiceTags, _findMatchingServices: TransactionDecorator.generateTransaction(_findMatchingServices), _buildTcpListenerForFog, diff --git a/src/services/microservices-service.js b/src/services/microservices-service.js index c98a918da..0e13993eb 100644 --- a/src/services/microservices-service.js +++ b/src/services/microservices-service.js @@ -14,6 +14,7 @@ const TransactionDecorator = require('../decorators/transaction-decorator') const MicroserviceManager = require('../data/managers/microservice-manager') const MicroserviceStatusManager = require('../data/managers/microservice-status-manager') +const MicroserviceExecStatusManager = require('../data/managers/microservice-exec-status-manager') const MicroserviceArgManager = require('../data/managers/microservice-arg-manager') const MicroserviceCdiDevManager = require('../data/managers/microservice-cdi-device-manager') const MicroserviceCapAddManager = require('../data/managers/microservice-cap-add-manager') @@ -99,6 +100,26 @@ async function listMicroservicesEndPoint (opt, isCLI, transaction) { } } +async function listSystemMicroservicesEndPoint (opt, isCLI, transaction) { + const { applicationName, flowId } = opt + let application = await _validateSystemApplication(applicationName, isCLI, transaction) + + if (flowId) { + // _validateApplication wil try by ID if it fails finding by name + application = await _validateSystemApplication(flowId, isCLI, transaction) + } + const where = application ? { applicationId: application.id, delete: false } : { delete: false, applicationId: { [Op.ne]: null } } + + const microservices = await MicroserviceManager.findAllSystemExcludeFields(where, transaction) + const res = await Promise.all(microservices.map(async (microservice) => { + return _buildGetMicroserviceResponse(microservice.dataValues, transaction) + })) + + return { + microservices: res + } +} + async function getMicroserviceEndPoint (microserviceUuid, isCLI, transaction) { if (!isCLI) { await _validateMicroserviceOnGet(microserviceUuid, transaction) @@ -115,6 +136,27 @@ async function getMicroserviceEndPoint (microserviceUuid, isCLI, transaction) { return _buildGetMicroserviceResponse(microservice.dataValues, transaction) } +async function getSystemMicroserviceEndPoint (microserviceUuid, isCLI, transaction) { + if (!isCLI) { + await _validateSystemMicroserviceOnGet(microserviceUuid, transaction) + } + + const microservice = await MicroserviceManager.findOneExcludeFields({ + uuid: microserviceUuid, delete: false + }, transaction) + + if (!microservice) { + throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.INVALID_MICROSERVICE_UUID, microserviceUuid)) + } + + const app = await ApplicationManager.findOne({ id: microservice.applicationId }, transaction) + if (!app.isSystem) { + throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.INVALID_MICROSERVICE_UUID, microserviceUuid)) + } + + return _buildGetMicroserviceResponse(microservice.dataValues, transaction) +} + function _validateImagesAgainstCatalog (catalogItem, images) { const allImagesEmpty = images.reduce((result, b) => result && b.containerImage === '', true) if (allImagesEmpty) { @@ -385,6 +427,7 @@ async function createMicroserviceEndPoint (microserviceData, isCLI, transaction) } await _createMicroserviceStatus(microservice, transaction) + await _createMicroserviceExecStatus(microservice, transaction) const res = { uuid: microservice.uuid, @@ -469,6 +512,7 @@ async function updateSystemMicroserviceEndPoint (microserviceUuid, microserviceD rebuild: microserviceData.rebuild, iofogUuid: newFog.uuid, rootHostAccess: microserviceData.rootHostAccess, + schedule: microserviceData.schedule, pidMode: microserviceData.pidMode, ipcMode: microserviceData.ipcMode, cdiDevices: microserviceData.cdiDevices, @@ -599,6 +643,7 @@ async function updateSystemMicroserviceEndPoint (microserviceUuid, microserviceD microserviceDataUpdate.runtime || microserviceDataUpdate.volumeMappings || microserviceDataUpdate.ports || + microserviceDataUpdate.schedule || extraHosts ) const updatedMicroservice = await MicroserviceManager.updateAndFind(query, microserviceDataUpdate, transaction) @@ -692,6 +737,7 @@ async function updateMicroserviceEndPoint (microserviceUuid, microserviceData, i rebuild: microserviceData.rebuild, iofogUuid: newFog.uuid, rootHostAccess: microserviceData.rootHostAccess, + schedule: microserviceData.schedule, pidMode: microserviceData.pidMode, ipcMode: microserviceData.ipcMode, cdiDevices: microserviceData.cdiDevices, @@ -826,6 +872,7 @@ async function updateMicroserviceEndPoint (microserviceUuid, microserviceData, i microserviceDataUpdate.runtime || microserviceDataUpdate.volumeMappings || microserviceDataUpdate.ports || + microserviceDataUpdate.schedule || extraHosts ) const updatedMicroservice = await MicroserviceManager.updateAndFind(query, microserviceDataUpdate, transaction) @@ -1484,6 +1531,7 @@ async function _createMicroservice (microserviceData, isCLI, transaction) { platform: microserviceData.platform, runtime: microserviceData.runtime, registryId: microserviceData.registryId || 1, + schedule: microserviceData.schedule || 50, logSize: (microserviceData.logSize || constants.MICROSERVICE_DEFAULT_LOG_SIZE) * 1 } @@ -1539,12 +1587,44 @@ async function _validateApplication (name, isCLI, transaction) { return application } +async function _validateSystemApplication (name, isCLI, transaction) { + if (!name) { + return null + } + + // Force name conversion to string for PG + const where = isCLI + ? { name: name.toString(), isSystem: true } + : { name: name.toString(), isSystem: true } + + const application = await ApplicationManager.findOne(where, transaction) + if (!application) { + // Try with id + const where = isCLI + ? { id: name, isSystem: true } + : { id: name, isSystem: true } + + const application = await ApplicationManager.findOne(where, transaction) + if (!application) { + throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.INVALID_FLOW_ID, name)) + } + return application + } + return application +} + async function _createMicroserviceStatus (microservice, transaction) { return MicroserviceStatusManager.create({ microserviceUuid: microservice.uuid }, transaction) } +async function _createMicroserviceExecStatus (microservice, transaction) { + return MicroserviceExecStatusManager.create({ + microserviceUuid: microservice.uuid + }, transaction) +} + async function _createMicroserviceImages (microservice, images, transaction) { const newImages = [] for (const img of images) { @@ -1777,6 +1857,16 @@ async function _validateMicroserviceOnGet (microserviceUuid, transaction) { } } +async function _validateSystemMicroserviceOnGet (microserviceUuid, transaction) { + const where = { + uuid: microserviceUuid + } + const microservice = await MicroserviceManager.findSystemMicroserviceOnGet(where, transaction) + if (!microservice) { + throw new Errors.NotFoundError(ErrorMessages.INVALID_MICROSERVICE_USER) + } +} + async function _getLogicalRoutesByMicroservice (microserviceUuid, transaction) { const res = [] const query = { @@ -1834,6 +1924,7 @@ async function _buildGetMicroserviceResponse (microservice, transaction) { const pubTags = microservice.pubTags ? microservice.pubTags.map(t => t.value) : [] const subTags = microservice.subTags ? microservice.subTags.map(t => t.value) : [] const status = await MicroserviceStatusManager.findAllExcludeFields({ microserviceUuid: microserviceUuid }, transaction) + const execStatus = await MicroserviceExecStatusManager.findAllExcludeFields({ microserviceUuid: microserviceUuid }, transaction) // build microservice response const res = Object.assign({}, microservice) res.ports = [] @@ -1854,6 +1945,9 @@ async function _buildGetMicroserviceResponse (microservice, transaction) { if (status && status.length) { res.status = status[0] } + if (execStatus && execStatus.length) { + res.execStatus = execStatus[0] + } res.pubTags = pubTags res.subTags = subTags @@ -1901,7 +1995,7 @@ async function listMicroserviceBySubTagEndPoint (subTag, transaction) { } } -async function createExecEndPoint (microserviceUuid, transaction) { +async function createExecEndPoint (microserviceUuid, isCLI, transaction) { const microservice = await MicroserviceManager.findOneWithCategory({ uuid: microserviceUuid }, transaction) if (microservice.catalogItem && microservice.catalogItem.category === 'SYSTEM') { throw new Errors.ValidationError(AppHelper.formatMessage(ErrorMessages.SYSTEM_MICROSERVICE_UPDATE, microserviceUuid)) @@ -1921,7 +2015,7 @@ async function createExecEndPoint (microserviceUuid, transaction) { } } -async function deleteExecEndPoint (microserviceUuid, transaction) { +async function deleteExecEndPoint (microserviceUuid, isCLI, transaction) { const microservice = await MicroserviceManager.findOneWithCategory({ uuid: microserviceUuid }, transaction) if (microservice.catalogItem && microservice.catalogItem.category === 'SYSTEM') { throw new Errors.ValidationError(AppHelper.formatMessage(ErrorMessages.SYSTEM_MICROSERVICE_UPDATE, microserviceUuid)) @@ -1996,11 +2090,13 @@ module.exports = { deleteVolumeMappingEndPoint: TransactionDecorator.generateTransaction(deleteVolumeMappingEndPoint), deleteSystemVolumeMappingEndPoint: TransactionDecorator.generateTransaction(deleteSystemVolumeMappingEndPoint), getMicroserviceEndPoint: TransactionDecorator.generateTransaction(getMicroserviceEndPoint), + getSystemMicroserviceEndPoint: TransactionDecorator.generateTransaction(getSystemMicroserviceEndPoint), getReceiverMicroservices, isMicroserviceConsumer, isMicroserviceRouter, listMicroservicePortMappingsEndPoint: TransactionDecorator.generateTransaction(listPortMappingsEndPoint), listMicroservicesEndPoint: TransactionDecorator.generateTransaction(listMicroservicesEndPoint), + listSystemMicroservicesEndPoint: TransactionDecorator.generateTransaction(listSystemMicroservicesEndPoint), listVolumeMappingsEndPoint: TransactionDecorator.generateTransaction(listVolumeMappingsEndPoint), updateMicroserviceEndPoint: TransactionDecorator.generateTransaction(updateMicroserviceEndPoint), updateSystemMicroserviceEndPoint: TransactionDecorator.generateTransaction(updateSystemMicroserviceEndPoint), diff --git a/src/services/router-service.js b/src/services/router-service.js index 8d9569bf9..07daa12d0 100644 --- a/src/services/router-service.js +++ b/src/services/router-service.js @@ -20,6 +20,7 @@ const ErrorMessages = require('../helpers/error-messages') const MicroserviceManager = require('../data/managers/microservice-manager') const MicroserviceCapAddManager = require('../data/managers/microservice-cap-add-manager') const MicroserviceStatusManager = require('../data/managers/microservice-status-manager') +const MicroserviceExecStatusManager = require('../data/managers/microservice-exec-status-manager') const ApplicationManager = require('../data/managers/application-manager') const MicroservicePortManager = require('../data/managers/microservice-port-manager') const RouterConnectionManager = require('../data/managers/router-connection-manager') @@ -308,6 +309,7 @@ async function _createRouterMicroservice (isEdge, uuid, microserviceConfig, tran iofogUuid: uuid, rootHostAccess: false, logSize: constants.MICROSERVICE_DEFAULT_LOG_SIZE, + schedule: 0, configLastUpdated: Date.now(), env: [ { @@ -334,6 +336,7 @@ async function _createRouterMicroservice (isEdge, uuid, microserviceConfig, tran routerMicroserviceData.applicationId = application.id const routerMicroservice = await MicroserviceManager.create(routerMicroserviceData, transaction) await MicroserviceStatusManager.create({ microserviceUuid: routerMicroserviceData.uuid }, transaction) + await MicroserviceExecStatusManager.create({ microserviceUuid: routerMicroserviceData.uuid }, transaction) for (const capAdd of capAddValues) { await MicroserviceCapAddManager.create({ microserviceUuid: routerMicroserviceData.uuid, diff --git a/src/services/yaml-parser-service.js b/src/services/yaml-parser-service.js index b620450ce..93953fb64 100644 --- a/src/services/yaml-parser-service.js +++ b/src/services/yaml-parser-service.js @@ -265,9 +265,9 @@ const parseMicroserviceYAML = async (microservice) => { agentName: lget(microservice, 'agent.name'), registryId, ...container, - rootHostAccess: lget(microservice, 'rootHostAccess', false), - pidMode: lget(microservice, 'pidMode', ''), - ipcMode: lget(microservice, 'ipcMode', ''), + rootHostAccess: lget(microservice, 'container.rootHostAccess', false), + pidMode: lget(microservice, 'container.pidMode', ''), + ipcMode: lget(microservice, 'container.ipcMode', ''), annotations: container.annotations != null ? JSON.stringify(container.annotations) : undefined, capAdd: lget(microservice, 'container.capAdd', []), capDrop: lget(microservice, 'container.capDrop', []), @@ -280,7 +280,8 @@ const parseMicroserviceYAML = async (microservice) => { ...microservice.msRoutes, pubTags: lget(microservice, 'msRoutes.pubTags', []), subTags: lget(microservice, 'msRoutes.subTags', []), - application: microservice.application + application: microservice.application, + schedule: lget(microservice, 'schedule', 50) } _deleteUndefinedFields(microserviceData) return microserviceData diff --git a/src/websocket/error-handler.js b/src/websocket/error-handler.js new file mode 100644 index 000000000..f8a372e87 --- /dev/null +++ b/src/websocket/error-handler.js @@ -0,0 +1,54 @@ +const logger = require('../logger') + +class WebSocketError extends Error { + constructor (code, message) { + super(message) + this.code = code + this.name = 'WebSocketError' + } +} + +class WebSocketErrorHandler { + static handleError (ws, error) { + logger.error('WebSocket error:' + JSON.stringify({ error })) + + if (error instanceof WebSocketError) { + ws.send(JSON.stringify({ + type: 'error', + code: error.code, + message: error.message + })) + ws.close(error.code, error.message) + } else { + ws.send(JSON.stringify({ + type: 'error', + code: 1011, + message: 'Internal server error' + })) + ws.close(1011, 'Internal server error') + } + } + + static createError (code, message) { + return new WebSocketError(code, message) + } + + static getErrorCode (error) { + if (error instanceof WebSocketError) { + return error.code + } + return 1011 // Internal server error + } + + static getErrorMessage (error) { + if (error instanceof WebSocketError) { + return error.message + } + return 'Internal server error' + } +} + +module.exports = { + WebSocketError, + WebSocketErrorHandler +} diff --git a/src/websocket/server.js b/src/websocket/server.js new file mode 100644 index 000000000..4acf055cc --- /dev/null +++ b/src/websocket/server.js @@ -0,0 +1,1022 @@ +const WebSocket = require('ws') +const config = require('../config') +const logger = require('../logger') +const Errors = require('../helpers/errors') +const SessionManager = require('./session-manager') +const { WebSocketError } = require('./error-handler') +const MicroserviceManager = require('../data/managers/microservice-manager') +const ApplicationManager = require('../data/managers/application-manager') +const MicroserviceStatusManager = require('../data/managers/microservice-status-manager') +const { microserviceState, microserviceExecState } = require('../enums/microservice-state') +const MicroserviceExecStatusManager = require('../data/managers/microservice-exec-status-manager') +const keycloak = require('../config/keycloak.js').initKeycloak() +const AuthDecorator = require('../decorators/authorization-decorator') +const TransactionDecorator = require('../decorators/transaction-decorator') +const msgpack = require('@msgpack/msgpack') + +const MESSAGE_TYPES = { + STDIN: 0, + STDOUT: 1, + STDERR: 2, + CONTROL: 3, + CLOSE: 4, + ACTIVATION: 5 +} + +class WebSocketServer { + constructor () { + this.wss = null + this.agentSessions = new Map() + this.userSessions = new Map() + this.connectionLimits = new Map() + this.rateLimits = new Map() + this.sessionManager = new SessionManager(config.get('server.webSocket')) + this.config = { + pingInterval: process.env.WS_PING_INTERVAL || config.get('server.webSocket.pingInterval'), + pongTimeout: process.env.WS_PONG_TIMEOUT || config.get('server.webSocket.pongTimeout'), + maxPayload: process.env.WS_MAX_PAYLOAD || config.get('server.webSocket.maxPayload'), + sessionTimeout: process.env.WS_SESSION_TIMEOUT || config.get('server.webSocket.session.timeout'), + cleanupInterval: process.env.WS_CLEANUP_INTERVAL || config.get('server.webSocket.session.cleanupInterval'), + sessionMaxConnections: process.env.WS_SESSION_MAX_CONNECTIONS || config.get('server.webSocket.session.maxConnections') + } + } + + // MessagePack encoding/decoding helpers with improved error handling + encodeMessage (message) { + try { + // Ensure we're only encoding the actual message content + const encoded = msgpack.encode(message) + logger.debug('Encoded MessagePack message:' + JSON.stringify({ + type: typeof message, + isMap: message instanceof Map, + keys: message instanceof Map ? Array.from(message.keys()) : Object.keys(message), + hasExecId: message instanceof Map ? message.has('execId') : 'execId' in message, + hasMicroserviceUuid: message instanceof Map ? message.has('microserviceUuid') : 'microserviceUuid' in message, + encodedLength: encoded.length, + firstBytes: encoded.subarray(0, 16).toString('hex') + })) + return encoded + } catch (error) { + logger.error('Failed to encode message:' + JSON.stringify({ + error: error.message, + message: message + })) + throw new WebSocketError(1008, 'Message encoding failed') + } + } + + decodeMessage (buffer) { + try { + const decoded = msgpack.decode(buffer) + logger.debug('Decoded MessagePack message:' + JSON.stringify({ + type: typeof decoded, + isMap: decoded instanceof Map, + keys: decoded instanceof Map ? Array.from(decoded.keys()) : Object.keys(decoded), + hasExecId: decoded instanceof Map ? decoded.has('execId') : 'execId' in decoded, + hasMicroserviceUuid: decoded instanceof Map ? decoded.has('microserviceUuid') : 'microserviceUuid' in decoded, + bufferLength: buffer.length, + firstBytes: buffer.subarray(0, 16).toString('hex') + })) + return decoded + } catch (error) { + logger.error('Failed to decode MessagePack message:' + JSON.stringify({ + error: error.message, + bufferLength: buffer.length, + firstBytes: buffer.subarray(0, 16).toString('hex') + })) + throw error + } + } + + initialize (server) { + // Strict WebSocket configuration with no extensions and RSV control + const options = { + server, + maxPayload: process.env.WS_SECURITY_MAX_PAYLOAD || config.get('server.webSocket.security.maxPayload'), + perMessageDeflate: false, // Explicitly disable compression + clientTracking: true, + verifyClient: this.verifyClient.bind(this), + // Strict protocol handling + handleProtocols: (protocols) => { + // Accept any protocol but ensure strict mode + return protocols[0] + } + } + + logger.info('Initializing WebSocket server with strict options:' + JSON.stringify(options)) + this.wss = new WebSocket.Server(options) + + // Handle WebSocket server errors + this.wss.on('error', (error) => { + logger.error('WebSocket server error:' + JSON.stringify({ + error: error.message, + stack: error.stack + })) + }) + + // Handle individual connection errors + this.wss.on('connection', (ws, req) => { + logger.info('New WebSocket connection established:' + JSON.stringify({ + url: req.url, + headers: req.headers, + remoteAddress: req.socket.remoteAddress + })) + + // Set strict WebSocket options for this connection + ws.binaryType = 'arraybuffer' // Force binary type to be arraybuffer + + if (ws._socket) { + ws._socket.setNoDelay(true) + ws._socket.setKeepAlive(true, 30000) // Enable keep-alive instead of disabling + } + + // Add detailed frame-level logging + ws.on('message', (data, isBinary) => { + const buffer = Buffer.from(data) + logger.debug('WebSocket frame received:' + JSON.stringify({ + isBinary, + length: buffer.length, + firstBytes: buffer.subarray(0, 16).toString('hex'), + lastBytes: buffer.subarray(-16).toString('hex'), + url: req.url + })) + }) + + // Add error handler for each connection + ws.on('error', (error) => { + logger.error('WebSocket connection error:' + JSON.stringify({ + error: error.message, + stack: error.stack, + url: req.url + })) + if (ws.readyState === WebSocket.OPEN) { + try { + ws.close(1002, 'Protocol error') + } catch (closeError) { + logger.error('Error closing WebSocket:' + JSON.stringify({ + error: closeError.message, + originalError: error.message + })) + } + } + }) + + // Wrap handleConnection in try-catch to prevent unhandled errors + try { + this.handleConnection(ws, req) + } catch (error) { + logger.error('Unhandled error in handleConnection:' + JSON.stringify({ + error: error.message, + stack: error.stack, + url: req.url + })) + if (ws.readyState === WebSocket.OPEN) { + try { + ws.close(1002, 'Internal server error') + } catch (closeError) { + logger.error('Error closing WebSocket:' + JSON.stringify({ + error: closeError.message, + originalError: error.message + })) + } + } + } + }) + + // Add global error handler for the server + process.on('uncaughtException', (error) => { + logger.error('Uncaught exception in WebSocket server:' + JSON.stringify({ + error: error.message, + stack: error.stack + })) + // Don't let the error crash the process + }) + + process.on('unhandledRejection', (reason, promise) => { + logger.error('Unhandled rejection in WebSocket server:' + JSON.stringify({ + reason: reason, + promise: promise + })) + // Don't let the error crash the process + }) + + this.sessionManager.startCleanup() + } + + async verifyClient (info, callback) { + try { + // Check connection limits + const clientIp = info.req.socket.remoteAddress + const currentConnections = this.connectionLimits.get(clientIp) || 0 + if (currentConnections >= (process.env.WS_SECURITY_MAX_CONNECTIONS_PER_IP || config.get('server.webSocket.security.maxConnectionsPerIp'))) { + callback(new Error('Too many connections'), false) + return + } + + // Check rate limits + const now = Date.now() + const rateLimit = this.rateLimits.get(clientIp) || { count: 0, resetTime: now + 60000 } + if (now > rateLimit.resetTime) { + rateLimit.count = 0 + rateLimit.resetTime = now + 60000 + } + + if (rateLimit.count >= (process.env.WS_SECURITY_MAX_REQUESTS_PER_MINUTE || config.get('server.webSocket.security.maxRequestsPerMinute'))) { + callback(new Error('Rate limit exceeded'), false) + return + } + + rateLimit.count++ + this.rateLimits.set(clientIp, rateLimit) + + callback(null, true) + } catch (error) { + callback(new Error('Internal server error'), false) + } + } + + extractMicroserviceUuid (url) { + // Match UUID pattern in the URL + const uuidPattern = /[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}/i + const match = url.match(uuidPattern) + return match ? match[0] : null + } + + handleConnection (ws, req) { + // Add error handler for this connection + ws.on('error', (error) => { + logger.error('WebSocket connection error:' + JSON.stringify({ + error: error.message, + stack: error.stack, + url: req.url, + headers: req.headers + })) + // Don't let the error crash the process + if (ws.readyState === WebSocket.OPEN) { + try { + ws.close(1002, 'Protocol error') + } catch (closeError) { + logger.error('Error closing WebSocket:' + JSON.stringify({ + error: closeError.message, + originalError: error.message + })) + } + } + }) + + // Wrap the entire connection handling in a transaction + TransactionDecorator.generateTransaction(async (transaction) => { + try { + const token = req.headers.authorization + if (!token) { + logger.error('WebSocket connection failed: Missing authentication token') + try { + ws.close(1008, 'Missing authentication token') + } catch (error) { + logger.error('Error closing WebSocket:' + error.message) + } + return + } + + const microserviceUuid = this.extractMicroserviceUuid(req.url) + if (!microserviceUuid) { + logger.error('WebSocket connection failed: Invalid endpoint - no UUID found') + try { + ws.close(1008, 'Invalid endpoint') + } catch (error) { + logger.error('Error closing WebSocket:' + error.message) + } + return + } + + // Determine connection type and handle accordingly + if (req.url.startsWith('/api/v3/agent/exec/')) { + await this.handleAgentConnection(ws, req, token, microserviceUuid, transaction) + } else if (req.url.startsWith('/api/v3/microservices/exec/')) { + await this.handleUserConnection(ws, req, token, microserviceUuid, transaction) + } else { + logger.error('WebSocket connection failed: Invalid endpoint') + try { + ws.close(1008, 'Invalid endpoint') + } catch (error) { + logger.error('Error closing WebSocket:' + error.message) + } + return + } + } catch (error) { + logger.error('WebSocket connection error:' + JSON.stringify({ + error: error.message, + stack: error.stack, + url: req.url, + headers: req.headers + })) + + // Handle WebSocket errors gracefully + try { + if (ws.readyState === ws.OPEN) { + ws.close(1008, error.message || 'Internal server error') + await MicroserviceExecStatusManager.update( + { microserviceUuid: this.extractMicroserviceUuid(req.url) }, + { execSessionId: '', status: microserviceExecState.INACTIVE }, + transaction + ) + await MicroserviceManager.update({ uuid: this.extractMicroserviceUuid(req.url) }, { execEnabled: false }, transaction) + } + } catch (closeError) { + logger.error('Error closing WebSocket connection:' + JSON.stringify({ + error: closeError.message, + originalError: error.message + })) + } + } + })().catch(error => { + logger.error('Unhandled WebSocket transaction error:' + JSON.stringify({ + error: error.message, + stack: error.stack + })) + }) + } + + async handleAgentConnection (ws, req, token, microserviceUuid, transaction) { + try { + logger.debug('[WS-CONN] Processing agent connection:' + JSON.stringify({ + url: req.url, + microserviceUuid, + remoteAddress: req.socket.remoteAddress + })) + + // Set up message handler for initial message only + const initialMessageHandler = async (data, isBinary) => { + logger.debug('[WS-INIT] Received initial message from agent:' + JSON.stringify({ + isBinary, + url: req.url, + microserviceUuid + })) + + if (!isBinary) { + logger.error('[WS-ERROR] Expected binary message from agent') + ws.close(1008, 'Expected binary message') + return + } + + const buffer = Buffer.from(data) + logger.debug('[WS-INIT] Processing initial message from agent:' + JSON.stringify({ + isBinary, + length: buffer.length, + firstBytes: buffer.subarray(0, 16).toString('hex'), + lastBytes: buffer.subarray(-16).toString('hex') + })) + + let execMsg + try { + execMsg = this.decodeMessage(buffer) + logger.info('[WS-INIT] Decoded MessagePack from agent:' + JSON.stringify(execMsg)) + } catch (err) { + logger.error('[WS-ERROR] Failed to decode MessagePack from agent:' + JSON.stringify({ + error: err.message, + stack: err.stack + })) + ws.close(1008, 'Invalid MessagePack') + return + } + + const { execId, microserviceUuid: msgMicroserviceUuid } = execMsg + if (!execId || !msgMicroserviceUuid) { + logger.error('[WS-ERROR] Agent message missing execId or microserviceUuid:' + JSON.stringify(execMsg)) + ws.close(1008, 'Missing required fields') + return + } + + // Remove the initial message handler + ws.removeListener('message', initialMessageHandler) + + // Try to activate session with the execId from the message + const session = await this.sessionManager.tryActivateSession(msgMicroserviceUuid, execId, ws, true, transaction) + if (session) { + logger.info('[WS-SESSION] Session activated for agent:' + JSON.stringify({ + execId, + microserviceUuid: msgMicroserviceUuid + })) + // Set up message forwarding + logger.debug('[WS-FORWARD] Setting up message forwarding:' + JSON.stringify({ + execId, + microserviceUuid: msgMicroserviceUuid + })) + this.setupMessageForwarding(execId, transaction) + } else { + await this.sessionManager.addPendingAgent(msgMicroserviceUuid, execId, ws, transaction) + await MicroserviceExecStatusManager.update( + { microserviceUuid: microserviceUuid }, + { execSessionId: execId, status: microserviceExecState.PENDING }, + transaction + ) + logger.info('[WS-SESSION] No pending user found for agent, added to pending list:' + JSON.stringify({ + execId, + microserviceUuid: msgMicroserviceUuid + })) + } + } + + // Bind the message handler BEFORE validation + ws.on('message', initialMessageHandler) + + // Now validate the connection + const fog = await this.validateAgentConnection(token, microserviceUuid, transaction) + logger.debug('[WS-VALIDATE] Agent connection validated:' + JSON.stringify({ + fogUuid: fog.uuid, + microserviceUuid, + url: req.url + })) + + // Handle connection close + ws.on('close', () => { + for (const [execId, session] of this.sessionManager.sessions) { + if (session.agent === ws) { + this.cleanupSession(execId, transaction) + } + } + this.sessionManager.removePendingAgent(microserviceUuid, ws) + logger.debug('[WS-CLOSE] Agent connection closed:' + JSON.stringify({ + url: req.url, + microserviceUuid + })) + }) + + // Handle errors + ws.on('error', (error) => { + logger.error('[WS-ERROR] Agent connection error:' + JSON.stringify({ + error: error.message, + url: req.url, + microserviceUuid + })) + }) + } catch (error) { + logger.error('[WS-ERROR] Error in handleAgentConnection:' + JSON.stringify({ + error: error.message, + stack: error.stack, + url: req.url, + microserviceUuid + })) + if (ws.readyState === ws.OPEN) { + ws.close(1008, error.message || 'Connection error') + } + } + } + + async handleUserConnection (ws, req, token, microserviceUuid, transaction) { + try { + const { execSessionId } = await this.validateUserConnection(token, microserviceUuid, transaction) + logger.info('User connection: available execSessionId:' + execSessionId) + + // Check if there's already an active session for this microservice + const existingSession = Array.from(this.sessionManager.sessions.values()) + .find(session => session.microserviceUuid === microserviceUuid && session.user && session.user.readyState === WebSocket.OPEN) + + if (existingSession) { + logger.error('Microservice has already active exec session:' + JSON.stringify({ + microserviceUuid, + existingExecId: existingSession.execId + })) + ws.close(1008, 'Microservice has already active exec session.') + return + } + + // Get all active execIds + const activeExecIds = Array.from(this.sessionManager.sessions.keys()) + logger.info('Currently active execIds:' + JSON.stringify(activeExecIds)) + + // Get pending agent execIds + const pendingAgentExecIds = this.sessionManager.getPendingAgentExecIds(microserviceUuid) + logger.info('Pending agent execIds:' + JSON.stringify(pendingAgentExecIds)) + + // Find an available execId that is both not active AND has a pending agent + const availableExecId = execSessionId && !activeExecIds.includes(execSessionId) && pendingAgentExecIds.includes(execSessionId) + ? execSessionId + : null + + if (!availableExecId) { + logger.error('No available exec session for user') + ws.close(1008, 'No available exec session for this microservice.') + return + } + logger.info('User assigned execId:' + availableExecId) + + // Check if there's a pending agent with this execId + const pendingAgent = this.sessionManager.findPendingAgentForExecId(microserviceUuid, availableExecId) + if (pendingAgent) { + logger.info('Found pending agent for execId:' + JSON.stringify({ + execId: availableExecId, + microserviceUuid, + agentState: pendingAgent.readyState + })) + // Try to activate session with the selected execId + const session = this.sessionManager.tryActivateSession(microserviceUuid, availableExecId, ws, false, transaction) + if (session) { + logger.info('Session activated for user:', { + execId: availableExecId, + microserviceUuid, + userState: ws.readyState, + agentState: pendingAgent.readyState + }) + this.setupMessageForwarding(availableExecId, transaction) + } else { + logger.info('Failed to activate session with pending agent:' + JSON.stringify({ + execId: availableExecId, + microserviceUuid, + userState: ws.readyState, + agentState: pendingAgent.readyState + })) + this.sessionManager.addPendingUser(microserviceUuid, ws) + } + } else { + logger.info('No pending agent found for user, waiting:' + JSON.stringify({ + execId: availableExecId, + microserviceUuid, + userState: ws.readyState + })) + this.sessionManager.addPendingUser(microserviceUuid, ws) + } + + ws.on('close', () => { + for (const [execId, session] of this.sessionManager.sessions) { + if (session.user === ws) { + this.cleanupSession(execId, transaction) + } + } + this.sessionManager.removePendingUser(microserviceUuid, ws) + logger.info('User WebSocket disconnected:' + JSON.stringify({ + microserviceUuid, + userState: ws.readyState + })) + }) + } catch (error) { + logger.error('User connection validation failed:' + JSON.stringify({ + error: error.message, + stack: error.stack + })) + // Handle error gracefully instead of throwing + if (ws.readyState === WebSocket.OPEN) { + try { + ws.close(1008, error.message || 'Authentication failed') + } catch (closeError) { + logger.error('Error closing WebSocket:' + JSON.stringify({ + error: closeError.message, + originalError: error.message + })) + } + } + } + } + + // // Helper method - only filter obvious noise + // isNoise(output) { + // // Filter only the most obvious noise + // const noisePatterns = [ + // /^clear: command not found/, // Clear command error + // /^\s*$/, // Empty or whitespace only + // /^.$/ // Single character (usually control chars) + // ] + // return noisePatterns.some(pattern => pattern.test(output)) + // } + + setupMessageForwarding (execId, transaction) { + const session = this.sessionManager.getSession(execId) + if (!session) { + logger.error('[RELAY] Failed to setup message forwarding: No session found for execId=' + execId) + return + } + + const { agent, user } = session + logger.info('[RELAY] Setting up message forwarding for session:' + JSON.stringify({ + execId, + microserviceUuid: session.microserviceUuid, + agentConnected: !!agent, + userConnected: !!user, + agentState: agent ? agent.readyState : 'N/A', + userState: user ? user.readyState : 'N/A' + })) + + // Send activation message to agent + if (agent) { + const activationMsg = { + type: MESSAGE_TYPES.ACTIVATION, + data: Buffer.from(JSON.stringify({ + execId: execId, + microserviceUuid: session.microserviceUuid, + timestamp: Date.now() + })), + microserviceUuid: session.microserviceUuid, + execId: execId, + timestamp: Date.now() + } + + this.sendMessageToAgent(agent, activationMsg, execId, session.microserviceUuid) + .then(success => { + if (success) { + logger.info('[RELAY] Session activation complete:' + JSON.stringify({ + execId, + microserviceUuid: session.microserviceUuid, + agentState: agent.readyState + })) + } else { + logger.error('[RELAY] Session activation failed:' + JSON.stringify({ + execId, + microserviceUuid: session.microserviceUuid, + agentState: agent.readyState + })) + // Cleanup the session if activation fails + this.cleanupSession(execId, transaction) + } + }) + } + + // Remove any previous message handlers to avoid duplicates + if (user) { + logger.debug('[RELAY] Removing previous user message handlers for execId=' + execId) + user.removeAllListeners('message') + } + if (agent) { + logger.debug('[RELAY] Removing previous agent message handlers for execId=' + execId) + agent.removeAllListeners('message') + } + + // Forward user -> agent + if (user && agent) { + logger.debug('[RELAY] Setting up user->agent message forwarding for execId=' + execId) + user.on('message', async (data, isBinary) => { + logger.debug('[RELAY] User message received:' + JSON.stringify({ + execId, + isBinary, + dataType: typeof data, + dataLength: data.length, + userState: user.readyState, + agentState: agent.readyState + })) + + if (!isBinary) { + // Handle text messages from user + const text = data.toString() + logger.debug('[RELAY] Received text message from user:' + JSON.stringify({ + execId, + text, + length: text.length, + userState: user.readyState, + agentState: agent.readyState + })) + + // Convert text to binary message in agent's expected format + const msg = { + type: MESSAGE_TYPES.STDIN, + data: Buffer.from(text + '\n'), // Add newline for command execution + microserviceUuid: session.microserviceUuid, + execId: execId, + timestamp: Date.now() + } + + await this.sendMessageToAgent(agent, msg, execId, session.microserviceUuid) + return + } + + const buffer = Buffer.from(data) + try { + const msg = this.decodeMessage(buffer) + // Ensure message has all required fields + if (!msg.microserviceUuid) msg.microserviceUuid = session.microserviceUuid + if (!msg.execId) msg.execId = execId + if (!msg.timestamp) msg.timestamp = Date.now() + + if (msg.type === MESSAGE_TYPES.CLOSE) { + logger.info(`[RELAY] User sent CLOSE for execId=${execId}`) + await this.sendMessageToAgent(agent, msg, execId, session.microserviceUuid) + // Get current transaction from the session + const currentTransaction = session.transaction + this.cleanupSession(execId, currentTransaction) + return + } + + await this.sendMessageToAgent(agent, msg, execId, session.microserviceUuid) + } catch (error) { + logger.error('[RELAY] Failed to process binary message:' + JSON.stringify({ + execId, + error: error.message, + stack: error.stack, + bufferLength: buffer.length, + userState: user.readyState, + agentState: agent.readyState + })) + } + }) + + // Forward agent -> user + logger.debug('[RELAY] Setting up agent->user message forwarding for execId=' + execId) + agent.on('message', async (data, isBinary) => { + logger.debug('[RELAY] Agent message received:' + JSON.stringify({ + execId, + isBinary, + dataType: typeof data, + dataLength: data.length, + userState: user.readyState, + agentState: agent.readyState + })) + + try { + const buffer = Buffer.from(data) + const msg = this.decodeMessage(buffer) + logger.debug('[RELAY] Decoded agent message:' + JSON.stringify({ + execId, + type: msg.type, + hasData: !!msg.data, + messageSize: buffer.length + })) + + if (msg.type === MESSAGE_TYPES.CLOSE) { + logger.info(`[RELAY] Agent sent CLOSE for execId=${execId}`) + if (user.readyState === WebSocket.OPEN) { + user.close(1000, 'Agent closed connection') + } + // Get current transaction from the session + const currentTransaction = session.transaction + this.cleanupSession(execId, currentTransaction) + return + } + + if (user.readyState === WebSocket.OPEN) { + if (msg.type === MESSAGE_TYPES.STDOUT || msg.type === MESSAGE_TYPES.STDERR) { + if (msg.data && msg.data.length > 0) { + // Create MessagePack message for user + const userMsg = { + type: msg.type, + data: msg.data, + microserviceUuid: session.microserviceUuid, + execId: execId, + timestamp: Date.now() + } + // Encode and send as binary + const encoded = this.encodeMessage(userMsg) + user.send(encoded, { + binary: true, + compress: false, + mask: false, + fin: true + }) + + logger.debug('[RELAY] Forwarded agent message to user:' + JSON.stringify({ + execId, + type: msg.type, + encodedLength: encoded.length, + messageType: msg.type + })) + } + } else if (msg.type === MESSAGE_TYPES.CONTROL) { + user.send(data, { + binary: true, + compress: false, + mask: false, + fin: true + }) + } + } else { + logger.error('[RELAY] User not ready to receive message:' + JSON.stringify({ + execId, + userState: user.readyState, + messageType: msg.type + })) + } + } catch (error) { + logger.error('[RELAY] Failed to process agent message:', error) + } + }) + } + + logger.info('[RELAY] Message forwarding setup complete for session:' + JSON.stringify({ + execId, + microserviceUuid: session.microserviceUuid, + agentConnected: !!agent, + userConnected: !!user, + agentState: agent ? agent.readyState : 'N/A', + userState: user ? user.readyState : 'N/A' + })) + } + + async validateAgentConnection (token, microserviceUuid, transaction) { + try { + // Use AuthDecorator to validate the token and get the fog + let fog = {} + const req = { headers: { authorization: token }, transaction } + const handler = AuthDecorator.checkFogToken(async (req, fogObj) => { + fog = fogObj + return fogObj + }) + await handler(req) + + if (!fog) { + logger.error('Agent validation failed: Invalid agent token') + throw new WebSocketError(1008, 'Invalid agent token') + } + + // Verify microservice exists and belongs to this fog + const microservice = await MicroserviceManager.findOne({ uuid: microserviceUuid }, transaction) + if (!microservice || microservice.iofogUuid !== fog.uuid) { + logger.error('Agent validation failed: Microservice not found or not associated with this agent' + JSON.stringify({ + microserviceUuid, + fogUuid: fog.uuid, + found: !!microservice, + microserviceFogUuid: microservice ? microservice.iofogUuid : null + })) + throw new WebSocketError(1008, 'Microservice not found or not associated with this agent') + } + + return fog + } catch (error) { + logger.error('Agent validation error:' + JSON.stringify({ + error: error.message, + stack: error.stack, + microserviceUuid + })) + throw error // Propagate the original error + } + } + + async validateUserConnection (token, microserviceUuid, transaction) { + try { + // 1. Authenticate user first (Keycloak) + const req = { headers: { authorization: token } } + const res = {} + let userRoles = [] + await new Promise((resolve, reject) => { + keycloak.protect(['SRE', 'Developer'])(req, res, (err) => { + if (err) { + logger.error('User authentication failed:' + err) + reject(new Errors.AuthenticationError('Authentication failed')) + return + } + // Extract roles from token + userRoles = req.kauth && req.kauth.grant && req.kauth.grant.access_token && req.kauth.grant.access_token.content && req.kauth.grant.access_token.content.realm_access && req.kauth.grant.access_token.content.realm_access.roles + ? req.kauth.grant.access_token.content.realm_access.roles + : [] + resolve() + }) + }).catch((err) => { + // Immediately throw on authentication error + throw err + }) + + // 2. Only now check microservice, application, etc. + const microservice = await MicroserviceManager.findOne({ uuid: microserviceUuid }, transaction) + if (!microservice) { + throw new Errors.NotFoundError('Microservice not found') + } + + const application = await ApplicationManager.findOne({ id: microservice.applicationId }, transaction) + if (!application) { + throw new Errors.NotFoundError('Application not found') + } + + const statusArr = await MicroserviceStatusManager.findAllExcludeFields({ microserviceUuid: microserviceUuid }, transaction) + if (!statusArr || statusArr.length === 0) { + throw new Errors.NotFoundError('Microservice status not found') + } + const status = statusArr[0] + logger.debug('Microservice status check:' + JSON.stringify({ + status: status.status, + expectedStatus: microserviceState.RUNNING, + isEqual: status.status === microserviceState.RUNNING + })) + if (status.status !== microserviceState.RUNNING) { + throw new Errors.ValidationError('Microservice is not running') + } + + if (application.isSystem && !userRoles.includes('SRE')) { + throw new Errors.AuthenticationError('Only SRE can access system microservices') + } + // For non-system, SRE or Developer is already checked above + + const execStatusArr = await MicroserviceExecStatusManager.findAllExcludeFields({ microserviceUuid: microserviceUuid }, transaction) + if (!execStatusArr || execStatusArr.length === 0) { + throw new Errors.NotFoundError('Microservice exec status not found') + } + const execStatus = execStatusArr[0] + // logger.debug('Microservice exec status check:' + JSON.stringify({ + // status: execStatus.status, + // expectedStatus: microserviceExecState.ACTIVE, + // isEqual: execStatus.status === microserviceExecState.ACTIVE + // })) + if (execStatus.status === microserviceExecState.ACTIVE) { + throw new Errors.ValidationError('Microservice already has an active session') + } + + return { execSessionId: execStatus.execSessionId } + } catch (error) { + logger.error('User connection validation failed:' + JSON.stringify({ error: error.message, stack: error.stack })) + throw error + } + } + + // Singleton instance + static getInstance () { + if (!WebSocketServer.instance) { + WebSocketServer.instance = new WebSocketServer() + } + return WebSocketServer.instance + } + + // Clean up session and close sockets + cleanupSession (execId, transaction) { + const session = this.sessionManager.getSession(execId) + if (!session) return + + // Send CLOSE message to agent if it's still connected + if (session.agent && session.agent.readyState === WebSocket.OPEN) { + const closeMsg = { + type: MESSAGE_TYPES.CLOSE, + execId: execId, + microserviceUuid: session.microserviceUuid, + timestamp: Date.now(), + data: Buffer.from('Session closed') + } + + try { + const encoded = this.encodeMessage(closeMsg) + session.agent.send(encoded, { + binary: true, + compress: false, + mask: false, + fin: true + }) + logger.info('[RELAY] Sent CLOSE message to agent for execId=' + execId) + } catch (error) { + logger.error('[RELAY] Failed to send CLOSE message to agent:' + JSON.stringify({ + execId, + error: error.message, + stack: error.stack + })) + } + } + + // Close the connections + if (session.user && session.user.readyState === WebSocket.OPEN) { + session.user.close(1000, 'Session closed') + } + if (session.agent && session.agent.readyState === WebSocket.OPEN) { + session.agent.close(1000, 'Session closed') + } + + this.sessionManager.removeSession(execId, transaction) + logger.info('[RELAY] Session cleaned up for execId=' + execId) + } + + // Utility to extract microserviceUuid from path + extractUuidFromPath (path) { + const match = path.match(/([a-f0-9-]{36})/i) + return match ? match[1] : null + } + + registerRoute (path, middleware) { + // Store the route handler + this.routes = this.routes || new Map() + this.routes.set(path, middleware) + + logger.info('Registered WebSocket route: ' + path) + } + + // Helper method for sending messages to agent + async sendMessageToAgent (agent, message, execId, microserviceUuid) { + if (!agent || agent.readyState !== WebSocket.OPEN) { + logger.error('[RELAY] Cannot send message - agent not ready:' + JSON.stringify({ + execId, + microserviceUuid, + agentState: agent ? agent.readyState : 'N/A', + messageType: message.type + })) + return false + } + + try { + const encoded = this.encodeMessage(message) + agent.send(encoded, { + binary: true, + compress: false, + mask: false, + fin: true + }) + logger.debug('[RELAY] Message sent to agent:' + JSON.stringify({ + execId, + microserviceUuid, + messageType: message.type, + encodedLength: encoded.length + })) + return true + } catch (error) { + logger.error('[RELAY] Failed to send message to agent:' + JSON.stringify({ + execId, + microserviceUuid, + messageType: message.type, + error: error.message, + stack: error.stack + })) + return false + } + } +} + +module.exports = WebSocketServer diff --git a/src/websocket/session-manager.js b/src/websocket/session-manager.js new file mode 100644 index 000000000..a9a148be3 --- /dev/null +++ b/src/websocket/session-manager.js @@ -0,0 +1,495 @@ +const WebSocket = require('ws') +const logger = require('../logger') +const Errors = require('../helpers/errors') +const MicroserviceManager = require('../data/managers/microservice-manager') +const MicroserviceExecStatusManager = require('../data/managers/microservice-exec-status-manager') +const { microserviceExecState } = require('../enums/microservice-state') + +class SessionManager { + constructor (config) { + if (!config || !config.session) { + const error = new Errors.ValidationError('Invalid session manager configuration') + logger.error('Failed to initialize SessionManager:' + error) + throw error + } + this.sessions = new Map() + this.pendingUsers = new Map() // Map> + this.pendingAgents = new Map() // Map> + this.config = config + this.cleanupInterval = null + logger.info('SessionManager initialized with config:' + JSON.stringify({ + sessionTimeout: config.session.timeout, + maxConnections: config.session.maxConnections, + cleanupInterval: config.session.cleanupInterval + })) + } + + createSession (execId, microserviceUuid, agentWs, userWs, transaction) { + const session = { + execId, + microserviceUuid, + agent: agentWs, + user: userWs, + lastActivity: Date.now(), + transaction + } + this.sessions.set(execId, session) + logger.info('Session created:' + JSON.stringify({ + execId, + microserviceUuid, + agentConnected: !!agentWs, + userConnected: !!userWs + })) + return session + } + + getSession (execId) { + return this.sessions.get(execId) || null + } + + async removeSession (execId, transaction) { + const session = this.sessions.get(execId) + if (session) { + logger.info('Removing session:' + JSON.stringify({ + execId, + microserviceUuid: session.microserviceUuid + })) + this.sessions.delete(execId) + await MicroserviceExecStatusManager.update( + { microserviceUuid: session.microserviceUuid }, + { execSessionId: '', status: microserviceExecState.INACTIVE }, + transaction + ) + await MicroserviceManager.update({ uuid: session.microserviceUuid }, { execEnabled: false }, transaction) + } + } + + addPendingUser (microserviceUuid, userWs) { + if (!this.pendingUsers.has(microserviceUuid)) { + this.pendingUsers.set(microserviceUuid, new Set()) + } + this.pendingUsers.get(microserviceUuid).add(userWs) + logger.info('Added pending user:' + JSON.stringify({ + microserviceUuid, + pendingUserCount: this.pendingUsers.get(microserviceUuid).size + })) + } + + async addPendingAgent (microserviceUuid, execId, agentWs, transaction) { + if (!this.pendingAgents.has(microserviceUuid)) { + this.pendingAgents.set(microserviceUuid, new Map()) + // await MicroserviceExecStatusManager.update( + // { microserviceUuid: microserviceUuid }, + // { execSessionId: execId, status: microserviceExecState.PENDING }, + // transaction + // ) + } + const agents = this.pendingAgents.get(microserviceUuid) + + // Check if agent with this execId already exists + if (agents.has(execId)) { + logger.warn('Agent with execId already exists in pending list:' + JSON.stringify({ + microserviceUuid, + execId, + existingAgentState: agents.get(execId).ws.readyState, + newAgentState: agentWs.readyState + })) + // Remove old agent if it's not in OPEN state + if (agents.get(execId).ws.readyState !== WebSocket.OPEN) { + agents.delete(execId) + } else { + return // Skip adding if we already have an active agent with this execId + } + } + + const agentInfo = { ws: agentWs, execId } + agents.set(execId, agentInfo) + logger.info('Added pending agent:' + JSON.stringify({ + microserviceUuid, + execId, + pendingAgentCount: agents.size, + agentState: agentWs.readyState + })) + } + + removePendingUser (microserviceUuid, userWs) { + if (this.pendingUsers.has(microserviceUuid)) { + const users = this.pendingUsers.get(microserviceUuid) + users.delete(userWs) + if (users.size === 0) { + this.pendingUsers.delete(microserviceUuid) + } + logger.info('Removed pending user:' + JSON.stringify({ + microserviceUuid, + remainingUsers: users.size + })) + } + } + + removePendingAgent (microserviceUuid, agentWs) { + if (this.pendingAgents.has(microserviceUuid)) { + const agents = this.pendingAgents.get(microserviceUuid) + // Find and remove agent by WebSocket instance + for (const [execId, agentInfo] of agents.entries()) { + if (agentInfo.ws === agentWs) { + agents.delete(execId) + logger.info('Removed pending agent:' + JSON.stringify({ + microserviceUuid, + execId, + remainingAgents: agents.size + })) + break + } + } + + if (agents.size === 0) { + this.pendingAgents.delete(microserviceUuid) + } + } + } + + findPendingUserForExecId (microserviceUuid, execId) { + if (this.pendingUsers.has(microserviceUuid)) { + const users = this.pendingUsers.get(microserviceUuid) + // Return the first available user since we don't store execId with users + // The execId will be assigned when creating the session + for (const userWs of users) { + if (userWs.readyState === WebSocket.OPEN) { + return userWs + } + } + } + return null + } + + findPendingAgentForExecId (microserviceUuid, execId) { + if (this.pendingAgents.has(microserviceUuid)) { + const agents = this.pendingAgents.get(microserviceUuid) + const agentInfo = agents.get(execId) + if (agentInfo && agentInfo.ws.readyState === WebSocket.OPEN) { + return agentInfo.ws + } + } + return null + } + + async tryActivateSession (microserviceUuid, execId, newConnection, isAgent, transaction) { + let pendingUser = null + let pendingAgent = null + let session = null + + try { + if (isAgent) { + pendingUser = this.findPendingUserForExecId(microserviceUuid, execId) + if (pendingUser) { + // Atomic operation: remove user and create session + this.removePendingUser(microserviceUuid, pendingUser) + session = this.createSession(execId, microserviceUuid, newConnection, pendingUser, transaction) + logger.info('Session activated with agent first:' + JSON.stringify({ + execId, + microserviceUuid, + userConnected: !!pendingUser, + agentConnected: !!newConnection, + userState: pendingUser.readyState, + agentState: newConnection.readyState + })) + } else { + await this.addPendingAgent(microserviceUuid, execId, newConnection, transaction) + logger.info('No pending user found for agent, added to pending list:' + JSON.stringify({ + execId, + microserviceUuid, + agentState: newConnection.readyState + })) + } + } else { + pendingAgent = this.findPendingAgentForExecId(microserviceUuid, execId) + if (pendingAgent) { + // Atomic operation: remove agent and create session + this.removePendingAgent(microserviceUuid, pendingAgent) + session = this.createSession(execId, microserviceUuid, pendingAgent, newConnection, transaction) + logger.info('Session activated with user first:' + JSON.stringify({ + execId, + microserviceUuid, + userConnected: !!newConnection, + agentConnected: !!pendingAgent, + userState: newConnection.readyState, + agentState: pendingAgent.readyState + })) + await MicroserviceExecStatusManager.update( + { microserviceUuid: microserviceUuid }, + { execSessionId: execId, status: microserviceExecState.ACTIVE }, + transaction + ) + } else { + this.addPendingUser(microserviceUuid, newConnection) + logger.info('No pending agent found for user, added to pending list:' + JSON.stringify({ + execId, + microserviceUuid, + userState: newConnection.readyState + })) + } + } + } catch (error) { + logger.error('Failed to activate session:' + JSON.stringify({ + error: error.message, + execId, + microserviceUuid, + isAgent, + userState: newConnection.readyState + })) + // Cleanup any partial state + if (session) { + await this.removeSession(execId, transaction) + } + throw error + } + + return session + } + + logSessionState () { + logger.info('--- WebSocket SessionManager State ---') + logger.info('Active sessions:') + for (const [execId, session] of this.sessions) { + logger.info(JSON.stringify({ + execId, + microserviceUuid: session.microserviceUuid, + agentConnected: !!session.agent, + userConnected: !!session.user, + lastActivity: new Date(session.lastActivity).toISOString(), + agentState: session.agent ? session.agent.readyState : 'N/A', + userState: session.user ? session.user.readyState : 'N/A' + })) + } + logger.info('Pending users:') + for (const [microserviceUuid, users] of this.pendingUsers) { + logger.info(JSON.stringify({ + microserviceUuid, + count: users.size + })) + } + logger.info('Pending agents:') + for (const [microserviceUuid, agents] of this.pendingAgents) { + logger.info(JSON.stringify({ + microserviceUuid, + count: agents.size, + execIds: Array.from(agents.keys()) + })) + } + logger.info('--------------------------------------') + } + + assignAgentToSession (execId, agentWs) { + const session = this.getSession(execId) + if (session) { + session.agent = agentWs + session.lastActivity = Date.now() + } + } + + assignUserToSession (execId, userWs) { + const session = this.getSession(execId) + if (session) { + session.user = userWs + session.lastActivity = Date.now() + } + } + + addConnection (sessionId, ws) { + try { + const session = this.getSession(sessionId) + session.connections.add(ws) + session.lastActivity = Date.now() + logger.info('Connection added to session' + JSON.stringify({ + sessionId, + connectionCount: session.connections.size + })) + } catch (error) { + logger.error('Failed to add connection:' + error) + throw error + } + } + + removeConnection (sessionId, ws) { + try { + const session = this.getSession(sessionId) + session.connections.delete(ws) + if (session.connections.size === 0) { + session.lastActivity = Date.now() + logger.info('Last connection removed from session' + JSON.stringify({ sessionId })) + } else { + logger.debug('Connection removed from session' + JSON.stringify({ + sessionId, + remainingConnections: session.connections.size + })) + } + } catch (error) { + logger.error('Failed to remove connection:' + error) + throw error + } + } + + handleReconnection (sessionId, ws) { + try { + const session = this.getSession(sessionId) + if (session.reconnectAttempts < this.config.maxReconnectAttempts) { + session.reconnectAttempts++ + this.addConnection(sessionId, ws) + logger.info('Reconnection successful' + JSON.stringify({ + sessionId, + attempt: session.reconnectAttempts + })) + return true + } else { + const error = new Errors.ValidationError('Max reconnection attempts reached') + logger.warn('Max reconnection attempts reached' + JSON.stringify({ + sessionId, + maxAttempts: this.config.maxReconnectAttempts, + error: error.message + })) + throw error + } + } catch (error) { + logger.error('Reconnection failed:' + error) + throw error + } + } + + startCleanup () { + if (this.cleanupInterval) { + logger.debug('Cleanup interval already running') + return + } + logger.info('Starting session cleanup service with interval: ' + this.config.session.cleanupInterval + 'ms') + this.cleanupInterval = setInterval(() => { + const now = Date.now() + let cleanedCount = 0 + logger.debug('Running session cleanup cycle') + for (const [sessionId, session] of this.sessions) { + if (now - session.lastActivity > this.config.session.timeout) { + this.cleanupSession(sessionId) + cleanedCount++ + } + } + if (cleanedCount > 0) { + logger.info('Session cleanup completed' + JSON.stringify({ cleanedCount })) + } + // Log session state after cleanup + this.logSessionState() + }, this.config.session.cleanupInterval) + } + + cleanupSession (sessionId) { + try { + const session = this.getSession(sessionId) + logger.info('Cleaning up session' + JSON.stringify({ + sessionId, + type: session.type, + connectionCount: session.connections.size + })) + for (const ws of session.connections) { + ws.close(1000, 'Session timeout') + } + this.sessions.delete(sessionId) + logger.debug('Session cleanup completed' + JSON.stringify({ sessionId })) + } catch (error) { + logger.error('Failed to cleanup session:' + error) + throw error + } + } + + stopCleanup () { + if (this.cleanupInterval) { + clearInterval(this.cleanupInterval) + logger.info('Session cleanup service stopped') + } + } + + getActiveConnections (sessionId) { + try { + const session = this.getSession(sessionId) + const count = session.connections.size + logger.debug('Getting active connections' + JSON.stringify({ sessionId, count })) + return count + } catch (error) { + logger.error('Failed to get active connections:' + error) + throw error + } + } + + broadcastToSession (sessionId, message) { + try { + const session = this.getSession(sessionId) + const messageStr = JSON.stringify(message) + let sentCount = 0 + for (const ws of session.connections) { + if (ws.readyState === WebSocket.OPEN) { + ws.send(messageStr) + sentCount++ + } + } + logger.debug('Broadcast message to session' + JSON.stringify({ + sessionId, + recipients: sentCount, + totalConnections: session.connections.size + })) + } catch (error) { + logger.error('Failed to broadcast message:' + error) + throw error + } + } + + bufferMessage (sessionId, message) { + try { + const session = this.getSession(sessionId) + session.buffer.push(message) + if (session.buffer.length > this.config.maxBufferSize) { + session.buffer.shift() // Remove oldest message + logger.debug('Buffer size limit reached, removed oldest message' + JSON.stringify({ + sessionId, + bufferSize: session.buffer.length + })) + } + } catch (error) { + logger.error('Failed to buffer message:' + error) + throw error + } + } + + getBufferedMessages (sessionId) { + try { + const session = this.getSession(sessionId) + const messages = session.buffer + logger.debug('Retrieved buffered messages' + JSON.stringify({ + sessionId, + messageCount: messages.length + })) + return messages + } catch (error) { + logger.error('Failed to get buffered messages:' + error) + throw error + } + } + + clearBuffer (sessionId) { + try { + const session = this.getSession(sessionId) + const count = session.buffer.length + session.buffer = [] + logger.info('Cleared message buffer' + JSON.stringify({ sessionId, clearedCount: count })) + } catch (error) { + logger.error('Failed to clear buffer:' + error) + throw error + } + } + + getPendingAgentExecIds (microserviceUuid) { + if (this.pendingAgents.has(microserviceUuid)) { + const agents = this.pendingAgents.get(microserviceUuid) + return Array.from(agents.keys()) + } + return [] + } +} + +module.exports = SessionManager diff --git a/swagger.js b/swagger.js index cd25b89e8..4240fdbba 100644 --- a/swagger.js +++ b/swagger.js @@ -1,21 +1,40 @@ // swagger.js const swaggerJsDoc = require('swagger-jsdoc') +// Import all schemas +const schemas = require('./src/schemas') + const swaggerOptions = { swaggerDefinition: { openapi: '3.0.0', info: { - title: 'API Documentation', - version: '1.0.0', - description: 'Datasancae API Documentation' + title: 'Datasance PoT Controller REST API Documentation', + version: '3.5.0', + description: 'Datasance PoT Controller REST API Documentation' }, servers: [ { - url: 'http://localhost:3000' + url: 'http://localhost:51121/api/v3' + } + ], + components: { + securitySchemes: { + authToken: { + type: 'http', + scheme: 'bearer', + bearerFormat: 'JWT', + description: 'JWT token for authentication (user or agent)' + } + }, + schemas: schemas + }, + security: [ + { + authToken: [] } ] }, - apis: ['./routes/*.js'] + apis: ['./src/routes/*.js'] } const swaggerDocs = swaggerJsDoc(swaggerOptions) From 92f0c522e835dfbe912667d5da8d198fbdcd017c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emirhan=20Durmu=C5=9F?= Date: Sat, 21 Jun 2025 16:55:28 +0300 Subject: [PATCH 156/178] ws kc auth roles checking fixed --- src/websocket/server.js | 85 ++- test/backup/iofog-service.js | 1250 ------------------------------ test/backup/services-service.js | 1261 ------------------------------- 3 files changed, 66 insertions(+), 2530 deletions(-) delete mode 100644 test/backup/iofog-service.js delete mode 100644 test/backup/services-service.js diff --git a/src/websocket/server.js b/src/websocket/server.js index 4acf055cc..3627ba442 100644 --- a/src/websocket/server.js +++ b/src/websocket/server.js @@ -839,27 +839,59 @@ class WebSocketServer { async validateUserConnection (token, microserviceUuid, transaction) { try { - // 1. Authenticate user first (Keycloak) - const req = { headers: { authorization: token } } - const res = {} + // 1. Authenticate user first (Keycloak) - Direct token verification let userRoles = [] - await new Promise((resolve, reject) => { - keycloak.protect(['SRE', 'Developer'])(req, res, (err) => { - if (err) { - logger.error('User authentication failed:' + err) - reject(new Errors.AuthenticationError('Authentication failed')) - return + + // Extract Bearer token + const bearerToken = token.replace('Bearer ', '') + if (!bearerToken) { + throw new Errors.AuthenticationError('Missing or invalid authorization token') + } + + // Check if we're in development mode (mock Keycloak) + const isDevMode = config.get('server.devMode', true) + const hasAuthConfig = this.isAuthConfigured() + + if (!hasAuthConfig && isDevMode) { + // Use mock roles for development + userRoles = ['SRE', 'Developer', 'Viewer'] + logger.debug('Using mock authentication for development mode') + } else { + // Use real Keycloak token verification + try { + // Create a grant from the access token + const grant = await keycloak.grantManager.createGrant({ + access_token: bearerToken + }) + + // Extract roles from the token - get client-specific roles + const clientId = process.env.KC_CLIENT || config.get('auth.client.id') + const resourceAccess = grant.access_token.content.resource_access + + if (resourceAccess && resourceAccess[clientId] && resourceAccess[clientId].roles) { + userRoles = resourceAccess[clientId].roles + } else { + // Fallback to realm roles if client roles not found + userRoles = grant.access_token.content.realm_access && grant.access_token.content.realm_access.roles + ? grant.access_token.content.realm_access.roles + : [] } - // Extract roles from token - userRoles = req.kauth && req.kauth.grant && req.kauth.grant.access_token && req.kauth.grant.access_token.content && req.kauth.grant.access_token.content.realm_access && req.kauth.grant.access_token.content.realm_access.roles - ? req.kauth.grant.access_token.content.realm_access.roles - : [] - resolve() - }) - }).catch((err) => { - // Immediately throw on authentication error - throw err - }) + + logger.debug('Token verification successful, user roles:' + JSON.stringify(userRoles)) + } catch (keycloakError) { + logger.error('Keycloak token verification failed:' + JSON.stringify({ + error: keycloakError.message, + stack: keycloakError.stack + })) + throw new Errors.AuthenticationError('Invalid or expired token') + } + } + + // Check if user has required roles + const hasRequiredRole = userRoles.some(role => ['SRE', 'Developer'].includes(role)) + if (!hasRequiredRole) { + throw new Errors.AuthenticationError('Insufficient permissions. Required roles: SRE or Developer') + } // 2. Only now check microservice, application, etc. const microservice = await MicroserviceManager.findOne({ uuid: microserviceUuid }, transaction) @@ -1017,6 +1049,21 @@ class WebSocketServer { return false } } + + // Helper method to check if auth is configured + isAuthConfigured () { + const requiredConfigs = [ + 'auth.realm', + 'auth.realmKey', + 'auth.url', + 'auth.client.id', + 'auth.client.secret' + ] + return requiredConfigs.every(configKey => { + const value = config.get(configKey) + return value !== undefined && value !== null && value !== '' + }) + } } module.exports = WebSocketServer diff --git a/test/backup/iofog-service.js b/test/backup/iofog-service.js deleted file mode 100644 index bf90d94b5..000000000 --- a/test/backup/iofog-service.js +++ /dev/null @@ -1,1250 +0,0 @@ -/* - * ******************************************************************************* - * * Copyright (c) 2023 Datasance Teknoloji A.S. - * * - * * This program and the accompanying materials are made available under the - * * terms of the Eclipse Public License v. 2.0 which is available at - * * http://www.eclipse.org/legal/epl-2.0 - * * - * * SPDX-License-Identifier: EPL-2.0 - * ******************************************************************************* - * - */ - -const config = require('../config') -const fs = require('fs') -const TransactionDecorator = require('../decorators/transaction-decorator') -const AppHelper = require('../helpers/app-helper') -const FogManager = require('../data/managers/iofog-manager') -const FogProvisionKeyManager = require('../data/managers/iofog-provision-key-manager') -const FogVersionCommandManager = require('../data/managers/iofog-version-command-manager') -const ChangeTrackingService = require('./change-tracking-service') -const Errors = require('../helpers/errors') -const ErrorMessages = require('../helpers/error-messages') -const Validator = require('../schemas') -const HWInfoManager = require('../data/managers/hw-info-manager') -const USBInfoManager = require('../data/managers/usb-info-manager') -const CatalogService = require('./catalog-service') -const MicroserviceManager = require('../data/managers/microservice-manager') -const ApplicationManager = require('../data/managers/application-manager') -const TagsManager = require('../data/managers/tags-manager') -const MicroserviceService = require('./microservices-service') -const EdgeResourceService = require('./edge-resource-service') -const VolumeMountService = require('./volume-mount-service') -const RouterManager = require('../data/managers/router-manager') -const MicroserviceExtraHostManager = require('../data/managers/microservice-extra-host-manager') -const MicroserviceStatusManager = require('../data/managers/microservice-status-manager') -const RouterConnectionManager = require('../data/managers/router-connection-manager') -const RouterService = require('./router-service') -const Constants = require('../helpers/constants') -const Op = require('sequelize').Op -const lget = require('lodash/get') -const CertificateService = require('./certificate-service') -const logger = require('../logger') -const ServiceManager = require('../data/managers/service-manager') - -const SITE_CA_CERT = 'pot-site-ca' -const DEFAULT_ROUTER_LOCAL_CA = 'default-router-local-ca' -const SERVICE_ANNOTATION_TAG = 'service.datasance.com/tag' - -async function checkKubernetesEnvironment () { - const controlPlane = process.env.CONTROL_PLANE || config.get('app.ControlPlane') - return controlPlane && controlPlane.toLowerCase() === 'kubernetes' -} - -async function getLocalCertificateHosts (isKubernetes, namespace) { - if (isKubernetes) { - return `router-local,router-local.${namespace},router-local.${namespace}.svc.cluster.local` - } - return '127.0.0.1,localhost,host.docker.internal,host.containers.internal' -} - -async function getSiteCertificateHosts (fogData, transaction) { - const hosts = new Set() - // Add existing hosts if isSystem - if (fogData.isSystem) { - if (fogData.host) hosts.add(fogData.host) - if (fogData.ipAddress) hosts.add(fogData.ipAddress) - if (fogData.ipAddressExternal) hosts.add(fogData.ipAddressExternal) - } - // Add default router host if not system - if (!fogData.isSystem) { - const defaultRouter = await RouterManager.findOne({ isDefault: true }, transaction) - if (defaultRouter.host) hosts.add(defaultRouter.host) - } - // Add upstream router hosts - // const upstreamRouters = (fogData.upstreamRouters || []).filter(uuid => uuid !== 'default-router') - // if (upstreamRouters.length) { - // for (const uuid of upstreamRouters) { - // const routerHost = await FogManager.findOne({ uuid: uuid }, transaction) - // if (routerHost.host) hosts.add(routerHost.host) - // if (routerHost.ipAddress) hosts.add(routerHost.ipAddress) - // } - // } - return Array.from(hosts).join(',') || 'localhost' -} - -async function _handleRouterCertificates (fogData, uuid, isRouterModeChanged, transaction) { - logger.debug('Starting _handleRouterCertificates for fog: ' + JSON.stringify({ uuid: uuid, host: fogData.host })) - - // Check if we're in Kubernetes environment - const isKubernetes = await checkKubernetesEnvironment() - const namespace = isKubernetes ? process.env.CONTROLLER_NAMESPACE : null - - // Helper to check CA existence - async function ensureCA (name, subject) { - logger.debug('Checking CA existence: ' + JSON.stringify({ name, subject })) - try { - await CertificateService.getCAEndpoint(name, transaction) - logger.debug('CA already exists: ' + name) - // CA exists - } catch (err) { - if (err.name === 'NotFoundError') { - logger.debug('CA not found, creating new CA: ' + JSON.stringify({ name, subject })) - await CertificateService.createCAEndpoint({ - name, - subject: `${subject}`, - expiration: 60, // months - type: 'self-signed' - }, transaction) - logger.debug('Successfully created CA: ' + name) - } else if (err.name === 'ConflictError') { - logger.debug('CA already exists (conflict): ' + name) - // Already exists, ignore - } else { - logger.error('Error in ensureCA - Name: ' + name + ', Subject: ' + subject + ', Error: ' + err.message + ', Type: ' + err.name + ', Code: ' + err.code) - logger.error('Stack trace: ' + err.stack) - throw err - } - } - } - - // Helper to check cert existence - async function ensureCert (name, subject, hosts, ca, shouldRecreate = false) { - logger.debug('Checking certificate existence: ' + JSON.stringify({ name, subject, hosts, ca })) - try { - const existingCert = await CertificateService.getCertificateEndpoint(name, transaction) - if (shouldRecreate && existingCert) { - logger.debug('Certificate exists and needs recreation: ' + name) - await CertificateService.deleteCertificateEndpoint(name, transaction) - logger.debug('Deleted existing certificate: ' + name) - // Create new certificate - await CertificateService.createCertificateEndpoint({ - name, - subject: `${subject}`, - hosts, - ca - }, transaction) - logger.debug('Successfully recreated certificate: ' + name) - } else if (!existingCert) { - logger.debug('Certificate not found, creating new certificate: ' + JSON.stringify({ name, subject, hosts, ca })) - await CertificateService.createCertificateEndpoint({ - name, - subject: `${subject}`, - hosts, - ca - }, transaction) - logger.debug('Successfully created certificate: ' + name) - } else { - logger.debug('Certificate already exists: ' + name) - } - } catch (err) { - if (err.name === 'NotFoundError') { - logger.debug('Certificate not found, creating new certificate: ' + JSON.stringify({ name, subject, hosts, ca })) - await CertificateService.createCertificateEndpoint({ - name, - subject: `${subject}`, - hosts, - ca - }, transaction) - logger.debug('Successfully created certificate: ' + name) - } else if (err.name === 'ConflictError') { - logger.debug('Certificate already exists (conflict): ' + name) - // Already exists, ignore - } else { - logger.error('Error in ensureCert - Name: ' + name + ', Subject: ' + subject + ', Hosts: ' + hosts + ', CA: ' + JSON.stringify(ca) + ', Error: ' + err.message + ', Type: ' + err.name + ', Code: ' + err.code) - logger.error('Stack trace: ' + err.stack) - throw err - } - } - } - - try { - // Always ensure SITE_CA_CERT exists - logger.debug('Ensuring SITE_CA_CERT exists') - await ensureCA(SITE_CA_CERT, SITE_CA_CERT) - - // If routerMode is 'none', only ensure DEFAULT_ROUTER_LOCAL_CA and its signed certificate - if (fogData.routerMode === 'none') { - logger.debug('Router mode is none, ensuring DEFAULT_ROUTER_LOCAL_CA exists') - await ensureCA(DEFAULT_ROUTER_LOCAL_CA, DEFAULT_ROUTER_LOCAL_CA) - logger.debug('Ensuring local-agent certificate signed by DEFAULT_ROUTER_LOCAL_CA') - const localHosts = await getLocalCertificateHosts(isKubernetes, namespace) - await ensureCert( - `${uuid}-local-agent`, - `${uuid}-local-agent`, - localHosts, - { type: 'direct', secretName: DEFAULT_ROUTER_LOCAL_CA }, - isRouterModeChanged - ) - logger.debug('Successfully completed _handleRouterCertificates for routerMode none') - return - } - - // For other router modes, ensure all other certificates - // Always ensure site-server cert exists - logger.debug('Ensuring site-server certificate exists') - const siteHosts = await getSiteCertificateHosts(fogData, transaction) - await ensureCert( - `${uuid}-site-server`, - `${uuid}-site-server`, - siteHosts, - { type: 'direct', secretName: SITE_CA_CERT }, - false - ) - - // Always ensure local-ca exists - logger.debug('Ensuring local-ca exists') - await ensureCA(`${uuid}-local-ca`, `${uuid}-local-ca`) - - // Always ensure local-server cert exists - logger.debug('Ensuring local-server certificate exists') - const localHosts = await getLocalCertificateHosts(isKubernetes, namespace) - await ensureCert( - `${uuid}-local-server`, - `${uuid}-local-server`, - localHosts, - { type: 'direct', secretName: `${uuid}-local-ca` }, - isRouterModeChanged - ) - - // Always ensure local-agent cert exists - logger.debug('Ensuring local-agent certificate exists') - await ensureCert( - `${uuid}-local-agent`, - `${uuid}-local-agent`, - localHosts, - { type: 'direct', secretName: `${uuid}-local-ca` }, - isRouterModeChanged - ) - - logger.debug('Successfully completed _handleRouterCertificates') - } catch (error) { - logger.error('Certificate operation failed - UUID: ' + uuid + ', RouterMode: ' + fogData.routerMode + ', Error: ' + error.message + ', Type: ' + error.name + ', Code: ' + error.code) - logger.error('Stack trace: ' + error.stack) - } -} - -async function createFogEndPoint (fogData, isCLI, transaction) { - await Validator.validate(fogData, Validator.schemas.iofogCreate) - - let createFogData = { - uuid: AppHelper.generateUUID(), - name: fogData.name, - location: fogData.location, - latitude: fogData.latitude, - longitude: fogData.longitude, - gpsMode: fogData.latitude || fogData.longitude ? 'manual' : undefined, - description: fogData.description, - networkInterface: fogData.networkInterface, - dockerUrl: fogData.dockerUrl, - containerEngine: fogData.containerEngine, - deploymentType: fogData.deploymentType, - diskLimit: fogData.diskLimit, - diskDirectory: fogData.diskDirectory, - memoryLimit: fogData.memoryLimit, - cpuLimit: fogData.cpuLimit, - logLimit: fogData.logLimit, - logDirectory: fogData.logDirectory, - logFileCount: fogData.logFileCount, - statusFrequency: fogData.statusFrequency, - changeFrequency: fogData.changeFrequency, - deviceScanFrequency: fogData.deviceScanFrequency, - bluetoothEnabled: fogData.bluetoothEnabled, - watchdogEnabled: fogData.watchdogEnabled, - abstractedHardwareEnabled: fogData.abstractedHardwareEnabled, - fogTypeId: fogData.fogType, - logLevel: fogData.logLevel, - dockerPruningFrequency: fogData.dockerPruningFrequency, - availableDiskThreshold: fogData.availableDiskThreshold, - isSystem: fogData.isSystem, - host: fogData.host, - routerId: null, - timeZone: fogData.timeZone - } - - createFogData = AppHelper.deleteUndefinedFields(createFogData) - - // Default router is edge - fogData.routerMode = fogData.routerMode || 'edge' - - if (fogData.isSystem && fogData.routerMode !== 'interior') { - throw new Errors.ValidationError(AppHelper.formatMessage(ErrorMessages.INVALID_ROUTER_MODE, fogData.routerMode)) - } - - if (fogData.isSystem && !!(await FogManager.findOne({ isSystem: true }, transaction))) { - throw new Errors.ValidationError(AppHelper.formatMessage(ErrorMessages.DUPLICATE_SYSTEM_FOG)) - } - - const existingFog = await FogManager.findOne({ name: createFogData.name }, transaction) - if (existingFog) { - throw new Errors.ValidationError(AppHelper.formatMessage(ErrorMessages.DUPLICATE_NAME, createFogData.name)) - } - - let defaultRouter, upstreamRouters - if (fogData.routerMode === 'none') { - const networkRouter = await RouterService.getNetworkRouter(fogData.networkRouter) - if (!networkRouter) { - throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.INVALID_ROUTER, !fogData.networkRouter ? Constants.DEFAULT_ROUTER_NAME : fogData.networkRouter)) - } - createFogData.routerId = networkRouter.id - } else { - defaultRouter = await RouterManager.findOne({ isDefault: true }, transaction) - upstreamRouters = await RouterService.validateAndReturnUpstreamRouters(fogData.upstreamRouters, fogData.isSystem, defaultRouter) - } - - const fog = await FogManager.create(createFogData, transaction) - - // Set tags - await _setTags(fog, fogData.tags, transaction) - - // Add certificate handling - await _handleRouterCertificates(fogData, createFogData.uuid, false, transaction) - - if (fogData.routerMode !== 'none') { - if (!fogData.host && !isCLI) { - throw new Errors.ValidationError(ErrorMessages.HOST_IS_REQUIRED) - } - - await RouterService.createRouterForFog(fogData, fog.uuid, upstreamRouters) - - // --- Service Distribution Logic --- - // 1. Extract service tags - const serviceTags = await _extractServiceTags(fogData.tags) - - // 2. If service tags are not empty, find matching services - if (serviceTags.length > 0) { - const services = await _findMatchingServices(serviceTags, transaction) - - // 3. If services are not empty, build listeners and update router config - if (services.length > 0) { - // Get router microservice - const routerName = `router-${fog.uuid.toLowerCase()}` - const routerMicroservice = await MicroserviceManager.findOne({ name: routerName }, transaction) - if (!routerMicroservice) { - throw new Errors.NotFoundError(`Router microservice not found: ${routerName}`) - } - let config = JSON.parse(routerMicroservice.config || '{}') - - // For each service, build listener and merge - for (const service of services) { - const listenerConfig = _buildTcpListenerForFog(service, fog.uuid) - config = _mergeTcpListener(config, listenerConfig) - } - - // Update router microservice config - await MicroserviceManager.update( - { uuid: routerMicroservice.uuid }, - { config: JSON.stringify(config) }, - transaction - ) - - // Update change tracking - await ChangeTrackingService.update(fog.uuid, ChangeTrackingService.events.microserviceConfig, transaction) - } - } - } - - const res = { - uuid: fog.uuid - } - - await ChangeTrackingService.create(fog.uuid, transaction) - - if (fogData.abstractedHardwareEnabled) { - await _createHalMicroserviceForFog(fog, null, transaction) - } - - if (fogData.bluetoothEnabled) { - await _createBluetoothMicroserviceForFog(fog, null, transaction) - } - - await ChangeTrackingService.update(createFogData.uuid, ChangeTrackingService.events.microserviceCommon, transaction) - - return res -} - -async function _setTags (fogModel, tagsArray, transaction) { - if (tagsArray) { - let tags = [] - for (const tag of tagsArray) { - let tagModel = await TagsManager.findOne({ value: tag }, transaction) - if (!tagModel) { - tagModel = await TagsManager.create({ value: tag }, transaction) - } - tags.push(tagModel) - } - await fogModel.setTags(tags) - } -} - -async function updateFogEndPoint (fogData, isCLI, transaction) { - await Validator.validate(fogData, Validator.schemas.iofogUpdate) - - const queryFogData = { uuid: fogData.uuid } - - let updateFogData = { - name: fogData.name, - location: fogData.location, - latitude: fogData.latitude, - longitude: fogData.longitude, - gpsMode: fogData.latitude || fogData.longitude ? 'manual' : undefined, - description: fogData.description, - networkInterface: fogData.networkInterface, - dockerUrl: fogData.dockerUrl, - containerEngine: fogData.containerEngine, - deploymentType: fogData.deploymentType, - diskLimit: fogData.diskLimit, - diskDirectory: fogData.diskDirectory, - memoryLimit: fogData.memoryLimit, - cpuLimit: fogData.cpuLimit, - logLimit: fogData.logLimit, - logDirectory: fogData.logDirectory, - logFileCount: fogData.logFileCount, - statusFrequency: fogData.statusFrequency, - changeFrequency: fogData.changeFrequency, - deviceScanFrequency: fogData.deviceScanFrequency, - bluetoothEnabled: fogData.bluetoothEnabled, - watchdogEnabled: fogData.watchdogEnabled, - isSystem: fogData.isSystem, - abstractedHardwareEnabled: fogData.abstractedHardwareEnabled, - fogTypeId: fogData.fogType, - logLevel: fogData.logLevel, - dockerPruningFrequency: fogData.dockerPruningFrequency, - host: fogData.host, - availableDiskThreshold: fogData.availableDiskThreshold, - timeZone: fogData.timeZone - } - updateFogData = AppHelper.deleteUndefinedFields(updateFogData) - - const oldFog = await FogManager.findOne(queryFogData, transaction) - if (!oldFog) { - throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.INVALID_IOFOG_UUID, fogData.uuid)) - } - - // Update tags - await _setTags(oldFog, fogData.tags, transaction) - - if (updateFogData.name) { - const conflictQuery = isCLI - ? { name: updateFogData.name, uuid: { [Op.not]: fogData.uuid } } - : { name: updateFogData.name, uuid: { [Op.not]: fogData.uuid } } - const conflict = await FogManager.findOne(conflictQuery, transaction) - if (conflict) { - throw new Errors.ValidationError(AppHelper.formatMessage(ErrorMessages.DUPLICATE_NAME, updateFogData.name)) - } - } - - // Update router - // Get all router config informations - const router = await oldFog.getRouter() - const host = fogData.host || lget(router, 'host') - const upstreamRoutersConnections = router ? (await RouterConnectionManager.findAllWithRouters({ sourceRouter: router.id }, transaction) || []) : [] - const upstreamRoutersIofogUuid = fogData.upstreamRouters || await Promise.all(upstreamRoutersConnections.map(connection => connection.dest.iofogUuid)) - const routerMode = fogData.routerMode || (router ? (router.isEdge ? 'edge' : 'interior') : 'none') - const messagingPort = fogData.messagingPort || (router ? router.messagingPort : null) - const interRouterPort = fogData.interRouterPort || (router ? router.interRouterPort : null) - const edgeRouterPort = fogData.edgeRouterPort || (router ? router.edgeRouterPort : null) - let networkRouter - - const isSystem = updateFogData.isSystem === undefined ? oldFog.isSystem : updateFogData.isSystem - if (isSystem && routerMode !== 'interior') { - throw new Errors.ValidationError(AppHelper.formatMessage(ErrorMessages.INVALID_ROUTER_MODE, fogData.routerMode)) - } - - let isRouterModeChanged = false - const oldRouterMode = (router ? (router.isEdge ? 'edge' : 'interior') : 'none') - if (fogData.routerMode && fogData.routerMode !== oldRouterMode) { - if (fogData.routerMode === 'none' || oldRouterMode === 'none') { - isRouterModeChanged = true - } - } - // Add certificate handling - await _handleRouterCertificates(fogData, fogData.uuid, isRouterModeChanged, transaction) - - if (routerMode === 'none') { - networkRouter = await RouterService.getNetworkRouter(fogData.networkRouter) - if (!networkRouter) { - throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.INVALID_ROUTER, !fogData.networkRouter ? Constants.DEFAULT_ROUTER_NAME : fogData.networkRouter)) - } - // Only delete previous router if there is a network router - if (router) { - // New router mode is none, delete existing router - await _deleteFogRouter(fogData, transaction) - } - } else { - const defaultRouter = await RouterManager.findOne({ isDefault: true }, transaction) - const upstreamRouters = await RouterService.validateAndReturnUpstreamRouters(upstreamRoutersIofogUuid, oldFog.isSystem, defaultRouter) - if (!router) { - // Router does not exist yet - networkRouter = await RouterService.createRouterForFog(fogData, oldFog.uuid, upstreamRouters) - // --- Service Distribution Logic --- - // 1. Extract service tags - const serviceTags = await _extractServiceTags(fogData.tags) - - // 2. If service tags are not empty, find matching services - if (serviceTags.length > 0) { - const services = await _findMatchingServices(serviceTags, transaction) - - // 3. If services are not empty, build listeners and update router config - if (services.length > 0) { - // Get router microservice - const routerName = `router-${fogData.uuid.toLowerCase()}` - const routerMicroservice = await MicroserviceManager.findOne({ name: routerName }, transaction) - if (!routerMicroservice) { - throw new Errors.NotFoundError(`Router microservice not found: ${routerName}`) - } - let config = JSON.parse(routerMicroservice.config || '{}') - - // For each service, build listener and merge - for (const service of services) { - const listenerConfig = _buildTcpListenerForFog(service, fogData.uuid) - config = _mergeTcpListener(config, listenerConfig) - } - - // Update router microservice config - await MicroserviceManager.update( - { uuid: routerMicroservice.uuid }, - { config: JSON.stringify(config) }, - transaction - ) - - // Update change tracking - await ChangeTrackingService.update(fogData.uuid, ChangeTrackingService.events.microserviceConfig, transaction) - } - } - } else { - // Extract existing TCP connectors before updating config - const existingConnectors = await _extractExistingTcpConnectors(fogData.uuid, transaction) - // Update existing router - networkRouter = await RouterService.updateRouter(router, { - messagingPort, interRouterPort, edgeRouterPort, isEdge: routerMode === 'edge', host - }, upstreamRouters, fogData.containerEngine) - - // --- Service Distribution Logic --- - // 1. Extract service tags - const serviceTags = await _extractServiceTags(fogData.tags) - - // Get router microservice for config updates - const routerName = `router-${fogData.uuid.toLowerCase()}` - const routerMicroservice = await MicroserviceManager.findOne({ name: routerName }, transaction) - if (!routerMicroservice) { - throw new Errors.NotFoundError(`Router microservice not found: ${routerName}`) - } - let config = JSON.parse(routerMicroservice.config || '{}') - - // 2. If service tags are not empty, find matching services and build listeners - if (serviceTags.length > 0) { - const services = await _findMatchingServices(serviceTags, transaction) - - // 3. If services are not empty, build and merge listeners - if (services.length > 0) { - // For each service, build listener and merge - for (const service of services) { - const listenerConfig = _buildTcpListenerForFog(service, fogData.uuid) - config = _mergeTcpListener(config, listenerConfig) - } - } - } - - // 4. Merge back existing connectors if any - if (existingConnectors && Object.keys(existingConnectors).length > 0) { - for (const connectorName in existingConnectors) { - const connectorObj = existingConnectors[connectorName] - config = _mergeTcpConnector(config, connectorObj) - } - } - - // Update router microservice config - await MicroserviceManager.update( - { uuid: routerMicroservice.uuid }, - { config: JSON.stringify(config) }, - transaction - ) - - // Update change tracking - await ChangeTrackingService.update(fogData.uuid, ChangeTrackingService.events.microserviceConfig, transaction) - await ChangeTrackingService.update(fogData.uuid, ChangeTrackingService.events.routerChanged, transaction) - } - } - updateFogData.routerId = networkRouter.id - - // If router changed, set routerChanged flag - if (updateFogData.routerId !== oldFog.routerId || updateFogData.routerMode !== oldFog.routerMode) { - await ChangeTrackingService.update(fogData.uuid, ChangeTrackingService.events.routerChanged, transaction) - await ChangeTrackingService.update(fogData.uuid, ChangeTrackingService.events.microserviceList, transaction) - } - - await FogManager.update(queryFogData, updateFogData, transaction) - await ChangeTrackingService.update(fogData.uuid, ChangeTrackingService.events.config, transaction) - - let msChanged = false - - // Update Microservice extra hosts - if (updateFogData.host && updateFogData.host !== oldFog.host) { - await _updateMicroserviceExtraHosts(fogData.uuid, updateFogData.host, transaction) - } - - if (oldFog.abstractedHardwareEnabled === true && fogData.abstractedHardwareEnabled === false) { - await _deleteHalMicroserviceByFog(fogData, transaction) - msChanged = true - } - if (oldFog.abstractedHardwareEnabled === false && fogData.abstractedHardwareEnabled === true) { - await _createHalMicroserviceForFog(fogData, oldFog, transaction) - msChanged = true - } - - if (oldFog.bluetoothEnabled === true && fogData.bluetoothEnabled === false) { - await _deleteBluetoothMicroserviceByFog(fogData, transaction) - msChanged = true - } - if (oldFog.bluetoothEnabled === false && fogData.bluetoothEnabled === true) { - await _createBluetoothMicroserviceForFog(fogData, oldFog, transaction) - msChanged = true - } - - if (msChanged) { - await ChangeTrackingService.update(fogData.uuid, ChangeTrackingService.events.microserviceCommon, transaction) - } -} - -async function _updateMicroserviceExtraHosts (fogUuid, host, transaction) { - const microserviceExtraHosts = await MicroserviceExtraHostManager.findAll({ targetFogUuid: fogUuid }, transaction) - for (const extraHost of microserviceExtraHosts) { - extraHost.value = host - await extraHost.save() - // Update tracking change for microservice - await MicroserviceExtraHostManager.updateOriginMicroserviceChangeTracking(extraHost, transaction) - } -} - -async function _updateProxyRouters (fogId, router, transaction) { - const proxyCatalog = await CatalogService.getProxyCatalogItem(transaction) - const proxyMicroservices = await MicroserviceManager.findAll({ catalogItemId: proxyCatalog.id, iofogUuid: fogId }, transaction) - for (const proxyMicroservice of proxyMicroservices) { - const config = JSON.parse(proxyMicroservice.config || '{}') - config.networkRouter = { - host: router.host, - port: router.messagingPort - } - await MicroserviceManager.updateIfChanged({ uuid: proxyMicroservice.uuid }, { config: JSON.stringify(config) }, transaction) - await ChangeTrackingService.update(fogId, ChangeTrackingService.events.microserviceConfig, transaction) - } -} - -async function _deleteFogRouter (fogData, transaction) { - const router = await RouterManager.findOne({ iofogUuid: fogData.uuid }, transaction) - const defaultRouter = await RouterManager.findOne({ isDefault: true }, transaction) - - // If agent had a router, delete router and update linked routers - if (!router) { - // Router mode is none, there is nothing to do - return - } - - const routerId = router.id - const routerConnections = await RouterConnectionManager.findAllWithRouters({ [Op.or]: [{ destRouter: routerId }, { sourceRouter: routerId }] }, transaction) - // Delete all router connections, and set routerChanged flag for linked routers - if (routerConnections) { - for (const connection of routerConnections) { - const router = connection.source.id === routerId ? connection.dest : connection.source - // Delete router connection - await RouterConnectionManager.delete({ id: connection.id }, transaction) - // Update config for downstream routers - if (connection.dest.id === routerId) { - // in order to keep downstream routers in the network, we connect them to default router - if (defaultRouter) { - await RouterConnectionManager.create({ sourceRouter: router.id, destRouter: defaultRouter.id }, transaction) - } - - // Update router config - await RouterService.updateConfig(router.id, fogData.containerEngine, transaction) - // Set routerChanged flag - await ChangeTrackingService.update(router.iofogUuid, ChangeTrackingService.events.routerChanged, transaction) - } - } - } - - // Connect the agents to default router - if (defaultRouter) { - const connectedAgents = await FogManager.findAll({ routerId }, transaction) - for (const connectedAgent of connectedAgents) { - await FogManager.update({ uuid: connectedAgent.uuid }, { routerId: defaultRouter.id }, transaction) - await _updateProxyRouters(connectedAgent.uuid, defaultRouter, transaction) - await ChangeTrackingService.update(connectedAgent.uuid, ChangeTrackingService.events.routerChanged, transaction) - } - } - // Delete router - await RouterManager.delete({ iofogUuid: fogData.uuid }, transaction) - // Delete router msvc - const routerCatalog = await CatalogService.getRouterCatalogItem(transaction) - await MicroserviceManager.delete({ catalogItemId: routerCatalog.id, iofogUuid: fogData.uuid }, transaction) - await ApplicationManager.delete({ name: `system-${fogData.uuid.toLowerCase()}` }, transaction) -} - -async function deleteFogEndPoint (fogData, isCLI, transaction) { - await Validator.validate(fogData, Validator.schemas.iofogDelete) - - const queryFogData = { uuid: fogData.uuid } - - const fog = await FogManager.findOne(queryFogData, transaction) - if (!fog) { - throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.INVALID_IOFOG_UUID, fogData.uuid)) - } - - await _deleteFogRouter(fogData, transaction) - - await _processDeleteCommand(fog, transaction) -} - -function _getRouterUuid (router, defaultRouter) { - return (defaultRouter && (router.id === defaultRouter.id)) ? Constants.DEFAULT_ROUTER_NAME : router.iofogUuid -} - -async function _getFogRouterConfig (fog, transaction) { - // Get fog router config - const defaultRouter = await RouterManager.findOne({ isDefault: true }, transaction) - const router = await fog.getRouter() - const routerConfig = { - - } - // Router mode is either interior or edge - if (router) { - routerConfig.routerMode = router.isEdge ? 'edge' : 'interior' - routerConfig.messagingPort = router.messagingPort - if (routerConfig.routerMode === 'interior') { - routerConfig.interRouterPort = router.interRouterPort - routerConfig.edgeRouterPort = router.edgeRouterPort - } - // Get upstream routers - const upstreamRoutersConnections = await RouterConnectionManager.findAllWithRouters({ sourceRouter: router.id }, transaction) - routerConfig.upstreamRouters = upstreamRoutersConnections ? upstreamRoutersConnections.map(r => _getRouterUuid(r.dest, defaultRouter)) : [] - } else { - routerConfig.routerMode = 'none' - const networkRouter = await RouterManager.findOne({ id: fog.routerId }, transaction) - if (networkRouter) { - routerConfig.networkRouter = _getRouterUuid(networkRouter, defaultRouter) - } - } - - return routerConfig -} - -async function _getFogEdgeResources (fog, transaction) { - const resourceAttributes = [ - 'name', - 'version', - 'description', - 'interfaceProtocol', - 'displayName', - 'displayIcon', - 'displayColor' - ] - const resources = await fog.getEdgeResources({ attributes: resourceAttributes }) - return resources.map(EdgeResourceService.buildGetObject) -} - -async function _getFogVolumeMounts (fog, transaction) { - const volumeMountAttributes = [ - 'name', - 'version', - 'configMapName', - 'secretName' - ] - const volumeMounts = await fog.getVolumeMounts({ attributes: volumeMountAttributes }) - return volumeMounts.map(vm => { - return { - name: vm.name, - version: vm.version, - configMapName: vm.configMapName, - secretName: vm.secretName - } - }) -} - -async function _getFogExtraInformation (fog, transaction) { - const routerConfig = await _getFogRouterConfig(fog, transaction) - const edgeResources = await _getFogEdgeResources(fog, transaction) - const volumeMounts = await _getFogVolumeMounts(fog, transaction) - // Transform to plain JS object - if (fog.toJSON && typeof fog.toJSON === 'function') { - fog = fog.toJSON() - } - return { ...fog, tags: _mapTags(fog), ...routerConfig, edgeResources, volumeMounts } -} - -// Map tags to string array -// Return plain JS object -function _mapTags (fog) { - return fog.tags ? fog.tags.map(t => t.value) : [] -} - -/** - * Extracts service-related tags from fog node tags - * @param {Array} fogTags - Array of tags from fog node - * @returns {Array} Array of service tags (e.g., ["all", "foo", "bar"]) - */ -async function _extractServiceTags (fogTags) { - if (!fogTags || !Array.isArray(fogTags)) { - return [] - } - - // Filter tags that start with SERVICE_ANNOTATION_TAG - const serviceTags = fogTags - .filter(tag => tag.startsWith(SERVICE_ANNOTATION_TAG)) - .map(tag => { - // Extract the value after the colon - const parts = tag.split(':') - return parts.length > 1 ? parts[1].trim() : '' - }) - .filter(tag => tag !== '') // Remove empty tags - - // If we have "all" tag, return just that - if (serviceTags.includes('all')) { - return ['all'] - } - - return serviceTags -} - -async function getFog (fogData, isCLI, transaction) { - await Validator.validate(fogData, Validator.schemas.iofogGet) - - const queryFogData = fogData.uuid ? { uuid: fogData.uuid } : { name: fogData.name } - - const fog = await FogManager.findOneWithTags(queryFogData, transaction) - if (!fog) { - throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.INVALID_IOFOG_UUID, fogData.uuid)) - } - - return _getFogExtraInformation(fog, transaction) -} - -async function getFogEndPoint (fogData, isCLI, transaction) { - return getFog(fogData, isCLI, transaction) -} - -// async function getFogListEndPoint (filters, isCLI, isSystem, transaction) { -async function getFogListEndPoint (filters, isCLI, transaction) { - await Validator.validate(filters, Validator.schemas.iofogFilters) - - // // If listing system agent through REST API, make sure user is authenticated - // if (isSystem && !isCLI && !lget('id')) { - // throw new Errors.AuthenticationError('Unauthorized') - // } - - // const queryFogData = isSystem ? { isSystem } : (isCLI ? {} : { isSystem: false }) - const queryFogData = {} - - let fogs = await FogManager.findAllWithTags(queryFogData, transaction) - fogs = _filterFogs(fogs, filters) - - // Map all tags - // Get router config info for all fogs - fogs = await Promise.all(fogs.map(async (fog) => _getFogExtraInformation(fog, transaction))) - return { - fogs - } -} - -async function generateProvisioningKeyEndPoint (fogData, isCLI, transaction) { - await Validator.validate(fogData, Validator.schemas.iofogGenerateProvision) - - const queryFogData = { uuid: fogData.uuid } - - const newProvision = { - iofogUuid: fogData.uuid, - provisionKey: AppHelper.generateRandomString(16), - expirationTime: new Date().getTime() + (10 * 60 * 1000) - } - - const fog = await FogManager.findOne(queryFogData, transaction) - if (!fog) { - throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.INVALID_IOFOG_UUID, fogData.uuid)) - } - - const provisioningKeyData = await FogProvisionKeyManager.updateOrCreate({ iofogUuid: fogData.uuid }, newProvision, transaction) - - const devMode = process.env.DEV_MODE || config.get('server.devMode') - const sslCert = process.env.SSL_CERT || config.get('server.ssl.path.cert') - const intermedKey = process.env.INTERMEDIATE_CERT || config.get('server.ssl.path.intermediateCert') - const sslCertBase64 = config.get('server.ssl.base64.cert') - const intermedKeyBase64 = config.get('server.ssl.base64.intermediateCert') - const hasFileBasedSSL = !devMode && sslCert - const hasBase64SSL = !devMode && sslCertBase64 - let caCert = '' - - if (!devMode) { - if (hasFileBasedSSL) { - try { - if (intermedKey) { - const certData = fs.readFileSync(intermedKey) - caCert = Buffer.from(certData).toString('base64') - } else { - const certData = fs.readFileSync(sslCert) - caCert = Buffer.from(certData).toString('base64') - } - } catch (error) { - throw new Errors.ValidationError('Failed to read SSL certificate file') - } - } - if (hasBase64SSL) { - if (intermedKeyBase64) { - caCert = intermedKeyBase64 - } else if (sslCertBase64) { - caCert = sslCertBase64 - } - } - } - return { - key: provisioningKeyData.provisionKey, - expirationTime: provisioningKeyData.expirationTime, - caCert: caCert - } -} - -async function setFogVersionCommandEndPoint (fogVersionData, isCLI, transaction) { - await Validator.validate(fogVersionData, Validator.schemas.iofogSetVersionCommand) - - const queryFogData = { uuid: fogVersionData.uuid } - - const newVersionCommand = { - iofogUuid: fogVersionData.uuid, - versionCommand: fogVersionData.versionCommand - } - - const fog = await FogManager.findOne(queryFogData, transaction) - if (!fog) { - throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.INVALID_IOFOG_UUID, queryFogData.uuid)) - } - - if (!fog.isReadyToRollback && fogVersionData.versionCommand === 'rollback') { - throw new Errors.ValidationError(ErrorMessages.INVALID_VERSION_COMMAND_ROLLBACK) - } - if (!fog.isReadyToUpgrade && fogVersionData.versionCommand === 'upgrade') { - throw new Errors.ValidationError(ErrorMessages.INVALID_VERSION_COMMAND_UPGRADE) - } - - await generateProvisioningKeyEndPoint({ uuid: fogVersionData.uuid }, isCLI, transaction) - await FogVersionCommandManager.updateOrCreate({ iofogUuid: fogVersionData.uuid }, newVersionCommand, transaction) - await ChangeTrackingService.update(fogVersionData.uuid, ChangeTrackingService.events.version, transaction) -} - -async function setFogRebootCommandEndPoint (fogData, isCLI, transaction) { - await Validator.validate(fogData, Validator.schemas.iofogReboot) - - const queryFogData = { uuid: fogData.uuid } - - const fog = await FogManager.findOne(queryFogData, transaction) - if (!fog) { - throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.INVALID_IOFOG_UUID, fogData.uuid)) - } - - await ChangeTrackingService.update(fogData.uuid, ChangeTrackingService.events.reboot, transaction) -} - -async function getHalHardwareInfoEndPoint (uuidObj, isCLI, transaction) { - await Validator.validate(uuidObj, Validator.schemas.halGet) - - const fog = await FogManager.findOne({ - uuid: uuidObj.uuid - }, transaction) - if (!fog) { - throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.INVALID_IOFOG_UUID, uuidObj.uuid)) - } - - return HWInfoManager.findOne({ - iofogUuid: uuidObj.uuid - }, transaction) -} - -async function getHalUsbInfoEndPoint (uuidObj, isCLI, transaction) { - await Validator.validate(uuidObj, Validator.schemas.halGet) - - const fog = await FogManager.findOne({ - uuid: uuidObj.uuid - }, transaction) - if (!fog) { - throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.INVALID_IOFOG_UUID, uuidObj.uuid)) - } - - return USBInfoManager.findOne({ - iofogUuid: uuidObj.uuid - }, transaction) -} - -function _filterFogs (fogs, filters) { - if (!filters) { - return fogs - } - - const filtered = [] - fogs.forEach((fog) => { - let isMatchFog = true - filters.some((filter) => { - const fld = filter.key - const val = filter.value - const condition = filter.condition - const isMatchField = (condition === 'equals' && fog[fld] && fog[fld] === val) || - (condition === 'has' && fog[fld] && fog[fld].includes(val)) - if (!isMatchField) { - isMatchFog = false - return false - } - }) - if (isMatchFog) { - filtered.push(fog) - } - }) - return filtered -} - -async function _processDeleteCommand (fog, transaction) { - const microservices = await MicroserviceManager.findAll({ iofogUuid: fog.uuid }, transaction) - for (const microservice of microservices) { - await MicroserviceService.deleteMicroserviceWithRoutesAndPortMappings(microservice, transaction) - } - - await ChangeTrackingService.update(fog.uuid, ChangeTrackingService.events.deleteNode, transaction) - await FogManager.delete({ uuid: fog.uuid }, transaction) -} - -async function _createHalMicroserviceForFog (fogData, oldFog, transaction) { - const halItem = await CatalogService.getHalCatalogItem(transaction) - - const halMicroserviceData = { - uuid: AppHelper.generateUUID(), - name: `hal-${fogData.uuid.toLowerCase()}`, - config: '{}', - catalogItemId: halItem.id, - iofogUuid: fogData.uuid, - rootHostAccess: true, - logSize: Constants.MICROSERVICE_DEFAULT_LOG_SIZE, - configLastUpdated: Date.now() - } - - const application = await ApplicationManager.findOne({ name: `system-${fogData.uuid.toLowerCase()}` }, transaction) - halMicroserviceData.applicationId = application.id - await MicroserviceManager.create(halMicroserviceData, transaction) - await MicroserviceStatusManager.create({ microserviceUuid: halMicroserviceData.uuid }, transaction) -} - -async function _deleteHalMicroserviceByFog (fogData, transaction) { - const halItem = await CatalogService.getHalCatalogItem(transaction) - const deleteHalMicroserviceData = { - iofogUuid: fogData.uuid, - catalogItemId: halItem.id - } - - const application = await ApplicationManager.findOne({ name: `system-${fogData.uuid.toLowerCase()}` }, transaction) - deleteHalMicroserviceData.applicationId = application.id - await MicroserviceManager.delete(deleteHalMicroserviceData, transaction) -} - -async function _createBluetoothMicroserviceForFog (fogData, oldFog, transaction) { - const bluetoothItem = await CatalogService.getBluetoothCatalogItem(transaction) - - const bluetoothMicroserviceData = { - uuid: AppHelper.generateUUID(), - name: `ble-${fogData.uuid.toLowerCase()}`, - config: '{}', - catalogItemId: bluetoothItem.id, - iofogUuid: fogData.uuid, - rootHostAccess: true, - logSize: Constants.MICROSERVICE_DEFAULT_LOG_SIZE, - configLastUpdated: Date.now() - } - - const application = await ApplicationManager.findOne({ name: `system-${fogData.uuid.toLowerCase()}` }, transaction) - bluetoothMicroserviceData.applicationId = application.id - await MicroserviceManager.create(bluetoothMicroserviceData, transaction) - await MicroserviceStatusManager.create({ microserviceUuid: bluetoothMicroserviceData.uuid }, transaction) -} - -async function _deleteBluetoothMicroserviceByFog (fogData, transaction) { - const bluetoothItem = await CatalogService.getBluetoothCatalogItem(transaction) - const deleteBluetoothMicroserviceData = { - iofogUuid: fogData.uuid, - catalogItemId: bluetoothItem.id - } - const application = await ApplicationManager.findOne({ name: `system-${fogData.uuid.toLowerCase()}` }, transaction) - deleteBluetoothMicroserviceData.applicationId = application.id - - await MicroserviceManager.delete(deleteBluetoothMicroserviceData, transaction) -} - -async function setFogPruneCommandEndPoint (fogData, isCLI, transaction) { - await Validator.validate(fogData, Validator.schemas.iofogPrune) - - const queryFogData = { uuid: fogData.uuid } - - const fog = await FogManager.findOne(queryFogData, transaction) - if (!fog) { - throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.INVALID_IOFOG_UUID, fogData.uuid)) - } - - await ChangeTrackingService.update(fogData.uuid, ChangeTrackingService.events.prune, transaction) -} - -/** - * Finds services that match the fog node's service tags - * @param {Array} serviceTags - Array of service tags from fog node - * @param {Object} transaction - Database transaction - * @returns {Promise>} Array of matching services - */ -async function _findMatchingServices (serviceTags, transaction) { - if (!serviceTags || serviceTags.length === 0) { - return [] - } - - // If 'all' tag is present, get all services - if (serviceTags.includes('all')) { - return ServiceManager.findAllWithTags({}, transaction) - } - - // For each service tag, find matching services - const servicesPromises = serviceTags.map(async (tag) => { - const queryData = { - '$tags.value$': `${tag}` - } - return ServiceManager.findAllWithTags(queryData, transaction) - }) - - // Wait for all queries to complete - const servicesArrays = await Promise.all(servicesPromises) - - // Flatten arrays and remove duplicates based on service name - const seen = new Set() - const uniqueServices = servicesArrays - .flat() - .filter(service => { - if (seen.has(service.name)) { - return false - } - seen.add(service.name) - return true - }) - - return uniqueServices -} - -/** - * Builds TCP listener configuration for a service on a specific fog node - * @param {Object} service - Service object containing name and bridgePort - * @param {string} fogNodeUuid - UUID of the fog node - * @returns {Object} TCP listener configuration - */ -function _buildTcpListenerForFog (service, fogNodeUuid) { - return { - name: `${service.name}-listener`, - port: service.bridgePort.toString(), - address: service.name, - siteId: fogNodeUuid - } -} - -/** - * Gets the router microservice configuration for a fog node - * @param {string} fogNodeUuid - UUID of the fog node - * @param {Object} transaction - Database transaction - * @returns {Promise} Router microservice configuration - */ -async function _getRouterMicroserviceConfig (fogNodeUuid, transaction) { - const routerName = `router-${fogNodeUuid.toLowerCase()}` - const routerMicroservice = await MicroserviceManager.findOne({ name: routerName }, transaction) - if (!routerMicroservice) { - throw new Errors.NotFoundError(`Router microservice not found: ${routerName}`) - } - const routerConfig = JSON.parse(routerMicroservice.config || '{}') - return routerConfig -} - -/** - * Extracts existing TCP connectors from router configuration - * @param {string} fogNodeUuid - UUID of the fog node - * @param {Object} transaction - Database transaction - * @returns {Promise} Object containing TCP connectors - */ -async function _extractExistingTcpConnectors (fogNodeUuid, transaction) { - const routerConfig = await _getRouterMicroserviceConfig(fogNodeUuid, transaction) - // Return empty object if no bridges or tcpConnectors exist - if (!routerConfig.bridges || !routerConfig.bridges.tcpConnectors) { - return {} - } - - return routerConfig.bridges.tcpConnectors -} - -/** - * Merges a single TCP connector into router configuration - * @param {Object} routerConfig - Base router configuration - * @param {Object} connectorObj - TCP connector object (must have 'name' property) - * @returns {Object} Updated router configuration - */ -function _mergeTcpConnector (routerConfig, connectorObj) { - if (!connectorObj || !connectorObj.name) { - throw new Error('Connector object must have a name property') - } - if (!routerConfig.bridges) { - routerConfig.bridges = {} - } - if (!routerConfig.bridges.tcpConnectors) { - routerConfig.bridges.tcpConnectors = {} - } - routerConfig.bridges.tcpConnectors[connectorObj.name] = connectorObj - return routerConfig -} - -/** - * Merges a single TCP listener into router configuration - * @param {Object} routerConfig - Base router configuration - * @param {Object} listenerObj - TCP listener object (must have 'name' property) - * @returns {Object} Updated router configuration - */ -function _mergeTcpListener (routerConfig, listenerObj) { - if (!listenerObj || !listenerObj.name) { - throw new Error('Listener object must have a name property') - } - if (!routerConfig.bridges) { - routerConfig.bridges = {} - } - if (!routerConfig.bridges.tcpListeners) { - routerConfig.bridges.tcpListeners = {} - } - routerConfig.bridges.tcpListeners[listenerObj.name] = listenerObj - return routerConfig -} - -module.exports = { - createFogEndPoint: TransactionDecorator.generateTransaction(createFogEndPoint), - updateFogEndPoint: TransactionDecorator.generateTransaction(updateFogEndPoint), - deleteFogEndPoint: TransactionDecorator.generateTransaction(deleteFogEndPoint), - getFogEndPoint: TransactionDecorator.generateTransaction(getFogEndPoint), - getFogListEndPoint: TransactionDecorator.generateTransaction(getFogListEndPoint), - generateProvisioningKeyEndPoint: TransactionDecorator.generateTransaction(generateProvisioningKeyEndPoint), - setFogVersionCommandEndPoint: TransactionDecorator.generateTransaction(setFogVersionCommandEndPoint), - setFogRebootCommandEndPoint: TransactionDecorator.generateTransaction(setFogRebootCommandEndPoint), - getHalHardwareInfoEndPoint: TransactionDecorator.generateTransaction(getHalHardwareInfoEndPoint), - getHalUsbInfoEndPoint: TransactionDecorator.generateTransaction(getHalUsbInfoEndPoint), - getFog: getFog, - setFogPruneCommandEndPoint: TransactionDecorator.generateTransaction(setFogPruneCommandEndPoint), - _extractServiceTags, - _findMatchingServices: TransactionDecorator.generateTransaction(_findMatchingServices), - _buildTcpListenerForFog, - _getRouterMicroserviceConfig: TransactionDecorator.generateTransaction(_getRouterMicroserviceConfig), - _extractExistingTcpConnectors: TransactionDecorator.generateTransaction(_extractExistingTcpConnectors), - _mergeTcpConnector, - _mergeTcpListener, - checkKubernetesEnvironment, - _handleRouterCertificates: TransactionDecorator.generateTransaction(_handleRouterCertificates) -} diff --git a/test/backup/services-service.js b/test/backup/services-service.js deleted file mode 100644 index f2dd81ca2..000000000 --- a/test/backup/services-service.js +++ /dev/null @@ -1,1261 +0,0 @@ -/* - * ******************************************************************************* - * * Copyright (c) 2023 Datasance Teknoloji A.S. - * * - * * This program and the accompanying materials are made available under the - * * terms of the Eclipse Public License v. 2.0 which is available at - * * http://www.eclipse.org/legal/epl-2.0 - * * - * * SPDX-License-Identifier: EPL-2.0 - * ******************************************************************************* - * - */ - -const TransactionDecorator = require('../decorators/transaction-decorator') -const ServiceManager = require('../data/managers/service-manager') -const MicroserviceManager = require('../data/managers/microservice-manager') -const RouterManager = require('../data/managers/router-manager') -const RouterConnectionManager = require('../data/managers/router-connection-manager') -const K8sClient = require('../utils/k8s-client') -const AppHelper = require('../helpers/app-helper') -const config = require('../config') -const Errors = require('../helpers/errors') -const ErrorMessages = require('../helpers/error-messages') -const Validator = require('../schemas') -const logger = require('../logger') -const FogManager = require('../data/managers/iofog-manager') -const TagsManager = require('../data/managers/tags-manager') -const ChangeTrackingService = require('./change-tracking-service') -const ApplicationManager = require('../data/managers/application-manager') -// const { Op } = require('sequelize') - -const K8S_ROUTER_CONFIG_MAP = 'pot-router' -const SERVICE_ANNOTATION_TAG = 'service.datasance.com/tag' - -// Map service tags to string array -// Return plain JS object -function _mapTags (service) { - return service.tags ? service.tags.map(t => t.value) : [] -} - -async function _setTags (serviceModel, tagsArray, transaction) { - if (tagsArray) { - let tags = [] - for (const tag of tagsArray) { - let tagModel = await TagsManager.findOne({ value: tag }, transaction) - if (!tagModel) { - tagModel = await TagsManager.create({ value: tag }, transaction) - } - tags.push(tagModel) - } - await serviceModel.setTags(tags) - } -} - -async function handleServiceDistribution (serviceTags, transaction) { - // Always find fog nodes with 'all' tag - const allTaggedFogNodes = await FogManager.findAllWithTags({ - '$tags.value$': `${SERVICE_ANNOTATION_TAG}: all` - }, transaction) - - // If serviceTags is null or empty, return only fog nodes with 'all' tag - if (!serviceTags || serviceTags.length === 0) { - const uuids = allTaggedFogNodes.map(fog => fog.uuid) - return uuids - } - - // Filter tags that don't contain ':' or '=' - const filteredServiceTags = serviceTags - .filter(tag => tag != null) - .map(tag => String(tag)) - .filter(tag => !tag.includes(':') && !tag.includes('=')) - .filter(tag => tag.length > 0) - - if (filteredServiceTags.length === 0) { - const uuids = allTaggedFogNodes.map(fog => fog.uuid) - return uuids - } - - // Find fog nodes for each filtered tag - const specificTaggedFogNodes = new Set() - for (const tag of filteredServiceTags) { - const fogNodes = await FogManager.findAllWithTags({ - '$tags.value$': `${SERVICE_ANNOTATION_TAG}: ${tag}` - }, transaction) - fogNodes.forEach(fog => specificTaggedFogNodes.add(fog.uuid)) - } - - // Get all tag fog node UUIDs - const allTagUuids = allTaggedFogNodes.map(fog => fog.uuid) - - // Combine both sets of fog nodes and remove duplicates - const allFogUuids = new Set([...allTagUuids, ...Array.from(specificTaggedFogNodes)]) - - return Array.from(allFogUuids) -} - -async function checkKubernetesEnvironment () { - const controlPlane = process.env.CONTROL_PLANE || config.get('app.ControlPlane') - return controlPlane && controlPlane.toLowerCase() === 'kubernetes' -} - -async function validateNonK8sType (serviceConfig) { - const isK8s = await checkKubernetesEnvironment() - if (serviceConfig.type.toLowerCase() !== 'k8s' && isK8s) { - if (!serviceConfig.k8sType || !serviceConfig.servicePort) { - throw new Errors.ValidationError('Kubernetes environment is required for k8s service type(LoadBalancer or ClusterIP or NodePort) and service port') - } - } -} - -async function _validateServiceName (serviceConfig) { - if (serviceConfig.name.toLowerCase() === 'controller' || serviceConfig.name.toLowerCase() === 'router' || serviceConfig.name.toLowerCase() === 'router-internal' || serviceConfig.name.toLowerCase() === 'docker' || serviceConfig.name.toLowerCase() === 'podman' || serviceConfig.name.toLowerCase() === 'kubernetes') { - throw new Errors.ValidationError('Service name cannot be "controller" or "router" or "router-internal" or "docker"') - } -} - -async function validateMicroserviceType (serviceConfig, transaction) { - if (serviceConfig.type.toLowerCase() !== 'microservice') { - return - } - - let microserviceUuid = serviceConfig.resource - - // If resource contains "/", it means user provided "/" - if (serviceConfig.resource.includes('/')) { - const [appName, microserviceName] = serviceConfig.resource.split('/') - const app = await ApplicationManager.findOne({ name: appName }, transaction) - if (!app) { - throw new Errors.ValidationError(AppHelper.formatMessage(ErrorMessages.INVALID_APPLICATION_NAME, appName)) - } - const microservice = await MicroserviceManager.findOne({ - name: microserviceName, - applicationId: app.id - }, transaction) - - if (!microservice) { - throw new Errors.ValidationError(AppHelper.formatMessage(ErrorMessages.INVALID_MICROSERVICE_NAME, serviceConfig.resource)) - } - - microserviceUuid = microservice.uuid - } else { - // User provided UUID directly, validate if microservice exists - const microservice = await MicroserviceManager.findOne({ uuid: serviceConfig.resource }, transaction) - if (!microservice) { - throw new Errors.ValidationError(AppHelper.formatMessage(ErrorMessages.INVALID_MICROSERVICE_UUID, serviceConfig.resource)) - } - } - - // Update resource to be the microservice UUID - serviceConfig.resource = microserviceUuid -} - -async function validateFogServiceType (serviceConfig, transaction) { - if (serviceConfig.type.toLowerCase() !== 'agent') { - return - } - - // First try to find fog node by name - let fogNode = await FogManager.findOne({ name: serviceConfig.resource }, transaction) - - // If not found by name, try to find by UUID - if (!fogNode) { - fogNode = await FogManager.findOne({ uuid: serviceConfig.resource }, transaction) - } - - // If still not found, throw error - if (!fogNode) { - throw new Errors.ValidationError(AppHelper.formatMessage(ErrorMessages.INVALID_IOFOG_UUID, serviceConfig.resource)) - } - - // Always set resource to be the fog node UUID - serviceConfig.resource = fogNode.uuid -} - -async function validateDefaultBridge (serviceConfig, transaction) { - // If defaultBridge is empty, set it to 'default-router' - if (!serviceConfig.defaultBridge) { - logger.debug('Setting default bridge to default-router') - serviceConfig.defaultBridge = 'default-router' - return - } - - // If service type is not microservice or agent, defaultBridge must be 'default-router' - if (serviceConfig.type.toLowerCase() !== 'microservice' && serviceConfig.type.toLowerCase() !== 'agent') { - if (serviceConfig.defaultBridge !== 'default-router') { - throw new Errors.ValidationError(AppHelper.formatMessage(ErrorMessages.INVALID_DEFAULT_BRIDGE, serviceConfig.defaultBridge)) - } - return - } - - // For microservice or agent type, if user provided a UUID instead of 'default-router' - if (serviceConfig.defaultBridge !== 'default-router') { - let iofogUuid - - if (serviceConfig.type.toLowerCase() === 'microservice') { - // Get the microservice to find its iofog node - const microservice = await MicroserviceManager.findOne({ uuid: serviceConfig.resource }, transaction) - if (!microservice) { - throw new Errors.ValidationError(AppHelper.formatMessage(ErrorMessages.INVALID_MICROSERVICE_UUID, serviceConfig.resource)) - } - iofogUuid = microservice.iofogUuid - } else if (serviceConfig.type.toLowerCase() === 'agent') { - // For agent type, the resource is the agent UUID - iofogUuid = serviceConfig.resource - } - - // Get the router for the iofog node - const router = await RouterManager.findOne({ iofogUuid: iofogUuid }, transaction) - if (!router) { - throw new Errors.ValidationError(AppHelper.formatMessage(ErrorMessages.INVALID_ROUTER, iofogUuid)) - } - - // Check if the router has a connection to the specified upstream router - const upstreamRouter = await RouterManager.findOne({ iofogUuid: serviceConfig.defaultBridge }, transaction) - if (!upstreamRouter) { - throw new Errors.ValidationError(AppHelper.formatMessage(ErrorMessages.INVALID_ROUTER, serviceConfig.defaultBridge)) - } - - const routerConnection = await RouterConnectionManager.findOne({ - sourceRouter: router.id, - destRouter: upstreamRouter.id - }, transaction) - - if (!routerConnection) { - throw new Errors.ValidationError(AppHelper.formatMessage(ErrorMessages.INVALID_ROUTER_CONNECTION, serviceConfig.defaultBridge, router.id)) - } - } -} - -async function defineBridgePort (serviceConfig, transaction) { - // Get bridge port range from environment or config - const bridgePortRangeStr = process.env.BRIDGE_PORTS_RANGE || config.get('bridgePorts.range') || '10024-65535' - const [startStr, endStr] = bridgePortRangeStr.split('-') - const start = parseInt(startStr) - const end = parseInt(endStr) - - // Get all existing services to check used ports - const existingServices = await ServiceManager.findAll({}, transaction) - const usedPorts = new Set(existingServices.map(service => service.bridgePort)) - - // Find the first available port in the range - let bridgePort = start - while (bridgePort <= end) { - if (!usedPorts.has(bridgePort)) { - serviceConfig.bridgePort = bridgePort - return - } - bridgePort++ - } - - // If we get here, no ports are available - throw new Errors.ValidationError(AppHelper.formatMessage(ErrorMessages.NO_AVAILABLE_BRIDGE_PORT, bridgePortRangeStr)) -} - -// Helper function to determine host based on service type -async function _determineConnectorHost (serviceConfig, transaction) { - switch (serviceConfig.type.toLowerCase()) { - case 'microservice': - const microservice = await MicroserviceManager.findOne({ uuid: serviceConfig.resource }, transaction) - if (microservice.rootHostAccess) { - return 'iofog' - } else { - return `iofog_${serviceConfig.resource}` - } - case 'agent': - return 'iofog' - case 'k8s': - case 'external': - return serviceConfig.resource - default: - throw new Errors.ValidationError(`Invalid service type: ${serviceConfig.type}`) - } -} - -// Helper function to determine siteId for connector -async function _determineConnectorSiteId (serviceConfig, transaction) { - switch (serviceConfig.type.toLowerCase()) { - case 'microservice': { - const microservice = await MicroserviceManager.findOne({ uuid: serviceConfig.resource }, transaction) - if (!microservice) { - throw new Errors.NotFoundError(`Microservice not found: ${serviceConfig.resource}`) - } - return microservice.iofogUuid - } - case 'agent': - return serviceConfig.resource - case 'k8s': - case 'external': - return 'default-router' - default: - throw new Errors.ValidationError(`Invalid service type: ${serviceConfig.type}`) - } -} - -// Helper function to determine processId for connector -async function _determineConnectorProcessId (serviceConfig) { - switch (serviceConfig.type.toLowerCase()) { - case 'microservice': - return serviceConfig.resource - case 'agent': - return `${serviceConfig.resource}-local-${serviceConfig.targetPort}` - case 'k8s': - return `${serviceConfig.resource}-k8s-${serviceConfig.targetPort}` - case 'external': - return `${serviceConfig.resource}-external-${serviceConfig.targetPort}` - default: - throw new Errors.ValidationError(`Invalid service type: ${serviceConfig.type}`) - } -} - -// Helper function to build tcpConnector configuration -async function _buildTcpConnector (serviceConfig, transaction) { - const host = await _determineConnectorHost(serviceConfig, transaction) - const siteId = await _determineConnectorSiteId(serviceConfig, transaction) - const processId = await _determineConnectorProcessId(serviceConfig) - - return { - name: `${serviceConfig.name}-connector`, - host, - port: serviceConfig.targetPort.toString(), - address: serviceConfig.name, - siteId, - processId - } -} - -// Helper function to build tcpListener configuration -async function _buildTcpListener (serviceConfig, fogNodeUuid = null) { - const listener = { - name: `${serviceConfig.name}-listener`, - port: serviceConfig.bridgePort.toString(), - address: serviceConfig.name, - siteId: fogNodeUuid || serviceConfig.defaultBridge - } - return listener -} - -// Helper function to get router microservice by fog node UUID -async function _getRouterMicroservice (fogNodeUuid, transaction) { - const routerName = `router-${fogNodeUuid.toLowerCase()}` - const routerMicroservice = await MicroserviceManager.findOne({ name: routerName }, transaction) - if (!routerMicroservice) { - throw new Errors.NotFoundError(`Router microservice not found: ${routerName}`) - } - return routerMicroservice -} - -// Helper function to update router config in Kubernetes environment -async function _updateK8sRouterConfig (config) { - const configMap = await K8sClient.getConfigMap(K8S_ROUTER_CONFIG_MAP) - if (!configMap) { - throw new Errors.NotFoundError(`ConfigMap not found: ${K8S_ROUTER_CONFIG_MAP}`) - } - - const patchData = { - data: { - 'skrouterd.json': JSON.stringify(config) - } - } - - await K8sClient.patchConfigMap(K8S_ROUTER_CONFIG_MAP, patchData) -} - -// Helper function to update router microservice config -async function _updateRouterMicroserviceConfig (fogNodeUuid, config, transaction) { - const routerMicroservice = await _getRouterMicroservice(fogNodeUuid, transaction) - - // Update microservice with the provided config - await MicroserviceManager.update( - { uuid: routerMicroservice.uuid }, - { config: JSON.stringify(config) }, - transaction - ) - - // Update change tracking - await ChangeTrackingService.update(fogNodeUuid, ChangeTrackingService.events.microserviceConfig, transaction) -} - -// Helper function to add tcpConnector to router config -async function _addTcpConnector (serviceConfig, transaction) { - const isK8s = await checkKubernetesEnvironment() - const connector = await _buildTcpConnector(serviceConfig, transaction) - const siteId = connector.siteId - - if (siteId === 'default-router') { - if (isK8s) { - // Update K8s router config - logger.debug('Updating K8s router config') - const configMap = await K8sClient.getConfigMap(K8S_ROUTER_CONFIG_MAP) - if (!configMap) { - logger.error('ConfigMap not found:' + K8S_ROUTER_CONFIG_MAP) - throw new Errors.NotFoundError(`ConfigMap not found: ${K8S_ROUTER_CONFIG_MAP}`) - } - - const routerConfig = JSON.parse(configMap.data['skrouterd.json']) - // Add new connector to the array - routerConfig.push(['tcpConnector', connector]) - - await _updateK8sRouterConfig(routerConfig) - } else { - // Update default router microservice config - const defaultRouter = await RouterManager.findOne({ isDefault: true }, transaction) - if (!defaultRouter) { - logger.error('Default router not found') - throw new Errors.NotFoundError('Default router not found') - } - const fogNodeUuid = defaultRouter.iofogUuid - const routerMicroservice = await _getRouterMicroservice(fogNodeUuid, transaction) - const currentConfig = JSON.parse(routerMicroservice.config || '{}') - - if (!currentConfig.bridges) { - currentConfig.bridges = {} - } - if (!currentConfig.bridges.tcpConnectors) { - currentConfig.bridges.tcpConnectors = {} - } - currentConfig.bridges.tcpConnectors[connector.name] = connector - - await _updateRouterMicroserviceConfig(fogNodeUuid, currentConfig, transaction) - } - } else { - // Update specific router microservice config - const fogNodeUuid = siteId - const routerMicroservice = await _getRouterMicroservice(fogNodeUuid, transaction) - const currentConfig = JSON.parse(routerMicroservice.config || '{}') - - if (!currentConfig.bridges) { - currentConfig.bridges = {} - } - if (!currentConfig.bridges.tcpConnectors) { - currentConfig.bridges.tcpConnectors = {} - } - currentConfig.bridges.tcpConnectors[connector.name] = connector - - await _updateRouterMicroserviceConfig(fogNodeUuid, currentConfig, transaction) - } -} - -// Helper function to add tcpListener to router config -async function _addTcpListener (serviceConfig, transaction) { - const isK8s = await checkKubernetesEnvironment() - - // First handle K8s case if we're in K8s environment - if (isK8s) { - const k8sListener = await _buildTcpListener(serviceConfig, null) // null for K8s case - const configMap = await K8sClient.getConfigMap(K8S_ROUTER_CONFIG_MAP) - if (!configMap) { - logger.error('ConfigMap not found:' + K8S_ROUTER_CONFIG_MAP) - throw new Errors.NotFoundError(`ConfigMap not found: ${K8S_ROUTER_CONFIG_MAP}`) - } - - const routerConfig = JSON.parse(configMap.data['skrouterd.json']) - // Add new listener to the array - routerConfig.push(['tcpListener', k8sListener]) - - await _updateK8sRouterConfig(routerConfig) - } - - // Handle distributed router microservice cases - // Get list of fog nodes that need this listener - const fogNodeUuids = await handleServiceDistribution(serviceConfig.tags, transaction) - - // If not in K8s environment, always include default router - if (!isK8s) { - const defaultRouter = await RouterManager.findOne({ isDefault: true }, transaction) - if (!defaultRouter) { - logger.error('Default router not found') - throw new Errors.NotFoundError('Default router not found') - } - // Add default router if not already in the list - if (!fogNodeUuids.includes(defaultRouter.iofogUuid)) { - fogNodeUuids.push(defaultRouter.iofogUuid) - } - } - // else if (!fogNodeUuids || fogNodeUuids.length === 0) { - // // If in K8s and no fog nodes found, add default router - // const defaultRouter = await RouterManager.findOne({ isDefault: true }, transaction) - // if (!defaultRouter) { - // logger.error('Default router not found') - // throw new Errors.NotFoundError('Default router not found') - // } - // fogNodeUuids.push(defaultRouter.iofogUuid) - // } - - // Add listener to each router microservice - for (const fogNodeUuid of fogNodeUuids) { - try { - const listener = await _buildTcpListener(serviceConfig, fogNodeUuid) - const routerMicroservice = await _getRouterMicroservice(fogNodeUuid, transaction) - const currentConfig = JSON.parse(routerMicroservice.config || '{}') - if (!currentConfig.bridges) currentConfig.bridges = {} - if (!currentConfig.bridges.tcpListeners) currentConfig.bridges.tcpListeners = {} - currentConfig.bridges.tcpListeners[listener.name] = listener - await _updateRouterMicroserviceConfig(fogNodeUuid, currentConfig, transaction) - } catch (err) { - if (err instanceof Errors.NotFoundError) { - logger.info(`Router microservice not found for fogNodeUuid ${fogNodeUuid}, skipping.`) - continue - } - throw err - } - } -} - -// Helper function to update tcpConnector in router config -async function _updateTcpConnector (serviceConfig, transaction) { - const isK8s = await checkKubernetesEnvironment() - const connector = await _buildTcpConnector(serviceConfig, transaction) - const siteId = connector.siteId - - if (siteId === 'default-router') { - if (isK8s) { - // Update K8s router config - const configMap = await K8sClient.getConfigMap(K8S_ROUTER_CONFIG_MAP) - if (!configMap) { - throw new Errors.NotFoundError(`ConfigMap not found: ${K8S_ROUTER_CONFIG_MAP}`) - } - - const routerConfig = JSON.parse(configMap.data['skrouterd.json']) - // Find and update the existing connector - const connectorIndex = routerConfig.findIndex(item => - item[0] === 'tcpConnector' && item[1].name === connector.name - ) - if (connectorIndex !== -1) { - routerConfig[connectorIndex] = ['tcpConnector', connector] - } - - await _updateK8sRouterConfig(routerConfig) - } else { - // Update default router microservice config - const defaultRouter = await RouterManager.findOne({ isDefault: true }, transaction) - if (!defaultRouter) { - throw new Errors.NotFoundError('Default router not found') - } - const fogNodeUuid = defaultRouter.iofogUuid - const routerMicroservice = await _getRouterMicroservice(fogNodeUuid, transaction) - const currentConfig = JSON.parse(routerMicroservice.config || '{}') - - if (!currentConfig.bridges) { - currentConfig.bridges = {} - } - if (!currentConfig.bridges.tcpConnectors) { - currentConfig.bridges.tcpConnectors = {} - } - // Update the connector with the same name - currentConfig.bridges.tcpConnectors[connector.name] = connector - - await _updateRouterMicroserviceConfig(fogNodeUuid, currentConfig, transaction) - } - } else { - // Update specific router microservice config - const fogNodeUuid = siteId - const routerMicroservice = await _getRouterMicroservice(fogNodeUuid, transaction) - const currentConfig = JSON.parse(routerMicroservice.config || '{}') - - if (!currentConfig.bridges) { - currentConfig.bridges = {} - } - if (!currentConfig.bridges.tcpConnectors) { - currentConfig.bridges.tcpConnectors = {} - } - // Update the connector with the same name - currentConfig.bridges.tcpConnectors[connector.name] = connector - - await _updateRouterMicroserviceConfig(fogNodeUuid, currentConfig, transaction) - } -} - -// Helper function to update tcpListener in router config -async function _updateTcpListener (serviceConfig, transaction) { - const isK8s = await checkKubernetesEnvironment() - - // First handle K8s case if we're in K8s environment - if (isK8s) { - const k8sListener = await _buildTcpListener(serviceConfig, null) // null for K8s case - const configMap = await K8sClient.getConfigMap(K8S_ROUTER_CONFIG_MAP) - if (!configMap) { - throw new Errors.NotFoundError(`ConfigMap not found: ${K8S_ROUTER_CONFIG_MAP}`) - } - - const routerConfig = JSON.parse(configMap.data['skrouterd.json']) - // Update the listener in the array - const listenerIndex = routerConfig.findIndex(item => - item[0] === 'tcpListener' && item[1].name === k8sListener.name - ) - if (listenerIndex !== -1) { - routerConfig[listenerIndex] = ['tcpListener', k8sListener] - } else { - routerConfig.push(['tcpListener', k8sListener]) - } - - await _updateK8sRouterConfig(routerConfig) - } - - // Handle distributed router microservice cases - // Get list of fog nodes that need this listener - const fogNodeUuids = await handleServiceDistribution(serviceConfig.tags, transaction) - // If not in K8s environment, always include default router - if (!isK8s) { - const defaultRouter = await RouterManager.findOne({ isDefault: true }, transaction) - if (!defaultRouter) { - throw new Errors.NotFoundError('Default router not found') - } - // Add default router if not already in the list - if (!fogNodeUuids.includes(defaultRouter.iofogUuid)) { - fogNodeUuids.push(defaultRouter.iofogUuid) - } - } - // else if (!fogNodeUuids || fogNodeUuids.length === 0) { - // // If in K8s and no fog nodes found, add default router - // const defaultRouter = await RouterManager.findOne({ isDefault: true }, transaction) - // if (!defaultRouter) { - // throw new Errors.NotFoundError('Default router not found') - // } - // fogNodeUuids.push(defaultRouter.iofogUuid) - // } - - // Update listener in each router microservice - for (const fogNodeUuid of fogNodeUuids) { - try { - const listener = await _buildTcpListener(serviceConfig, fogNodeUuid) - const routerMicroservice = await _getRouterMicroservice(fogNodeUuid, transaction) - const currentConfig = JSON.parse(routerMicroservice.config || '{}') - - if (!currentConfig.bridges) { - currentConfig.bridges = {} - } - if (!currentConfig.bridges.tcpListeners) { - currentConfig.bridges.tcpListeners = {} - } - // Update listener with its name as key - currentConfig.bridges.tcpListeners[listener.name] = listener - - await _updateRouterMicroserviceConfig(fogNodeUuid, currentConfig, transaction) - } catch (err) { - if (err instanceof Errors.NotFoundError) { - logger.info(`Router microservice not found for fogNodeUuid ${fogNodeUuid}, skipping.`) - continue - } - throw err - } - } -} - -// Helper function to delete tcpConnector from router config -async function _deleteTcpConnector (serviceName, transaction) { - const isK8s = await checkKubernetesEnvironment() - const connectorName = `${serviceName}-connector` - - // Get service to determine if it's using default router - const service = await ServiceManager.findOne({ name: serviceName }, transaction) - if (!service) { - throw new Errors.NotFoundError(`Service not found: ${serviceName}`) - } - - const isDefaultRouter = service.defaultBridge === 'default-router' - let microserviceSource = null - if (service.type === 'microservice') { - microserviceSource = await MicroserviceManager.findOne({ uuid: service.resource }, transaction) - } - - if (isDefaultRouter && !microserviceSource) { - if (isK8s) { - // Update K8s router config - const configMap = await K8sClient.getConfigMap(K8S_ROUTER_CONFIG_MAP) - if (!configMap) { - throw new Errors.NotFoundError(`ConfigMap not found: ${K8S_ROUTER_CONFIG_MAP}`) - } - - const routerConfig = JSON.parse(configMap.data['skrouterd.json']) - // Remove the connector from the array - const updatedConfig = routerConfig.filter(item => - !(item[0] === 'tcpConnector' && item[1].name === connectorName) - ) - - await _updateK8sRouterConfig(updatedConfig) - } else { - // Update default router microservice config - const defaultRouter = await RouterManager.findOne({ isDefault: true }, transaction) - if (!defaultRouter) { - throw new Errors.NotFoundError('Default router not found') - } - const fogNodeUuid = defaultRouter.iofogUuid - const routerMicroservice = await _getRouterMicroservice(fogNodeUuid, transaction) - const currentConfig = JSON.parse(routerMicroservice.config || '{}') - - if (currentConfig.bridges && currentConfig.bridges.tcpConnectors) { - delete currentConfig.bridges.tcpConnectors[connectorName] - } - - await _updateRouterMicroserviceConfig(fogNodeUuid, currentConfig, transaction) - } - } else { - let fogNodeUuid = null - if (microserviceSource) { - fogNodeUuid = microserviceSource.iofogUuid - } else { - fogNodeUuid = service.defaultBridge // This is the actual fogNodeUuid for non-default router - } - const routerMicroservice = await _getRouterMicroservice(fogNodeUuid, transaction) - const currentConfig = JSON.parse(routerMicroservice.config || '{}') - - if (currentConfig.bridges && currentConfig.bridges.tcpConnectors) { - delete currentConfig.bridges.tcpConnectors[connectorName] - } - - await _updateRouterMicroserviceConfig(fogNodeUuid, currentConfig, transaction) - } -} - -// Helper function to delete tcpListener from router config -async function _deleteTcpListener (serviceName, transaction) { - const isK8s = await checkKubernetesEnvironment() - const listenerName = `${serviceName}-listener` - - // First handle K8s case if we're in K8s environment - if (isK8s) { - const configMap = await K8sClient.getConfigMap(K8S_ROUTER_CONFIG_MAP) - if (!configMap) { - throw new Errors.NotFoundError(`ConfigMap not found: ${K8S_ROUTER_CONFIG_MAP}`) - } - - const routerConfig = JSON.parse(configMap.data['skrouterd.json']) - // Remove the listener from the array - const updatedConfig = routerConfig.filter(item => - !(item[0] === 'tcpListener' && item[1].name === listenerName) - ) - - await _updateK8sRouterConfig(updatedConfig) - } - - // Get service to determine its tags for distribution - const service = await ServiceManager.findOneWithTags({ name: serviceName }, transaction) - if (!service) { - throw new Errors.NotFoundError(`Service not found: ${serviceName}`) - } - - let microserviceSource = null - if (service.type === 'microservice') { - microserviceSource = await MicroserviceManager.findOne({ uuid: service.resource }, transaction) - } - // Handle distributed router microservice cases - // Get list of fog nodes that need this listener removed - const serviceTags = service.tags.map(tag => tag.value) - const fogNodeUuids = await handleServiceDistribution(serviceTags, transaction) - - if (microserviceSource) { - if (!fogNodeUuids.includes(microserviceSource.iofogUuid)) { - fogNodeUuids.push(microserviceSource.iofogUuid) - } - } - // If not in K8s environment, always include default router - if (!isK8s) { - const defaultRouter = await RouterManager.findOne({ isDefault: true }, transaction) - if (!defaultRouter) { - throw new Errors.NotFoundError('Default router not found') - } - // Add default router if not already in the list - if (!fogNodeUuids.includes(defaultRouter.iofogUuid)) { - fogNodeUuids.push(defaultRouter.iofogUuid) - } - } - // else if (!fogNodeUuids || fogNodeUuids.length === 0) { - // // If in K8s and no fog nodes found, add default router - // const defaultRouter = await RouterManager.findOne({ isDefault: true }, transaction) - // if (!defaultRouter) { - // throw new Errors.NotFoundError('Default router not found') - // } - // fogNodeUuids.push(defaultRouter.iofogUuid) - // } - - // Remove listener from each router microservice - for (const fogNodeUuid of fogNodeUuids) { - try { - const routerMicroservice = await _getRouterMicroservice(fogNodeUuid, transaction) - const currentConfig = JSON.parse(routerMicroservice.config || '{}') - if (currentConfig.bridges && currentConfig.bridges.tcpListeners) { - delete currentConfig.bridges.tcpListeners[listenerName] - } - await _updateRouterMicroserviceConfig(fogNodeUuid, currentConfig, transaction) - } catch (err) { - if (err instanceof Errors.NotFoundError) { - logger.info(`Router microservice not found for fogNodeUuid ${fogNodeUuid}, skipping.`) - continue - } - throw err - } - } -} - -// Helper function to create Kubernetes service -async function _createK8sService (serviceConfig, transaction) { - const normalizedTags = serviceConfig.tags.map(tag => tag.includes(':') ? tag : `${tag}:`) - const serviceSpec = { - apiVersion: 'v1', - kind: 'Service', - metadata: { - name: serviceConfig.name, - annotations: normalizedTags.reduce((acc, tag) => { - const [key, value] = tag.split(':') - acc[key] = value || '' - return acc - }, {}) - }, - spec: { - type: serviceConfig.k8sType, - selector: { - application: 'interior-router', - name: 'router', - 'skupper.io/component': 'router' - }, - ports: [{ - port: parseInt(serviceConfig.bridgePort), - targetPort: parseInt(serviceConfig.servicePort), - protocol: 'TCP' - }] - } - } - - const service = await K8sClient.createService(serviceSpec) - - // If LoadBalancer type, wait for and set the external IP - if (serviceConfig.k8sType === 'LoadBalancer') { - const loadBalancerIP = await K8sClient.watchLoadBalancerIP(serviceConfig.name) - if (loadBalancerIP) { - await ServiceManager.update( - { name: serviceConfig.name }, - { serviceEndpoint: loadBalancerIP }, - transaction - ) - } - } - - return service -} - -// Helper function to update Kubernetes service -async function _updateK8sService (serviceConfig, transaction) { - const normalizedTags = serviceConfig.tags.map(tag => tag.includes(':') ? tag : `${tag}:`) - const patchData = { - metadata: { - annotations: normalizedTags.reduce((acc, tag) => { - const [key, value] = tag.split(':') - acc[key] = value || '' - return acc - }, {}) - }, - spec: { - type: serviceConfig.k8sType, - selector: { - application: 'interior-router', - name: 'router', - 'skupper.io/component': 'router' - }, - ports: [{ - port: parseInt(serviceConfig.bridgePort), - targetPort: parseInt(serviceConfig.servicePort), - protocol: 'TCP' - }] - } - } - - logger.debug(`Updating service: ${serviceConfig.name}`) - const service = await K8sClient.updateService(serviceConfig.name, patchData) - - // If LoadBalancer type, wait for and set the external IP - if (serviceConfig.k8sType === 'LoadBalancer') { - const loadBalancerIP = await K8sClient.watchLoadBalancerIP(serviceConfig.name) - if (loadBalancerIP) { - await ServiceManager.update( - { name: serviceConfig.name }, - { serviceEndpoint: loadBalancerIP }, - transaction - ) - } - } - - return service -} - -// Helper function to delete Kubernetes service -async function _deleteK8sService (serviceName) { - await K8sClient.deleteService(serviceName) -} - -// Create service endpoint -async function createServiceEndpoint (serviceData, transaction) { - logger.debug('Creating service with data:' + JSON.stringify(serviceData)) - - // 1. Validate from schemas validator - await Validator.validate(serviceData, Validator.schemas.serviceCreate) - await _validateServiceName(serviceData) - - // 2. Check K8s environment if type is k8s - const isK8s = await checkKubernetesEnvironment() - if (serviceData.type === 'k8s' && !isK8s) { - throw new Errors.ValidationError('Kubernetes environment is required for k8s service type') - } - - if (serviceData.type !== 'k8s' && isK8s) { - logger.debug('Validating non k8s service type') - await validateNonK8sType(serviceData) - } - - // 3. Validate microservice type - if (serviceData.type === 'microservice') { - await validateMicroserviceType(serviceData, transaction) - } - - // 4. Validate agent type - if (serviceData.type === 'agent') { - logger.debug('Validating agent service type') - await validateFogServiceType(serviceData, transaction) - } - - // 5. Validate default bridge - logger.debug('Validating default bridge') - await validateDefaultBridge(serviceData, transaction) - - logger.debug('Defining bridge port') - // 6. Define bridge port - await defineBridgePort(serviceData, transaction) - - let service - try { - // Create service in database first - logger.debug('Creating service in database') - service = await ServiceManager.create(serviceData, transaction) - - // Set tags if provided - logger.debug('Setting tags') - if (serviceData.tags && serviceData.tags.length > 0) { - await _setTags(service, serviceData.tags, transaction) - } - - // 7. Add TCP connector - logger.debug('Adding TCP connector') - await _addTcpConnector(serviceData, transaction) - - // 8. Add TCP listener - logger.debug('Adding TCP listener') - try { - await _addTcpListener(serviceData, transaction) - } catch (error) { - logger.error('Error adding TCP listener:' + error.message + ' ' + error.stack + ' ' + serviceData.name) - throw error - } - - // 9. Create K8s service if needed - if ((serviceData.type === 'microservice' || serviceData.type === 'agent' || serviceData.type === 'external') && isK8s) { - logger.debug('Creating K8s service') - try { - await _createK8sService(serviceData, transaction) - } catch (error) { - logger.error('Error creating K8s service:' + error.message + ' ' + error.stack + ' ' + serviceData.name) - throw error - } - } - - return service - } catch (error) { - logger.error('Error creating service:' + error.message + ' ' + error.stack + ' ' + serviceData.name + ' ' + serviceData.type + ' ' + error.validationStep) - - // If any error occurs after service creation, clean up - if (service) { - try { - // Delete K8s service if it was created - if ((serviceData.type === 'microservice' || serviceData.type === 'agent' || serviceData.type === 'external') && isK8s) { - await _deleteK8sService(serviceData.name) - } - // Delete TCP listener if it was added - await _deleteTcpListener(serviceData.name, transaction) - // Delete TCP connector if it was added - await _deleteTcpConnector(serviceData.name, transaction) - // Finally delete the service from database - await ServiceManager.delete({ id: service.id }, transaction) - } catch (cleanupError) { - logger.error('Error during service creation cleanup:', { - error: cleanupError.message, - stack: cleanupError.stack, - serviceName: serviceData.name - }) - } - } - - // Wrap the error in a proper error type if it's not already - if (!(error instanceof Errors.ValidationError) && - !(error instanceof Errors.NotFoundError) && - !(error instanceof Errors.TransactionError) && - !(error instanceof Errors.DuplicatePropertyError)) { - throw new Errors.ValidationError(`Failed to create service: ${error.message}`) - } - throw error - } -} - -// Update service endpoint -async function updateServiceEndpoint (serviceName, serviceData, transaction) { - // 1. Validate from schemas validator - await Validator.validate(serviceData, Validator.schemas.serviceUpdate) - await _validateServiceName(serviceData) - - // 2. Get existing service - const existingService = await ServiceManager.findOneWithTags({ name: serviceName }, transaction) - if (!existingService) { - throw new Errors.NotFoundError(`Service with name ${serviceName} not found`) - } - - // 3. Check if service type is being changed - if (serviceData.type && serviceData.type !== existingService.type) { - throw new Errors.ValidationError('Changing service type is not allowed. Please delete the service and create a new one with the desired type.') - } - - // 4. Check K8s environment if type is k8s - const isK8s = await checkKubernetesEnvironment() - if (existingService.type === 'k8s' && !isK8s) { - throw new Errors.ValidationError('Kubernetes environment is required for k8s service type') - } - - if (serviceData.type !== 'k8s' && isK8s) { - logger.debug('Validating non k8s service type') - await validateNonK8sType(serviceData) - } - - // 5. Validate microservice type if needed - if (existingService.type === 'microservice') { - await validateMicroserviceType(serviceData, transaction) - } - - // 6. Validate agent type if needed - if (existingService.type === 'agent') { - await validateFogServiceType(serviceData, transaction) - } - - // 7. Validate default bridge if needed - if (serviceData.defaultBridge) { - await validateDefaultBridge(serviceData, transaction) - } - - serviceData.bridgePort = existingService.bridgePort - - let updatedService - try { - // Update service in database - updatedService = await ServiceManager.update( - { name: serviceName }, - serviceData, - transaction - ) - - // Update tags if provided - if (serviceData.tags) { - await _setTags(existingService, serviceData.tags, transaction) - } - - // Handle resource changes - if (serviceData.resource && - JSON.stringify(serviceData.resource) !== JSON.stringify(existingService.resource)) { - // If resource changed, delete and recreate connector - await _deleteTcpConnector(serviceName, transaction) - await _addTcpConnector(serviceData, transaction) - } else { - // If resource didn't change, just update connector and listener - await _updateTcpConnector(serviceData, transaction) - // await _updateTcpListener(serviceData, transaction) - } - - // Update K8s service if needed - if ((existingService.type === 'microservice' || existingService.type === 'agent' || existingService.type === 'external') && isK8s) { - await _updateK8sService(serviceData, transaction) - } - - return updatedService - } catch (error) { - logger.error('Error updating service:', { - error: error.message, - stack: error.stack, - serviceName: serviceName, - serviceType: existingService.type - }) - - // If any error occurs after service update, attempt to rollback - if (updatedService) { - try { - // Rollback K8s service if it was updated - if ((existingService.type === 'microservice' || existingService.type === 'agent' || existingService.type === 'external') && isK8s) { - await _updateK8sService(existingService, transaction) - } - // Rollback TCP connector and listener - if (serviceData.resource && - JSON.stringify(serviceData.resource) !== JSON.stringify(existingService.resource)) { - await _deleteTcpConnector(serviceName, transaction) - await _addTcpConnector(existingService, transaction) - } else { - await _updateTcpConnector(existingService, transaction) - await _updateTcpListener(existingService, transaction) - } - // Rollback service in database - await ServiceManager.update( - { name: serviceName }, - existingService, - transaction - ) - } catch (rollbackError) { - logger.error('Error during service update rollback:', { - error: rollbackError.message, - stack: rollbackError.stack, - serviceName: serviceName - }) - } - } - - // Wrap the error in a proper error type if it's not already - if (!(error instanceof Errors.ValidationError) && - !(error instanceof Errors.NotFoundError) && - !(error instanceof Errors.TransactionError) && - !(error instanceof Errors.DuplicatePropertyError)) { - throw new Errors.ValidationError(`Failed to update service: ${error.message}`) - } - throw error - } -} - -// Delete service endpoint -async function deleteServiceEndpoint (serviceName, transaction) { - // Get existing service - const existingService = await ServiceManager.findOne({ name: serviceName }, transaction) - if (!existingService) { - throw new Errors.NotFoundError(`Service with name ${serviceName} not found`) - } - - const isK8s = await checkKubernetesEnvironment() - - try { - // Delete TCP connector - await _deleteTcpConnector(serviceName, transaction) - - // Delete TCP listener - await _deleteTcpListener(serviceName, transaction) - - // Delete K8s service if needed - if (isK8s && existingService.type !== 'k8s') { - await _deleteK8sService(serviceName) - } - - // Finally delete the service from database - await ServiceManager.delete({ name: serviceName }, transaction) - - return { message: `Service ${serviceName} deleted successfully` } - } catch (error) { - logger.error('Error deleting service:', { - error: error.message, - stack: error.stack, - serviceName: serviceName, - serviceType: existingService.type - }) - - // Wrap the error in a proper error type if it's not already - if (!(error instanceof Errors.ValidationError) && - !(error instanceof Errors.NotFoundError) && - !(error instanceof Errors.TransactionError) && - !(error instanceof Errors.DuplicatePropertyError)) { - throw new Errors.ValidationError(`Failed to delete service: ${error.message}`) - } - throw error - } -} - -// List services endpoint -async function getServicesListEndpoint (transaction) { - const queryFogData = {} - const services = await ServiceManager.findAllWithTags(queryFogData, transaction) - return services.map(service => ({ - name: service.name, - type: service.type, - resource: service.resource, - defaultBridge: service.defaultBridge, - bridgePort: service.bridgePort, - targetPort: service.targetPort, - servicePort: service.servicePort, - k8sType: service.k8sType, - serviceEndpoint: service.serviceEndpoint, - tags: _mapTags(service) - })) -} - -// Get service endpoint -async function getServiceEndpoint (serviceName, transaction) { - const queryFogData = { name: serviceName } - const service = await ServiceManager.findOneWithTags(queryFogData, transaction) - if (!service) { - throw new Errors.NotFoundError(`Service with name ${serviceName} not found`) - } - return { - name: service.name, - type: service.type, - resource: service.resource, - defaultBridge: service.defaultBridge, - bridgePort: service.bridgePort, - targetPort: service.targetPort, - servicePort: service.servicePort, - k8sType: service.k8sType, - serviceEndpoint: service.serviceEndpoint, - tags: _mapTags(service) - } -} - -async function moveMicroserviceTcpBridgeToNewFog (service, newFogUuid, oldFogUuid, transaction) { - const listenerName = `${service.name}-listener` - const connectorName = `${service.name}-connector` - - const oldRouterMicroservice = await _getRouterMicroservice(oldFogUuid, transaction) - const oldRouterConfig = JSON.parse(oldRouterMicroservice.config || '{}') - const newRouterMicroservice = await _getRouterMicroservice(newFogUuid, transaction) - const newRouterConfig = JSON.parse(newRouterMicroservice.config || '{}') - - const connector = oldRouterConfig.bridges.tcpConnectors[connectorName] - const listener = oldRouterConfig.bridges.tcpListeners[listenerName] - - if (oldRouterConfig.bridges.tcpConnectors[connectorName]) { - delete oldRouterConfig.bridges.tcpConnectors[connectorName] - } - if (oldRouterConfig.bridges.tcpListeners[listenerName]) { - delete oldRouterConfig.bridges.tcpListeners[listenerName] - } - - if (!newRouterConfig.bridges) { - newRouterConfig.bridges = {} - } - if (!newRouterConfig.bridges.tcpConnectors) { - newRouterConfig.bridges.tcpConnectors = {} - } - - newRouterConfig.bridges.tcpConnectors[connectorName] = connector - newRouterConfig.bridges.tcpListeners[listenerName] = listener - - await _updateRouterMicroserviceConfig(oldFogUuid, oldRouterConfig, transaction) - await _updateRouterMicroserviceConfig(newFogUuid, newRouterConfig, transaction) -} - -module.exports = { - checkKubernetesEnvironment, - validateMicroserviceType: TransactionDecorator.generateTransaction(validateMicroserviceType), - validateNonK8sType, - _validateServiceName, - validateFogServiceType: TransactionDecorator.generateTransaction(validateFogServiceType), - validateDefaultBridge: TransactionDecorator.generateTransaction(validateDefaultBridge), - defineBridgePort: TransactionDecorator.generateTransaction(defineBridgePort), - handleServiceDistribution: TransactionDecorator.generateTransaction(handleServiceDistribution), - _mapTags, - _setTags: TransactionDecorator.generateTransaction(_setTags), - _createK8sService, - _updateK8sService, - _deleteK8sService, - createServiceEndpoint: TransactionDecorator.generateTransaction(createServiceEndpoint), - updateServiceEndpoint: TransactionDecorator.generateTransaction(updateServiceEndpoint), - deleteServiceEndpoint: TransactionDecorator.generateTransaction(deleteServiceEndpoint), - getServicesListEndpoint: TransactionDecorator.generateTransaction(getServicesListEndpoint), - getServiceEndpoint: TransactionDecorator.generateTransaction(getServiceEndpoint), - moveMicroserviceTcpBridgeToNewFog: TransactionDecorator.generateTransaction(moveMicroserviceTcpBridgeToNewFog) -} From 2cd88ff7568cbf9344741df3540c5adc9cd238b1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emirhan=20Durmu=C5=9F?= Date: Sat, 21 Jun 2025 16:59:16 +0300 Subject: [PATCH 157/178] fix --- src/websocket/server.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/websocket/server.js b/src/websocket/server.js index 3627ba442..112e3aa2c 100644 --- a/src/websocket/server.js +++ b/src/websocket/server.js @@ -849,7 +849,7 @@ class WebSocketServer { } // Check if we're in development mode (mock Keycloak) - const isDevMode = config.get('server.devMode', true) + const isDevMode = process.env.SERVER_DEV_MODE || config.get('server.devMode', true) const hasAuthConfig = this.isAuthConfigured() if (!hasAuthConfig && isDevMode) { @@ -890,7 +890,7 @@ class WebSocketServer { // Check if user has required roles const hasRequiredRole = userRoles.some(role => ['SRE', 'Developer'].includes(role)) if (!hasRequiredRole) { - throw new Errors.AuthenticationError('Insufficient permissions. Required roles: SRE or Developer') + throw new Errors.AuthenticationError('Insufficient permissions. Required roles: SRE for Node Exec or Developer for Microservice Exec') } // 2. Only now check microservice, application, etc. From 468eb6c4a393a2521bf6a25403f63795f657d5fd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emirhan=20Durmu=C5=9F?= Date: Fri, 4 Jul 2025 01:43:50 +0300 Subject: [PATCH 158/178] beta release preparation, swagger yaml updated, db ssl config added, migration and seeder scripts fixed, bugfixes --- docs/swagger.yaml | 440 ++++++++++++------ package-lock.json | 12 +- package.json | 4 +- src/config/controller.yaml | 4 + src/config/env-mapping.js | 6 + src/data/managers/config-map-manager.js | 1 + src/data/managers/fog-used-token-manager.js | 44 +- .../mysql/db_migration_mysql_v1.0.2.sql | 104 ++--- .../postgres/db_migration_pg_v1.0.2.sql | 104 ++--- .../sqlite/db_migration_sqlite_v1.0.2.sql | 104 ++--- src/data/models/fog.js | 13 +- src/data/models/fogUsedToken.js | 6 +- src/data/models/microservice.js | 7 +- src/data/models/volumeMount.js | 2 +- src/data/providers/mysql.js | 25 + src/data/providers/postgres.js | 30 +- .../seeders/mysql/db_seeder_mysql_v1.0.2.sql | 21 +- .../seeders/postgres/db_seeder_pg_v1.0.2.sql | 21 +- .../sqlite/db_seeder_sqlite_v1.0.2.sql | 21 +- src/schemas/config-map.js | 1 + src/server.js | 4 + src/services/agent-service.js | 24 +- src/services/catalog-service.js | 16 +- src/services/iofog-key-service.js | 10 +- src/services/iofog-service.js | 57 ++- src/services/microservices-service.js | 42 +- src/services/router-service.js | 7 +- src/services/services-service.js | 51 +- src/utils/k8s-client.js | 11 +- 29 files changed, 729 insertions(+), 463 deletions(-) diff --git a/docs/swagger.yaml b/docs/swagger.yaml index 622c9514c..307efca34 100755 --- a/docs/swagger.yaml +++ b/docs/swagger.yaml @@ -45,7 +45,7 @@ paths: summary: Returns list of ioFog nodes operationId: getIOFogNodes security: - - userToken: [] + - authToken: [] requestBody: content: application/json: @@ -76,7 +76,7 @@ paths: summary: Creates a new ioFog node operationId: createIOFogNode security: - - userToken: [] + - authToken: [] requestBody: $ref: "#/components/requestBodies/UpdateIOFogNodeRequestBody" responses: @@ -111,7 +111,7 @@ paths: schema: type: string security: - - userToken: [] + - authToken: [] requestBody: $ref: "#/components/requestBodies/UpdateIOFogNodeRequestBody" responses: @@ -143,7 +143,7 @@ paths: schema: type: string security: - - userToken: [] + - authToken: [] responses: "202": description: Accepted @@ -171,7 +171,7 @@ paths: schema: type: string security: - - userToken: [] + - authToken: [] responses: "200": description: Success @@ -204,7 +204,7 @@ paths: schema: type: string security: - - userToken: [] + - authToken: [] responses: "201": description: Success @@ -246,7 +246,7 @@ paths: - upgrade - rollback security: - - userToken: [] + - authToken: [] responses: "204": description: Success @@ -277,7 +277,7 @@ paths: schema: type: string security: - - userToken: [] + - authToken: [] responses: "204": description: Success @@ -304,7 +304,7 @@ paths: schema: type: string security: - - userToken: [] + - authToken: [] responses: "204": description: Success @@ -331,7 +331,7 @@ paths: schema: type: string security: - - userToken: [] + - authToken: [] responses: "200": description: Success @@ -364,7 +364,7 @@ paths: schema: type: string security: - - userToken: [] + - authToken: [] responses: "200": description: Success @@ -390,7 +390,7 @@ paths: summary: Lists all applications operationId: listApplication security: - - userToken: [] + - authToken: [] responses: "200": description: Success @@ -416,7 +416,7 @@ paths: summary: Lists all system applications operationId: listSystemApplication security: - - userToken: [] + - authToken: [] responses: "200": description: Success @@ -436,6 +436,38 @@ paths: "500": description: Internal Server Error /application/system/{name}: + get: + tags: + - Application + summary: Gets an application details + operationId: getApplication + parameters: + - in: path + name: name + description: Application name + required: true + schema: + type: string + security: + - authToken: [] + responses: + "200": + description: Success + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + content: + application/json: + schema: + $ref: "#/components/schemas/ApplicationGetResponse" + "400": + description: Bad Request + "404": + description: Not Found + "500": + description: Internal Server Error delete: tags: - Application @@ -449,7 +481,7 @@ paths: schema: type: string security: - - userToken: [] + - authToken: [] responses: "204": description: Success @@ -472,7 +504,7 @@ paths: summary: Creates an application using a YAML file operationId: createApplicationYAML security: - - userToken: [] + - authToken: [] requestBody: required: true content: @@ -513,7 +545,7 @@ paths: schema: type: string security: - - userToken: [] + - authToken: [] requestBody: content: application/json: @@ -554,7 +586,7 @@ paths: schema: type: string security: - - userToken: [] + - authToken: [] responses: "204": description: Success @@ -582,7 +614,7 @@ paths: schema: type: string security: - - userToken: [] + - authToken: [] responses: "200": description: Success @@ -615,7 +647,7 @@ paths: schema: type: string security: - - userToken: [] + - authToken: [] requestBody: required: true content: @@ -647,7 +679,7 @@ paths: summary: Lists all application templates operationId: listApplicationTemplates security: - - userToken: [] + - authToken: [] responses: "200": description: Success @@ -673,7 +705,7 @@ paths: summary: Creates an application template using a YAML file operationId: createApplicationTemplateYAML security: - - userToken: [] + - authToken: [] requestBody: required: true content: @@ -714,7 +746,7 @@ paths: schema: type: string security: - - userToken: [] + - authToken: [] requestBody: content: application/json: @@ -748,7 +780,7 @@ paths: schema: type: string security: - - userToken: [] + - authToken: [] responses: "200": description: Success @@ -776,7 +808,7 @@ paths: schema: type: string security: - - userToken: [] + - authToken: [] responses: "200": description: Success @@ -809,7 +841,7 @@ paths: schema: type: string security: - - userToken: [] + - authToken: [] requestBody: required: true content: @@ -902,13 +934,7 @@ paths: summary: Move Controller CA to Agent operationId: agentControllerCert security: - - agentToken: [] - requestBody: - content: - application/json: - schema: - $ref: "#/components/schemas/AgentDeprovisioningRequest" - required: true + - authToken: [] responses: "204": description: Success @@ -930,7 +956,7 @@ paths: summary: Get an ioFog node configuration operationId: getIOFogNodeConfig security: - - agentToken: [] + - authToken: [] responses: "200": description: Success @@ -953,7 +979,7 @@ paths: summary: Updates an ioFog node configuration operationId: updateIOFogNodeConfig security: - - agentToken: [] + - authToken: [] requestBody: content: application/json: @@ -981,7 +1007,7 @@ paths: summary: Gets ioFog node changes operationId: getIOFogNodeChanges security: - - agentToken: [] + - authToken: [] responses: "200": description: Success @@ -1006,7 +1032,7 @@ paths: summary: Resets ioFog node changes list operationId: resetIOFogNodeChanges security: - - agentToken: [] + - authToken: [] responses: "200": description: Success @@ -1028,7 +1054,7 @@ paths: summary: Posts agent status to ioFog node operationId: postAgentStatus security: - - agentToken: [] + - authToken: [] requestBody: content: application/json: @@ -1056,7 +1082,7 @@ paths: summary: Gets microservices running on an ioFog node operationId: getAgentMicroservicesList security: - - agentToken: [] + - authToken: [] responses: "200": description: Success @@ -1087,7 +1113,7 @@ paths: schema: type: string security: - - agentToken: [] + - authToken: [] responses: "200": description: Success @@ -1113,7 +1139,7 @@ paths: summary: Gets list of Docker registries operationId: getRegistriesList security: - - agentToken: [] + - authToken: [] responses: "200": description: Success @@ -1137,7 +1163,7 @@ paths: summary: Get an ioFog node tunnel configuration operationId: getIOFogNodeTunnelConfig security: - - agentToken: [] + - authToken: [] responses: "200": description: Success @@ -1163,7 +1189,7 @@ paths: summary: Get an ioFog node strace info operationId: getIOFogNodeStraceInfo security: - - agentToken: [] + - authToken: [] responses: "200": description: Success @@ -1188,7 +1214,7 @@ paths: summary: Posts agent strace to ioFog node operationId: postIOFogNodeStraceBuffer security: - - agentToken: [] + - authToken: [] requestBody: content: application/json: @@ -1218,7 +1244,7 @@ paths: summary: Get change version command operationId: getChangeVersion security: - - agentToken: [] + - authToken: [] responses: "200": description: Success @@ -1244,7 +1270,7 @@ paths: summary: Updates HAL hardware info operationId: putHalHardwareInfo security: - - agentToken: [] + - authToken: [] requestBody: $ref: "#/components/requestBodies/HalInfo" responses: @@ -1268,7 +1294,7 @@ paths: summary: Retrieves HAL USB info operationId: getAgentHalUsbInfo security: - - userToken: [] + - authToken: [] responses: "200": description: Success @@ -1293,7 +1319,7 @@ paths: summary: Updates HAL USB info operationId: putHalUsbInfo security: - - agentToken: [] + - authToken: [] requestBody: $ref: "#/components/requestBodies/HalInfo" responses: @@ -1317,7 +1343,7 @@ paths: summary: Deletes an ioFog node operationId: deleteAgentNode security: - - agentToken: [] + - authToken: [] responses: "204": description: No Content @@ -1337,7 +1363,7 @@ paths: summary: Get image snapshot info operationId: getImageSnapshot security: - - agentToken: [] + - authToken: [] responses: "200": description: Success @@ -1362,7 +1388,7 @@ paths: summary: Put image snapshot info on controller operationId: putImageSnapshot security: - - agentToken: [] + - authToken: [] requestBody: content: application/json: @@ -1390,7 +1416,7 @@ paths: summary: Post tracking info operationId: postTracking security: - - agentToken: [] + - authToken: [] requestBody: content: application/json: @@ -1411,7 +1437,7 @@ paths: summary: Gets microservices catalog operationId: getMicroservicesCatalog security: - - userToken: [] + - authToken: [] responses: "200": description: Success @@ -1434,7 +1460,7 @@ paths: summary: Creates a new microservice catalog item operationId: createMicroserviceCatalogItem security: - - userToken: [] + - authToken: [] requestBody: $ref: "#/components/requestBodies/CreateUpdateCatalogItemRequestBody" responses: @@ -1474,7 +1500,7 @@ paths: schema: type: string security: - - userToken: [] + - authToken: [] responses: "200": description: Catalog Item Info @@ -1506,7 +1532,7 @@ paths: schema: type: string security: - - userToken: [] + - authToken: [] requestBody: $ref: "#/components/requestBodies/CreateUpdateCatalogItemRequestBody" responses: @@ -1540,7 +1566,7 @@ paths: schema: type: string security: - - userToken: [] + - authToken: [] responses: "204": description: Success @@ -1576,7 +1602,7 @@ paths: schema: type: string security: - - userToken: [] + - authToken: [] responses: "200": description: Success @@ -1600,7 +1626,7 @@ paths: summary: Creates a new microservice in an Application operationId: createMicroserviceYAML security: - - userToken: [] + - authToken: [] requestBody: required: true content: @@ -1648,7 +1674,7 @@ paths: schema: type: string security: - - userToken: [] + - authToken: [] responses: "200": description: Success @@ -1680,7 +1706,7 @@ paths: schema: type: string security: - - userToken: [] + - authToken: [] responses: "204": description: Success @@ -1710,7 +1736,23 @@ paths: schema: type: string security: - - userToken: [] + - authToken: [] + responses: + "204": + description: Updated + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + "400": + description: Bad Request + "401": + description: Not Authorized + "404": + description: Invalid Registry Id + "500": + description: Internal Server Error /microservices/pub/{tag}: get: tags: @@ -1725,7 +1767,7 @@ paths: schema: type: string security: - - userToken: [] + - authToken: [] responses: "200": description: Success @@ -1756,7 +1798,7 @@ paths: schema: type: string security: - - userToken: [] + - authToken: [] responses: "200": description: Success @@ -1773,7 +1815,91 @@ paths: description: Not Authorized "500": description: Internal Server Error + /microservices/system: + get: + tags: + - Microservices + summary: Gets list of system microservices + operationId: getSystemMicroservicesList + security: + - authToken: [] + parameters: + - in: query + name: flowId + deprecated: true + description: Flow Id + required: false + schema: + type: integer + - in: query + name: application + description: Application name + required: false + schema: + type: string + responses: + '200': + description: Success + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + content: + application/json: + schema: + type: object + properties: + microservices: + type: array + items: + type: object + properties: + uuid: + type: string + name: + type: string + config: + type: object + '401': + description: Not Authorized + '404': + description: Not Found + '500': + description: Internal Server Error /microservices/system/{uuid}: + get: + tags: + - Microservices + summary: Gets a system microservice info + operationId: getSystemMicroserviceInfo + parameters: + - in: path + name: uuid + description: Microservice Uuid + required: true + schema: + type: string + security: + - authToken: [] + responses: + "200": + description: Success + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + content: + application/json: + schema: + $ref: "#/components/schemas/MicroserviceInfoResponse" + "401": + description: Not Authorized + "404": + description: Not Found + "500": + description: Internal Server Error patch: tags: - Microservices @@ -1787,7 +1913,23 @@ paths: schema: type: string security: - - userToken: [] + - authToken: [] + responses: + "204": + description: Updated + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + "400": + description: Bad Request + "401": + description: Not Authorized + "404": + description: Invalid Registry Id + "500": + description: Internal Server Error /microservices/yaml/{uuid}: patch: tags: @@ -1802,7 +1944,7 @@ paths: schema: type: string security: - - userToken: [] + - authToken: [] requestBody: required: true content: @@ -1845,7 +1987,7 @@ paths: schema: type: string security: - - userToken: [] + - authToken: [] requestBody: content: application/json: @@ -1886,7 +2028,7 @@ paths: schema: type: string security: - - userToken: [] + - authToken: [] responses: "200": description: Created @@ -1919,7 +2061,7 @@ paths: schema: type: string security: - - userToken: [] + - authToken: [] requestBody: content: application/json: @@ -1967,7 +2109,7 @@ paths: schema: type: string security: - - userToken: [] + - authToken: [] responses: "204": description: Success @@ -2002,7 +2144,7 @@ paths: schema: type: string security: - - userToken: [] + - authToken: [] responses: "204": description: Success @@ -2031,7 +2173,7 @@ paths: schema: type: string security: - - userToken: [] + - authToken: [] requestBody: content: application/json: @@ -2075,7 +2217,7 @@ paths: schema: type: string security: - - userToken: [] + - authToken: [] responses: "200": description: Success @@ -2108,7 +2250,7 @@ paths: schema: type: string security: - - userToken: [] + - authToken: [] requestBody: content: application/json: @@ -2159,7 +2301,7 @@ paths: schema: type: string security: - - userToken: [] + - authToken: [] responses: "204": description: Success @@ -2196,7 +2338,7 @@ paths: schema: type: string security: - - userToken: [] + - authToken: [] responses: "204": description: Success @@ -2227,7 +2369,7 @@ paths: schema: type: string security: - - userToken: [] + - authToken: [] responses: "204": description: Success @@ -2256,7 +2398,7 @@ paths: schema: type: string security: - - userToken: [] + - authToken: [] responses: "204": description: Success @@ -2285,7 +2427,7 @@ paths: schema: type: string security: - - userToken: [] + - authToken: [] responses: "201": description: Created @@ -2313,7 +2455,7 @@ paths: schema: type: string security: - - userToken: [] + - authToken: [] responses: "204": description: Success @@ -2342,7 +2484,7 @@ paths: schema: type: string security: - - userToken: [] + - authToken: [] responses: "201": description: Created @@ -2370,7 +2512,7 @@ paths: schema: type: string security: - - userToken: [] + - authToken: [] responses: "204": description: Success @@ -2399,7 +2541,7 @@ paths: schema: type: string security: - - userToken: [] + - authToken: [] responses: "201": description: Created @@ -2434,7 +2576,7 @@ paths: schema: type: string security: - - userToken: [] + - authToken: [] responses: "200": description: Success @@ -2468,7 +2610,7 @@ paths: schema: type: string security: - - userToken: [] + - authToken: [] requestBody: content: application/json: @@ -2516,7 +2658,7 @@ paths: - file - string security: - - userToken: [] + - authToken: [] responses: "200": description: Success @@ -2551,7 +2693,7 @@ paths: schema: type: string security: - - userToken: [] + - authToken: [] requestBody: content: application/json: @@ -2588,7 +2730,7 @@ paths: schema: type: string security: - - userToken: [] + - authToken: [] requestBody: content: application/json: @@ -2624,7 +2766,7 @@ paths: schema: type: string security: - - userToken: [] + - authToken: [] responses: "200": description: Success @@ -2650,7 +2792,7 @@ paths: summary: Creates new registry operationId: createRegistry security: - - userToken: [] + - authToken: [] requestBody: content: application/json: @@ -2676,7 +2818,7 @@ paths: summary: Gets list of registries operationId: getRegistryList security: - - userToken: [] + - authToken: [] responses: "200": description: Success @@ -2707,7 +2849,7 @@ paths: schema: type: string security: - - userToken: [] + - authToken: [] responses: "204": description: Deleted @@ -2735,7 +2877,7 @@ paths: schema: type: string security: - - userToken: [] + - authToken: [] requestBody: content: application/json: @@ -2821,7 +2963,7 @@ paths: summary: Logout operationId: logout security: - - userToken: [] + - authToken: [] responses: "204": description: Success @@ -2836,7 +2978,7 @@ paths: summary: Get current user profile data operationId: getUserProfile security: - - userToken: [] + - authToken: [] responses: "200": description: Success @@ -2860,7 +3002,7 @@ paths: summary: Get routes operationId: getRoutes security: - - userToken: [] + - authToken: [] responses: "200": description: Success @@ -2883,7 +3025,7 @@ paths: summary: Creates a new route operationId: createRoute security: - - userToken: [] + - authToken: [] requestBody: content: application/json: @@ -2928,7 +3070,7 @@ paths: schema: type: string security: - - userToken: [] + - authToken: [] responses: "200": description: Route Info @@ -2960,7 +3102,7 @@ paths: schema: type: string security: - - userToken: [] + - authToken: [] requestBody: content: application/json: @@ -2999,7 +3141,7 @@ paths: schema: type: string security: - - userToken: [] + - authToken: [] responses: "204": description: Success @@ -3021,7 +3163,7 @@ paths: summary: Get Edge Resources operationId: getEdgeResources security: - - userToken: [] + - authToken: [] responses: "200": description: Success @@ -3058,7 +3200,7 @@ paths: schema: type: string security: - - userToken: [] + - authToken: [] responses: "200": description: Success @@ -3094,7 +3236,7 @@ paths: schema: type: string security: - - userToken: [] + - authToken: [] requestBody: content: application/json: @@ -3137,7 +3279,7 @@ paths: schema: type: string security: - - userToken: [] + - authToken: [] responses: "204": description: Success @@ -3166,7 +3308,7 @@ paths: schema: type: string security: - - userToken: [] + - authToken: [] responses: "200": description: Success @@ -3190,7 +3332,7 @@ paths: summary: Create Specific Edge Resource operationId: postEdgeResource security: - - userToken: [] + - authToken: [] requestBody: content: application/json: @@ -3234,7 +3376,7 @@ paths: schema: type: string security: - - userToken: [] + - authToken: [] requestBody: content: application/json: @@ -3275,7 +3417,7 @@ paths: schema: type: string security: - - userToken: [] + - authToken: [] requestBody: content: application/json: @@ -3304,7 +3446,7 @@ paths: summary: Creates a new secret operationId: createSecret security: - - userToken: [] + - authToken: [] requestBody: required: true content: @@ -3332,7 +3474,7 @@ paths: summary: Lists all secrets operationId: listSecrets security: - - userToken: [] + - authToken: [] responses: "200": description: Success @@ -3358,7 +3500,7 @@ paths: schema: type: string security: - - userToken: [] + - authToken: [] responses: "200": description: Success @@ -3385,7 +3527,7 @@ paths: schema: type: string security: - - userToken: [] + - authToken: [] requestBody: required: true content: @@ -3420,7 +3562,7 @@ paths: schema: type: string security: - - userToken: [] + - authToken: [] responses: "200": description: Success @@ -3437,7 +3579,7 @@ paths: summary: Create a secret from YAML file operationId: createSecretFromYAML security: - - userToken: [] + - authToken: [] requestBody: content: multipart/form-data: @@ -3476,7 +3618,7 @@ paths: schema: type: string security: - - userToken: [] + - authToken: [] requestBody: content: multipart/form-data: @@ -3513,7 +3655,7 @@ paths: schema: type: string security: - - userToken: [] + - authToken: [] responses: '200': description: Success @@ -3540,7 +3682,7 @@ paths: schema: type: string security: - - userToken: [] + - authToken: [] responses: '200': description: Success @@ -3558,7 +3700,7 @@ paths: summary: Create a new certificate operationId: createCertificate security: - - userToken: [] + - authToken: [] requestBody: content: application/json: @@ -3585,7 +3727,7 @@ paths: summary: List all certificates operationId: listCertificates security: - - userToken: [] + - authToken: [] responses: '200': description: Success @@ -3613,7 +3755,7 @@ paths: type: integer default: 30 security: - - userToken: [] + - authToken: [] responses: '200': description: Success @@ -3642,7 +3784,7 @@ paths: schema: type: string security: - - userToken: [] + - authToken: [] responses: '200': description: Success @@ -3669,7 +3811,7 @@ paths: schema: type: string security: - - userToken: [] + - authToken: [] responses: '200': description: Success @@ -3694,7 +3836,7 @@ paths: schema: type: string security: - - userToken: [] + - authToken: [] responses: '200': description: Success @@ -3717,7 +3859,7 @@ paths: summary: Create a certificate or CA from YAML file operationId: createCertificateFromYAML security: - - userToken: [] + - authToken: [] requestBody: content: multipart/form-data: @@ -3751,7 +3893,7 @@ paths: summary: Gets list of services operationId: getServicesList security: - - userToken: [] + - authToken: [] responses: "200": description: Success @@ -3776,7 +3918,7 @@ paths: summary: Creates a new service operationId: createService security: - - userToken: [] + - authToken: [] requestBody: required: true content: @@ -3817,7 +3959,7 @@ paths: schema: type: string security: - - userToken: [] + - authToken: [] responses: "200": description: Success @@ -3849,7 +3991,7 @@ paths: schema: type: string security: - - userToken: [] + - authToken: [] responses: "204": description: Success @@ -3877,7 +4019,7 @@ paths: schema: type: string security: - - userToken: [] + - authToken: [] requestBody: required: true content: @@ -3911,7 +4053,7 @@ paths: summary: Creates a new service from YAML operationId: createServiceYAML security: - - userToken: [] + - authToken: [] requestBody: required: true content: @@ -3977,7 +4119,7 @@ paths: schema: type: string security: - - userToken: [] + - authToken: [] requestBody: required: true content: @@ -4015,7 +4157,7 @@ paths: summary: Creates a new ConfigMap operationId: createConfigMap security: - - userToken: [] + - authToken: [] requestBody: content: application/json: @@ -4042,7 +4184,7 @@ paths: summary: Lists all ConfigMaps operationId: listConfigMaps security: - - userToken: [] + - authToken: [] responses: "200": description: Success @@ -4061,7 +4203,7 @@ paths: summary: Creates a new ConfigMap from YAML operationId: createConfigMapFromYaml security: - - userToken: [] + - authToken: [] requestBody: content: multipart/form-data: @@ -4093,7 +4235,7 @@ paths: summary: Gets a ConfigMap by name operationId: getConfigMap security: - - userToken: [] + - authToken: [] parameters: - in: path name: name @@ -4119,7 +4261,7 @@ paths: summary: Updates a ConfigMap operationId: updateConfigMap security: - - userToken: [] + - authToken: [] parameters: - in: path name: name @@ -4152,7 +4294,7 @@ paths: summary: Deletes a ConfigMap operationId: deleteConfigMap security: - - userToken: [] + - authToken: [] parameters: - in: path name: name @@ -4175,7 +4317,7 @@ paths: summary: Updates a ConfigMap from YAML operationId: updateConfigMapFromYaml security: - - userToken: [] + - authToken: [] parameters: - in: path name: name @@ -4213,7 +4355,7 @@ paths: summary: Returns list of volume mounts operationId: listVolumeMounts security: - - userToken: [] + - authToken: [] responses: "200": description: List of volume mounts @@ -4233,7 +4375,7 @@ paths: summary: Creates a new volume mount operationId: createVolumeMount security: - - userToken: [] + - authToken: [] requestBody: required: true content: @@ -4261,7 +4403,7 @@ paths: summary: Creates a new volume mount from YAML operationId: createVolumeMountYaml security: - - userToken: [] + - authToken: [] requestBody: required: true content: @@ -4296,7 +4438,7 @@ paths: schema: type: string security: - - userToken: [] + - authToken: [] responses: "200": description: Success @@ -4323,7 +4465,7 @@ paths: schema: type: string security: - - userToken: [] + - authToken: [] requestBody: required: true content: @@ -4358,7 +4500,7 @@ paths: schema: type: string security: - - userToken: [] + - authToken: [] responses: "202": description: Accepted @@ -4383,7 +4525,7 @@ paths: schema: type: string security: - - userToken: [] + - authToken: [] requestBody: required: true content: @@ -4420,7 +4562,7 @@ paths: schema: type: string security: - - userToken: [] + - authToken: [] requestBody: required: true content: @@ -4455,7 +4597,7 @@ paths: schema: type: string security: - - userToken: [] + - authToken: [] requestBody: required: true content: @@ -4518,11 +4660,7 @@ servers: - url: http://localhost:51121/api/v3 components: securitySchemes: - userToken: - type: http - scheme: bearer - bearerFormat: JWT - agentToken: + authToken: type: http scheme: bearer bearerFormat: JWT diff --git a/package-lock.json b/package-lock.json index 497560557..1f7e89d1f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,16 +1,16 @@ { "name": "@datasance/iofogcontroller", - "version": "3.5.0", + "version": "3.5.0-beta", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@datasance/iofogcontroller", - "version": "3.5.0", + "version": "3.5.0-beta", "hasInstallScript": true, "license": "EPL-2.0", "dependencies": { - "@datasance/ecn-viewer": "0.5.4", + "@datasance/ecn-viewer": "1.0.0-alpha1", "@kubernetes/client-node": "^0.22.3", "@msgpack/msgpack": "^3.1.2", "@opentelemetry/api": "^1.9.0", @@ -427,9 +427,9 @@ } }, "node_modules/@datasance/ecn-viewer": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/@datasance/ecn-viewer/-/ecn-viewer-0.5.4.tgz", - "integrity": "sha512-Eu8BhBAhHyU6S3RdOPyiKpq3DhRUcEQQlU02BBWTdI5e6j5Iqv6Q72AFBw+AaE0NeO7PSNz8x7jQj77OX7jU5g==" + "version": "1.0.0-alpha1", + "resolved": "https://registry.npmjs.org/@datasance/ecn-viewer/-/ecn-viewer-1.0.0-alpha1.tgz", + "integrity": "sha512-gFOvOf9gZqSJyW32UxWAz/e5vLKak0uPx9+Lqp5CpP5pLETaMWmApiWQFaPKxVWhGVOwT38b7WoWo4W78SWzDQ==" }, "node_modules/@eslint-community/eslint-utils": { "version": "4.7.0", diff --git a/package.json b/package.json index d5061e204..cfa589951 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@datasance/iofogcontroller", - "version": "3.5.0", + "version": "3.5.0-beta", "description": "ioFog Controller project for Datasance PoT @ datasance.com \\nCopyright (c) 2023 Datasance Teknoloji A.S.", "main": "./src/main.js", "author": "Emirhan Durmus", @@ -55,7 +55,7 @@ "iofog-controller": "src/main.js" }, "dependencies": { - "@datasance/ecn-viewer": "0.5.4", + "@datasance/ecn-viewer": "1.0.0-alpha1", "@kubernetes/client-node": "^0.22.3", "@msgpack/msgpack": "^3.1.2", "@opentelemetry/api": "^1.9.0", diff --git a/src/config/controller.yaml b/src/config/controller.yaml index 58f58c47b..8f1b87561 100644 --- a/src/config/controller.yaml +++ b/src/config/controller.yaml @@ -60,12 +60,16 @@ database: # username: "" # MySQL username # password: "" # MySQL password # databaseName: "" # MySQL database name + # useSSL: false # Use SSL for MySQL connection + # sslCA: "" # MySQL SSL CA in base64 encoded string # postgres: # host: "" # PostgreSQL host # port: 5432 # PostgreSQL port # username: "" # PostgreSQL username # password: "" # PostgreSQL password # databaseName: "" # PostgreSQL database name + # useSSL: false # Use SSL for PostgreSQL connection + # sslCA: "" # PostgreSQL SSL CA in base64 encoded string sqlite: databaseName: dev_database.sqlite # SQLite database file name logging: false # Enable SQLite query logging diff --git a/src/config/env-mapping.js b/src/config/env-mapping.js index b125c3236..18f1baea9 100644 --- a/src/config/env-mapping.js +++ b/src/config/env-mapping.js @@ -57,6 +57,12 @@ module.exports = { 'DB_NAME': { path: (provider) => `database.${provider}.databaseName` }, + 'DB_USE_SSL': { + path: (provider) => `database.${provider}.useSSL` + }, + 'DB_SSL_CA': { + path: (provider) => `database.${provider}.sslCA` + }, // Auth Configuration 'KC_REALM': 'auth.realm', diff --git a/src/data/managers/config-map-manager.js b/src/data/managers/config-map-manager.js index ee7b6d30b..b8da144ca 100644 --- a/src/data/managers/config-map-manager.js +++ b/src/data/managers/config-map-manager.js @@ -41,6 +41,7 @@ class ConfigMapManager extends BaseManager { return configMaps.map(configMap => ({ id: configMap.id, name: configMap.name, + immutable: configMap.immutable, created_at: configMap.created_at, updated_at: configMap.updated_at })) diff --git a/src/data/managers/fog-used-token-manager.js b/src/data/managers/fog-used-token-manager.js index a9274ded7..0b9a3349c 100644 --- a/src/data/managers/fog-used-token-manager.js +++ b/src/data/managers/fog-used-token-manager.js @@ -26,22 +26,40 @@ class FogUsedTokenManager { */ static async storeJti (jti, fogUuid, exp, transaction) { try { + // Input validation + if (!jti || typeof jti !== 'string') { + throw new Error('JTI must be a non-empty string') + } + if (!fogUuid || typeof fogUuid !== 'string') { + throw new Error('Fog UUID must be a non-empty string') + } + + // Ensure exp is a valid integer (Unix timestamp) + const expiryTime = parseInt(exp, 10) + if (isNaN(expiryTime) || expiryTime <= 0) { + throw new Error('Expiration timestamp must be a positive integer') + } + + // Prepare the data object + const tokenData = { + jti, + iofogUuid: fogUuid, + expiryTime: expiryTime + } + + // Create the record with or without transaction if (!transaction || transaction.fakeTransaction) { - // If no transaction or fake transaction, create a new one - await models.FogUsedToken.create({ - jti, - iofogUuid: fogUuid, - expiryTime: exp - }) + await models.FogUsedToken.create(tokenData) } else { - // Use the provided transaction - await models.FogUsedToken.create({ - jti, - iofogUuid: fogUuid, - expiryTime: exp - }, { transaction }) + await models.FogUsedToken.create(tokenData, { transaction }) } } catch (error) { + // Check if it's a duplicate JTI error + if (error.name === 'SequelizeUniqueConstraintError' && error.fields && error.fields.jti) { + logger.warn(`JTI already exists: ${jti}`) + throw new Error('JWT token already used') + } + logger.error(`Failed to store JTI: ${error.message}`) throw error } @@ -81,7 +99,7 @@ class FogUsedTokenManager { */ static async cleanupExpiredJtis () { try { - const now = new Date().getTime() / 1000 // Convert to Unix timestamp + const now = Math.floor(Date.now() / 1000) // Convert to Unix timestamp (seconds) const result = await models.FogUsedToken.destroy({ where: { expiryTime: { diff --git a/src/data/migrations/mysql/db_migration_mysql_v1.0.2.sql b/src/data/migrations/mysql/db_migration_mysql_v1.0.2.sql index e87893b12..528e829cf 100644 --- a/src/data/migrations/mysql/db_migration_mysql_v1.0.2.sql +++ b/src/data/migrations/mysql/db_migration_mysql_v1.0.2.sql @@ -60,7 +60,7 @@ CREATE INDEX idx_fog_type_bluetooth_catalog_item_id ON FogTypes (bluetooth_catal CREATE TABLE IF NOT EXISTS Fogs ( - uuid VARCHAR(32) PRIMARY KEY NOT NULL, + uuid VARCHAR(36) PRIMARY KEY NOT NULL, name VARCHAR(255) DEFAULT 'Unnamed ioFog 1', location TEXT, gps_mode TEXT, @@ -68,7 +68,7 @@ CREATE TABLE IF NOT EXISTS Fogs ( longitude FLOAT, description TEXT, last_active BIGINT, - daemon_status VARCHAR(32) DEFAULT 'NOT_PROVISIONED', + daemon_status VARCHAR(36) DEFAULT 'NOT_PROVISIONED', daemon_operating_duration BIGINT DEFAULT 0, daemon_last_start BIGINT, memory_usage FLOAT DEFAULT 0.000, @@ -80,21 +80,21 @@ CREATE TABLE IF NOT EXISTS Fogs ( system_available_disk BIGINT, system_available_memory BIGINT, system_total_cpu FLOAT, - security_status VARCHAR(32) DEFAULT 'OK', - security_violation_info VARCHAR(32) DEFAULT 'No violation', + security_status VARCHAR(36) DEFAULT 'OK', + security_violation_info VARCHAR(36) DEFAULT 'No violation', catalog_item_status TEXT, repository_count BIGINT DEFAULT 0, repository_status TEXT, system_time BIGINT, last_status_time BIGINT, - ip_address VARCHAR(32) DEFAULT '0.0.0.0', - ip_address_external VARCHAR(32) DEFAULT '0.0.0.0', - host VARCHAR(32), + ip_address VARCHAR(36) DEFAULT '0.0.0.0', + ip_address_external VARCHAR(36) DEFAULT '0.0.0.0', + host VARCHAR(36), processed_messages BIGINT DEFAULT 0, catalog_item_message_counts TEXT, message_speed FLOAT DEFAULT 0.000, last_command_time BIGINT, - network_interface VARCHAR(32) DEFAULT 'dynamic', + network_interface VARCHAR(36) DEFAULT 'dynamic', docker_url VARCHAR(255) DEFAULT 'unix:///var/run/docker.sock', disk_limit FLOAT DEFAULT 50, disk_directory VARCHAR(255) DEFAULT '/var/lib/iofog/', @@ -118,7 +118,7 @@ CREATE TABLE IF NOT EXISTS Fogs ( log_level VARCHAR(10) DEFAULT 'INFO', is_system BOOLEAN DEFAULT FALSE, router_id INT DEFAULT 0, - time_zone VARCHAR(32) DEFAULT 'Etc/UTC', + time_zone VARCHAR(36) DEFAULT 'Etc/UTC', created_at DATETIME, updated_at DATETIME, fog_type_id INT DEFAULT 0, @@ -144,7 +144,7 @@ CREATE TABLE IF NOT EXISTS ChangeTrackings ( prune BOOLEAN DEFAULT false, linked_edge_resources BOOLEAN DEFAULT false, last_updated VARCHAR(255) DEFAULT false, - iofog_uuid VARCHAR(32), + iofog_uuid VARCHAR(36), FOREIGN KEY (iofog_uuid) REFERENCES Fogs (uuid) ON DELETE CASCADE ); @@ -154,7 +154,7 @@ CREATE TABLE IF NOT EXISTS FogAccessTokens ( id INT AUTO_INCREMENT PRIMARY KEY NOT NULL, expiration_time BIGINT, token TEXT, - iofog_uuid VARCHAR(32), + iofog_uuid VARCHAR(36), FOREIGN KEY (iofog_uuid) REFERENCES Fogs (uuid) ON DELETE CASCADE ); @@ -164,7 +164,7 @@ CREATE TABLE IF NOT EXISTS FogProvisionKeys ( id INT AUTO_INCREMENT PRIMARY KEY NOT NULL, provisioning_string VARCHAR(100), expiration_time BIGINT, - iofog_uuid VARCHAR(32), + iofog_uuid VARCHAR(36), FOREIGN KEY (iofog_uuid) REFERENCES Fogs (uuid) ON DELETE CASCADE ); @@ -173,7 +173,7 @@ CREATE INDEX idx_fog_provision_keys_iofogUuid ON FogProvisionKeys (iofog_uuid); CREATE TABLE IF NOT EXISTS FogVersionCommands ( id INT AUTO_INCREMENT PRIMARY KEY NOT NULL, version_command VARCHAR(100), - iofog_uuid VARCHAR(32), + iofog_uuid VARCHAR(36), FOREIGN KEY (iofog_uuid) REFERENCES Fogs (uuid) ON DELETE CASCADE ); @@ -184,7 +184,7 @@ CREATE TABLE IF NOT EXISTS HWInfos ( info TEXT, created_at DATETIME, updated_at DATETIME, - iofog_uuid VARCHAR(32), + iofog_uuid VARCHAR(36), FOREIGN KEY (iofog_uuid) REFERENCES Fogs (uuid) ON DELETE CASCADE ); @@ -195,7 +195,7 @@ CREATE TABLE IF NOT EXISTS USBInfos ( info TEXT, created_at DATETIME, updated_at DATETIME, - iofog_uuid VARCHAR(32), + iofog_uuid VARCHAR(36), FOREIGN KEY (iofog_uuid) REFERENCES Fogs (uuid) ON DELETE CASCADE ); @@ -210,14 +210,14 @@ CREATE TABLE IF NOT EXISTS Tunnels ( local_port INT DEFAULT 22, rsa_key TEXT, closed BOOLEAN DEFAULT false, - iofog_uuid VARCHAR(32), + iofog_uuid VARCHAR(36), FOREIGN KEY (iofog_uuid) REFERENCES Fogs (uuid) ON DELETE CASCADE ); CREATE INDEX idx_tunnels_iofogUuid ON Tunnels (iofog_uuid); CREATE TABLE IF NOT EXISTS Microservices ( - uuid VARCHAR(32) PRIMARY KEY NOT NULL, + uuid VARCHAR(36) PRIMARY KEY NOT NULL, config TEXT, name VARCHAR(255) DEFAULT 'New Microservice', config_last_updated BIGINT, @@ -231,7 +231,7 @@ CREATE TABLE IF NOT EXISTS Microservices ( updated_at DATETIME, catalog_item_id INT, registry_id INT DEFAULT 1, - iofog_uuid VARCHAR(32), + iofog_uuid VARCHAR(36), application_id INT, FOREIGN KEY (catalog_item_id) REFERENCES CatalogItems (id) ON DELETE CASCADE, FOREIGN KEY (registry_id) REFERENCES Registries (id) ON DELETE SET NULL, @@ -247,7 +247,7 @@ CREATE INDEX idx_microservices_applicationId ON Microservices (application_id); CREATE TABLE IF NOT EXISTS MicroserviceArgs ( id INT AUTO_INCREMENT PRIMARY KEY NOT NULL, cmd TEXT, - microservice_uuid VARCHAR(32), + microservice_uuid VARCHAR(36), FOREIGN KEY (microservice_uuid) REFERENCES Microservices (uuid) ON DELETE CASCADE ); @@ -257,7 +257,7 @@ CREATE TABLE IF NOT EXISTS MicroserviceEnvs ( id INT AUTO_INCREMENT PRIMARY KEY NOT NULL, `key` TEXT, `value` TEXT, - microservice_uuid VARCHAR(32), + microservice_uuid VARCHAR(36), FOREIGN KEY (microservice_uuid) REFERENCES Microservices (uuid) ON DELETE CASCADE ); @@ -270,9 +270,9 @@ CREATE TABLE IF NOT EXISTS MicroserviceExtraHost ( public_port INT, template TEXT, `value` TEXT, - microservice_uuid VARCHAR(32), - target_microservice_uuid VARCHAR(32), - target_fog_uuid VARCHAR(32), + microservice_uuid VARCHAR(36), + target_microservice_uuid VARCHAR(36), + target_fog_uuid VARCHAR(36), FOREIGN KEY (microservice_uuid) REFERENCES Microservices (uuid) ON DELETE CASCADE, FOREIGN KEY (target_microservice_uuid) REFERENCES Microservices (uuid) ON DELETE CASCADE, FOREIGN KEY (target_fog_uuid) REFERENCES Fogs (uuid) ON DELETE CASCADE @@ -291,7 +291,7 @@ CREATE TABLE IF NOT EXISTS MicroservicePorts ( is_proxy BOOLEAN, created_at DATETIME, updated_at DATETIME, - microservice_uuid VARCHAR(32), + microservice_uuid VARCHAR(36), FOREIGN KEY (microservice_uuid) REFERENCES Microservices (uuid) ON DELETE CASCADE ); @@ -328,7 +328,7 @@ CREATE TABLE IF NOT EXISTS MicroserviceStatuses ( container_id VARCHAR(255) DEFAULT '', percentage FLOAT DEFAULT 0.00, error_message TEXT, - microservice_uuid VARCHAR(32), + microservice_uuid VARCHAR(36), created_at DATETIME, updated_at DATETIME, FOREIGN KEY (microservice_uuid) REFERENCES Microservices (uuid) ON DELETE CASCADE @@ -340,7 +340,7 @@ CREATE TABLE IF NOT EXISTS StraceDiagnostics ( id INT AUTO_INCREMENT PRIMARY KEY NOT NULL, strace_run BOOLEAN, buffer VARCHAR(255) DEFAULT '', - microservice_uuid VARCHAR(32), + microservice_uuid VARCHAR(36), FOREIGN KEY (microservice_uuid) REFERENCES Microservices (uuid) ON DELETE CASCADE ); @@ -352,7 +352,7 @@ CREATE TABLE IF NOT EXISTS VolumeMappings ( container_destination TEXT, access_mode TEXT, type TEXT, - microservice_uuid VARCHAR(32), + microservice_uuid VARCHAR(36), FOREIGN KEY (microservice_uuid) REFERENCES Microservices (uuid) ON DELETE CASCADE ); @@ -363,7 +363,7 @@ CREATE TABLE IF NOT EXISTS CatalogItemImages ( id INT AUTO_INCREMENT PRIMARY KEY, container_image TEXT, catalog_item_id INT, - microservice_uuid VARCHAR(32), + microservice_uuid VARCHAR(36), fog_type_id INT, FOREIGN KEY (catalog_item_id) REFERENCES CatalogItems (id) ON DELETE CASCADE, FOREIGN KEY (microservice_uuid) REFERENCES Microservices (uuid) ON DELETE CASCADE, @@ -398,8 +398,8 @@ CREATE INDEX idx_catalog_item_output_type_catalog_item_id ON CatalogItemOutputTy CREATE TABLE IF NOT EXISTS Routings ( id INT AUTO_INCREMENT PRIMARY KEY NOT NULL, name TEXT NOT NULL, - source_microservice_uuid VARCHAR(32), - dest_microservice_uuid VARCHAR(32), + source_microservice_uuid VARCHAR(36), + dest_microservice_uuid VARCHAR(36), application_id INT, FOREIGN KEY (source_microservice_uuid) REFERENCES Microservices (uuid) ON DELETE CASCADE, FOREIGN KEY (dest_microservice_uuid) REFERENCES Microservices (uuid) ON DELETE CASCADE, @@ -418,7 +418,7 @@ CREATE TABLE IF NOT EXISTS Routers ( inter_router_port INT, host TEXT, is_default BOOLEAN DEFAULT false, - iofog_uuid VARCHAR(32), + iofog_uuid VARCHAR(36), created_at DATETIME, updated_at DATETIME, FOREIGN KEY (iofog_uuid) REFERENCES Fogs (uuid) ON DELETE CASCADE @@ -461,7 +461,7 @@ CREATE TABLE IF NOT EXISTS Tags ( CREATE TABLE IF NOT EXISTS IofogTags ( id INT AUTO_INCREMENT PRIMARY KEY NOT NULL, - fog_uuid VARCHAR(32), + fog_uuid VARCHAR(36), tag_id INT, FOREIGN KEY (fog_uuid) REFERENCES Fogs (uuid) ON DELETE CASCADE, FOREIGN KEY (tag_id) REFERENCES Tags (id) ON DELETE CASCADE @@ -486,7 +486,7 @@ CREATE TABLE IF NOT EXISTS EdgeResources ( CREATE TABLE IF NOT EXISTS AgentEdgeResources ( id INT AUTO_INCREMENT PRIMARY KEY NOT NULL, - fog_uuid VARCHAR(32), + fog_uuid VARCHAR(36), edge_resource_id INT, FOREIGN KEY (fog_uuid) REFERENCES Fogs (uuid) ON DELETE CASCADE, FOREIGN KEY (edge_resource_id) REFERENCES EdgeResources (id) ON DELETE CASCADE @@ -557,7 +557,7 @@ CREATE INDEX idx_applicationtemplatevariables_application_template_id ON Applica CREATE TABLE IF NOT EXISTS MicroserviceCdiDevices ( id INT AUTO_INCREMENT PRIMARY KEY NOT NULL, cdi_devices TEXT, - microservice_uuid VARCHAR(32), + microservice_uuid VARCHAR(36), FOREIGN KEY (microservice_uuid) REFERENCES Microservices (uuid) ON DELETE CASCADE ); @@ -571,7 +571,7 @@ ADD COLUMN runtime TEXT DEFAULT NULL; CREATE TABLE IF NOT EXISTS MicroservicePubTags ( id INT AUTO_INCREMENT PRIMARY KEY NOT NULL, - microservice_uuid VARCHAR(32), + microservice_uuid VARCHAR(36), tag_id INT, FOREIGN KEY (microservice_uuid) REFERENCES Microservices (uuid) ON DELETE CASCADE, FOREIGN KEY (tag_id) REFERENCES Tags (id) ON DELETE CASCADE @@ -579,7 +579,7 @@ CREATE TABLE IF NOT EXISTS MicroservicePubTags ( CREATE TABLE IF NOT EXISTS MicroserviceSubTags ( id INT AUTO_INCREMENT PRIMARY KEY NOT NULL, - microservice_uuid VARCHAR(32), + microservice_uuid VARCHAR(36), tag_id INT, FOREIGN KEY (microservice_uuid) REFERENCES Microservices (uuid) ON DELETE CASCADE, FOREIGN KEY (tag_id) REFERENCES Tags (id) ON DELETE CASCADE @@ -593,7 +593,7 @@ CREATE INDEX idx_microservicesubtags_tag_id ON MicroserviceSubTags (tag_id); CREATE TABLE IF NOT EXISTS MicroserviceCapAdd ( id INT AUTO_INCREMENT PRIMARY KEY NOT NULL, cap_add TEXT, - microservice_uuid VARCHAR(32), + microservice_uuid VARCHAR(36), FOREIGN KEY (microservice_uuid) REFERENCES Microservices (uuid) ON DELETE CASCADE ); @@ -602,7 +602,7 @@ CREATE INDEX idx_microservice_capAdd_microserviceUuid ON MicroserviceCapAdd (mic CREATE TABLE IF NOT EXISTS MicroserviceCapDrop ( id INT AUTO_INCREMENT PRIMARY KEY NOT NULL, cap_drop TEXT, - microservice_uuid VARCHAR(32), + microservice_uuid VARCHAR(36), FOREIGN KEY (microservice_uuid) REFERENCES Microservices (uuid) ON DELETE CASCADE ); @@ -614,7 +614,7 @@ ADD COLUMN annotations TEXT; CREATE TABLE IF NOT EXISTS FogPublicKeys ( id INT AUTO_INCREMENT PRIMARY KEY NOT NULL, public_key TEXT, - iofog_uuid VARCHAR(32), + iofog_uuid VARCHAR(36), created_at DATETIME, updated_at DATETIME, FOREIGN KEY (iofog_uuid) REFERENCES Fogs (uuid) ON DELETE CASCADE @@ -625,8 +625,8 @@ CREATE INDEX idx_fog_public_keys_iofogUuid ON FogPublicKeys (iofog_uuid); CREATE TABLE IF NOT EXISTS FogUsedTokens ( id INT AUTO_INCREMENT PRIMARY KEY NOT NULL, jti VARCHAR(255) NOT NULL, - iofog_uuid VARCHAR(32), - expiry_time DATETIME NOT NULL, + iofog_uuid VARCHAR(36), + expiry_time BIGINT NOT NULL, created_at DATETIME, updated_at DATETIME, FOREIGN KEY (iofog_uuid) REFERENCES Fogs (uuid) ON DELETE CASCADE @@ -703,8 +703,8 @@ CREATE TABLE IF NOT EXISTS ServiceTags ( CREATE INDEX idx_service_tags_service_id ON ServiceTags (service_id); CREATE INDEX idx_service_tags_tag_id ON ServiceTags (tag_id); -ALTER TABLE Fogs ADD COLUMN container_engine VARCHAR(32); -ALTER TABLE Fogs ADD COLUMN deployment_type VARCHAR(32); +ALTER TABLE Fogs ADD COLUMN container_engine VARCHAR(36); +ALTER TABLE Fogs ADD COLUMN deployment_type VARCHAR(36); ALTER TABLE MicroserviceExtraHost DROP COLUMN public_port; ALTER TABLE MicroservicePorts DROP COLUMN is_public; @@ -727,7 +727,7 @@ CREATE TABLE IF NOT EXISTS ConfigMaps ( CREATE INDEX idx_config_maps_name ON ConfigMaps (name); CREATE TABLE IF NOT EXISTS VolumeMounts ( - uuid VARCHAR(32) PRIMARY KEY NOT NULL, + uuid VARCHAR(36) PRIMARY KEY NOT NULL, name VARCHAR(255) NOT NULL, config_map_name VARCHAR(255), secret_name VARCHAR(255), @@ -744,8 +744,8 @@ CREATE INDEX idx_volume_mounts_secret_name ON VolumeMounts (secret_name); CREATE TABLE IF NOT EXISTS FogVolumeMounts ( id INT AUTO_INCREMENT PRIMARY KEY NOT NULL, - fog_uuid VARCHAR(32), - volume_mount_uuid VARCHAR(32), + fog_uuid VARCHAR(36), + volume_mount_uuid VARCHAR(36), FOREIGN KEY (fog_uuid) REFERENCES Fogs (uuid) ON DELETE CASCADE, FOREIGN KEY (volume_mount_uuid) REFERENCES VolumeMounts (uuid) ON DELETE CASCADE ); @@ -759,16 +759,16 @@ ALTER TABLE Fogs ADD COLUMN volume_mount_last_update BIGINT DEFAULT 0; ALTER TABLE ChangeTrackings ADD COLUMN volume_mounts BOOLEAN DEFAULT false; ALTER TABLE ChangeTrackings ADD COLUMN exec_sessions BOOLEAN DEFAULT false; -ALTER TABLE Services ADD COLUMN provisioning_status VARCHAR(32) DEFAULT 'pending'; +ALTER TABLE Services ADD COLUMN provisioning_status VARCHAR(36) DEFAULT 'pending'; ALTER TABLE Services ADD COLUMN provisioning_error TEXT; ALTER TABLE Fogs ADD COLUMN warning_message TEXT; -ALTER TABLE Fogs ADD COLUMN gps_device VARCHAR(32); +ALTER TABLE Fogs ADD COLUMN gps_device VARCHAR(36); ALTER TABLE Fogs ADD COLUMN gps_scan_frequency INT DEFAULT 60; ALTER TABLE Fogs ADD COLUMN edge_guard_frequency INT DEFAULT 0; -ALTER TABLE Microservices ADD COLUMN pid_mode VARCHAR(32); -ALTER TABLE Microservices ADD COLUMN ipc_mode VARCHAR(32); +ALTER TABLE Microservices ADD COLUMN pid_mode VARCHAR(36); +ALTER TABLE Microservices ADD COLUMN ipc_mode VARCHAR(36); ALTER TABLE Microservices ADD COLUMN exec_enabled BOOLEAN DEFAULT false; ALTER TABLE MicroserviceStatuses ADD COLUMN exec_session_ids TEXT; @@ -777,9 +777,9 @@ ALTER TABLE Microservices ADD COLUMN schedule INT DEFAULT 50; CREATE TABLE IF NOT EXISTS MicroserviceExecStatuses ( id INT AUTO_INCREMENT PRIMARY KEY NOT NULL, - status VARCHAR(255) DEFAULT 'PENDING', + status VARCHAR(255) DEFAULT 'INACTIVE', exec_session_id VARCHAR(255), - microservice_uuid VARCHAR(32), + microservice_uuid VARCHAR(36), created_at DATETIME, updated_at DATETIME, FOREIGN KEY (microservice_uuid) REFERENCES Microservices (uuid) ON DELETE CASCADE diff --git a/src/data/migrations/postgres/db_migration_pg_v1.0.2.sql b/src/data/migrations/postgres/db_migration_pg_v1.0.2.sql index 74cca3e7e..d8367c48b 100644 --- a/src/data/migrations/postgres/db_migration_pg_v1.0.2.sql +++ b/src/data/migrations/postgres/db_migration_pg_v1.0.2.sql @@ -58,7 +58,7 @@ CREATE INDEX idx_fog_type_bluetooth_catalog_item_id ON "FogTypes" (bluetooth_cat CREATE TABLE IF NOT EXISTS "Fogs" ( - uuid VARCHAR(32) PRIMARY KEY NOT NULL, + uuid VARCHAR(36) PRIMARY KEY NOT NULL, name VARCHAR(255) DEFAULT 'Unnamed ioFog 1', location TEXT, gps_mode TEXT, @@ -66,7 +66,7 @@ CREATE TABLE IF NOT EXISTS "Fogs" ( longitude DOUBLE PRECISION, description TEXT, last_active BIGINT, - daemon_status VARCHAR(32) DEFAULT 'NOT_PROVISIONED', + daemon_status VARCHAR(36) DEFAULT 'NOT_PROVISIONED', daemon_operating_duration BIGINT DEFAULT 0, daemon_last_start BIGINT, memory_usage DOUBLE PRECISION DEFAULT 0.000, @@ -78,21 +78,21 @@ CREATE TABLE IF NOT EXISTS "Fogs" ( system_available_disk BIGINT, system_available_memory BIGINT, system_total_cpu DOUBLE PRECISION, - security_status VARCHAR(32) DEFAULT 'OK', - security_violation_info VARCHAR(32) DEFAULT 'No violation', + security_status VARCHAR(36) DEFAULT 'OK', + security_violation_info VARCHAR(36) DEFAULT 'No violation', catalog_item_status TEXT, repository_count BIGINT DEFAULT 0, repository_status TEXT, system_time BIGINT, last_status_time BIGINT, - ip_address VARCHAR(32) DEFAULT '0.0.0.0', - ip_address_external VARCHAR(32) DEFAULT '0.0.0.0', - host VARCHAR(32), + ip_address VARCHAR(36) DEFAULT '0.0.0.0', + ip_address_external VARCHAR(36) DEFAULT '0.0.0.0', + host VARCHAR(36), processed_messages BIGINT DEFAULT 0, catalog_item_message_counts TEXT, message_speed DOUBLE PRECISION DEFAULT 0.000, last_command_time BIGINT, - network_interface VARCHAR(32) DEFAULT 'dynamic', + network_interface VARCHAR(36) DEFAULT 'dynamic', docker_url VARCHAR(255) DEFAULT 'unix:///var/run/docker.sock', disk_limit DOUBLE PRECISION DEFAULT 50, disk_directory VARCHAR(255) DEFAULT '/var/lib/iofog/', @@ -116,7 +116,7 @@ CREATE TABLE IF NOT EXISTS "Fogs" ( log_level VARCHAR(10) DEFAULT 'INFO', is_system BOOLEAN DEFAULT FALSE, router_id INT DEFAULT 0, - time_zone VARCHAR(32) DEFAULT 'Etc/UTC', + time_zone VARCHAR(36) DEFAULT 'Etc/UTC', created_at TIMESTAMP(0), updated_at TIMESTAMP(0), fog_type_id INT DEFAULT 0, @@ -142,7 +142,7 @@ CREATE TABLE IF NOT EXISTS "ChangeTrackings" ( prune BOOLEAN DEFAULT false, linked_edge_resources BOOLEAN DEFAULT false, last_updated VARCHAR(255) DEFAULT false, - iofog_uuid VARCHAR(32), + iofog_uuid VARCHAR(36), FOREIGN KEY (iofog_uuid) REFERENCES "Fogs" (uuid) ON DELETE CASCADE ); @@ -152,7 +152,7 @@ CREATE TABLE IF NOT EXISTS "FogAccessTokens" ( id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY NOT NULL, expiration_time BIGINT, token TEXT, - iofog_uuid VARCHAR(32), + iofog_uuid VARCHAR(36), FOREIGN KEY (iofog_uuid) REFERENCES "Fogs" (uuid) ON DELETE CASCADE ); @@ -162,7 +162,7 @@ CREATE TABLE IF NOT EXISTS "FogProvisionKeys" ( id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY NOT NULL, provisioning_string VARCHAR(100), expiration_time BIGINT, - iofog_uuid VARCHAR(32), + iofog_uuid VARCHAR(36), FOREIGN KEY (iofog_uuid) REFERENCES "Fogs" (uuid) ON DELETE CASCADE ); @@ -171,7 +171,7 @@ CREATE INDEX idx_fog_provision_keys_iofogUuid ON "FogProvisionKeys" (iofog_uuid) CREATE TABLE IF NOT EXISTS "FogVersionCommands" ( id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY NOT NULL, version_command VARCHAR(100), - iofog_uuid VARCHAR(32), + iofog_uuid VARCHAR(36), FOREIGN KEY (iofog_uuid) REFERENCES "Fogs" (uuid) ON DELETE CASCADE ); @@ -182,7 +182,7 @@ CREATE TABLE IF NOT EXISTS "HWInfos" ( info TEXT, created_at TIMESTAMP(0), updated_at TIMESTAMP(0), - iofog_uuid VARCHAR(32), + iofog_uuid VARCHAR(36), FOREIGN KEY (iofog_uuid) REFERENCES "Fogs" (uuid) ON DELETE CASCADE ); @@ -193,7 +193,7 @@ CREATE TABLE IF NOT EXISTS "USBInfos" ( info TEXT, created_at TIMESTAMP(0), updated_at TIMESTAMP(0), - iofog_uuid VARCHAR(32), + iofog_uuid VARCHAR(36), FOREIGN KEY (iofog_uuid) REFERENCES "Fogs" (uuid) ON DELETE CASCADE ); @@ -208,14 +208,14 @@ CREATE TABLE IF NOT EXISTS "Tunnels" ( local_port INT DEFAULT 22, rsa_key TEXT, closed BOOLEAN DEFAULT false, - iofog_uuid VARCHAR(32), + iofog_uuid VARCHAR(36), FOREIGN KEY (iofog_uuid) REFERENCES "Fogs" (uuid) ON DELETE CASCADE ); CREATE INDEX idx_tunnels_iofogUuid ON "Tunnels" (iofog_uuid); CREATE TABLE IF NOT EXISTS "Microservices" ( - uuid VARCHAR(32) PRIMARY KEY NOT NULL, + uuid VARCHAR(36) PRIMARY KEY NOT NULL, config TEXT, name VARCHAR(255) DEFAULT 'New Microservice', config_last_updated BIGINT, @@ -229,7 +229,7 @@ CREATE TABLE IF NOT EXISTS "Microservices" ( updated_at TIMESTAMP(0), catalog_item_id INT, registry_id INT DEFAULT 1, - iofog_uuid VARCHAR(32), + iofog_uuid VARCHAR(36), application_id INT, FOREIGN KEY (catalog_item_id) REFERENCES "CatalogItems" (id) ON DELETE CASCADE, FOREIGN KEY (registry_id) REFERENCES "Registries" (id) ON DELETE SET NULL, @@ -245,7 +245,7 @@ CREATE INDEX idx_microservices_applicationId ON "Microservices" (application_id) CREATE TABLE IF NOT EXISTS "MicroserviceArgs" ( id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY NOT NULL, cmd TEXT, - microservice_uuid VARCHAR(32), + microservice_uuid VARCHAR(36), FOREIGN KEY (microservice_uuid) REFERENCES "Microservices" (uuid) ON DELETE CASCADE ); @@ -255,7 +255,7 @@ CREATE TABLE IF NOT EXISTS "MicroserviceEnvs" ( id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY NOT NULL, key TEXT, value TEXT, - microservice_uuid VARCHAR(32), + microservice_uuid VARCHAR(36), FOREIGN KEY (microservice_uuid) REFERENCES "Microservices" (uuid) ON DELETE CASCADE ); @@ -268,9 +268,9 @@ CREATE TABLE IF NOT EXISTS "MicroserviceExtraHost" ( public_port INT, template TEXT, value TEXT, - microservice_uuid VARCHAR(32), - target_microservice_uuid VARCHAR(32), - target_fog_uuid VARCHAR(32), + microservice_uuid VARCHAR(36), + target_microservice_uuid VARCHAR(36), + target_fog_uuid VARCHAR(36), FOREIGN KEY (microservice_uuid) REFERENCES "Microservices" (uuid) ON DELETE CASCADE, FOREIGN KEY (target_microservice_uuid) REFERENCES "Microservices" (uuid) ON DELETE CASCADE, FOREIGN KEY (target_fog_uuid) REFERENCES "Fogs" (uuid) ON DELETE CASCADE @@ -289,7 +289,7 @@ CREATE TABLE IF NOT EXISTS "MicroservicePorts" ( is_proxy BOOLEAN, created_at TIMESTAMP(0), updated_at TIMESTAMP(0), - microservice_uuid VARCHAR(32), + microservice_uuid VARCHAR(36), FOREIGN KEY (microservice_uuid) REFERENCES "Microservices" (uuid) ON DELETE CASCADE ); @@ -326,7 +326,7 @@ CREATE TABLE IF NOT EXISTS "MicroserviceStatuses" ( container_id VARCHAR(255) DEFAULT '', percentage DOUBLE PRECISION DEFAULT 0.00, error_message TEXT, - microservice_uuid VARCHAR(32), + microservice_uuid VARCHAR(36), created_at TIMESTAMP(0), updated_at TIMESTAMP(0), FOREIGN KEY (microservice_uuid) REFERENCES "Microservices" (uuid) ON DELETE CASCADE @@ -338,7 +338,7 @@ CREATE TABLE IF NOT EXISTS "StraceDiagnostics" ( id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY NOT NULL, strace_run BOOLEAN, buffer VARCHAR(255) DEFAULT '', - microservice_uuid VARCHAR(32), + microservice_uuid VARCHAR(36), FOREIGN KEY (microservice_uuid) REFERENCES "Microservices" (uuid) ON DELETE CASCADE ); @@ -350,7 +350,7 @@ CREATE TABLE IF NOT EXISTS "VolumeMappings" ( container_destination TEXT, access_mode TEXT, type TEXT, - microservice_uuid VARCHAR(32), + microservice_uuid VARCHAR(36), FOREIGN KEY (microservice_uuid) REFERENCES "Microservices" (uuid) ON DELETE CASCADE ); @@ -361,7 +361,7 @@ CREATE TABLE IF NOT EXISTS "CatalogItemImages" ( id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY, container_image TEXT, catalog_item_id INT, - microservice_uuid VARCHAR(32), + microservice_uuid VARCHAR(36), fog_type_id INT, FOREIGN KEY (catalog_item_id) REFERENCES "CatalogItems" (id) ON DELETE CASCADE, FOREIGN KEY (microservice_uuid) REFERENCES "Microservices" (uuid) ON DELETE CASCADE, @@ -396,8 +396,8 @@ CREATE INDEX idx_catalog_item_output_type_catalog_item_id ON "CatalogItemOutputT CREATE TABLE IF NOT EXISTS "Routings" ( id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY NOT NULL, name TEXT NOT NULL, - source_microservice_uuid VARCHAR(32), - dest_microservice_uuid VARCHAR(32), + source_microservice_uuid VARCHAR(36), + dest_microservice_uuid VARCHAR(36), application_id INT, FOREIGN KEY (source_microservice_uuid) REFERENCES "Microservices" (uuid) ON DELETE CASCADE, FOREIGN KEY (dest_microservice_uuid) REFERENCES "Microservices" (uuid) ON DELETE CASCADE, @@ -416,7 +416,7 @@ CREATE TABLE IF NOT EXISTS "Routers" ( inter_router_port INT, host TEXT, is_default BOOLEAN DEFAULT false, - iofog_uuid VARCHAR(32), + iofog_uuid VARCHAR(36), created_at TIMESTAMP(0), updated_at TIMESTAMP(0), FOREIGN KEY (iofog_uuid) REFERENCES "Fogs" (uuid) ON DELETE CASCADE @@ -459,7 +459,7 @@ CREATE TABLE IF NOT EXISTS "Tags" ( CREATE TABLE IF NOT EXISTS "IofogTags" ( id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY NOT NULL, - fog_uuid VARCHAR(32), + fog_uuid VARCHAR(36), tag_id INT, FOREIGN KEY (fog_uuid) REFERENCES "Fogs" (uuid) ON DELETE CASCADE, FOREIGN KEY (tag_id) REFERENCES "Tags" (id) ON DELETE CASCADE @@ -484,7 +484,7 @@ CREATE TABLE IF NOT EXISTS "EdgeResources" ( CREATE TABLE IF NOT EXISTS "AgentEdgeResources" ( id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY NOT NULL, - fog_uuid VARCHAR(32), + fog_uuid VARCHAR(36), edge_resource_id INT, FOREIGN KEY (fog_uuid) REFERENCES "Fogs" (uuid) ON DELETE CASCADE, FOREIGN KEY (edge_resource_id) REFERENCES "EdgeResources" (id) ON DELETE CASCADE @@ -555,7 +555,7 @@ CREATE INDEX idx_applicationtemplatevariables_application_template_id ON "Applic CREATE TABLE IF NOT EXISTS "MicroserviceCdiDevices" ( id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY NOT NULL, cdi_devices TEXT, - microservice_uuid VARCHAR(32), + microservice_uuid VARCHAR(36), FOREIGN KEY (microservice_uuid) REFERENCES "Microservices" (uuid) ON DELETE CASCADE ); @@ -569,7 +569,7 @@ ADD COLUMN runtime TEXT DEFAULT NULL; CREATE TABLE IF NOT EXISTS "MicroservicePubTags" ( id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY NOT NULL, - microservice_uuid VARCHAR(32), + microservice_uuid VARCHAR(36), tag_id INT, FOREIGN KEY (microservice_uuid) REFERENCES "Microservices" (uuid) ON DELETE CASCADE, FOREIGN KEY (tag_id) REFERENCES "Tags" (id) ON DELETE CASCADE @@ -577,7 +577,7 @@ CREATE TABLE IF NOT EXISTS "MicroservicePubTags" ( CREATE TABLE IF NOT EXISTS "MicroserviceSubTags" ( id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY NOT NULL, - microservice_uuid VARCHAR(32), + microservice_uuid VARCHAR(36), tag_id INT, FOREIGN KEY (microservice_uuid) REFERENCES "Microservices" (uuid) ON DELETE CASCADE, FOREIGN KEY (tag_id) REFERENCES "Tags" (id) ON DELETE CASCADE @@ -591,7 +591,7 @@ CREATE INDEX idx_microservicesubtags_tag_id ON "MicroserviceSubTags" (tag_id); CREATE TABLE IF NOT EXISTS "MicroserviceCapAdd" ( id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY NOT NULL, cap_add TEXT, - microservice_uuid VARCHAR(32), + microservice_uuid VARCHAR(36), FOREIGN KEY (microservice_uuid) REFERENCES "Microservices" (uuid) ON DELETE CASCADE ); @@ -600,7 +600,7 @@ CREATE INDEX idx_microservice_capAdd_microserviceUuid ON "MicroserviceCapAdd" (m CREATE TABLE IF NOT EXISTS "MicroserviceCapDrop" ( id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY NOT NULL, cap_drop TEXT, - microservice_uuid VARCHAR(32), + microservice_uuid VARCHAR(36), FOREIGN KEY (microservice_uuid) REFERENCES "Microservices" (uuid) ON DELETE CASCADE ); @@ -612,7 +612,7 @@ ADD COLUMN annotations TEXT; CREATE TABLE IF NOT EXISTS "FogPublicKeys" ( id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY NOT NULL, public_key TEXT, - iofog_uuid VARCHAR(32), + iofog_uuid VARCHAR(36), created_at TIMESTAMP(0), updated_at TIMESTAMP(0), FOREIGN KEY (iofog_uuid) REFERENCES "Fogs" (uuid) ON DELETE CASCADE @@ -623,8 +623,8 @@ CREATE INDEX idx_fog_public_keys_iofogUuid ON "FogPublicKeys" (iofog_uuid); CREATE TABLE IF NOT EXISTS "FogUsedTokens" ( id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY NOT NULL, jti VARCHAR(255) NOT NULL, - iofog_uuid VARCHAR(32), - expiry_time TIMESTAMP(0) NOT NULL, + iofog_uuid VARCHAR(36), + expiry_time BIGINT NOT NULL, created_at TIMESTAMP(0), updated_at TIMESTAMP(0), FOREIGN KEY (iofog_uuid) REFERENCES "Fogs" (uuid) ON DELETE CASCADE @@ -703,8 +703,8 @@ CREATE INDEX idx_service_tags_service_id ON "ServiceTags" (service_id); CREATE INDEX idx_service_tags_tag_id ON "ServiceTags" (tag_id); -ALTER TABLE "Fogs" ADD COLUMN container_engine VARCHAR(32); -ALTER TABLE "Fogs" ADD COLUMN deployment_type VARCHAR(32); +ALTER TABLE "Fogs" ADD COLUMN container_engine VARCHAR(36); +ALTER TABLE "Fogs" ADD COLUMN deployment_type VARCHAR(36); ALTER TABLE "MicroserviceExtraHost" DROP COLUMN IF EXISTS public_port; ALTER TABLE "MicroservicePorts" DROP COLUMN IF EXISTS is_public; @@ -727,7 +727,7 @@ CREATE TABLE IF NOT EXISTS "ConfigMaps" ( CREATE INDEX idx_config_maps_name ON "ConfigMaps" (name); CREATE TABLE IF NOT EXISTS "VolumeMounts" ( - uuid VARCHAR(32) PRIMARY KEY NOT NULL, + uuid VARCHAR(36) PRIMARY KEY NOT NULL, name VARCHAR(255) NOT NULL, config_map_name VARCHAR(255), secret_name VARCHAR(255), @@ -744,8 +744,8 @@ CREATE INDEX idx_volume_mounts_secret_name ON "VolumeMounts" (secret_name); CREATE TABLE IF NOT EXISTS "FogVolumeMounts" ( id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY NOT NULL, - fog_uuid VARCHAR(32), - volume_mount_uuid VARCHAR(32), + fog_uuid VARCHAR(36), + volume_mount_uuid VARCHAR(36), FOREIGN KEY (fog_uuid) REFERENCES "Fogs" (uuid) ON DELETE CASCADE, FOREIGN KEY (volume_mount_uuid) REFERENCES "VolumeMounts" (uuid) ON DELETE CASCADE ); @@ -759,16 +759,16 @@ ALTER TABLE "Fogs" ADD COLUMN volume_mount_last_update BIGINT DEFAULT 0; ALTER TABLE "ChangeTrackings" ADD COLUMN volume_mounts BOOLEAN DEFAULT false; ALTER TABLE "ChangeTrackings" ADD COLUMN exec_sessions BOOLEAN DEFAULT false; -ALTER TABLE "Services" ADD COLUMN provisioning_status VARCHAR(32) DEFAULT 'pending'; +ALTER TABLE "Services" ADD COLUMN provisioning_status VARCHAR(36) DEFAULT 'pending'; ALTER TABLE "Services" ADD COLUMN provisioning_error TEXT; ALTER TABLE "Fogs" ADD COLUMN warning_message TEXT DEFAULT 'HEALTHY'; -ALTER TABLE "Fogs" ADD COLUMN gps_device VARCHAR(32); +ALTER TABLE "Fogs" ADD COLUMN gps_device VARCHAR(36); ALTER TABLE "Fogs" ADD COLUMN gps_scan_frequency INT DEFAULT 60; ALTER TABLE "Fogs" ADD COLUMN edge_guard_frequency INT DEFAULT 0; -ALTER TABLE "Microservices" ADD COLUMN pid_mode VARCHAR(32); -ALTER TABLE "Microservices" ADD COLUMN ipc_mode VARCHAR(32); +ALTER TABLE "Microservices" ADD COLUMN pid_mode VARCHAR(36); +ALTER TABLE "Microservices" ADD COLUMN ipc_mode VARCHAR(36); ALTER TABLE "Microservices" ADD COLUMN exec_enabled BOOLEAN DEFAULT false; ALTER TABLE "MicroserviceStatuses" ADD COLUMN exec_session_ids TEXT; @@ -777,9 +777,9 @@ ALTER TABLE "Microservices" ADD COLUMN schedule INT DEFAULT 50; CREATE TABLE IF NOT EXISTS "MicroserviceExecStatuses" ( id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY NOT NULL, - status VARCHAR(255) DEFAULT 'PENDING', + status VARCHAR(255) DEFAULT 'INACTIVE', exec_session_id VARCHAR(255), - microservice_uuid VARCHAR(32), + microservice_uuid VARCHAR(36), created_at TIMESTAMP(0), updated_at TIMESTAMP(0), FOREIGN KEY (microservice_uuid) REFERENCES "Microservices" (uuid) ON DELETE CASCADE diff --git a/src/data/migrations/sqlite/db_migration_sqlite_v1.0.2.sql b/src/data/migrations/sqlite/db_migration_sqlite_v1.0.2.sql index 75b56bf1e..f5d2aee4b 100644 --- a/src/data/migrations/sqlite/db_migration_sqlite_v1.0.2.sql +++ b/src/data/migrations/sqlite/db_migration_sqlite_v1.0.2.sql @@ -58,7 +58,7 @@ CREATE INDEX idx_fog_type_bluetooth_catalog_item_id ON FogTypes (bluetooth_catal CREATE TABLE IF NOT EXISTS Fogs ( - uuid VARCHAR(32) PRIMARY KEY NOT NULL, + uuid VARCHAR(36) PRIMARY KEY NOT NULL, name VARCHAR(255) DEFAULT 'Unnamed ioFog 1', location TEXT, gps_mode TEXT, @@ -66,7 +66,7 @@ CREATE TABLE IF NOT EXISTS Fogs ( longitude FLOAT, description TEXT, last_active BIGINT, - daemon_status VARCHAR(32) DEFAULT 'NOT_PROVISIONED', + daemon_status VARCHAR(36) DEFAULT 'NOT_PROVISIONED', daemon_operating_duration BIGINT DEFAULT 0, daemon_last_start BIGINT, memory_usage FLOAT DEFAULT 0.000, @@ -78,21 +78,21 @@ CREATE TABLE IF NOT EXISTS Fogs ( system_available_disk BIGINT, system_available_memory BIGINT, system_total_cpu FLOAT, - security_status VARCHAR(32) DEFAULT 'OK', - security_violation_info VARCHAR(32) DEFAULT 'No violation', + security_status VARCHAR(36) DEFAULT 'OK', + security_violation_info VARCHAR(36) DEFAULT 'No violation', catalog_item_status TEXT, repository_count BIGINT DEFAULT 0, repository_status TEXT, system_time BIGINT, last_status_time BIGINT, - ip_address VARCHAR(32) DEFAULT '0.0.0.0', - ip_address_external VARCHAR(32) DEFAULT '0.0.0.0', - host VARCHAR(32), + ip_address VARCHAR(36) DEFAULT '0.0.0.0', + ip_address_external VARCHAR(36) DEFAULT '0.0.0.0', + host VARCHAR(36), processed_messages BIGINT DEFAULT 0, catalog_item_message_counts TEXT, message_speed FLOAT DEFAULT 0.000, last_command_time BIGINT, - network_interface VARCHAR(32) DEFAULT 'dynamic', + network_interface VARCHAR(36) DEFAULT 'dynamic', docker_url VARCHAR(255) DEFAULT 'unix:///var/run/docker.sock', disk_limit FLOAT DEFAULT 50, disk_directory VARCHAR(255) DEFAULT '/var/lib/iofog/', @@ -116,7 +116,7 @@ CREATE TABLE IF NOT EXISTS Fogs ( log_level VARCHAR(10) DEFAULT 'INFO', is_system BOOLEAN DEFAULT FALSE, router_id INT DEFAULT 0, - time_zone VARCHAR(32) DEFAULT 'Etc/UTC', + time_zone VARCHAR(36) DEFAULT 'Etc/UTC', created_at DATETIME, updated_at DATETIME, fog_type_id INT DEFAULT 0, @@ -142,7 +142,7 @@ CREATE TABLE IF NOT EXISTS ChangeTrackings ( prune BOOLEAN DEFAULT false, linked_edge_resources BOOLEAN DEFAULT false, last_updated VARCHAR(255) DEFAULT false, - iofog_uuid VARCHAR(32), + iofog_uuid VARCHAR(36), FOREIGN KEY (iofog_uuid) REFERENCES Fogs (uuid) ON DELETE CASCADE ); @@ -152,7 +152,7 @@ CREATE TABLE IF NOT EXISTS FogAccessTokens ( id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, expiration_time BIGINT, token TEXT, - iofog_uuid VARCHAR(32), + iofog_uuid VARCHAR(36), FOREIGN KEY (iofog_uuid) REFERENCES Fogs (uuid) ON DELETE CASCADE ); @@ -162,7 +162,7 @@ CREATE TABLE IF NOT EXISTS FogProvisionKeys ( id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, provisioning_string VARCHAR(100), expiration_time BIGINT, - iofog_uuid VARCHAR(32), + iofog_uuid VARCHAR(36), FOREIGN KEY (iofog_uuid) REFERENCES Fogs (uuid) ON DELETE CASCADE ); @@ -171,7 +171,7 @@ CREATE INDEX idx_fog_provision_keys_iofogUuid ON FogProvisionKeys (iofog_uuid); CREATE TABLE IF NOT EXISTS FogVersionCommands ( id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, version_command VARCHAR(100), - iofog_uuid VARCHAR(32), + iofog_uuid VARCHAR(36), FOREIGN KEY (iofog_uuid) REFERENCES Fogs (uuid) ON DELETE CASCADE ); @@ -182,7 +182,7 @@ CREATE TABLE IF NOT EXISTS HWInfos ( info TEXT, created_at DATETIME, updated_at DATETIME, - iofog_uuid VARCHAR(32), + iofog_uuid VARCHAR(36), FOREIGN KEY (iofog_uuid) REFERENCES Fogs (uuid) ON DELETE CASCADE ); @@ -193,7 +193,7 @@ CREATE TABLE IF NOT EXISTS USBInfos ( info TEXT, created_at DATETIME, updated_at DATETIME, - iofog_uuid VARCHAR(32), + iofog_uuid VARCHAR(36), FOREIGN KEY (iofog_uuid) REFERENCES Fogs (uuid) ON DELETE CASCADE ); @@ -208,14 +208,14 @@ CREATE TABLE IF NOT EXISTS Tunnels ( local_port INT DEFAULT 22, rsa_key TEXT, closed BOOLEAN DEFAULT false, - iofog_uuid VARCHAR(32), + iofog_uuid VARCHAR(36), FOREIGN KEY (iofog_uuid) REFERENCES Fogs (uuid) ON DELETE CASCADE ); CREATE INDEX idx_tunnels_iofogUuid ON Tunnels (iofog_uuid); CREATE TABLE IF NOT EXISTS Microservices ( - uuid VARCHAR(32) PRIMARY KEY NOT NULL, + uuid VARCHAR(36) PRIMARY KEY NOT NULL, config TEXT, name VARCHAR(255) DEFAULT 'New Microservice', config_last_updated BIGINT, @@ -229,7 +229,7 @@ CREATE TABLE IF NOT EXISTS Microservices ( updated_at DATETIME, catalog_item_id INT, registry_id INT DEFAULT 1, - iofog_uuid VARCHAR(32), + iofog_uuid VARCHAR(36), application_id INT, run_as_user TEXT, platform TEXT, @@ -248,7 +248,7 @@ CREATE INDEX idx_microservices_applicationId ON Microservices (application_id); CREATE TABLE IF NOT EXISTS MicroserviceArgs ( id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, cmd TEXT, - microservice_uuid VARCHAR(32), + microservice_uuid VARCHAR(36), FOREIGN KEY (microservice_uuid) REFERENCES Microservices (uuid) ON DELETE CASCADE ); @@ -258,7 +258,7 @@ CREATE TABLE IF NOT EXISTS MicroserviceEnvs ( id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `key` TEXT, `value` TEXT, - microservice_uuid VARCHAR(32), + microservice_uuid VARCHAR(36), FOREIGN KEY (microservice_uuid) REFERENCES Microservices (uuid) ON DELETE CASCADE ); @@ -270,9 +270,9 @@ CREATE TABLE IF NOT EXISTS MicroserviceExtraHost ( name TEXT, template TEXT, `value` TEXT, - microservice_uuid VARCHAR(32), - target_microservice_uuid VARCHAR(32), - target_fog_uuid VARCHAR(32), + microservice_uuid VARCHAR(36), + target_microservice_uuid VARCHAR(36), + target_fog_uuid VARCHAR(36), FOREIGN KEY (microservice_uuid) REFERENCES Microservices (uuid) ON DELETE CASCADE, FOREIGN KEY (target_microservice_uuid) REFERENCES Microservices (uuid) ON DELETE CASCADE, FOREIGN KEY (target_fog_uuid) REFERENCES Fogs (uuid) ON DELETE CASCADE @@ -289,7 +289,7 @@ CREATE TABLE IF NOT EXISTS MicroservicePorts ( is_udp BOOLEAN, created_at DATETIME, updated_at DATETIME, - microservice_uuid VARCHAR(32), + microservice_uuid VARCHAR(36), FOREIGN KEY (microservice_uuid) REFERENCES Microservices (uuid) ON DELETE CASCADE ); @@ -326,7 +326,7 @@ CREATE TABLE IF NOT EXISTS MicroserviceStatuses ( container_id VARCHAR(255) DEFAULT '', percentage FLOAT DEFAULT 0.00, error_message TEXT, - microservice_uuid VARCHAR(32), + microservice_uuid VARCHAR(36), created_at DATETIME, updated_at DATETIME, FOREIGN KEY (microservice_uuid) REFERENCES Microservices (uuid) ON DELETE CASCADE @@ -338,7 +338,7 @@ CREATE TABLE IF NOT EXISTS StraceDiagnostics ( id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, strace_run BOOLEAN, buffer VARCHAR(255) DEFAULT '', - microservice_uuid VARCHAR(32), + microservice_uuid VARCHAR(36), FOREIGN KEY (microservice_uuid) REFERENCES Microservices (uuid) ON DELETE CASCADE ); @@ -350,7 +350,7 @@ CREATE TABLE IF NOT EXISTS VolumeMappings ( container_destination TEXT, access_mode TEXT, type TEXT, - microservice_uuid VARCHAR(32), + microservice_uuid VARCHAR(36), FOREIGN KEY (microservice_uuid) REFERENCES Microservices (uuid) ON DELETE CASCADE ); @@ -361,7 +361,7 @@ CREATE TABLE IF NOT EXISTS CatalogItemImages ( id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, container_image TEXT, catalog_item_id INT, - microservice_uuid VARCHAR(32), + microservice_uuid VARCHAR(36), fog_type_id INT, FOREIGN KEY (catalog_item_id) REFERENCES CatalogItems (id) ON DELETE CASCADE, FOREIGN KEY (microservice_uuid) REFERENCES Microservices (uuid) ON DELETE CASCADE, @@ -396,8 +396,8 @@ CREATE INDEX idx_catalog_item_output_type_catalog_item_id ON CatalogItemOutputTy CREATE TABLE IF NOT EXISTS Routings ( id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, name TEXT NOT NULL, - source_microservice_uuid VARCHAR(32), - dest_microservice_uuid VARCHAR(32), + source_microservice_uuid VARCHAR(36), + dest_microservice_uuid VARCHAR(36), application_id INT, FOREIGN KEY (source_microservice_uuid) REFERENCES Microservices (uuid) ON DELETE CASCADE, FOREIGN KEY (dest_microservice_uuid) REFERENCES Microservices (uuid) ON DELETE CASCADE, @@ -416,7 +416,7 @@ CREATE TABLE IF NOT EXISTS Routers ( inter_router_port INT, host TEXT, is_default BOOLEAN DEFAULT false, - iofog_uuid VARCHAR(32), + iofog_uuid VARCHAR(36), created_at DATETIME, updated_at DATETIME, FOREIGN KEY (iofog_uuid) REFERENCES Fogs (uuid) ON DELETE CASCADE @@ -459,7 +459,7 @@ CREATE TABLE IF NOT EXISTS Tags ( CREATE TABLE IF NOT EXISTS IofogTags ( id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, - fog_uuid VARCHAR(32), + fog_uuid VARCHAR(36), tag_id INT, FOREIGN KEY (fog_uuid) REFERENCES Fogs (uuid) ON DELETE CASCADE, FOREIGN KEY (tag_id) REFERENCES Tags (id) ON DELETE CASCADE @@ -484,7 +484,7 @@ CREATE TABLE IF NOT EXISTS EdgeResources ( CREATE TABLE IF NOT EXISTS AgentEdgeResources ( id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, - fog_uuid VARCHAR(32), + fog_uuid VARCHAR(36), edge_resource_id INT, FOREIGN KEY (fog_uuid) REFERENCES Fogs (uuid) ON DELETE CASCADE, FOREIGN KEY (edge_resource_id) REFERENCES EdgeResources (id) ON DELETE CASCADE @@ -555,7 +555,7 @@ CREATE INDEX idx_applicationtemplatevariables_application_template_id ON Applica CREATE TABLE IF NOT EXISTS MicroserviceCdiDevices ( id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, cdi_devices TEXT, - microservice_uuid VARCHAR(32), + microservice_uuid VARCHAR(36), FOREIGN KEY (microservice_uuid) REFERENCES Microservices (uuid) ON DELETE CASCADE ); @@ -563,7 +563,7 @@ CREATE INDEX idx_microservice_cdiDevices_microserviceUuid ON MicroserviceCdiDevi CREATE TABLE IF NOT EXISTS MicroservicePubTags ( id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, - microservice_uuid VARCHAR(32), + microservice_uuid VARCHAR(36), tag_id INT, FOREIGN KEY (microservice_uuid) REFERENCES Microservices (uuid) ON DELETE CASCADE, FOREIGN KEY (tag_id) REFERENCES Tags (id) ON DELETE CASCADE @@ -571,7 +571,7 @@ CREATE TABLE IF NOT EXISTS MicroservicePubTags ( CREATE TABLE IF NOT EXISTS MicroserviceSubTags ( id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, - microservice_uuid VARCHAR(32), + microservice_uuid VARCHAR(36), tag_id INT, FOREIGN KEY (microservice_uuid) REFERENCES Microservices (uuid) ON DELETE CASCADE, FOREIGN KEY (tag_id) REFERENCES Tags (id) ON DELETE CASCADE @@ -585,7 +585,7 @@ CREATE INDEX idx_microservicesubtags_tag_id ON MicroservicesubTags (tag_id); CREATE TABLE IF NOT EXISTS MicroserviceCapAdd ( id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, cap_add TEXT, - microservice_uuid VARCHAR(32), + microservice_uuid VARCHAR(36), FOREIGN KEY (microservice_uuid) REFERENCES Microservices (uuid) ON DELETE CASCADE ); @@ -594,7 +594,7 @@ CREATE INDEX idx_microservice_capAdd_microserviceUuid ON MicroserviceCapAdd (mic CREATE TABLE IF NOT EXISTS MicroserviceCapDrop ( id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, cap_drop TEXT, - microservice_uuid VARCHAR(32), + microservice_uuid VARCHAR(36), FOREIGN KEY (microservice_uuid) REFERENCES Microservices (uuid) ON DELETE CASCADE ); @@ -605,7 +605,7 @@ ALTER TABLE Microservices ADD COLUMN annotations TEXT; CREATE TABLE IF NOT EXISTS FogPublicKeys ( id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, public_key TEXT, - iofog_uuid VARCHAR(32), + iofog_uuid VARCHAR(36), created_at DATETIME, updated_at DATETIME, FOREIGN KEY (iofog_uuid) REFERENCES Fogs (uuid) ON DELETE CASCADE @@ -616,8 +616,8 @@ CREATE INDEX idx_fog_public_keys_iofogUuid ON FogPublicKeys (iofog_uuid); CREATE TABLE IF NOT EXISTS FogUsedTokens ( id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, jti VARCHAR(255) NOT NULL, - iofog_uuid VARCHAR(32), - expiry_time DATETIME NOT NULL, + iofog_uuid VARCHAR(36), + expiry_time BIGINT NOT NULL, created_at DATETIME, updated_at DATETIME, FOREIGN KEY (iofog_uuid) REFERENCES Fogs (uuid) ON DELETE CASCADE @@ -694,8 +694,8 @@ CREATE TABLE IF NOT EXISTS ServiceTags ( CREATE INDEX idx_service_tags_service_id ON ServiceTags (service_id); CREATE INDEX idx_service_tags_tag_id ON ServiceTags (tag_id); -ALTER TABLE Fogs ADD COLUMN container_engine VARCHAR(32); -ALTER TABLE Fogs ADD COLUMN deployment_type VARCHAR(32); +ALTER TABLE Fogs ADD COLUMN container_engine VARCHAR(36); +ALTER TABLE Fogs ADD COLUMN deployment_type VARCHAR(36); DROP TABLE IF EXISTS MicroservicePublicPorts; @@ -714,7 +714,7 @@ CREATE TABLE IF NOT EXISTS ConfigMaps ( CREATE INDEX idx_config_maps_name ON ConfigMaps (name); CREATE TABLE IF NOT EXISTS VolumeMounts ( - uuid VARCHAR(32) PRIMARY KEY NOT NULL, + uuid VARCHAR(36) PRIMARY KEY NOT NULL, name VARCHAR(255) NOT NULL, config_map_name VARCHAR(255), secret_name VARCHAR(255), @@ -731,8 +731,8 @@ CREATE INDEX idx_volume_mounts_secret_name ON VolumeMounts (secret_name); CREATE TABLE IF NOT EXISTS FogVolumeMounts ( id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, - fog_uuid VARCHAR(32), - volume_mount_uuid VARCHAR(32), + fog_uuid VARCHAR(36), + volume_mount_uuid VARCHAR(36), FOREIGN KEY (fog_uuid) REFERENCES Fogs (uuid) ON DELETE CASCADE, FOREIGN KEY (volume_mount_uuid) REFERENCES VolumeMounts (uuid) ON DELETE CASCADE ); @@ -746,16 +746,16 @@ ALTER TABLE Fogs ADD COLUMN volume_mount_last_update BIGINT DEFAULT 0; ALTER TABLE ChangeTrackings ADD COLUMN volume_mounts BOOLEAN DEFAULT false; ALTER TABLE ChangeTrackings ADD COLUMN exec_sessions BOOLEAN DEFAULT false; -ALTER TABLE Services ADD COLUMN provisioning_status VARCHAR(32) DEFAULT 'pending'; +ALTER TABLE Services ADD COLUMN provisioning_status VARCHAR(36) DEFAULT 'pending'; ALTER TABLE Services ADD COLUMN provisioning_error TEXT; ALTER TABLE Fogs ADD COLUMN warning_message TEXT DEFAULT 'HEALTHY'; -ALTER TABLE Fogs ADD COLUMN gps_device VARCHAR(32); +ALTER TABLE Fogs ADD COLUMN gps_device VARCHAR(36); ALTER TABLE Fogs ADD COLUMN gps_scan_frequency INT DEFAULT 60; ALTER TABLE Fogs ADD COLUMN edge_guard_frequency INT DEFAULT 0; -ALTER TABLE Microservices ADD COLUMN pid_mode VARCHAR(32); -ALTER TABLE Microservices ADD COLUMN ipc_mode VARCHAR(32); +ALTER TABLE Microservices ADD COLUMN pid_mode VARCHAR(36); +ALTER TABLE Microservices ADD COLUMN ipc_mode VARCHAR(36); ALTER TABLE Microservices ADD COLUMN exec_enabled BOOLEAN DEFAULT false; ALTER TABLE MicroserviceStatuses ADD COLUMN exec_session_ids TEXT; @@ -764,9 +764,9 @@ ALTER TABLE Microservices ADD COLUMN schedule INT DEFAULT 50; CREATE TABLE IF NOT EXISTS MicroserviceExecStatuses ( id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, - status VARCHAR(255) DEFAULT 'PENDING', + status VARCHAR(255) DEFAULT 'INACTIVE', exec_session_id VARCHAR(255), - microservice_uuid VARCHAR(32), + microservice_uuid VARCHAR(36), created_at DATETIME, updated_at DATETIME, FOREIGN KEY (microservice_uuid) REFERENCES Microservices (uuid) ON DELETE CASCADE diff --git a/src/data/models/fog.js b/src/data/models/fog.js index 72d956e26..49c699615 100644 --- a/src/data/models/fog.js +++ b/src/data/models/fog.js @@ -5,7 +5,7 @@ const { convertToInt } = require('../../helpers/app-helper') module.exports = (sequelize, DataTypes) => { const Fog = sequelize.define('Fog', { uuid: { - type: DataTypes.STRING(32), + type: DataTypes.STRING(36), primaryKey: true, allowNull: false, field: 'uuid' @@ -17,7 +17,8 @@ module.exports = (sequelize, DataTypes) => { }, location: { type: DataTypes.TEXT, - field: 'location' + field: 'location', + defaultValue: '' }, gpsMode: { type: DataTypes.TEXT, @@ -42,7 +43,8 @@ module.exports = (sequelize, DataTypes) => { }, description: { type: DataTypes.TEXT, - field: 'description' + field: 'description', + defaultValue: '' }, lastActive: { type: DataTypes.BIGINT, @@ -370,11 +372,6 @@ module.exports = (sequelize, DataTypes) => { defaultValue: 0 }) - // Fog.hasOne(models.FogAccessToken, { - // foreignKey: 'iofog_uuid', - // as: 'accessToken' - // }) - Fog.hasOne(models.FogPublicKey, { foreignKey: 'iofog_uuid', as: 'publicKey' diff --git a/src/data/models/fogUsedToken.js b/src/data/models/fogUsedToken.js index a46323ff2..6e0b9e685 100644 --- a/src/data/models/fogUsedToken.js +++ b/src/data/models/fogUsedToken.js @@ -19,7 +19,11 @@ module.exports = (sequelize, DataTypes) => { expiryTime: { type: DataTypes.BIGINT, get () { - return convertToInt(this.getDataValue('daemonLastStart'), 0) + return convertToInt(this.getDataValue('expiryTime'), 0) + }, + set (value) { + // Ensure the value is stored as a BIGINT (Unix timestamp) + this.setDataValue('expiryTime', parseInt(value, 10)) }, field: 'expiry_time' } diff --git a/src/data/models/microservice.js b/src/data/models/microservice.js index 7806b3890..c90e98711 100644 --- a/src/data/models/microservice.js +++ b/src/data/models/microservice.js @@ -5,7 +5,7 @@ const { convertToInt } = require('../../helpers/app-helper') module.exports = (sequelize, DataTypes) => { const Microservice = sequelize.define('Microservice', { uuid: { - type: DataTypes.STRING(32), + type: DataTypes.STRING(36), primaryKey: true, allowNull: false, field: 'uuid' @@ -183,11 +183,6 @@ module.exports = (sequelize, DataTypes) => { as: 'env' }) - Microservice.hasMany(models.VolumeMount, { - foreignKey: 'microservice_uuid', - as: 'volumeMounts' - }) - Microservice.hasMany(models.MicroserviceArg, { foreignKey: 'microservice_uuid', as: 'cmd' diff --git a/src/data/models/volumeMount.js b/src/data/models/volumeMount.js index 0bdf2f2f2..db27b4fae 100644 --- a/src/data/models/volumeMount.js +++ b/src/data/models/volumeMount.js @@ -3,7 +3,7 @@ module.exports = (sequelize, DataTypes) => { const VolumeMount = sequelize.define('VolumeMount', { uuid: { - type: DataTypes.STRING(32), + type: DataTypes.STRING(36), primaryKey: true, allowNull: false, field: 'uuid' diff --git a/src/data/providers/mysql.js b/src/data/providers/mysql.js index 8cf6e9cc8..a899ea965 100644 --- a/src/data/providers/mysql.js +++ b/src/data/providers/mysql.js @@ -21,6 +21,20 @@ class MySqlDatabaseProvider extends DatabaseProvider { connectTimeout: 10000 } + // Configure SSL if enabled + const useSSL = process.env.DB_USE_SSL === 'true' || mysqlConfig.useSsl === true + if (useSSL) { + const caBase64 = process.env.DB_SSL_CA_B64 + const sslOptions = caBase64 + ? { + ca: Buffer.from(caBase64, 'base64').toString('utf-8'), + rejectUnauthorized: true + } + : { rejectUnauthorized: false } + + connectionOptions.ssl = sslOptions + } + // Sequelize configuration const sequelizeConfig = { dialect: 'mysql', @@ -35,6 +49,17 @@ class MySqlDatabaseProvider extends DatabaseProvider { logging: false } + // Add SSL configuration to Sequelize if enabled + if (useSSL) { + const caBase64 = process.env.DB_SSL_CA_B64 + sequelizeConfig.dialectOptions.ssl = caBase64 + ? { + ca: Buffer.from(caBase64, 'base64').toString('utf-8'), + rejectUnauthorized: true + } + : { rejectUnauthorized: false } + } + this.sequelize = new Sequelize(sequelizeConfig) this.connectionOptions = connectionOptions } diff --git a/src/data/providers/postgres.js b/src/data/providers/postgres.js index f1e44ade4..bfbe071cd 100644 --- a/src/data/providers/postgres.js +++ b/src/data/providers/postgres.js @@ -21,6 +21,20 @@ class PostgresDatabaseProvider extends DatabaseProvider { connectTimeout: 10000 } + // Configure SSL if enabled + const useSSL = process.env.DB_USE_SSL === 'true' || postgresConfig.useSsl === true + if (useSSL) { + const caBase64 = process.env.DB_SSL_CA_B64 + const sslOptions = caBase64 + ? { + ca: Buffer.from(caBase64, 'base64').toString('utf-8'), + rejectUnauthorized: true + } + : { rejectUnauthorized: false } + + connectionOptions.ssl = sslOptions + } + // Sequelize configuration const sequelizeConfig = { dialect: 'postgres', @@ -34,6 +48,16 @@ class PostgresDatabaseProvider extends DatabaseProvider { }, logging: false } + // Add SSL configuration to Sequelize if enabled + if (useSSL) { + const caBase64 = process.env.DB_SSL_CA_B64 + sequelizeConfig.dialectOptions.ssl = caBase64 + ? { + ca: Buffer.from(caBase64, 'base64').toString('utf-8'), + rejectUnauthorized: true + } + : { rejectUnauthorized: false } + } this.sequelize = new Sequelize(sequelizeConfig) this.connectionOptions = connectionOptions @@ -50,7 +74,11 @@ class PostgresDatabaseProvider extends DatabaseProvider { // Database doesn't exist, try to create it logger.info('Database does not exist, attempting to create it...') const { database, ...connectionConfig } = this.connectionOptions - const pool = new Pool(connectionConfig) + // Connect to the default 'postgres' database to create the target database + const pool = new Pool({ + ...connectionConfig, + database: 'postgres' + }) try { await pool.query(`CREATE DATABASE "${database}"`) logger.info(`Database ${database} created successfully`) diff --git a/src/data/seeders/mysql/db_seeder_mysql_v1.0.2.sql b/src/data/seeders/mysql/db_seeder_mysql_v1.0.2.sql index 62c66bc5b..5675a8351 100644 --- a/src/data/seeders/mysql/db_seeder_mysql_v1.0.2.sql +++ b/src/data/seeders/mysql/db_seeder_mysql_v1.0.2.sql @@ -7,12 +7,11 @@ VALUES INSERT INTO `CatalogItems` (name, description, category, publisher, disk_required, ram_required, picture, config_example, is_public, registry_id) VALUES - ('NATs', 'NATs server microservice for Datasance PoT', 'UTILITIES', 'Datasance', 0, 0, 'none.png', NULL, true, 1), + ('Router', 'The built-in router for Datasance PoT.', 'SYSTEM', 'Datasance', 0, 0, 'none.png', NULL, false, 1), ('RESTBlue', 'REST API for Bluetooth Low Energy layer.', 'SYSTEM', 'Datasance', 0, 0, 'none.png', NULL, true, 1), ('HAL', 'REST API for Hardware Abstraction layer.', 'SYSTEM', 'Datasance', 0, 0, 'none.png', NULL, true, 1), - ('EdgeGuard', 'Security and monitoring component for edge devices running ioFog Agents.', 'UTILITIES', 'Datasance', 0, 0, 'none.png', NULL, true, 1), - ('Router', 'The built-in router for Datasance PoT.', 'SYSTEM', 'Datasance', 0, 0, 'none.png', NULL, false, 1), - ('Debug', 'The built-in debugger for Datasance PoT IoFog Agent.', 'SYSTEM', 'Datasance', 0, 0, 'none.png', NULL, false, 1); + ('Debug', 'The built-in debugger for Datasance PoT IoFog Agent.', 'SYSTEM', 'Datasance', 0, 0, 'none.png', NULL, false, 1), + ('NATs', 'NATs server microservice for Datasance PoT', 'UTILITIES', 'Datasance', 0, 0, 'none.png', NULL, true, 1); INSERT INTO `FogTypes` (id, name, image, description, network_catalog_item_id, hal_catalog_item_id, bluetooth_catalog_item_id) VALUES @@ -26,18 +25,16 @@ WHERE fog_type_id IS NULL; INSERT INTO `CatalogItemImages` (catalog_item_id, fog_type_id, container_image) VALUES - (1, 1, 'ghcr.io/datasance/nats:latest'), - (1, 2, 'ghcr.io/datasance/nats:latest'), + (1, 1, 'ghcr.io/datasance/router:latest'), + (1, 2, 'ghcr.io/datasance/router:latest'), (2, 1, 'ghcr.io/datasance/restblue:latest'), (2, 2, 'ghcr.io/datasance/restblue:latest'), (3, 1, 'ghcr.io/datasance/hal:latest'), (3, 2, 'ghcr.io/datasance/hal:latest'), - (4, 1, 'ghcr.io/datasance/edge-guard:latest'), - (4, 2, 'ghcr.io/datasance/edge-guard:latest'), - (5, 1, 'ghcr.io/datasance/router:latest'), - (5, 2, 'ghcr.io/datasance/router:latest'), - (6, 1, 'ghcr.io/datasance/node-debugger:latest'), - (6, 2, 'ghcr.io/datasance/node-debugger:latest'); + (4, 1, 'ghcr.io/datasance/node-debugger:latest'), + (4, 2, 'ghcr.io/datasance/node-debugger:latest'), + (5, 1, 'ghcr.io/datasance/nats:latest'), + (5, 2, 'ghcr.io/datasance/nats:latest'); COMMIT; \ No newline at end of file diff --git a/src/data/seeders/postgres/db_seeder_pg_v1.0.2.sql b/src/data/seeders/postgres/db_seeder_pg_v1.0.2.sql index 19a9ae043..37a361f43 100644 --- a/src/data/seeders/postgres/db_seeder_pg_v1.0.2.sql +++ b/src/data/seeders/postgres/db_seeder_pg_v1.0.2.sql @@ -7,12 +7,11 @@ VALUES INSERT INTO "CatalogItems" (name, description, category, publisher, disk_required, ram_required, picture, config_example, is_public, registry_id) VALUES - ('NATs', 'NATs server microservice for Datasance PoT', 'UTILITIES', 'Datasance', 0, 0, 'none.png', NULL, true, 1), + ('Router', 'The built-in router for Datasance PoT.', 'SYSTEM', 'Datasance', 0, 0, 'none.png', NULL, false, 1), ('RESTBlue', 'REST API for Bluetooth Low Energy layer.', 'SYSTEM', 'Datasance', 0, 0, 'none.png', NULL, true, 1), ('HAL', 'REST API for Hardware Abstraction layer.', 'SYSTEM', 'Datasance', 0, 0, 'none.png', NULL, true, 1), - ('EdgeGuard', 'Security and monitoring component for edge devices running ioFog Agents.', 'UTILITIES', 'Datasance', 0, 0, 'none.png', NULL, true, 1), - ('Router', 'The built-in router for Datasance PoT.', 'SYSTEM', 'Datasance', 0, 0, 'none.png', NULL, false, 1), - ('Debug', 'The built-in debugger for Datasance PoT IoFog Agent.', 'SYSTEM', 'Datasance', 0, 0, 'none.png', NULL, false, 1); + ('Debug', 'The built-in debugger for Datasance PoT IoFog Agent.', 'SYSTEM', 'Datasance', 0, 0, 'none.png', NULL, false, 1), + ('NATs', 'NATs server microservice for Datasance PoT', 'UTILITIES', 'Datasance', 0, 0, 'none.png', NULL, true, 1); INSERT INTO "FogTypes" (id, name, image, description, network_catalog_item_id, hal_catalog_item_id, bluetooth_catalog_item_id) VALUES @@ -26,17 +25,15 @@ WHERE fog_type_id IS NULL; INSERT INTO "CatalogItemImages" (catalog_item_id, fog_type_id, container_image) VALUES - (1, 1, 'ghcr.io/datasance/nats:latest'), - (1, 2, 'ghcr.io/datasance/nats:latest'), + (1, 1, 'ghcr.io/datasance/router:latest'), + (1, 2, 'ghcr.io/datasance/router:latest'), (2, 1, 'ghcr.io/datasance/restblue:latest'), (2, 2, 'ghcr.io/datasance/restblue:latest'), (3, 1, 'ghcr.io/datasance/hal:latest'), (3, 2, 'ghcr.io/datasance/hal:latest'), - (4, 1, 'ghcr.io/datasance/edge-guard:latest'), - (4, 2, 'ghcr.io/datasance/edge-guard:latest'), - (5, 1, 'ghcr.io/datasance/router:latest'), - (5, 2, 'ghcr.io/datasance/router:latest'), - (6, 1, 'ghcr.io/datasance/node-debugger:latest'), - (6, 2, 'ghcr.io/datasance/node-debugger:latest'); + (4, 1, 'ghcr.io/datasance/node-debugger:latest'), + (4, 2, 'ghcr.io/datasance/node-debugger:latest'), + (5, 1, 'ghcr.io/datasance/nats:latest'), + (5, 2, 'ghcr.io/datasance/nats:latest'); COMMIT; \ No newline at end of file diff --git a/src/data/seeders/sqlite/db_seeder_sqlite_v1.0.2.sql b/src/data/seeders/sqlite/db_seeder_sqlite_v1.0.2.sql index da57229f2..d3e6e1620 100644 --- a/src/data/seeders/sqlite/db_seeder_sqlite_v1.0.2.sql +++ b/src/data/seeders/sqlite/db_seeder_sqlite_v1.0.2.sql @@ -5,12 +5,11 @@ VALUES INSERT INTO `CatalogItems` (name, description, category, publisher, disk_required, ram_required, picture, config_example, is_public, registry_id) VALUES - ('NATs', 'NATs server microservice for Datasance PoT', 'UTILITIES', 'Datasance', 0, 0, 'none.png', NULL, true, 1), + ('Router', 'The built-in router for Datasance PoT.', 'SYSTEM', 'Datasance', 0, 0, 'none.png', NULL, false, 1), ('RESTBlue', 'REST API for Bluetooth Low Energy layer.', 'SYSTEM', 'Datasance', 0, 0, 'none.png', NULL, true, 1), ('HAL', 'REST API for Hardware Abstraction layer.', 'SYSTEM', 'Datasance', 0, 0, 'none.png', NULL, true, 1), - ('EdgeGuard', 'Security and monitoring component for edge devices running ioFog Agents.', 'UTILITIES', 'Datasance', 0, 0, 'none.png', NULL, true, 1), - ('Router', 'The built-in router for Datasance PoT.', 'SYSTEM', 'Datasance', 0, 0, 'none.png', NULL, false, 1), - ('Debug', 'The built-in debugger for Datasance PoT IoFog Agent.', 'SYSTEM', 'Datasance', 0, 0, 'none.png', NULL, false, 1); + ('Debug', 'The built-in debugger for Datasance PoT IoFog Agent.', 'SYSTEM', 'Datasance', 0, 0, 'none.png', NULL, false, 1), + ('NATs', 'NATs server microservice for Datasance PoT', 'UTILITIES', 'Datasance', 0, 0, 'none.png', NULL, true, 1); INSERT INTO `FogTypes` (id, name, image, description, network_catalog_item_id, hal_catalog_item_id, bluetooth_catalog_item_id) VALUES @@ -24,15 +23,13 @@ WHERE fog_type_id IS NULL; INSERT INTO `CatalogItemImages` (catalog_item_id, fog_type_id, container_image) VALUES - (1, 1, 'ghcr.io/datasance/nats:latest'), - (1, 2, 'ghcr.io/datasance/nats:latest'), + (1, 1, 'ghcr.io/datasance/router:latest'), + (1, 2, 'ghcr.io/datasance/router:latest'), (2, 1, 'ghcr.io/datasance/restblue:latest'), (2, 2, 'ghcr.io/datasance/restblue:latest'), (3, 1, 'ghcr.io/datasance/hal:latest'), (3, 2, 'ghcr.io/datasance/hal:latest'), - (4, 1, 'ghcr.io/datasance/edge-guard:latest'), - (4, 2, 'ghcr.io/datasance/edge-guard:latest'), - (5, 1, 'ghcr.io/datasance/router:latest'), - (5, 2, 'ghcr.io/datasance/router:latest'), - (6, 1, 'ghcr.io/datasance/node-debugger:latest'), - (6, 2, 'ghcr.io/datasance/node-debugger:latest'); + (4, 1, 'ghcr.io/datasance/node-debugger:latest'), + (4, 2, 'ghcr.io/datasance/node-debugger:latest'), + (5, 1, 'ghcr.io/datasance/nats:latest'), + (5, 2, 'ghcr.io/datasance/nats:latest'); diff --git a/src/schemas/config-map.js b/src/schemas/config-map.js index bccfa9610..2376be9ee 100644 --- a/src/schemas/config-map.js +++ b/src/schemas/config-map.js @@ -14,6 +14,7 @@ const configMapUpdate = { id: '/configMapUpdate', type: 'object', properties: { + name: { type: 'string', minLength: 1, maxLength: 255 }, immutable: { type: 'boolean' }, data: { type: 'object' } }, diff --git a/src/server.js b/src/server.js index 30ad6b035..25a7e387a 100755 --- a/src/server.js +++ b/src/server.js @@ -205,6 +205,7 @@ initialize().then(() => { const apiPort = process.env.API_PORT || config.get('server.port') const viewerPort = process.env.VIEWER_PORT || config.get('viewer.port') const viewerURL = process.env.VIEWER_URL || config.get('viewer.url') + const controlPlane = process.env.CONTROL_PLANE || config.get('app.ControlPlane') // File-based SSL configuration const sslKey = process.env.SSL_PATH_KEY || config.get('server.ssl.path.key') @@ -259,6 +260,9 @@ initialize().then(() => { if (viewerURL) { ecnViewerControllerConfig.url = viewerURL } + if (controlPlane) { + ecnViewerControllerConfig.controlPlane = controlPlane + } const ecnViewerConfigScript = ` window.controllerConfig = ${JSON.stringify(ecnViewerControllerConfig)} ` diff --git a/src/services/agent-service.js b/src/services/agent-service.js index fa0ff1d84..74111edbf 100644 --- a/src/services/agent-service.js +++ b/src/services/agent-service.js @@ -18,6 +18,7 @@ const formidable = require('formidable') const Sequelize = require('sequelize') const moment = require('moment') const Op = Sequelize.Op +const logger = require('../logger') const TransactionDecorator = require('../decorators/transaction-decorator') const FogProvisionKeyManager = require('../data/managers/iofog-provision-key-manager') @@ -647,11 +648,20 @@ const getControllerCA = async function (fog, transaction) { if (hasFileBasedSSL) { try { if (intermedKey) { - const certData = fs.readFileSync(intermedKey) - return Buffer.from(certData).toString('base64') + // Check if intermediate certificate file exists before trying to read it + if (fs.existsSync(intermedKey)) { + const certData = fs.readFileSync(intermedKey, 'utf8') + return Buffer.from(certData).toString('base64') + } else { + // Intermediate certificate file doesn't exist, don't provide any CA cert + // Let the system's default trust store handle validation + logger.info(`Intermediate certificate file not found at path: ${intermedKey}, not providing CA certificate`) + return '' + } } else { - const certData = fs.readFileSync(sslCert) - return Buffer.from(certData).toString('base64') + // No intermediate certificate path provided, don't provide any CA cert + // Let the system's default trust store handle validation + return '' } } catch (error) { throw new Errors.ValidationError('Failed to read SSL certificate file') @@ -661,8 +671,10 @@ const getControllerCA = async function (fog, transaction) { if (hasBase64SSL) { if (intermedKeyBase64) { return intermedKeyBase64 - } else if (sslCertBase64) { - return sslCertBase64 + } else { + // No intermediate certificate base64 provided, don't provide any CA cert + // Let the system's default trust store handle validation + return '' } } diff --git a/src/services/catalog-service.js b/src/services/catalog-service.js index ae0be7db2..8350c19c1 100644 --- a/src/services/catalog-service.js +++ b/src/services/catalog-service.js @@ -136,7 +136,7 @@ const deleteCatalogItemEndPoint = async function (id, isCLI, transaction) { return affectedRows } -async function getNetworkCatalogItem (transaction) { +async function getNatsCatalogItem (transaction) { return CatalogItemManager.findOne({ name: 'NATs', category: 'UTILITIES', @@ -154,15 +154,6 @@ async function getRouterCatalogItem (transaction) { }, transaction) } -async function getProxyCatalogItem (transaction) { - return CatalogItemManager.findOne({ - name: DBConstants.PROXY_CATALOG_NAME, - category: 'SYSTEM', - publisher: 'Datasance', - registry_id: 1 - }, transaction) -} - async function getDebugCatalogItem (transaction) { return CatalogItemManager.findOne({ name: DBConstants.DEBUG_CATALOG_NAME, @@ -386,10 +377,9 @@ module.exports = { updateCatalogItemEndPoint: TransactionDecorator.generateTransaction(updateCatalogItemEndPoint), getCatalogItem: getCatalogItem, getSystemCatalogItem: getSystemCatalogItem, - getNetworkCatalogItem: getNetworkCatalogItem, + getNatsCatalogItem: getNatsCatalogItem, getBluetoothCatalogItem: getBluetoothCatalogItem, getHalCatalogItem: getHalCatalogItem, getRouterCatalogItem: getRouterCatalogItem, - getDebugCatalogItem: getDebugCatalogItem, - getProxyCatalogItem: getProxyCatalogItem + getDebugCatalogItem: getDebugCatalogItem } diff --git a/src/services/iofog-key-service.js b/src/services/iofog-key-service.js index 242c45972..d34927c99 100644 --- a/src/services/iofog-key-service.js +++ b/src/services/iofog-key-service.js @@ -12,9 +12,9 @@ */ const crypto = require('crypto') -const AppHelper = require('../helpers/app-helper') const FogPublicKeyManager = require('../data/managers/iofog-public-key-manager') const FogUsedTokenManager = require('../data/managers/fog-used-token-manager') +const SecretHelper = require('../helpers/secret-helper') const jose = require('jose') /** @@ -47,8 +47,8 @@ const generateKeyPair = async function (transaction) { * @returns {Promise} Promise resolving to the stored public key */ const storePublicKey = async function (fogUuid, publicKey, transaction) { - // Encrypt the public key using the fog UUID as salt - const encryptedPublicKey = AppHelper.encryptText(publicKey, fogUuid) + // Encrypt the public key using SecretHelper for better security and database compatibility + const encryptedPublicKey = await SecretHelper.encryptSecret(publicKey, fogUuid) // Store the encrypted public key return FogPublicKeyManager.updateOrCreate(fogUuid, encryptedPublicKey, transaction) @@ -68,8 +68,8 @@ const getPublicKey = async function (fogUuid, transaction) { return null } - // Decrypt the public key using the fog UUID as salt - return AppHelper.decryptText(fogPublicKey.publicKey, fogUuid) + // Decrypt the public key using SecretHelper for better security and database compatibility + return SecretHelper.decryptSecret(fogPublicKey.publicKey, fogUuid) } /** diff --git a/src/services/iofog-service.js b/src/services/iofog-service.js index 2c8853cdb..ce9bac219 100644 --- a/src/services/iofog-service.js +++ b/src/services/iofog-service.js @@ -56,7 +56,7 @@ async function checkKubernetesEnvironment () { async function getLocalCertificateHosts (isKubernetes, namespace) { if (isKubernetes) { - return `router-local,router-local.${namespace},router-local.${namespace}.svc.cluster.local` + return `router-local,router-local.${namespace},router-local.${namespace}.svc.cluster.local,127.0.0.1,localhost,host.docker.internal,host.containers.internal` } return '127.0.0.1,localhost,host.docker.internal,host.containers.internal' } @@ -239,14 +239,13 @@ async function _handleRouterCertificates (fogData, uuid, isRouterModeChanged, tr async function createFogEndPoint (fogData, isCLI, transaction) { await Validator.validate(fogData, Validator.schemas.iofogCreate) - let createFogData = { uuid: AppHelper.generateUUID(), name: fogData.name, location: fogData.location, latitude: fogData.latitude, longitude: fogData.longitude, - gpsMode: fogData.latitude || fogData.longitude ? 'manual' : undefined, + // gpsMode: fogData.latitude || fogData.longitude ? 'manual' : undefined, description: fogData.description, networkInterface: fogData.networkInterface, dockerUrl: fogData.dockerUrl, @@ -275,6 +274,15 @@ async function createFogEndPoint (fogData, isCLI, transaction) { timeZone: fogData.timeZone } + if ((fogData.latitude || fogData.longitude) && fogData.gpsMode !== 'dynamic') { + createFogData.gpsMode = 'manual' + } else if (fogData.gpsMode === 'dynamic' && fogData.gpsDevice) { + createFogData.gpsMode = fogData.gpsMode + createFogData.gpsDevice = fogData.gpsDevice + } else { + createFogData.gpsMode = undefined + } + createFogData = AppHelper.deleteUndefinedFields(createFogData) // Default router is edge @@ -363,7 +371,7 @@ async function createFogEndPoint (fogData, isCLI, transaction) { // Set fog node as healthy await FogManager.update({ uuid: fog.uuid }, { warningMessage: 'HEALTHY' }, transaction) } catch (err) { - logger.error('Background orchestration failed in createFogEndPoint:', err) + logger.error('Background orchestration failed in createFogEndPoint: ' + err.message) // Set fog node as warning with error message await FogManager.update( { uuid: fog.uuid }, @@ -404,7 +412,7 @@ async function updateFogEndPoint (fogData, isCLI, transaction) { location: fogData.location, latitude: fogData.latitude, longitude: fogData.longitude, - gpsMode: fogData.latitude || fogData.longitude ? 'manual' : undefined, + // gpsMode: fogData.latitude || fogData.longitude ? 'manual' : undefined, description: fogData.description, networkInterface: fogData.networkInterface, dockerUrl: fogData.dockerUrl, @@ -431,6 +439,15 @@ async function updateFogEndPoint (fogData, isCLI, transaction) { availableDiskThreshold: fogData.availableDiskThreshold, timeZone: fogData.timeZone } + + if ((fogData.latitude || fogData.longitude) && fogData.gpsMode !== 'dynamic') { + updateFogData.gpsMode = 'manual' + } else if (fogData.gpsMode === 'dynamic' && fogData.gpsDevice) { + updateFogData.gpsMode = fogData.gpsMode + updateFogData.gpsDevice = fogData.gpsDevice + } else { + updateFogData.gpsMode = undefined + } updateFogData = AppHelper.deleteUndefinedFields(updateFogData) const oldFog = await FogManager.findOne(queryFogData, transaction) @@ -486,7 +503,8 @@ async function updateFogEndPoint (fogData, isCLI, transaction) { (async () => { try { // --- Begin orchestration logic --- - await _handleRouterCertificates(fogData, fogData.uuid, isRouterModeChanged, transaction) + const fog = await FogManager.findOne({ uuid: fogData.uuid }, transaction) + await _handleRouterCertificates(fogData, fog.uuid, isRouterModeChanged, transaction) if (routerMode === 'none') { networkRouter = await RouterService.getNetworkRouter(fogData.networkRouter) @@ -597,7 +615,7 @@ async function updateFogEndPoint (fogData, isCLI, transaction) { // Set fog node as healthy await FogManager.update({ uuid: fogData.uuid }, { warningMessage: 'HEALTHY' }, transaction) } catch (err) { - logger.error('Background orchestration failed in updateFogEndPoint:', err) + logger.error('Background orchestration failed in updateFogEndPoint: ' + err.message) await FogManager.update( { uuid: fogData.uuid }, { @@ -884,11 +902,20 @@ async function generateProvisioningKeyEndPoint (fogData, isCLI, transaction) { if (hasFileBasedSSL) { try { if (intermedKey) { - const certData = fs.readFileSync(intermedKey) - caCert = Buffer.from(certData).toString('base64') + // Check if intermediate certificate file exists before trying to read it + if (fs.existsSync(intermedKey)) { + const certData = fs.readFileSync(intermedKey) + caCert = Buffer.from(certData).toString('base64') + } else { + // Intermediate certificate file doesn't exist, don't provide any CA cert + // Let the system's default trust store handle validation + logger.info(`Intermediate certificate file not found at path: ${intermedKey}, not providing CA certificate`) + caCert = '' + } } else { - const certData = fs.readFileSync(sslCert) - caCert = Buffer.from(certData).toString('base64') + // No intermediate certificate path provided, don't provide any CA cert + // Let the system's default trust store handle validation + caCert = '' } } catch (error) { throw new Errors.ValidationError('Failed to read SSL certificate file') @@ -897,8 +924,10 @@ async function generateProvisioningKeyEndPoint (fogData, isCLI, transaction) { if (hasBase64SSL) { if (intermedKeyBase64) { caCert = intermedKeyBase64 - } else if (sslCertBase64) { - caCert = sslCertBase64 + } else { + // No intermediate certificate base64 provided, don't provide any CA cert + // Let the system's default trust store handle validation + caCert = '' } } } @@ -1010,7 +1039,7 @@ async function _processDeleteCommand (fog, transaction) { for (const microservice of microservices) { await MicroserviceService.deleteMicroserviceWithRoutesAndPortMappings(microservice, transaction) } - + await ApplicationManager.delete({ name: `system-${fog.uuid.toLowerCase()}` }, transaction) await ChangeTrackingService.update(fog.uuid, ChangeTrackingService.events.deleteNode, transaction) await FogManager.delete({ uuid: fog.uuid }, transaction) } diff --git a/src/services/microservices-service.js b/src/services/microservices-service.js index 0e13993eb..d7e9f1d84 100644 --- a/src/services/microservices-service.js +++ b/src/services/microservices-service.js @@ -1573,16 +1573,21 @@ async function _validateApplication (name, isCLI, transaction) { const application = await ApplicationManager.findOne(where, transaction) if (!application) { - // Try with id - const where = isCLI - ? { id: name, isSystem: false } - : { id: name, isSystem: false } - - const application = await ApplicationManager.findOne(where, transaction) - if (!application) { + // Try with id - but only if name is actually a valid integer + if (Number.isInteger(Number(name)) && !isNaN(name)) { + const where = isCLI + ? { id: parseInt(name), isSystem: false } + : { id: parseInt(name), isSystem: false } + + const application = await ApplicationManager.findOne(where, transaction) + if (!application) { + throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.INVALID_FLOW_ID, name)) + } + return application + } else { + // If name is not a valid integer, it's not a valid ID either throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.INVALID_FLOW_ID, name)) } - return application } return application } @@ -1599,16 +1604,21 @@ async function _validateSystemApplication (name, isCLI, transaction) { const application = await ApplicationManager.findOne(where, transaction) if (!application) { - // Try with id - const where = isCLI - ? { id: name, isSystem: true } - : { id: name, isSystem: true } - - const application = await ApplicationManager.findOne(where, transaction) - if (!application) { + // Try with id - but only if name is actually a valid integer + if (Number.isInteger(Number(name)) && !isNaN(name)) { + const where = isCLI + ? { id: parseInt(name), isSystem: true } + : { id: parseInt(name), isSystem: true } + + const application = await ApplicationManager.findOne(where, transaction) + if (!application) { + throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.INVALID_FLOW_ID, name)) + } + return application + } else { + // If name is not a valid integer, it's not a valid ID either throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.INVALID_FLOW_ID, name)) } - return application } return application } diff --git a/src/services/router-service.js b/src/services/router-service.js index 07daa12d0..8286c1383 100644 --- a/src/services/router-service.js +++ b/src/services/router-service.js @@ -330,9 +330,10 @@ async function _createRouterMicroservice (isEdge, uuid, microserviceConfig, tran const capAddValues = [ { capAdd: 'NET_RAW' } ] - - await ApplicationManager.create(routerApplicationData, transaction) - const application = await ApplicationManager.findOne({ name: routerApplicationData.name }, transaction) + let application = await ApplicationManager.findOne({ name: routerApplicationData.name }, transaction) + if (!application) { + application = await ApplicationManager.create(routerApplicationData, transaction) + } routerMicroserviceData.applicationId = application.id const routerMicroservice = await MicroserviceManager.create(routerMicroserviceData, transaction) await MicroserviceStatusManager.create({ microserviceUuid: routerMicroserviceData.uuid }, transaction) diff --git a/src/services/services-service.js b/src/services/services-service.js index 3518d3aa6..8503fe4d8 100644 --- a/src/services/services-service.js +++ b/src/services/services-service.js @@ -658,8 +658,15 @@ async function _deleteTcpConnector (serviceName, transaction) { if (service.type === 'microservice') { microserviceSource = await MicroserviceManager.findOne({ uuid: service.resource }, transaction) } + let fogSource = null + if (service.type === 'agent') { + fogSource = await FogManager.findOne({ uuid: service.resource }, transaction) + if (!fogSource) { + fogSource = await FogManager.findOne({ name: service.resource }, transaction) + } + } - if (isDefaultRouter && !microserviceSource) { + if (isDefaultRouter && (!microserviceSource || !fogSource)) { if (isK8s) { // Update K8s router config const configMap = await K8sClient.getConfigMap(K8S_ROUTER_CONFIG_MAP) @@ -690,22 +697,26 @@ async function _deleteTcpConnector (serviceName, transaction) { await _updateRouterMicroserviceConfig(fogNodeUuid, currentConfig, transaction) } - } else { - let fogNodeUuid = null - if (microserviceSource) { - fogNodeUuid = microserviceSource.iofogUuid - } else { - fogNodeUuid = service.defaultBridge // This is the actual fogNodeUuid for non-default router - } - const routerMicroservice = await _getRouterMicroservice(fogNodeUuid, transaction) - const currentConfig = JSON.parse(routerMicroservice.config || '{}') + } - if (currentConfig.bridges && currentConfig.bridges.tcpConnectors) { - delete currentConfig.bridges.tcpConnectors[connectorName] - } + let fogNodeUuid = null + if (!isDefaultRouter && (!microserviceSource || !fogSource)) { + fogNodeUuid = service.defaultBridge + } + if (microserviceSource) { + fogNodeUuid = microserviceSource.iofogUuid + } + if (fogSource) { + fogNodeUuid = fogSource.uuid + } + const routerMicroservice = await _getRouterMicroservice(fogNodeUuid, transaction) + const currentConfig = JSON.parse(routerMicroservice.config || '{}') - await _updateRouterMicroserviceConfig(fogNodeUuid, currentConfig, transaction) + if (currentConfig.bridges && currentConfig.bridges.tcpConnectors) { + delete currentConfig.bridges.tcpConnectors[connectorName] } + + await _updateRouterMicroserviceConfig(fogNodeUuid, currentConfig, transaction) } // Helper function to delete tcpListener from router config @@ -798,20 +809,18 @@ async function _createK8sService (serviceConfig, transaction) { name: serviceConfig.name, annotations: normalizedTags.reduce((acc, tag) => { const [key, value] = tag.split(':') - acc[key] = value || '' + acc[key] = (value || '').trim() return acc }, {}) }, spec: { type: serviceConfig.k8sType, selector: { - application: 'interior-router', - name: 'router', - 'skupper.io/component': 'router' + 'datasance.com/component': 'router' }, ports: [{ - port: parseInt(serviceConfig.bridgePort), - targetPort: parseInt(serviceConfig.servicePort), + targetPort: parseInt(serviceConfig.bridgePort), + port: parseInt(serviceConfig.servicePort), protocol: 'TCP' }] } @@ -841,7 +850,7 @@ async function _updateK8sService (serviceConfig, transaction) { metadata: { annotations: normalizedTags.reduce((acc, tag) => { const [key, value] = tag.split(':') - acc[key] = value || '' + acc[key] = (value || '').trim() return acc }, {}) }, diff --git a/src/utils/k8s-client.js b/src/utils/k8s-client.js index 65896321a..0aa8c9ae4 100644 --- a/src/utils/k8s-client.js +++ b/src/utils/k8s-client.js @@ -209,10 +209,13 @@ async function watchLoadBalancerIP (serviceName, maxRetries = 10, retryInterval service.status.loadBalancer && service.status.loadBalancer.ingress && service.status.loadBalancer.ingress.length > 0) { - const ip = service.status.loadBalancer.ingress[0].ip - if (ip) { - logger.info(`Found LoadBalancer IP: ${ip} for service: ${serviceName}`) - return ip + const ingress = service.status.loadBalancer.ingress[0] + if (ingress.ip) { + logger.info(`Found LoadBalancer IP: ${ingress.ip} for service: ${serviceName}`) + return ingress.ip + } else if (ingress.hostname) { + logger.info(`Found LoadBalancer hostname: ${ingress.hostname} for service: ${serviceName}`) + return ingress.hostname } } logger.info(`Service ${serviceName} is LoadBalancer type but IP not yet assigned (attempt ${attempt + 1}/${maxRetries})`) From 2a2455570a7a315203e3c5a2831d90172b9be505 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emirhan=20Durmu=C5=9F?= Date: Sat, 5 Jul 2025 16:38:12 +0300 Subject: [PATCH 159/178] veiwer version updated, node's router secrets deletion added to node delete method --- package-lock.json | 12 ++++++------ package.json | 4 ++-- src/services/iofog-service.js | 15 +++++++++++++++ 3 files changed, 23 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index 1f7e89d1f..b2a6955e1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,16 +1,16 @@ { "name": "@datasance/iofogcontroller", - "version": "3.5.0-beta", + "version": "3.5.0-beta1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@datasance/iofogcontroller", - "version": "3.5.0-beta", + "version": "3.5.0-beta1", "hasInstallScript": true, "license": "EPL-2.0", "dependencies": { - "@datasance/ecn-viewer": "1.0.0-alpha1", + "@datasance/ecn-viewer": "1.0.0-beta1", "@kubernetes/client-node": "^0.22.3", "@msgpack/msgpack": "^3.1.2", "@opentelemetry/api": "^1.9.0", @@ -427,9 +427,9 @@ } }, "node_modules/@datasance/ecn-viewer": { - "version": "1.0.0-alpha1", - "resolved": "https://registry.npmjs.org/@datasance/ecn-viewer/-/ecn-viewer-1.0.0-alpha1.tgz", - "integrity": "sha512-gFOvOf9gZqSJyW32UxWAz/e5vLKak0uPx9+Lqp5CpP5pLETaMWmApiWQFaPKxVWhGVOwT38b7WoWo4W78SWzDQ==" + "version": "1.0.0-beta1", + "resolved": "https://registry.npmjs.org/@datasance/ecn-viewer/-/ecn-viewer-1.0.0-beta1.tgz", + "integrity": "sha512-ZCpiRgCwbdxvnMf83dIQn7AluitD00qeVyddYKgR/LSBrB+oXXTttVlr+CH7kpOPshKrNCAeASceLuTmKVuD8Q==" }, "node_modules/@eslint-community/eslint-utils": { "version": "4.7.0", diff --git a/package.json b/package.json index cfa589951..a9699d77b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@datasance/iofogcontroller", - "version": "3.5.0-beta", + "version": "3.5.0-beta1", "description": "ioFog Controller project for Datasance PoT @ datasance.com \\nCopyright (c) 2023 Datasance Teknoloji A.S.", "main": "./src/main.js", "author": "Emirhan Durmus", @@ -55,7 +55,7 @@ "iofog-controller": "src/main.js" }, "dependencies": { - "@datasance/ecn-viewer": "1.0.0-alpha1", + "@datasance/ecn-viewer": "1.0.0-beta1", "@kubernetes/client-node": "^0.22.3", "@msgpack/msgpack": "^3.1.2", "@opentelemetry/api": "^1.9.0", diff --git a/src/services/iofog-service.js b/src/services/iofog-service.js index ce9bac219..b088420ae 100644 --- a/src/services/iofog-service.js +++ b/src/services/iofog-service.js @@ -44,6 +44,7 @@ const CertificateService = require('./certificate-service') const logger = require('../logger') const ServiceManager = require('../data/managers/service-manager') const FogStates = require('../enums/fog-state') +const SecretManager = require('../data/managers/secret-manager') const SITE_CA_CERT = 'pot-site-ca' const DEFAULT_ROUTER_LOCAL_CA = 'default-router-local-ca' @@ -1041,6 +1042,20 @@ async function _processDeleteCommand (fog, transaction) { } await ApplicationManager.delete({ name: `system-${fog.uuid.toLowerCase()}` }, transaction) await ChangeTrackingService.update(fog.uuid, ChangeTrackingService.events.deleteNode, transaction) + // Delete router-related secrets if they exist + const secretNames = [ + `${fog.uuid}-site-server`, + `${fog.uuid}-local-ca`, + `${fog.uuid}-local-server`, + `${fog.uuid}-local-agent` + ] + + for (const secretName of secretNames) { + const secret = await SecretManager.findOne({ name: secretName }, transaction) + if (secret) { + await SecretManager.delete({ name: secretName }, transaction) + } + } await FogManager.delete({ uuid: fog.uuid }, transaction) } From e184a589485e4c652970d628c2c14ecceb509b21 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emirhan=20Durmu=C5=9F?= Date: Sun, 6 Jul 2025 23:16:18 +0300 Subject: [PATCH 160/178] viewer version updated and gpsstatus added to fog data model --- package-lock.json | 12 ++++++------ package.json | 4 ++-- .../migrations/mysql/db_migration_mysql_v1.0.2.sql | 2 ++ .../migrations/postgres/db_migration_pg_v1.0.2.sql | 2 ++ .../migrations/sqlite/db_migration_sqlite_v1.0.2.sql | 4 +++- src/data/models/fog.js | 4 ++++ src/schemas/agent.js | 3 ++- src/services/agent-service.js | 3 ++- 8 files changed, 23 insertions(+), 11 deletions(-) diff --git a/package-lock.json b/package-lock.json index b2a6955e1..ec57a5104 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,16 +1,16 @@ { "name": "@datasance/iofogcontroller", - "version": "3.5.0-beta1", + "version": "3.5.0-beta2", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@datasance/iofogcontroller", - "version": "3.5.0-beta1", + "version": "3.5.0-beta2", "hasInstallScript": true, "license": "EPL-2.0", "dependencies": { - "@datasance/ecn-viewer": "1.0.0-beta1", + "@datasance/ecn-viewer": "1.0.0-beta2", "@kubernetes/client-node": "^0.22.3", "@msgpack/msgpack": "^3.1.2", "@opentelemetry/api": "^1.9.0", @@ -427,9 +427,9 @@ } }, "node_modules/@datasance/ecn-viewer": { - "version": "1.0.0-beta1", - "resolved": "https://registry.npmjs.org/@datasance/ecn-viewer/-/ecn-viewer-1.0.0-beta1.tgz", - "integrity": "sha512-ZCpiRgCwbdxvnMf83dIQn7AluitD00qeVyddYKgR/LSBrB+oXXTttVlr+CH7kpOPshKrNCAeASceLuTmKVuD8Q==" + "version": "1.0.0-beta2", + "resolved": "https://registry.npmjs.org/@datasance/ecn-viewer/-/ecn-viewer-1.0.0-beta2.tgz", + "integrity": "sha512-SCwolkINC1ClpKn84DHVFxIDf4m4lj4+ePzJVHJwtcG1ZqbiDsaIs8Wu27kohXMm4a234gdj78Hkc8UmC+vOPA==" }, "node_modules/@eslint-community/eslint-utils": { "version": "4.7.0", diff --git a/package.json b/package.json index a9699d77b..4503db1a3 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@datasance/iofogcontroller", - "version": "3.5.0-beta1", + "version": "3.5.0-beta2", "description": "ioFog Controller project for Datasance PoT @ datasance.com \\nCopyright (c) 2023 Datasance Teknoloji A.S.", "main": "./src/main.js", "author": "Emirhan Durmus", @@ -55,7 +55,7 @@ "iofog-controller": "src/main.js" }, "dependencies": { - "@datasance/ecn-viewer": "1.0.0-beta1", + "@datasance/ecn-viewer": "1.0.0-beta2", "@kubernetes/client-node": "^0.22.3", "@msgpack/msgpack": "^3.1.2", "@opentelemetry/api": "^1.9.0", diff --git a/src/data/migrations/mysql/db_migration_mysql_v1.0.2.sql b/src/data/migrations/mysql/db_migration_mysql_v1.0.2.sql index 528e829cf..99c2c9616 100644 --- a/src/data/migrations/mysql/db_migration_mysql_v1.0.2.sql +++ b/src/data/migrations/mysql/db_migration_mysql_v1.0.2.sql @@ -787,4 +787,6 @@ CREATE TABLE IF NOT EXISTS MicroserviceExecStatuses ( CREATE INDEX idx_microservice_exec_status_microservice_uuid ON MicroserviceExecStatuses (microservice_uuid); +ALTER TABLE Fogs ADD COLUMN gps_status VARCHAR(32); + COMMIT; \ No newline at end of file diff --git a/src/data/migrations/postgres/db_migration_pg_v1.0.2.sql b/src/data/migrations/postgres/db_migration_pg_v1.0.2.sql index d8367c48b..bec766081 100644 --- a/src/data/migrations/postgres/db_migration_pg_v1.0.2.sql +++ b/src/data/migrations/postgres/db_migration_pg_v1.0.2.sql @@ -786,3 +786,5 @@ CREATE TABLE IF NOT EXISTS "MicroserviceExecStatuses" ( ); CREATE INDEX idx_microservice_exec_status_microservice_uuid ON "MicroserviceExecStatuses" (microservice_uuid); + +ALTER TABLE "Fogs" ADD COLUMN gps_status VARCHAR(32); \ No newline at end of file diff --git a/src/data/migrations/sqlite/db_migration_sqlite_v1.0.2.sql b/src/data/migrations/sqlite/db_migration_sqlite_v1.0.2.sql index f5d2aee4b..a8e45ccc6 100644 --- a/src/data/migrations/sqlite/db_migration_sqlite_v1.0.2.sql +++ b/src/data/migrations/sqlite/db_migration_sqlite_v1.0.2.sql @@ -772,4 +772,6 @@ CREATE TABLE IF NOT EXISTS MicroserviceExecStatuses ( FOREIGN KEY (microservice_uuid) REFERENCES Microservices (uuid) ON DELETE CASCADE ); -CREATE INDEX idx_microservice_exec_status_microservice_uuid ON MicroserviceExecStatuses (microservice_uuid); \ No newline at end of file +CREATE INDEX idx_microservice_exec_status_microservice_uuid ON MicroserviceExecStatuses (microservice_uuid); + +ALTER TABLE Fogs ADD COLUMN gps_status VARCHAR(32); \ No newline at end of file diff --git a/src/data/models/fog.js b/src/data/models/fog.js index 49c699615..7bd62e3f1 100644 --- a/src/data/models/fog.js +++ b/src/data/models/fog.js @@ -356,6 +356,10 @@ module.exports = (sequelize, DataTypes) => { type: DataTypes.TEXT, field: 'warning_message', defaultValue: 'HEALTHY' + }, + gpsStatus: { + type: DataTypes.TEXT, + field: 'gps_status' } }, { tableName: 'Fogs', diff --git a/src/schemas/agent.js b/src/schemas/agent.js index cf4e6c9c0..87c4e1235 100644 --- a/src/schemas/agent.js +++ b/src/schemas/agent.js @@ -103,7 +103,8 @@ const updateAgentStatus = { 'tunnelStatus': { 'type': 'string' }, 'version': { 'type': 'string' }, 'isReadyToUpgrade': { 'type': 'boolean' }, - 'isReadyToRollback': { 'type': 'boolean' } + 'isReadyToRollback': { 'type': 'boolean' }, + 'gpsStatus': { 'type': 'string' } }, 'additionalProperties': true } diff --git a/src/services/agent-service.js b/src/services/agent-service.js index 74111edbf..a1217b79b 100644 --- a/src/services/agent-service.js +++ b/src/services/agent-service.js @@ -255,7 +255,8 @@ const updateAgentStatus = async function (agentStatus, fog, transaction) { isReadyToUpgrade: agentStatus.isReadyToUpgrade, isReadyToRollback: agentStatus.isReadyToRollback, activeVolumeMounts: agentStatus.activeVolumeMounts, - volumeMountLastUpdate: agentStatus.volumeMountLastUpdate + volumeMountLastUpdate: agentStatus.volumeMountLastUpdate, + gpsStatus: agentStatus.gpsStatus } fogStatus = AppHelper.deleteUndefinedFields(fogStatus) From bf18ab6b09a81b9649a1a97b3134232340fe3a00 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emirhan=20Durmu=C5=9F?= Date: Wed, 9 Jul 2025 03:46:30 +0300 Subject: [PATCH 161/178] microservice yaml parser fixed, secret update schema fixed --- package-lock.json | 12 ++--- package.json | 4 +- src/schemas/secret.js | 1 + src/services/yaml-parser-service.js | 70 ++++++++++++++++++++++++++++- 4 files changed, 78 insertions(+), 9 deletions(-) diff --git a/package-lock.json b/package-lock.json index ec57a5104..19295bc09 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,16 +1,16 @@ { "name": "@datasance/iofogcontroller", - "version": "3.5.0-beta2", + "version": "3.5.0-beta3", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@datasance/iofogcontroller", - "version": "3.5.0-beta2", + "version": "3.5.0-beta3", "hasInstallScript": true, "license": "EPL-2.0", "dependencies": { - "@datasance/ecn-viewer": "1.0.0-beta2", + "@datasance/ecn-viewer": "1.0.0-beta3", "@kubernetes/client-node": "^0.22.3", "@msgpack/msgpack": "^3.1.2", "@opentelemetry/api": "^1.9.0", @@ -427,9 +427,9 @@ } }, "node_modules/@datasance/ecn-viewer": { - "version": "1.0.0-beta2", - "resolved": "https://registry.npmjs.org/@datasance/ecn-viewer/-/ecn-viewer-1.0.0-beta2.tgz", - "integrity": "sha512-SCwolkINC1ClpKn84DHVFxIDf4m4lj4+ePzJVHJwtcG1ZqbiDsaIs8Wu27kohXMm4a234gdj78Hkc8UmC+vOPA==" + "version": "1.0.0-beta3", + "resolved": "https://registry.npmjs.org/@datasance/ecn-viewer/-/ecn-viewer-1.0.0-beta3.tgz", + "integrity": "sha512-adYlBAgICw2MluooMhnv669vYXGX9nuliT00RkG45XJZ5TuC3Z+/ZrGUwAGz9Z4m74YS9xNB/qkw/1FSdf1B3w==" }, "node_modules/@eslint-community/eslint-utils": { "version": "4.7.0", diff --git a/package.json b/package.json index 4503db1a3..38c28474e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@datasance/iofogcontroller", - "version": "3.5.0-beta2", + "version": "3.5.0-beta3", "description": "ioFog Controller project for Datasance PoT @ datasance.com \\nCopyright (c) 2023 Datasance Teknoloji A.S.", "main": "./src/main.js", "author": "Emirhan Durmus", @@ -55,7 +55,7 @@ "iofog-controller": "src/main.js" }, "dependencies": { - "@datasance/ecn-viewer": "1.0.0-beta2", + "@datasance/ecn-viewer": "1.0.0-beta3", "@kubernetes/client-node": "^0.22.3", "@msgpack/msgpack": "^3.1.2", "@opentelemetry/api": "^1.9.0", diff --git a/src/schemas/secret.js b/src/schemas/secret.js index af2ac259d..68251328f 100644 --- a/src/schemas/secret.js +++ b/src/schemas/secret.js @@ -14,6 +14,7 @@ const secretUpdate = { id: '/secretUpdate', type: 'object', properties: { + name: { type: 'string', minLength: 1, maxLength: 255 }, data: { type: 'object' } }, required: ['data'], diff --git a/src/services/yaml-parser-service.js b/src/services/yaml-parser-service.js index 93953fb64..de3b205c5 100644 --- a/src/services/yaml-parser-service.js +++ b/src/services/yaml-parser-service.js @@ -258,6 +258,74 @@ const parseMicroserviceImages = async (fileImages) => { const parseMicroserviceYAML = async (microservice) => { const { registryId, catalogItemId, images } = await parseMicroserviceImages(microservice.images) const container = microservice.container || {} + + // Parse environment variables with support for value, valueFromSecret, and valueFromConfigMap + const parseEnvVariables = (envArray) => { + if (!envArray || !Array.isArray(envArray)) { + return [] + } + + return envArray.map(env => { + if (!env || typeof env !== 'object') { + throw new Errors.ValidationError('Invalid environment variable format') + } + + if (!env.key) { + throw new Errors.ValidationError('Environment variable must have a key') + } + + const envVar = { + key: env.key.toString() + } + + // Check that exactly one of value, valueFromSecret, or valueFromConfigMap is provided + const hasValue = env.hasOwnProperty('value') + const hasValueFromSecret = env.hasOwnProperty('valueFromSecret') + const hasValueFromConfigMap = env.hasOwnProperty('valueFromConfigMap') + + const valueCount = [hasValue, hasValueFromSecret, hasValueFromConfigMap].filter(Boolean).length + + if (valueCount === 0) { + throw new Errors.ValidationError(`Environment variable '${env.key}' must have either value, valueFromSecret, or valueFromConfigMap`) + } + + if (valueCount > 1) { + throw new Errors.ValidationError(`Environment variable '${env.key}' can only have one of: value, valueFromSecret, or valueFromConfigMap`) + } + + // Handle simple value + if (hasValue) { + envVar.value = env.value.toString() + } + + // Handle valueFromSecret + if (hasValueFromSecret) { + if (typeof env.valueFromSecret !== 'string') { + throw new Errors.ValidationError(`valueFromSecret for environment variable '${env.key}' must be a string`) + } + const parts = env.valueFromSecret.split('/') + if (parts.length !== 2 || !parts[0] || !parts[1]) { + throw new Errors.ValidationError(`valueFromSecret for environment variable '${env.key}' must be in format 'secret-name/key'`) + } + envVar.valueFromSecret = env.valueFromSecret + } + + // Handle valueFromConfigMap + if (hasValueFromConfigMap) { + if (typeof env.valueFromConfigMap !== 'string') { + throw new Errors.ValidationError(`valueFromConfigMap for environment variable '${env.key}' must be a string`) + } + const parts = env.valueFromConfigMap.split('/') + if (parts.length !== 2 || !parts[0] || !parts[1]) { + throw new Errors.ValidationError(`valueFromConfigMap for environment variable '${env.key}' must be in format 'configmap-name/key'`) + } + envVar.valueFromConfigMap = env.valueFromConfigMap + } + + return envVar + }) + } + const microserviceData = { config: microservice.config != null ? JSON.stringify(microservice.config) : undefined, name: microservice.name, @@ -274,7 +342,7 @@ const parseMicroserviceYAML = async (microservice) => { ports: (lget(microservice, 'container.ports', [])), volumeMappings: lget(microservice, 'container.volumes', []), cmd: lget(microservice, 'container.commands', []), - env: (lget(microservice, 'container.env', [])).map(e => ({ key: e.key.toString(), value: e.value.toString() })), + env: parseEnvVariables(lget(microservice, 'container.env', [])), images, extraHosts: lget(microservice, 'container.extraHosts', []), ...microservice.msRoutes, From 3822caa3bf332ef86314d1e0ce3355b0f58a0c2a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emirhan=20Durmu=C5=9F?= Date: Sat, 12 Jul 2025 17:23:01 +0300 Subject: [PATCH 162/178] microservice healchecki cpuSetCpus, momoryLimit configuration and healthstatus resposnse added --- package-lock.json | 4 +- package.json | 2 +- .../microservice-healthcheck-manager.js | 37 ++++++ src/data/managers/microservice-manager.js | 19 +++ ....0.2.sql => db_migration_mysql_v1.0.3.sql} | 21 +++ ..._v1.0.2.sql => db_migration_pg_v1.0.3.sql} | 23 +++- ...0.2.sql => db_migration_sqlite_v1.0.3.sql} | 23 +++- src/data/models/microservice.js | 17 +++ src/data/models/microserviceHealthCheck.js | 52 ++++++++ src/data/models/microservicestatus.js | 5 + src/data/providers/database-provider.js | 12 +- src/schemas/agent.js | 1 + src/schemas/microservice.js | 34 ++++- src/services/agent-service.js | 38 ++++++ src/services/certificate-service.js | 2 +- src/services/microservices-service.js | 120 +++++++++++++++++- src/services/yaml-parser-service.js | 3 + 17 files changed, 397 insertions(+), 16 deletions(-) create mode 100644 src/data/managers/microservice-healthcheck-manager.js rename src/data/migrations/mysql/{db_migration_mysql_v1.0.2.sql => db_migration_mysql_v1.0.3.sql} (97%) rename src/data/migrations/postgres/{db_migration_pg_v1.0.2.sql => db_migration_pg_v1.0.3.sql} (97%) rename src/data/migrations/sqlite/{db_migration_sqlite_v1.0.2.sql => db_migration_sqlite_v1.0.3.sql} (97%) create mode 100644 src/data/models/microserviceHealthCheck.js diff --git a/package-lock.json b/package-lock.json index 19295bc09..0b67c0b4f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@datasance/iofogcontroller", - "version": "3.5.0-beta3", + "version": "3.5.0-beta4", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@datasance/iofogcontroller", - "version": "3.5.0-beta3", + "version": "3.5.0-beta4", "hasInstallScript": true, "license": "EPL-2.0", "dependencies": { diff --git a/package.json b/package.json index 38c28474e..0726c49d7 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@datasance/iofogcontroller", - "version": "3.5.0-beta3", + "version": "3.5.0-beta4", "description": "ioFog Controller project for Datasance PoT @ datasance.com \\nCopyright (c) 2023 Datasance Teknoloji A.S.", "main": "./src/main.js", "author": "Emirhan Durmus", diff --git a/src/data/managers/microservice-healthcheck-manager.js b/src/data/managers/microservice-healthcheck-manager.js new file mode 100644 index 000000000..9d905bcd3 --- /dev/null +++ b/src/data/managers/microservice-healthcheck-manager.js @@ -0,0 +1,37 @@ +/* + * ******************************************************************************* + * * Copyright (c) 2023 Datasance Teknoloji A.S. + * * + * * This program and the accompanying materials are made available under the + * * terms of the Eclipse Public License v. 2.0 which is available at + * * http://www.eclipse.org/legal/epl-2.0 + * * + * * SPDX-License-Identifier: EPL-2.0 + * ******************************************************************************* + * + */ + +const BaseManager = require('./base-manager') +const models = require('../models') +const MicroserviceHealthCheck = models.MicroserviceHealthCheck + +const microserviceHealthCheckExcludedFields = [ + 'id', + 'microservice_uuid', + 'microserviceUuid', + 'created_at', + 'updated_at' +] + +class MicroserviceHealthCheckManager extends BaseManager { + getEntity () { + return MicroserviceHealthCheck + } + + findAllExcludeFields (where, transaction) { + return this.findAllWithAttributes(where, { exclude: microserviceHealthCheckExcludedFields }, transaction) + } +} + +const instance = new MicroserviceHealthCheckManager() +module.exports = instance diff --git a/src/data/managers/microservice-manager.js b/src/data/managers/microservice-manager.js index 6d361ef68..573aa7d28 100644 --- a/src/data/managers/microservice-manager.js +++ b/src/data/managers/microservice-manager.js @@ -31,6 +31,7 @@ const Application = models.Application const Routing = models.Routing const Registry = models.Registry const MicroserviceStatus = models.MicroserviceStatus +const MicroserviceHealthCheck = models.MicroserviceHealthCheck const Op = require('sequelize').Op const microserviceExcludedFields = [ @@ -146,6 +147,12 @@ class MicroserviceManager extends BaseManager { }], attributes: { exclude: ['id', 'source_microservice_uuid', 'sourceMicroserviceUuid', 'destMicroserviceUuid'] } + }, + { + model: MicroserviceHealthCheck, + as: 'healthCheck', + required: false, + attributes: ['test', 'interval', 'timeout', 'startPeriod', 'startInterval', 'retries'] } ], where: where, @@ -252,6 +259,12 @@ class MicroserviceManager extends BaseManager { as: 'subTags', attributes: ['value'], through: { attributes: [] } + }, + { + model: MicroserviceHealthCheck, + as: 'healthCheck', + required: false, + attributes: ['test', 'interval', 'timeout', 'startPeriod', 'startInterval', 'retries'] } ], where: { @@ -367,6 +380,12 @@ class MicroserviceManager extends BaseManager { }], attributes: { exclude: ['id', 'sourceMicroserviceUuid', 'destMicroserviceUuid'] } + }, + { + model: MicroserviceHealthCheck, + as: 'healthCheck', + required: false, + attributes: ['test', 'interval', 'timeout', 'startPeriod', 'startInterval', 'retries'] } ], where: where, diff --git a/src/data/migrations/mysql/db_migration_mysql_v1.0.2.sql b/src/data/migrations/mysql/db_migration_mysql_v1.0.3.sql similarity index 97% rename from src/data/migrations/mysql/db_migration_mysql_v1.0.2.sql rename to src/data/migrations/mysql/db_migration_mysql_v1.0.3.sql index 99c2c9616..ad7b3699a 100644 --- a/src/data/migrations/mysql/db_migration_mysql_v1.0.2.sql +++ b/src/data/migrations/mysql/db_migration_mysql_v1.0.3.sql @@ -789,4 +789,25 @@ CREATE INDEX idx_microservice_exec_status_microservice_uuid ON MicroserviceExecS ALTER TABLE Fogs ADD COLUMN gps_status VARCHAR(32); +ALTER TABLE Microservices ADD COLUMN cpu_set_cpus TEXT; +ALTER TABLE Microservices ADD COLUMN memory_limit BIGINT; + +CREATE TABLE IF NOT EXISTS MicroserviceHealthChecks ( + id INT AUTO_INCREMENT PRIMARY KEY NOT NULL, + test TEXT, + interval BIGINT, + timeout BIGINT, + start_period BIGINT, + start_interval BIGINT, + retries INT, + microservice_uuid VARCHAR(36), + created_at DATETIME, + updated_at DATETIME, + FOREIGN KEY (microservice_uuid) REFERENCES Microservices (uuid) ON DELETE CASCADE +); + +CREATE INDEX idx_microservice_health_check_microservice_uuid ON MicroserviceHealthChecks (microservice_uuid); + +ALTER TABLE MicroserviceStatuses ADD COLUMN health_status TEXT; + COMMIT; \ No newline at end of file diff --git a/src/data/migrations/postgres/db_migration_pg_v1.0.2.sql b/src/data/migrations/postgres/db_migration_pg_v1.0.3.sql similarity index 97% rename from src/data/migrations/postgres/db_migration_pg_v1.0.2.sql rename to src/data/migrations/postgres/db_migration_pg_v1.0.3.sql index bec766081..660fc03fb 100644 --- a/src/data/migrations/postgres/db_migration_pg_v1.0.2.sql +++ b/src/data/migrations/postgres/db_migration_pg_v1.0.3.sql @@ -787,4 +787,25 @@ CREATE TABLE IF NOT EXISTS "MicroserviceExecStatuses" ( CREATE INDEX idx_microservice_exec_status_microservice_uuid ON "MicroserviceExecStatuses" (microservice_uuid); -ALTER TABLE "Fogs" ADD COLUMN gps_status VARCHAR(32); \ No newline at end of file +ALTER TABLE "Fogs" ADD COLUMN gps_status VARCHAR(32); + +ALTER TABLE "Microservices" ADD COLUMN cpu_set_cpus TEXT; +ALTER TABLE "Microservices" ADD COLUMN memory_limit BIGINT; + +CREATE TABLE IF NOT EXISTS "MicroserviceHealthChecks" ( + id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY NOT NULL, + test TEXT, + interval BIGINT, + timeout BIGINT, + start_period BIGINT, + start_interval BIGINT, + retries INT, + microservice_uuid VARCHAR(36), + created_at TIMESTAMP(0), + updated_at TIMESTAMP(0), + FOREIGN KEY (microservice_uuid) REFERENCES "Microservices" (uuid) ON DELETE CASCADE +); + +CREATE INDEX idx_microservice_health_check_microservice_uuid ON "MicroserviceHealthChecks" (microservice_uuid); + +ALTER TABLE "MicroserviceStatuses" ADD COLUMN health_status TEXT; \ No newline at end of file diff --git a/src/data/migrations/sqlite/db_migration_sqlite_v1.0.2.sql b/src/data/migrations/sqlite/db_migration_sqlite_v1.0.3.sql similarity index 97% rename from src/data/migrations/sqlite/db_migration_sqlite_v1.0.2.sql rename to src/data/migrations/sqlite/db_migration_sqlite_v1.0.3.sql index a8e45ccc6..0240c0eac 100644 --- a/src/data/migrations/sqlite/db_migration_sqlite_v1.0.2.sql +++ b/src/data/migrations/sqlite/db_migration_sqlite_v1.0.3.sql @@ -774,4 +774,25 @@ CREATE TABLE IF NOT EXISTS MicroserviceExecStatuses ( CREATE INDEX idx_microservice_exec_status_microservice_uuid ON MicroserviceExecStatuses (microservice_uuid); -ALTER TABLE Fogs ADD COLUMN gps_status VARCHAR(32); \ No newline at end of file +ALTER TABLE Fogs ADD COLUMN gps_status VARCHAR(32); + +ALTER TABLE Microservices ADD COLUMN cpu_set_cpus TEXT; +ALTER TABLE Microservices ADD COLUMN memory_limit BIGINT; + +CREATE TABLE IF NOT EXISTS MicroserviceHealthChecks ( + id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, + test TEXT, + interval BIGINT, + timeout BIGINT, + start_period BIGINT, + start_interval BIGINT, + retries INT, + microservice_uuid VARCHAR(36), + created_at DATETIME, + updated_at DATETIME, + FOREIGN KEY (microservice_uuid) REFERENCES Microservices (uuid) ON DELETE CASCADE +); + +CREATE INDEX idx_microservice_health_check_microservice_uuid ON MicroserviceHealthChecks (microservice_uuid); + +ALTER TABLE MicroserviceStatuses ADD COLUMN health_status TEXT; \ No newline at end of file diff --git a/src/data/models/microservice.js b/src/data/models/microservice.js index c90e98711..4f0903295 100644 --- a/src/data/models/microservice.js +++ b/src/data/models/microservice.js @@ -80,6 +80,18 @@ module.exports = (sequelize, DataTypes) => { field: 'schedule', defaultValue: 50 }, + cpuSetCpus: { + type: DataTypes.TEXT, + field: 'cpu_set_cpus', + defaultValue: '' + }, + memoryLimit: { + type: DataTypes.BIGINT, + get () { + return convertToInt(this.getDataValue('memoryLimit')) + }, + field: 'memory_limit' + }, imageSnapshot: { type: DataTypes.TEXT, field: 'image_snapshot', @@ -178,6 +190,11 @@ module.exports = (sequelize, DataTypes) => { as: 'microserviceExecStatus' }) + Microservice.hasOne(models.MicroserviceHealthCheck, { + foreignKey: 'microservice_uuid', + as: 'healthCheck' + }) + Microservice.hasMany(models.MicroserviceEnv, { foreignKey: 'microservice_uuid', as: 'env' diff --git a/src/data/models/microserviceHealthCheck.js b/src/data/models/microserviceHealthCheck.js new file mode 100644 index 000000000..6e319f51e --- /dev/null +++ b/src/data/models/microserviceHealthCheck.js @@ -0,0 +1,52 @@ +'use strict' +module.exports = (sequelize, DataTypes) => { + const MicroserviceHealthCheck = sequelize.define('MicroserviceHealthCheck', { + id: { + type: DataTypes.INTEGER, + primaryKey: true, + autoIncrement: true, + allowNull: false, + field: 'id' + }, + test: { + type: DataTypes.TEXT, + field: 'test' + }, + interval: { + type: DataTypes.BIGINT, + field: 'interval' + }, + timeout: { + type: DataTypes.BIGINT, + field: 'timeout' + }, + startPeriod: { + type: DataTypes.BIGINT, + field: 'start_period' + }, + startInterval: { + type: DataTypes.BIGINT, + field: 'start_interval' + }, + retries: { + type: DataTypes.INTEGER, + field: 'retries' + } + }, { + tableName: 'MicroserviceHealthChecks', + // add the timestamp attributes (updatedAt, createdAt) + timestamps: true, + underscored: true + }) + MicroserviceHealthCheck.associate = function (models) { + MicroserviceHealthCheck.belongsTo(models.Microservice, { + foreignKey: { + name: 'microserviceUuid', + field: 'microservice_uuid' + }, + as: 'microservice', + onDelete: 'cascade' + }) + } + return MicroserviceHealthCheck +} diff --git a/src/data/models/microservicestatus.js b/src/data/models/microservicestatus.js index 61a71b37f..b9f7a3cbe 100644 --- a/src/data/models/microservicestatus.js +++ b/src/data/models/microservicestatus.js @@ -66,6 +66,11 @@ module.exports = (sequelize, DataTypes) => { defaultValue: '', field: 'ip_address' }, + healthStatus: { + type: DataTypes.TEXT, + defaultValue: '', + field: 'health_status' + }, execSessionIds: { type: DataTypes.TEXT, defaultValue: '[]', diff --git a/src/data/providers/database-provider.js b/src/data/providers/database-provider.js index 2035eb1d3..a3206db1f 100644 --- a/src/data/providers/database-provider.js +++ b/src/data/providers/database-provider.js @@ -251,8 +251,8 @@ class DatabaseProvider { // SQLite migration async runMigrationSQLite (dbName) { - const migrationSqlPath = path.resolve(__dirname, '../migrations/sqlite/db_migration_sqlite_v1.0.2.sql') - const migrationVersion = '1.0.2' + const migrationSqlPath = path.resolve(__dirname, '../migrations/sqlite/db_migration_sqlite_v1.0.3.sql') + const migrationVersion = '1.0.3' if (!fs.existsSync(migrationSqlPath)) { logger.error(`Migration file not found: ${migrationSqlPath}`) @@ -324,8 +324,8 @@ class DatabaseProvider { // MySQL migration async runMigrationMySQL (db) { - const migrationSqlPath = path.resolve(__dirname, '../migrations/mysql/db_migration_mysql_v1.0.2.sql') - const migrationVersion = '1.0.2' + const migrationSqlPath = path.resolve(__dirname, '../migrations/mysql/db_migration_mysql_v1.0.3.sql') + const migrationVersion = '1.0.3' if (!fs.existsSync(migrationSqlPath)) { logger.error(`Migration file not found: ${migrationSqlPath}`) @@ -385,8 +385,8 @@ class DatabaseProvider { // PostgreSQL migration async runMigrationPostgres (db) { - const migrationSqlPath = path.resolve(__dirname, '../migrations/postgres/db_migration_pg_v1.0.2.sql') - const migrationVersion = '1.0.2' + const migrationSqlPath = path.resolve(__dirname, '../migrations/postgres/db_migration_pg_v1.0.3.sql') + const migrationVersion = '1.0.3' if (!fs.existsSync(migrationSqlPath)) { logger.error(`Migration file not found: ${migrationSqlPath}`) diff --git a/src/schemas/agent.js b/src/schemas/agent.js index 87c4e1235..c41bde55b 100644 --- a/src/schemas/agent.js +++ b/src/schemas/agent.js @@ -140,6 +140,7 @@ const microserviceStatus = { 'id': { 'type': 'string' }, 'containerId': { 'type': 'string' }, 'status': { 'type': 'string' }, + 'healthStatus': { 'type': 'string' }, 'startTime': { 'type': 'integer' }, 'operatingDuration': { 'type': 'integer' }, 'cpuUsage': { 'type': 'number' }, diff --git a/src/schemas/microservice.js b/src/schemas/microservice.js index 44aacc3df..4ec803525 100644 --- a/src/schemas/microservice.js +++ b/src/schemas/microservice.js @@ -68,6 +68,8 @@ const microserviceCreate = { 'runAsUser': { 'type': 'string' }, 'platform': { 'type': 'string' }, 'runtime': { 'type': 'string' }, + 'cpuSetCpus': { 'type': 'string' }, + 'memoryLimit': { 'type': 'integer' }, 'pubTags': { 'type': 'array', 'items': { 'type': 'string' } @@ -75,6 +77,10 @@ const microserviceCreate = { 'subTags': { 'type': 'array', 'items': { 'type': 'string' } + }, + 'healthCheck': { + 'type': 'object', + 'properties': { '$ref': '/microserviceHealthCheck' } } }, 'required': ['name'], @@ -135,6 +141,8 @@ const microserviceUpdate = { 'runAsUser': { 'type': 'string' }, 'platform': { 'type': 'string' }, 'runtime': { 'type': 'string' }, + 'cpuSetCpus': { 'type': 'string' }, + 'memoryLimit': { 'type': 'integer' }, 'pubTags': { 'type': 'array', 'items': { 'type': 'string' } @@ -142,6 +150,10 @@ const microserviceUpdate = { 'subTags': { 'type': 'array', 'items': { 'type': 'string' } + }, + 'healthCheck': { + 'type': 'object', + 'properties': { '$ref': '/microserviceHealthCheck' } } }, 'additionalProperties': true @@ -230,7 +242,25 @@ const volumeMappings = { 'additionalProperties': true } +const microserviceHealthCheck = { + + 'id': '/microserviceHealthCheck', + 'type': 'object', + 'properties': { + 'test': { + 'type': 'array', + 'items': { 'type': 'string' } + }, + 'interval': { 'type': 'integer' }, + 'timeout': { 'type': 'integer' }, + 'startPeriod': { 'type': 'integer' }, + 'startInterval': { 'type': 'integer' }, + 'retries': { 'type': 'integer' } + }, + 'required': ['test'] +} + module.exports = { - mainSchemas: [microserviceCreate, microserviceUpdate, env, ports, extraHosts, portsCreate, microserviceDelete, volumeMappings], - innerSchemas: [volumeMappings, ports, env, extraHosts, microserviceCreate] + mainSchemas: [microserviceCreate, microserviceUpdate, env, ports, extraHosts, portsCreate, microserviceDelete, volumeMappings, microserviceHealthCheck], + innerSchemas: [volumeMappings, ports, env, extraHosts, microserviceCreate, microserviceHealthCheck] } diff --git a/src/services/agent-service.js b/src/services/agent-service.js index a1217b79b..3c2e29274 100644 --- a/src/services/agent-service.js +++ b/src/services/agent-service.js @@ -292,6 +292,7 @@ const _updateMicroserviceStatuses = async function (microserviceStatus, fog, tra let microserviceStatus = { containerId: status.containerId, status: status.status, + healthStatus: status.healthStatus, startTime: status.startTime, operatingDuration: status.operatingDuration, cpuUsage: status.cpuUsage, @@ -349,6 +350,40 @@ const getAgentMicroservices = async function (fog, transaction) { const extraHosts = microservice.extraHosts ? microservice.extraHosts.map(_mapExtraHost) : [] + // Process health check data - handle both old and new formats + let healthCheck = null + + if (microservice.healthCheck) { + // Handle the test field - it could be already an array or a JSON string + let testData = microservice.healthCheck.test + if (testData && testData !== null && testData !== undefined && testData.length > 0) { + if (typeof testData === 'string') { + // It's a JSON string, try to parse it + try { + testData = JSON.parse(testData) + } catch (e) { + // If not valid JSON, treat as a single string command + testData = [testData] + } + } else if (!Array.isArray(testData)) { + // If it's not an array, convert to array + testData = [testData] + } + // If it's already an array, leave as is + } + + healthCheck = { + test: testData, + interval: microservice.healthCheck.interval, + timeout: microservice.healthCheck.timeout, + startPeriod: microservice.healthCheck.startPeriod, + startInterval: microservice.healthCheck.startInterval, + retries: microservice.healthCheck.retries + } + } else { + healthCheck = {} + } + const responseMicroservice = { uuid: microservice.uuid, imageId: imageId, @@ -356,6 +391,9 @@ const getAgentMicroservices = async function (fog, transaction) { annotations: microservice.annotations, rebuild: microservice.rebuild, rootHostAccess: microservice.rootHostAccess, + cpuSetCpus: microservice.cpuSetCpus, + memoryLimit: microservice.memoryLimit, + healthCheck: healthCheck, pidMode: microservice.pidMode, ipcMode: microservice.ipcMode, runAsUser: microservice.runAsUser, diff --git a/src/services/certificate-service.js b/src/services/certificate-service.js index 97bdc5782..316062bc1 100644 --- a/src/services/certificate-service.js +++ b/src/services/certificate-service.js @@ -446,7 +446,7 @@ async function renewCertificateEndpoint (name, transaction) { const secret = await SecretManager.findOne({ name, type: 'tls' }, transaction) if (secret) { isNewRecord = true - console.log(`Certificate record not found for ${name}, but secret exists. Will create new record.`) + // console.log(`Certificate record not found for ${name}, but secret exists. Will create new record.`) } else { throw new Errors.NotFoundError(`Certificate with name ${name} not found`) } diff --git a/src/services/microservices-service.js b/src/services/microservices-service.js index d7e9f1d84..173d7bb21 100644 --- a/src/services/microservices-service.js +++ b/src/services/microservices-service.js @@ -21,6 +21,7 @@ const MicroserviceCapAddManager = require('../data/managers/microservice-cap-add const MicroserviceCapDropManager = require('../data/managers/microservice-cap-drop-manager') const MicroserviceEnvManager = require('../data/managers/microservice-env-manager') const MicroservicePortService = require('../services/microservice-ports/microservice-port') +const MicroserviceHealthCheckManager = require('../data/managers/microservice-healthcheck-manager') const CatalogItemImageManager = require('../data/managers/catalog-item-image-manager') const RegistryManager = require('../data/managers/registry-manager') // const RouterManager = require('../data/managers/router-manager') @@ -377,6 +378,13 @@ async function createMicroserviceEndPoint (microserviceData, isCLI, transaction) await _createCdiDevices(microservice, cdiDevices, transaction) } } + if (microserviceData.healthCheck) { + const healthCheckData = { + microserviceUuid: microservice.uuid, + ..._processHealthCheckForDB(microserviceData.healthCheck) + } + await MicroserviceHealthCheckManager.create(healthCheckData, transaction) + } if (microserviceData.capAdd) { for (const capAdd of microserviceData.capAdd) { await _createCapAdd(microservice, capAdd, transaction) @@ -512,6 +520,8 @@ async function updateSystemMicroserviceEndPoint (microserviceUuid, microserviceD rebuild: microserviceData.rebuild, iofogUuid: newFog.uuid, rootHostAccess: microserviceData.rootHostAccess, + cpuSetCpus: microserviceData.cpuSetCpus, + memoryLimit: microserviceData.memoryLimit, schedule: microserviceData.schedule, pidMode: microserviceData.pidMode, ipcMode: microserviceData.ipcMode, @@ -526,7 +536,8 @@ async function updateSystemMicroserviceEndPoint (microserviceUuid, microserviceD volumeMappings: microserviceData.volumeMappings, env: microserviceData.env, cmd: microserviceData.cmd, - ports: microserviceData.ports + ports: microserviceData.ports, + healthCheck: microserviceData.healthCheck } const microserviceDataUpdate = AppHelper.deleteUndefinedFields(microserviceToUpdate) @@ -632,6 +643,8 @@ async function updateSystemMicroserviceEndPoint (microserviceUuid, microserviceD (microserviceDataUpdate.rootHostAccess !== undefined && microservice.rootHostAccess !== microserviceDataUpdate.rootHostAccess) || microserviceDataUpdate.pidMode || microserviceDataUpdate.ipcMode || + microserviceDataUpdate.cpuSetCpus || + microserviceDataUpdate.memoryLimit || microserviceDataUpdate.env || microserviceDataUpdate.cmd || microserviceDataUpdate.cdiDevices || @@ -675,6 +688,19 @@ async function updateSystemMicroserviceEndPoint (microserviceUuid, microserviceD await _updateCapAdd(microserviceDataUpdate.capAdd, microserviceUuid, transaction) } + if (microserviceDataUpdate.healthCheck) { + await MicroserviceHealthCheckManager.delete({ + microserviceUuid: microservice.uuid + }, transaction) + const healthCheckData = { + microserviceUuid: microservice.uuid, + ..._processHealthCheckForDB(microserviceDataUpdate.healthCheck) + } + if (healthCheckData.test && healthCheckData.test.length > 0) { + await MicroserviceHealthCheckManager.create(healthCheckData, transaction) + } + } + if (microserviceDataUpdate.capDrop) { await _updateCapDrop(microserviceDataUpdate.capDrop, microserviceUuid, transaction) } @@ -737,6 +763,8 @@ async function updateMicroserviceEndPoint (microserviceUuid, microserviceData, i rebuild: microserviceData.rebuild, iofogUuid: newFog.uuid, rootHostAccess: microserviceData.rootHostAccess, + cpuSetCpus: microserviceData.cpuSetCpus, + memoryLimit: microserviceData.memoryLimit, schedule: microserviceData.schedule, pidMode: microserviceData.pidMode, ipcMode: microserviceData.ipcMode, @@ -751,7 +779,8 @@ async function updateMicroserviceEndPoint (microserviceUuid, microserviceData, i volumeMappings: microserviceData.volumeMappings, env: microserviceData.env, cmd: microserviceData.cmd, - ports: microserviceData.ports + ports: microserviceData.ports, + healthCheck: microserviceData.healthCheck } const microserviceDataUpdate = AppHelper.deleteUndefinedFields(microserviceToUpdate) @@ -861,6 +890,8 @@ async function updateMicroserviceEndPoint (microserviceUuid, microserviceData, i (microserviceDataUpdate.rootHostAccess !== undefined && microservice.rootHostAccess !== microserviceDataUpdate.rootHostAccess) || microserviceDataUpdate.pidMode || microserviceDataUpdate.ipcMode || + microserviceDataUpdate.cpuSetCpus || + microserviceDataUpdate.memoryLimit || microserviceDataUpdate.env || microserviceDataUpdate.cmd || microserviceDataUpdate.cdiDevices || @@ -904,6 +935,19 @@ async function updateMicroserviceEndPoint (microserviceUuid, microserviceData, i await _updateCapAdd(microserviceDataUpdate.capAdd, microserviceUuid, transaction) } + if (microserviceDataUpdate.healthCheck) { + await MicroserviceHealthCheckManager.delete({ + microserviceUuid: microservice.uuid + }, transaction) + const healthCheckData = { + microserviceUuid: microservice.uuid, + ..._processHealthCheckForDB(microserviceDataUpdate.healthCheck) + } + if (healthCheckData.test && healthCheckData.test.length > 0) { + await MicroserviceHealthCheckManager.create(healthCheckData, transaction) + } + } + if (microserviceDataUpdate.capDrop) { await _updateCapDrop(microserviceDataUpdate.capDrop, microserviceUuid, transaction) } @@ -1510,6 +1554,28 @@ function _validateMicroserviceAnnotations (annotations) { return result } +function _validateMicroserviceHealthCheck (healthCheck) { + let result + if (healthCheck) { + // Convert the health check object to a JSON string for database storage + result = JSON.stringify(healthCheck) + } + return result +} + +function _processHealthCheckForDB (healthCheckData) { + if (!healthCheckData) return null + + return { + test: _validateMicroserviceHealthCheck(healthCheckData.test), + interval: healthCheckData.interval, + timeout: healthCheckData.timeout, + startPeriod: healthCheckData.startPeriod, + startInterval: healthCheckData.startInterval, + retries: healthCheckData.retries + } +} + async function _createMicroservice (microserviceData, isCLI, transaction) { const config = _validateMicroserviceConfig(microserviceData.config) const annotations = _validateMicroserviceAnnotations(microserviceData.annotations) @@ -1522,6 +1588,8 @@ async function _createMicroservice (microserviceData, isCLI, transaction) { catalogItemId: microserviceData.catalogItemId, iofogUuid: microserviceData.iofogUuid, rootHostAccess: microserviceData.rootHostAccess, + cpuSetCpus: microserviceData.cpuSetCpus, + memoryLimit: microserviceData.memoryLimit, pidMode: microserviceData.pidMode, ipcMode: microserviceData.ipcMode, cdiDevices: microserviceData.cdiDevices, @@ -1935,6 +2003,7 @@ async function _buildGetMicroserviceResponse (microservice, transaction) { const subTags = microservice.subTags ? microservice.subTags.map(t => t.value) : [] const status = await MicroserviceStatusManager.findAllExcludeFields({ microserviceUuid: microserviceUuid }, transaction) const execStatus = await MicroserviceExecStatusManager.findAllExcludeFields({ microserviceUuid: microserviceUuid }, transaction) + const healthCheck = await MicroserviceHealthCheckManager.findAllExcludeFields({ microserviceUuid: microserviceUuid }, transaction) // build microservice response const res = Object.assign({}, microservice) res.ports = [] @@ -1958,6 +2027,53 @@ async function _buildGetMicroserviceResponse (microservice, transaction) { if (execStatus && execStatus.length) { res.execStatus = execStatus[0] } + if (healthCheck && healthCheck.length) { + const healthCheckData = healthCheck[0] + // Create a copy of the health check data to avoid modifying the Sequelize object + const healthCheckResponse = { + test: healthCheckData.test + } + + // Only add fields if they are not null + if (healthCheckData.interval !== null) { + healthCheckResponse.interval = healthCheckData.interval + } + if (healthCheckData.timeout !== null) { + healthCheckResponse.timeout = healthCheckData.timeout + } + if (healthCheckData.startPeriod !== null) { + healthCheckResponse.startPeriod = healthCheckData.startPeriod + } + if (healthCheckData.startInterval !== null) { + healthCheckResponse.startInterval = healthCheckData.startInterval + } + if (healthCheckData.retries !== null) { + healthCheckResponse.retries = healthCheckData.retries + } + + // Handle the test field - ensure it's always an array + if (healthCheckResponse.test) { + if (typeof healthCheckResponse.test === 'string') { + // It's a JSON string, try to parse it + try { + healthCheckResponse.test = JSON.parse(healthCheckResponse.test) + } catch (e) { + // If not valid JSON, treat as a single string command + healthCheckResponse.test = [healthCheckResponse.test] + } + } else if (!Array.isArray(healthCheckResponse.test)) { + // If it's not an array, convert to array + healthCheckResponse.test = [healthCheckResponse.test] + } + // If it's already an array, leave as is + } + + if (healthCheckResponse.test && healthCheckResponse.test.length > 0) { + res.healthCheck = healthCheckResponse + } else { + res.healthCheck = {} + } + } res.pubTags = pubTags res.subTags = subTags diff --git a/src/services/yaml-parser-service.js b/src/services/yaml-parser-service.js index de3b205c5..68efeeb73 100644 --- a/src/services/yaml-parser-service.js +++ b/src/services/yaml-parser-service.js @@ -336,6 +336,9 @@ const parseMicroserviceYAML = async (microservice) => { rootHostAccess: lget(microservice, 'container.rootHostAccess', false), pidMode: lget(microservice, 'container.pidMode', ''), ipcMode: lget(microservice, 'container.ipcMode', ''), + cpuSetCpus: lget(microservice, 'container.cpuSetCpus', ''), + memoryLimit: lget(microservice, 'container.memoryLimit', null), + healthCheck: lget(microservice, 'container.healthCheck', null), annotations: container.annotations != null ? JSON.stringify(container.annotations) : undefined, capAdd: lget(microservice, 'container.capAdd', []), capDrop: lget(microservice, 'container.capDrop', []), From e0b320717e5626c73ad42202c6fe34a6480138d5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emirhan=20Durmu=C5=9F?= Date: Sat, 12 Jul 2025 19:13:54 +0300 Subject: [PATCH 163/178] viewer version updated --- package-lock.json | 8 ++++---- package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index 0b67c0b4f..b9dfda37a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,7 +10,7 @@ "hasInstallScript": true, "license": "EPL-2.0", "dependencies": { - "@datasance/ecn-viewer": "1.0.0-beta3", + "@datasance/ecn-viewer": "1.0.0-beta4", "@kubernetes/client-node": "^0.22.3", "@msgpack/msgpack": "^3.1.2", "@opentelemetry/api": "^1.9.0", @@ -427,9 +427,9 @@ } }, "node_modules/@datasance/ecn-viewer": { - "version": "1.0.0-beta3", - "resolved": "https://registry.npmjs.org/@datasance/ecn-viewer/-/ecn-viewer-1.0.0-beta3.tgz", - "integrity": "sha512-adYlBAgICw2MluooMhnv669vYXGX9nuliT00RkG45XJZ5TuC3Z+/ZrGUwAGz9Z4m74YS9xNB/qkw/1FSdf1B3w==" + "version": "1.0.0-beta4", + "resolved": "https://registry.npmjs.org/@datasance/ecn-viewer/-/ecn-viewer-1.0.0-beta4.tgz", + "integrity": "sha512-9qb8caxwZJkZhCSYnOjLLgA8KZnbEXW37dQtLGzaEBCIzEzc3G2GiZTNuoW17pEkaOw8bxaMaEVAKDQdFQMBWA==" }, "node_modules/@eslint-community/eslint-utils": { "version": "4.7.0", diff --git a/package.json b/package.json index 0726c49d7..c1d035010 100644 --- a/package.json +++ b/package.json @@ -55,7 +55,7 @@ "iofog-controller": "src/main.js" }, "dependencies": { - "@datasance/ecn-viewer": "1.0.0-beta3", + "@datasance/ecn-viewer": "1.0.0-beta4", "@kubernetes/client-node": "^0.22.3", "@msgpack/msgpack": "^3.1.2", "@opentelemetry/api": "^1.9.0", From 0a8b86689204e9a303a2f500a601a84768a16069 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emirhan=20Durmu=C5=9F?= Date: Sun, 13 Jul 2025 21:07:13 +0300 Subject: [PATCH 164/178] healthcheck datatypes fixed --- package-lock.json | 12 ++++++------ package.json | 4 ++-- .../migrations/mysql/db_migration_mysql_v1.0.3.sql | 2 +- .../migrations/postgres/db_migration_pg_v1.0.3.sql | 10 +++++----- .../migrations/sqlite/db_migration_sqlite_v1.0.3.sql | 10 +++++----- src/data/models/microservice.js | 5 +---- src/data/models/microserviceHealthCheck.js | 8 ++++---- src/services/yaml-parser-service.js | 4 ++-- 8 files changed, 26 insertions(+), 29 deletions(-) diff --git a/package-lock.json b/package-lock.json index b9dfda37a..ff6538621 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,16 +1,16 @@ { "name": "@datasance/iofogcontroller", - "version": "3.5.0-beta4", + "version": "3.5.0-beta5", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@datasance/iofogcontroller", - "version": "3.5.0-beta4", + "version": "3.5.0-beta5", "hasInstallScript": true, "license": "EPL-2.0", "dependencies": { - "@datasance/ecn-viewer": "1.0.0-beta4", + "@datasance/ecn-viewer": "1.0.0-beta5", "@kubernetes/client-node": "^0.22.3", "@msgpack/msgpack": "^3.1.2", "@opentelemetry/api": "^1.9.0", @@ -427,9 +427,9 @@ } }, "node_modules/@datasance/ecn-viewer": { - "version": "1.0.0-beta4", - "resolved": "https://registry.npmjs.org/@datasance/ecn-viewer/-/ecn-viewer-1.0.0-beta4.tgz", - "integrity": "sha512-9qb8caxwZJkZhCSYnOjLLgA8KZnbEXW37dQtLGzaEBCIzEzc3G2GiZTNuoW17pEkaOw8bxaMaEVAKDQdFQMBWA==" + "version": "1.0.0-beta5", + "resolved": "https://registry.npmjs.org/@datasance/ecn-viewer/-/ecn-viewer-1.0.0-beta5.tgz", + "integrity": "sha512-sffoQbT0mOh2qsmLrq7MudftEA0VoWTtOLY5ETLMIqL0StNpgCnJ3bwilXj1UrLU0tFTeD6i3Fa5mCVYWvTQ/g==" }, "node_modules/@eslint-community/eslint-utils": { "version": "4.7.0", diff --git a/package.json b/package.json index c1d035010..6cbf1a231 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@datasance/iofogcontroller", - "version": "3.5.0-beta4", + "version": "3.5.0-beta5", "description": "ioFog Controller project for Datasance PoT @ datasance.com \\nCopyright (c) 2023 Datasance Teknoloji A.S.", "main": "./src/main.js", "author": "Emirhan Durmus", @@ -55,7 +55,7 @@ "iofog-controller": "src/main.js" }, "dependencies": { - "@datasance/ecn-viewer": "1.0.0-beta4", + "@datasance/ecn-viewer": "1.0.0-beta5", "@kubernetes/client-node": "^0.22.3", "@msgpack/msgpack": "^3.1.2", "@opentelemetry/api": "^1.9.0", diff --git a/src/data/migrations/mysql/db_migration_mysql_v1.0.3.sql b/src/data/migrations/mysql/db_migration_mysql_v1.0.3.sql index ad7b3699a..60fd7a29d 100644 --- a/src/data/migrations/mysql/db_migration_mysql_v1.0.3.sql +++ b/src/data/migrations/mysql/db_migration_mysql_v1.0.3.sql @@ -790,7 +790,7 @@ CREATE INDEX idx_microservice_exec_status_microservice_uuid ON MicroserviceExecS ALTER TABLE Fogs ADD COLUMN gps_status VARCHAR(32); ALTER TABLE Microservices ADD COLUMN cpu_set_cpus TEXT; -ALTER TABLE Microservices ADD COLUMN memory_limit BIGINT; +ALTER TABLE Microservices ADD COLUMN memory_limit FLOAT; CREATE TABLE IF NOT EXISTS MicroserviceHealthChecks ( id INT AUTO_INCREMENT PRIMARY KEY NOT NULL, diff --git a/src/data/migrations/postgres/db_migration_pg_v1.0.3.sql b/src/data/migrations/postgres/db_migration_pg_v1.0.3.sql index 660fc03fb..5303bda58 100644 --- a/src/data/migrations/postgres/db_migration_pg_v1.0.3.sql +++ b/src/data/migrations/postgres/db_migration_pg_v1.0.3.sql @@ -790,15 +790,15 @@ CREATE INDEX idx_microservice_exec_status_microservice_uuid ON "MicroserviceExec ALTER TABLE "Fogs" ADD COLUMN gps_status VARCHAR(32); ALTER TABLE "Microservices" ADD COLUMN cpu_set_cpus TEXT; -ALTER TABLE "Microservices" ADD COLUMN memory_limit BIGINT; +ALTER TABLE "Microservices" ADD COLUMN memory_limit DOUBLE PRECISION; CREATE TABLE IF NOT EXISTS "MicroserviceHealthChecks" ( id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY NOT NULL, test TEXT, - interval BIGINT, - timeout BIGINT, - start_period BIGINT, - start_interval BIGINT, + interval DOUBLE PRECISION, + timeout DOUBLE PRECISION, + start_period DOUBLE PRECISION, + start_interval DOUBLE PRECISION, retries INT, microservice_uuid VARCHAR(36), created_at TIMESTAMP(0), diff --git a/src/data/migrations/sqlite/db_migration_sqlite_v1.0.3.sql b/src/data/migrations/sqlite/db_migration_sqlite_v1.0.3.sql index 0240c0eac..d8715585e 100644 --- a/src/data/migrations/sqlite/db_migration_sqlite_v1.0.3.sql +++ b/src/data/migrations/sqlite/db_migration_sqlite_v1.0.3.sql @@ -777,15 +777,15 @@ CREATE INDEX idx_microservice_exec_status_microservice_uuid ON MicroserviceExecS ALTER TABLE Fogs ADD COLUMN gps_status VARCHAR(32); ALTER TABLE Microservices ADD COLUMN cpu_set_cpus TEXT; -ALTER TABLE Microservices ADD COLUMN memory_limit BIGINT; +ALTER TABLE Microservices ADD COLUMN memory_limit FLOAT; CREATE TABLE IF NOT EXISTS MicroserviceHealthChecks ( id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, test TEXT, - interval BIGINT, - timeout BIGINT, - start_period BIGINT, - start_interval BIGINT, + interval FLOAT, + timeout FLOAT, + start_period FLOAT, + start_interval FLOAT, retries INT, microservice_uuid VARCHAR(36), created_at DATETIME, diff --git a/src/data/models/microservice.js b/src/data/models/microservice.js index 4f0903295..261ffdab6 100644 --- a/src/data/models/microservice.js +++ b/src/data/models/microservice.js @@ -86,10 +86,7 @@ module.exports = (sequelize, DataTypes) => { defaultValue: '' }, memoryLimit: { - type: DataTypes.BIGINT, - get () { - return convertToInt(this.getDataValue('memoryLimit')) - }, + type: DataTypes.FLOAT, field: 'memory_limit' }, imageSnapshot: { diff --git a/src/data/models/microserviceHealthCheck.js b/src/data/models/microserviceHealthCheck.js index 6e319f51e..d6f32e698 100644 --- a/src/data/models/microserviceHealthCheck.js +++ b/src/data/models/microserviceHealthCheck.js @@ -13,19 +13,19 @@ module.exports = (sequelize, DataTypes) => { field: 'test' }, interval: { - type: DataTypes.BIGINT, + type: DataTypes.FLOAT, field: 'interval' }, timeout: { - type: DataTypes.BIGINT, + type: DataTypes.FLOAT, field: 'timeout' }, startPeriod: { - type: DataTypes.BIGINT, + type: DataTypes.FLOAT, field: 'start_period' }, startInterval: { - type: DataTypes.BIGINT, + type: DataTypes.FLOAT, field: 'start_interval' }, retries: { diff --git a/src/services/yaml-parser-service.js b/src/services/yaml-parser-service.js index 68efeeb73..adc8d94cc 100644 --- a/src/services/yaml-parser-service.js +++ b/src/services/yaml-parser-service.js @@ -337,8 +337,8 @@ const parseMicroserviceYAML = async (microservice) => { pidMode: lget(microservice, 'container.pidMode', ''), ipcMode: lget(microservice, 'container.ipcMode', ''), cpuSetCpus: lget(microservice, 'container.cpuSetCpus', ''), - memoryLimit: lget(microservice, 'container.memoryLimit', null), - healthCheck: lget(microservice, 'container.healthCheck', null), + memoryLimit: lget(microservice, 'container.memoryLimit', undefined), + healthCheck: lget(microservice, 'container.healthCheck', {}), annotations: container.annotations != null ? JSON.stringify(container.annotations) : undefined, capAdd: lget(microservice, 'container.capAdd', []), capDrop: lget(microservice, 'container.capDrop', []), From f258223c4c7b345f8b777d351809e30b0f2f1bec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emirhan=20Durmu=C5=9F?= Date: Wed, 16 Jul 2025 16:27:36 +0300 Subject: [PATCH 165/178] k8s create/update/delete servis logic updated, ecn-veiwer version upgraded --- package-lock.json | 12 ++--- package.json | 4 +- src/services/services-service.js | 91 +++++++++++++++++++------------- src/utils/k8s-client.js | 14 +++++ 4 files changed, 77 insertions(+), 44 deletions(-) diff --git a/package-lock.json b/package-lock.json index ff6538621..2e753a95e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,16 +1,16 @@ { "name": "@datasance/iofogcontroller", - "version": "3.5.0-beta5", + "version": "3.5.0-beta6", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@datasance/iofogcontroller", - "version": "3.5.0-beta5", + "version": "3.5.0-beta6", "hasInstallScript": true, "license": "EPL-2.0", "dependencies": { - "@datasance/ecn-viewer": "1.0.0-beta5", + "@datasance/ecn-viewer": "1.0.0-beta7", "@kubernetes/client-node": "^0.22.3", "@msgpack/msgpack": "^3.1.2", "@opentelemetry/api": "^1.9.0", @@ -427,9 +427,9 @@ } }, "node_modules/@datasance/ecn-viewer": { - "version": "1.0.0-beta5", - "resolved": "https://registry.npmjs.org/@datasance/ecn-viewer/-/ecn-viewer-1.0.0-beta5.tgz", - "integrity": "sha512-sffoQbT0mOh2qsmLrq7MudftEA0VoWTtOLY5ETLMIqL0StNpgCnJ3bwilXj1UrLU0tFTeD6i3Fa5mCVYWvTQ/g==" + "version": "1.0.0-beta7", + "resolved": "https://registry.npmjs.org/@datasance/ecn-viewer/-/ecn-viewer-1.0.0-beta7.tgz", + "integrity": "sha512-XGihsQHigPv/s+0NhQZMicXkRzQiEWEmcWD2/K4l4zG5RrX2o2bMBPGJr5eB6KRmr1QGemx9/B/jrUQEM75Tmw==" }, "node_modules/@eslint-community/eslint-utils": { "version": "4.7.0", diff --git a/package.json b/package.json index 6cbf1a231..89ddb2b9e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@datasance/iofogcontroller", - "version": "3.5.0-beta5", + "version": "3.5.0-beta6", "description": "ioFog Controller project for Datasance PoT @ datasance.com \\nCopyright (c) 2023 Datasance Teknoloji A.S.", "main": "./src/main.js", "author": "Emirhan Durmus", @@ -55,7 +55,7 @@ "iofog-controller": "src/main.js" }, "dependencies": { - "@datasance/ecn-viewer": "1.0.0-beta5", + "@datasance/ecn-viewer": "1.0.0-beta7", "@kubernetes/client-node": "^0.22.3", "@msgpack/msgpack": "^3.1.2", "@opentelemetry/api": "^1.9.0", diff --git a/src/services/services-service.js b/src/services/services-service.js index 8503fe4d8..24b34d5a3 100644 --- a/src/services/services-service.js +++ b/src/services/services-service.js @@ -819,6 +819,7 @@ async function _createK8sService (serviceConfig, transaction) { 'datasance.com/component': 'router' }, ports: [{ + name: 'pot-service', targetPort: parseInt(serviceConfig.bridgePort), port: parseInt(serviceConfig.servicePort), protocol: 'TCP' @@ -845,51 +846,69 @@ async function _createK8sService (serviceConfig, transaction) { // Helper function to update Kubernetes service async function _updateK8sService (serviceConfig, transaction) { - const normalizedTags = serviceConfig.tags.map(tag => tag.includes(':') ? tag : `${tag}:`) - const patchData = { - metadata: { - annotations: normalizedTags.reduce((acc, tag) => { - const [key, value] = tag.split(':') - acc[key] = (value || '').trim() - return acc - }, {}) - }, - spec: { - type: serviceConfig.k8sType, - selector: { - application: 'interior-router', - name: 'router', - 'skupper.io/component': 'router' + const existingService = await K8sClient.getService(serviceConfig.name) + if (!existingService) { + logger.debug(`Service not found: ${serviceConfig.name}, creating new service`) + const service = await _createK8sService(serviceConfig, transaction) + return service + } else { + const normalizedTags = serviceConfig.tags.map(tag => tag.includes(':') ? tag : `${tag}:`) + const patchData = { + metadata: { + annotations: normalizedTags.reduce((acc, tag) => { + const [key, value] = tag.split(':') + acc[key] = (value || '').trim() + return acc + }, {}) }, - ports: [{ - port: parseInt(serviceConfig.bridgePort), - targetPort: parseInt(serviceConfig.servicePort), - protocol: 'TCP' - }] + spec: { + type: serviceConfig.k8sType, + selector: { + application: 'interior-router', + name: 'router', + 'skupper.io/component': 'router' + }, + ports: [{ + name: 'pot-service', + port: parseInt(serviceConfig.bridgePort), + targetPort: parseInt(serviceConfig.servicePort), + protocol: 'TCP' + }] + } } - } - logger.debug(`Updating service: ${serviceConfig.name}`) - const service = await K8sClient.updateService(serviceConfig.name, patchData) - - // If LoadBalancer type, wait for and set the external IP - if (serviceConfig.k8sType === 'LoadBalancer') { - const loadBalancerIP = await K8sClient.watchLoadBalancerIP(serviceConfig.name) - if (loadBalancerIP) { - await ServiceManager.update( - { name: serviceConfig.name }, - { serviceEndpoint: loadBalancerIP }, - transaction - ) + logger.debug(`Updating service: ${serviceConfig.name}`) + const updatedService = await K8sClient.updateService(serviceConfig.name, patchData) + + // If LoadBalancer type, wait for and set the external IP + if (serviceConfig.k8sType === 'LoadBalancer') { + const loadBalancerIP = await K8sClient.watchLoadBalancerIP(serviceConfig.name) + if (loadBalancerIP) { + await ServiceManager.update( + { name: serviceConfig.name }, + { serviceEndpoint: loadBalancerIP }, + transaction + ) + } } + return updatedService } - - return service } // Helper function to delete Kubernetes service async function _deleteK8sService (serviceName) { - await K8sClient.deleteService(serviceName) + try { + await K8sClient.deleteService(serviceName) + } catch (error) { + // If it's a 404 (Not Found), log a warning and continue + if (error.response && error.response.status === 404) { + logger.warn(`K8s service ${serviceName} not found during delete. It may have already been deleted.`) + } else { + // For other errors, you may want to log and rethrow, or just log as warning + logger.warn(`Failed to delete K8s service ${serviceName}: ${error.message}`) + } + // Do not throw, so the flow continues + } } // Create service endpoint diff --git a/src/utils/k8s-client.js b/src/utils/k8s-client.js index 0aa8c9ae4..ad6bbc5af 100644 --- a/src/utils/k8s-client.js +++ b/src/utils/k8s-client.js @@ -49,6 +49,19 @@ async function getSecret (secretName) { } } +async function getService (serviceName) { + logger.debug(`Getting service: ${serviceName} in namespace: ${CONTROLLER_NAMESPACE}`) + try { + const api = await initializeK8sClient() + const response = await api.readNamespacedService(serviceName, CONTROLLER_NAMESPACE) + logger.info(`Successfully retrieved service: ${serviceName}`) + return response.body + } catch (error) { + logger.error(`Failed to get service ${serviceName}: ${error.message}`) + throw error + } +} + // ConfigMap methods async function getConfigMap (configMapName) { logger.debug(`Getting ConfigMap: ${configMapName} in namespace: ${CONTROLLER_NAMESPACE}`) @@ -240,6 +253,7 @@ async function watchLoadBalancerIP (serviceName, maxRetries = 10, retryInterval module.exports = { getSecret, + getService, getConfigMap, patchConfigMap, getNamespacedServices, From d256540834f83365377b345977b8ed916e9e9157 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emirhan=20Durmu=C5=9F?= Date: Wed, 16 Jul 2025 18:01:44 +0300 Subject: [PATCH 166/178] viewer version upgraded --- package-lock.json | 12 ++++++------ package.json | 4 ++-- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index 2e753a95e..5481e6198 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,16 +1,16 @@ { "name": "@datasance/iofogcontroller", - "version": "3.5.0-beta6", + "version": "3.5.0-beta7", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@datasance/iofogcontroller", - "version": "3.5.0-beta6", + "version": "3.5.0-beta7", "hasInstallScript": true, "license": "EPL-2.0", "dependencies": { - "@datasance/ecn-viewer": "1.0.0-beta7", + "@datasance/ecn-viewer": "1.0.0-beta8", "@kubernetes/client-node": "^0.22.3", "@msgpack/msgpack": "^3.1.2", "@opentelemetry/api": "^1.9.0", @@ -427,9 +427,9 @@ } }, "node_modules/@datasance/ecn-viewer": { - "version": "1.0.0-beta7", - "resolved": "https://registry.npmjs.org/@datasance/ecn-viewer/-/ecn-viewer-1.0.0-beta7.tgz", - "integrity": "sha512-XGihsQHigPv/s+0NhQZMicXkRzQiEWEmcWD2/K4l4zG5RrX2o2bMBPGJr5eB6KRmr1QGemx9/B/jrUQEM75Tmw==" + "version": "1.0.0-beta8", + "resolved": "https://registry.npmjs.org/@datasance/ecn-viewer/-/ecn-viewer-1.0.0-beta8.tgz", + "integrity": "sha512-1zxIzsd5WxjhQbH2Hc7tvtkDQm/VgVJO6Whhccf308u6nhgwF1jZyx/iGigSw9hl7sI6nbgdQZtUyIeIyc+UCw==" }, "node_modules/@eslint-community/eslint-utils": { "version": "4.7.0", diff --git a/package.json b/package.json index 89ddb2b9e..b8de3d196 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@datasance/iofogcontroller", - "version": "3.5.0-beta6", + "version": "3.5.0-beta7", "description": "ioFog Controller project for Datasance PoT @ datasance.com \\nCopyright (c) 2023 Datasance Teknoloji A.S.", "main": "./src/main.js", "author": "Emirhan Durmus", @@ -55,7 +55,7 @@ "iofog-controller": "src/main.js" }, "dependencies": { - "@datasance/ecn-viewer": "1.0.0-beta7", + "@datasance/ecn-viewer": "1.0.0-beta8", "@kubernetes/client-node": "^0.22.3", "@msgpack/msgpack": "^3.1.2", "@opentelemetry/api": "^1.9.0", From 19e969a645bfd1ad1cb9848f92a813006578ceb3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emirhan=20Durmu=C5=9F?= Date: Wed, 16 Jul 2025 19:00:45 +0300 Subject: [PATCH 167/178] k8s update service logic fixed --- package-lock.json | 4 ++-- package.json | 2 +- src/services/services-service.js | 8 +++----- src/utils/k8s-client.js | 2 +- 4 files changed, 7 insertions(+), 9 deletions(-) diff --git a/package-lock.json b/package-lock.json index 5481e6198..ccadc8004 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@datasance/iofogcontroller", - "version": "3.5.0-beta7", + "version": "3.5.0-beta8", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@datasance/iofogcontroller", - "version": "3.5.0-beta7", + "version": "3.5.0-beta8", "hasInstallScript": true, "license": "EPL-2.0", "dependencies": { diff --git a/package.json b/package.json index b8de3d196..eba0196cd 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@datasance/iofogcontroller", - "version": "3.5.0-beta7", + "version": "3.5.0-beta8", "description": "ioFog Controller project for Datasance PoT @ datasance.com \\nCopyright (c) 2023 Datasance Teknoloji A.S.", "main": "./src/main.js", "author": "Emirhan Durmus", diff --git a/src/services/services-service.js b/src/services/services-service.js index 24b34d5a3..be2982abe 100644 --- a/src/services/services-service.js +++ b/src/services/services-service.js @@ -864,14 +864,12 @@ async function _updateK8sService (serviceConfig, transaction) { spec: { type: serviceConfig.k8sType, selector: { - application: 'interior-router', - name: 'router', - 'skupper.io/component': 'router' + 'datasance.com/component': 'router' }, ports: [{ name: 'pot-service', - port: parseInt(serviceConfig.bridgePort), - targetPort: parseInt(serviceConfig.servicePort), + port: parseInt(serviceConfig.servicePort), + targetPort: parseInt(serviceConfig.bridgePort), protocol: 'TCP' }] } diff --git a/src/utils/k8s-client.js b/src/utils/k8s-client.js index ad6bbc5af..51ea4f122 100644 --- a/src/utils/k8s-client.js +++ b/src/utils/k8s-client.js @@ -185,7 +185,7 @@ async function updateService (serviceName, patchData) { undefined, undefined, undefined, - { headers: { 'Content-Type': 'application/strategic-merge-patch+json' } } + { headers: { 'Content-Type': 'application/json-patch+json' } } ) logger.info(`Successfully updated service: ${serviceName} in namespace: ${CONTROLLER_NAMESPACE}`) return response.body From 5834cb28f2787265fc9365b3b0cd52de705c60fd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emirhan=20Durmu=C5=9F?= Date: Wed, 16 Jul 2025 19:22:56 +0300 Subject: [PATCH 168/178] viewer version updated --- package-lock.json | 8 ++++---- package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index ccadc8004..55e02df2c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,7 +10,7 @@ "hasInstallScript": true, "license": "EPL-2.0", "dependencies": { - "@datasance/ecn-viewer": "1.0.0-beta8", + "@datasance/ecn-viewer": "1.0.0-beta9", "@kubernetes/client-node": "^0.22.3", "@msgpack/msgpack": "^3.1.2", "@opentelemetry/api": "^1.9.0", @@ -427,9 +427,9 @@ } }, "node_modules/@datasance/ecn-viewer": { - "version": "1.0.0-beta8", - "resolved": "https://registry.npmjs.org/@datasance/ecn-viewer/-/ecn-viewer-1.0.0-beta8.tgz", - "integrity": "sha512-1zxIzsd5WxjhQbH2Hc7tvtkDQm/VgVJO6Whhccf308u6nhgwF1jZyx/iGigSw9hl7sI6nbgdQZtUyIeIyc+UCw==" + "version": "1.0.0-beta9", + "resolved": "https://registry.npmjs.org/@datasance/ecn-viewer/-/ecn-viewer-1.0.0-beta9.tgz", + "integrity": "sha512-Cgq2fRTZdWZjdYPutb07cK//BHHo+xxDRHxnBpIiYTa0FpLXZu99n2N82t1sdEPw/wrnMgxNhINjPYSYn1sNSA==" }, "node_modules/@eslint-community/eslint-utils": { "version": "4.7.0", diff --git a/package.json b/package.json index eba0196cd..634f7fd72 100644 --- a/package.json +++ b/package.json @@ -55,7 +55,7 @@ "iofog-controller": "src/main.js" }, "dependencies": { - "@datasance/ecn-viewer": "1.0.0-beta8", + "@datasance/ecn-viewer": "1.0.0-beta9", "@kubernetes/client-node": "^0.22.3", "@msgpack/msgpack": "^3.1.2", "@opentelemetry/api": "^1.9.0", From 01fe4be71fd8bcd91098c9f3c473be5722d46696 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emirhan=20Durmu=C5=9F?= Date: Wed, 16 Jul 2025 22:12:46 +0300 Subject: [PATCH 169/178] k8s service update fixed --- package-lock.json | 4 ++-- package.json | 2 +- src/utils/k8s-client.js | 19 +++++++++++++++---- 3 files changed, 18 insertions(+), 7 deletions(-) diff --git a/package-lock.json b/package-lock.json index 55e02df2c..def5bb78a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@datasance/iofogcontroller", - "version": "3.5.0-beta8", + "version": "3.5.0-beta9", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@datasance/iofogcontroller", - "version": "3.5.0-beta8", + "version": "3.5.0-beta9", "hasInstallScript": true, "license": "EPL-2.0", "dependencies": { diff --git a/package.json b/package.json index 634f7fd72..b7947d55b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@datasance/iofogcontroller", - "version": "3.5.0-beta8", + "version": "3.5.0-beta9", "description": "ioFog Controller project for Datasance PoT @ datasance.com \\nCopyright (c) 2023 Datasance Teknoloji A.S.", "main": "./src/main.js", "author": "Emirhan Durmus", diff --git a/src/utils/k8s-client.js b/src/utils/k8s-client.js index 51ea4f122..7cbdabe34 100644 --- a/src/utils/k8s-client.js +++ b/src/utils/k8s-client.js @@ -170,12 +170,23 @@ async function updateService (serviceName, patchData) { try { const api = await initializeK8sClient() - // For strategic merge patch, we send the data as a map - const patch = { - spec: patchData.spec, - metadata: patchData.metadata + const patch = [] + + // Update spec fields + if (patchData.spec.type) { + patch.push({ op: 'replace', path: '/spec/type', value: patchData.spec.type }) + } + if (patchData.spec.selector) { + patch.push({ op: 'replace', path: '/spec/selector', value: patchData.spec.selector }) + } + if (patchData.spec.ports) { + patch.push({ op: 'replace', path: '/spec/ports', value: patchData.spec.ports }) } + // Update annotations + if (patchData.metadata && patchData.metadata.annotations) { + patch.push({ op: 'replace', path: '/metadata/annotations', value: patchData.metadata.annotations }) + } const response = await api.patchNamespacedService( serviceName, CONTROLLER_NAMESPACE, From e54f9e0672687353babc04e267c7d04221863d39 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emirhan=20Durmu=C5=9F?= Date: Sat, 19 Jul 2025 11:30:37 +0300 Subject: [PATCH 170/178] new volume mount linked nodes endpoint added, secret types fixed, viewer upgraded --- docs/swagger.yaml | 40 ++++++++- package-lock.json | 81 +++++-------------- package.json | 7 +- src/controllers/volume-mount-controller.js | 5 ++ .../mysql/db_migration_mysql_v1.0.3.sql | 2 +- .../postgres/db_migration_pg_v1.0.3.sql | 2 +- .../sqlite/db_migration_sqlite_v1.0.3.sql | 2 +- src/data/models/secret.js | 2 +- src/routes/volumeMount.js | 31 +++++++ src/schemas/secret.js | 6 +- src/services/agent-service.js | 2 +- src/services/volume-mount-service.js | 10 ++- 12 files changed, 112 insertions(+), 78 deletions(-) diff --git a/docs/swagger.yaml b/docs/swagger.yaml index 307efca34..bc5704d01 100755 --- a/docs/swagger.yaml +++ b/docs/swagger.yaml @@ -4549,6 +4549,40 @@ paths: description: Internal Server Error "/volumeMounts/{name}/link": + get: + tags: + - VolumeMounts + summary: Gets volume mount link info + operationId: getVolumeMountLink + parameters: + - in: path + name: name + description: Volume mount name + required: true + schema: + type: string + security: + - authToken: [] + responses: + "200": + description: Success + content: + application/json: + schema: + type: object + properties: + fogUuids: + type: array + items: + type: string + "400": + description: Bad Request + "401": + description: Not Authorized + "404": + description: Not Found + "500": + description: Internal Server Error post: tags: - VolumeMounts @@ -6428,7 +6462,7 @@ components: maxLength: 255 type: type: string - enum: [opaque, tls] + enum: [Opaque, tls] data: type: object SecretUpdate: @@ -6454,7 +6488,7 @@ components: type: string type: type: string - enum: [opaque, tls] + enum: [Opaque, tls] data: type: object created_at: @@ -6485,7 +6519,7 @@ components: type: string type: type: string - enum: [opaque, tls] + enum: [Opaque, tls] created_at: type: string format: date-time diff --git a/package-lock.json b/package-lock.json index def5bb78a..2e0f2b6c9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,16 +1,16 @@ { "name": "@datasance/iofogcontroller", - "version": "3.5.0-beta9", + "version": "3.5.0-beta10", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@datasance/iofogcontroller", - "version": "3.5.0-beta9", + "version": "3.5.0-beta10", "hasInstallScript": true, "license": "EPL-2.0", "dependencies": { - "@datasance/ecn-viewer": "1.0.0-beta9", + "@datasance/ecn-viewer": "1.0.0-beta10", "@kubernetes/client-node": "^0.22.3", "@msgpack/msgpack": "^3.1.2", "@opentelemetry/api": "^1.9.0", @@ -32,7 +32,7 @@ "dotenv": "^16.5.0", "ejs": "3.1.10", "express": "4.21.2", - "express-session": "1.18.1", + "express-session": "1.18.2", "formidable": "3.5.4", "ftp": "0.3.10", "globally": "^0.0.0", @@ -46,7 +46,6 @@ "minimatch": "10.0.1", "moment": "2.30.1", "moment-timezone": "0.5.45", - "morgan": "1.10.0", "multer": "1.4.5-lts.1", "mysql2": "3.10.1", "nconf": "0.12.1", @@ -427,9 +426,9 @@ } }, "node_modules/@datasance/ecn-viewer": { - "version": "1.0.0-beta9", - "resolved": "https://registry.npmjs.org/@datasance/ecn-viewer/-/ecn-viewer-1.0.0-beta9.tgz", - "integrity": "sha512-Cgq2fRTZdWZjdYPutb07cK//BHHo+xxDRHxnBpIiYTa0FpLXZu99n2N82t1sdEPw/wrnMgxNhINjPYSYn1sNSA==" + "version": "1.0.0-beta10", + "resolved": "https://registry.npmjs.org/@datasance/ecn-viewer/-/ecn-viewer-1.0.0-beta10.tgz", + "integrity": "sha512-prH0v9eFvkLdXCLeu7oK3E2Jx1/hfIOqbjsjLe0myieK3mcHFlE11FydDgo15d/DlHIvXrDFcGRHHDN+BtmStQ==" }, "node_modules/@eslint-community/eslint-utils": { "version": "4.7.0", @@ -3009,22 +3008,6 @@ } ] }, - "node_modules/basic-auth": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", - "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", - "dependencies": { - "safe-buffer": "5.1.2" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/basic-auth/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/basic-ftp": { "version": "5.0.5", "resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.0.5.tgz", @@ -5649,15 +5632,15 @@ } }, "node_modules/express-session": { - "version": "1.18.1", - "resolved": "https://registry.npmjs.org/express-session/-/express-session-1.18.1.tgz", - "integrity": "sha512-a5mtTqEaZvBCL9A9aqkrtfz+3SMDhOVUnjafjo+s7A9Txkq+SVX2DLvSp1Zrv4uCXa3lMSK3viWnh9Gg07PBUA==", + "version": "1.18.2", + "resolved": "https://registry.npmjs.org/express-session/-/express-session-1.18.2.tgz", + "integrity": "sha512-SZjssGQC7TzTs9rpPDuUrR23GNZ9+2+IkA/+IJWmvQilTr5OSliEHGF+D9scbIpdC6yGtTI0/VhaHoVes2AN/A==", "dependencies": { "cookie": "0.7.2", "cookie-signature": "1.0.7", "debug": "2.6.9", "depd": "~2.0.0", - "on-headers": "~1.0.2", + "on-headers": "~1.1.0", "parseurl": "~1.3.3", "safe-buffer": "5.2.1", "uid-safe": "~2.1.5" @@ -5671,6 +5654,14 @@ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.7.tgz", "integrity": "sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA==" }, + "node_modules/express-session/node_modules/on-headers": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.1.0.tgz", + "integrity": "sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A==", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/express/node_modules/cookie": { "version": "0.7.1", "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", @@ -9232,32 +9223,6 @@ "node": "*" } }, - "node_modules/morgan": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.10.0.tgz", - "integrity": "sha512-AbegBVI4sh6El+1gNwvD5YIck7nSA36weD7xvIxG4in80j/UoK8AEGaWnnz8v1GxonMCltmlNs5ZKbGvl9b1XQ==", - "dependencies": { - "basic-auth": "~2.0.1", - "debug": "2.6.9", - "depd": "~2.0.0", - "on-finished": "~2.3.0", - "on-headers": "~1.0.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/morgan/node_modules/on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", @@ -10117,14 +10082,6 @@ "node": ">= 0.8" } }, - "node_modules/on-headers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", - "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", - "engines": { - "node": ">= 0.8" - } - }, "node_modules/once": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", diff --git a/package.json b/package.json index b7947d55b..4e9d45d00 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@datasance/iofogcontroller", - "version": "3.5.0-beta9", + "version": "3.5.0-beta10", "description": "ioFog Controller project for Datasance PoT @ datasance.com \\nCopyright (c) 2023 Datasance Teknoloji A.S.", "main": "./src/main.js", "author": "Emirhan Durmus", @@ -55,7 +55,7 @@ "iofog-controller": "src/main.js" }, "dependencies": { - "@datasance/ecn-viewer": "1.0.0-beta9", + "@datasance/ecn-viewer": "1.0.0-beta10", "@kubernetes/client-node": "^0.22.3", "@msgpack/msgpack": "^3.1.2", "@opentelemetry/api": "^1.9.0", @@ -77,7 +77,7 @@ "dotenv": "^16.5.0", "ejs": "3.1.10", "express": "4.21.2", - "express-session": "1.18.1", + "express-session": "1.18.2", "formidable": "3.5.4", "ftp": "0.3.10", "globally": "^0.0.0", @@ -91,7 +91,6 @@ "minimatch": "10.0.1", "moment": "2.30.1", "moment-timezone": "0.5.45", - "morgan": "1.10.0", "multer": "1.4.5-lts.1", "mysql2": "3.10.1", "nconf": "0.12.1", diff --git a/src/controllers/volume-mount-controller.js b/src/controllers/volume-mount-controller.js index 5a3ce6bef..9628a8bad 100644 --- a/src/controllers/volume-mount-controller.js +++ b/src/controllers/volume-mount-controller.js @@ -50,6 +50,10 @@ const updateVolumeMountYamlEndpoint = async (req) => { return VolumeMountService.updateVolumeMountEndpoint(name, volumeMountData) } +const getVolumeMountLinkEndpoint = async (req) => { + return VolumeMountService.getVolumeMountLinkEndpoint(req.params.name) +} + const linkVolumeMountEndpoint = async (req) => { return VolumeMountService.linkVolumeMountEndpoint(req.params.name, req.body.fogUuids) } @@ -66,6 +70,7 @@ module.exports = { deleteVolumeMountEndpoint, createVolumeMountYamlEndpoint, updateVolumeMountYamlEndpoint, + getVolumeMountLinkEndpoint, linkVolumeMountEndpoint, unlinkVolumeMountEndpoint } diff --git a/src/data/migrations/mysql/db_migration_mysql_v1.0.3.sql b/src/data/migrations/mysql/db_migration_mysql_v1.0.3.sql index 60fd7a29d..4126b2ae8 100644 --- a/src/data/migrations/mysql/db_migration_mysql_v1.0.3.sql +++ b/src/data/migrations/mysql/db_migration_mysql_v1.0.3.sql @@ -641,7 +641,7 @@ ALTER TABLE MicroserviceStatuses ADD COLUMN ip_address TEXT; CREATE TABLE IF NOT EXISTS Secrets ( id INT AUTO_INCREMENT PRIMARY KEY NOT NULL, name VARCHAR(255) UNIQUE NOT NULL, - type VARCHAR(50) NOT NULL CHECK (type IN ('opaque', 'tls')), + type VARCHAR(50) NOT NULL CHECK (type IN ('Opaque', 'tls')), data TEXT NOT NULL, created_at DATETIME, updated_at DATETIME diff --git a/src/data/migrations/postgres/db_migration_pg_v1.0.3.sql b/src/data/migrations/postgres/db_migration_pg_v1.0.3.sql index 5303bda58..9aeb5f6c5 100644 --- a/src/data/migrations/postgres/db_migration_pg_v1.0.3.sql +++ b/src/data/migrations/postgres/db_migration_pg_v1.0.3.sql @@ -640,7 +640,7 @@ DROP TABLE IF EXISTS "FogAccessTokens"; CREATE TABLE IF NOT EXISTS "Secrets" ( id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY NOT NULL, name VARCHAR(255) UNIQUE NOT NULL, - type VARCHAR(50) NOT NULL CHECK (type IN ('opaque', 'tls')), + type VARCHAR(50) NOT NULL CHECK (type IN ('Opaque', 'tls')), data TEXT NOT NULL, created_at TIMESTAMP(0), updated_at TIMESTAMP(0) diff --git a/src/data/migrations/sqlite/db_migration_sqlite_v1.0.3.sql b/src/data/migrations/sqlite/db_migration_sqlite_v1.0.3.sql index d8715585e..0781f38d9 100644 --- a/src/data/migrations/sqlite/db_migration_sqlite_v1.0.3.sql +++ b/src/data/migrations/sqlite/db_migration_sqlite_v1.0.3.sql @@ -632,7 +632,7 @@ ALTER TABLE MicroserviceStatuses ADD COLUMN ip_address TEXT; CREATE TABLE IF NOT EXISTS Secrets ( id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, name VARCHAR(255) UNIQUE NOT NULL, - type VARCHAR(50) NOT NULL CHECK (type IN ('opaque', 'tls')), + type VARCHAR(50) NOT NULL CHECK (type IN ('Opaque', 'tls')), data TEXT NOT NULL, created_at DATETIME, updated_at DATETIME diff --git a/src/data/models/secret.js b/src/data/models/secret.js index 3b19442ac..9b1447aea 100644 --- a/src/data/models/secret.js +++ b/src/data/models/secret.js @@ -22,7 +22,7 @@ module.exports = (sequelize, DataTypes) => { allowNull: false, field: 'type', validate: { - isIn: [['opaque', 'tls']] + isIn: [['Opaque', 'tls']] } }, data: { diff --git a/src/routes/volumeMount.js b/src/routes/volumeMount.js index 05c20b509..99dee9a5f 100644 --- a/src/routes/volumeMount.js +++ b/src/routes/volumeMount.js @@ -247,6 +247,37 @@ module.exports = [ }) } }, + { + method: 'get', + path: '/api/v3/volumeMounts/:name/link', + middleware: async (req, res) => { + logger.apiReq(req) + + const successCode = constants.HTTP_CODE_SUCCESS + const errorCodes = [ + { + code: constants.HTTP_CODE_UNAUTHORIZED, + errors: [Errors.AuthenticationError] + }, + { + code: constants.HTTP_CODE_BAD_REQUEST, + errors: [Errors.ValidationError] + } + ] + + // Add keycloak.protect() middleware to protect the route for SRE role + await keycloak.protect(['SRE', 'Developer'])(req, res, async () => { + const getVolumeMountLinkEndpoint = ResponseDecorator.handleErrors(VolumeMountController.getVolumeMountLinkEndpoint, successCode, errorCodes) + const responseObject = await getVolumeMountLinkEndpoint(req) + const user = req.kauth.grant.access_token.content.preferred_username + res + .status(responseObject.code) + .send(responseObject.body) + + logger.apiRes({ req: req, user: user, res: res, responseObject: responseObject }) + }) + } + }, { method: 'post', path: '/api/v3/volumeMounts/:name/link', diff --git a/src/schemas/secret.js b/src/schemas/secret.js index 68251328f..6b52e5eb7 100644 --- a/src/schemas/secret.js +++ b/src/schemas/secret.js @@ -3,7 +3,7 @@ const secretCreate = { type: 'object', properties: { name: { type: 'string', minLength: 1, maxLength: 255 }, - type: { type: 'string', enum: ['opaque', 'tls'] }, + type: { type: 'string', enum: ['Opaque', 'tls'] }, data: { type: 'object' } }, required: ['name', 'type', 'data'], @@ -27,7 +27,7 @@ const secretResponse = { properties: { id: { type: 'integer' }, name: { type: 'string' }, - type: { type: 'string', enum: ['opaque', 'tls'] }, + type: { type: 'string', enum: ['Opaque', 'tls'] }, data: { type: 'object' }, created_at: { type: 'string', format: 'date-time' }, updated_at: { type: 'string', format: 'date-time' } @@ -47,7 +47,7 @@ const secretListResponse = { properties: { id: { type: 'integer' }, name: { type: 'string' }, - type: { type: 'string', enum: ['opaque', 'tls'] }, + type: { type: 'string', enum: ['Opaque', 'tls'] }, created_at: { type: 'string', format: 'date-time' }, updated_at: { type: 'string', format: 'date-time' } }, diff --git a/src/services/agent-service.js b/src/services/agent-service.js index 3c2e29274..24fb00809 100644 --- a/src/services/agent-service.js +++ b/src/services/agent-service.js @@ -752,7 +752,7 @@ const getAgentLinkedVolumeMounts = async function (fog, transaction) { // For TLS secrets, values are already base64 encoded data = secret.data } else { - // For opaque secrets, we need to base64 encode all values + // For Opaque secrets, we need to base64 encode all values data = Object.entries(secret.data).reduce((acc, [key, value]) => { acc[key] = Buffer.from(value).toString('base64') return acc diff --git a/src/services/volume-mount-service.js b/src/services/volume-mount-service.js index 403afb1a5..21193e231 100644 --- a/src/services/volume-mount-service.js +++ b/src/services/volume-mount-service.js @@ -184,6 +184,13 @@ async function unlinkVolumeMountEndpoint (name, fogUuids, transaction) { return {} } +async function getVolumeMountLinkEndpoint (name, transaction) { + const linkedFogUuids = await findVolumeMountedFogNodes(name, transaction) + return { + fogUuids: linkedFogUuids + } +} + module.exports = { listVolumeMountsEndpoint: TransactionDecorator.generateTransaction(listVolumeMountsEndpoint), getVolumeMountEndpoint: TransactionDecorator.generateTransaction(getVolumeMountEndpoint), @@ -192,5 +199,6 @@ module.exports = { deleteVolumeMountEndpoint: TransactionDecorator.generateTransaction(deleteVolumeMountEndpoint), linkVolumeMountEndpoint: TransactionDecorator.generateTransaction(linkVolumeMountEndpoint), unlinkVolumeMountEndpoint: TransactionDecorator.generateTransaction(unlinkVolumeMountEndpoint), - findVolumeMountedFogNodes: TransactionDecorator.generateTransaction(findVolumeMountedFogNodes) + findVolumeMountedFogNodes: TransactionDecorator.generateTransaction(findVolumeMountedFogNodes), + getVolumeMountLinkEndpoint: TransactionDecorator.generateTransaction(getVolumeMountLinkEndpoint) } From dc6cba7524fa8ffeb4a8a3ee768412e8b4183c4f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emirhan=20Durmu=C5=9F?= Date: Mon, 21 Jul 2025 13:30:40 +0300 Subject: [PATCH 171/178] release prep & viewer version upgraded --- docs/swagger.json | 2 +- docs/swagger.yaml | 2 +- package-lock.json | 12 ++++++------ package.json | 4 ++-- 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/docs/swagger.json b/docs/swagger.json index 98745d609..16aac50dc 100644 --- a/docs/swagger.json +++ b/docs/swagger.json @@ -359,7 +359,7 @@ "/iofog/{uuid}/prune" : { "post" : { "tags" : [ "ioFog" ], - "summary" : "prune reboot fog agent", + "summary" : "prune remote fog agent", "operationId" : "setPruneCommand", "parameters" : [ { "name" : "uuid", diff --git a/docs/swagger.yaml b/docs/swagger.yaml index bc5704d01..c3da65dc5 100755 --- a/docs/swagger.yaml +++ b/docs/swagger.yaml @@ -294,7 +294,7 @@ paths: post: tags: - ioFog - summary: prune reboot fog agent + summary: prune remote fog agent operationId: setPruneCommand parameters: - in: path diff --git a/package-lock.json b/package-lock.json index 2e0f2b6c9..e2141bf4f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,16 +1,16 @@ { "name": "@datasance/iofogcontroller", - "version": "3.5.0-beta10", + "version": "3.5.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@datasance/iofogcontroller", - "version": "3.5.0-beta10", + "version": "3.5.0", "hasInstallScript": true, "license": "EPL-2.0", "dependencies": { - "@datasance/ecn-viewer": "1.0.0-beta10", + "@datasance/ecn-viewer": "1.0.0", "@kubernetes/client-node": "^0.22.3", "@msgpack/msgpack": "^3.1.2", "@opentelemetry/api": "^1.9.0", @@ -426,9 +426,9 @@ } }, "node_modules/@datasance/ecn-viewer": { - "version": "1.0.0-beta10", - "resolved": "https://registry.npmjs.org/@datasance/ecn-viewer/-/ecn-viewer-1.0.0-beta10.tgz", - "integrity": "sha512-prH0v9eFvkLdXCLeu7oK3E2Jx1/hfIOqbjsjLe0myieK3mcHFlE11FydDgo15d/DlHIvXrDFcGRHHDN+BtmStQ==" + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@datasance/ecn-viewer/-/ecn-viewer-1.0.0.tgz", + "integrity": "sha512-dgKXX2wmWQQl3UKt1cUmDXz721Rvl8jEDHJIGi99wPmk98aeF47XWO5oev83FFmHCQiBaIDtO2QXdtWuHaRSxg==" }, "node_modules/@eslint-community/eslint-utils": { "version": "4.7.0", diff --git a/package.json b/package.json index 4e9d45d00..29032157a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@datasance/iofogcontroller", - "version": "3.5.0-beta10", + "version": "3.5.0", "description": "ioFog Controller project for Datasance PoT @ datasance.com \\nCopyright (c) 2023 Datasance Teknoloji A.S.", "main": "./src/main.js", "author": "Emirhan Durmus", @@ -55,7 +55,7 @@ "iofog-controller": "src/main.js" }, "dependencies": { - "@datasance/ecn-viewer": "1.0.0-beta10", + "@datasance/ecn-viewer": "1.0.0", "@kubernetes/client-node": "^0.22.3", "@msgpack/msgpack": "^3.1.2", "@opentelemetry/api": "^1.9.0", From 1690e2aeb4ec2b0a448ce69d157f663ab7a757ea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emirhan=20Durmu=C5=9F?= Date: Thu, 14 Aug 2025 15:27:38 +0300 Subject: [PATCH 172/178] microservice config endpoints created, viewer version updated --- docs/swagger.yaml | 198 ++++++++++++++++++ package-lock.json | 28 +-- package.json | 6 +- src/controllers/microservices-controller.js | 38 ++++ src/routes/microservices.js | 210 ++++++++++++++++++++ src/services/microservices-service.js | 145 ++++++++++++++ 6 files changed, 608 insertions(+), 17 deletions(-) diff --git a/docs/swagger.yaml b/docs/swagger.yaml index c3da65dc5..c36985ad3 100755 --- a/docs/swagger.yaml +++ b/docs/swagger.yaml @@ -1973,6 +1973,202 @@ paths: description: Duplicate Name "500": description: Internal Server Error + /microservices/{uuid}/config: + get: + tags: + - Microservices + summary: Gets a microservice config + operationId: getMicroserviceConfig + parameters: + - in: path + name: uuid + description: Microservice Uuid + required: true + schema: + type: string + security: + - authToken: [] + responses: + "200": + description: Success + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + content: + application/json: + schema: + $ref: "#/components/schemas/microservicesConfig" + "401": + description: Not Authorized + "404": + description: Not Found + "500": + description: Internal Server Error + patch: + tags: + - Microservices + summary: Updates a microservice config + operationId: updateMicroserviceConfig + parameters: + - in: path + name: uuid + description: Microservice Uuid + required: true + schema: + type: string + security: + - authToken: [] + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/microservicesConfig" + description: information about microservice config + required: true + responses: + "204": + description: Updated + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + "400": + description: Bad Request + "401": + description: Not Authorized + "404": + description: Not Found + "500": + description: Internal Server Error + delete: + tags: + - Microservices + summary: Deletes a microservice config + operationId: deleteMicroserviceConfig + parameters: + - in: path + name: uuid + description: Microservice Uuid + required: true + schema: + type: string + security: + - authToken: [] + responses: + "204": + description: Success + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + "401": + description: Not Authorized + "404": + description: Not Found + "500": + description: Internal Server Error + /microservices/system/{uuid}/config: + get: + tags: + - Microservices + summary: Gets a system microservice config + operationId: getSystemMicroserviceConfig + parameters: + - in: path + name: uuid + description: Microservice Uuid + required: true + schema: + type: string + security: + - authToken: [] + responses: + "200": + description: Success + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + content: + application/json: + schema: + $ref: "#/components/schemas/microservicesConfig" + "401": + description: Not Authorized + "404": + description: Not Found + "500": + description: Internal Server Error + patch: + tags: + - Microservices + summary: Updates a system microservice config + operationId: updateSystemMicroserviceConfig + parameters: + - in: path + name: uuid + description: Microservice Uuid + required: true + schema: + type: string + security: + - authToken: [] + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/microservicesConfig" + description: information about microservice config + required: true + responses: + "204": + description: Updated + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + "400": + description: Bad Request + "401": + description: Not Authorized + "404": + description: Not Found + "500": + description: Internal Server Error + delete: + tags: + - Microservices + summary: Deletes a system microservice config + operationId: deleteSystemMicroserviceConfig + parameters: + - in: path + name: uuid + description: Microservice Uuid + required: true + schema: + type: string + security: + - authToken: [] + responses: + "204": + description: Success + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + "401": + description: Not Authorized + "404": + description: Not Found + "500": + description: Internal Server Error "/microservices/{uuid}/port-mapping": post: tags: @@ -5897,6 +6093,8 @@ components: portExternal: type: string example: 80 + microservicesConfig: + type: string RegistriesListResponse: type: object properties: diff --git a/package-lock.json b/package-lock.json index e2141bf4f..85cd0f6ee 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,16 +1,16 @@ { "name": "@datasance/iofogcontroller", - "version": "3.5.0", + "version": "3.5.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@datasance/iofogcontroller", - "version": "3.5.0", + "version": "3.5.1", "hasInstallScript": true, "license": "EPL-2.0", "dependencies": { - "@datasance/ecn-viewer": "1.0.0", + "@datasance/ecn-viewer": "1.0.1", "@kubernetes/client-node": "^0.22.3", "@msgpack/msgpack": "^3.1.2", "@opentelemetry/api": "^1.9.0", @@ -19,7 +19,7 @@ "@opentelemetry/instrumentation-http": "^0.200.0", "@opentelemetry/resources": "^1.8.0", "@opentelemetry/sdk-node": "^0.200.0", - "axios": "1.8.4", + "axios": "1.11.0", "bignumber.js": "^9.3.0", "body-parser": "^1.20.3", "child_process": "1.0.2", @@ -426,9 +426,9 @@ } }, "node_modules/@datasance/ecn-viewer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@datasance/ecn-viewer/-/ecn-viewer-1.0.0.tgz", - "integrity": "sha512-dgKXX2wmWQQl3UKt1cUmDXz721Rvl8jEDHJIGi99wPmk98aeF47XWO5oev83FFmHCQiBaIDtO2QXdtWuHaRSxg==" + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@datasance/ecn-viewer/-/ecn-viewer-1.0.1.tgz", + "integrity": "sha512-4q9oe599Y0omz6PI1uW6mzP1IzWncKsfYWi0mAE1iaDpEAaC24p0iLU+Gbsb6TzuBHFCLXgLmR4mUuWfT559Cw==" }, "node_modules/@eslint-community/eslint-utils": { "version": "4.7.0", @@ -2894,12 +2894,12 @@ "dev": true }, "node_modules/axios": { - "version": "1.8.4", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.8.4.tgz", - "integrity": "sha512-eBSYY4Y68NNlHbHBMdeDmKNtDgXWhQsJcGqzO3iLUM0GraQFSS9cVgPX5I9b3lbdFKyYoAEGAZF1DwhTaljNAw==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.11.0.tgz", + "integrity": "sha512-1Lx3WLFQWm3ooKDYZD1eXmoGO9fxYQjrycfHFC8P0sCfQVXyROp0p9PFWBehewBOdCwHc+f/b8I0fMto5eSfwA==", "dependencies": { "follow-redirects": "^1.15.6", - "form-data": "^4.0.0", + "form-data": "^4.0.4", "proxy-from-env": "^1.1.0" } }, @@ -6113,9 +6113,9 @@ } }, "node_modules/form-data": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.3.tgz", - "integrity": "sha512-qsITQPfmvMOSAdeyZ+12I1c+CKSstAFAwu+97zrnWAbIr5u8wfsExUzCesVLC8NgHuRUqNN4Zy6UPWUTRGslcA==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz", + "integrity": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==", "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", diff --git a/package.json b/package.json index 29032157a..9c562700c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@datasance/iofogcontroller", - "version": "3.5.0", + "version": "3.5.1", "description": "ioFog Controller project for Datasance PoT @ datasance.com \\nCopyright (c) 2023 Datasance Teknoloji A.S.", "main": "./src/main.js", "author": "Emirhan Durmus", @@ -55,7 +55,7 @@ "iofog-controller": "src/main.js" }, "dependencies": { - "@datasance/ecn-viewer": "1.0.0", + "@datasance/ecn-viewer": "1.0.1", "@kubernetes/client-node": "^0.22.3", "@msgpack/msgpack": "^3.1.2", "@opentelemetry/api": "^1.9.0", @@ -64,7 +64,7 @@ "@opentelemetry/instrumentation-http": "^0.200.0", "@opentelemetry/resources": "^1.8.0", "@opentelemetry/sdk-node": "^0.200.0", - "axios": "1.8.4", + "axios": "1.11.0", "bignumber.js": "^9.3.0", "body-parser": "^1.20.3", "child_process": "1.0.2", diff --git a/src/controllers/microservices-controller.js b/src/controllers/microservices-controller.js index c599fbb54..302a0fc84 100644 --- a/src/controllers/microservices-controller.js +++ b/src/controllers/microservices-controller.js @@ -85,6 +85,38 @@ const updateSystemMicroserviceYAMLEndPoint = async function (req) { return MicroservicesService.updateSystemMicroserviceEndPoint(microserviceUuid, microservice, false) } +const updateMicroserviceConfigEndPoint = async function (req) { + const microserviceUuid = req.params.uuid + const config = req.body + return MicroservicesService.updateMicroserviceConfigEndPoint(microserviceUuid, config, false) +} + +const getMicroserviceConfigEndPoint = async function (req) { + const microserviceUuid = req.params.uuid + return MicroservicesService.getMicroserviceConfigEndPoint(microserviceUuid, false) +} + +const deleteMicroserviceConfigEndPoint = async function (req) { + const microserviceUuid = req.params.uuid + return MicroservicesService.deleteMicroserviceConfigEndPoint(microserviceUuid, false) +} + +const updateSystemMicroserviceConfigEndPoint = async function (req) { + const microserviceUuid = req.params.uuid + const config = req.body + return MicroservicesService.updateSystemMicroserviceConfigEndPoint(microserviceUuid, config, false) +} + +const getSystemMicroserviceConfigEndPoint = async function (req) { + const microserviceUuid = req.params.uuid + return MicroservicesService.getSystemMicroserviceConfigEndPoint(microserviceUuid, false) +} + +const deleteSystemMicroserviceConfigEndPoint = async function (req) { + const microserviceUuid = req.params.uuid + return MicroservicesService.deleteSystemMicroserviceConfigEndPoint(microserviceUuid, false) +} + const deleteMicroserviceEndPoint = async function (req) { const microserviceUuid = req.params.uuid const microserviceData = req.body || {} @@ -237,6 +269,12 @@ module.exports = { createMicroserviceYAMLEndPoint: (createMicroserviceYAMLEndPoint), updateMicroserviceYAMLEndPoint: (updateMicroserviceYAMLEndPoint), updateSystemMicroserviceYAMLEndPoint: (updateSystemMicroserviceYAMLEndPoint), + updateMicroserviceConfigEndPoint: (updateMicroserviceConfigEndPoint), + getMicroserviceConfigEndPoint: (getMicroserviceConfigEndPoint), + updateSystemMicroserviceConfigEndPoint: (updateSystemMicroserviceConfigEndPoint), + getSystemMicroserviceConfigEndPoint: (getSystemMicroserviceConfigEndPoint), + deleteMicroserviceConfigEndPoint: (deleteMicroserviceConfigEndPoint), + deleteSystemMicroserviceConfigEndPoint: (deleteSystemMicroserviceConfigEndPoint), createMicroserviceExecEndPoint: (createMicroserviceExecEndPoint), deleteMicroserviceExecEndPoint: (deleteMicroserviceExecEndPoint), createSystemMicroserviceExecEndPoint: (createSystemMicroserviceExecEndPoint), diff --git a/src/routes/microservices.js b/src/routes/microservices.js index b0b08a5f5..38c3d0833 100644 --- a/src/routes/microservices.js +++ b/src/routes/microservices.js @@ -478,6 +478,216 @@ module.exports = [ }) } }, + { + method: 'get', + path: '/api/v3/microservices/:uuid/config', + middleware: async (req, res) => { + logger.apiReq(req) + + const successCode = constants.HTTP_CODE_SUCCESS + const errorCodes = [ + { + code: constants.HTTP_CODE_BAD_REQUEST, + errors: [Errors.ValidationError] + }, + { + code: constants.HTTP_CODE_UNAUTHORIZED, + errors: [Errors.AuthenticationError] + }, + { + code: constants.HTTP_CODE_NOT_FOUND, + errors: [Errors.NotFoundError] + } + ] + + await keycloak.protect(['SRE', 'Developer', 'Viewer'])(req, res, async () => { + const getMicroserviceConfigEndPoint = ResponseDecorator.handleErrors(MicroservicesController.getMicroserviceConfigEndPoint, + successCode, errorCodes) + const responseObject = await getMicroserviceConfigEndPoint(req) + const user = req.kauth.grant.access_token.content.preferred_username + res + .status(responseObject.code) + .send(responseObject.body) + + logger.apiRes({ req: req, user: user, res: res, responseObject: responseObject }) + }) + } + }, + { + method: 'patch', + path: '/api/v3/microservices/:uuid/config', + middleware: async (req, res) => { + logger.apiReq(req) + + const successCode = constants.HTTP_CODE_NO_CONTENT + const errorCodes = [ + { + code: constants.HTTP_CODE_BAD_REQUEST, + errors: [Errors.ValidationError] + }, + { + code: constants.HTTP_CODE_UNAUTHORIZED, + errors: [Errors.AuthenticationError] + }, + { + code: constants.HTTP_CODE_NOT_FOUND, + errors: [Errors.NotFoundError] + } + ] + + await keycloak.protect(['SRE', 'Developer'])(req, res, async () => { + const updateMicroserviceConfigEndPoint = ResponseDecorator.handleErrors(MicroservicesController.updateMicroserviceConfigEndPoint, + successCode, errorCodes) + const responseObject = await updateMicroserviceConfigEndPoint(req) + const user = req.kauth.grant.access_token.content.preferred_username + res + .status(responseObject.code) + .send(responseObject.body) + + logger.apiRes({ req: req, user: user, res: res, responseObject: responseObject }) + }) + } + }, + { + method: 'get', + path: '/api/v3/microservices/system/:uuid/config', + middleware: async (req, res) => { + logger.apiReq(req) + + const successCode = constants.HTTP_CODE_SUCCESS + const errorCodes = [ + { + code: constants.HTTP_CODE_BAD_REQUEST, + errors: [Errors.ValidationError] + }, + { + code: constants.HTTP_CODE_UNAUTHORIZED, + errors: [Errors.AuthenticationError] + }, + { + code: constants.HTTP_CODE_NOT_FOUND, + errors: [Errors.NotFoundError] + } + ] + + await keycloak.protect(['SRE', 'Developer', 'Viewer'])(req, res, async () => { + const getSystemMicroserviceConfigEndPoint = ResponseDecorator.handleErrors(MicroservicesController.getSystemMicroserviceConfigEndPoint, + successCode, errorCodes) + const responseObject = await getSystemMicroserviceConfigEndPoint(req) + const user = req.kauth.grant.access_token.content.preferred_username + res + .status(responseObject.code) + .send(responseObject.body) + + logger.apiRes({ req: req, user: user, res: res, responseObject: responseObject }) + }) + } + }, + { + method: 'patch', + path: '/api/v3/microservices/system/:uuid/config', + middleware: async (req, res) => { + logger.apiReq(req) + + const successCode = constants.HTTP_CODE_NO_CONTENT + const errorCodes = [ + { + code: constants.HTTP_CODE_BAD_REQUEST, + errors: [Errors.ValidationError] + }, + { + code: constants.HTTP_CODE_UNAUTHORIZED, + errors: [Errors.AuthenticationError] + }, + { + code: constants.HTTP_CODE_NOT_FOUND, + errors: [Errors.NotFoundError] + } + ] + + await keycloak.protect(['SRE'])(req, res, async () => { + const updateSystemMicroserviceConfigEndPoint = ResponseDecorator.handleErrors(MicroservicesController.updateSystemMicroserviceConfigEndPoint, + successCode, errorCodes) + const responseObject = await updateSystemMicroserviceConfigEndPoint(req) + const user = req.kauth.grant.access_token.content.preferred_username + res + .status(responseObject.code) + .send(responseObject.body) + + logger.apiRes({ req: req, user: user, res: res, responseObject: responseObject }) + }) + } + }, + { + method: 'delete', + path: '/api/v3/microservices/:uuid/config', + middleware: async (req, res) => { + logger.apiReq(req) + + const successCode = constants.HTTP_CODE_NO_CONTENT + const errorCodes = [ + { + code: constants.HTTP_CODE_BAD_REQUEST, + errors: [Errors.ValidationError] + }, + { + code: constants.HTTP_CODE_UNAUTHORIZED, + errors: [Errors.AuthenticationError] + }, + { + code: constants.HTTP_CODE_NOT_FOUND, + errors: [Errors.NotFoundError] + } + ] + + await keycloak.protect(['SRE', 'Developer'])(req, res, async () => { + const deleteMicroserviceConfigEndPoint = ResponseDecorator.handleErrors(MicroservicesController.deleteMicroserviceConfigEndPoint, + successCode, errorCodes) + const responseObject = await deleteMicroserviceConfigEndPoint(req) + const user = req.kauth.grant.access_token.content.preferred_username + res + .status(responseObject.code) + .send(responseObject.body) + + logger.apiRes({ req: req, user: user, res: res, responseObject: responseObject }) + }) + } + }, + { + method: 'delete', + path: '/api/v3/microservices/system/:uuid/config', + middleware: async (req, res) => { + logger.apiReq(req) + + const successCode = constants.HTTP_CODE_NO_CONTENT + const errorCodes = [ + { + code: constants.HTTP_CODE_BAD_REQUEST, + errors: [Errors.ValidationError] + }, + { + code: constants.HTTP_CODE_UNAUTHORIZED, + errors: [Errors.AuthenticationError] + }, + { + code: constants.HTTP_CODE_NOT_FOUND, + errors: [Errors.NotFoundError] + } + ] + + await keycloak.protect(['SRE'])(req, res, async () => { + const deleteSystemMicroserviceConfigEndPoint = ResponseDecorator.handleErrors(MicroservicesController.deleteSystemMicroserviceConfigEndPoint, + successCode, errorCodes) + const responseObject = await deleteSystemMicroserviceConfigEndPoint(req) + const user = req.kauth.grant.access_token.content.preferred_username + res + .status(responseObject.code) + .send(responseObject.body) + + logger.apiRes({ req: req, user: user, res: res, responseObject: responseObject }) + }) + } + }, { method: 'delete', path: '/api/v3/microservices/:uuid', diff --git a/src/services/microservices-service.js b/src/services/microservices-service.js index 173d7bb21..539ef74f6 100644 --- a/src/services/microservices-service.js +++ b/src/services/microservices-service.js @@ -1018,6 +1018,145 @@ async function updateMicroserviceEndPoint (microserviceUuid, microserviceData, i } } +async function updateMicroserviceConfigEndPoint (microserviceUuid, config, isCLI, transaction) { + const query = isCLI + ? { + uuid: microserviceUuid + } + : { + uuid: microserviceUuid + } + const microservice = await MicroserviceManager.findOneWithCategory(query, transaction) + if (!microservice) { + throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.INVALID_MICROSERVICE_UUID, microserviceUuid)) + } + if (microservice.catalogItem && microservice.catalogItem.category === 'SYSTEM') { + throw new Errors.ValidationError(AppHelper.formatMessage(ErrorMessages.SYSTEM_MICROSERVICE_UPDATE, microserviceUuid)) + } + const microserviceConfig = _validateMicroserviceConfig(JSON.stringify(config)) + await MicroserviceManager.update(query, { config: microserviceConfig }, transaction) + const iofogUuid = microservice.iofogUuid + await ChangeTrackingService.update(iofogUuid, ChangeTrackingService.events.microserviceConfig, transaction) + return { + uuid: microserviceUuid + } +} + +async function getMicroserviceConfigEndPoint (microserviceUuid, isCLI, transaction) { + const query = isCLI + ? { + uuid: microserviceUuid + } + : { + uuid: microserviceUuid + } + const microservice = await MicroserviceManager.findOneWithCategory(query, transaction) + if (!microservice) { + throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.INVALID_MICROSERVICE_UUID, microserviceUuid)) + } + + if (microservice.catalogItem && microservice.catalogItem.category === 'SYSTEM') { + throw new Errors.ValidationError(AppHelper.formatMessage(ErrorMessages.SYSTEM_MICROSERVICE_UPDATE, microserviceUuid)) + } + const microserviceConfig = JSON.parse(microservice.config) + return { + config: microserviceConfig + } +} + +async function deleteMicroserviceConfigEndPoint (microserviceUuid, isCLI, transaction) { + const query = isCLI + ? { + uuid: microserviceUuid + } + : { + uuid: microserviceUuid + } + const microservice = await MicroserviceManager.findOneWithCategory(query, transaction) + if (!microservice) { + throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.INVALID_MICROSERVICE_UUID, microserviceUuid)) + } + if (microservice.catalogItem && microservice.catalogItem.category === 'SYSTEM') { + throw new Errors.ValidationError(AppHelper.formatMessage(ErrorMessages.SYSTEM_MICROSERVICE_UPDATE, microserviceUuid)) + } + const microserviceConfig = {} + await MicroserviceManager.update(query, { config: JSON.stringify(microserviceConfig) }, transaction) + const iofogUuid = microservice.iofogUuid + await ChangeTrackingService.update(iofogUuid, ChangeTrackingService.events.microserviceConfig, transaction) + return { + uuid: microserviceUuid + } +} + +async function getSystemMicroserviceConfigEndPoint (microserviceUuid, isCLI, transaction) { + const query = isCLI + ? { + uuid: microserviceUuid + } + : { + uuid: microserviceUuid + } + const microservice = await MicroserviceManager.findOneWithCategory(query, transaction) + if (!microservice) { + throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.INVALID_MICROSERVICE_UUID, microserviceUuid)) + } + if (!microservice.catalogItem || microservice.catalogItem.category !== 'SYSTEM') { + throw new Errors.ValidationError(AppHelper.formatMessage(ErrorMessages.SYSTEM_MICROSERVICE_UPDATE, microserviceUuid)) + } + const microserviceConfig = JSON.parse(microservice.config) + return { + config: microserviceConfig + } +} + +async function updateSystemMicroserviceConfigEndPoint (microserviceUuid, config, isCLI, transaction) { + const query = isCLI + ? { + uuid: microserviceUuid + } + : { + uuid: microserviceUuid + } + const microservice = await MicroserviceManager.findOneWithCategory(query, transaction) + if (!microservice) { + throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.INVALID_MICROSERVICE_UUID, microserviceUuid)) + } + if (!microservice.catalogItem || microservice.catalogItem.category !== 'SYSTEM') { + throw new Errors.ValidationError(AppHelper.formatMessage(ErrorMessages.SYSTEM_MICROSERVICE_UPDATE, microserviceUuid)) + } + const microserviceConfig = _validateMicroserviceConfig(JSON.stringify(config)) + await MicroserviceManager.update(query, { config: microserviceConfig }, transaction) + const iofogUuid = microservice.iofogUuid + await ChangeTrackingService.update(iofogUuid, ChangeTrackingService.events.microserviceConfig, transaction) + return { + uuid: microserviceUuid + } +} + +async function deleteSystemMicroserviceConfigEndPoint (microserviceUuid, isCLI, transaction) { + const query = isCLI + ? { + uuid: microserviceUuid + } + : { + uuid: microserviceUuid + } + const microservice = await MicroserviceManager.findOneWithCategory(query, transaction) + if (!microservice) { + throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.INVALID_MICROSERVICE_UUID, microserviceUuid)) + } + if (!microservice.catalogItem || microservice.catalogItem.category !== 'SYSTEM') { + throw new Errors.ValidationError(AppHelper.formatMessage(ErrorMessages.SYSTEM_MICROSERVICE_UPDATE, microserviceUuid)) + } + const microserviceConfig = {} + await MicroserviceManager.update(query, { config: JSON.stringify(microserviceConfig) }, transaction) + const iofogUuid = microservice.iofogUuid + await ChangeTrackingService.update(iofogUuid, ChangeTrackingService.events.microserviceConfig, transaction) + return { + uuid: microserviceUuid + } +} + async function rebuildMicroserviceEndPoint (microserviceUuid, isCLI, transaction) { const query = isCLI ? { @@ -2226,6 +2365,12 @@ module.exports = { listVolumeMappingsEndPoint: TransactionDecorator.generateTransaction(listVolumeMappingsEndPoint), updateMicroserviceEndPoint: TransactionDecorator.generateTransaction(updateMicroserviceEndPoint), updateSystemMicroserviceEndPoint: TransactionDecorator.generateTransaction(updateSystemMicroserviceEndPoint), + updateMicroserviceConfigEndPoint: TransactionDecorator.generateTransaction(updateMicroserviceConfigEndPoint), + getMicroserviceConfigEndPoint: TransactionDecorator.generateTransaction(getMicroserviceConfigEndPoint), + getSystemMicroserviceConfigEndPoint: TransactionDecorator.generateTransaction(getSystemMicroserviceConfigEndPoint), + deleteMicroserviceConfigEndPoint: TransactionDecorator.generateTransaction(deleteMicroserviceConfigEndPoint), + updateSystemMicroserviceConfigEndPoint: TransactionDecorator.generateTransaction(updateSystemMicroserviceConfigEndPoint), + deleteSystemMicroserviceConfigEndPoint: TransactionDecorator.generateTransaction(deleteSystemMicroserviceConfigEndPoint), rebuildMicroserviceEndPoint: TransactionDecorator.generateTransaction(rebuildMicroserviceEndPoint), rebuildSystemMicroserviceEndPoint: TransactionDecorator.generateTransaction(rebuildSystemMicroserviceEndPoint), buildGetMicroserviceResponse: _buildGetMicroserviceResponse, From 5cee3564222650f1eb093e97b7905c97d0c0648d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emirhan=20Durmu=C5=9F?= Date: Sun, 17 Aug 2025 12:37:09 +0300 Subject: [PATCH 173/178] viewer updated --- package-lock.json | 12 ++++++------ package.json | 4 ++-- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index 85cd0f6ee..4ffd08f57 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,16 +1,16 @@ { "name": "@datasance/iofogcontroller", - "version": "3.5.1", + "version": "3.5.2", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@datasance/iofogcontroller", - "version": "3.5.1", + "version": "3.5.2", "hasInstallScript": true, "license": "EPL-2.0", "dependencies": { - "@datasance/ecn-viewer": "1.0.1", + "@datasance/ecn-viewer": "1.0.2", "@kubernetes/client-node": "^0.22.3", "@msgpack/msgpack": "^3.1.2", "@opentelemetry/api": "^1.9.0", @@ -426,9 +426,9 @@ } }, "node_modules/@datasance/ecn-viewer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@datasance/ecn-viewer/-/ecn-viewer-1.0.1.tgz", - "integrity": "sha512-4q9oe599Y0omz6PI1uW6mzP1IzWncKsfYWi0mAE1iaDpEAaC24p0iLU+Gbsb6TzuBHFCLXgLmR4mUuWfT559Cw==" + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@datasance/ecn-viewer/-/ecn-viewer-1.0.2.tgz", + "integrity": "sha512-S1pV2BaobeI4NbOShI5RO/zfb6nWU+CRdCDVYj4cMC3s7FYtYNUZ5aCpgPFJksVy9hCkWdA1IO+DQ1fpB8tLNQ==" }, "node_modules/@eslint-community/eslint-utils": { "version": "4.7.0", diff --git a/package.json b/package.json index 9c562700c..5b0b5de36 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@datasance/iofogcontroller", - "version": "3.5.1", + "version": "3.5.2", "description": "ioFog Controller project for Datasance PoT @ datasance.com \\nCopyright (c) 2023 Datasance Teknoloji A.S.", "main": "./src/main.js", "author": "Emirhan Durmus", @@ -55,7 +55,7 @@ "iofog-controller": "src/main.js" }, "dependencies": { - "@datasance/ecn-viewer": "1.0.1", + "@datasance/ecn-viewer": "1.0.2", "@kubernetes/client-node": "^0.22.3", "@msgpack/msgpack": "^3.1.2", "@opentelemetry/api": "^1.9.0", From 826d2cca754d39dbe2f43c46d296e4276d6ed9b5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emirhan=20Durmu=C5=9F?= Date: Tue, 2 Sep 2025 20:27:30 +0300 Subject: [PATCH 174/178] viewer updated, ws exec session logic improved --- package-lock.json | 12 +- package.json | 4 +- src/routes/config.js | 2 +- src/websocket/server.js | 283 ++++++++++++++++++++++++++----- src/websocket/session-manager.js | 63 ++++++- 5 files changed, 301 insertions(+), 63 deletions(-) diff --git a/package-lock.json b/package-lock.json index 4ffd08f57..3f9900a05 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,16 +1,16 @@ { "name": "@datasance/iofogcontroller", - "version": "3.5.2", + "version": "3.5.3", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@datasance/iofogcontroller", - "version": "3.5.2", + "version": "3.5.3", "hasInstallScript": true, "license": "EPL-2.0", "dependencies": { - "@datasance/ecn-viewer": "1.0.2", + "@datasance/ecn-viewer": "1.1.0", "@kubernetes/client-node": "^0.22.3", "@msgpack/msgpack": "^3.1.2", "@opentelemetry/api": "^1.9.0", @@ -426,9 +426,9 @@ } }, "node_modules/@datasance/ecn-viewer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@datasance/ecn-viewer/-/ecn-viewer-1.0.2.tgz", - "integrity": "sha512-S1pV2BaobeI4NbOShI5RO/zfb6nWU+CRdCDVYj4cMC3s7FYtYNUZ5aCpgPFJksVy9hCkWdA1IO+DQ1fpB8tLNQ==" + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@datasance/ecn-viewer/-/ecn-viewer-1.1.0.tgz", + "integrity": "sha512-M6fcBo7hcx9ooyt//n5bVQMihCBBgn4xyCW4+2OtH+spKw2vu1tFUZWpSCe4C680jYOnECHB4ZkrI84p96wl7w==" }, "node_modules/@eslint-community/eslint-utils": { "version": "4.7.0", diff --git a/package.json b/package.json index 5b0b5de36..ac6cad5a9 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@datasance/iofogcontroller", - "version": "3.5.2", + "version": "3.5.3", "description": "ioFog Controller project for Datasance PoT @ datasance.com \\nCopyright (c) 2023 Datasance Teknoloji A.S.", "main": "./src/main.js", "author": "Emirhan Durmus", @@ -55,7 +55,7 @@ "iofog-controller": "src/main.js" }, "dependencies": { - "@datasance/ecn-viewer": "1.0.2", + "@datasance/ecn-viewer": "1.1.0", "@kubernetes/client-node": "^0.22.3", "@msgpack/msgpack": "^3.1.2", "@opentelemetry/api": "^1.9.0", diff --git a/src/routes/config.js b/src/routes/config.js index 366d42f21..60d6b347a 100644 --- a/src/routes/config.js +++ b/src/routes/config.js @@ -96,7 +96,7 @@ module.exports = [ ] // Add keycloak.protect() middleware to protect the route - await keycloak.protect(['SRE', 'Developer'])(req, res, async () => { + await keycloak.protect(['SRE'])(req, res, async () => { const upsertConfigElementEndpoint = ResponseDecorator.handleErrors(ConfigController.upsertConfigElementEndpoint, successCode, errorCodes) const responseObject = await upsertConfigElementEndpoint(req) const user = req.kauth.grant.access_token.content.preferred_username diff --git a/src/websocket/server.js b/src/websocket/server.js index 112e3aa2c..57aea7ff3 100644 --- a/src/websocket/server.js +++ b/src/websocket/server.js @@ -463,17 +463,44 @@ class WebSocketServer { } } + async getPendingAgentExecIdsFromDB (microserviceUuid, transaction) { + try { + const pendingExecStatus = await MicroserviceExecStatusManager.findAllExcludeFields( + { + microserviceUuid: microserviceUuid, + status: microserviceExecState.PENDING + }, + transaction + ) + + const execIds = pendingExecStatus.map(status => status.execSessionId) + logger.debug('Database query for pending agents:' + JSON.stringify({ + microserviceUuid, + foundExecIds: execIds, + count: execIds.length + })) + + return execIds + } catch (error) { + logger.error('Failed to query database for pending agents:' + JSON.stringify({ + error: error.message, + microserviceUuid + })) + return [] + } + } + async handleUserConnection (ws, req, token, microserviceUuid, transaction) { try { - const { execSessionId } = await this.validateUserConnection(token, microserviceUuid, transaction) - logger.info('User connection: available execSessionId:' + execSessionId) + await this.validateUserConnection(token, microserviceUuid, transaction) + logger.info('User connection validated successfully for microservice:' + microserviceUuid) // Check if there's already an active session for this microservice const existingSession = Array.from(this.sessionManager.sessions.values()) .find(session => session.microserviceUuid === microserviceUuid && session.user && session.user.readyState === WebSocket.OPEN) if (existingSession) { - logger.error('Microservice has already active exec session:' + JSON.stringify({ + logger.debug('Microservice has already active exec session:' + JSON.stringify({ microserviceUuid, existingExecId: existingSession.execId })) @@ -481,61 +508,210 @@ class WebSocketServer { return } - // Get all active execIds - const activeExecIds = Array.from(this.sessionManager.sessions.keys()) - logger.info('Currently active execIds:' + JSON.stringify(activeExecIds)) + // Get pending agent execIds from database (multi-replica compatible) + const pendingAgentExecIds = await this.getPendingAgentExecIdsFromDB(microserviceUuid, transaction) + logger.info('Pending agent execIds from database:' + JSON.stringify(pendingAgentExecIds)) + + // Simplified logic: find any available pending agent + const hasPendingAgents = pendingAgentExecIds.length > 0 + + if (hasPendingAgents) { + // Find any available pending agent + const availableExecId = pendingAgentExecIds[0] + const pendingAgent = this.sessionManager.findPendingAgentForExecId(microserviceUuid, availableExecId) + + if (pendingAgent) { + // Activate session using agent's execId + const session = this.sessionManager.tryActivateSession(microserviceUuid, availableExecId, ws, false, transaction) + if (session) { + logger.info('Session activated for user:', { + execId: availableExecId, + microserviceUuid, + userState: ws.readyState, + agentState: pendingAgent.readyState + }) + this.setupMessageForwarding(availableExecId, transaction) + return + } + } + } - // Get pending agent execIds - const pendingAgentExecIds = this.sessionManager.getPendingAgentExecIds(microserviceUuid) - logger.info('Pending agent execIds:' + JSON.stringify(pendingAgentExecIds)) + // If we reach here, either no pending agent or activation failed + // Add user to pending list to wait for agent + logger.info('No immediate agent available, adding user to pending list:' + JSON.stringify({ + microserviceUuid, + hasPendingAgents, + pendingAgentCount: pendingAgentExecIds.length + })) + this.sessionManager.addPendingUser(microserviceUuid, ws) + + // IMMEDIATE RE-CHECK: Look for any newly available agents after adding user (database query) + const retryPendingAgents = await this.getPendingAgentExecIdsFromDB(microserviceUuid, transaction) + if (retryPendingAgents.length > 0) { + logger.info('Found available agent after adding user, attempting immediate activation:' + JSON.stringify({ + microserviceUuid, + availableExecIds: retryPendingAgents + })) - // Find an available execId that is both not active AND has a pending agent - const availableExecId = execSessionId && !activeExecIds.includes(execSessionId) && pendingAgentExecIds.includes(execSessionId) - ? execSessionId - : null + // Try to activate session with first available agent + const availableExecId = retryPendingAgents[0] + const pendingAgent = this.sessionManager.findPendingAgentForExecId(microserviceUuid, availableExecId) + + if (pendingAgent) { + const session = this.sessionManager.tryActivateSession(microserviceUuid, availableExecId, ws, false, transaction) + if (session) { + logger.info('Session activated immediately after re-check:' + JSON.stringify({ + execId: availableExecId, + microserviceUuid, + userState: ws.readyState, + agentState: pendingAgent.readyState + })) - if (!availableExecId) { - logger.error('No available exec session for user') - ws.close(1008, 'No available exec session for this microservice.') - return + this.setupMessageForwarding(availableExecId, transaction) + return // Exit early, session activated successfully + } + } } - logger.info('User assigned execId:' + availableExecId) - // Check if there's a pending agent with this execId - const pendingAgent = this.sessionManager.findPendingAgentForExecId(microserviceUuid, availableExecId) - if (pendingAgent) { - logger.info('Found pending agent for execId:' + JSON.stringify({ - execId: availableExecId, + // Only proceed with timeout mechanism if we still couldn't activate + logger.info('No immediate agent available after re-check, proceeding with timeout mechanism') + + // Send status message to user when added to pending using STDERR + try { + const statusMsg = { + type: MESSAGE_TYPES.STDERR, + data: Buffer.from('Waiting for agent connection. Please ensure the microservice agent is running.\n'), + microserviceUuid: microserviceUuid, + execId: 'pending', // Since we don't have execSessionId anymore + timestamp: Date.now() + } + const encoded = this.encodeMessage(statusMsg) + ws.send(encoded, { + binary: true, + compress: false, + mask: false, + fin: true + }) + logger.info('Sent waiting status message to user:' + JSON.stringify({ microserviceUuid, - agentState: pendingAgent.readyState + messageType: 'STDERR', + encodedLength: encoded.length })) - // Try to activate session with the selected execId - const session = this.sessionManager.tryActivateSession(microserviceUuid, availableExecId, ws, false, transaction) - if (session) { - logger.info('Session activated for user:', { - execId: availableExecId, + } catch (error) { + logger.warn('Failed to send status message to user:' + JSON.stringify({ + error: error.message, + microserviceUuid + })) + } + + // Start periodic retry timer for pending users (every 10 seconds) + const RETRY_INTERVAL = 10000 + const startTime = Date.now() + const retryTimer = setInterval(async () => { + if (this.sessionManager.isUserStillPending(microserviceUuid, ws)) { + logger.debug('Periodic retry: checking for available agents:' + JSON.stringify({ microserviceUuid, - userState: ws.readyState, - agentState: pendingAgent.readyState - }) - this.setupMessageForwarding(availableExecId, transaction) + retryCount: Math.floor((Date.now() - startTime) / RETRY_INTERVAL) + })) + + try { + const periodicRetryExecIds = await this.getPendingAgentExecIdsFromDB(microserviceUuid, transaction) + if (periodicRetryExecIds.length > 0) { + logger.info('Periodic retry found available agent:' + JSON.stringify({ + microserviceUuid, + availableExecIds: periodicRetryExecIds + })) + + // Attempt session activation with first available agent + const availableExecId = periodicRetryExecIds[0] + const pendingAgent = this.sessionManager.findPendingAgentForExecId(microserviceUuid, availableExecId) + + if (pendingAgent) { + const session = this.sessionManager.tryActivateSession(microserviceUuid, availableExecId, ws, false, transaction) + if (session) { + logger.info('Session activated via periodic retry:' + JSON.stringify({ + execId: availableExecId, + microserviceUuid, + userState: ws.readyState, + agentState: pendingAgent.readyState + })) + + this.setupMessageForwarding(availableExecId, transaction) + clearInterval(retryTimer) // Stop retry timer + return // Exit early, session activated successfully + } + } + } + } catch (retryError) { + logger.warn('Periodic retry failed:' + JSON.stringify({ + error: retryError.message, + microserviceUuid + })) + } } else { - logger.info('Failed to activate session with pending agent:' + JSON.stringify({ - execId: availableExecId, + // User no longer pending, clear retry timer + clearInterval(retryTimer) + } + }, RETRY_INTERVAL) + + // Store timer reference for cleanup + this.sessionManager.setUserRetryTimer(microserviceUuid, ws, retryTimer) + + // Add timeout mechanism for pending users (60 seconds) + const PENDING_USER_TIMEOUT = 60000 + setTimeout(() => { + if (this.sessionManager.isUserStillPending(microserviceUuid, ws)) { + logger.warn('Pending user timeout, closing connection:' + JSON.stringify({ microserviceUuid, - userState: ws.readyState, - agentState: pendingAgent.readyState + timeout: PENDING_USER_TIMEOUT })) - this.sessionManager.addPendingUser(microserviceUuid, ws) + + // Send timeout message before closing + try { + const timeoutMsg = { + type: MESSAGE_TYPES.STDERR, + data: Buffer.from('Timeout waiting for agent connection. Please try again.\n'), + microserviceUuid: microserviceUuid, + execId: 'pending', // Since we don't have execSessionId anymore + timestamp: Date.now() + } + const encoded = this.encodeMessage(timeoutMsg) + ws.send(encoded, { + binary: true, + compress: false, + mask: false, + fin: true + }) + logger.info('Sent timeout message to user:' + JSON.stringify({ + microserviceUuid, + messageType: 'STDERR', + encodedLength: encoded.length + })) + } catch (timeoutError) { + logger.warn('Failed to send timeout message to user:' + JSON.stringify({ + error: timeoutError.message, + microserviceUuid + })) + } + + try { + ws.close(1008, 'Timeout waiting for agent connection') + } catch (closeError) { + logger.error('Error closing timed out user connection:' + JSON.stringify({ + error: closeError.message, + microserviceUuid + })) + } + // Clear retry timer before removing user + const retryTimer = this.sessionManager.getUserRetryTimer(microserviceUuid, ws) + if (retryTimer) { + clearInterval(retryTimer) + this.sessionManager.clearUserRetryTimer(microserviceUuid, ws) + } + + this.sessionManager.removePendingUser(microserviceUuid, ws) } - } else { - logger.info('No pending agent found for user, waiting:' + JSON.stringify({ - execId: availableExecId, - microserviceUuid, - userState: ws.readyState - })) - this.sessionManager.addPendingUser(microserviceUuid, ws) - } + }, PENDING_USER_TIMEOUT) ws.on('close', () => { for (const [execId, session] of this.sessionManager.sessions) { @@ -543,6 +719,14 @@ class WebSocketServer { this.cleanupSession(execId, transaction) } } + + // Clear retry timer before removing user + const retryTimer = this.sessionManager.getUserRetryTimer(microserviceUuid, ws) + if (retryTimer) { + clearInterval(retryTimer) + this.sessionManager.clearUserRetryTimer(microserviceUuid, ws) + } + this.sessionManager.removePendingUser(microserviceUuid, ws) logger.info('User WebSocket disconnected:' + JSON.stringify({ microserviceUuid, @@ -923,6 +1107,11 @@ class WebSocketServer { } // For non-system, SRE or Developer is already checked above + // Check if microservice exec is enabled + if (!microservice.execEnabled) { + throw new Errors.ValidationError('Microservice exec is not enabled') + } + const execStatusArr = await MicroserviceExecStatusManager.findAllExcludeFields({ microserviceUuid: microserviceUuid }, transaction) if (!execStatusArr || execStatusArr.length === 0) { throw new Errors.NotFoundError('Microservice exec status not found') @@ -937,7 +1126,7 @@ class WebSocketServer { throw new Errors.ValidationError('Microservice already has an active session') } - return { execSessionId: execStatus.execSessionId } + return { success: true } // Just indicate validation passed } catch (error) { logger.error('User connection validation failed:' + JSON.stringify({ error: error.message, stack: error.stack })) throw error diff --git a/src/websocket/session-manager.js b/src/websocket/session-manager.js index a9a148be3..cc92bf145 100644 --- a/src/websocket/session-manager.js +++ b/src/websocket/session-manager.js @@ -15,6 +15,7 @@ class SessionManager { this.sessions = new Map() this.pendingUsers = new Map() // Map> this.pendingAgents = new Map() // Map> + this.userRetryTimers = new Map() // Map> this.config = config this.cleanupInterval = null logger.info('SessionManager initialized with config:' + JSON.stringify({ @@ -66,12 +67,14 @@ class SessionManager { addPendingUser (microserviceUuid, userWs) { if (!this.pendingUsers.has(microserviceUuid)) { - this.pendingUsers.set(microserviceUuid, new Set()) + this.pendingUsers.set(microserviceUuid, new Map()) } - this.pendingUsers.get(microserviceUuid).add(userWs) + const users = this.pendingUsers.get(microserviceUuid) + users.set(userWs, { timestamp: Date.now() }) + logger.info('Added pending user:' + JSON.stringify({ microserviceUuid, - pendingUserCount: this.pendingUsers.get(microserviceUuid).size + pendingUserCount: users.size })) } @@ -119,6 +122,10 @@ class SessionManager { if (users.size === 0) { this.pendingUsers.delete(microserviceUuid) } + + // Clear retry timer when removing user + this.clearUserRetryTimer(microserviceUuid, userWs) + logger.info('Removed pending user:' + JSON.stringify({ microserviceUuid, remainingUsers: users.size @@ -151,9 +158,8 @@ class SessionManager { findPendingUserForExecId (microserviceUuid, execId) { if (this.pendingUsers.has(microserviceUuid)) { const users = this.pendingUsers.get(microserviceUuid) - // Return the first available user since we don't store execId with users - // The execId will be assigned when creating the session - for (const userWs of users) { + // Find any available user (no execId matching needed) + for (const [userWs] of users.entries()) { if (userWs.readyState === WebSocket.OPEN) { return userWs } @@ -193,6 +199,11 @@ class SessionManager { userState: pendingUser.readyState, agentState: newConnection.readyState })) + await MicroserviceExecStatusManager.update( + { microserviceUuid: microserviceUuid }, + { execSessionId: execId, status: microserviceExecState.ACTIVE }, + transaction + ) } else { await this.addPendingAgent(microserviceUuid, execId, newConnection, transaction) logger.info('No pending user found for agent, added to pending list:' + JSON.stringify({ @@ -265,7 +276,11 @@ class SessionManager { for (const [microserviceUuid, users] of this.pendingUsers) { logger.info(JSON.stringify({ microserviceUuid, - count: users.size + count: users.size, + users: Array.from(users.entries()).map(([ws, info]) => ({ + timestamp: new Date(info.timestamp).toISOString(), + readyState: ws.readyState + })) })) } logger.info('Pending agents:') @@ -490,6 +505,40 @@ class SessionManager { } return [] } + + isUserStillPending (microserviceUuid, userWs) { + if (this.pendingUsers.has(microserviceUuid)) { + const users = this.pendingUsers.get(microserviceUuid) + return users.has(userWs) + } + return false + } + + setUserRetryTimer (microserviceUuid, userWs, timer) { + if (!this.userRetryTimers.has(microserviceUuid)) { + this.userRetryTimers.set(microserviceUuid, new Map()) + } + const timers = this.userRetryTimers.get(microserviceUuid) + timers.set(userWs, timer) + } + + getUserRetryTimer (microserviceUuid, userWs) { + if (this.userRetryTimers.has(microserviceUuid)) { + const timers = this.userRetryTimers.get(microserviceUuid) + return timers.get(userWs) + } + return null + } + + clearUserRetryTimer (microserviceUuid, userWs) { + if (this.userRetryTimers.has(microserviceUuid)) { + const timers = this.userRetryTimers.get(microserviceUuid) + timers.delete(userWs) + if (timers.size === 0) { + this.userRetryTimers.delete(microserviceUuid) + } + } + } } module.exports = SessionManager From a09bbcfcda7d394b646c7623199935394027900e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emirhan=20Durmu=C5=9F?= Date: Wed, 3 Sep 2025 15:41:58 +0300 Subject: [PATCH 175/178] viewer version updated --- package-lock.json | 8 ++++---- package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index 3f9900a05..dafedaa4d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,7 +10,7 @@ "hasInstallScript": true, "license": "EPL-2.0", "dependencies": { - "@datasance/ecn-viewer": "1.1.0", + "@datasance/ecn-viewer": "1.1.1", "@kubernetes/client-node": "^0.22.3", "@msgpack/msgpack": "^3.1.2", "@opentelemetry/api": "^1.9.0", @@ -426,9 +426,9 @@ } }, "node_modules/@datasance/ecn-viewer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@datasance/ecn-viewer/-/ecn-viewer-1.1.0.tgz", - "integrity": "sha512-M6fcBo7hcx9ooyt//n5bVQMihCBBgn4xyCW4+2OtH+spKw2vu1tFUZWpSCe4C680jYOnECHB4ZkrI84p96wl7w==" + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@datasance/ecn-viewer/-/ecn-viewer-1.1.1.tgz", + "integrity": "sha512-moXxmZgIxfvwvE1HySLQ5iH32L+4qBoVRv8XyAPOu+2W4lJf6wPmTpVMdoplHEad0SV5Fh9wL7ak+FaZJtXluA==" }, "node_modules/@eslint-community/eslint-utils": { "version": "4.7.0", diff --git a/package.json b/package.json index ac6cad5a9..e24f89992 100644 --- a/package.json +++ b/package.json @@ -55,7 +55,7 @@ "iofog-controller": "src/main.js" }, "dependencies": { - "@datasance/ecn-viewer": "1.1.0", + "@datasance/ecn-viewer": "1.1.1", "@kubernetes/client-node": "^0.22.3", "@msgpack/msgpack": "^3.1.2", "@opentelemetry/api": "^1.9.0", From dc7b303526f84641c534c82e356bcc87e18401e9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emirhan=20Durmu=C5=9F?= Date: Tue, 16 Sep 2025 22:29:10 +0300 Subject: [PATCH 176/178] auto change tracking added to agent provision, viewer version upgraded, ws session token extraction and ping/pong logic updated for viewer integration, --- package-lock.json | 20 +++++++-------- package.json | 6 ++--- src/services/agent-service.js | 4 +++ src/websocket/server.js | 47 ++++++++++++++++++++++++++++++++--- 4 files changed, 61 insertions(+), 16 deletions(-) diff --git a/package-lock.json b/package-lock.json index dafedaa4d..0224fbf9b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,16 +1,16 @@ { "name": "@datasance/iofogcontroller", - "version": "3.5.3", + "version": "3.5.4", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@datasance/iofogcontroller", - "version": "3.5.3", + "version": "3.5.4", "hasInstallScript": true, "license": "EPL-2.0", "dependencies": { - "@datasance/ecn-viewer": "1.1.1", + "@datasance/ecn-viewer": "1.1.2", "@kubernetes/client-node": "^0.22.3", "@msgpack/msgpack": "^3.1.2", "@opentelemetry/api": "^1.9.0", @@ -19,7 +19,7 @@ "@opentelemetry/instrumentation-http": "^0.200.0", "@opentelemetry/resources": "^1.8.0", "@opentelemetry/sdk-node": "^0.200.0", - "axios": "1.11.0", + "axios": "1.12.2", "bignumber.js": "^9.3.0", "body-parser": "^1.20.3", "child_process": "1.0.2", @@ -426,9 +426,9 @@ } }, "node_modules/@datasance/ecn-viewer": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@datasance/ecn-viewer/-/ecn-viewer-1.1.1.tgz", - "integrity": "sha512-moXxmZgIxfvwvE1HySLQ5iH32L+4qBoVRv8XyAPOu+2W4lJf6wPmTpVMdoplHEad0SV5Fh9wL7ak+FaZJtXluA==" + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@datasance/ecn-viewer/-/ecn-viewer-1.1.2.tgz", + "integrity": "sha512-JQTwGyqzhqK+oT1NyA2ngo7ZjWDTaxbBZL+obKHhdNoOXmrYB3VzEIdM/uCmGJvCYp14zgIRzWFS9O4E2/TUyg==" }, "node_modules/@eslint-community/eslint-utils": { "version": "4.7.0", @@ -2894,9 +2894,9 @@ "dev": true }, "node_modules/axios": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.11.0.tgz", - "integrity": "sha512-1Lx3WLFQWm3ooKDYZD1eXmoGO9fxYQjrycfHFC8P0sCfQVXyROp0p9PFWBehewBOdCwHc+f/b8I0fMto5eSfwA==", + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.12.2.tgz", + "integrity": "sha512-vMJzPewAlRyOgxV2dU0Cuz2O8zzzx9VYtbJOaBgXFeLc4IV/Eg50n4LowmehOOR61S8ZMpc2K5Sa7g6A4jfkUw==", "dependencies": { "follow-redirects": "^1.15.6", "form-data": "^4.0.4", diff --git a/package.json b/package.json index e24f89992..d37d5a084 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@datasance/iofogcontroller", - "version": "3.5.3", + "version": "3.5.4", "description": "ioFog Controller project for Datasance PoT @ datasance.com \\nCopyright (c) 2023 Datasance Teknoloji A.S.", "main": "./src/main.js", "author": "Emirhan Durmus", @@ -55,7 +55,7 @@ "iofog-controller": "src/main.js" }, "dependencies": { - "@datasance/ecn-viewer": "1.1.1", + "@datasance/ecn-viewer": "1.1.2", "@kubernetes/client-node": "^0.22.3", "@msgpack/msgpack": "^3.1.2", "@opentelemetry/api": "^1.9.0", @@ -64,7 +64,7 @@ "@opentelemetry/instrumentation-http": "^0.200.0", "@opentelemetry/resources": "^1.8.0", "@opentelemetry/sdk-node": "^0.200.0", - "axios": "1.11.0", + "axios": "1.12.2", "bignumber.js": "^9.3.0", "body-parser": "^1.20.3", "child_process": "1.0.2", diff --git a/src/services/agent-service.js b/src/services/agent-service.js index 24fb00809..b8bf45128 100644 --- a/src/services/agent-service.js +++ b/src/services/agent-service.js @@ -95,6 +95,10 @@ const agentProvision = async function (provisionData, transaction) { provisionKey: provisionData.key }, transaction) + await ChangeTrackingService.update(fog.uuid, ChangeTrackingService.events.volumeMounts, transaction) + await ChangeTrackingService.update(fog.uuid, ChangeTrackingService.events.registries, transaction) + await ChangeTrackingService.update(fog.uuid, ChangeTrackingService.events.microserviceFull, transaction) + return { uuid: fog.uuid, privateKey: keyPair.privateKey diff --git a/src/websocket/server.js b/src/websocket/server.js index 57aea7ff3..a44c8be43 100644 --- a/src/websocket/server.js +++ b/src/websocket/server.js @@ -267,9 +267,23 @@ class WebSocketServer { // Wrap the entire connection handling in a transaction TransactionDecorator.generateTransaction(async (transaction) => { try { - const token = req.headers.authorization + // Check for token in Authorization header first (for agent and CLI connections) + let token = req.headers.authorization + + // If no token in header, check query parameters (for React UI connections) + if (!token) { + logger.debug('Missing authentication token in header, checking query parameters') + const url = new URL(req.url, `http://${req.headers.host}`) + token = url.searchParams.get('token') + + // If token is found in query params, format it as Bearer token + if (token) { + token = `Bearer ${token}` + } + } + if (!token) { - logger.error('WebSocket connection failed: Missing authentication token') + logger.error('WebSocket connection failed: Missing authentication token neither in header nor query parameters') try { ws.close(1008, 'Missing authentication token') } catch (error) { @@ -580,7 +594,7 @@ class WebSocketServer { try { const statusMsg = { type: MESSAGE_TYPES.STDERR, - data: Buffer.from('Waiting for agent connection. Please ensure the microservice agent is running.\n'), + data: Buffer.from('Waiting for agent connection. Please ensure the microservice/agent is running.\n'), microserviceUuid: microserviceUuid, execId: 'pending', // Since we don't have execSessionId anymore timestamp: Date.now() @@ -878,6 +892,33 @@ class WebSocketServer { return } + if (msg.type === MESSAGE_TYPES.CONTROL) { + // Handle keep-alive messages from user + const controlData = msg.data.toString() + if (controlData === 'keepalive') { + // Send keep-alive response back to user + const keepAliveResponse = { + type: MESSAGE_TYPES.CONTROL, + data: Buffer.from('keepalive'), + microserviceUuid: session.microserviceUuid, + execId: execId, + timestamp: Date.now() + } + const encoded = this.encodeMessage(keepAliveResponse) + user.send(encoded, { + binary: true, + compress: false, + mask: false, + fin: true + }) + logger.debug('[RELAY] Sent keep-alive response to user:' + JSON.stringify({ + execId, + microserviceUuid: session.microserviceUuid + })) + return // Don't forward keep-alive to agent + } + } + await this.sendMessageToAgent(agent, msg, execId, session.microserviceUuid) } catch (error) { logger.error('[RELAY] Failed to process binary message:' + JSON.stringify({ From e1cde1e49fd5ef04acc4b24145345c45f553102d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emirhan=20Durmu=C5=9F?= Date: Thu, 18 Sep 2025 22:49:18 +0300 Subject: [PATCH 177/178] viewer updated --- package-lock.json | 12 ++++++------ package.json | 4 ++-- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index 0224fbf9b..172b64abe 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,16 +1,16 @@ { "name": "@datasance/iofogcontroller", - "version": "3.5.4", + "version": "3.5.5", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@datasance/iofogcontroller", - "version": "3.5.4", + "version": "3.5.5", "hasInstallScript": true, "license": "EPL-2.0", "dependencies": { - "@datasance/ecn-viewer": "1.1.2", + "@datasance/ecn-viewer": "1.2.0", "@kubernetes/client-node": "^0.22.3", "@msgpack/msgpack": "^3.1.2", "@opentelemetry/api": "^1.9.0", @@ -426,9 +426,9 @@ } }, "node_modules/@datasance/ecn-viewer": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@datasance/ecn-viewer/-/ecn-viewer-1.1.2.tgz", - "integrity": "sha512-JQTwGyqzhqK+oT1NyA2ngo7ZjWDTaxbBZL+obKHhdNoOXmrYB3VzEIdM/uCmGJvCYp14zgIRzWFS9O4E2/TUyg==" + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@datasance/ecn-viewer/-/ecn-viewer-1.2.0.tgz", + "integrity": "sha512-n/2FHs2xTtG+ePxMdwHrK1B61wkJ2tN2K5F8OYS5t3THa7/pSzRYKx76xZ3b5sazWSiwQaNt+C7cU5tT67G3CA==" }, "node_modules/@eslint-community/eslint-utils": { "version": "4.7.0", diff --git a/package.json b/package.json index d37d5a084..fcf826da2 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@datasance/iofogcontroller", - "version": "3.5.4", + "version": "3.5.5", "description": "ioFog Controller project for Datasance PoT @ datasance.com \\nCopyright (c) 2023 Datasance Teknoloji A.S.", "main": "./src/main.js", "author": "Emirhan Durmus", @@ -55,7 +55,7 @@ "iofog-controller": "src/main.js" }, "dependencies": { - "@datasance/ecn-viewer": "1.1.2", + "@datasance/ecn-viewer": "1.2.0", "@kubernetes/client-node": "^0.22.3", "@msgpack/msgpack": "^3.1.2", "@opentelemetry/api": "^1.9.0", From b6f0229f7d5b9d31183f7c5a69036a278dfb6d07 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emirhan=20Durmu=C5=9F?= Date: Tue, 30 Sep 2025 12:12:24 +0300 Subject: [PATCH 178/178] microservice start/stop, missing edgeguardfrequency spec added to create/update fog endpoints, a new config/gps enpoint for agents, ecn viewer upgraded, minor fixes. --- docs/swagger.yaml | 93 +++++++++++++++++++ package-lock.json | 12 +-- package.json | 4 +- src/controllers/agent-controller.js | 7 ++ src/controllers/microservices-controller.js | 14 ++- src/data/managers/microservice-manager.js | 11 ++- ....0.3.sql => db_migration_mysql_v1.0.4.sql} | 2 + ..._v1.0.3.sql => db_migration_pg_v1.0.4.sql} | 4 +- ...0.3.sql => db_migration_sqlite_v1.0.4.sql} | 4 +- src/data/models/microservice.js | 5 + src/data/providers/database-provider.js | 12 +-- src/helpers/error-messages.js | 1 + src/jobs/stopped-app-status-job.js | 50 ++++++++-- src/routes/agent.js | 29 ++++++ src/routes/microservices.js | 70 ++++++++++++++ src/schemas/agent.js | 12 ++- src/services/agent-service.js | 70 ++++++++------ src/services/iofog-service.js | 15 ++- src/services/microservices-service.js | 48 +++++++++- 19 files changed, 408 insertions(+), 55 deletions(-) rename src/data/migrations/mysql/{db_migration_mysql_v1.0.3.sql => db_migration_mysql_v1.0.4.sql} (99%) rename src/data/migrations/postgres/{db_migration_pg_v1.0.3.sql => db_migration_pg_v1.0.4.sql} (99%) rename src/data/migrations/sqlite/{db_migration_sqlite_v1.0.3.sql => db_migration_sqlite_v1.0.4.sql} (99%) diff --git a/docs/swagger.yaml b/docs/swagger.yaml index c36985ad3..c7b830427 100755 --- a/docs/swagger.yaml +++ b/docs/swagger.yaml @@ -1000,6 +1000,34 @@ paths: description: Not Authorized "500": description: Internal Server Error + /agent/config/gps: + patch: + tags: + - Agent + summary: Updates an ioFog node GPS configuration + operationId: updateIOFogNodeGps + security: + - authToken: [] + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/IOFogNodeGpsRequest" + required: true + responses: + "204": + description: Success + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + "400": + description: Bad Request + "401": + description: Not Authorized + "500": + description: Internal Server Error /agent/config/changes: get: tags: @@ -2609,6 +2637,64 @@ paths: description: Not Found "500": description: Internal Server Error + "/microservices/{uuid}/start": + patch: + tags: + - Microservices + summary: Starts a microservice + operationId: startMicroservice + parameters: + - in: path + name: uuid + description: Microservice Uuid + required: true + schema: + type: string + security: + - authToken: [] + responses: + "204": + description: Success + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + "401": + description: Not Authorized + "404": + description: Not Found + "500": + description: Internal Server Error + "/microservices/{uuid}/stop": + patch: + tags: + - Microservices + summary: Stops a microservice + operationId: stopMicroservice + parameters: + - in: path + name: uuid + description: Microservice Uuid + required: true + schema: + type: string + security: + - authToken: [] + responses: + "204": + description: Success + headers: + X-Timestamp: + description: FogController server timestamp + schema: + type: number + "401": + description: Not Authorized + "404": + description: Not Found + "500": + description: Internal Server Error "/microservices/{uuid}/exec": post: tags: @@ -5786,6 +5872,13 @@ components: type: number dockerPruningFrequency: type: number + IOFogNodeGpsRequest: + type: object + properties: + latitude: + type: number + longitude: + type: number AgentStatus: type: object properties: diff --git a/package-lock.json b/package-lock.json index 172b64abe..0ab344b84 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,16 +1,16 @@ { "name": "@datasance/iofogcontroller", - "version": "3.5.5", + "version": "3.5.6", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@datasance/iofogcontroller", - "version": "3.5.5", + "version": "3.5.6", "hasInstallScript": true, "license": "EPL-2.0", "dependencies": { - "@datasance/ecn-viewer": "1.2.0", + "@datasance/ecn-viewer": "1.2.1", "@kubernetes/client-node": "^0.22.3", "@msgpack/msgpack": "^3.1.2", "@opentelemetry/api": "^1.9.0", @@ -426,9 +426,9 @@ } }, "node_modules/@datasance/ecn-viewer": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@datasance/ecn-viewer/-/ecn-viewer-1.2.0.tgz", - "integrity": "sha512-n/2FHs2xTtG+ePxMdwHrK1B61wkJ2tN2K5F8OYS5t3THa7/pSzRYKx76xZ3b5sazWSiwQaNt+C7cU5tT67G3CA==" + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@datasance/ecn-viewer/-/ecn-viewer-1.2.1.tgz", + "integrity": "sha512-l7st68cRAJIHfKQq3NOY6kV5dCU6kTHS/CnZCnxnC2i4GJcjVgWNgCo9IdS+gLkgVPL9Xh68VnndW/fYyd057Q==" }, "node_modules/@eslint-community/eslint-utils": { "version": "4.7.0", diff --git a/package.json b/package.json index fcf826da2..c84a80645 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@datasance/iofogcontroller", - "version": "3.5.5", + "version": "3.5.6", "description": "ioFog Controller project for Datasance PoT @ datasance.com \\nCopyright (c) 2023 Datasance Teknoloji A.S.", "main": "./src/main.js", "author": "Emirhan Durmus", @@ -55,7 +55,7 @@ "iofog-controller": "src/main.js" }, "dependencies": { - "@datasance/ecn-viewer": "1.2.0", + "@datasance/ecn-viewer": "1.2.1", "@kubernetes/client-node": "^0.22.3", "@msgpack/msgpack": "^3.1.2", "@opentelemetry/api": "^1.9.0", diff --git a/src/controllers/agent-controller.js b/src/controllers/agent-controller.js index c77ca4cad..404be92ce 100644 --- a/src/controllers/agent-controller.js +++ b/src/controllers/agent-controller.js @@ -36,6 +36,12 @@ const updateAgentConfigEndPoint = async function (req, fog) { return AgentService.updateAgentConfig(updateData, fog) } +const updateAgentGpsEndPoint = async function (req, fog) { + const updateData = req.body + + return AgentService.updateAgentGpsEndPoint(updateData, fog) +} + const getAgentConfigChangesEndPoint = async function (req, fog) { return AgentService.getAgentConfigChanges(fog) } @@ -123,6 +129,7 @@ module.exports = { agentDeprovisionEndPoint: AuthDecorator.checkFogToken(agentDeprovisionEndPoint), getAgentConfigEndPoint: AuthDecorator.checkFogToken(getAgentConfigEndPoint), updateAgentConfigEndPoint: AuthDecorator.checkFogToken(updateAgentConfigEndPoint), + updateAgentGpsEndPoint: AuthDecorator.checkFogToken(updateAgentGpsEndPoint), getAgentConfigChangesEndPoint: AuthDecorator.checkFogToken(getAgentConfigChangesEndPoint), updateAgentStatusEndPoint: AuthDecorator.checkFogToken(updateAgentStatusEndPoint), getAgentMicroservicesEndPoint: AuthDecorator.checkFogToken(getAgentMicroservicesEndPoint), diff --git a/src/controllers/microservices-controller.js b/src/controllers/microservices-controller.js index 302a0fc84..7fa9b677c 100644 --- a/src/controllers/microservices-controller.js +++ b/src/controllers/microservices-controller.js @@ -241,6 +241,16 @@ const deleteSystemMicroserviceExecEndPoint = async function (req) { return MicroservicesService.deleteSystemExecEndPoint(uuid, false) } +const startMicroserviceEndPoint = async function (req) { + const uuid = req.params.uuid + return MicroservicesService.startMicroserviceEndPoint(uuid, false) +} + +const stopMicroserviceEndPoint = async function (req) { + const uuid = req.params.uuid + return MicroservicesService.stopMicroserviceEndPoint(uuid, false) +} + module.exports = { createMicroserviceOnFogEndPoint: (createMicroserviceOnFogEndPoint), getMicroserviceEndPoint: (getMicroserviceEndPoint), @@ -278,5 +288,7 @@ module.exports = { createMicroserviceExecEndPoint: (createMicroserviceExecEndPoint), deleteMicroserviceExecEndPoint: (deleteMicroserviceExecEndPoint), createSystemMicroserviceExecEndPoint: (createSystemMicroserviceExecEndPoint), - deleteSystemMicroserviceExecEndPoint: (deleteSystemMicroserviceExecEndPoint) + deleteSystemMicroserviceExecEndPoint: (deleteSystemMicroserviceExecEndPoint), + startMicroserviceEndPoint: (startMicroserviceEndPoint), + stopMicroserviceEndPoint: (stopMicroserviceEndPoint) } diff --git a/src/data/managers/microservice-manager.js b/src/data/managers/microservice-manager.js index 573aa7d28..6c50fcd07 100644 --- a/src/data/managers/microservice-manager.js +++ b/src/data/managers/microservice-manager.js @@ -31,6 +31,7 @@ const Application = models.Application const Routing = models.Routing const Registry = models.Registry const MicroserviceStatus = models.MicroserviceStatus +const MicroserviceExecStatus = models.MicroserviceExecStatus const MicroserviceHealthCheck = models.MicroserviceHealthCheck const Op = require('sequelize').Op @@ -272,7 +273,10 @@ class MicroserviceManager extends BaseManager { [Op.or]: [ { - '$application.is_activated$': true + [Op.and]: [ + { '$application.is_activated$': true }, + { isActivated: true } + ] }, { '$catalogItem.category$': { [Op.eq]: 'SYSTEM' }, @@ -418,6 +422,11 @@ class MicroserviceManager extends BaseManager { model: MicroserviceStatus, as: 'microserviceStatus', required: false + }, + { + model: MicroserviceExecStatus, + as: 'microserviceExecStatus', + required: false } ], where: where diff --git a/src/data/migrations/mysql/db_migration_mysql_v1.0.3.sql b/src/data/migrations/mysql/db_migration_mysql_v1.0.4.sql similarity index 99% rename from src/data/migrations/mysql/db_migration_mysql_v1.0.3.sql rename to src/data/migrations/mysql/db_migration_mysql_v1.0.4.sql index 4126b2ae8..1be5d2788 100644 --- a/src/data/migrations/mysql/db_migration_mysql_v1.0.3.sql +++ b/src/data/migrations/mysql/db_migration_mysql_v1.0.4.sql @@ -810,4 +810,6 @@ CREATE INDEX idx_microservice_health_check_microservice_uuid ON MicroserviceHeal ALTER TABLE MicroserviceStatuses ADD COLUMN health_status TEXT; +ALTER TABLE Microservices ADD COLUMN is_activated BOOLEAN DEFAULT true; + COMMIT; \ No newline at end of file diff --git a/src/data/migrations/postgres/db_migration_pg_v1.0.3.sql b/src/data/migrations/postgres/db_migration_pg_v1.0.4.sql similarity index 99% rename from src/data/migrations/postgres/db_migration_pg_v1.0.3.sql rename to src/data/migrations/postgres/db_migration_pg_v1.0.4.sql index 9aeb5f6c5..3181cc006 100644 --- a/src/data/migrations/postgres/db_migration_pg_v1.0.3.sql +++ b/src/data/migrations/postgres/db_migration_pg_v1.0.4.sql @@ -808,4 +808,6 @@ CREATE TABLE IF NOT EXISTS "MicroserviceHealthChecks" ( CREATE INDEX idx_microservice_health_check_microservice_uuid ON "MicroserviceHealthChecks" (microservice_uuid); -ALTER TABLE "MicroserviceStatuses" ADD COLUMN health_status TEXT; \ No newline at end of file +ALTER TABLE "MicroserviceStatuses" ADD COLUMN health_status TEXT; + +ALTER TABLE "Microservices" ADD COLUMN is_activated BOOLEAN DEFAULT true; \ No newline at end of file diff --git a/src/data/migrations/sqlite/db_migration_sqlite_v1.0.3.sql b/src/data/migrations/sqlite/db_migration_sqlite_v1.0.4.sql similarity index 99% rename from src/data/migrations/sqlite/db_migration_sqlite_v1.0.3.sql rename to src/data/migrations/sqlite/db_migration_sqlite_v1.0.4.sql index 0781f38d9..13d21c087 100644 --- a/src/data/migrations/sqlite/db_migration_sqlite_v1.0.3.sql +++ b/src/data/migrations/sqlite/db_migration_sqlite_v1.0.4.sql @@ -795,4 +795,6 @@ CREATE TABLE IF NOT EXISTS MicroserviceHealthChecks ( CREATE INDEX idx_microservice_health_check_microservice_uuid ON MicroserviceHealthChecks (microservice_uuid); -ALTER TABLE MicroserviceStatuses ADD COLUMN health_status TEXT; \ No newline at end of file +ALTER TABLE MicroserviceStatuses ADD COLUMN health_status TEXT; + +ALTER TABLE Microservices ADD COLUMN is_activated BOOLEAN DEFAULT true; \ No newline at end of file diff --git a/src/data/models/microservice.js b/src/data/models/microservice.js index 261ffdab6..e1128093d 100644 --- a/src/data/models/microservice.js +++ b/src/data/models/microservice.js @@ -108,6 +108,11 @@ module.exports = (sequelize, DataTypes) => { type: DataTypes.BOOLEAN, field: 'delete_with_cleanup', defaultValue: false + }, + isActivated: { + type: DataTypes.BOOLEAN, + field: 'is_activated', + defaultValue: true } }, { tableName: 'Microservices', diff --git a/src/data/providers/database-provider.js b/src/data/providers/database-provider.js index a3206db1f..fd6b899c3 100644 --- a/src/data/providers/database-provider.js +++ b/src/data/providers/database-provider.js @@ -251,8 +251,8 @@ class DatabaseProvider { // SQLite migration async runMigrationSQLite (dbName) { - const migrationSqlPath = path.resolve(__dirname, '../migrations/sqlite/db_migration_sqlite_v1.0.3.sql') - const migrationVersion = '1.0.3' + const migrationSqlPath = path.resolve(__dirname, '../migrations/sqlite/db_migration_sqlite_v1.0.4.sql') + const migrationVersion = '1.0.4' if (!fs.existsSync(migrationSqlPath)) { logger.error(`Migration file not found: ${migrationSqlPath}`) @@ -324,8 +324,8 @@ class DatabaseProvider { // MySQL migration async runMigrationMySQL (db) { - const migrationSqlPath = path.resolve(__dirname, '../migrations/mysql/db_migration_mysql_v1.0.3.sql') - const migrationVersion = '1.0.3' + const migrationSqlPath = path.resolve(__dirname, '../migrations/mysql/db_migration_mysql_v1.0.4.sql') + const migrationVersion = '1.0.4' if (!fs.existsSync(migrationSqlPath)) { logger.error(`Migration file not found: ${migrationSqlPath}`) @@ -385,8 +385,8 @@ class DatabaseProvider { // PostgreSQL migration async runMigrationPostgres (db) { - const migrationSqlPath = path.resolve(__dirname, '../migrations/postgres/db_migration_pg_v1.0.3.sql') - const migrationVersion = '1.0.3' + const migrationSqlPath = path.resolve(__dirname, '../migrations/postgres/db_migration_pg_v1.0.4.sql') + const migrationVersion = '1.0.4' if (!fs.existsSync(migrationSqlPath)) { logger.error(`Migration file not found: ${migrationSqlPath}`) diff --git a/src/helpers/error-messages.js b/src/helpers/error-messages.js index 1e373ab60..9966ca142 100644 --- a/src/helpers/error-messages.js +++ b/src/helpers/error-messages.js @@ -57,6 +57,7 @@ module.exports = { 'List of invalid microservices:\n', INVALID_MICROSERVICE_CONFIG: 'Can\'t create network microservice without appropriate configuration.', INVALID_MICROSERVICE_USER: 'Invalid microservice user or UUID', + APPLICATION_NOT_ACTIVATED: 'Application {} is not activated', ROUTE_NOT_FOUND: 'Route not found', IMAGE_SNAPSHOT_WITHOUT_FOG: 'Can not run image snapshot for microservice without ioFog.', IMAGE_SNAPSHOT_NOT_AVAILABLE: 'Image snapshot is not available for this microservice.', diff --git a/src/jobs/stopped-app-status-job.js b/src/jobs/stopped-app-status-job.js index c31b77e84..05a5403d2 100644 --- a/src/jobs/stopped-app-status-job.js +++ b/src/jobs/stopped-app-status-job.js @@ -26,7 +26,12 @@ const scheduleTime = Config.get('settings.fogStatusUpdateInterval') * 1000 async function run () { try { const _updateStoppedApplicationMicroserviceStatus = TransactionDecorator.generateTransaction(updateStoppedApplicationMicroserviceStatus) + const _updateStoppedMicroserviceStatus = TransactionDecorator.generateTransaction(updateStoppedMicroserviceStatus) + + // Handle microservices from deactivated applications await _updateStoppedApplicationMicroserviceStatus() + // Handle individually deactivated microservices + await _updateStoppedMicroserviceStatus() } catch (error) { console.error(error) } finally { @@ -35,18 +40,51 @@ async function run () { } async function updateStoppedApplicationMicroserviceStatus (transaction) { - const stoppedMicroservices = await ApplicationManager.findApplicationMicroservices({ isActivated: false }, transaction) + // Get all deactivated applications + const stoppedApplications = await ApplicationManager.findAllWithAttributes({ isActivated: false }, ['id'], transaction) + + if (stoppedApplications.length === 0) { + return + } + + // Get all microservices from these applications + const applicationIds = stoppedApplications.map(app => app.id) + const { Op } = require('sequelize') + const stoppedMicroservices = await MicroserviceManager.findAllWithStatuses({ applicationId: { [Op.in]: applicationIds } }, transaction) + + await _updateMicroserviceStatusStopped(stoppedMicroservices, transaction) +} + +async function updateStoppedMicroserviceStatus (transaction) { + // Get all individually deactivated microservices (where microservice isActivated = false but parent application is still active) + const { Op } = require('sequelize') + + // First get all active applications + const activeApplications = await ApplicationManager.findAllWithAttributes({ isActivated: true }, ['id'], transaction) + if (activeApplications.length === 0) { + return + } + + // Then get microservices that are individually deactivated but belong to active applications + const activeApplicationIds = activeApplications.map(app => app.id) + const stoppedMicroservices = await MicroserviceManager.findAllWithStatuses({ + isActivated: false, + applicationId: { [Op.in]: activeApplicationIds } + }, transaction) + + if (stoppedMicroservices.length === 0) { + return + } + await _updateMicroserviceStatusStopped(stoppedMicroservices, transaction) } async function _updateMicroserviceStatusStopped (stoppedMicroservices, transaction) { - const microserviceUuids = stoppedMicroservices.map((microservice) => microservice.uuid) - const microservices = await MicroserviceManager.findAllWithStatuses({ uuid: microserviceUuids }, transaction) - const microserviceStatusIds = microservices + const microserviceStatusIds = stoppedMicroservices .filter((microservice) => microservice.microserviceStatus && (microservice.microserviceStatus.status === microserviceState.DELETED || microservice.microserviceStatus.status === microserviceState.DELETING)) .map((microservice) => microservice.microserviceStatus.id) - const microserviceExecStatusIds = microservices + const microserviceExecStatusIds = stoppedMicroservices .filter((microservice) => microservice.microserviceStatus && (microservice.microserviceStatus.status === microserviceState.DELETED || @@ -56,7 +94,7 @@ async function _updateMicroserviceStatusStopped (stoppedMicroservices, transacti .map((microservice) => microservice.microserviceExecStatus.id) await MicroserviceStatusManager.update({ id: microserviceStatusIds }, { status: microserviceState.STOPPED }, transaction) await MicroserviceExecStatusManager.update({ id: microserviceExecStatusIds }, { execSesssionId: '', status: microserviceExecState.INACTIVE }, transaction) - return microservices + return stoppedMicroservices } module.exports = { diff --git a/src/routes/agent.js b/src/routes/agent.js index ccfa6a7b7..8aca966f4 100644 --- a/src/routes/agent.js +++ b/src/routes/agent.js @@ -133,6 +133,35 @@ module.exports = [ logger.apiRes({ req: req, res: res, responseObject: responseObject }) } }, + { + method: 'patch', + path: '/api/v3/agent/config/gps', + middleware: async (req, res) => { + logger.apiReq(req) + + const successCode = constants.HTTP_CODE_NO_CONTENT + const errorCodes = [ + { + code: constants.HTTP_CODE_UNAUTHORIZED, + errors: [Errors.AuthenticationError] + }, + { + code: constants.HTTP_CODE_BAD_REQUEST, + errors: [Errors.ValidationError] + } + ] + + const updateAgentGpsEndPoint = ResponseDecorator.handleErrors(AgentController.updateAgentGpsEndPoint, + successCode, errorCodes) + const responseObject = await updateAgentGpsEndPoint(req) + + res + .status(responseObject.code) + .send(responseObject.body) + + logger.apiRes({ req: req, res: res, responseObject: responseObject }) + } + }, { method: 'get', path: '/api/v3/agent/config/changes', diff --git a/src/routes/microservices.js b/src/routes/microservices.js index 38c3d0833..8927db9bb 100644 --- a/src/routes/microservices.js +++ b/src/routes/microservices.js @@ -1290,6 +1290,76 @@ module.exports = [ }) } }, + { + method: 'patch', + path: '/api/v3/microservices/:uuid/start', + middleware: async (req, res) => { + logger.apiReq(req) + + const successCode = constants.HTTP_CODE_NO_CONTENT + const errorCodes = [ + { + code: constants.HTTP_CODE_BAD_REQUEST, + errors: [Errors.ValidationError] + }, + { + code: constants.HTTP_CODE_UNAUTHORIZED, + errors: [Errors.AuthenticationError] + }, + { + code: constants.HTTP_CODE_NOT_FOUND, + errors: [Errors.NotFoundError] + } + ] + + await keycloak.protect(['SRE', 'Developer'])(req, res, async () => { + const startMicroserviceEndPoint = ResponseDecorator.handleErrors(MicroservicesController.startMicroserviceEndPoint, + successCode, errorCodes) + const responseObject = await startMicroserviceEndPoint(req) + const user = req.kauth.grant.access_token.content.preferred_username + res + .status(responseObject.code) + .send(responseObject.body) + + logger.apiRes({ req: req, user: user, res: res, responseObject: responseObject }) + }) + } + }, + { + method: 'patch', + path: '/api/v3/microservices/:uuid/stop', + middleware: async (req, res) => { + logger.apiReq(req) + + const successCode = constants.HTTP_CODE_NO_CONTENT + const errorCodes = [ + { + code: constants.HTTP_CODE_BAD_REQUEST, + errors: [Errors.ValidationError] + }, + { + code: constants.HTTP_CODE_UNAUTHORIZED, + errors: [Errors.AuthenticationError] + }, + { + code: constants.HTTP_CODE_NOT_FOUND, + errors: [Errors.NotFoundError] + } + ] + + await keycloak.protect(['SRE', 'Developer'])(req, res, async () => { + const stopMicroserviceEndPoint = ResponseDecorator.handleErrors(MicroservicesController.stopMicroserviceEndPoint, + successCode, errorCodes) + const responseObject = await stopMicroserviceEndPoint(req) + const user = req.kauth.grant.access_token.content.preferred_username + res + .status(responseObject.code) + .send(responseObject.body) + + logger.apiRes({ req: req, user: user, res: res, responseObject: responseObject }) + }) + } + }, { method: 'ws', path: '/api/v3/microservices/exec/:microserviceUuid', diff --git a/src/schemas/agent.js b/src/schemas/agent.js index c41bde55b..40bd2046c 100644 --- a/src/schemas/agent.js +++ b/src/schemas/agent.js @@ -66,6 +66,16 @@ const updateAgentConfig = { 'additionalProperties': true } +const updateAgentGps = { + 'id': '/updateAgentGps', + 'type': 'object', + 'properties': { + 'latitude': { 'type': 'number', 'minimum': -90, 'maximum': 90 }, + 'longitude': { 'type': 'number', 'minimum': -180, 'maximum': 180 } + }, + 'additionalProperties': true +} + const updateAgentStatus = { 'id': '/updateAgentStatus', 'type': 'object', @@ -174,7 +184,7 @@ const updateUsbInfo = { } module.exports = { - mainSchemas: [agentProvision, agentDeprovision, updateAgentConfig, updateAgentStatus, updateAgentStrace, + mainSchemas: [agentProvision, agentDeprovision, updateAgentConfig, updateAgentGps, updateAgentStatus, updateAgentStrace, updateHardwareInfo, updateUsbInfo], innerSchemas: [straceData, microserviceStatus] } diff --git a/src/services/agent-service.js b/src/services/agent-service.js index b8bf45128..5e2208dd7 100644 --- a/src/services/agent-service.js +++ b/src/services/agent-service.js @@ -139,37 +139,40 @@ const getAgentConfig = async function (fog, transaction) { // Get local agent certificate from secrets const localAgentSecret = await SecretManager.getSecret(`${fog.uuid}-local-agent`, transaction) - // fog is the result of FogManager.FindOne() in the checkFogToken middleware - return { - networkInterface: fog.networkInterface, - dockerUrl: fog.dockerUrl, - diskLimit: fog.diskLimit, - diskDirectory: fog.diskDirectory, - memoryLimit: fog.memoryLimit, - cpuLimit: fog.cpuLimit, - logLimit: fog.logLimit, - logDirectory: fog.logDirectory, - logFileCount: fog.logFileCount, - gpsMode: fog.gpsMode, - gpsDevice: fog.gpsDevice, - gpsScanFrequency: fog.gpsScanFrequency, - edgeGuardFrequency: fog.edgeGuardFrequency, - statusFrequency: fog.statusFrequency, - changeFrequency: fog.changeFrequency, - deviceScanFrequency: fog.deviceScanFrequency, - watchdogEnabled: fog.watchdogEnabled, - latitude: fog.latitude, - longitude: fog.longitude, - logLevel: fog.logLevel, - availableDiskThreshold: fog.availableDiskThreshold, - dockerPruningFrequency: fog.dockerPruningFrequency, - routerHost: router.host === fog.host ? 'localhost' : router.host, + const fogData = await FogManager.findOne({ + uuid: fog.uuid + }, transaction) + const resp = { + networkInterface: fogData.networkInterface, + dockerUrl: fogData.dockerUrl, + diskLimit: fogData.diskLimit, + diskDirectory: fogData.diskDirectory, + memoryLimit: fogData.memoryLimit, + cpuLimit: fogData.cpuLimit, + logLimit: fogData.logLimit, + logDirectory: fogData.logDirectory, + logFileCount: fogData.logFileCount, + gpsMode: fogData.gpsMode, + gpsDevice: fogData.gpsDevice, + gpsScanFrequency: fogData.gpsScanFrequency, + edgeGuardFrequency: fogData.edgeGuardFrequency, + statusFrequency: fogData.statusFrequency, + changeFrequency: fogData.changeFrequency, + deviceScanFrequency: fogData.deviceScanFrequency, + watchdogEnabled: fogData.watchdogEnabled, + latitude: fogData.latitude, + longitude: fogData.longitude, + logLevel: fogData.logLevel, + availableDiskThreshold: fogData.availableDiskThreshold, + dockerPruningFrequency: fogData.dockerPruningFrequency, + routerHost: router.host === fogData.host ? 'localhost' : router.host, routerPort: router.messagingPort, - timeZone: fog.timeZone, + timeZone: fogData.timeZone, caCert: localAgentSecret ? localAgentSecret.data['ca.crt'] : null, tlsCert: localAgentSecret ? localAgentSecret.data['tls.crt'] : null, tlsKey: localAgentSecret ? localAgentSecret.data['tls.key'] : null } + return resp } const updateAgentConfig = async function (updateData, fog, transaction) { @@ -207,6 +210,20 @@ const updateAgentConfig = async function (updateData, fog, transaction) { }, update, transaction) } +const updateAgentGpsEndPoint = async function (updateData, fog, transaction) { + await Validator.validate(updateData, Validator.schemas.updateAgentGps) + + let update = { + latitude: updateData.latitude, + longitude: updateData.longitude + } + update = AppHelper.deleteUndefinedFields(update) + + await FogManager.update({ + uuid: fog.uuid + }, update, transaction) +} + const getAgentConfigChanges = async function (ioFog, transaction) { const changeTrackings = await ChangeTrackingService.getByIoFogUuid(ioFog.uuid, transaction) const res = { ...CHANGE_TRACKING_DEFAULT } @@ -782,6 +799,7 @@ module.exports = { agentDeprovision: TransactionDecorator.generateTransaction(agentDeprovision), getAgentConfig: TransactionDecorator.generateTransaction(getAgentConfig), updateAgentConfig: TransactionDecorator.generateTransaction(updateAgentConfig), + updateAgentGpsEndPoint: TransactionDecorator.generateTransaction(updateAgentGpsEndPoint), getAgentConfigChanges: TransactionDecorator.generateTransaction(getAgentConfigChanges), resetAgentConfigChanges: TransactionDecorator.generateTransaction(resetAgentConfigChanges), updateAgentStatus: TransactionDecorator.generateTransaction(updateAgentStatus), diff --git a/src/services/iofog-service.js b/src/services/iofog-service.js index b088420ae..502296080 100644 --- a/src/services/iofog-service.js +++ b/src/services/iofog-service.js @@ -267,6 +267,7 @@ async function createFogEndPoint (fogData, isCLI, transaction) { abstractedHardwareEnabled: fogData.abstractedHardwareEnabled, fogTypeId: fogData.fogType, logLevel: fogData.logLevel, + edgeGuardFrequency: fogData.edgeGuardFrequency, dockerPruningFrequency: fogData.dockerPruningFrequency, availableDiskThreshold: fogData.availableDiskThreshold, isSystem: fogData.isSystem, @@ -275,11 +276,15 @@ async function createFogEndPoint (fogData, isCLI, transaction) { timeZone: fogData.timeZone } - if ((fogData.latitude || fogData.longitude) && fogData.gpsMode !== 'dynamic') { + if ((fogData.latitude || fogData.longitude) && (fogData.gpsMode !== 'dynamic' && fogData.gpsMode !== 'off')) { createFogData.gpsMode = 'manual' } else if (fogData.gpsMode === 'dynamic' && fogData.gpsDevice) { createFogData.gpsMode = fogData.gpsMode createFogData.gpsDevice = fogData.gpsDevice + } else if (!(fogData.latitude || fogData.longitude) && fogData.gpsMode === 'auto') { + createFogData.gpsMode = 'auto' + } else if (fogData.gpsMode === 'off') { + createFogData.gpsMode = 'off' } else { createFogData.gpsMode = undefined } @@ -293,6 +298,7 @@ async function createFogEndPoint (fogData, isCLI, transaction) { throw new Errors.ValidationError(AppHelper.formatMessage(ErrorMessages.INVALID_ROUTER_MODE, fogData.routerMode)) } + // TODO: handle multiple system fogs a.k.a multi-remote-controller and multi interior routers if (fogData.isSystem && !!(await FogManager.findOne({ isSystem: true }, transaction))) { throw new Errors.ValidationError(AppHelper.formatMessage(ErrorMessages.DUPLICATE_SYSTEM_FOG)) } @@ -436,16 +442,21 @@ async function updateFogEndPoint (fogData, isCLI, transaction) { fogTypeId: fogData.fogType, logLevel: fogData.logLevel, dockerPruningFrequency: fogData.dockerPruningFrequency, + edgeGuardFrequency: fogData.edgeGuardFrequency, host: fogData.host, availableDiskThreshold: fogData.availableDiskThreshold, timeZone: fogData.timeZone } - if ((fogData.latitude || fogData.longitude) && fogData.gpsMode !== 'dynamic') { + if ((fogData.latitude || fogData.longitude) && (fogData.gpsMode !== 'dynamic' && fogData.gpsMode !== 'off')) { updateFogData.gpsMode = 'manual' } else if (fogData.gpsMode === 'dynamic' && fogData.gpsDevice) { updateFogData.gpsMode = fogData.gpsMode updateFogData.gpsDevice = fogData.gpsDevice + } else if (!(fogData.latitude || fogData.longitude) && fogData.gpsMode === 'auto') { + updateFogData.gpsMode = 'auto' + } else if (fogData.gpsMode === 'off') { + updateFogData.gpsMode = 'off' } else { updateFogData.gpsMode = undefined } diff --git a/src/services/microservices-service.js b/src/services/microservices-service.js index 539ef74f6..be84fcdad 100644 --- a/src/services/microservices-service.js +++ b/src/services/microservices-service.js @@ -951,7 +951,7 @@ async function updateMicroserviceEndPoint (microserviceUuid, microserviceData, i if (microserviceDataUpdate.capDrop) { await _updateCapDrop(microserviceDataUpdate.capDrop, microserviceUuid, transaction) } - // TODO: Implement moveServiceToNewFog + const existingService = await ServiceManager.findOne({ type: `microservice`, resource: microservice.uuid }, transaction) if (microserviceDataUpdate.iofogUuid && microserviceDataUpdate.iofogUuid !== microservice.iofogUuid && existingService) { await ServiceServices.moveMicroserviceTcpBridgeToNewFog(existingService, microserviceDataUpdate.iofogUuid, microservice.iofogUuid, transaction) @@ -2339,6 +2339,48 @@ async function deleteSystemExecEndPoint (microserviceUuid, isCLI, transaction) { } } +async function startMicroserviceEndPoint (microserviceUuid, isCLI, transaction) { + const microservice = await MicroserviceManager.findOneWithCategory({ uuid: microserviceUuid }, transaction) + if (!microservice) { + throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.INVALID_MICROSERVICE_UUID, microserviceUuid)) + } + if (microservice.catalogItem && microservice.catalogItem.category === 'SYSTEM') { + throw new Errors.ValidationError(AppHelper.formatMessage(ErrorMessages.SYSTEM_MICROSERVICE_UPDATE, microserviceUuid)) + } + + // Check if the parent application is activated + const application = await ApplicationManager.findOne({ id: microservice.applicationId }, transaction) + if (!application || !application.isActivated) { + throw new Errors.ValidationError(AppHelper.formatMessage(ErrorMessages.APPLICATION_NOT_ACTIVATED, application ? application.name : 'Unknown')) + } + + await MicroserviceManager.update({ uuid: microservice.uuid }, { isActivated: true }, transaction) + await ChangeTrackingService.update(microservice.iofogUuid, ChangeTrackingService.events.microserviceList, transaction) + + return { + uuid: microservice.uuid, + isActivated: true + } +} + +async function stopMicroserviceEndPoint (microserviceUuid, isCLI, transaction) { + const microservice = await MicroserviceManager.findOneWithCategory({ uuid: microserviceUuid }, transaction) + if (!microservice) { + throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.INVALID_MICROSERVICE_UUID, microserviceUuid)) + } + if (microservice.catalogItem && microservice.catalogItem.category === 'SYSTEM') { + throw new Errors.ValidationError(AppHelper.formatMessage(ErrorMessages.SYSTEM_MICROSERVICE_UPDATE, microserviceUuid)) + } + + await MicroserviceManager.update({ uuid: microservice.uuid }, { isActivated: false }, transaction) + await ChangeTrackingService.update(microservice.iofogUuid, ChangeTrackingService.events.microserviceList, transaction) + + return { + uuid: microservice.uuid, + isActivated: false + } +} + module.exports = { createMicroserviceEndPoint: TransactionDecorator.generateTransaction(createMicroserviceEndPoint), createPortMappingEndPoint: TransactionDecorator.generateTransaction(createPortMappingEndPoint), @@ -2380,5 +2422,7 @@ module.exports = { createExecEndPoint: TransactionDecorator.generateTransaction(createExecEndPoint), deleteExecEndPoint: TransactionDecorator.generateTransaction(deleteExecEndPoint), createSystemExecEndPoint: TransactionDecorator.generateTransaction(createSystemExecEndPoint), - deleteSystemExecEndPoint: TransactionDecorator.generateTransaction(deleteSystemExecEndPoint) + deleteSystemExecEndPoint: TransactionDecorator.generateTransaction(deleteSystemExecEndPoint), + startMicroserviceEndPoint: TransactionDecorator.generateTransaction(startMicroserviceEndPoint), + stopMicroserviceEndPoint: TransactionDecorator.generateTransaction(stopMicroserviceEndPoint) }