diff --git a/.dockerignore b/.dockerignore index 18dfe8d78..10f384634 100644 --- a/.dockerignore +++ b/.dockerignore @@ -9,6 +9,8 @@ node_modules *.pid /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/.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/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 600a68db6..710d3c332 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -1,100 +1,93 @@ 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 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 + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 with: - node-version: 18 - - run: npm ci + node-version: 20 + - name: Replace values + shell: bash + env: + 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 --build-from-source --force - run: npm run standard - run: | npm i -g better-npm-audit npx better-npm-audit audit -p - Tests: - needs: Build - runs-on: ubuntu-latest + Publish: + needs: [Build] + 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 - strategy: - matrix: - node: [ 16, 17, 16, 19 ] - 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 ci - - 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] - runs-on: ubuntu-latest - permissions: - contents: 'read' - id-token: 'write' - packages: 'write' + repository-projects: write + security-events: write + statuses: write name: Publish Controller steps: - - uses: actions/checkout@v3 - - uses: actions/setup-node@v3 + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 with: - node-version: 18 - - run: npm ci + node-version: 20 + - name: Replace values + shell: bash + env: + 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 --build-from-source --force - name: npm version id: package-version @@ -112,47 +105,50 @@ 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 --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: 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 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 + file: Dockerfile + context: . + 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 }} 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/.gitignore b/.gitignore index 97d5e39fa..a80448af3 100644 --- a/.gitignore +++ b/.gitignore @@ -9,9 +9,12 @@ node_modules *.pid /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 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/.npmrc b/.npmrc new file mode 100644 index 000000000..11cf9fea1 --- /dev/null +++ b/.npmrc @@ -0,0 +1,2 @@ +//npm.pkg.github.com/:_authToken=PAT +@Datasance:registry=https://npm.pkg.github.com/ \ No newline at end of file diff --git a/.nsprc b/.nsprc index 634f5426d..9c2174be1 100644 --- a/.nsprc +++ b/.nsprc @@ -1,8 +1,3 @@ { - "1091459": { - "notes": "" - }, - "1091725": { - "notes": "" - } -} \ No newline at end of file + + } \ No newline at end of file diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 000000000..4ac88738f --- /dev/null +++ b/Dockerfile @@ -0,0 +1,68 @@ +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: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 + +# 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 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 && \ + chmod 755 /var/log/iofog-controller +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 + +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 +LABEL org.opencontainers.image.licenses=EPL2.0 +CMD [ "node", "/home/runner/.npm-global/lib/node_modules/@datasance/iofogcontroller/src/server.js" ] diff --git a/Dockerfile.dev b/Dockerfile.dev index 09e2209cc..36e060e8b 100644 --- a/Dockerfile.dev +++ b/Dockerfile.dev @@ -1,6 +1,7 @@ -FROM node:hydrogen-buster AS builder +FROM node:iron-bookworm AS builder ARG PKG_VERSION +ARG GITHUB_TOKEN WORKDIR /tmp @@ -10,13 +11,18 @@ COPY package.json . COPY . . -RUN npm i --build-from-source +# 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 node:hydrogen-alpine3.17 +FROM node:iron-alpine3.18 RUN apk add sudo logrotate g++ make @@ -30,11 +36,13 @@ 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 && \ iofog-controller config dev-mode --on -# RUN sudo rm -rf /usr/local/lib/node_modules/iofogcontroller/src/data/sqlite_files -CMD [ "node", "/usr/local/lib/node_modules/@iofog/iofogcontroller/src/server.js" ] +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/Dockerfile.rel b/Dockerfile.rel index a5cb14585..62df6f6b5 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 @@ -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 - -COPY --from=builder /tmp/iofog-iofogcontroller-*.tgz /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 +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" ] 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/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). 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-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 3e57c5ac5..98745d609 100644 --- a/docs/swagger.json +++ b/docs/swagger.json @@ -1,8 +1,8 @@ { - "swagger" : "3.0.0", + "openapi" : "3.0.0", "info" : { - "version" : "3.0.0", - "title" : "ioFog Controller" + "version" : "1.0.0", + "title" : "Datasance PoT Controller" }, "tags" : [ { "name" : "Controller", @@ -61,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" ], @@ -103,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" : { @@ -135,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" : { @@ -172,11 +152,9 @@ "in" : "path", "description" : "ioFog node id", "required" : true - }, { - "name" : "Authorization", - "in" : "header", - "description" : "User token", - "required" : true + } ], + "security" : [ { + "userToken" : [ ] } ], "responses" : { "200" : { @@ -207,11 +185,9 @@ "in" : "path", "description" : "ioFog node id", "required" : true - }, { - "name" : "Authorization", - "in" : "header", - "description" : "User token", - "required" : true + } ], + "security" : [ { + "userToken" : [ ] } ], "responses" : { "202" : { @@ -242,11 +218,9 @@ "in" : "path", "description" : "ioFog node id", "required" : true - }, { - "name" : "Authorization", - "in" : "header", - "description" : "User token", - "required" : true + } ], + "security" : [ { + "userToken" : [ ] } ], "responses" : { "204" : { @@ -282,11 +256,9 @@ "in" : "path", "description" : "ioFog node id", "required" : true - }, { - "name" : "Authorization", - "in" : "header", - "description" : "User token", - "required" : true + } ], + "security" : [ { + "userToken" : [ ] } ], "responses" : { "201" : { @@ -315,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", @@ -330,6 +297,9 @@ "description" : "change version command", "required" : true } ], + "security" : [ { + "userToken" : [ ] + } ], "responses" : { "204" : { "description" : "Success", @@ -360,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", @@ -394,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", @@ -432,11 +398,9 @@ "in" : "path", "description" : "ioFog node id", "required" : true - }, { - "name" : "Authorization", - "in" : "header", - "description" : "User token", - "required" : true + } ], + "security" : [ { + "userToken" : [ ] } ], "responses" : { "200" : { @@ -469,11 +433,9 @@ "in" : "path", "description" : "ioFog node id", "required" : true - }, { - "name" : "Authorization", - "in" : "header", - "description" : "User token", - "required" : true + } ], + "security" : [ { + "userToken" : [ ] } ], "responses" : { "200" : { @@ -501,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" : { @@ -526,18 +486,17 @@ "description" : "Internal Server Error" } } - }, - "post" : { + } + }, + "/application/system" : { + "get" : { "tags" : [ "Application" ], - "summary" : "Creates an application", - "operationId" : "createApplication", - "parameters" : [ { - "name" : "Authorization", - "in" : "header", - "description" : "User Token", - "required" : true + "summary" : "Lists all system applications", + "operationId" : "listSystemApplication", + "parameters" : [ ], + "security" : [ { + "userToken" : [ ] } ], - "deprecated" : true, "responses" : { "200" : { "description" : "Success", @@ -550,25 +509,31 @@ "400" : { "description" : "Bad Request" }, + "404" : { + "description" : "Not Found" + }, "500" : { "description" : "Internal Server Error" } } } }, - "/application/yaml" : { - "post" : { + "/application/system/{name}" : { + "delete" : { "tags" : [ "Application" ], - "summary" : "Creates an application using a YAML file", - "operationId" : "createApplicationYAML", + "summary" : "Deletes a system application", + "operationId" : "deleteSystemApplication", "parameters" : [ { - "name" : "Authorization", - "in" : "header", - "description" : "User Token", + "name" : "name", + "in" : "path", + "description" : "Application name", "required" : true } ], + "security" : [ { + "userToken" : [ ] + } ], "responses" : { - "200" : { + "204" : { "description" : "Success", "headers" : { "X-Timestamp" : { @@ -579,27 +544,23 @@ "400" : { "description" : "Bad Request" }, + "404" : { + "description" : "Not Found" + }, "500" : { "description" : "Internal Server Error" } } } }, - "/application/{name}" : { - "get" : { + "/application/yaml" : { + "post" : { "tags" : [ "Application" ], - "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 + "summary" : "Creates an application using a YAML file", + "operationId" : "createApplicationYAML", + "parameters" : [ ], + "security" : [ { + "userToken" : [ ] } ], "responses" : { "200" : { @@ -613,32 +574,28 @@ "400" : { "description" : "Bad Request" }, - "404" : { - "description" : "Not Found" - }, "500" : { "description" : "Internal Server Error" } } - }, - "put" : { + } + }, + "/application/{name}" : { + "get" : { "tags" : [ "Application" ], - "summary" : "Updates an application", - "operationId" : "updateApplication", + "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 } ], - "deprecated" : true, + "security" : [ { + "userToken" : [ ] + } ], "responses" : { - "204" : { + "200" : { "description" : "Success", "headers" : { "X-Timestamp" : { @@ -662,16 +619,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", @@ -697,16 +652,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", @@ -734,16 +687,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", @@ -770,11 +721,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" : { @@ -797,46 +746,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" : { @@ -862,16 +779,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", @@ -892,54 +807,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", @@ -965,16 +845,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", @@ -1002,16 +880,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", @@ -1092,11 +968,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" : { @@ -1119,11 +993,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" : { @@ -1151,11 +1023,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" : { @@ -1181,11 +1051,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" : { @@ -1213,11 +1081,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" : { @@ -1245,11 +1111,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" : { @@ -1279,11 +1143,9 @@ "in" : "path", "description" : "Microservice UUID", "required" : true - }, { - "name" : "Authorization", - "in" : "header", - "description" : "Agent Token", - "required" : true + } ], + "security" : [ { + "agentToken" : [ ] } ], "responses" : { "200" : { @@ -1311,11 +1173,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" : { @@ -1340,11 +1200,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" : { @@ -1372,11 +1230,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" : { @@ -1402,11 +1258,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" : { @@ -1437,11 +1291,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" : { @@ -1469,11 +1321,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" : { @@ -1501,11 +1351,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" : { @@ -1531,11 +1379,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" : { @@ -1563,11 +1409,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" : { @@ -1592,11 +1436,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" : { @@ -1622,11 +1464,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" : { @@ -1654,11 +1494,9 @@ "tags" : [ "Agent" ], "summary" : "Post tracking info", "operationId" : "postTracking", - "parameters" : [ { - "name" : "Authorization", - "in" : "header", - "description" : "Agent Token", - "required" : true + "parameters" : [ ], + "security" : [ { + "agentToken" : [ ] } ], "responses" : { "204" : { @@ -1678,11 +1516,9 @@ "tags" : [ "Catalog" ], "summary" : "Gets microservices catalog", "operationId" : "getMicroservicesCatalog", - "parameters" : [ { - "name" : "Authorization", - "in" : "header", - "description" : "User Token", - "required" : true + "parameters" : [ ], + "security" : [ { + "userToken" : [ ] } ], "responses" : { "200" : { @@ -1705,11 +1541,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" : { @@ -1741,16 +1575,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", @@ -1776,16 +1608,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", @@ -1811,16 +1641,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", @@ -1848,18 +1676,25 @@ } } }, - "/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 + "name" : "flowId", + "in" : "query", + "description" : "Flow Id", + "required" : false + }, { + "name" : "application", + "in" : "query", + "description" : "Application name", + "required" : false + } ], + "security" : [ { + "userToken" : [ ] } ], - "deprecated" : true, "responses" : { "200" : { "description" : "Success", @@ -1876,18 +1711,17 @@ "description" : "Internal Server Error" } } - }, + } + }, + "/microservices/yaml" : { "post" : { - "tags" : [ "Flow" ], - "summary" : "Creates a new flow", - "operationId" : "createFlow", - "parameters" : [ { - "name" : "Authorization", - "in" : "header", - "description" : "User Token", - "required" : true + "tags" : [ "Microservices" ], + "summary" : "Creates a new microservice in an Application", + "operationId" : "createMicroserviceYAML", + "parameters" : [ ], + "security" : [ { + "userToken" : [ ] } ], - "deprecated" : true, "responses" : { "201" : { "description" : "Created", @@ -1903,29 +1737,29 @@ "401" : { "description" : "Not Authorized" }, + "409" : { + "description" : "Duplicate Name" + }, "500" : { "description" : "Internal Server Error" } } } }, - "/flow/{id}" : { + "/microservices/{uuid}" : { "get" : { - "tags" : [ "Flow" ], - "summary" : "Gets flow info", - "operationId" : "getFlowInfo", + "tags" : [ "Microservices" ], + "summary" : "Gets a microservice info", + "operationId" : "getMicroserviceInfo", "parameters" : [ { - "name" : "Authorization", - "in" : "header", - "description" : "User Token", - "required" : true - }, { - "name" : "id", + "name" : "uuid", "in" : "path", - "description" : "Flow Id", + "description" : "Microservice Uuid", "required" : true } ], - "deprecated" : true, + "security" : [ { + "userToken" : [ ] + } ], "responses" : { "200" : { "description" : "Success", @@ -1939,7 +1773,7 @@ "description" : "Not Authorized" }, "404" : { - "description" : "Invalid Flow Id" + "description" : "Not Found" }, "500" : { "description" : "Internal Server Error" @@ -1947,57 +1781,18 @@ } }, "delete" : { - "tags" : [ "Flow" ], - "summary" : "Deletes a flow", - "operationId" : "deleteFlow", + "tags" : [ "Microservices" ], + "summary" : "Deletes a microservice", + "operationId" : "deleteMicroservice", "parameters" : [ { - "name" : "Authorization", - "in" : "header", - "description" : "User Token", - "required" : true - }, { - "name" : "id", + "name" : "uuid", "in" : "path", - "description" : "Flow Id", + "description" : "Microservice Uuid", "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 + "security" : [ { + "userToken" : [ ] } ], - "deprecated" : true, "responses" : { "204" : { "description" : "Success", @@ -2014,101 +1809,61 @@ "description" : "Not Authorized" }, "404" : { - "description" : "Invalid Flow Id" + "description" : "Not Found" }, "500" : { "description" : "Internal Server Error" } } - } - }, - "/microservices" : { - "get" : { + }, + "patch" : { "tags" : [ "Microservices" ], - "summary" : "Gets list of microservices", - "operationId" : "getMicroservicesList", + "summary" : "Updates a microservice", + "operationId" : "updateMicroservice", "parameters" : [ { - "name" : "Authorization", - "in" : "header", - "description" : "User Token", + "name" : "uuid", + "in" : "path", + "description" : "Microservice Uuid", "required" : true - }, { - "name" : "flowId", - "in" : "query", - "description" : "Flow Id", - "required" : false - }, { - "name" : "application", - "in" : "query", - "description" : "Application name", - "required" : false } ], - "responses" : { - "200" : { - "description" : "Success", - "headers" : { - "X-Timestamp" : { - "description" : "FogController server timestamp" - } - } - }, - "401" : { - "description" : "Not Authorized" - }, - "500" : { - "description" : "Internal Server Error" - } - } - }, - "post" : { + "security" : [ { + "userToken" : [ ] + } ] + } + }, + "/microservices/system/{uuid}" : { + "patch" : { "tags" : [ "Microservices" ], - "summary" : "Creates a new microservice on an ioFog node", - "operationId" : "createMicroservice", + "summary" : "Updates a system microservice", + "operationId" : "updateSystemMicroservice", "parameters" : [ { - "name" : "Authorization", - "in" : "header", - "description" : "User Token", + "name" : "uuid", + "in" : "path", + "description" : "Microservice Uuid", "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" - } - } + "security" : [ { + "userToken" : [ ] + } ] } }, - "/microservices/yaml" : { - "post" : { + "/microservices/yaml/{uuid}" : { + "patch" : { "tags" : [ "Microservices" ], - "summary" : "Creates a new microservice in an Application", - "operationId" : "createMicroserviceYAML", + "summary" : "Updates a microservice", + "operationId" : "updateMicroserviceYAML", "parameters" : [ { - "name" : "Authorization", - "in" : "header", - "description" : "User Token", + "name" : "uuid", + "in" : "path", + "description" : "Microservice Uuid", "required" : true } ], + "security" : [ { + "userToken" : [ ] + } ], "responses" : { - "201" : { - "description" : "Created", + "204" : { + "description" : "Success", "headers" : { "X-Timestamp" : { "description" : "FogController server timestamp" @@ -2121,6 +1876,9 @@ "401" : { "description" : "Not Authorized" }, + "404" : { + "description" : "Not Found" + }, "409" : { "description" : "Duplicate Name" }, @@ -2130,25 +1888,23 @@ } } }, - "/microservices/{uuid}" : { + "/microservices/{uuid}/port-mapping" : { "get" : { "tags" : [ "Microservices" ], - "summary" : "Gets a microservice info", - "operationId" : "getMicroserviceInfo", + "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" : "Success", + "description" : "Created", "headers" : { "X-Timestamp" : { "description" : "FogController server timestamp" @@ -2166,63 +1922,22 @@ } } }, - "delete" : { + "post" : { "tags" : [ "Microservices" ], - "summary" : "Deletes a microservice", - "operationId" : "deleteMicroservice", + "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 } ], - "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", + "201" : { + "description" : "Created", "headers" : { "X-Timestamp" : { "description" : "FogController server timestamp" @@ -2230,7 +1945,7 @@ } }, "400" : { - "description" : "Bad Request" + "description" : "Not Valid" }, "401" : { "description" : "Not Authorized" @@ -2238,34 +1953,29 @@ "404" : { "description" : "Not Found" }, - "409" : { - "description" : "Duplicate Name" - }, "500" : { "description" : "Internal Server Error" } } } }, - "/microservices/yaml/{uuid}" : { - "patch" : { + "/microservices/system/{uuid}/port-mapping" : { + "post" : { "tags" : [ "Microservices" ], - "summary" : "Updates a microservice", - "operationId" : "updateMicroserviceYAML", + "summary" : "Creates a port mapping for system microservice", + "operationId" : "createSystemMicroservicePortMapping", "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", + "201" : { + "description" : "Created", "headers" : { "X-Timestamp" : { "description" : "FogController server timestamp" @@ -2273,7 +1983,7 @@ } }, "400" : { - "description" : "Bad Request" + "description" : "Not Valid" }, "401" : { "description" : "Not Authorized" @@ -2281,49 +1991,40 @@ "404" : { "description" : "Not Found" }, - "409" : { - "description" : "Duplicate Name" - }, "500" : { "description" : "Internal Server Error" } } } }, - "/microservices/{uuid}/routes/{receiverUuid}" : { - "post" : { + "/microservices/{uuid}/port-mapping/{internalPort}" : { + "delete" : { "tags" : [ "Microservices" ], - "summary" : "Creates a route from microservice to receiver", - "operationId" : "createMicroserviceRoute", + "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", "required" : true }, { - "name" : "receiverUuid", + "name" : "internalPort", "in" : "path", - "description" : "Receiver Microservice Uuid", + "description" : "Internal Port", "required" : true } ], - "deprecated" : true, + "security" : [ { + "userToken" : [ ] + } ], "responses" : { "204" : { - "description" : "Created", + "description" : "Success", "headers" : { "X-Timestamp" : { "description" : "FogController server timestamp" } } }, - "400" : { - "description" : "Not Valid" - }, "401" : { "description" : "Not Authorized" }, @@ -2334,28 +2035,27 @@ "description" : "Internal Server Error" } } - }, + } + }, + "/microservices/system/{uuid}/port-mapping/{internalPort}" : { "delete" : { "tags" : [ "Microservices" ], - "summary" : "Deletes a route microservice", - "operationId" : "deleteMicroserviceRoute", + "summary" : "Deletes a port mapping for system microservice", + "operationId" : "deleteSystemMicroservicePortMapping", "parameters" : [ { - "name" : "Authorization", - "in" : "header", - "description" : "User Token", - "required" : true - }, { "name" : "uuid", "in" : "path", "description" : "Microservice Uuid", "required" : true }, { - "name" : "receiverUuid", + "name" : "internalPort", "in" : "path", - "description" : "Receiver Microservice Uuid", + "description" : "Internal Port", "required" : true } ], - "deprecated" : true, + "security" : [ { + "userToken" : [ ] + } ], "responses" : { "204" : { "description" : "Success", @@ -2365,9 +2065,6 @@ } } }, - "400" : { - "description" : "Not Valid" - }, "401" : { "description" : "Not Authorized" }, @@ -2380,25 +2077,23 @@ } } }, - "/microservices/{uuid}/port-mapping" : { + "/microservices/{uuid}/volume-mapping" : { "get" : { "tags" : [ "Microservices" ], - "summary" : "Get a port mapping list for microservice", - "operationId" : "getMicroservicePortMapping", + "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" : "Created", + "description" : "Success", "headers" : { "X-Timestamp" : { "description" : "FogController server timestamp" @@ -2418,19 +2113,17 @@ }, "post" : { "tags" : [ "Microservices" ], - "summary" : "Creates a port mapping for microservice", - "operationId" : "createMicroservicePortMapping", + "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", @@ -2455,36 +2148,32 @@ } } }, - "/microservices/{uuid}/port-mapping/{internalPort}" : { - "delete" : { + "/microservices/system/{uuid}/volume-mapping" : { + "post" : { "tags" : [ "Microservices" ], - "summary" : "Deletes a port mapping for microservice", - "operationId" : "deleteMicroservicePortMapping", + "summary" : "Creates a volume mapping for system microservice", + "operationId" : "createSystemMicroserviceVolumeMapping", "parameters" : [ { - "name" : "Authorization", - "in" : "header", - "description" : "User Token", - "required" : true - }, { "name" : "uuid", "in" : "path", "description" : "Microservice Uuid", "required" : true - }, { - "name" : "internalPort", - "in" : "path", - "description" : "Internal Port", - "required" : true + } ], + "security" : [ { + "userToken" : [ ] } ], "responses" : { - "204" : { - "description" : "Success", + "201" : { + "description" : "Created", "headers" : { "X-Timestamp" : { "description" : "FogController server timestamp" } } }, + "400" : { + "description" : "Not Valid" + }, "401" : { "description" : "Not Authorized" }, @@ -2497,60 +2186,28 @@ } } }, - "/microservices/{uuid}/volume-mapping" : { - "get" : { - "tags" : [ "Microservices" ], - "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 - } ], - "responses" : { - "200" : { - "description" : "Success", - "headers" : { - "X-Timestamp" : { - "description" : "FogController server timestamp" - } - } - }, - "401" : { - "description" : "Not Authorized" - }, - "404" : { - "description" : "Not Found" - }, - "500" : { - "description" : "Internal Server Error" - } - } - }, - "post" : { - "tags" : [ "Microservices" ], - "summary" : "Creates a volume mapping for microservice", - "operationId" : "createMicroserviceVolumeMapping", + "/microservices/{uuid}/volume-mapping/{id}" : { + "delete" : { + "tags" : [ "Microservices" ], + "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", "required" : true + }, { + "name" : "id", + "in" : "path", + "description" : "Volume id", + "required" : true + } ], + "security" : [ { + "userToken" : [ ] } ], "responses" : { - "201" : { - "description" : "Created", + "204" : { + "description" : "Success", "headers" : { "X-Timestamp" : { "description" : "FogController server timestamp" @@ -2572,17 +2229,12 @@ } } }, - "/microservices/{uuid}/volume-mapping/{id}" : { + "/microservices/system/{uuid}/volume-mapping/{id}" : { "delete" : { "tags" : [ "Microservices" ], - "summary" : "Deletes a volume mapping for microservice", - "operationId" : "deleteMicroserviceVolumeMapping", + "summary" : "Deletes a volume mapping for system microservice", + "operationId" : "deleteSystemMicroserviceVolumeMapping", "parameters" : [ { - "name" : "Authorization", - "in" : "header", - "description" : "User Token", - "required" : true - }, { "name" : "uuid", "in" : "path", "description" : "Microservice Uuid", @@ -2593,6 +2245,9 @@ "description" : "Volume id", "required" : true } ], + "security" : [ { + "userToken" : [ ] + } ], "responses" : { "204" : { "description" : "Success", @@ -2623,16 +2278,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", @@ -2658,16 +2311,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", @@ -2695,11 +2346,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", @@ -2709,6 +2355,9 @@ "in" : "query", "required" : true } ], + "security" : [ { + "userToken" : [ ] + } ], "responses" : { "200" : { "description" : "Success", @@ -2738,11 +2387,9 @@ "in" : "path", "description" : "Microservice UUID", "required" : true - }, { - "name" : "Authorization", - "in" : "header", - "description" : "User Token", - "required" : true + } ], + "security" : [ { + "userToken" : [ ] } ], "responses" : { "204" : { @@ -2772,16 +2419,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", @@ -2816,11 +2461,9 @@ "in" : "path", "description" : "ioFog node id", "required" : true - }, { - "name" : "Authorization", - "in" : "header", - "description" : "User token", - "required" : true + } ], + "security" : [ { + "userToken" : [ ] } ], "responses" : { "200" : { @@ -2851,11 +2494,9 @@ "in" : "path", "description" : "ioFog node id", "required" : true - }, { - "name" : "Authorization", - "in" : "header", - "description" : "User Token", - "required" : true + } ], + "security" : [ { + "userToken" : [ ] } ], "responses" : { "204" : { @@ -2886,11 +2527,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" : { @@ -2913,11 +2552,9 @@ "tags" : [ "Registries" ], "summary" : "Creates new registry", "operationId" : "createRegistry", - "parameters" : [ { - "name" : "Authorization", - "in" : "header", - "description" : "User Token", - "required" : true + "parameters" : [ ], + "security" : [ { + "userToken" : [ ] } ], "responses" : { "201" : { @@ -2950,11 +2587,9 @@ "in" : "path", "description" : "Registry id", "required" : true - }, { - "name" : "Authorization", - "in" : "header", - "description" : "User token", - "required" : true + } ], + "security" : [ { + "userToken" : [ ] } ], "responses" : { "204" : { @@ -2985,11 +2620,9 @@ "in" : "path", "description" : "Registry id", "required" : true - }, { - "name" : "Authorization", - "in" : "header", - "description" : "User token", - "required" : true + } ], + "security" : [ { + "userToken" : [ ] } ], "responses" : { "204" : { @@ -3039,66 +2672,14 @@ } } }, - "/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" : { + "/user/refresh" : { "post" : { "tags" : [ "User" ], - "summary" : "Signup", - "operationId" : "signup", + "summary" : "Refresh accessToken with refreshToken", + "operationId" : "refresh", "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" : { + "200" : { "description" : "Success", "headers" : { "X-Timestamp" : { @@ -3107,117 +2688,26 @@ } }, "400" : { - "description" : "Bad Request" + "description" : "bad request" }, - "500" : { - "description" : "Internal Server Error" + "401" : { + "description" : "incorrect credentials" } } } }, - "/user/activate" : { + "/user/logout" : { "post" : { "tags" : [ "User" ], - "summary" : "Activate account", - "operationId" : "activateAccount", + "summary" : "Logout", + "operationId" : "logout", "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 + "security" : [ { + "userToken" : [ ] } ], "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" + "description" : "Success" }, "401" : { "description" : "Not Authorized" @@ -3228,41 +2718,17 @@ } } }, - "/user/password" : { - "delete" : { + "/user/profile" : { + "get" : { "tags" : [ "User" ], - "summary" : "Reset password", - "operationId" : "resetPassword", + "summary" : "Get current user profile data", + "operationId" : "getUserProfile", "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 + "security" : [ { + "userToken" : [ ] } ], "responses" : { - "204" : { + "200" : { "description" : "Success", "headers" : { "X-Timestamp" : { @@ -3270,9 +2736,6 @@ } } }, - "400" : { - "description" : "Bad Request" - }, "401" : { "description" : "Not Authorized" }, @@ -3287,11 +2750,9 @@ "tags" : [ "Routing" ], "summary" : "Get routes", "operationId" : "getRoutes", - "parameters" : [ { - "name" : "Authorization", - "in" : "header", - "description" : "User Token", - "required" : true + "parameters" : [ ], + "security" : [ { + "userToken" : [ ] } ], "responses" : { "200" : { @@ -3314,11 +2775,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" : { @@ -3350,16 +2809,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", @@ -3385,16 +2842,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", @@ -3420,16 +2875,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", @@ -3462,11 +2915,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" : { @@ -3492,11 +2943,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", @@ -3507,6 +2953,9 @@ "description" : "Edge Resource version", "required" : true } ], + "security" : [ { + "userToken" : [ ] + } ], "responses" : { "200" : { "description" : "Success", @@ -3529,11 +2978,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", @@ -3544,6 +2988,9 @@ "description" : "Edge Resource version", "required" : true } ], + "security" : [ { + "userToken" : [ ] + } ], "responses" : { "200" : { "description" : "Success", @@ -3566,11 +3013,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", @@ -3581,6 +3023,9 @@ "description" : "Edge Resource version", "required" : true } ], + "security" : [ { + "userToken" : [ ] + } ], "responses" : { "204" : { "description" : "Success", @@ -3608,16 +3053,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", @@ -3641,11 +3084,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" : { @@ -3671,11 +3112,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", @@ -3686,6 +3122,9 @@ "description" : "Edge Resource Version", "required" : true } ], + "security" : [ { + "userToken" : [ ] + } ], "responses" : { "204" : { "description" : "Success", @@ -3711,11 +3150,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", @@ -3726,6 +3160,9 @@ "description" : "Edge Resource Version", "required" : true } ], + "security" : [ { + "userToken" : [ ] + } ], "responses" : { "204" : { "description" : "Success", diff --git a/docs/swagger.yaml b/docs/swagger.yaml index 4c055721d..5c8e9b11f 100755 --- a/docs/swagger.yaml +++ b/docs/swagger.yaml @@ -1,7 +1,7 @@ -swagger: "3.0.0" +openapi : "3.0.0" info: - version: 3.0.0 - title: ioFog Controller + version: 3.4.10 + title: Datasance PoT Controller paths: /status: get: @@ -18,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: @@ -59,13 +44,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: + - userToken: [] requestBody: content: application/json: @@ -95,13 +75,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: + - userToken: [] requestBody: $ref: "#/components/requestBodies/UpdateIOFogNodeRequestBody" responses: @@ -135,12 +110,8 @@ paths: required: true schema: type: string - - in: header - name: Authorization - description: User token - required: true - schema: - type: string + security: + - userToken: [] requestBody: $ref: "#/components/requestBodies/UpdateIOFogNodeRequestBody" responses: @@ -171,12 +142,8 @@ paths: required: true schema: type: string - - in: header - name: Authorization - description: User token - required: true - schema: - type: string + security: + - userToken: [] responses: "202": description: Accepted @@ -203,12 +170,8 @@ paths: required: true schema: type: string - - in: header - name: Authorization - description: User token - required: true - schema: - type: string + security: + - userToken: [] responses: "200": description: Success @@ -240,12 +203,8 @@ paths: required: true schema: type: string - - in: header - name: Authorization - description: User token - required: true - schema: - type: string + security: + - userToken: [] responses: "201": description: Success @@ -271,12 +230,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 +245,8 @@ paths: enum: - upgrade - rollback + security: + - userToken: [] responses: "204": description: Success @@ -315,18 +270,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: + - userToken: [] responses: "204": description: Success @@ -346,18 +297,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: + - userToken: [] responses: "204": description: Success @@ -383,12 +330,8 @@ paths: required: true schema: type: string - - in: header - name: Authorization - description: User token - required: true - schema: - type: string + security: + - userToken: [] responses: "200": description: Success @@ -420,12 +363,8 @@ paths: required: true schema: type: string - - in: header - name: Authorization - description: User token - required: true - schema: - type: string + security: + - userToken: [] responses: "200": description: Success @@ -450,13 +389,8 @@ paths: - Application summary: Lists all applications operationId: listApplication - parameters: - - in: header - name: Authorization - description: User Token - required: true - schema: - type: string + security: + - userToken: [] responses: "200": description: Success @@ -475,27 +409,14 @@ paths: description: Not Found "500": description: Internal Server Error - post: + /application/system: + get: tags: - Application - summary: Creates an application - operationId: createApplication - deprecated: true - parameters: - - in: header - name: Authorization - description: User Token - required: true - schema: - type: string - requestBody: - content: - application/json: - schema: - oneOf: - - $ref: "#/components/schemas/ApplicationCreateRequest" - - $ref: "#/components/schemas/ApplicationCreateFromTemplateRequest" - required: true + summary: Lists all system applications + operationId: listSystemApplication + security: + - userToken: [] responses: "200": description: Success @@ -507,109 +428,92 @@ paths: content: application/json: schema: - $ref: "#/components/schemas/ApplicationCreateResponse" + $ref: "#/components/schemas/ApplicationListResponse" "400": description: Bad Request + "404": + description: Not Found "500": description: Internal Server Error - /application/yaml: - post: + /application/system/{name}: + delete: tags: - Application - summary: Creates an application using a YAML file - operationId: createApplicationYAML + summary: Deletes a system application + operationId: deleteSystemApplication parameters: - - in: header - name: Authorization - description: User Token + - in: path + name: name + description: Application name required: true schema: type: string - requestBody: - required: true - content: - application/yaml: - schema: - type: object - properties: - application: - type: string - format: binary + security: + - userToken: [] responses: - "200": + "204": description: Success headers: X-Timestamp: description: FogController server timestamp schema: type: number - content: - application/json: - schema: - $ref: "#/components/schemas/ApplicationCreateResponse" "400": description: Bad Request + "404": + description: Not Found "500": description: Internal Server Error - "/application/{name}": - put: + /application/yaml: + post: tags: - Application - summary: Updates an application - 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 + summary: Creates an application using a YAML file + operationId: createApplicationYAML + security: + - userToken: [] requestBody: + required: true content: - application/json: + application/yaml: schema: - $ref: "#/components/schemas/ApplicationCreateRequest" - required: true + type: object + properties: + application: + type: string + format: binary responses: - "204": + "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 - "404": - description: Not Found "500": description: Internal Server Error + "/application/{name}": patch: tags: - Application 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: + - userToken: [] requestBody: content: application/json: @@ -643,18 +547,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: + - userToken: [] responses: "204": description: Success @@ -675,18 +575,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: + - userToken: [] responses: "200": description: Success @@ -712,18 +608,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: + - userToken: [] requestBody: required: true content: @@ -754,13 +646,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: + - userToken: [] responses: "200": description: Success @@ -779,51 +666,14 @@ paths: description: Not Found "500": description: Internal Server Error - /applicationTemplate: - post: - tags: - - Application Template - summary: Creates an application template - operationId: createApplicationTemplate - deprecated: true - parameters: - - in: header - name: Authorization - description: User Token - required: true - schema: - type: string - 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: - 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: + - userToken: [] requestBody: required: true content: @@ -851,61 +701,20 @@ 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: header - name: Authorization - description: User Token - required: true - schema: - type: string - - in: path - name: name - description: Application template name - required: true - schema: - type: string - 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 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: + - userToken: [] requestBody: content: application/json: @@ -932,18 +741,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: + - userToken: [] responses: "200": description: Success @@ -964,18 +769,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: + - userToken: [] responses: "200": description: Success @@ -1001,18 +802,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: + - userToken: [] requestBody: required: true content: @@ -1104,13 +901,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 @@ -1132,13 +924,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: @@ -1165,13 +952,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 @@ -1195,13 +977,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 @@ -1222,13 +999,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: @@ -1255,13 +1027,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 @@ -1291,12 +1058,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 @@ -1321,13 +1084,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 @@ -1350,13 +1108,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 @@ -1381,13 +1134,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 @@ -1411,13 +1159,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: @@ -1446,13 +1189,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 @@ -1477,13 +1215,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: @@ -1506,13 +1239,8 @@ paths: - ioFog summary: Retrieves HAL USB info operationId: getAgentHalUsbInfo - parameters: - - in: header - name: Authorization - description: User token - required: true - schema: - type: string + security: + - userToken: [] responses: "200": description: Success @@ -1536,13 +1264,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: @@ -1565,13 +1288,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 @@ -1590,13 +1308,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 @@ -1620,13 +1333,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: @@ -1653,13 +1361,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: @@ -1679,13 +1382,8 @@ paths: - Catalog summary: Gets microservices catalog operationId: getMicroservicesCatalog - parameters: - - in: header - name: Authorization - description: User Token - required: true - schema: - type: string + security: + - userToken: [] responses: "200": description: Success @@ -1707,13 +1405,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: + - userToken: [] requestBody: $ref: "#/components/requestBodies/CreateUpdateCatalogItemRequestBody" responses: @@ -1746,18 +1439,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: + - userToken: [] responses: "200": description: Catalog Item Info @@ -1782,18 +1471,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: + - userToken: [] requestBody: $ref: "#/components/requestBodies/CreateUpdateCatalogItemRequestBody" responses: @@ -1820,18 +1505,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: + - userToken: [] responses: "204": description: Success @@ -1846,20 +1527,28 @@ paths: description: Invalid Catalog Item Id "500": description: Internal Server Error - /flow: + /microservices: get: tags: - - Flow - summary: Gets list of flows - deprecated: true - operationId: getFlowsList + - Microservices + summary: Gets list of microservices + operationId: getMicroservicesList parameters: - - in: header - name: Authorization - description: User Token - required: true + - 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 + security: + - userToken: [] responses: "200": description: Success @@ -1871,26 +1560,29 @@ paths: content: application/json: schema: - $ref: "#/components/schemas/GetFlowsResponse" + $ref: "#/components/schemas/GetMicroservicesResponse" "401": description: Not Authorized "500": description: Internal Server Error + /microservices/yaml: post: tags: - - Flow - summary: Creates a new flow - deprecated: true - operationId: createFlow - parameters: - - in: header - name: Authorization - description: User Token - required: true - schema: - type: string + - Microservices + summary: Creates a new microservice in an Application + operationId: createMicroserviceYAML + security: + - userToken: [] requestBody: - $ref: "#/components/requestBodies/NewFlowRequest" + required: true + content: + application/yaml: + schema: + type: object + properties: + microsoervice: + type: string + format: binary responses: "201": description: Created @@ -1904,34 +1596,31 @@ paths: schema: type: object properties: - id: + uuid: type: string "400": description: Bad Request "401": description: Not Authorized + "409": + description: Duplicate Name "500": description: Internal Server Error - "/flow/{id}": + "/microservices/{uuid}": get: tags: - - Flow - summary: Gets flow info - operationId: getFlowInfo - deprecated: true + - Microservices + summary: Gets a microservice info + operationId: getMicroserviceInfo parameters: - - in: header - name: Authorization - description: User Token - required: true - schema: - type: string - in: path - name: id - description: Flow Id + name: uuid + description: Microservice Uuid required: true schema: type: string + security: + - userToken: [] responses: "200": description: Success @@ -1943,34 +1632,27 @@ paths: content: application/json: schema: - $ref: "#/components/schemas/FlowInfoResponse" + $ref: "#/components/schemas/MicroserviceInfoResponse" "401": description: Not Authorized "404": - description: Invalid Flow Id + description: Not Found "500": description: Internal Server Error - patch: + delete: tags: - - Flow - summary: Updates a flow - operationId: updateFlow - deprecated: true + - Microservices + summary: Deletes a microservice + operationId: deleteMicroservice parameters: - - in: header - name: Authorization - description: User Token - required: true - schema: - type: string - in: path - name: id - description: Flow Id + name: uuid + description: Microservice Uuid required: true schema: type: string - requestBody: - $ref: "#/components/requestBodies/NewFlowRequest" + security: + - userToken: [] responses: "204": description: Success @@ -1984,68 +1666,69 @@ paths: "401": description: Not Authorized "404": - description: Invalid Flow Id + description: Not Found "500": description: Internal Server Error - delete: + patch: tags: - - Flow - summary: Deletes a flow - operationId: deleteFlow - deprecated: true + - Microservices + summary: Updates a microservice + operationId: updateMicroservice parameters: - - in: header - name: Authorization - description: User Token + - in: path + name: uuid + description: Microservice Uuid required: true schema: 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: id - description: Flow Id + name: tag + description: Microservice Pub Tags required: true schema: type: string + security: + - userToken: [] responses: - "204": + "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 - "404": - description: Invalid Flow Id "500": description: Internal Server Error - /microservices: + /microservices/sub/{tag}: get: tags: - Microservices - summary: Gets list of microservices - operationId: getMicroservicesList + summary: Get list of microservices with filtered sub tag + operationId: listMicroserviceInfoBySubTag parameters: - - in: header - name: Authorization - description: User Token + - in: path + name: tag + description: Microservice Pub Tags required: true schema: type: string - - 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 + security: + - userToken: [] responses: "200": description: Success @@ -2062,72 +1745,86 @@ paths: description: Not Authorized "500": description: Internal Server Error - post: + /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: - Microservices - summary: Creates a new microservice on an ioFog node - operationId: createMicroservice - deprecated: true + summary: Updates a microservice + operationId: updateMicroserviceYAML parameters: - - in: header - name: Authorization - description: User Token + - in: path + name: uuid + description: Microservice Uuid required: true schema: type: string + security: + - userToken: [] requestBody: + required: true content: - application/json: + application/yaml: schema: - $ref: "#/components/schemas/NewMicroserviceRequest" - description: New Microservice Info - required: true + type: object + properties: + microservice: + type: string + format: binary responses: - "201": - description: Created + "204": + description: Success 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 + "404": + description: Not Found "409": description: Duplicate Name "500": description: Internal Server Error - /microservices/yaml: + "/microservices/{uuid}/port-mapping": post: tags: - Microservices - summary: Creates a new microservice in an Application - operationId: createMicroserviceYAML + summary: Creates a port mapping for microservice + operationId: createMicroservicePortMapping parameters: - - in: header - name: Authorization - description: User Token + - in: path + name: uuid + description: Microservice Uuid required: true schema: type: string + security: + - userToken: [] requestBody: - required: true content: - application/yaml: + application/json: schema: - type: object - properties: - microsoervice: - type: string - format: binary + $ref: "#/components/schemas/PortMappingsRequest" + description: information about port mapping + required: true responses: "201": description: Created @@ -2139,40 +1836,32 @@ paths: content: application/json: schema: - type: object - properties: - uuid: - type: string + $ref: "#/components/schemas/PortMappingsPublicResponse" "400": - description: Bad Request + description: Not Valid "401": description: Not Authorized - "409": - description: Duplicate Name + "404": + description: Not Found "500": description: Internal Server Error - "/microservices/{uuid}": get: tags: - Microservices - summary: Gets a microservice info - operationId: getMicroserviceInfo + 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: + - userToken: [] responses: "200": - description: Success + description: Created headers: X-Timestamp: description: FogController server timestamp @@ -2181,120 +1870,76 @@ paths: content: application/json: schema: - $ref: "#/components/schemas/MicroserviceInfoResponse" + $ref: "#/components/schemas/PortMappingsListResponse" "401": description: Not Authorized "404": description: Not Found "500": description: Internal Server Error - patch: + /microservices/system/{uuid}/port-mapping: + post: tags: - Microservices - summary: Updates a microservice - deprecated: true - operationId: updateMicroservice + summary: Creates a port mapping for system microservice + operationId: createSystemMicroservicePortMapping 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: + - userToken: [] requestBody: content: application/json: schema: - $ref: "#/components/schemas/UpdateMicroserviceRequest" - description: Microservice Info + $ref: "#/components/schemas/PortMappingsRequest" + description: information about port mapping required: true responses: - "204": - description: Success + "201": + description: Created headers: X-Timestamp: description: FogController server timestamp schema: type: number + content: + application/json: + schema: + $ref: "#/components/schemas/PortMappingsPublicResponse" "400": - description: Bad Request + description: Not Valid "401": description: Not Authorized "404": description: Not Found - "409": - description: Duplicate Name "500": description: Internal Server Error + "/microservices/{uuid}/port-mapping/{internalPort}": delete: tags: - Microservices - summary: Deletes a microservice - operationId: deleteMicroservice + 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 required: true schema: type: string - 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 - "500": - description: Internal Server Error - /microservices/yaml/{uuid}: - patch: - tags: - - Microservices - 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 + name: internalPort + description: Internal Port required: true schema: type: string - requestBody: - required: true - content: - application/yaml: - schema: - type: object - properties: - microservice: - type: string - format: binary + security: + - userToken: [] responses: "204": description: Success @@ -2303,72 +1948,19 @@ paths: 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 - - "/microservices/{uuid}/routes/{receiverUuid}": - post: - tags: - - Microservices - summary: Creates a route from microservice to receiver - operationId: createMicroserviceRoute - deprecated: true - 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 - - in: path - name: receiverUuid - description: Receiver Microservice Uuid - required: true - schema: - type: string - 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 + /microservices/system/{uuid}/port-mapping/{internalPort}: delete: tags: - Microservices - summary: Deletes a route microservice - operationId: deleteMicroserviceRoute - deprecated: true + summary: Deletes a port mapping for system microservice + operationId: deleteSystemMicroservicePortMapping parameters: - - in: header - name: Authorization - description: User Token - required: true - schema: - type: string - in: path name: uuid description: Microservice Uuid @@ -2376,11 +1968,13 @@ paths: schema: type: string - in: path - name: receiverUuid - description: Receiver Microservice Uuid + name: internalPort + description: Internal Port required: true schema: type: string + security: + - userToken: [] responses: "204": description: Success @@ -2389,39 +1983,33 @@ paths: 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": + "/microservices/{uuid}/volume-mapping": post: tags: - Microservices - summary: Creates a port mapping for microservice - operationId: createMicroservicePortMapping + 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: + - userToken: [] requestBody: content: application/json: schema: - $ref: "#/components/schemas/PortMappingsRequest" - description: information about port mapping + $ref: "#/components/schemas/VolumeMapping" + description: information about volume mapping required: true responses: "201": @@ -2434,7 +2022,10 @@ paths: content: application/json: schema: - $ref: "#/components/schemas/PortMappingsPublicResponse" + type: object + properties: + id: + type: number "400": description: Not Valid "401": @@ -2446,24 +2037,20 @@ paths: get: tags: - Microservices - summary: Get a port mapping list for microservice - operationId: getMicroservicePortMapping + 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: + - userToken: [] responses: "200": - description: Created + description: Success headers: X-Timestamp: description: FogController server timestamp @@ -2472,71 +2059,28 @@ paths: content: application/json: schema: - $ref: "#/components/schemas/PortMappingsListResponse" - "401": - description: Not Authorized - "404": - description: Not Found - "500": - description: Internal Server Error - "/microservices/{uuid}/port-mapping/{internalPort}": - delete: - tags: - - Microservices - 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 - required: true - schema: - type: string - - in: path - name: internalPort - description: Internal Port - required: true - schema: - type: string - responses: - "204": - description: Success - headers: - X-Timestamp: - description: FogController server timestamp - schema: - type: number + $ref: "#/components/schemas/VolumeMappingResponse" "401": description: Not Authorized "404": description: Not Found "500": description: Internal Server Error - "/microservices/{uuid}/volume-mapping": + "/microservices/system/{uuid}/volume-mapping": post: tags: - Microservices - summary: Creates a volume mapping for microservice - operationId: createMicroserviceVolumeMapping + summary: Creates a volume mapping for system microservice + operationId: createSystemMicroserviceVolumeMapping 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: + - userToken: [] requestBody: content: application/json: @@ -2567,55 +2111,50 @@ paths: description: Not Found "500": description: Internal Server Error - get: + "/microservices/{uuid}/volume-mapping/{id}": + delete: tags: - Microservices - summary: Get a volume mapping list for microservice - operationId: getMicroserviceVolumeMapping + summary: Deletes a volume mapping for microservice + operationId: deleteMicroserviceVolumeMapping parameters: - - in: header - name: Authorization - description: User Token + - in: path + name: uuid + description: Microservice Uuid required: true schema: type: string - in: path - name: uuid - description: Microservice Uuid + name: id + description: Volume id required: true schema: type: string + security: + - userToken: [] responses: - "200": + "204": description: Success headers: X-Timestamp: description: FogController server timestamp schema: type: number - content: - application/json: - schema: - $ref: "#/components/schemas/VolumeMappingResponse" + "400": + description: Not Valid "401": description: Not Authorized "404": description: Not Found "500": description: Internal Server Error - "/microservices/{uuid}/volume-mapping/{id}": + "/microservices/system/{uuid}/volume-mapping/{id}": delete: tags: - Microservices - summary: Deletes a volume mapping for microservice - operationId: deleteMicroserviceVolumeMapping + summary: Deletes a volume mapping for system microservice + operationId: deleteSystemMicroserviceVolumeMapping parameters: - - in: header - name: Authorization - description: User Token - required: true - schema: - type: string - in: path name: uuid description: Microservice Uuid @@ -2628,6 +2167,8 @@ paths: required: true schema: type: string + security: + - userToken: [] responses: "204": description: Success @@ -2651,18 +2192,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: + - userToken: [] responses: "201": description: Created @@ -2690,18 +2227,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: + - userToken: [] responses: "200": description: Success @@ -2728,18 +2261,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: + - userToken: [] requestBody: content: application/json: @@ -2772,12 +2301,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 +2315,8 @@ paths: enum: - file - string + security: + - userToken: [] responses: "200": description: Success @@ -2825,12 +2350,8 @@ paths: description: Microservice UUID schema: type: string - - in: header - name: Authorization - description: User Token - required: true - schema: - type: string + security: + - userToken: [] requestBody: content: application/json: @@ -2866,12 +2387,8 @@ paths: required: true schema: type: string - - in: header - name: Authorization - description: User Token - required: true - schema: - type: string + security: + - userToken: [] requestBody: content: application/json: @@ -2906,12 +2423,8 @@ paths: required: true schema: type: string - - in: header - name: Authorization - description: User token - required: true - schema: - type: string + security: + - userToken: [] responses: "200": description: Success @@ -2936,13 +2449,8 @@ paths: - Registries summary: Creates new registry operationId: createRegistry - parameters: - - in: header - name: Authorization - description: User Token - required: true - schema: - type: string + security: + - userToken: [] requestBody: content: application/json: @@ -2967,13 +2475,8 @@ paths: - Registries summary: Gets list of registries operationId: getRegistryList - parameters: - - in: header - name: Authorization - description: User token - required: true - schema: - type: string + security: + - userToken: [] responses: "200": description: Success @@ -3003,12 +2506,8 @@ paths: required: true schema: type: string - - in: header - name: Authorization - description: User token - required: true - schema: - type: string + security: + - userToken: [] responses: "204": description: Deleted @@ -3035,12 +2534,8 @@ paths: required: true schema: type: string - - in: header - name: Authorization - description: User token - required: true - schema: - type: string + security: + - userToken: [] requestBody: content: application/json: @@ -3091,121 +2586,18 @@ paths: description: bad request "401": description: incorrect credentials - /user/logout: - post: - tags: - - User - summary: Logout - operationId: logout - parameters: - - in: header - name: Authorization - description: User token - required: true - schema: - type: string - 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: + /user/refresh: post: tags: - User - summary: Activate account - operationId: activateAccount + summary: Refresh accessToken with refreshToken + operationId: refresh requestBody: content: application/json: schema: - $ref: "#/components/schemas/UserActivateRequest" - description: activation code + $ref: "#/components/schemas/RefreshRequest" 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 - parameters: - - in: header - name: Authorization - description: User token - required: true - schema: - type: string responses: "200": description: Success @@ -3217,134 +2609,48 @@ paths: 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 - parameters: - - in: header - name: Authorization - description: User Token - required: true - schema: - type: string - 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" + $ref: "#/components/schemas/RefreshSuccessResponse" "400": - description: Bad Request - "401": - description: Not Authorized - "500": - description: Internal Server Error - delete: - tags: - - User - summary: Delete account - operationId: deleteAccount - parameters: - - in: header - name: Authorization - description: User Token - required: true - schema: - type: string - 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 + description: bad request "401": - description: Not Authorized - "500": - description: Internal Server Error - /user/password: - patch: + description: incorrect credentials + /user/logout: + post: tags: - User - summary: change password - operationId: changePassword - parameters: - - in: header - name: Authorization - description: User Token - required: true - schema: - type: string - 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 + summary: Logout + operationId: logout + security: + - userToken: [] + responses: + "204": + description: Success "401": description: Not Authorized "500": description: Internal Server Error - delete: + /user/profile: + get: tags: - User - summary: Reset password - operationId: resetPassword - requestBody: - content: - application/json: - schema: - $ref: "#/components/schemas/PasswordResetRequest" - description: email - required: true + summary: Get current user profile data + operationId: getUserProfile + security: + - userToken: [] responses: - "204": + "200": description: Success headers: X-Timestamp: description: FogController server timestamp schema: type: number - "404": - description: Not Found + content: + application/json: + schema: + $ref: "#/components/schemas/UserProfileDetailsResponse" + "401": + description: Not Authorized "500": description: Internal Server Error /routes: @@ -3353,13 +2659,8 @@ paths: - Routing summary: Get routes operationId: getRoutes - parameters: - - in: header - name: Authorization - description: User Token - required: true - schema: - type: string + security: + - userToken: [] responses: "200": description: Success @@ -3381,13 +2682,8 @@ paths: - Routing summary: Creates a new route operationId: createRoute - parameters: - - in: header - name: Authorization - description: User Token - required: true - schema: - type: string + security: + - userToken: [] requestBody: content: application/json: @@ -3425,18 +2721,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: + - userToken: [] responses: "200": description: Route Info @@ -3461,18 +2753,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: + - userToken: [] requestBody: content: application/json: @@ -3504,18 +2792,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: + - userToken: [] responses: "204": description: Success @@ -3536,13 +2820,8 @@ paths: - Edge Resource summary: Get Edge Resources operationId: getEdgeResources - parameters: - - in: header - name: Authorization - description: User Token - required: true - schema: - type: string + security: + - userToken: [] responses: "200": description: Success @@ -3566,12 +2845,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 +2857,8 @@ paths: required: true schema: type: string + security: + - userToken: [] responses: "200": description: Success @@ -3606,12 +2881,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 +2893,8 @@ paths: required: true schema: type: string + security: + - userToken: [] requestBody: content: application/json: @@ -3653,12 +2924,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 +2936,8 @@ paths: required: true schema: type: string + security: + - userToken: [] responses: "204": description: Success @@ -3692,18 +2959,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: + - userToken: [] responses: "200": description: Success @@ -3726,13 +2989,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: + - userToken: [] requestBody: content: application/json: @@ -3763,12 +3021,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 +3033,8 @@ paths: required: true schema: type: string + security: + - userToken: [] requestBody: content: application/json: @@ -3808,12 +3062,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 +3074,8 @@ paths: required: true schema: type: string + security: + - userToken: [] requestBody: content: application/json: @@ -3876,8 +3126,16 @@ tags: description: Manage your users servers: - url: http://localhost:51121/api/v3 - - url: https://localhost:51121/api/v3 components: + securitySchemes: + userToken: + type: http + scheme: bearer + bearerFormat: JWT + agentToken: + type: apiKey + in: header + name: Authorization requestBodies: UpdateIOFogNodeRequestBody: content: @@ -4080,6 +3338,16 @@ components: type: string value: type: string + runAsUser: + type: string + platform: + type: string + runtime: + type: string + cdiDevices: + type: array + items: + type: string cmd: type: array items: @@ -4088,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: @@ -4117,8 +3393,6 @@ components: type: string isActivated: type: boolean - userId: - type: number microservices: type: array items: @@ -4205,6 +3479,16 @@ components: type: string value: type: string + runAsUser: + type: number + platform: + type: string + runtime: + type: string + cdiDevices: + type: array + items: + type: string cmd: type: array items: @@ -4213,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: @@ -4247,8 +3539,6 @@ components: type: string description: type: string - userId: - type: number application: type: object properties: @@ -4281,11 +3571,6 @@ components: example: ok timestamp: type: number - EmailActivationStatusResponse: - type: object - properties: - isEmailActivationEnabled: - type: boolean IOFogTypesResponse: type: object properties: @@ -4437,8 +3722,6 @@ components: type: number fogTypeId: type: number - userId: - type: number routerMode: type: string enum: @@ -4536,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: @@ -4862,6 +4159,16 @@ components: type: array items: $ref: "#/components/schemas/AgentEnvRequest" + runAsUser: + type: string + platform: + type: string + runtime: + type: string + cdiDevices: + type: array + items: + type: string cmd: type: array items: @@ -4912,6 +4219,9 @@ components: accessMode: type: string example: rw + type: + type: string + example: bind PortMappingsResponse: type: object properties: @@ -4922,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: @@ -4940,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: @@ -4968,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: @@ -5011,8 +4429,6 @@ components: type: string userEmail: type: string - userId: - type: string RegistryBody: type: object properties: @@ -5192,6 +4608,16 @@ components: type: string value: type: string + runAsUser: + type: string + platform: + type: string + runtime: + type: string + cdiDevices: + type: array + items: + type: string cmd: type: array items: @@ -5254,6 +4680,28 @@ components: type: array items: $ref: "#/components/schemas/PortMappingsRequest" + runAsUser: + type: string + platform: + type: string + runtime: + type: string + cdiDevices: + type: array + items: + type: string + cmd: + type: array + items: + type: string + pubTags: + type: array + items: + type: string + subTags: + type: array + items: + type: string UpdateMicroserviceRequest: type: object required: @@ -5285,6 +4733,28 @@ components: type: string fogTypeId: type: string + runAsUser: + type: string + platform: + type: string + runtime: + type: string + cdiDevices: + type: array + items: + type: string + cmd: + type: array + items: + type: string + pubTags: + type: array + items: + type: string + subTags: + type: array + items: + type: string IOFogNodeTunnelStatusInfoResponse: type: object properties: @@ -5303,104 +4773,63 @@ components: required: - email - password + - totp + RefreshRequest: + type: string + required: + - refreshToken properties: email: type: string password: type: string + totp: + type: string LoginSuccessResponse: type: object required: - accessToken + - refreshToken properties: accessToken: type: string - SignupSuccessResponse: - type: object - required: - - userId - - firstName - - lastName - - email - - emailActivated - properties: - userId: - type: number - firstName: - type: string - lastName: - type: string - email: - type: string - emailActivated: - type: boolean - UserProfileDetailsResponse: - type: object - required: - - firstName - - lastName - - email - properties: - firstName: - type: string - lastName: - type: string - email: - type: string - UserProfileUpdatesRequest: - type: object - properties: - firstName: - type: string - lastName: - type: string - UserActivateRequest: - type: object - required: - - activationCode - properties: - activationCode: - type: string - PasswordResetRequest: - type: object - required: - - email - properties: - email: + refreshToken: type: string - PasswordChangeRequest: + RefreshSuccessResponse: type: object required: - - oldPassword - - newPassword + - accessToken + - refreshToken properties: - oldPassword: + accessToken: type: string - newPassword: + refreshToken: type: string - DeleteParameters: - type: object - required: - - force - properties: - force: - type: boolean - SignupRequest: + UserProfileDetailsResponse: type: object - required: - - firstName - - lastName - - email - - password properties: - firstName: - type: string - lastName: - type: string - email: - type: string - password: - type: string + 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/logrotate.conf b/logrotate.conf index b94c050dc..7656fa264 100644 --- a/logrotate.conf +++ b/logrotate.conf @@ -1,10 +1,14 @@ /var/log/iofog-controller/iofog-controller.log { rotate 10 - size 10m + size 100m compress notifempty missingok postrotate - kill -HUP `cat /usr/local/lib/node_modules/iofogcontroller/src/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 2fcddbca9..ed86c5e11 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,137 +1,139 @@ { - "name": "@iofog/iofogcontroller", - "version": "3.0.2-dev", + "name": "@datasance/iofogcontroller", + "version": "3.4.10", "lockfileVersion": 3, "requires": true, "packages": { "": { - "name": "@iofog/iofogcontroller", - "version": "3.0.2-dev", + "name": "@datasance/iofogcontroller", + "version": "3.4.10", "hasInstallScript": true, "license": "EPL-2.0", "dependencies": { - "@iofog/ecn-viewer": "3.0.2", - "axios": "1.0.0-alpha.1", - "body-parser": "^1.20.1", + "@datasance/ecn-viewer": "0.4.2", + "axios": "1.7.4", + "body-parser": "^1.20.3", "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.3", "concurrent-queue": "7.0.2", - "cookie-parser": "1.4.3", + "cookie-parser": "1.4.7", "cors": "2.8.5", "daemonize2": "0.4.2", - "ejs": "3.1.7", - "express": "4.17.3", - "formidable": "1.2.1", + "ejs": "3.1.10", + "express": "4.21.2", + "express-session": "1.18.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", - "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": "^26.1.1", + "minimatch": "10.0.1", + "moment": "2.30.1", + "moment-timezone": "0.5.45", + "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", + "mysql2": "3.10.1", + "nconf": "0.12.1", + "node-fetch-npm": "^2.0.4", + "os": "0.1.2", "path": "0.12.7", - "pino": "6.6.1", - "pino-std-serializers": "2.5.0", + "pg": "8.12.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", + "umzug": "^3.7.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.16.0", + "eslint-config-google": "0.14.0", + "mocha": "10.6.0", + "mocha-junit-reporter": "2.2.1", + "newman": "^6.2.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", + "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/@ampproject/remapping": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", - "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", + "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.1.0", - "@jridgewell/trace-mapping": "^0.3.9" + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" }, "engines": { "node": ">=6.0.0" } }, "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.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.18.6" + "@babel/highlight": "^7.24.2", + "picocolors": "^1.0.0" }, "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==", + "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.21.0", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.21.0.tgz", - "integrity": "sha512-PuxUbxcW6ZYe656yL3EAhpy7qXKq0DmYsrJLpbB8XrsCP9Nm+XCg9XFMb5vIDliPD7+U/+M+QJlH17XOcB7eXA==", + "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.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", + "@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", + "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", - "json5": "^2.2.2", - "semver": "^6.3.0" + "json5": "^2.2.3", + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" @@ -141,6 +143,12 @@ "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", @@ -165,217 +173,289 @@ "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==", + "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.21.1", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.21.1.tgz", - "integrity": "sha512-1lT45bAYlQhFn/BHivJs43AiW2rg3/UbLyShGfF3C0KmHvO5fSghWd5kBJy30kpRRucGzXStvnnCFniCR2kXAA==", + "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.21.0", - "@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": { "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==", + "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": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" + "@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.0.0" + "node": ">=6.9.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==", + "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": { - "@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" + "yallist": "^3.0.2" } }, "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==", + "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.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==", + "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.21.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz", - "integrity": "sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg==", + "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.20.7", - "@babel/types": "^7.21.0" + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.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==", + "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.18.6" + "@babel/types": "^7.22.5" }, "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==", + "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.18.6" + "@babel/types": "^7.24.0" }, "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==", + "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.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" + "@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" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.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==", + "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.20.2" + "@babel/types": "^7.24.5" }, "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==", + "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.18.6" + "@babel/types": "^7.24.5" }, "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==", + "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.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.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" } }, "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==", + "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.21.0", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.21.0.tgz", - "integrity": "sha512-XXve0CBtOW0pd7MRzzmoyuSj0e3SEzj8pgyFxnTT1NJZL38BD1MK7yYrm8yefRPIDvNNe14xR4FdbHwpInD4rA==", + "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.20.7", - "@babel/traverse": "^7.21.0", - "@babel/types": "^7.21.0" + "@babel/template": "^7.24.0", + "@babel/traverse": "^7.24.5", + "@babel/types": "^7.24.5" }, "engines": { "node": ">=6.9.0" } }, "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.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.18.6", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" + "@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==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, "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==", + "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" @@ -385,34 +465,34 @@ } }, "node_modules/@babel/template": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz", - "integrity": "sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==", + "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.18.6", - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7" + "@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.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", + "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", + "debug": "^4.3.1", "globals": "^11.1.0" }, "engines": { @@ -436,6 +516,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", @@ -443,532 +532,552 @@ "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==", + "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.19.4", - "@babel/helper-validator-identifier": "^7.19.1", + "@babel/helper-string-parser": "^7.24.1", + "@babel/helper-validator-identifier": "^7.24.5", "to-fast-properties": "^2.0.0" }, "engines": { "node": ">=6.9.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/@colors/colors": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", + "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.1.90" + } }, - "node_modules/@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/@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==" }, - "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-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": { - "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" + "eslint-visitor-keys": "^3.3.0" }, "engines": { - "node": ">=8" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=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==", + "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, - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint-community/regexpp": { + "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": ">=8" + "node": "^12.0.0 || ^14.0.0 || >=16.0.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/@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": { - "p-locate": "^4.1.0" + "@eslint/object-schema": "^2.1.4", + "debug": "^4.3.1", + "minimatch": "^3.1.2" }, "engines": { - "node": ">=8" + "node": "^18.18.0 || ^20.9.0 || >=21.1.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/@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": { - "p-try": "^2.0.0" + "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" + "node": ">=6.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "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==", + "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": { - "p-limit": "^2.2.0" + "brace-expansion": "^1.1.7" }, "engines": { - "node": ">=8" + "node": "*" } }, - "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==", + "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": ">=8" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "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==", + "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==", "dev": true, + "dependencies": { + "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": ">=8" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "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==", + "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": { - "@jridgewell/set-array": "^1.0.0", - "@jridgewell/sourcemap-codec": "^1.4.10" - }, - "engines": { - "node": ">=6.0.0" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "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==", + "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==", "dev": true, + "dependencies": { + "ms": "^2.1.3" + }, "engines": { - "node": ">=6.0.0" + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "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==", + "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": ">=6.0.0" + "node": "*" } }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "node_modules/@eslint/eslintrc/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/@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==", + "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==", "dev": true, - "dependencies": { - "@jridgewell/resolve-uri": "3.1.0", - "@jridgewell/sourcemap-codec": "1.4.14" + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "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/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" - }, + "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": ">=10" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "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==", + "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": { - "abbrev": "1" - }, - "bin": { - "nopt": "bin/nopt.js" + "levn": "^0.4.1" }, "engines": { - "node": ">=6" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "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/@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/@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" - }, + "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/@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, "engines": { - "node": ">=10" + "node": ">=18.18.0" } }, - "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", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "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": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" + "@humanfs/core": "^0.19.1", + "@humanwhocodes/retry": "^0.3.0" }, "engines": { - "node": ">= 8" + "node": ">=18.18.0" } }, - "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==", + "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, "engines": { - "node": ">= 8" + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" } }, - "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" - }, + "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": ">= 8" + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" } }, - "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/@humanwhocodes/retry": { + "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" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" } }, - "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, + "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": { - "yallist": "^4.0.0" + "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": ">=10" + "node": ">=12" } }, - "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" - }, + "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": ">=10" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, - "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/@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/@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, + "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": { - "mkdirp": "^1.0.4", - "rimraf": "^3.0.2" + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" }, "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" + "node": ">=12" }, - "engines": { - "node": ">=10" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "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/@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": { - "glob": "^7.1.3" + "ansi-regex": "^6.0.1" }, - "bin": { - "rimraf": "bin.js" + "engines": { + "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "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==", + "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": { - "@octokit/types": "^9.0.0" + "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": ">= 14" + "node": ">=8" } }, - "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==", + "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": { - "@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" + "sprintf-js": "~1.0.2" } }, - "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==", + "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": { - "@octokit/types": "^9.0.0", - "is-plain-object": "^5.0.0", - "universal-user-agent": "^6.0.0" + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" }, "engines": { - "node": ">= 14" + "node": ">=8" } }, - "node_modules/@octokit/graphql": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-5.0.5.tgz", - "integrity": "sha512-Qwfvh3xdqKtIznjX9lz2D458r7dJPP8l6r4GQkIdWQouZwHQK0mVT88uwiU2bdTU2OtT1uOlKpRciUWldpG0yQ==", + "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": { - "@octokit/request": "^6.0.0", - "@octokit/types": "^9.0.0", - "universal-user-agent": "^6.0.0" + "argparse": "^1.0.7", + "esprima": "^4.0.0" }, - "engines": { - "node": ">= 14" + "bin": { + "js-yaml": "bin/js-yaml.js" } }, - "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==" - }, - "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==", + "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": { - "@octokit/types": "^9.0.0" + "p-locate": "^4.1.0" }, "engines": { - "node": ">= 14" - }, - "peerDependencies": { - "@octokit/core": ">=4" - } - }, - "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==", - "peerDependencies": { - "@octokit/core": ">=3" + "node": ">=8" } }, - "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/@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": { - "@octokit/types": "^9.0.0", - "deprecation": "^2.3.1" + "p-try": "^2.0.0" }, "engines": { - "node": ">= 14" + "node": ">=6" }, - "peerDependencies": { - "@octokit/core": ">=3" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "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==", + "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": { - "@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" + "p-limit": "^2.2.0" }, "engines": { - "node": ">= 14" + "node": ">=8" } }, - "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" - }, + "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": ">= 14" + "node": ">=8" } }, - "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/@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/@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==", - "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" + "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/@octokit/types": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-9.0.0.tgz", - "integrity": "sha512-LUewfj94xCMH2rbD5YJ+6AQ4AVjFYTgpp6rboWM5T7N3IsIF65SBEOVcYMGAEzO/kKNiNaW4LoWtoThOhH06gw==", + "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": { - "@octokit/openapi-types": "^16.0.0" + "@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/@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" - }, + "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": ">=12.22.0" + "node": ">=6.0.0" } }, - "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==", + "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": { - "@pnpm/network.ca-file": "^1.0.1", - "config-chain": "^1.1.11" - }, + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "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": ">=12" + "node": ">=14" } }, "node_modules/@postman/form-data": { @@ -985,672 +1094,435 @@ "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==", + "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": { - "safe-buffer": "^5.0.1" + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.2.0", + "url-parse": "^1.5.3" }, "engines": { - "node": "*" + "node": ">=6" } }, - "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/@postman/tunnel-agent": { + "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": { - "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" + "safe-buffer": "^5.0.1" }, "engines": { - "node": ">=14.17" - }, - "peerDependencies": { - "semantic-release": ">=18.0.0-beta.1" + "node": "*" } }, - "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": { + "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": { - "ms": "2.1.2" + "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" }, - "engines": { - "node": ">=6.0" + "peerDependencies": { + "@types/node": "*" }, "peerDependenciesMeta": { - "supports-color": { + "@types/node": { "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.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", - "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" - }, - "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==", + "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/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/@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/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/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": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" + "yallist": "^4.0.0" }, "engines": { - "node": ">= 8" + "node": ">=10" } }, - "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/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": { - "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" + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" }, "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==", + "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": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 4.0.0" } }, - "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" + "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": { + "@rushstack/node-core-library": "4.3.0", + "supports-color": "~8.1.1" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "@types/node": "*" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "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/@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": { - "yallist": "^4.0.0" + "has-flag": "^4.0.0" }, "engines": { "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" } }, - "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/@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": { + "@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/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/@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": { - "@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" + "sprintf-js": "~1.0.2" } }, - "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/@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": { - "path-key": "^3.0.0" + "@sentry/core": "7.115.0", + "@sentry/types": "7.115.0", + "@sentry/utils": "7.115.0" }, "engines": { "node": ">=8" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/@colors/colors": { - "version": "1.5.0", - "inBundle": true, - "license": "MIT", - "optional": true, - "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_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" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/@semantic-release/npm/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": ">=8" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/@npmcli/config": { - "version": "4.2.2", - "inBundle": true, - "license": "ISC", + "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": { - "@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" + "@sentry/core": "7.115.0", + "@sentry/types": "7.115.0", + "@sentry/utils": "7.115.0", + "localforage": "^1.8.1" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=8" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/@npmcli/disparity-colors": { - "version": "2.0.0", - "inBundle": true, - "license": "ISC", + "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": { - "ansi-styles": "^4.3.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": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=8" } }, - "node_modules/@semantic-release/npm/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" - }, + "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": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=8" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/@npmcli/git": { - "version": "3.0.2", - "inBundle": true, - "license": "ISC", + "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": { - "@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/types": "7.115.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/@sinonjs/commons": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", + "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", + "dev": true, "dependencies": { - "npm-bundled": "^1.1.1", - "npm-normalize-package-bin": "^1.0.1" - }, - "bin": { - "installed-package-contents": "index.js" - }, - "engines": { - "node": ">= 10" + "type-detect": "4.0.8" } }, - "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", + "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-normalize-package-bin": "^1.0.1" + "@sinonjs/commons": "^3.0.0" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/@npmcli/map-workspaces": { - "version": "2.0.4", - "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/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" + "@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/@npmcli/metavuln-calculator": { - "version": "3.1.1", - "inBundle": true, - "license": "ISC", + "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": { - "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" + "type-detect": "4.0.8" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/@npmcli/move-file": { - "version": "2.0.1", - "inBundle": true, - "license": "MIT", + "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/@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/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/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.16", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.16.tgz", + "integrity": "sha512-PatH4iOdyh3MyWtmHVFXLWCCIhUbopaltqddG9BzB+gMIzee2MJrvd+jouii9Z3wzQJruGWAm7WOMjgfG8hQlQ==", + "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": { - "mkdirp": "^1.0.4", - "rimraf": "^3.0.2" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "@types/ms": "*" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/@npmcli/name-from-folder": { - "version": "1.0.1", - "inBundle": true, - "license": "ISC" + "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/@semantic-release/npm/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/@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==", + "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": "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/@semantic-release/npm/node_modules/npm/node_modules/@npmcli/package-json": { - "version": "2.0.0", - "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": { - "json-parse-even-better-errors": "^2.3.1" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "@types/cookiejar": "*", + "@types/node": "*" + } + }, + "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==" + }, + "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/@semantic-release/npm/node_modules/npm/node_modules/@npmcli/promise-spawn": { + "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/abort-controller": { "version": "3.0.0", - "inBundle": true, - "license": "ISC", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", "dependencies": { - "infer-owner": "^1.0.4" + "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/@npmcli/query": { - "version": "1.2.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": { - "npm-package-arg": "^9.1.0", - "postcss-selector-parser": "^6.0.10", - "semver": "^7.3.7" + "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/@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" + "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": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=0.4.0" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/@tootallnate/once": { - "version": "2.0.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 10" + "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/abbrev": { - "version": "1.1.1", - "inBundle": true, - "license": "ISC" + "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/@semantic-release/npm/node_modules/npm/node_modules/agent-base": { + "node_modules/agent-base": { "version": "6.0.2", - "inBundle": true, - "license": "MIT", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "optional": true, "dependencies": { "debug": "4" }, @@ -1658,23 +1530,46 @@ "node": ">= 6.0.0" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/agentkeepalive": { - "version": "4.2.1", - "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==", + "optional": true, + "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==", + "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": { - "debug": "^4.1.0", - "depd": "^1.1.2", "humanize-ms": "^1.2.1" }, "engines": { "node": ">= 8.0.0" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/aggregate-error": { + "node_modules/aggregate-error": { "version": "3.1.0", - "inBundle": true, - "license": "MIT", + "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" @@ -1683,18 +1578,61 @@ "node": ">=8" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/ansi-regex": { + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/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.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" + } + }, + "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": "5.0.1", - "inBundle": true, - "license": "MIT", + "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/ansi-styles": { + "node_modules/ansi-styles": { "version": "4.3.0", - "inBundle": true, - "license": "MIT", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dependencies": { "color-convert": "^2.0.1" }, @@ -1705,6329 +1643,3149 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/aproba": { - "version": "2.0.0", - "inBundle": true, - "license": "ISC" + "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/@semantic-release/npm/node_modules/npm/node_modules/archy": { + "node_modules/append-field": { "version": "1.0.0", - "inBundle": true, - "license": "MIT" + "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/are-we-there-yet": { - "version": "3.0.1", - "inBundle": true, - "license": "ISC", + "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": { - "delegates": "^1.0.0", - "readable-stream": "^3.6.0" + "default-require-extensions": "^3.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/asap": { - "version": "2.0.6", - "inBundle": true, - "license": "MIT" + "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/@semantic-release/npm/node_modules/npm/node_modules/balanced-match": { - "version": "1.0.2", - "inBundle": true, - "license": "MIT" + "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/@semantic-release/npm/node_modules/npm/node_modules/bin-links": { - "version": "3.0.3", - "inBundle": true, - "license": "ISC", + "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": { - "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" + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" }, "engines": { "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "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/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": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">= 6" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/binary-extensions": { - "version": "2.2.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=8" + "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/@semantic-release/npm/node_modules/npm/node_modules/brace-expansion": { + "node_modules/argparse": { "version": "2.0.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/builtins": { - "version": "5.0.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "semver": "^7.0.0" + "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/cacache": { - "version": "16.1.3", - "inBundle": true, - "license": "ISC", + "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": { - "@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" + "call-bind": "^1.0.5", + "is-array-buffer": "^3.0.4" }, "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/chalk": { - "version": "4.1.2", - "inBundle": true, - "license": "MIT", + "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-includes": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz", + "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==", + "dev": true, "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "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": { - "node": ">=10" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/chownr": { - "version": "2.0.0", - "inBundle": true, - "license": "ISC", - "engines": { - "node": ">=10" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/cidr-regex": { - "version": "3.1.1", - "inBundle": true, - "license": "BSD-2-Clause", + "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": { - "ip-regex": "^4.1.0" + "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": ">=10" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/clean-stack": { - "version": "2.2.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=6" - } + "node_modules/asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/cli-columns": { - "version": "4.0.0", - "inBundle": true, - "license": "MIT", + "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": { - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">= 10" + "safer-buffer": "~2.1.0" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/cli-table3": { - "version": "0.6.2", - "inBundle": true, - "license": "MIT", + "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": { - "string-width": "^4.2.0" - }, - "engines": { - "node": "10.* || >= 12.*" - }, - "optionalDependencies": { - "@colors/colors": "1.5.0" + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "safer-buffer": "^2.1.0" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/clone": { - "version": "1.0.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==", + "dev": true, "engines": { "node": ">=0.8" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/cmd-shim": { - "version": "5.0.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "mkdirp-infer-owner": "^2.0.0" - }, + "node_modules/assertion-error": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", + "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", + "dev": true, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=12" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/color-convert": { - "version": "2.0.1", - "inBundle": true, - "license": "MIT", + "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": { - "color-name": "~1.1.4" + "tslib": "^2.0.1" }, "engines": { - "node": ">=7.0.0" + "node": ">=4" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/color-name": { - "version": "1.1.4", - "inBundle": true, - "license": "MIT" + "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/color-support": { - "version": "1.1.3", - "inBundle": true, - "license": "ISC", - "bin": { - "color-support": "bin.js" - } + "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/columnify": { - "version": "1.6.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "strip-ansi": "^6.0.1", - "wcwidth": "^1.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": ">=8.0.0" + "node": ">= 4.0.0" } }, - "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/@semantic-release/npm/node_modules/npm/node_modules/console-control-strings": { - "version": "1.1.0", - "inBundle": true, - "license": "ISC" - }, - "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/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": ">=4" + "node": ">=8.0.0" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/debug": { - "version": "4.3.4", - "inBundle": true, - "license": "MIT", + "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": { - "ms": "2.1.2" + "possible-typed-array-names": "^1.0.0" }, "engines": { - "node": ">=6.0" + "node": ">= 0.4" }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/debug/node_modules/ms": { - "version": "2.1.2", - "inBundle": true, - "license": "MIT" - }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/debuglog": { - "version": "1.0.1", - "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==", + "dev": true, "engines": { "node": "*" } }, - "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/@semantic-release/npm/node_modules/npm/node_modules/delegates": { - "version": "1.0.0", - "inBundle": true, - "license": "MIT" + "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==", + "dev": true }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/depd": { - "version": "1.1.2", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" + "node_modules/axios": { + "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", + "proxy-from-env": "^1.1.0" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/dezalgo": { - "version": "1.0.4", - "inBundle": true, - "license": "ISC", + "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": { - "asap": "^2.0.0", - "wrappy": "1" + "chalk": "^1.1.3", + "esutils": "^2.0.2", + "js-tokens": "^3.0.2" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/diff": { - "version": "5.1.0", - "inBundle": true, - "license": "BSD-3-Clause", + "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.3.1" - } - }, - "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, - "dependencies": { - "iconv-lite": "^0.6.2" + "node": ">=0.10.0" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/env-paths": { + "node_modules/babel-code-frame/node_modules/ansi-styles": { "version": "2.2.1", - "inBundle": true, - "license": "MIT", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", + "dev": true, "engines": { - "node": ">=6" + "node": ">=0.10.0" } }, - "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/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": { - "minipass": "^3.0.0" + "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": ">= 8" + "node": ">=0.10.0" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/fs.realpath": { - "version": "1.0.0", - "inBundle": true, - "license": "ISC" + "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/@semantic-release/npm/node_modules/npm/node_modules/function-bind": { - "version": "1.1.1", - "inBundle": true, - "license": "MIT" + "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/@semantic-release/npm/node_modules/npm/node_modules/gauge": { - "version": "4.0.4", - "inBundle": true, - "license": "ISC", + "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": { - "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": "^2.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=0.10.0" } }, - "node_modules/@semantic-release/npm/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/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/@semantic-release/npm/node_modules/npm/node_modules/graceful-fs": { - "version": "4.2.10", - "inBundle": true, - "license": "ISC" + "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/has": { - "version": "1.0.3", - "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/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": { - "function-bind": "^1.1.1" + "safe-buffer": "5.1.2" }, "engines": { - "node": ">= 0.4.0" + "node": ">= 0.8" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/has-flag": { - "version": "4.0.0", - "inBundle": true, - "license": "MIT", + "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", + "integrity": "sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg==", + "optional": true, "engines": { - "node": ">=8" + "node": ">=10.0.0" } }, - "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", + "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==", + "dev": true, "dependencies": { - "lru-cache": "^7.5.1" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "tweetnacl": "^0.14.3" } }, - "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", - "dependencies": { - "@tootallnate/once": "2", - "agent-base": "6", - "debug": "4" + "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" }, - "engines": { - "node": ">= 6" + "peerDependenciesMeta": { + "jasmine": { + "optional": true + }, + "jasmine-core": { + "optional": true + }, + "jest": { + "optional": true + }, + "mocha": { + "optional": true + } } }, - "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_modules/binary-extensions": { + "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": ">= 6" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/humanize-ms": { - "version": "1.2.1", - "inBundle": true, - "license": "MIT", + "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": { - "ms": "^2.0.0" + "file-uri-to-path": "1.0.0" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/iconv-lite": { - "version": "0.6.3", - "inBundle": true, - "license": "MIT", - "optional": true, + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/ignore-walk": { - "version": "5.0.1", - "inBundle": true, - "license": "ISC", + "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": { - "minimatch": "^5.0.1" + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">= 6" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/imurmurhash": { - "version": "0.1.4", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=0.8.19" + "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/@semantic-release/npm/node_modules/npm/node_modules/indent-string": { - "version": "4.0.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=8" - } + "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/@semantic-release/npm/node_modules/npm/node_modules/infer-owner": { - "version": "1.0.4", - "inBundle": true, - "license": "ISC" + "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/@semantic-release/npm/node_modules/npm/node_modules/inflight": { - "version": "1.0.6", - "inBundle": true, - "license": "ISC", + "node_modules/body-parser": { + "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": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "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", + "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.13.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/init-package-json": { - "version": "3.0.2", - "inBundle": true, - "license": "ISC", + "node_modules/body-parser/node_modules/qs": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", "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" + "side-channel": "^1.0.6" }, "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/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", - "engines": { - "node": ">=8" - } + "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/@semantic-release/npm/node_modules/npm/node_modules/is-cidr": { - "version": "4.0.2", - "inBundle": true, - "license": "BSD-2-Clause", + "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": { - "cidr-regex": "^3.1.1" - }, - "engines": { - "node": ">=10" + "balanced-match": "^1.0.0" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/is-core-module": { - "version": "2.10.0", - "inBundle": true, - "license": "MIT", + "node_modules/braces": { + "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": { - "has": "^1.0.3" + "fill-range": "^7.1.1" }, - "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", "engines": { "node": ">=8" } }, - "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/brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==" }, - "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/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/@semantic-release/npm/node_modules/npm/node_modules/jsonparse": { + "node_modules/browser-stdout": { "version": "1.3.1", - "engines": [ - "node >= 0.2.0" - ], - "inBundle": true, - "license": "MIT" - }, - "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" + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", + "dev": true }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/libnpmaccess": { - "version": "6.0.4", - "inBundle": true, - "license": "ISC", + "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": { - "aproba": "^2.0.0", - "minipass": "^3.1.1", - "npm-package-arg": "^9.0.1", - "npm-registry-fetch": "^13.0.0" + "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": "^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/libnpmdiff": { - "version": "4.0.5", - "inBundle": true, - "license": "ISC", + "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": { - "@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" + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" } }, - "node_modules/@semantic-release/npm/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" - }, + "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": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "*" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/libnpmfund": { - "version": "3.0.5", - "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/busboy": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", + "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", "dependencies": { - "@npmcli/arborist": "^5.6.3" + "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/libnpmhook": { - "version": "8.0.4", - "inBundle": true, - "license": "ISC", - "dependencies": { - "aproba": "^2.0.0", - "npm-registry-fetch": "^13.0.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": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">= 0.8" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/libnpmorg": { - "version": "4.0.4", - "inBundle": true, - "license": "ISC", + "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": { - "aproba": "^2.0.0", - "npm-registry-fetch": "^13.0.0" + "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" + "node": ">=8" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/libnpmpack": { - "version": "4.1.3", - "inBundle": true, - "license": "ISC", + "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": { - "@npmcli/run-script": "^4.1.3", - "npm-package-arg": "^9.0.1", - "pacote": "^13.6.1" + "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": "^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/libnpmpublish": { - "version": "6.0.5", - "inBundle": true, - "license": "ISC", + "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": { - "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" + "callsites": "^0.2.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=0.10.0" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/libnpmsearch": { - "version": "5.0.4", - "inBundle": true, - "license": "ISC", - "dependencies": { - "npm-registry-fetch": "^13.0.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": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=0.10.0" } }, - "node_modules/@semantic-release/npm/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/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=6" } }, - "node_modules/@semantic-release/npm/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/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": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=6" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/lru-cache": { - "version": "7.13.2", - "inBundle": true, - "license": "ISC", + "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==", + "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": ">=12" + "node": ">=0.10.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/make-fetch-happen": { - "version": "10.2.1", - "inBundle": true, - "license": "ISC", + "node_modules/caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==", + "dev": true + }, + "node_modules/chai": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/chai/-/chai-5.1.1.tgz", + "integrity": "sha512-pT1ZgP8rPNqUgieVaEY+ryQr6Q4HXNg8Ei9UnLUrjN4IA7dvQC5JB+/kxVcPNDHyBcc/26CXPkbNzq3qwrOEKA==", + "dev": 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", - "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" + "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": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=12" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/minimatch": { - "version": "5.1.0", - "inBundle": true, - "license": "ISC", + "node_modules/chai-as-promised": { + "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": { - "brace-expansion": "^2.0.1" + "check-error": "^1.0.2" }, - "engines": { - "node": ">=10" + "peerDependencies": { + "chai": ">= 2.1.2 < 6" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/minipass": { - "version": "3.3.4", - "inBundle": true, - "license": "ISC", + "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": { - "yallist": "^4.0.0" + "get-func-name": "^2.0.2" }, "engines": { - "node": ">=8" + "node": "*" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/minipass-collect": { - "version": "1.0.2", - "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": { - "minipass": "^3.0.0" + "@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": ">= 8" + "node": ">=10" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/minipass-fetch": { - "version": "2.1.1", - "inBundle": true, - "license": "MIT", + "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": { - "minipass": "^3.1.6", - "minipass-sized": "^1.0.3", - "minizlib": "^2.1.2" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=10" }, - "optionalDependencies": { - "encoding": "^0.1.13" + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/minipass-flush": { - "version": "1.0.5", - "inBundle": true, - "license": "ISC", + "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": { - "minipass": "^3.0.0" + "chalk": "^4.1.2" }, "engines": { - "node": ">= 8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/chalk-template?sponsor=1" + } + }, + "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/@semantic-release/npm/node_modules/npm/node_modules/minipass-json-stream": { + "node_modules/charset": { "version": "1.0.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "jsonparse": "^1.3.1", - "minipass": "^3.0.0" + "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/@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/check-error": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz", + "integrity": "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==", + "dev": true, "engines": { - "node": ">=8" + "node": ">= 16" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/minipass-sized": { - "version": "1.0.3", - "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/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": { - "minipass": "^3.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": ">=8" + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/minizlib": { - "version": "2.1.2", - "inBundle": true, - "license": "MIT", + "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": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" + "is-glob": "^4.0.1" }, "engines": { - "node": ">= 8" + "node": ">= 6" } }, - "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/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/@semantic-release/npm/node_modules/npm/node_modules/mkdirp-infer-owner": { - "version": "2.0.0", - "inBundle": true, - "license": "ISC", + "node_modules/chromedriver": { + "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": { - "chownr": "^2.0.0", - "infer-owner": "^1.0.4", - "mkdirp": "^1.0.3" + "@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": ">=10" + "node": ">=18" } }, - "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", - "engines": { - "node": ">= 0.6" - } + "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/@semantic-release/npm/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/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.22 || ^14.13 || >=16" - } - }, - "node_modules/@semantic-release/npm/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": ">=6" } }, - "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/cli-color": { + "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": { - "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" + "d": "^1.0.1", + "es5-ext": "^0.10.64", + "es6-iterator": "^2.0.3", + "memoizee": "^0.4.15", + "timers-ext": "^0.1.7" }, "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">=0.10" } }, - "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/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": { - "brace-expansion": "^1.1.7" + "restore-cursor": "^2.0.0" }, "engines": { - "node": "*" + "node": ">=4" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/node-gyp/node_modules/nopt": { - "version": "5.0.0", - "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": { - "abbrev": "1" - }, - "bin": { - "nopt": "bin/nopt.js" + "string-width": "^4.2.3" }, "engines": { - "node": ">=6" + "node": ">=4" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/nopt": { - "version": "6.0.0", - "inBundle": true, - "license": "ISC", + "node_modules/cli-table3": { + "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": { - "abbrev": "^1.0.0" - }, - "bin": { - "nopt": "bin/nopt.js" + "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/normalize-package-data": { - "version": "4.0.1", - "inBundle": true, - "license": "BSD-2-Clause", + "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": { - "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" + "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/npm-audit-report": { - "version": "3.0.0", - "inBundle": true, - "license": "ISC", + "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": { - "chalk": "^4.0.0" + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/npm-bundled": { + "node_modules/color-convert": { "version": "2.0.1", - "inBundle": true, - "license": "ISC", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dependencies": { - "npm-normalize-package-bin": "^2.0.0" + "color-name": "~1.1.4" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=7.0.0" } }, - "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", - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "optional": true, + "bin": { + "color-support": "bin.js" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/npm-install-checks": { - "version": "5.0.0", - "inBundle": true, - "license": "BSD-2-Clause", - "dependencies": { - "semver": "^7.1.1" - }, + "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": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=0.1.90" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/npm-normalize-package-bin": { - "version": "1.0.1", - "inBundle": true, - "license": "ISC" - }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/npm-package-arg": { - "version": "9.1.0", - "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": { - "hosted-git-info": "^5.0.0", - "proc-log": "^2.0.1", - "semver": "^7.3.5", - "validate-npm-package-name": "^4.0.0" + "delayed-stream": "~1.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">= 0.8" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/npm-packlist": { - "version": "5.1.3", - "inBundle": true, - "license": "ISC", + "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": { - "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" + "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_modules/@semantic-release/npm/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": ">=4.0.0" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/npm-pick-manifest": { - "version": "7.0.2", - "inBundle": true, - "license": "ISC", + "node_modules/command-line-usage": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-7.0.3.tgz", + "integrity": "sha512-PqMLy5+YGwhMh1wS04mVG44oqDsgyLRSKJBdOo1bnYhMKBW65gZF1dRp2OZRhiTjgUHljy99qkO7bsctLaw35Q==", "dependencies": { - "npm-install-checks": "^5.0.0", - "npm-normalize-package-bin": "^2.0.0", - "npm-package-arg": "^9.0.0", - "semver": "^7.3.5" + "array-back": "^6.2.2", + "chalk-template": "^0.4.0", + "table-layout": "^4.1.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/npm-pick-manifest/node_modules/npm-normalize-package-bin": { - "version": "2.0.0", - "inBundle": true, - "license": "ISC", + "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.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=12.17" } }, - "node_modules/@semantic-release/npm/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" - }, + "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.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=12.17" } }, - "node_modules/@semantic-release/npm/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" - }, + "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/npm-user-validate": { + "node_modules/commondir": { "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", - "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/@semantic-release/npm/node_modules/npm/node_modules/once": { - "version": "1.4.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "wrappy": "1" - } + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", + "dev": true }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/opener": { - "version": "1.5.2", - "inBundle": true, - "license": "(WTFPL OR MIT)", - "bin": { - "opener": "bin/opener-bin.js" - } + "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/@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" - }, + "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/@semantic-release/npm/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/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/parse-conflict-json": { - "version": "2.0.2", - "inBundle": true, - "license": "ISC", + "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": { - "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" + "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/path-is-absolute": { - "version": "1.0.1", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } + "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/@semantic-release/npm/node_modules/npm/node_modules/postcss-selector-parser": { - "version": "6.0.10", - "inBundle": true, - "license": "MIT", + "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": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" + "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/proc-log": { - "version": "2.0.1", - "inBundle": true, - "license": "ISC", - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "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/@semantic-release/npm/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/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/promise-call-limit": { - "version": "1.0.1", - "inBundle": true, - "license": "ISC", - "funding": { - "url": "https://github.com/sponsors/isaacs" + "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==", + "dev": true, + "dependencies": { + "ini": "^1.3.4", + "proto-list": "~1.2.1" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/promise-inflight": { - "version": "1.0.1", - "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==", + "dev": true }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/promise-retry": { - "version": "2.0.1", - "inBundle": true, - "license": "MIT", + "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": { - "err-code": "^2.0.2", - "retry": "^0.12.0" + "safe-buffer": "5.2.1" }, "engines": { - "node": ">=10" + "node": ">= 0.6" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/promzard": { - "version": "0.3.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "read": "1" + "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/@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/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.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", + "engines": { + "node": ">= 0.6" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/read": { - "version": "1.0.7", - "inBundle": true, - "license": "ISC", + "node_modules/cookie-parser": { + "version": "1.4.7", + "resolved": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.4.7.tgz", + "integrity": "sha512-nGUvgXnotP3BsjiLX2ypbQnWoGUPIIfHQNZkkC668ntrzGWEZVW70HDEB1qnNGMicPje6EttlIgzo51YSwNQGw==", "dependencies": { - "mute-stream": "~0.0.4" + "cookie": "0.7.2", + "cookie-signature": "1.0.6" }, "engines": { - "node": ">=0.8" + "node": ">= 0.8.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/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/read-package-json": { - "version": "5.0.2", - "inBundle": true, - "license": "ISC", + "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": { - "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" + "object-assign": "^4", + "vary": "^1" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">= 0.10" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/read-package-json-fast": { - "version": "2.0.3", - "inBundle": true, - "license": "ISC", + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, "dependencies": { - "json-parse-even-better-errors": "^2.3.0", - "npm-normalize-package-bin": "^1.0.1" + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" }, "engines": { - "node": ">=10" + "node": ">= 8" } }, - "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/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": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "*" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/readable-stream": { - "version": "3.6.0", - "inBundle": true, - "license": "MIT", + "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": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" + "es5-ext": "^0.10.64", + "type": "^2.7.2" }, "engines": { - "node": ">= 6" + "node": ">=0.12" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/readdir-scoped-modules": { - "version": "1.1.0", - "inBundle": true, - "license": "ISC", + "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==", + "dev": true, "dependencies": { - "debuglog": "^1.0.1", - "dezalgo": "^1.0.0", - "graceful-fs": "^4.1.2", - "once": "^1.3.0" + "assert-plus": "^1.0.0" + }, + "engines": { + "node": ">=0.10" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/retry": { - "version": "0.12.0", - "inBundle": true, - "license": "MIT", + "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": ">= 4" + "node": ">= 14" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/rimraf": { - "version": "3.0.2", - "inBundle": true, - "license": "ISC", + "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": { - "glob": "^7.1.3" + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" }, - "bin": { - "rimraf": "bin.js" + "engines": { + "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/rimraf/node_modules/brace-expansion": { - "version": "1.1.11", - "inBundle": true, - "license": "MIT", + "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": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "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/@semantic-release/npm/node_modules/npm/node_modules/rimraf/node_modules/glob": { - "version": "7.2.3", - "inBundle": true, - "license": "ISC", + "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": { - "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" + "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/isaacs" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/rimraf/node_modules/minimatch": { - "version": "3.1.2", - "inBundle": true, - "license": "ISC", + "node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dependencies": { - "brace-expansion": "^1.1.7" - }, + "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": "*" + "node": ">=0.10.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/@semantic-release/npm/node_modules/npm/node_modules/safer-buffer": { - "version": "2.1.2", - "inBundle": true, - "license": "MIT", - "optional": true - }, - "node_modules/@semantic-release/npm/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" - }, + "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": ">=10" + "node": ">=0.10.0" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/semver/node_modules/lru-cache": { + "node_modules/decompress-response": { "version": "6.0.0", - "inBundle": true, - "license": "ISC", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", "dependencies": { - "yallist": "^4.0.0" + "mimic-response": "^3.1.0" }, "engines": { "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "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/deep-eql": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.1.tgz", + "integrity": "sha512-nwQCf6ne2gez3o1MxWifqkciwt0zhl0LO1/UwVu4uMBuPmflWM4oQ70XMqHqnBJA+nhzncaqL9HVL6KkHJ28lw==", + "dev": true, + "engines": { + "node": ">=6" + } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/smart-buffer": { - "version": "4.2.0", - "inBundle": true, - "license": "MIT", + "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": ">= 6.0.0", - "npm": ">= 3.0.0" + "node": ">=4.0.0" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/socks": { - "version": "2.7.0", - "inBundle": true, - "license": "MIT", + "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==", + "devOptional": 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": { - "ip": "^2.0.0", - "smart-buffer": "^4.2.0" + "strip-bom": "^4.0.0" }, "engines": { - "node": ">= 10.13.0", - "npm": ">= 3.0.0" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/socks-proxy-agent": { - "version": "7.0.0", - "inBundle": true, - "license": "MIT", + "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": { - "agent-base": "^6.0.2", - "debug": "^4.3.3", - "socks": "^2.6.2" + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" }, "engines": { - "node": ">= 10" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/spdx-correct": { - "version": "3.1.1", - "inBundle": true, - "license": "Apache-2.0", + "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": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" + "capture-stack-trace": "~1.0.0" } }, - "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/@semantic-release/npm/node_modules/npm/node_modules/spdx-expression-parse": { - "version": "3.0.1", - "inBundle": true, - "license": "MIT", + "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": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" + "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/@semantic-release/npm/node_modules/npm/node_modules/spdx-license-ids": { - "version": "3.0.11", - "inBundle": true, - "license": "CC0-1.0" - }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/ssri": { - "version": "9.0.1", - "inBundle": true, - "license": "ISC", + "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": { - "minipass": "^3.1.1" + "ast-types": "^0.13.4", + "escodegen": "^2.1.0", + "esprima": "^4.0.1" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">= 14" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/string_decoder": { - "version": "1.3.0", - "inBundle": true, - "license": "MIT", + "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": { - "safe-buffer": "~5.2.0" + "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/@semantic-release/npm/node_modules/npm/node_modules/string-width": { - "version": "4.2.3", - "inBundle": true, - "license": "MIT", + "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": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/strip-ansi": { - "version": "6.0.1", - "inBundle": true, - "license": "MIT", + "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": { - "ansi-regex": "^5.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" }, "engines": { - "node": ">=8" + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/supports-color": { - "version": "7.2.0", - "inBundle": true, - "license": "MIT", + "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/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": { - "has-flag": "^4.0.0" + "brace-expansion": "^1.1.7" }, "engines": { - "node": ">=8" + "node": "*" } }, - "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" - }, + "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": ">= 10" + "node": ">=0.4.0" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/text-table": { - "version": "0.2.0", - "inBundle": true, - "license": "MIT" + "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/@semantic-release/npm/node_modules/npm/node_modules/tiny-relative-date": { - "version": "1.3.0", - "inBundle": true, - "license": "MIT" + "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/@semantic-release/npm/node_modules/npm/node_modules/treeverse": { + "node_modules/depd": { "version": "2.0.0", - "inBundle": true, - "license": "ISC", + "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/unique-filename": { - "version": "2.0.1", - "inBundle": true, - "license": "ISC", + "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": { - "unique-slug": "^3.0.0" - }, + "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": "^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/unique-slug": { - "version": "3.0.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "imurmurhash": "^0.1.4" - }, + "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==", "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=8" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/util-deprecate": { - "version": "1.0.2", - "inBundle": true, - "license": "MIT" + "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/@semantic-release/npm/node_modules/npm/node_modules/validate-npm-package-license": { - "version": "3.0.4", - "inBundle": true, - "license": "Apache-2.0", + "node_modules/dezalgo": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.4.tgz", + "integrity": "sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==", "dependencies": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" + "asap": "^2.0.0", + "wrappy": "1" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/validate-npm-package-name": { - "version": "4.0.0", - "inBundle": true, - "license": "ISC", + "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/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, "dependencies": { - "builtins": "^5.0.0" + "esutils": "^2.0.2" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=0.10.0" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/walk-up-path": { - "version": "1.0.0", - "inBundle": true, - "license": "ISC" + "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/@semantic-release/npm/node_modules/npm/node_modules/wcwidth": { - "version": "1.0.1", - "inBundle": true, - "license": "MIT", + "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==", + "dev": true, "dependencies": { - "defaults": "^1.0.3" + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/which": { - "version": "2.0.2", - "inBundle": true, - "license": "ISC", - "dependencies": { - "isexe": "^2.0.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==", + "dev": true + }, + "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": { - "node-which": "bin/node-which" + "editorconfig": "bin/editorconfig" }, "engines": { - "node": ">= 8" + "node": ">=14" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/wide-align": { - "version": "1.1.5", - "inBundle": true, - "license": "ISC", + "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/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": { - "string-width": "^1.0.2 || 2 || 3 || 4" + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/wrappy": { - "version": "1.0.2", - "inBundle": true, - "license": "ISC" + "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/@semantic-release/npm/node_modules/npm/node_modules/write-file-atomic": { - "version": "4.0.2", - "inBundle": true, - "license": "ISC", + "node_modules/ejs": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", + "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", "dependencies": { - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.7" + "jake": "^10.8.5" + }, + "bin": { + "ejs": "bin/cli.js" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=0.10.0" } }, - "node_modules/@semantic-release/npm/node_modules/npm/node_modules/yallist": { - "version": "4.0.0", - "inBundle": true, - "license": "ISC" + "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==", + "dev": true }, - "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/elliptic": { + "version": "6.6.1", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.6.1.tgz", + "integrity": "sha512-RaddvvMatK2LJHqFJ+YA4WysVN5Ita9E35botqIYspQ4TkRAlCicdzKOjlyv/1Za5RyTNn7di//eEV0uTAfe3g==", "dependencies": { - "mimic-fn": "^2.1.0" - }, + "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/emittery": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", + "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", "engines": { - "node": ">=6" + "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sindresorhus/emittery?sponsor=1" } }, - "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/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": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", "engines": { - "node": ">=8" + "node": ">= 0.8" } }, - "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==", + "node_modules/encoding": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", + "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" + "iconv-lite": "^0.6.2" } }, - "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/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==", "dependencies": { - "shebang-regex": "^3.0.0" + "safer-buffer": ">= 2.1.2 < 3.0.0" }, "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, - "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/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/@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/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": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, + "wrappy": "1" + } + }, + "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": ">= 8" + "node": ">=6" } }, - "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/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/@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/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.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", + "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.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", + "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.2", + "safe-regex-test": "^1.0.3", + "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.6", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.15" }, "engines": { - "node": ">=14.17" + "node": ">= 0.4" }, - "peerDependencies": { - "semantic-release": ">=18.0.0-beta.1" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "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/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": { - "ms": "2.1.2" + "get-intrinsic": "^1.2.4" }, "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "node": ">= 0.4" } }, - "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/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": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 0.4" } }, - "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/@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/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": { - "type-detect": "4.0.8" + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" } }, - "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==", + "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": { - "@sinonjs/commons": "^1", - "@sinonjs/samsam": "^3.1.0" + "get-intrinsic": "^1.2.4", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.1" + }, + "engines": { + "node": ">= 0.4" } }, - "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==", + "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": { - "@sinonjs/commons": "^1.3.0", - "array-from": "^2.1.1", - "lodash": "^4.17.15" + "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/@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==", + "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": ">= 10" + "node": ">=0.10" } }, - "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/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/@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/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": { - "@types/ms": "*" + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" } }, - "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/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/@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/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": { - "@types/cookiejar": "*", - "@types/node": "*" + "d": "1", + "es5-ext": "^0.10.46", + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.1" } }, - "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/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/@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/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/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/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/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/escodegen": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", + "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", + "optional": true, "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" }, "engines": { - "node": ">= 0.6" + "node": ">=6.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" } }, - "node_modules/acorn": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.1.tgz", - "integrity": "sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg==", - "dev": true, + "node_modules/eslint": { + "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.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.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.5", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "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", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3" + }, "bin": { - "acorn": "bin/acorn" + "eslint": "bin/eslint.js" }, "engines": { - "node": ">=0.4.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } } }, - "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==", + "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": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + "eslint": ">=5.16.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==", + "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": { - "define-error": "~1.0.0" + "debug": "^3.2.7", + "is-core-module": "^2.13.0", + "resolve": "^1.22.4" } }, - "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/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": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" + "ms": "^2.1.1" } }, - "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/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": { - "ms": "2.1.2" + "debug": "^3.2.7" }, "engines": { - "node": ">=6.0" + "node": ">=4" }, "peerDependenciesMeta": { - "supports-color": { + "eslint": { "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/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/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/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": { - "debug": "^4.1.0", - "depd": "^1.1.2", - "humanize-ms": "^1.2.1" + "eslint-utils": "^1.4.2", + "regexpp": "^2.0.1" }, "engines": { - "node": ">= 8.0.0" + "node": ">=6.5.0" + }, + "peerDependencies": { + "eslint": ">=4.19.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, + "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": { - "ms": "2.1.2" + "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.0" + "node": ">=6" }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "peerDependencies": { + "eslint": ">=4.19.1" } }, - "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/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": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "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/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, "engines": { - "node": ">=8" + "node": ">= 4" } }, - "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/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": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" + "brace-expansion": "^1.1.7" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" + "engines": { + "node": "*" } }, - "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==", + "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, - "peerDependencies": { - "ajv": "^6.9.1" + "bin": { + "semver": "bin/semver" } }, - "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==", + "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/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==", + "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, - "engines": { - "node": ">=4" + "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/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==", + "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==", "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.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/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==", + "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": { - "color-convert": "^1.9.0" + "eslint-visitor-keys": "^1.1.0" }, + "engines": { + "node": ">=6" + } + }, + "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/ansicolors": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/ansicolors/-/ansicolors-0.3.2.tgz", - "integrity": "sha512-QXu7BPrP29VllRxH8GwB7x5iX5qWKAAMLqKQGWTeLWVlNHNOpVMJ91dsxQAIWXpjuW5wqvxu3Jd/nRjrJ+0pqg==" + "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==", + "dev": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } }, - "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/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, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "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": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" + "ms": "2.1.2" }, "engines": { - "node": ">= 8" + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "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/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": { - "default-require-extensions": "^3.0.0" + "brace-expansion": "^1.1.7" }, "engines": { - "node": ">=8" + "node": "*" } }, - "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==", + "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/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/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": { - "delegates": "^1.0.0", - "readable-stream": "^3.6.0" + "d": "^1.0.1", + "es5-ext": "^0.10.62", + "event-emitter": "^0.3.5", + "type": "^2.7.2" }, "engines": { - "node": ">=10" + "node": ">=0.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==", + "node_modules/espree": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.3.0.tgz", + "integrity": "sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==", + "dev": true, "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" + "acorn": "^8.14.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.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": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "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/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/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" + "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" }, "engines": { - "node": ">=4.0.0" + "node": ">=4" } }, - "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/esquery": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "dev": true, "dependencies": { - "typical": "^2.6.1" + "estraverse": "^5.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==", - "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/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": { - "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" + "estraverse": "^5.2.0" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=4.0" } }, - "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==", + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "devOptional": true, "engines": { - "node": ">=8" + "node": ">=4.0" } }, - "node_modules/arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", + "node_modules/esutils": { + "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" } }, - "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==", + "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.8" + "node": ">= 0.6" } }, - "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/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": "*" + "node": ">=6" } }, - "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/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", "engines": { - "node": ">=4" + "node": ">=0.8.x" } }, - "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/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/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.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.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==", - "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/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/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/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.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-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/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.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/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.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.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.2", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", - "integrity": "sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==", - "dev": true, - "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==", - "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==", - "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==", - "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==", - "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==", - "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==", - "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==", - "devOptional": 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.0", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", - "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", - "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" - ], - "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/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.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/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.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/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/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-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.0", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", - "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", - "dev": true, - "dependencies": { - "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==" - }, - "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.1", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz", - "integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==", - "engines": { - "node": ">=8" - } - }, - "node_modules/diff": { - "version": "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.3", - "resolved": "https://registry.npmjs.org/dottie/-/dottie-2.0.3.tgz", - "integrity": "sha512-4liA0PuRkZWQFQjwBypdxPfZaRWiv5tkhMXY2hzsa2pNf5s7U3m9cwUchfNKe8wZQxdGPQQzO6Rm2uGe0rvohQ==" - }, - "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/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==", - "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/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.21.1", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.1.tgz", - "integrity": "sha512-QudMsPOz86xYz/1dG1OuGBKOELjCh99IIWHLzy5znUB6j8xG2yMA7bfTV86VSqKF+Y/H08vQPR+9jyXpuC6hfg==", - "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" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es-set-tostringtag": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", - "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.1.3", - "has": "^1.0.3", - "has-tostringtag": "^1.0.0" - }, - "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.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": "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.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_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.7.4", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.4.tgz", - "integrity": "sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA==", - "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/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.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/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/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/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, - "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.2.12", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", - "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/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.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/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/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.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/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": { + "node_modules/eventuate/node_modules/object-assign": { "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==", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz", + "integrity": "sha512-jHP15vXVGeVh1HuaA2wY6lxk+whK/x4KBG88VXeRma7CCun7iGD5qPc4eYykQ9sdQvg8jkwFKsSxHln2ybW3xQ==", "engines": { - "node": "*" + "node": ">=0.10.0" } }, - "node_modules/form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "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": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" + "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": ">=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==", + "node_modules/execa/node_modules/cross-spawn": { + "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", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, "engines": { - "node": ">= 0.6" + "node": ">=4.8" } }, - "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/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/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/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/from2": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", - "integrity": "sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==", + "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": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.0" + "shebang-regex": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/from2/node_modules/isarray": { + "node_modules/execa/node_modules/shebang-regex": { "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" + "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/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/execa/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", "dependencies": { - "safe-buffer": "~5.1.0" + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" } }, - "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/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/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/express": { + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", + "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.3", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.7.1", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.3.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.3", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.12", + "proxy-addr": "~2.0.7", + "qs": "6.13.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.19.0", + "serve-static": "1.16.2", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" }, "engines": { - "node": ">=14.14" + "node": ">= 0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, - "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==", + "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==", "dependencies": { - "minipass": "^3.0.0" + "cookie": "0.7.2", + "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": ">= 8" + "node": ">= 0.8.0" } }, - "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/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/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" - }, + "node_modules/express/node_modules/cookie": { + "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.8.0" + "node": ">= 0.6" } }, - "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/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/express/node_modules/qs": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.0", - "functions-have-names": "^1.2.2" + "side-channel": "^1.0.6" }, "engines": { - "node": ">= 0.4" + "node": ">=0.6" }, "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==", + "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, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "dependencies": { + "type": "^2.7.2" } }, - "node_modules/gauge": { + "node_modules/extend": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", - "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "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": { - "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" + "chardet": "^0.4.0", + "iconv-lite": "^0.4.17", + "tmp": "^0.0.33" }, "engines": { - "node": ">=10" - } - }, - "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==", - "engines": { - "node": ">=8" + "node": ">=0.12" } }, - "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/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/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/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": ">=0.10.0" + "node": ">= 10.17.0" + }, + "optionalDependencies": { + "@types/yauzl": "^2.9.1" } }, - "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/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": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "ms": "2.1.2" }, "engines": { - "node": ">=8" + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "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/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": { - "ansi-regex": "^5.0.1" + "pump": "^3.0.0" }, "engines": { "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "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/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", + "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", "dev": true, - "engines": { - "node": ">=6.9.0" - } + "engines": [ + "node >=0.6.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/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true }, - "node_modules/get-func-name": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", - "integrity": "sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==", - "dev": true, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, + "node_modules/fast-redact": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/fast-redact/-/fast-redact-3.5.0.tgz", + "integrity": "sha512-dwsoQlS7h9hMeYUq1W++23NDcBLV4KqONnITDV9DjfS3q1SgDGVrBdvvTLUotWtPSD7asWDV9/CmsZPy8Hf70A==", "engines": { - "node": "*" + "node": ">=6" } }, - "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/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/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": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "pend": "~1.2.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/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" + }, "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==", + "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": ">=4" + "node": ">=0.8.0" } }, - "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/file-entry-cache": { + "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": { - "pump": "^3.0.0" + "flat-cache": "^4.0.0" }, "engines": { - "node": ">=6" + "node": ">=16.0.0" } }, - "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/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, - "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": ">=0.10.0" } }, - "node_modules/git-log-parser/node_modules/isarray": { + "node_modules/file-uri-to-path": { "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==" + "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/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==", + "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": { - "through2": "~2.0.0" + "minimatch": "^5.0.1" } }, - "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==", + "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.1.0" + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" } }, - "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/filesize": { + "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/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "node_modules/fill-range": { + "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": { - "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" + "to-regex-range": "^5.0.1" }, "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">=8" } }, - "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==", + "node_modules/finalhandler": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", + "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", "dependencies": { - "is-glob": "^4.0.1" + "debug": "2.6.9", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" }, "engines": { - "node": ">= 6" + "node": ">= 0.8" } }, - "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==", + "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": ">=4" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/avajs/find-cache-dir?sponsor=1" } }, - "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, + "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": { - "define-properties": "^1.1.3" + "array-back": "^3.0.1" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=4.0.0" } }, - "node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "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": { - "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" + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" }, "engines": { "node": ">=10" @@ -8036,460 +4794,382 @@ "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" + "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/gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "node_modules/flat-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", "dev": true, "dependencies": { - "get-intrinsic": "^1.1.3" + "flatted": "^3.2.9", + "keyv": "^4.5.4" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">=16" } }, - "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/flatted": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", + "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", + "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==", - "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==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], "engines": { - "node": ">=4.x" + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } } }, - "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/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": { - "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" + "is-callable": "^1.1.3" } }, - "node_modules/har-schema": { + "node_modules/foreground-child": { "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", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", + "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", + "dev": true, "dependencies": { - "ajv": "^6.12.3", - "har-schema": "^2.0.0" + "cross-spawn": "^7.0.0", + "signal-exit": "^3.0.2" }, "engines": { - "node": ">=6" + "node": ">=8.0.0" } }, - "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==", + "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": ">=6" + "node": "*" } }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "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": { - "function-bind": "^1.1.1" + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" }, "engines": { - "node": ">= 0.4.0" + "node": ">= 6" } }, - "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, + "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": { - "ansi-regex": "^2.0.0" + "dezalgo": "^1.0.4", + "hexoid": "^1.0.0", + "once": "^1.4.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" + "url": "https://ko-fi.com/tunnckoCore/commissions" } }, - "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==", - "dev": true, + "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": { - "get-intrinsic": "^1.1.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "wrappy": "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==", - "dev": true, + "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.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">= 0.6" } }, - "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==", + "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.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">= 0.6" } }, - "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/fromentries": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/fromentries/-/fromentries-1.3.2.tgz", + "integrity": "sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==", "dev": true, - "dependencies": { - "has-symbols": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } + "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/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/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/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/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, "dependencies": { - "is-stream": "^2.0.0", - "type-fest": "^0.8.0" + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=14.14" } }, - "node_modules/hasha/node_modules/is-stream": { + "node_modules/fs-extra/node_modules/universalify": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true, + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "optional": true, "engines": { - "node": ">=8" - }, - "funding": { - "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, - "bin": { - "he": "bin/he" + "node": ">= 10.0.0" } }, - "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/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/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/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": ">=4.0.0" + "node": "^8.16.0 || ^10.6.0 || >=11.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==", + "node_modules/ftp": { + "version": "0.3.10", + "resolved": "https://registry.npmjs.org/ftp/-/ftp-0.3.10.tgz", + "integrity": "sha512-faFVML1aBx2UoDStmLwv2Wptt4vw5x03xxX172nhA5Y5HBshW5JweqQ2W4xL4dezQTG8inJsuYcpPHHU3X5OTQ==", "dependencies": { - "bowser": "^2.7.0", - "camelize": "1.0.0", - "content-security-policy-builder": "2.1.0", - "dasherize": "2.0.0" + "readable-stream": "1.1.x", + "xregexp": "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": ">=0.8.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/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/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/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": { - "lru-cache": "^6.0.0" + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "functions-have-names": "^1.2.3" }, "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" + "node": ">= 0.4" }, - "engines": { - "node": ">=10" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/hosted-git-info/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/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/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/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/hsts": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/hsts/-/hsts-2.2.0.tgz", - "integrity": "sha512-ToaTnQ2TbJkochoVcdXYm4HOCliNozlviNsg+X2XQLQvZNI/kCHR9rZxVYpJB3UPcHz80PgxRyWQ7PdU1r+VBQ==", + "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": { - "depd": "2.0.0" + "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": ">=4.0.0" + "node": "^12.13.0 || ^14.15.0 || >=16.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==", + "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": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - }, + "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": ">= 0.8" + "node": ">=6.9.0" } }, - "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/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": ">= 0.8" + "node": "6.* || 8.* || >= 10.*" } }, - "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" - }, + "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": ">= 6" + "node": "*" } }, - "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==", + "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": { - "ms": "2.1.2" + "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": ">=6.0" + "node": ">= 0.4" }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "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": { + "node_modules/get-package-type": { "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==", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", "dev": true, - "dependencies": { - "assert-plus": "^1.0.0", - "jsprim": "^2.0.2", - "sshpk": "^1.14.1" - }, "engines": { - "node": ">=0.10" + "node": ">=8.0.0" } }, - "node_modules/httpntlm": { - "version": "1.7.7", - "resolved": "https://registry.npmjs.org/httpntlm/-/httpntlm-1.7.7.tgz", - "integrity": "sha512-Pv2Rvrz8H0qv1Dne5mAdZ9JegG1uc6Vu5lwLflIY6s8RKHdZQbW39L4dYswSgqMDT0pkJILUTKjeyU0VPNRZjA==", - "dev": true, + "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": { - "httpreq": ">=0.4.22", - "underscore": "~1.12.1" + "pump": "^3.0.0" }, "engines": { - "node": ">=0.8.0" + "node": ">=6" } }, - "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": "0.5.2", - "resolved": "https://registry.npmjs.org/httpreq/-/httpreq-0.5.2.tgz", - "integrity": "sha512-2Jm+x9WkExDOeFRrdBCBSpLPT5SokTcRHkunV3pjKmX/cx6av8zQ0WtHUMDrYb6O4hBFzNU6sxJEypvRUVYKnw==", + "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": ">= 6.15.1" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "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==", + "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": { - "agent-base": "6", - "debug": "4" + "basic-ftp": "^5.0.2", + "data-uri-to-buffer": "^6.0.2", + "debug": "^4.3.4", + "fs-extra": "^11.2.0" }, "engines": { - "node": ">= 6" + "node": ">= 14" } }, - "node_modules/https-proxy-agent/node_modules/debug": { + "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" }, @@ -8502,313 +5182,239 @@ } } }, - "node_modules/https-proxy-agent/node_modules/ms": { + "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==" - }, - "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" - } + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "optional": 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==", + "node_modules/getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", + "dev": true, "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "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" + "assert-plus": "^1.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/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/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/glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" }, "engines": { - "node": ">=6" + "node": ">=12" }, "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" + "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" }, - "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": ">=10.13.0" } }, - "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==", + "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==", "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==", + "brace-expansion": "^2.0.1" + }, "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==", + "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": { - "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" + "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": ">=6.0.0" + "node": ">=10.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==", + "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": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", "dev": true, "engines": { - "node": ">=6" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "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/globalthis": { + "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": { - "ansi-regex": "^4.1.0" + "define-properties": "^1.2.1", + "gopd": "^1.0.1" }, "engines": { - "node": ">=6" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "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==", - "dev": true, + "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.2.0", - "has": "^1.0.3", - "side-channel": "^1.0.4" + "get-intrinsic": "^1.1.3" }, - "engines": { - "node": ">= 0.4" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "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/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": { - "from2": "^2.3.0", - "p-is-promise": "^3.0.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": ">=10" + "node": ">=0.4.7" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "optionalDependencies": { + "uglify-js": "^3.1.4" } }, - "node_modules/ip": { + "node_modules/har-schema": { "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==", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==", "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==", + "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", + "dev": true, + "dependencies": { + "ajv": "^6.12.3", + "har-schema": "^2.0.0" + }, "engines": { - "node": ">= 0.10" + "node": ">=6" } }, - "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" - }, + "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": ">=8" + "node": ">= 0.4.0" } }, - "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==", + "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": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", - "is-typed-array": "^1.1.10" + "ansi-regex": "^2.0.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">=0.10.0" } }, - "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/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/is-bigint": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "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, - "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" - }, + "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/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/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": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" + "es-define-property": "^1.0.0" }, "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, + "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" }, @@ -8816,25 +5422,10 @@ "url": "https://github.com/sponsors/ljharb" } }, - "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==", - "dependencies": { - "has": "^1.0.3" - }, - "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" - }, + "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" }, @@ -8842,1193 +5433,1168 @@ "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==", + "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": { - "is-admin": "^3.0.0", - "is-root": "^2.1.0" + "has-symbols": "^1.0.3" }, "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": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", - "engines": { - "node": ">=4" - } + "node_modules/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/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/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": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" } }, - "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==", + "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": { - "ip-regex": "^2.0.0" + "is-stream": "^2.0.0", + "type-fest": "^0.8.0" }, "engines": { - "node": ">=4" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "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==", + "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": ">= 0.4" + "node": ">=8" }, "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" + "url": "https://github.com/sponsors/sindresorhus" } }, - "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/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", "dependencies": { - "has-tostringtag": "^1.0.0" + "function-bind": "^1.1.2" }, "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/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/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/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": ">=6" + "node": ">=16.0.0" } }, - "node_modules/is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "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/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/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/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/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.10.0" + "node": ">= 0.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==", + "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/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==", + "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": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" + "assert-plus": "^1.0.0", + "jsprim": "^2.0.2", + "sshpk": "^1.14.1" }, "engines": { - "node": ">= 0.4" + "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" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">=10.4.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==", + "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/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/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" + "node": ">= 6.15.1" } }, - "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/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": "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": { - "call-bind": "^1.0.2" + "agent-base": "6", + "debug": "4" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "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==", + "optional": true, + "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==", + "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" } }, - "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/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/is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "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.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">= 4" } }, - "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==", + "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": { - "has-symbols": "^1.0.2" + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" }, "engines": { - "node": ">= 0.4" + "node": ">=6" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "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" - }, + "node_modules/import-lazy": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz", + "integrity": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==", "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/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "devOptional": true, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=0.8.19" } }, - "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, + "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": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8" } }, - "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/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/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/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/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/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, - "node_modules/isexe": { + "node_modules/ini": { "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==" + "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", + "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", + "engines": { + "node": ">=10" + } }, - "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/inquirer": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-5.2.0.tgz", + "integrity": "sha512-E9BmnJbAKLPGonz0HeWHtbKf+EeSP93paWO3ZYoUpq/aowXvYGjjCSuashhXPpzbArIjBbji39THkxTz9ZeEUQ==", + "dev": true, "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" + "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": ">=10.13" + "node": ">=6.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==", + "node_modules/inquirer/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": ">=8" + "node": ">=4" } }, - "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==", + "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": { - "append-transform": "^2.0.0" + "color-convert": "^1.9.0" }, "engines": { - "node": ">=8" + "node": ">=4" } }, - "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==", + "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": { - "@babel/core": "^7.7.5", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.0.0", - "semver": "^6.3.0" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" }, "engines": { - "node": ">=8" + "node": ">=4" } }, - "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==", + "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, - "bin": { - "semver": "bin/semver.js" + "dependencies": { + "color-name": "1.1.3" } }, - "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==", + "node_modules/inquirer/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/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, - "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": ">=4" } }, - "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/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": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" }, "engines": { - "node": ">= 8" + "node": ">=4" } }, - "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==", + "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": ">=8" + "node": ">=4" } }, - "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/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": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" + "has-flag": "^3.0.0" }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "engines": { + "node": ">=4" } }, - "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/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": { - "shebang-regex": "^3.0.0" + "es-errors": "^1.3.0", + "hasown": "^2.0.0", + "side-channel": "^1.0.4" }, "engines": { - "node": ">=8" + "node": ">= 0.4" } }, - "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/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": ">=8" + "node": ">= 12" } }, - "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==", + "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, - "bin": { - "uuid": "dist/bin/uuid" + "engines": { + "node": ">=4" } }, - "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/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": ">= 8" + "node": ">= 0.10" } }, - "node_modules/istanbul-lib-report": { + "node_modules/is-admin": { "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, + "resolved": "https://registry.npmjs.org/is-admin/-/is-admin-3.0.0.tgz", + "integrity": "sha512-wOa3CXFJAu8BZ2BDtG9xYOOrsq6oiSvc2jFPy4X/HINx5bmJUcW8e+apItVbU2E7GIfBVaFVO7Zit4oAWtTJcw==", "dependencies": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^3.0.0", - "supports-color": "^7.1.0" + "execa": "^1.0.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==", + "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": ">=8" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "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==", + "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==", + "dev": true + }, + "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-flag": "^4.0.0" + "has-bigints": "^1.0.1" }, - "engines": { - "node": ">=8" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "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==", + "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": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" + "binary-extensions": "^2.0.0" }, "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==", + "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": { - "ms": "2.1.2" + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" }, "engines": { - "node": ">=6.0" + "node": ">= 0.4" }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "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==", + "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/istanbul-reports": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", - "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", + "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, - "dependencies": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - }, "engines": { - "node": ">=8" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jake": { - "version": "10.8.5", - "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.5.tgz", - "integrity": "sha512-sVpxYeuAhWt0OTWITwT98oyV0GsXyMlXCF+3L1SuafBVUIr/uILGRB+NqwkzhgXKvoJpDIpQvqkUALgdmQsQxw==", + "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": { - "async": "^3.2.3", - "chalk": "^4.0.2", - "filelist": "^1.0.1", - "minimatch": "^3.0.4" - }, - "bin": { - "jake": "bin/cli.js" + "hasown": "^2.0.0" }, - "engines": { - "node": ">=10" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "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==", + "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": { - "color-convert": "^2.0.1" + "is-typed-array": "^1.1.13" }, "engines": { - "node": ">=8" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "url": "https://github.com/sponsors/ljharb" } }, - "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/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": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "has-tostringtag": "^1.0.0" }, "engines": { - "node": ">=10" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "url": "https://github.com/sponsors/ljharb" } }, - "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/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": { - "color-name": "~1.1.4" + "is-admin": "^3.0.0", + "is-root": "^2.1.0" }, - "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" - }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, - "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/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.6.0" + "node": ">=8" } }, - "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==", + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dev": true, "dependencies": { - "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" + "is-extglob": "^2.1.1" }, "engines": { - "node": ">=10" + "node": ">=0.10.0" } }, - "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==", + "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": { - "balanced-match": "^1.0.0" + "ip-regex": "^2.0.0" + }, + "engines": { + "node": ">=4" } }, - "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==", + "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, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" - }, "engines": { - "node": ">=12" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/sponsors/ljharb" } }, - "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==", + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, "engines": { - "node": ">=10" + "node": ">=0.12.0" } }, - "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==", + "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": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" + "lodash.isfinite": "^3.3.2" } }, - "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==", + "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, - "bin": { - "jsesc": "bin/jsesc" + "dependencies": { + "has-tostringtag": "^1.0.0" }, "engines": { - "node": ">=4" + "node": ">= 0.4" + }, + "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/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/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==", + "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/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/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/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "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, - "bin": { - "json5": "lib/cli.js" + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" }, "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" + "node": ">= 0.4" }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "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/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/jsonschema": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/jsonschema/-/jsonschema-1.2.5.tgz", - "integrity": "sha512-kVTF+08x25PQ0CjuVc0gRM9EUPb0Fe9Ln/utFOgcdxEIOHuU7ooBk/UPTd7t1M91pP35m0MU1T8M5P7vP1bRRw==", + "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": "*" + "node": ">=6" } }, - "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/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": { - "jsonparse": "^1.2.0", - "through": ">=2.2.7 <3" - }, - "bin": { - "JSONStream": "bin.js" + "call-bind": "^1.0.7" }, "engines": { - "node": "*" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "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/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/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==", + "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": { - "array-includes": "^3.1.1", - "object.assign": "^4.1.0" + "has-tostringtag": "^1.0.0" }, "engines": { - "node": ">=4.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "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==", + "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.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==", + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" + "which-typed-array": "^1.1.14" }, "engines": { - "node": ">= 0.8.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "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/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", + "dev": true }, - "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==", + "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": ">=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" + "node": ">=10" }, - "engines": { - "node": ">=4" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "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==", + "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", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dev": true, "dependencies": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" + "call-bind": "^1.0.2" }, - "engines": { - "node": ">=4" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "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/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": ">=4" + "node": ">=0.10.0" } }, - "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, + "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": { - "p-locate": "^5.0.0" + "deep-is": "^0.1.3", + "ip-regex": "^4.1.0", + "is-url": "^1.2.4" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=v0.10.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": { + "node_modules/is2/node_modules/ip-regex": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", - "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==" + "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/lodash.capitalize": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/lodash.capitalize/-/lodash.capitalize-4.2.1.tgz", - "integrity": "sha512-kZzYOKspf8XVX5AvmQF94gQW0lejFVgb80G85bU4ZWzoJ6C03PQg3coYAUpSTpQWelrZELd3XWgHzw4Ck5kaIw==" + "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/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/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" }, - "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==", + "node_modules/isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==", "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==", + "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, - "dependencies": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8" } }, - "node_modules/log-symbols/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/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": { - "color-convert": "^2.0.1" + "append-transform": "^2.0.0" }, "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==", + "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": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "@babel/core": "^7.7.5", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.0.0", + "semver": "^6.3.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "node": ">=8" } }, - "node_modules/log-symbols/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "node_modules/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": { - "color-name": "~1.1.4" + "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": ">=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/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/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==", + "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": ">=8" + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "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==", + "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": { - "has-flag": "^4.0.0" + "brace-expansion": "^1.1.7" }, "engines": { - "node": ">=8" + "node": "*" } }, - "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==", + "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": { - "js-tokens": "^3.0.0 || ^4.0.0" + "aggregate-error": "^3.0.0" }, - "bin": { - "loose-envify": "cli.js" + "engines": { + "node": ">=8" } }, - "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==", + "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": { - "yallist": "^3.0.2" + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "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==", + "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": { - "es5-ext": "~0.10.2" + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" } }, - "node_modules/make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "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": "^6.0.0" + "semver": "^7.5.3" }, "engines": { - "node": ">=8" + "node": ">=10" }, "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, + "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": { - "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" + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" }, "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": ">=10" } }, - "node_modules/make-fetch-happen/node_modules/debug": { + "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==", - "optional": true, + "dev": true, "dependencies": { "ms": "2.1.2" }, @@ -10041,519 +6607,537 @@ } } }, - "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/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": { - "@tootallnate/once": "1", - "agent-base": "6", - "debug": "4" + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" }, "engines": { - "node": ">= 6" + "node": ">=8" } }, - "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/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": { - "yallist": "^4.0.0" + "@isaacs/cliui": "^8.0.2" }, "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/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": ">=14" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" } }, - "node_modules/marked": { - "version": "4.2.12", - "resolved": "https://registry.npmjs.org/marked/-/marked-4.2.12.tgz", - "integrity": "sha512-yr8hSKa3Fv4D3jdZmtMMPghgVt6TWbk86WQaWhDloQjRSQhMMYCAro7jP7VDJrjjdV8pxVxMssXS8B8Y5DZ5aw==", + "node_modules/jake": { + "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", + "filelist": "^1.0.4", + "minimatch": "^3.1.2" + }, "bin": { - "marked": "bin/marked.js" + "jake": "bin/cli.js" }, "engines": { - "node": ">= 12" + "node": ">=10" } }, - "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/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-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" - }, - "engines": { - "node": ">=14.13.1 || >=16.0.0" - }, - "peerDependencies": { - "marked": "^1.0.0 || ^2.0.0 || ^3.0.0 || ^4.0.0" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "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/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": { - "type-fest": "^1.0.2" - }, - "engines": { - "node": ">=12" + "brace-expansion": "^1.1.7" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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==", "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "node": "*" } }, - "node_modules/marked-terminal/node_modules/type-fest": { + "node_modules/jju": { "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" - }, + "resolved": "https://registry.npmjs.org/jju/-/jju-1.4.0.tgz", + "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, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/panva" } }, - "node_modules/md5": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/md5/-/md5-2.3.0.tgz", - "integrity": "sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==", + "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": { - "charenc": "0.0.2", - "crypt": "0.0.2", - "is-buffer": "~1.1.6" + "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/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/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": ">= 0.6" + "node": "^14.17.0 || ^16.13.0 || >=18.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==", + "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": { - "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" + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" }, "engines": { - "node": ">=10" + "node": ">=14" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/isaacs" } }, - "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/js-beautify/node_modules/glob": { + "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.6", + "minimatch": "^9.0.1", + "minipass": "^7.0.4", + "path-scurry": "^1.11.0" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, "engines": { - "node": ">=10" + "node": ">=16 || 14 >=14.18" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/isaacs" } }, - "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/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": ">= 8" + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "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/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==", + "dev": true, "engines": { - "node": ">= 0.6" + "node": ">=16 || 14 >=14.17" } }, - "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/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": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" + "abbrev": "^2.0.0" }, - "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" + "nopt": "bin/nopt.js" }, "engines": { - "node": ">=10.0.0" + "node": "^14.17.0 || ^16.13.0 || >=18.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==", + "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": ">= 0.6" + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "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==", + "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, - "dependencies": { - "charset": "^1.0.0" + "engines": { + "node": ">=14" } }, - "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/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.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==", + "dev": true + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "dependencies": { - "mime-db": "1.52.0" + "argparse": "^2.0.1" }, - "engines": { - "node": ">= 0.6" + "bin": { + "js-yaml": "bin/js-yaml.js" } }, - "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==", + "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/min-indent": { + "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-schema": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "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==", + "dev": true + }, + "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", - "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "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==", + "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" + }, "engines": { - "node": ">=4" + "node": ">=6" } }, - "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/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "devOptional": true, "dependencies": { - "brace-expansion": "^1.1.7" + "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==", + "devOptional": true, "engines": { - "node": "*" + "node": ">= 10.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/jsonschema": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsonschema/-/jsonschema-1.4.1.tgz", + "integrity": "sha512-S6cATIPVv1z0IlxdN+zUk5EPjkGCdnhN4wVSBlvoUO1tOLJootbo9CquNJmbIh4yikWHiUedhRYrNPn1arpEmQ==", + "engines": { + "node": "*" } }, - "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/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": { - "arrify": "^1.0.1", - "is-plain-obj": "^1.1.0", - "kind-of": "^6.0.3" - }, - "engines": { - "node": ">= 6" + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.4.0", + "verror": "1.10.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/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": { - "yallist": "^4.0.0" + "array-includes": "^3.1.1", + "object.assign": "^4.1.0" }, "engines": { - "node": ">=8" + "node": ">=4.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/just-extend": { + "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": { + "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": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" + "asn1.js": "^5.3.0", + "elliptic": "^6.5.4", + "safe-buffer": "^5.0.1" } }, - "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/keycloak-connect": { + "version": "26.1.1", + "resolved": "https://registry.npmjs.org/keycloak-connect/-/keycloak-connect-26.1.1.tgz", + "integrity": "sha512-2wvNJXldB9Em+mp6liJ+AnftcJovFEvNhUgv3hblNDmVihBoBqn4zFlwLIN41lo0H8CicB2T86xZ5U2MiQ9FFA==", "dependencies": { - "minipass": "^3.1.0", - "minipass-sized": "^1.0.3", - "minizlib": "^2.0.0" + "jwk-to-pem": "^2.0.0" }, "engines": { - "node": ">=8" + "node": ">=14" }, "optionalDependencies": { - "encoding": "^0.1.12" + "chromedriver": "latest" } }, - "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/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": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" + "json-buffer": "3.0.1" } }, - "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/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": { - "minipass": "^3.0.0" + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" }, "engines": { - "node": ">=8" + "node": ">= 0.8.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, + "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": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">=8" + "immediate": "~3.0.5" } }, - "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" - }, + "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" + "node": ">=4" } }, - "node_modules/minizlib/node_modules/yallist": { + "node_modules/load-json-file": { "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==", + "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": { - "minimist": "^1.2.6" + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" }, - "bin": { - "mkdirp": "bin/cmd.js" + "engines": { + "node": ">=4" } }, - "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" - }, + "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": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mochajs" + "node": ">=4" } }, - "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==", + "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": { - "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" + "lie": "3.1.1" } }, - "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/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": { - "ms": "2.1.2" + "p-locate": "^5.0.0" }, "engines": { - "node": ">=6.0" + "node": ">=10" }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "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==", + "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.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/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==", + "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.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", + "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" }, @@ -10561,800 +7145,848 @@ "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/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": { - "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": "*" + "js-tokens": "^3.0.0 || ^4.0.0" }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "bin": { + "loose-envify": "cli.js" } }, - "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==", + "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": { - "brace-expansion": "^1.1.7" - }, + "get-func-name": "^2.0.1" + } + }, + "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": "*" + "node": ">=16.14" } }, - "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==", + "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, - "engines": { - "node": ">=8" + "dependencies": { + "es5-ext": "~0.10.2" } }, - "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==", + "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": { - "argparse": "^2.0.1" + "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": { - "js-yaml": "bin/js-yaml.js" + "semver": "bin/semver.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==", + "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": { - "brace-expansion": "^1.1.7" + "escape-string-regexp": "^4.0.0" }, "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==", + "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": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 0.6" } }, - "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==", + "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": { - "has-flag": "^4.0.0" - }, + "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/merge-descriptors": { + "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", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", "engines": { - "node": ">=10" + "node": ">= 0.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "bin": { + "mime": "cli.js" }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" + "engines": { + "node": ">=4" } }, - "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==", + "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": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" + "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": ">= 8" + "node": ">= 0.6" } }, - "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/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": ">=0.10.0" + "node": ">=4" } }, - "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/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": "*" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "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/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": "10.0.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.0.1.tgz", + "integrity": "sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==", "dependencies": { - "moment": ">= 2.9.0" + "brace-expansion": "^2.0.1" }, "engines": { - "node": "*" + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "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/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/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==", + "node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", "engines": { - "node": ">= 0.6" + "node": ">=8" } }, - "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/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": { - "ee-first": "1.1.1" + "minipass": "^3.0.0" }, "engines": { - "node": ">= 0.8" + "node": ">= 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==", + "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==", + "optional": true, "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" + "yallist": "^4.0.0" }, "engines": { - "node": ">= 6.0.0" + "node": ">=8" } }, - "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/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": ">=0.10.0" + "node": ">= 8" } }, - "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/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": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + "node": ">=8" } }, - "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/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": { - "async": "^3.0.0", - "ini": "^2.0.0", - "secure-keys": "^1.0.0", - "yargs": "^16.1.1" + "minipass": "^3.0.0" }, "engines": { - "node": ">= 0.4.0" + "node": ">=8" } }, - "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/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": ">= 0.6" + "node": ">=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==" - }, - "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/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": { - "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" + "minipass": "^3.0.0" }, "engines": { - "node": ">=10" + "node": ">=8" } }, - "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/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": { - "lodash": "^4.17.10", - "moment": "^2.22.2", - "xmlbuilder": "^10.0.0" + "yallist": "^4.0.0" }, "engines": { - "node": ">=6" - }, - "peerDependencies": { - "newman": ">=4" + "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/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": ">=4.0" + "node": ">= 8" } }, - "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/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": ">=10" + "node": ">=8" } }, - "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==", + "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/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" + "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": "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.3", + "browser-stdout": "^1.3.1", + "chokidar": "^3.5.3", + "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": { - "semver": "bin/semver.js" + "_mocha": "bin/_mocha", + "mocha": "bin/mocha.js" }, "engines": { - "node": ">=10" - } - }, - "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, - "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": ">= 14.0.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==", + "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": { - "@sinonjs/commons": "^1.7.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/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==", + "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": { - "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==", + "ms": "2.1.2" + }, "engines": { - "node": ">=4.0.0" + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "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==", - "dependencies": { - "lodash": "^4.17.21" - } + "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/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/mocha/node_modules/debug": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", + "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", + "dev": true, "dependencies": { - "whatwg-url": "^5.0.0" + "ms": "2.1.2" }, "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" + "node": ">=6.0" }, "peerDependenciesMeta": { - "encoding": { + "supports-color": { "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, + "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", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": 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" + "brace-expansion": "^2.0.1" }, - "bin": { - "node-gyp": "bin/node-gyp.js" + "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/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.12.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" } }, - "node_modules/node-gyp/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, + "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": ">=8" + "node": "*" } }, - "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, + "node_modules/moment-timezone": { + "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": { - "delegates": "^1.0.0", - "readable-stream": "^3.6.0" + "moment": "^2.29.4" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "*" } }, - "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/morgan": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.10.0.tgz", + "integrity": "sha512-AbegBVI4sh6El+1gNwvD5YIck7nSA36weD7xvIxG4in80j/UoK8AEGaWnnz8v1GxonMCltmlNs5ZKbGvl9b1XQ==", "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" + "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": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">= 0.8.0" } }, - "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/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": ">=8" + "node": ">= 0.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/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": { - "yallist": "^4.0.0" + "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": ">=10" + "node": ">= 6.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, + "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": { - "abbrev": "1" + "minimist": "^1.2.6" }, "bin": { - "nopt": "bin/nopt.js" - }, - "engines": { - "node": ">=6" + "mkdirp": "bin/cmd.js" } }, - "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" - }, + "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": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=0.10.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, + "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.10.1", + "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.10.1.tgz", + "integrity": "sha512-6zo1T3GILsXMCex3YEu7hCz2OXLUarxFsxvFcUHWMpkPtmZLeTTWgRdc1gWyNJiYt6AxITmIf9bZDRy/jAfWew==", "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" + "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": ">= 6" + "node": ">= 8.0" } }, - "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, + "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": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" + "safer-buffer": ">= 2.1.2 < 3.0.0" }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "engines": { + "node": ">=0.10.0" } }, - "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/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": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" + "lru-cache": "^7.14.1" }, "engines": { - "node": ">=10" + "node": ">=12.0.0" } }, - "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/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/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/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.1", + "resolved": "https://registry.npmjs.org/nconf/-/nconf-0.12.1.tgz", + "integrity": "sha512-p2cfF+B3XXacQdswUYWZ0w6Vld0832A/tuqjLBu3H1sfUcby4N2oVbGhyuCkZv+t3iY3aiFEj7gZGqax9Q2c1w==", "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "async": "^3.0.0", + "ini": "^2.0.0", + "secure-keys": "^1.0.0", + "yargs": "^16.1.1" }, "engines": { - "node": ">=8" + "node": ">= 0.4.0" } }, - "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==", + "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==", "optional": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, "engines": { - "node": ">=8" + "node": ">= 0.4.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/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==", + "dev": true, "dependencies": { - "isexe": "^2.0.0" + "@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.5", + "colors": "1.4.0", + "commander": "11.1.0", + "csv-parse": "4.16.3", + "filesize": "10.1.4", + "liquid-json": "0.3.1", + "lodash": "4.17.21", + "mkdirp": "3.0.1", + "postman-collection": "4.5.0", + "postman-collection-transformer": "4.1.8", + "postman-request": "2.88.1-postman.39", + "postman-runtime": "7.41.2", + "pretty-ms": "7.0.1", + "semver": "7.6.3", + "serialised-error": "1.1.3", + "word-wrap": "1.2.5", + "xmlbuilder": "15.1.1" }, "bin": { - "node-which": "bin/node-which" + "newman": "bin/newman.js" }, "engines": { - "node": ">= 8" + "node": ">=16" } }, - "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/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==", + "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": { - "process-on-spawn": "^1.0.0" + "lodash": "^4.17.10", + "moment": "^2.22.2", + "xmlbuilder": "^10.0.0" }, "engines": { - "node": ">=8" + "node": ">=6" + }, + "peerDependencies": { + "newman": ">=4" } }, - "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.7.3", - "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.7.3.tgz", - "integrity": "sha512-KUdDsspqx89sD4UUyUKzdlUOper3hRkDVkrKh/89G+d9WKsU5ox51NWS4tB1XR5dPUdR4SP0E3molyEfOvSa3g==", + "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": ">=6.0.0" + "node": ">=4.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/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/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/nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" }, - "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/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": { - "nodemailer-shared": "1.0.4", - "nodemailer-wellknown": "0.1.8", - "smtp-connection": "2.3.2" + "@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/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/nise/node_modules/path-to-regexp": { + "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/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/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": { - "abbrev": "^1.0.0" - }, - "bin": { - "nopt": "bin/nopt.js" + "semver": "^7.3.5" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=10" } }, - "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" - }, + "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/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/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": { - "yallist": "^4.0.0" + "encoding": "^0.1.11", + "json-parse-better-errors": "^1.0.0", + "safe-buffer": "^5.1.1" }, "engines": { - "node": ">=10" + "node": ">=4" + } + }, + "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/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/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": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" + "process-on-spawn": "^1.0.0" }, "engines": { - "node": ">=10" + "node": ">=8" } }, - "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/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/normalize-path": { "version": "3.0.0", @@ -11365,17 +7997,6 @@ "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-run-path": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", @@ -11387,21 +8008,33 @@ "node": ">=4" } }, + "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": ">=4" + } + }, "node_modules/npmlog": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", - "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", + "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": "^2.0.0", + "are-we-there-yet": "^3.0.0", "console-control-strings": "^1.1.0", - "gauge": "^3.0.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==", + "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 +8045,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 +8053,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 +8063,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,28 +8072,14 @@ "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==", + "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": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, "node_modules/nyc/node_modules/cliui": { @@ -11475,24 +8093,6 @@ "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", @@ -11506,13 +8106,24 @@ "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==", + "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": { + "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": ">=8" + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/nyc/node_modules/locate-path": { @@ -11527,6 +8138,18 @@ "node": ">=8" } }, + "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": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, "node_modules/nyc/node_modules/p-limit": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", @@ -11554,6 +8177,18 @@ "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", @@ -11575,33 +8210,7 @@ "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" + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/nyc/node_modules/wrap-ansi": { @@ -11663,6 +8272,7 @@ "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": "*" } @@ -11685,9 +8295,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 +8312,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" }, @@ -11724,6 +8334,14 @@ "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", @@ -11764,26 +8382,26 @@ } }, "node_modules/optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", "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" + "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": ">= 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==" + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/os/-/os-0.1.2.tgz", + "integrity": "sha512-ZoXJkvAnljwvc56MbvhtKVWmSkzV712k42Is2mA0+0KTSRakq5XXuXpjZjgAt9ctzl51ojhQWakQQpmOvXWfjQ==" }, "node_modules/os-tmpdir": { "version": "1.0.2", @@ -11794,36 +8412,6 @@ "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", @@ -11832,14 +8420,6 @@ "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", @@ -11871,43 +8451,134 @@ } }, "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, + "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": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/p-reduce": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-reduce/-/p-reduce-2.1.0.tgz", - "integrity": "sha512-2USApvnsutq8uoxZBGbbWM0JIYLiEMJ9RlaN7fAzVNb9OZN0SHjjTTfIcb667XynS5Y1VhwDJVDa72TnPzAYWw==", + "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": ">=8" + "node": ">=6" } }, - "node_modules/p-retry": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", - "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", + "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": { - "@types/retry": "0.12.0", - "retry": "^0.13.1" + "@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": ">=8" + "node": ">= 14" } }, - "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/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": { + "debug": "^4.3.4" + }, "engines": { - "node": ">=6" + "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/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==", + "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", + "integrity": "sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==", + "optional": true, + "dependencies": { + "degenerator": "^5.0.0", + "netmask": "^2.0.2" + }, + "engines": { + "node": ">= 14" } }, "node_modules/package-hash": { @@ -11929,6 +8600,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, "dependencies": { "callsites": "^3.0.0" }, @@ -11937,20 +8609,16 @@ } }, "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==", + "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": { - "@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" + "json-parse-better-errors": "^1.0.1" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=4" } }, "node_modules/parse-ms": { @@ -11983,6 +8651,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" } @@ -11991,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" } @@ -12002,11 +8672,12 @@ "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==", + "dev": true, "engines": { - "node": ">=4" + "node": ">=8" } }, "node_modules/path-parse": { @@ -12014,48 +8685,149 @@ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" }, - "node_modules/path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" + "node_modules/path-scurry": { + "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" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } }, - "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/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==", + "dev": true, "engines": { - "node": ">=8" + "node": "14 || >=16.14" } }, + "node_modules/path-to-regexp": { + "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": "1.1.1", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", - "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.0.tgz", + "integrity": "sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==", "dev": true, "engines": { - "node": "*" + "node": ">= 14.16" } }, + "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==" + "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.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.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.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "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==", + "dev": true, "engines": { "node": ">=8.6" }, @@ -12063,39 +8835,101 @@ "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==", + "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": ">=4" + } + }, + "node_modules/pino": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/pino/-/pino-9.1.0.tgz", + "integrity": "sha512-qUcgfrlyOtjwhNLdbhoL7NR4NkHjzykAPw0V2QLFbvu/zss29h4NkRnibyFzBrNCbzCOY3WZ9hhKSwfOkNggYA==", + "dependencies": { + "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" + }, + "bin": { + "pino": "bin.js" + } + }, + "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": { + "readable-stream": "^4.0.0", + "split2": "^4.0.0" + } + }, + "node_modules/pino-abstract-transport/node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/pino-abstract-transport/node_modules/readable-stream": { + "version": "4.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": ">=4" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, - "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/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": { - "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" + "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": "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": { "find-up": "^2.0.0", "load-json-file": "^4.0.0" @@ -12108,6 +8942,7 @@ "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" }, @@ -12119,6 +8954,7 @@ "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" @@ -12131,6 +8967,7 @@ "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" }, @@ -12142,6 +8979,7 @@ "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" }, @@ -12153,6 +8991,7 @@ "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" } @@ -12161,6 +9000,7 @@ "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" } @@ -12252,6 +9092,14 @@ "node": ">=4" } }, + "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.0.0" + } + }, "node_modules/portscanner": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/portscanner/-/portscanner-2.2.0.tgz", @@ -12273,22 +9121,66 @@ "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/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.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.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": "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", + "mime-types": "2.1.35", "postman-url-encoder": "3.0.5", - "semver": "7.3.5", + "semver": "7.6.3", "uuid": "8.3.2" }, "engines": { @@ -12296,15 +9188,15 @@ } }, "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==", + "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.3.5", + "semver": "7.5.4", "strip-json-comments": "3.1.1" }, "bin": { @@ -12336,9 +9228,9 @@ } }, "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==", + "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" @@ -12350,24 +9242,6 @@ "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-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,80 +9254,18 @@ "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-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.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/tunnel-agent": "^0.6.3", + "@postman/tough-cookie": "~4.1.3-postman.1", + "@postman/tunnel-agent": "^0.6.4", "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,17 +9275,16 @@ "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" + "node": ">= 16" } }, "node_modules/postman-request/node_modules/qs": { @@ -12485,100 +9296,49 @@ "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", + "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.13.1", + "handlebars": "4.7.8", + "httpntlm": "1.8.13", + "jose": "5.6.3", + "js-sha512": "0.9.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.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", - "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_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": ">=16" } }, "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": "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.5.0", "teleport-javascript": "1.0.0", - "uvm": "2.0.2" + "uvm": "3.0.0" }, "engines": { - "node": ">=10" + "node": ">=16" } }, "node_modules/postman-url-encoder": { @@ -12593,10 +9353,35 @@ "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==", + "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,6 +9427,11 @@ "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/progress": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", @@ -12675,15 +9465,6 @@ "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", @@ -12707,7 +9488,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", @@ -12718,7 +9500,110 @@ "ipaddr.js": "1.9.1" }, "engines": { - "node": ">= 0.10" + "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/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" + }, + "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/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", + "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.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": { @@ -12726,16 +9611,11 @@ "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==" + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", + "dev": true }, "node_modules/pump": { "version": "3.0.0", @@ -12747,28 +9627,20 @@ } }, "node_modules/punycode": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", - "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "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" } }, - "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.12.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.12.1.tgz", + "integrity": "sha512-zWmv4RSuB9r2mYQw3zxQuHWeU+42aKi1wWig/j4ele4ygELZ7PEO6MM7rim9oAQH2A5MWfsAVf/jPvTPgCbvUQ==", "dependencies": { - "side-channel": "^1.0.4" + "side-channel": "^1.0.6" }, "engines": { "node": ">=0.6" @@ -12777,10 +9649,17 @@ "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==", + "dev": true, "funding": [ { "type": "github", @@ -12801,12 +9680,12 @@ "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==", + "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": ">=8" + "node": ">= 0.8" } }, "node_modules/randombytes": { @@ -12859,6 +9738,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,359 +9753,251 @@ "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": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", + "integrity": "sha512-eFIBOPW7FGjzBuk3hdXEuNSiTZS/xEMlH49HxMyzb0hyPfu4EhVjT2DH32K1hSSmVq4sebAWnZuuY5auISUTGA==", + "dev": true, "dependencies": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" + "load-json-file": "^2.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^2.0.0" }, "engines": { - "node": ">=8" + "node": ">=4" } }, "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": "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": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" + "find-up": "^2.0.0", + "read-pkg": "^2.0.0" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=4" } }, "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==", + "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": "^5.0.0", - "path-exists": "^4.0.0" + "locate-path": "^2.0.0" }, "engines": { - "node": ">=8" + "node": ">=4" } }, "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==", + "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": "^4.1.0" + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" }, "engines": { - "node": ">=8" + "node": ">=4" } }, "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==", + "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": "^2.0.0" + "p-try": "^1.0.0" }, "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=4" } }, "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==", + "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": "^2.2.0" + "p-limit": "^1.1.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": ">=4" } }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "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": { - "picomatch": "^2.2.1" - }, "engines": { - "node": ">=8.10.0" + "node": ">=4" } }, - "node_modules/redent": { + "node_modules/read-pkg-up/node_modules/path-exists": { "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==", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "dev": true, "engines": { - "node": ">=4.0.0" + "node": ">=4" } }, - "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/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/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==", + "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": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "functions-have-names": "^1.2.2" + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "strip-bom": "^3.0.0" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=4" } }, - "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==", + "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, - "engines": { - "node": ">=6.5.0" + "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/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==", + "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": { - "@pnpm/npm-conf": "^1.0.4" + "error-ex": "^1.2.0" }, "engines": { - "node": ">=14" + "node": ">=0.10.0" } }, - "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==", + "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": { - "es6-error": "^4.0.1" + "pify": "^2.0.0" }, "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" - }, + "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": ">= 4" + "node": ">=0.10.0" } }, - "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/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/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" - }, + "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, "engines": { - "node": ">=0.10.0" - }, - "peerDependencies": { - "request": "^2.34" + "node": ">=4" } }, - "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==", + "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": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - }, - "engines": { - "node": ">=0.8" + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" } }, - "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==", + "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": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" + "picomatch": "^2.2.1" }, "engines": { - "node": ">= 0.12" + "node": ">=8.10.0" } }, - "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" - }, + "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": ">=0.8", - "npm": ">=1.3.7" + "node": ">= 12.13.0" } }, - "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==", + "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": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.4.0", - "verror": "1.10.0" + "call-bind": "^1.0.6", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "set-function-name": "^2.0.1" }, "engines": { - "node": ">=0.6.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "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==", + "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.6" + "node": ">=6.5.0" } }, - "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==", + "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": { - "psl": "^1.1.24", - "punycode": "^1.4.1" + "es6-error": "^4.0.1" }, "engines": { - "node": ">=0.8" + "node": ">=4" } }, "node_modules/require-directory": { @@ -13257,12 +10036,18 @@ "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==", + "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.9.0", + "is-core-module": "^2.13.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, @@ -13277,6 +10062,7 @@ "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" } @@ -13295,40 +10081,34 @@ } }, "node_modules/retry": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", - "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", + "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" - } + "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/rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "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": { - "glob": "^7.1.3" + "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" }, - "bin": { - "rimraf": "bin.js" + "engines": { + "node": ">=8.0" } }, "node_modules/run-async": { @@ -13344,6 +10124,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", @@ -13363,17 +10144,41 @@ } }, "node_modules/rxjs": { - "version": "6.6.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "version": "5.5.12", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.5.12.tgz", + "integrity": "sha512-xx2itnL5sBbqeeiVgNPVuQQ1nC8Jp2WfNJhXWHmElW9YmrpS9UVnNzhP3EH3HFqexO5Tlp8GhYY+WEcqcVMvGw==", "dev": true, "dependencies": { - "tslib": "^1.9.0" + "symbol-observable": "1.0.1" }, "engines": { "npm": ">=2.0.0" } }, + "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": { + "call-bind": "^1.0.7", + "get-intrinsic": "^1.2.4", + "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", @@ -13394,19 +10199,30 @@ ] }, "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==", + "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.2", - "get-intrinsic": "^1.1.3", + "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/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", @@ -13417,61 +10233,198 @@ "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", + "node_modules/semver": { + "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" + }, + "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/send": { + "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", + "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/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", + "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": { + "@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", - "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", + "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": { - "semantic-release": "bin/semantic-release.js" + "sequelize": "lib/sequelize", + "sequelize-cli": "lib/sequelize" }, "engines": { - "node": ">=16 || ^14.17" + "node": ">=10.0.0" } }, - "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==", + "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": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" }, "engines": { - "node": ">= 8" + "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/semantic-release/node_modules/debug": { + "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==", @@ -13487,46 +10440,52 @@ } } }, - "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==", + "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": { - "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" + "object-hash": "^1.1.2", + "stack-trace": "0.0.9", + "uuid": "^3.0.0" } }, - "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/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, + "bin": { + "uuid": "bin/uuid" + } + }, + "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": { - "escape-string-regexp": "^1.0.5" + "type-fest": "^0.13.1" }, "engines": { - "node": ">=8" + "node": ">=10" }, "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==", + "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" }, @@ -13534,100 +10493,81 @@ "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/serialize-javascript": { + "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" } }, - "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==", + "node_modules/serve-static": { + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", + "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", "dependencies": { - "yallist": "^4.0.0" + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.19.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": ">= 0.8.0" } }, - "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/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/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/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": { - "path-key": "^3.0.0" + "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": ">=8" + "node": ">= 0.4" } }, - "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/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": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" }, - "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": ">= 0.4" } }, - "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/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" }, - "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" - }, - "engines": { - "node": ">=10" - } + "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/semantic-release/node_modules/shebang-command": { + "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" }, @@ -13635,783 +10575,607 @@ "node": ">=8" } }, - "node_modules/semantic-release/node_modules/shebang-regex": { + "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/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/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==", + "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": { - "semver": "^6.3.0" + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" }, "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" - } - }, - "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" + "node": ">= 0.4" }, "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" + "url": "https://github.com/sponsors/ljharb" } }, - "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/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/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 + "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" }, - "pg-hstore": { - "optional": true + { + "type": "patreon", + "url": "https://www.patreon.com/feross" }, - "snowflake-sdk": { - "optional": true + { + "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" }, - "sqlite3": { - "optional": true + { + "type": "patreon", + "url": "https://www.patreon.com/feross" }, - "tedious": { - "optional": true + { + "type": "consulting", + "url": "https://feross.org/support" } + ], + "dependencies": { + "decompress-response": "^6.0.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" } }, - "node_modules/sequelize-cli": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/sequelize-cli/-/sequelize-cli-5.5.0.tgz", - "integrity": "sha512-twVQ02alCpr2XvxNmpi32C48WZs6xHTH1OFTfTS5Meg3BVqOM8ghiZoml4FITFjlD8sAJSQjlAHTwqTbuolA6Q==", + "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": { - "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" + "@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": ">=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" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/sinon" } }, - "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==", + "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, - "dependencies": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" + "peerDependencies": { + "chai": "^4.0.0", + "sinon": ">=4.0.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==", + "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": { - "locate-path": "^3.0.0" + "is-fullwidth-code-point": "^2.0.0" }, "engines": { - "node": ">=6" + "node": ">=4" } }, - "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==", + "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, - "dependencies": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - }, "engines": { - "node": ">=6 <7 || >=8" + "node": ">=4" } }, - "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/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/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==", + "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": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" + "@sentry/node": "^7.36.0", + "global-agent": "^3.0.0" + }, + "bin": { + "snyk": "bin/snyk" }, "engines": { - "node": ">=6" + "node": ">=12" } }, - "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/socks": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.3.tgz", + "integrity": "sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==", + "optional": true, "dependencies": { - "p-try": "^2.0.0" + "ip-address": "^9.0.5", + "smart-buffer": "^4.2.0" }, "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 10.0.0", + "npm": ">= 3.0.0" } }, - "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/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": { - "p-limit": "^2.0.0" - }, - "engines": { - "node": ">=6" + "atomic-sleep": "^1.0.0" } }, - "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/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": ">=4" + "node": ">=0.10.0" } }, - "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==", + "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": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.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": ">=6" + "node": ">=8" } }, - "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/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": { - "ansi-regex": "^4.1.0" - }, - "engines": { - "node": ">=6" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "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==", + "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": ">= 4.0.0" + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "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/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": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" + "brace-expansion": "^1.1.7" }, "engines": { - "node": ">=6" + "node": "*" } }, - "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/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/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/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": { - "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" + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.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/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": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.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==", + "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.0.0" + "node": ">= 10.x" } }, - "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==", + "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": { - "ms": "2.1.2" + "bindings": "^1.5.0", + "node-addon-api": "^7.0.0", + "prebuild-install": "^7.1.1", + "tar": "^6.1.11" }, - "engines": { - "node": ">=6.0" + "optionalDependencies": { + "node-gyp": "8.x" + }, + "peerDependencies": { + "node-gyp": "8.x" }, "peerDependenciesMeta": { - "supports-color": { + "node-gyp": { "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==", + "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": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" + "@gar/promisify": "^1.0.1", + "semver": "^7.3.5" } }, - "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==", + "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": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" + "mkdirp": "^1.0.4", + "rimraf": "^3.0.2" }, "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/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", - "integrity": "sha512-vybp3GItaR1ZtO2nxZZo8eOo7fnVaNtP3XE2vJKgzkKR2bagCkdJ1EpYYhEMd3qu/80DwQk9KjsNSxE3fXWq0g==", - "dev": true, - "dependencies": { - "object-hash": "^1.1.2", - "stack-trace": "0.0.9", - "uuid": "^3.0.0" + "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/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, + "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": { - "randombytes": "^2.1.0" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "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==", + "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": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.17.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": ">= 0.8.0" + "node": ">= 10" } }, - "node_modules/set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" - }, - "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==", + "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": { - "shebang-regex": "^1.0.0" + "ms": "2.1.2" }, "engines": { - "node": ">=0.10.0" + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "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==", + "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": ">=0.10.0" + "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==", + "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": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.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": "*" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/isaacs" } }, - "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==", + "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": { - "chalk": "^2.3.2", - "figures": "^2.0.0", - "pkg-conf": "^2.1.0" + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" }, "engines": { - "node": ">=6" + "node": ">= 6" } }, - "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==", - "dev": true, + "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": { - "@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==", + "yallist": "^4.0.0" + }, "engines": { - "node": ">=8" + "node": ">=10" } }, - "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, + "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": { - "ansi-styles": "^3.2.0", - "astral-regex": "^1.0.0", - "is-fullwidth-code-point": "^2.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": ">=6" + "node": ">= 10" } }, - "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==", + "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, - "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.1109.0", - "resolved": "https://registry.npmjs.org/snyk/-/snyk-1.1109.0.tgz", - "integrity": "sha512-sBcibkAfcq6nXr6t0GieDjdc8kQfEf429+M1VKavGfLaJPQNIqSjtOhQJ5FcZqaB/mCWa1szektkHeyAiB4m9A==", - "dev": true, - "bin": { - "snyk": "bin/snyk" + "brace-expansion": "^1.1.7" }, "engines": { - "node": ">=12" + "node": "*" } }, - "node_modules/socks": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz", - "integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==", + "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": { - "ip": "^2.0.0", - "smart-buffer": "^4.2.0" + "yallist": "^4.0.0" }, "engines": { - "node": ">= 10.13.0", - "npm": ">= 3.0.0" + "node": ">=8" } }, - "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-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": { - "agent-base": "^6.0.2", - "debug": "^4.3.3", - "socks": "^2.6.2" + "minipass": "^3.1.0", + "minipass-sized": "^1.0.3", + "minizlib": "^2.0.0" }, "engines": { - "node": ">= 10" + "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" }, @@ -14422,120 +11186,63 @@ "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, + "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": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" + "agent-base": "^6.0.2", + "debug": "^4.3.3", + "socks": "^2.6.2" }, "engines": { - "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==", - "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": ">= 10" } }, - "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==", + "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": { - "through": "2" + "minipass": "^3.1.1" }, "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": ">= 8" } }, - "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==", + "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": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" + "unique-slug": "^2.0.0" } }, - "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==", + "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": { - "safe-buffer": "~5.2.0" + "imurmurhash": "^0.1.4" } }, - "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.5", - "resolved": "https://registry.npmjs.org/sqlite3/-/sqlite3-5.1.5.tgz", - "integrity": "sha512-7sP16i4wI+yKnGOO2q2ijze7EjQ9US+Vw7DYYwxfFtqNZDGgBcEw0oeDaDvUTq66uJOzVd/z6MkIg+c9erSJKg==", - "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/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.17.0", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz", - "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==", + "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", @@ -14556,17 +11263,11 @@ "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/sshpk/node_modules/jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==", + "dev": true }, "node_modules/stack-trace": { "version": "0.0.9", @@ -14606,49 +11307,125 @@ "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" + "deglob": "^2.1.0", + "get-stdin": "^6.0.0", + "minimist": "^1.1.0", + "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", + "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "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/acorn": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", - "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==", + "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, - "bin": { - "acorn": "bin/acorn" + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" }, "engines": { - "node": ">=0.4.0" + "node": ">=4" } }, - "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==", + "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": { - "ms": "^2.1.1" + "color-name": "1.1.3" } }, - "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/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/cross-spawn": { + "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": { - "esutils": "^2.0.2" + "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": ">=0.10.0" + "node": ">=4.8" + } + }, + "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": { @@ -14703,6 +11480,116 @@ "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": ">=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/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/espree": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/espree/-/espree-4.1.0.tgz", @@ -14717,18 +11604,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": { @@ -14750,37 +11632,116 @@ "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" + "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/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/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": ">=0.10.0" + "node": "*" } }, - "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/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": { - "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" + "minimist": "^1.2.6" }, - "engines": { - "node": ">=6.0.0" + "bin": { + "mkdirp": "bin/cmd.js" } }, "node_modules/standard/node_modules/ms": { @@ -14789,114 +11750,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.6" + "node": ">=0.10.0" } }, - "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/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": ">=4" + } + }, + "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": { @@ -14908,12 +11907,6 @@ "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", @@ -14927,68 +11920,118 @@ "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-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.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==", + "dev": true, + "dependencies": { + "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" + }, + "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.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.1.4", - "es-abstract": "^1.20.4" + "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.6", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", - "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", + "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.1.4", - "es-abstract": "^1.20.4" + "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==", + "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/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==", + "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": ">=4" + "node": ">=8" } }, "node_modules/strip-bom": { @@ -15008,164 +12051,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==", + "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==", + "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": { - "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": { - "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==", @@ -15187,25 +12166,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "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==" - }, - "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==", - "dependencies": { - "swagger-ui-dist": ">=4.11.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", @@ -15216,96 +12176,242 @@ } }, "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": "4.1.1", + "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-4.1.1.tgz", + "integrity": "sha512-iK5/YhZxq5GO5z8wb0bY1317uDF3Zjpha0QFFLA8/trAoiLbQD0HUbMesEaxyzUgDxi2QlcbM8IvqOlEjgoXBA==", "dependencies": { - "array-back": "^2.0.0", - "deep-extend": "~0.6.0", - "lodash.padend": "^4.6.1", - "typical": "^2.6.1", - "wordwrapjs": "^3.0.0" + "array-back": "^6.2.2", + "wordwrapjs": "^5.1.0" }, "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/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/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": "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/table/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/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.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" + }, + "engines": { + "node": ">=10" } }, - "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/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/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, + "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": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" + "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/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, + "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": { - "ansi-regex": "^4.1.0" + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" }, "engines": { - "node": ">=6" + "node": ">= 6" } }, - "node_modules/tar": { - "version": "6.1.13", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.13.tgz", - "integrity": "sha512-jdIBIN6LTIe2jqzay/2vtYLlBHa3JF42ot3h1dW8Q0PaAG4v8rm0cvpVePtau5C6OKXGGcgO9q2AMNSWxiLqKw==", + "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": { - "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" + "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" }, "engines": { - "node": ">=10" + "node": ">= 8" } }, - "node_modules/tar/node_modules/minipass": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.2.4.tgz", - "integrity": "sha512-lwycX3cBMTvcejsHITUgYj6Gy6A7Nh4Q6h9NP4sTHY1ccJlC7yKzDmiShEHsJ16Jf1nKGDEaiHxiltsJEvk0nQ==", + "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" } @@ -15321,64 +12427,44 @@ "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": "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/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/tempy": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/tempy/-/tempy-1.0.1.tgz", - "integrity": "sha512-biM9brNqxSc04Ee71hzFbryD11nX7VPhQQY32AdDmjFvodsRFz/3ufeoTZ6uYkRFfGo188tENcASNs3vTdsM0w==", + "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": { - "del": "^6.0.0", - "is-stream": "^2.0.0", - "temp-dir": "^2.0.0", - "type-fest": "^0.16.0", - "unique-string": "^2.0.0" + "ms": "2.1.2" }, "engines": { - "node": ">=10" + "node": ">=6.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "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/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/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/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/test-exclude": { "version": "6.0.0", @@ -15394,24 +12480,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": { - "array-back": "^2.0.0", - "typical": "^2.6.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": ">=4.0.0" + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "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==", + "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": ">=0.10" + "node": "*" } }, "node_modules/text-table": { @@ -15420,39 +12528,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.1", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.1.tgz", - "integrity": "sha512-+rQmrWMYGA90yenhTYsLWAsLsqVC8osOw6PKE1HDYiO0gdPeKe/xDHNzIAIn4C91YQ6oenEhfYqqc1883qHbjQ==", + "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", @@ -15489,6 +12577,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" }, @@ -15509,46 +12598,11 @@ "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.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/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 + "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/tunnel-agent": { "version": "0.6.0", @@ -15564,21 +12618,22 @@ "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": "1.2.0", - "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", - "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==", + "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==", + "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,6 +12652,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" } @@ -15613,15 +12669,74 @@ "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.4", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", - "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", + "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.2", + "call-bind": "^1.0.7", "for-each": "^0.3.3", - "is-typed-array": "^1.1.9" + "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" @@ -15642,14 +12757,18 @@ } }, "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==", + "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": { "uglifyjs": "bin/uglifyjs" @@ -15658,16 +12777,41 @@ "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", - "integrity": "sha512-xZLW76ax70pND9bx3wqwb8zqkFGzZIK8dIHD9WdNy/CrNfjWcwQgQkGCuUqcuwEBvUm+g07z+qWvY+pxDmMEEw==", + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/umzug/-/umzug-3.7.0.tgz", + "integrity": "sha512-r/L2Zlilgv3SKhmP2nkA9x2Xi1PKtu2K34/i/s7AYJ2mLjEO+IxETJAK7CKf6l3QOvoy5/ChykeX9qt6ykRz6Q==", "dependencies": { - "babel-runtime": "^6.23.0", - "bluebird": "^3.5.3" + "@rushstack/ts-command-line": "^4.12.2", + "emittery": "^0.13.0", + "glob": "^8.0.3", + "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": { @@ -15686,9 +12830,14 @@ } }, "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", + "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", @@ -15696,46 +12845,13 @@ "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.0", - "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.0.tgz", - "integrity": "sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w==" - }, "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": { @@ -15747,9 +12863,9 @@ } }, "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==", + "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": [ { @@ -15759,14 +12875,18 @@ { "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" + "escalade": "^3.1.2", + "picocolors": "^1.0.1" }, "bin": { - "browserslist-lint": "cli.js" + "update-browserslist-db": "cli.js" }, "peerDependencies": { "browserslist": ">= 4.21.0" @@ -15776,14 +12896,20 @@ "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", @@ -15812,45 +12938,39 @@ } }, "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": "3.0.0", + "resolved": "https://registry.npmjs.org/uvm/-/uvm-3.0.0.tgz", + "integrity": "sha512-dATVpxsNfFBpHNdq6sy4/CV2UnoRbV8tvvkK0VrUPnm+o7dK6fnir4LEm8czeDdpbw2KKDKjIPcRSZY4AEwEZA==", "dev": true, "dependencies": { - "flatted": "3.1.1" + "flatted": "3.3.1" }, "engines": { - "node": ">=10" + "node": ">=16" } }, - "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==", + "dev": true, "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==", + "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" } @@ -15867,6 +12987,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" ], @@ -15879,31 +13000,22 @@ "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==", + "devOptional": true, "dependencies": { "isexe": "^2.0.0" }, "bin": { - "which": "bin/which" + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" } }, "node_modules/which-boxed-primitive": { @@ -15923,23 +13035,22 @@ } }, "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==", + "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.9", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz", - "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==", + "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.5", - "call-bind": "^1.0.2", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", "for-each": "^0.3.3", "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0", - "is-typed-array": "^1.1.10" + "has-tostringtag": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -15952,6 +13063,7 @@ "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" } @@ -15965,9 +13077,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" @@ -15976,30 +13088,46 @@ "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.5.1", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.5.1.tgz", + "integrity": "sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA==", "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, + "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/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", @@ -16013,73 +13141,65 @@ } }, "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==", + "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": ">=8" + "node": ">=12" + }, + "funding": { + "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==", + "dev": true, "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==", + "dev": true }, "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==", + "dev": true, "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==", + "dev": true, "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": { @@ -16088,15 +13208,15 @@ "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": { @@ -16111,12 +13231,16 @@ "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/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/xml": { @@ -16146,6 +13270,7 @@ "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" } @@ -16172,18 +13297,9 @@ } }, "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/yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", - "engines": { - "node": ">= 6" - } + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, "node_modules/yargs": { "version": "16.2.0", @@ -16203,9 +13319,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" } @@ -16249,53 +13365,14 @@ "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==", + "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": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" } }, "node_modules/yocto-queue": { @@ -16309,6 +13386,34 @@ "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 c6d25a162..b8e80899e 100644 --- a/package.json +++ b/package.json @@ -1,30 +1,16 @@ { - "name": "@iofog/iofogcontroller", - "version": "3.0.4", - "description": "ioFog Controller project for Eclipse IoFog @ iofog.org \\nCopyright (c) 2018 Edgeworx, Inc.", + "name": "@datasance/iofogcontroller", + "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": "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 ", + "Alpaslan Doğan " ], "license": "EPL-2.0", "bugs": { - "email": "edgemaster@iofog.org" + "email": "support@datasance.com" }, "standard": { "ignore": [ @@ -32,10 +18,13 @@ "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" + }, + "publishConfig": { + "registry": "https://npm.pkg.github.com/" }, "scripts": { "prestart": "npm run lint", @@ -50,7 +39,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", @@ -67,68 +55,68 @@ "iofog-controller": "src/main.js" }, "dependencies": { - "@iofog/ecn-viewer": "3.0.2", - "axios": "1.0.0-alpha.1", - "body-parser": "^1.20.1", + "@datasance/ecn-viewer": "0.4.2", + "axios": "1.7.4", + "body-parser": "^1.20.3", "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.3", "concurrent-queue": "7.0.2", - "cookie-parser": "1.4.3", + "cookie-parser": "1.4.7", "cors": "2.8.5", "daemonize2": "0.4.2", - "ejs": "3.1.7", - "express": "4.17.3", - "formidable": "1.2.1", + "ejs": "3.1.10", + "express": "4.21.2", + "express-session": "1.18.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", - "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": "^26.1.1", + "minimatch": "10.0.1", + "moment": "2.30.1", + "moment-timezone": "0.5.45", + "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", + "mysql2": "3.10.1", + "nconf": "0.12.1", + "node-fetch-npm": "^2.0.4", + "os": "0.1.2", "path": "0.12.7", - "pino": "6.6.1", - "pino-std-serializers": "2.5.0", + "pg": "8.12.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", + "umzug": "^3.7.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.16.0", + "eslint-config-google": "0.14.0", + "mocha": "10.6.0", + "mocha-junit-reporter": "2.2.1", + "newman": "^6.2.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", + "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/cli-tests.js b/scripts/cli-tests.js index 6f55ff610..7f8f1148a 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 @@ -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..') @@ -110,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 () { @@ -124,18 +105,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 +122,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 +132,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 +160,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 +178,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 +240,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 +257,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 +379,6 @@ async function cliTest () { await seedTestData() testControllerSection() - testUserSection() testConfigSection() testTunnelSection() testIoFogSection() 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..9884ab3b2 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 @@ -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/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..0245dd7d3 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 @@ -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/cli/application.js b/src/cli/application.js index 833467ef4..e5997dd81 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 @@ -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', @@ -71,13 +69,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 = { @@ -99,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: @@ -135,48 +126,42 @@ class Application extends BaseCLIHandler { } } -const _executeCase = async function (applicationCommand, commandName, f, isUserRequired) { +const _executeCase = async function (applicationCommand, commandName, f) { 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) } } -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/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..9f15b4519 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 @@ -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') @@ -192,13 +191,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 = { @@ -220,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: @@ -256,28 +248,22 @@ class Catalog extends BaseCLIHandler { } } -const _executeCase = async function (catalogCommand, commandName, f, isUserRequired) { +const _executeCase = async function (catalogCommand, commandName, f) { 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) } } -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/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..3c5af3cd9 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 @@ -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', @@ -113,28 +85,20 @@ class Config extends BaseCLIHandler { alias: 'o', type: Boolean, description: 'Enable', - group: [constants.CMD_DEV_MODE, constants.CMD_EMAIL_ACTIVATION] + group: [constants.CMD_DEV_MODE] }, { name: 'off', alias: 'f', 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 + group: [constants.CMD_DEV_MODE] } ] 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.' } } @@ -156,9 +120,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) @@ -222,26 +183,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() @@ -256,11 +197,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 +219,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 +238,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 4e6b6a85a..9ae8561ca 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 @@ -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 () { @@ -26,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.' } @@ -48,16 +46,13 @@ class Controller extends BaseCLIHandler { switch (command) { 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) + 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: @@ -69,16 +64,10 @@ class Controller extends BaseCLIHandler { } } -const _executeCase = async function (userCommand, commandName, f, isUserRequired) { +const _executeCase = async function (userCommand, commandName, f) { 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) } @@ -89,12 +78,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/diagnostics.js b/src/cli/diagnostics.js index 24fa9cd8c..165c55ed6 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 @@ -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 { @@ -114,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: @@ -138,16 +137,10 @@ class Diagnostics extends BaseCLIHandler { } } -const _executeCase = async function (diagnosticCommand, commandName, f, isUserRequired) { +const _executeCase = async function (diagnosticCommand, commandName, f) { 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 7e16cfdba..a905bf1dd 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 @@ -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') @@ -38,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.', @@ -65,8 +63,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/cli/iofog.js b/src/cli/iofog.js index 7d2533018..8ea90aae2 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 @@ -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') @@ -248,13 +247,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', @@ -309,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: @@ -362,34 +354,28 @@ class IOFog extends BaseCLIHandler { } } -async function _executeCase (commands, commandName, f, isUserRequired) { +async function _executeCase (commands, commandName, f) { 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) } } -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) @@ -397,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') } @@ -476,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') } @@ -507,7 +493,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 b9cbe2ea2..7ccdf6173 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 @@ -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( @@ -63,7 +62,13 @@ const JSON_SCHEMA_ADD = AppHelper.stringifyCliJsonSchema( ], cmd: [ 'string' - ] + ], + cdiDevices: [ + 'string' + ], + runAsUser: 'string', + platform: 'string', + runtime: 'string' } ) @@ -99,7 +104,13 @@ const JSON_SCHEMA_UPDATE = AppHelper.stringifyCliJsonSchema( ], cmd: [ 'string' - ] + ], + cdiDevices: [ + 'string' + ], + runAsUser: 'string', + platform: 'string', + runtime: 'string' } ) @@ -266,13 +277,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', @@ -295,6 +299,38 @@ class Microservice extends BaseCLIHandler { description: 'Microservice container command and argument(s)', multiple: true, group: [constants.CMD_UPDATE, constants.CMD_ADD] + }, + { + name: 'cdiDevices', + alias: 'D', + type: String, + description: 'Map CDI 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: 'L', + 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 = { @@ -324,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: @@ -437,28 +473,22 @@ class Microservice extends BaseCLIHandler { } } -async function _executeCase (commands, commandName, f, isUserRequired) { +async function _executeCase (commands, commandName, f) { 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) } } -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) { @@ -466,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) { @@ -480,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 } @@ -567,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.') } @@ -599,6 +629,10 @@ const _updateMicroserviceObject = function (obj) { logSize: (obj.logSize || constants.MICROSERVICE_DEFAULT_LOG_SIZE) * 1, rebuild: obj.rebuild, cmd: obj.cmd, + cdiDevices: obj.cdiDevices, + runAsUser: obj.runAsUser, + platform: obj.platform, + runtime: obj.runtime, env, images: obj.images, catalogItemId: parseInt(obj.catalogItemId) || undefined, @@ -660,6 +694,10 @@ const _createMicroserviceObject = function (obj) { logSize: (obj.logSize || constants.MICROSERVICE_DEFAULT_LOG_SIZE) * 1, routes: obj.routes, cmd: obj.cmd, + cdiDevices: obj.cdiDevices, + runAsUser: obj.runAsUser, + platform: obj.platform, + runtime: obj.runtime, env, images: [] } diff --git a/src/cli/registry.js b/src/cli/registry.js index dd7311af0..046bdbc12 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 @@ -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') @@ -86,13 +85,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', @@ -119,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: @@ -140,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.') } @@ -176,16 +168,10 @@ 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] - - 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/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..75efe9ff8 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 @@ -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') @@ -99,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([]) @@ -113,7 +112,7 @@ class Tunnel extends BaseCLIHandler { } } -async function _updateTunnel (obj, user) { +async function _updateTunnel (obj) { const action = obj.action const tunnel = _createTunnelObject(obj) @@ -127,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) @@ -144,16 +143,10 @@ 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] - - 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/user.js b/src/cli/user.js deleted file mode 100644 index 9f94bddde..000000000 --- a/src/cli/user.js +++ /dev/null @@ -1,188 +0,0 @@ -/* - * ******************************************************************************* - * * Copyright (c) 2020 Edgeworx, Inc. - * * - * * 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: '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 99f0fcf92..1167cf99f 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 @@ -13,23 +13,17 @@ module.exports = { 'App:Name': 'iofog-controller', - 'Viewer:Port': 80, + 'Viewer:Port': 8008, 'Server:Port': 51121, 'Server:DevMode': false, - 'Email:ActivationEnabled': false, - 'Email:HomeUrl': 'https://iofog.org', - 'Service:LogsDirectory': '/var/log/iofog-controller', - 'Service:LogsFileSize': 10485760, + 'Service:LogsFileSize': 104857600, '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 df913aa36..ff9ea9676 100644 --- a/src/config/default.json +++ b/src/config/default.json @@ -3,27 +3,19 @@ "Name": "iofog-controller" }, "Viewer": { - "Port": 80 - }, - "Kubelet": { - "Uri": "http://localhost:1234" + "Port": 8008 }, "Server": { "Port": 51121, "DevMode": false }, - "Email": { - "ActivationEnabled": false, - "HomeUrl": "https://google.com" - }, "Service": { "LogsDirectory": "/var/log/iofog-controller", - "LogsFileSize": 10485760, + "LogsFileSize": 104857600, "LogsFileCount": 10 }, "Settings": { "DefaultJobIntervalSeconds": 120, - "UserTokenExpirationIntervalSeconds": 3600, "FogTokenExpirationIntervalSeconds": 3600, "FogStatusUpdateIntervalSeconds": 30, "FogStatusUpdateTolerance": 3 @@ -32,22 +24,16 @@ "DiagnosticDir": "diagnostic" }, "PublicPorts": { - "Range": "6000-7000", - "ProxyBrokerUrl": "http://localhost:3000", - "ProxyBrokerToken": "" + "Range": "6001-7999" }, "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" - }, - "PortRouter": { - "1": "iofog/port-router:latest", - "2": "iofog/port-router:latest" + "1": "ghcr.io/datasance/proxy:latest", + "2": "ghcr.io/datasance/proxy:latest" } } } diff --git a/src/config/development.json b/src/config/development.json index 08c72584d..0fed88803 100644 --- a/src/config/development.json +++ b/src/config/development.json @@ -3,27 +3,19 @@ "Name": "iofog-controller-dev" }, "Viewer": { - "Port": 80 - }, - "Kubelet": { - "Uri": "http://localhost:1234" + "Port": 8008 }, "Server": { "Port": 51121, "DevMode": true }, - "Email": { - "ActivationEnabled": false, - "HomeUrl": "https://google.com" - }, "Service": { "LogsDirectory": "/var/log/iofog-controller", - "LogsFileSize": 10485760, + "LogsFileSize": 104857600, "LogsFileCount": 10 }, "Settings": { - "UserTokenExpirationIntervalSeconds": 360000, - "FogTokenExpirationIntervalSeconds": 3600000, + "FogTokenExpirationIntervalSeconds": 3600, "FogStatusUpdateIntervalSeconds": 30, "FogStatusUpdateTolerance": 3 }, @@ -41,15 +33,31 @@ "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": "" + }, + "postgres": { + "host": "", + "port": "", + "username": "", + "password": "", + "databaseName": "" } } - } + } } \ No newline at end of file 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/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/production.json b/src/config/production.json index 725d8abb2..82bd77082 100644 --- a/src/config/production.json +++ b/src/config/production.json @@ -3,22 +3,18 @@ "Name": "iofog-controller" }, "Viewer": { - "Port": 80 + "Port": 8008 }, "Server": { "Port": 51121, "DevMode": true }, - "Email": { - "ActivationEnabled": false - }, "Service": { "LogsDirectory": "/var/log/iofog-controller", - "LogsFileSize": 10485760, + "LogsFileSize": 104857600, "LogsFileCount": 10 }, "Settings": { - "UserTokenExpirationIntervalSeconds": 3600, "FogTokenExpirationIntervalSeconds": 3600, "FogStatusUpdateIntervalSeconds": 30, "FogStatusUpdateTolerance": 3 @@ -29,15 +25,32 @@ "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": "" + }, + "postgres": { + "host": "", + "port": "", + "username": "", + "password": "", + "databaseName": "" } } } -} \ No newline at end of file +} + 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/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..a0dc79bba 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 @@ -11,105 +11,116 @@ * */ -const AuthDecorator = require('./../decorators/authorization-decorator') const ApplicationService = require('../services/application-service') const YAMLParserService = require('../services/yaml-parser-service') 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 getApplicationsBySystemEndPoint = async function (req) { + return ApplicationService.getSystemApplicationsEndPoint(false) +} + +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, false) +} + +const deleteApplicationEndPoint = async function (req) { + const name = req.params.name - return ApplicationService.updateApplicationEndPoint(application, name, user, false) + return ApplicationService.deleteApplicationEndPoint({ name }, false) } -const deleteApplicationEndPoint = async function (req, user) { +const deleteSystemApplicationEndPoint = async function (req) { const name = req.params.name - return ApplicationService.deleteApplicationEndPoint({ name }, user, false) + return ApplicationService.deleteSystemApplicationEndPoint({ 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 } 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), + getApplicationsBySystemEndPoint: (getApplicationsBySystemEndPoint), + getApplicationEndPoint: (getApplicationEndPoint), + getApplicationByIdEndPoint: (getApplicationByIdEndPoint), + updateApplicationEndPoint: (updateApplicationEndPoint), + updateApplicationYAMLEndPoint: (updateApplicationYAMLEndPoint), + patchApplicationEndPoint: (patchApplicationEndPoint), + patchApplicationByIdEndPoint: (patchApplicationByIdEndPoint), + deleteApplicationEndPoint: (deleteApplicationEndPoint), + deleteSystemApplicationEndPoint: (deleteSystemApplicationEndPoint), + deleteApplicationByIdEndPoint: (deleteApplicationByIdEndPoint) } diff --git a/src/controllers/application-template-controller.js b/src/controllers/application-template-controller.js index 1022d1c94..61f281112 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 @@ -11,79 +11,78 @@ * */ -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') 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 = { - 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 c92302db6..dcd35cd57 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 @@ -12,32 +12,31 @@ */ const CatalogService = require('../services/catalog-service') -const AuthDecorator = require('./../decorators/authorization-decorator') -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 = { - 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 7873e6317..2b5efd729 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 @@ -11,25 +11,24 @@ * */ -const AuthDecorator = require('./../decorators/authorization-decorator') 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) } 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/controller.js b/src/controllers/controller.js index 8834f830d..abd4650e4 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 @@ -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/diagnostic-controller.js b/src/controllers/diagnostic-controller.js index 0ede7bc28..35d053beb 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 @@ -12,32 +12,31 @@ */ 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) +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 = { - 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 79abed87b..68ffb5601 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 @@ -11,27 +11,26 @@ * */ -const AuthDecorator = require('./../decorators/authorization-decorator') 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 () { + 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 { @@ -39,36 +38,36 @@ 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 = { - 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 d9db42345..3d2f86ccb 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 @@ -11,99 +11,98 @@ * */ -const AuthDecorator = require('../decorators/authorization-decorator') 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 = { - 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/kubelet-controller.js b/src/controllers/kubelet-controller.js deleted file mode 100644 index c1fb68622..000000000 --- a/src/controllers/kubelet-controller.js +++ /dev/null @@ -1,120 +0,0 @@ -/* - * ******************************************************************************* - * * Copyright (c) 2020 Edgeworx, Inc. - * * - * * 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/microservices-controller.js b/src/controllers/microservices-controller.js index 5590de72d..6b35b3e1a 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 @@ -11,130 +11,179 @@ * */ -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') -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 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 + return MicroservicesService.updateMicroserviceEndPoint(microserviceUuid, microservice, false) +} + +const updateSystemMicroserviceEndPoint = async function (req) { const microservice = req.body const microserviceUuid = req.params.uuid - return MicroservicesService.updateMicroserviceEndPoint(microserviceUuid, microservice, user, false) + return MicroservicesService.updateSystemMicroserviceEndPoint(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 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, user, false) + return MicroservicesService.deletePortMappingEndPoint(uuid, internalPort, false) } -const listMicroservicePortMappingsEndPoint = async function (req, user) { +const deleteSystemMicroservicePortMappingEndPoint = async function (req) { const uuid = req.params.uuid - const ports = await MicroservicesService.listMicroservicePortMappingsEndPoint(uuid, user, false) + 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) 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 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, 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, false) +} + +const deleteSystemMicroserviceVolumeMappingEndPoint = async function (req) { const uuid = req.params.uuid const id = req.params.id - return MicroservicesService.deleteVolumeMappingEndPoint(uuid, id, user, false) + return MicroservicesService.deleteSystemVolumeMappingEndPoint(uuid, id, false) } -const listAllPublicPortsEndPoint = async function (req, user) { - return MicroservicesService.listAllPublicPortsEndPoint(user) +const listAllPublicPortsEndPoint = async function (req) { + return MicroservicesService.listAllPublicPortsEndPoint() } 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), + listMicroserviceByPubTagEndPoint: (listMicroserviceByPubTagEndPoint), + listMicroserviceBySubTagEndPoint: (listMicroserviceBySubTagEndPoint), + 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/controllers/registry-controller.js b/src/controllers/registry-controller.js index 4ba7af91f..ab633cb0e 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 @@ -11,34 +11,33 @@ * */ -const AuthDecorator = require('../decorators/authorization-decorator') 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 = { - 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 8e8776c28..7c3734145 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 @@ -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 53316caaa..8d6df8bc4 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 @@ -11,41 +11,40 @@ * */ -const AuthDecorator = require('./../decorators/authorization-decorator') 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 = { - 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 2157de409..fb3ea34c9 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 @@ -11,12 +11,11 @@ * */ -const AuthDecorator = require('../decorators/authorization-decorator') 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 @@ -24,24 +23,24 @@ 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 = { - manageTunnelEndPoint: AuthDecorator.checkAuthToken(manageTunnelEndPoint), - getTunnelEndPoint: AuthDecorator.checkAuthToken(getTunnelEndPoint) + manageTunnelEndPoint: (manageTunnelEndPoint), + getTunnelEndPoint: (getTunnelEndPoint) } diff --git a/src/controllers/user-controller.js b/src/controllers/user-controller.js index 6314c8b2c..9cff77445 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 @@ -12,26 +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 - } - return UserService.signUp(newUser, false) -} - const userLoginEndPoint = async function (req) { const user = req.body @@ -39,66 +21,36 @@ const userLoginEndPoint = async function (req) { const credentials = { email: user.email, - password: user.password + password: user.password, + totp: user.totp } return UserService.login(credentials, false) } -const resendActivationEndPoint = async function (req) { - const emailData = req.query - return UserService.resendActivation(emailData, false) -} +const refreshTokenEndPoint = async function (req) { + const token = req.body -const activateUserAccountEndPoint = async function (req) { - const codeData = req.body + await Validator.validate(token, Validator.schemas.refresh) - await UserService.activateUser(codeData, false) -} - -const userLogoutEndPoint = async function (req, user) { - return UserService.logout(user, false) -} + const credentials = { + refreshToken: token.refreshToken -const getUserProfileEndPoint = async function (req, user) { - return { - firstName: user.firstName, - lastName: user.lastName, - email: user.email } + return UserService.refresh(credentials, false) } -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 getUserProfileEndPoint = async function (req) { + return UserService.profile(req, false) } -const resetUserPasswordEndPoint = async function (req) { - const emailObj = req.body - return UserService.resetUserPassword(emailObj, false) +const userLogoutEndPoint = async function (req) { + return UserService.logout(req, 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 + refreshTokenEndPoint: refreshTokenEndPoint, + getUserProfileEndPoint: getUserProfileEndPoint, + userLogoutEndPoint: userLogoutEndPoint } 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/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/access-token-manager.js b/src/data/managers/access-token-manager.js deleted file mode 100644 index 9d89a009f..000000000 --- a/src/data/managers/access-token-manager.js +++ /dev/null @@ -1,36 +0,0 @@ -/* - * ******************************************************************************* - * * Copyright (c) 2020 Edgeworx, Inc. - * * - * * 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/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 deleted file mode 100644 index a7cb5ee5a..000000000 --- a/src/data/managers/email-activation-code-manager.js +++ /dev/null @@ -1,65 +0,0 @@ -/* - * ******************************************************************************* - * * Copyright (c) 2020 Edgeworx, Inc. - * * - * * 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/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/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-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-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..00320b391 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 @@ -18,13 +18,14 @@ 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 const CatalogItemImage = models.CatalogItemImage const Fog = models.Fog +const Tags = models.Tags const Application = models.Application -const User = models.User const Routing = models.Routing const Registry = models.Registry const MicroserviceStatus = models.MicroserviceStatus @@ -35,7 +36,6 @@ const microserviceExcludedFields = [ 'created_at', 'updated_at', 'updatedBy', - 'isNetwork', 'rebuild', 'deleteWithCleanUp', 'imageSnapshot', @@ -68,6 +68,12 @@ class MicroserviceManager extends BaseManager { required: false, attributes: ['cmd'] }, + { + model: MicroserviceCdiDev, + as: 'cdiDevices', + required: false, + attributes: ['cdiDevices'] + }, { model: MicroservicePort, as: 'ports', @@ -125,8 +131,7 @@ class MicroserviceManager extends BaseManager { attributes: ['uuid'] }], attributes: { exclude: ['id', 'source_microservice_uuid', - 'sourceMicroserviceUuid', 'destMicroserviceUuid', 'sourceNetworkMicroserviceUuid', - 'destNetworkMicroserviceUuid', 'sourceIofogUuid', 'destIofogUuid'] } + 'sourceMicroserviceUuid', 'destMicroserviceUuid'] } } ], where: where, @@ -154,6 +159,12 @@ class MicroserviceManager extends BaseManager { required: false, attributes: ['cmd', 'id'] }, + { + model: MicroserviceCdiDev, + as: 'cdiDevices', + required: false, + attributes: ['cdiDevices'] + }, { model: MicroservicePort, as: 'ports', @@ -203,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: { @@ -242,6 +265,12 @@ class MicroserviceManager extends BaseManager { required: false, attributes: ['cmd'] }, + { + model: MicroserviceCdiDev, + as: 'cdiDevices', + required: false, + attributes: ['cdiDevices'] + }, { model: MicroservicePort, as: 'ports', @@ -299,9 +328,7 @@ class MicroserviceManager extends BaseManager { attributes: ['uuid'] }], attributes: { exclude: ['id', - 'sourceMicroserviceUuid', 'destMicroserviceUuid', - 'sourceNetworkMicroserviceUuid', 'destNetworkMicroserviceUuid', - 'sourceIofogUuid', 'destIofogUuid'] } + 'sourceMicroserviceUuid', 'destMicroserviceUuid'] } } ], where: where, @@ -347,14 +374,9 @@ class MicroserviceManager extends BaseManager { model: Application, as: 'application', required: true, - include: [ - { - model: User, - as: 'user', - required: true, - attributes: ['id'] - } - ], + where: { + isSystem: false + }, attributes: ['id'] } ], @@ -365,23 +387,55 @@ 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) { return Microservice.findAll({ + include: [ + { + model: Application, + as: 'application', + required: true, + 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/managers/microservice-port-manager.js b/src/data/managers/microservice-port-manager.js index 7b6041604..deedb758d 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 @@ -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 c77ea068b..000000000 --- a/src/data/managers/microservice-proxy-port-manager.js +++ /dev/null @@ -1,25 +0,0 @@ -/* - * ******************************************************************************* - * * Copyright (c) 2020 Edgeworx, Inc. - * * - * * 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 2281a7f8d..000000000 --- a/src/data/managers/microservice-public-mode-manager.js +++ /dev/null @@ -1,25 +0,0 @@ -/* - * ******************************************************************************* - * * Copyright (c) 2020 Edgeworx, Inc. - * * - * * 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/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 deleted file mode 100644 index 9c0b3fb5c..000000000 --- a/src/data/managers/scheduler-access-token-manager.js +++ /dev/null @@ -1,25 +0,0 @@ -/* - * ******************************************************************************* - * * Copyright (c) 2020 Edgeworx, Inc. - * * - * * 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/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 deleted file mode 100644 index 5fe41018d..000000000 --- a/src/data/managers/user-manager.js +++ /dev/null @@ -1,91 +0,0 @@ -/* - * ******************************************************************************* - * * Copyright (c) 2020 Edgeworx, Inc. - * * - * * 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/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/migrations/20180930155645-create-user.js b/src/data/migrations/20180930155645-create-user.js deleted file mode 100644 index 6a1a686d9..000000000 --- a/src/data/migrations/20180930155645-create-user.js +++ /dev/null @@ -1,50 +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 - } - }) - }, - 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 deleted file mode 100644 index acdaaf6e2..000000000 --- a/src/data/migrations/20180930164635-create-flow.js +++ /dev/null @@ -1,55 +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' - }, - 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' - } - }) - }, - 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 9e8fe7cf7..000000000 --- a/src/data/migrations/20180930173823-create-registry.js +++ /dev/null @@ -1,55 +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' - }, - userId: { - type: Sequelize.INTEGER, - field: 'user_id', - references: { model: 'Users', key: 'id' }, - onDelete: 'cascade' - } - }) - }, - 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 cb7624b99..000000000 --- a/src/data/migrations/20180930184436-create-catalog-item.js +++ /dev/null @@ -1,83 +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 - }, - userId: { - type: Sequelize.INTEGER, - field: 'user_id', - references: { model: 'Users', key: 'id' }, - onDelete: 'cascade' - }, - 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/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 deleted file mode 100644 index 1015056f8..000000000 --- a/src/data/migrations/20180930225403-create-fog.js +++ /dev/null @@ -1,277 +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' - }, - userId: { - type: Sequelize.INTEGER, - field: 'user_id', - references: { model: 'Users', key: 'id' }, - onDelete: 'cascade' - }, - 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 269768d74..000000000 --- a/src/data/migrations/20180930230219-create-fog-access-token.js +++ /dev/null @@ -1,43 +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' - }, - userId: { - type: Sequelize.INTEGER, - field: 'user_id', - references: { model: 'Users', key: 'id' }, - 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 7e64e19e7..000000000 --- a/src/data/migrations/20181001062956-create-microservice.js +++ /dev/null @@ -1,106 +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' - }, - updatedBy: { - type: Sequelize.INTEGER, - field: 'updated_by', - references: { model: 'Users', key: 'id' }, - 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 69190d27b..000000000 --- a/src/data/migrations/20181001070828-create-microservice-port.js +++ /dev/null @@ -1,51 +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' - }, - updatedBy: { - type: Sequelize.INTEGER, - field: 'updated_by', - references: { model: 'Users', key: 'id' }, - 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/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/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/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/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/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/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/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/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 6d2854203..000000000 --- a/src/data/migrations/20200123045032-fog-and-change-tracking.js +++ /dev/null @@ -1,50 +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', 'docker_pruning_freq', { - type: Sequelize.INTEGER, - defaultValue: 60, - 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 0c8cc2cba..000000000 --- a/src/data/migrations/20200123163412-create-router.js +++ /dev/null @@ -1,103 +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' - }, - updatedBy: { - type: Sequelize.INTEGER, - field: 'updated_by', - references: { model: 'Users', key: 'id' }, - onDelete: 'set null' - } - }) - - 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' - }, - updatedBy: { - type: Sequelize.INTEGER, - field: 'updated_by', - references: { model: 'Users', key: 'id' }, - onDelete: 'set null' - } - }) - }, - 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 837850a5c..000000000 --- a/src/data/migrations/20200202113124-create-public-ports.js +++ /dev/null @@ -1,71 +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' - }, - updatedBy: { - type: Sequelize.INTEGER, - field: 'updated_by', - references: { model: 'Users', key: 'id' }, - onDelete: 'set null' - } - }) - }, - 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 76988e5b7..000000000 --- a/src/data/migrations/20200213033350-create-config.js +++ /dev/null @@ -1,45 +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.TEXT, - 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' - }, - updatedBy: { - type: Sequelize.INTEGER, - field: 'updated_by', - references: { model: 'Users', key: 'id' }, - onDelete: 'set null' - } - }).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 b02ba2d83..000000000 --- a/src/data/migrations/20200506004924-add-route-name.js +++ /dev/null @@ -1,17 +0,0 @@ -'use strict' - -module.exports = { - up: (queryInterface, Sequelize) => { - return queryInterface.addColumn('Routings', 'name', { - type: Sequelize.TEXT, - 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 6b435c431..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.TEXT, - 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.TEXT, - 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 e03b5f07c..000000000 --- a/src/data/migrations/20201028005645-create-edge-resources.js +++ /dev/null @@ -1,119 +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' }, - userId: { - type: Sequelize.INTEGER, - field: 'user_id', - references: { model: 'Users', key: 'id' }, - onDelete: 'cascade' - } - }) - 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.TEXT, - 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 02f513767..000000000 --- a/src/data/migrations/20201204003312-create_application_templates.js +++ /dev/null @@ -1,93 +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.TEXT, - 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' - }, - userId: { - type: Sequelize.INTEGER, - field: 'user_id', - references: { model: 'Users', key: 'id' }, - onDelete: 'cascade' - } - }) - 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 b0aff579f..000000000 --- a/src/data/migrations/20211022010318-add-unique-constraint-msvc.js +++ /dev/null @@ -1,30 +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.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 4c5259834..000000000 --- a/src/data/migrations/20211022013326-add-unique-constraint-route.js +++ /dev/null @@ -1,30 +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.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 8893f1f32..000000000 --- a/src/data/migrations/20221021132000-create-proxy-ports.js +++ /dev/null @@ -1,58 +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' - }, - updatedBy: { - type: Sequelize.INTEGER, - field: 'updated_by', - references: { model: 'Users', key: 'id' }, - onDelete: 'set null' - } - }) - }, - 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/migrations/db_migration_v1.0.2.sql b/src/data/migrations/db_migration_v1.0.2.sql new file mode 100644 index 000000000..769defbee --- /dev/null +++ b/src/data/migrations/db_migration_v1.0.2.sql @@ -0,0 +1,595 @@ + +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 '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 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 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 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); + +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/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 1de86d5b9..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.User, { - foreignKey: { - name: 'userId', - field: 'user_id' - }, - as: 'user', - onDelete: 'cascade' - }) - Application.hasMany(models.Microservice, { foreignKey: { name: 'applicationId', diff --git a/src/data/models/applicationTemplate.js b/src/data/models/applicationTemplate.js index db9e1172c..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.User, { - foreignKey: { - name: 'userId', - field: 'user_id' - }, - as: 'user', - onDelete: 'cascade' - }) ApplicationTemplate.hasMany(models.ApplicationTemplateVariable, { foreignKey: { name: 'applicationTemplateId', diff --git a/src/data/models/catalogitem.js b/src/data/models/catalogitem.js index 661b78b74..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.User, { - foreignKey: { - name: 'userId', - field: 'user_id' - }, - as: 'user', - onDelete: 'cascade' - }) - CatalogItem.hasMany(models.CatalogItemImage, { foreignKey: 'catalog_item_id', as: 'images' 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/data/models/config.js b/src/data/models/config.js index 8935d9227..3419a2acb 100644 --- a/src/data/models/config.js +++ b/src/data/models/config.js @@ -30,8 +30,5 @@ module.exports = (sequelize, DataTypes) => { } ] }) - Config.associate = function (models) { - - } return Config } diff --git a/src/data/models/edgeResource.js b/src/data/models/edgeResource.js index d0e96afdb..63e1bcb02 100644 --- a/src/data/models/edgeResource.js +++ b/src/data/models/edgeResource.js @@ -27,16 +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.User, { - foreignKey: { - name: 'userId', - field: 'user_id' - }, - as: 'user', - defaultValue: 0, - 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 22e80ab1d..df198da4d 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, @@ -185,7 +185,7 @@ module.exports = (sequelize, DataTypes) => { }, networkInterface: { type: DataTypes.TEXT, - defaultValue: 'eth0', + defaultValue: 'dynamic', field: 'network_interface' }, dockerUrl: { @@ -324,16 +324,6 @@ module.exports = (sequelize, DataTypes) => { defaultValue: 0 }) - Fog.belongsTo(models.User, { - foreignKey: { - name: 'userId', - field: 'user_id' - }, - as: 'user', - defaultValue: 0, - 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 a2a4e1b81..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.User, { - foreignKey: { - name: 'userId', - field: 'user_id' - }, - as: 'user', - 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..5a2886c83 100644 --- a/src/data/models/index.js +++ b/src/data/models/index.js @@ -45,16 +45,26 @@ 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) { + 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', {})) 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 1355fe0bd..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.User, { - foreignKey: { - name: 'userId', - field: 'user_id' - }, - as: 'user', - onDelete: 'cascade' - }) - } - return KubeletAccessToken -} diff --git a/src/data/models/microservice.js b/src/data/models/microservice.js index cd25823db..1856805d0 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', @@ -42,6 +37,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 () { @@ -108,15 +115,6 @@ module.exports = (sequelize, DataTypes) => { onDelete: 'cascade' }) - Microservice.belongsTo(models.User, { - foreignKey: { - name: 'userId', - field: 'user_id' - }, - as: 'user', - onDelete: 'cascade' - }) - Microservice.hasMany(models.CatalogItemImage, { foreignKey: 'microservice_uuid', as: 'images' @@ -157,10 +155,18 @@ module.exports = (sequelize, DataTypes) => { as: 'cmd' }) + Microservice.hasMany(models.MicroserviceCdiDev, { + foreignKey: 'microservice_uuid', + as: 'cdiDevices' + }) + Microservice.hasMany(models.MicroserviceExtraHost, { 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/microserviceCdiDev.js b/src/data/models/microserviceCdiDev.js new file mode 100644 index 000000000..38f85081b --- /dev/null +++ b/src/data/models/microserviceCdiDev.js @@ -0,0 +1,31 @@ +'use strict' +module.exports = (sequelize, DataTypes) => { + const MicroserviceCdiDev = sequelize.define('MicroserviceCdiDev', { + id: { + type: DataTypes.INTEGER, + primaryKey: true, + autoIncrement: true, + allowNull: false, + field: 'id' + }, + cdiDevices: { + type: DataTypes.TEXT, + field: 'cdi_devices' + } + }, { + tableName: 'MicroserviceCdiDevices', + timestamps: false, + underscored: true + }) + MicroserviceCdiDev.associate = function (models) { + MicroserviceCdiDev.belongsTo(models.Microservice, { + foreignKey: { + name: 'microserviceUuid', + field: 'microservice_uuid' + }, + as: 'microservice', + onDelete: 'cascade' + }) + } + return MicroserviceCdiDev +} 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/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/microserviceport.js b/src/data/models/microserviceport.js index b9b2a7bdf..a6cee0b28 100644 --- a/src/data/models/microserviceport.js +++ b/src/data/models/microserviceport.js @@ -43,24 +43,10 @@ module.exports = (sequelize, DataTypes) => { onDelete: 'cascade' }) - MicroservicePort.belongsTo(models.User, { - foreignKey: { - name: 'userId', - field: 'user_id' - }, - as: 'user', - onDelete: 'cascade' - }) - MicroservicePort.hasOne(models.MicroservicePublicPort, { 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/data/models/registry.js b/src/data/models/registry.js index 3840ecd54..15295fbaf 100644 --- a/src/data/models/registry.js +++ b/src/data/models/registry.js @@ -45,14 +45,5 @@ module.exports = (sequelize, DataTypes) => { timestamps: false, underscored: true }) - Registry.associate = function (models) { - Registry.belongsTo(models.User, { - foreignKey: { - name: 'userId', - field: 'user_id' - }, - as: 'user' - }) - } return Registry } 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/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/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/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/data/models/user.js b/src/data/models/user.js deleted file mode 100644 index 48a38a4f1..000000000 --- a/src/data/models/user.js +++ /dev/null @@ -1,80 +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 - } - }, { - tableName: 'Users', - timestamps: false, - 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' - }) - } - return User -} diff --git a/src/data/providers/database-provider.js b/src/data/providers/database-provider.js index 067946283..67fd47dfa 100644 --- a/src/data/providers/database-provider.js +++ b/src/data/providers/database-provider.js @@ -1,36 +1,147 @@ 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 + + // 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.2.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 + + // 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/providers/mysql.js b/src/data/providers/mysql.js new file mode 100644 index 000000000..935e25125 --- /dev/null +++ b/src/data/providers/mysql.js @@ -0,0 +1,25 @@ +const Sequelize = require('sequelize') + +const config = require('../../config') +const DatabaseProvider = require('./database-provider') + +class MySqlDatabaseProvider extends DatabaseProvider { + constructor () { + 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 + + this.sequelize = new Sequelize(mysqlConfig.databaseName, mysqlConfig.username, mysqlConfig.password, mysqlConfig) + } + + async initDB () { + } +} + +module.exports = MySqlDatabaseProvider 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 diff --git a/src/data/providers/sqlite.js b/src/data/providers/sqlite.js index a34da5ee3..1d0e5cb04 100644 --- a/src/data/providers/sqlite.js +++ b/src/data/providers/sqlite.js @@ -3,13 +3,13 @@ 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 () { 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')) { 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 e75a67cb9..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: 'iofog/hal' - }, - { - catalog_item_id: 3, - fog_type_id: 2, - container_image: 'iofog/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/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/decorators/authorization-decorator.js b/src/decorators/authorization-decorator.js index 732003908..9883feddc 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 @@ -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()) { @@ -79,6 +50,5 @@ function checkFogToken (f) { } module.exports = { - checkAuthToken: checkAuthToken, checkFogToken: checkFogToken } diff --git a/src/decorators/cli-decorator.js b/src/decorators/cli-decorator.js deleted file mode 100644 index 4606e578f..000000000 --- a/src/decorators/cli-decorator.js +++ /dev/null @@ -1,69 +0,0 @@ -/* - * ******************************************************************************* - * * Copyright (c) 2020 Edgeworx, Inc. - * * - * * 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/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..3eac8674f 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 @@ -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/helpers/errors.js b/src/helpers/errors.js index 17493ba61..cb57e675c 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 @@ -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/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/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/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/keycloak.json b/src/keycloak.json new file mode 100644 index 000000000..cfc7f6b33 --- /dev/null +++ b/src/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/logger/index.js b/src/logger/index.js index dd40884e0..03bc2d2df 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 @@ -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 } ) } @@ -80,7 +81,7 @@ try { fileLogger = pino( { ...defaultFormat, - level: 'warn' + level: 'apiRes' }, logDestination) process.on('SIGHUP', () => logDestination.reopen()) diff --git a/src/main.js b/src/main.js index cefe8e687..4e4eb4bab 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 @@ -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)) diff --git a/src/public/datasance-logo-white.png b/src/public/datasance-logo-white.png new file mode 100644 index 000000000..759c70e2a Binary files /dev/null and b/src/public/datasance-logo-white.png differ 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..5185cbfbc 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 @@ -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,45 @@ 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) + 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 }) + }) + } + }, + { + method: 'get', + path: '/api/v3/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'])(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 }) + }) } }, { @@ -61,13 +94,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) + 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 }) + }) } }, { @@ -90,13 +127,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) + 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 }) + }) } }, { @@ -118,14 +159,18 @@ module.exports = [ ] const getApplicationEndPoint = ResponseDecorator.handleErrors(ApplicationController.getApplicationEndPoint, successCode, errorCodes) - const responseObject = await getApplicationEndPoint(req) - - res - .status(responseObject.code) - .send(responseObject.body) - logger.apiRes({ req: req, res: responseObject }) - return null + // 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, user: user, res: responseObject }) + return null + }) } }, { @@ -152,13 +197,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) + 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 }) + }) } }, { @@ -185,13 +234,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) + 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 }) + }) } }, { @@ -218,13 +271,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) + 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 }) + }) } }, { @@ -246,13 +303,49 @@ 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) + 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/v3/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, res: responseObject }) + logger.apiRes({ req: req, user: user, res: responseObject }) + }) } } ] diff --git a/src/routes/applicationTemplate.js b/src/routes/applicationTemplate.js index 432a20885..ff36626b2 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 @@ -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) + 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 }) + }) } }, { @@ -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) + 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 }) + }) } }, { @@ -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) + 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 }) + }) } }, { @@ -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) + 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 }) + }) } }, { @@ -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) + 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 }) + }) } }, { @@ -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) + 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 }) + }) } }, { @@ -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) + 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 }) + }) } }, { @@ -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) + 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/capabilities.js b/src/routes/capabilities.js index f7317e0df..f8b533e70 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 @@ -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/v3/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/v3/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 d3b8d3e3a..80134e44c 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 @@ -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', '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 }) + }) } }, { @@ -73,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) + 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, user: user, res: responseObject }) + }) } }, { @@ -105,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) + 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, user: user, res: responseObject }) + }) } }, { @@ -146,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) + 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, user: user, res: responseObject }) + }) } }, { @@ -178,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) + 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, user: user, res: responseObject }) + }) } } + ] diff --git a/src/routes/config.js b/src/routes/config.js index a1a605c1c..fba93b482 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 @@ -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) + 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 }) + }) } }, { @@ -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) + const user = req.kauth.grant.access_token.content.preferred_username + res + .status(responseObject.code) + .send(responseObject.body) - res - .status(responseObject.code) - .send(responseObject.body) - - logger.apiRes({ req: req, res: responseObject }) + logger.apiRes({ req: req, user: user, 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) + 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/controller.js b/src/routes/controller.js index ad980bb3a..3c41255ba 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 @@ -34,24 +34,6 @@ module.exports = [ logger.apiRes({ req: req, res: responseObject }) } }, - { - method: 'get', - path: '/api/v3/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/v3/fog-types/', diff --git a/src/routes/diagnostics.js b/src/routes/diagnostics.js index 65fa6a1a5..5c9270a06 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 @@ -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) - - res - .status(responseObject.code) - .send(responseObject.body) + // 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) + 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 }) + }) } }, { @@ -68,26 +72,30 @@ 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) + 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, user: user, 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 +120,21 @@ module.exports = [ } ] - const changeMicroserviceStraceStateEndPoint = ResponseDecorator.handleErrors( - DiagnosticController.changeMicroserviceStraceStateEndPoint, - successCode, - errorCodes - ) - const responseObject = await changeMicroserviceStraceStateEndPoint(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 changeMicroserviceStraceStateEndPoint = ResponseDecorator.handleErrors( + DiagnosticController.changeMicroserviceStraceStateEndPoint, + successCode, + 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 }) + }) } }, { @@ -144,18 +155,21 @@ module.exports = [ } ] - const getMicroserviceStraceDataEndPoint = ResponseDecorator.handleErrors( - DiagnosticController.getMicroserviceStraceDataEndPoint, - successCode, - errorCodes - ) - const responseObject = await getMicroserviceStraceDataEndPoint(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 getMicroserviceStraceDataEndPoint = ResponseDecorator.handleErrors( + DiagnosticController.getMicroserviceStraceDataEndPoint, + successCode, + 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 }) + }) } }, { @@ -184,18 +198,21 @@ module.exports = [ } ] - const postMicroserviceStraceDataToFtpEndPoint = ResponseDecorator.handleErrors( - DiagnosticController.postMicroserviceStraceDataToFtpEndPoint, - successCode, - errorCodes - ) - const responseObject = await postMicroserviceStraceDataToFtpEndPoint(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 postMicroserviceStraceDataToFtpEndPoint = ResponseDecorator.handleErrors( + DiagnosticController.postMicroserviceStraceDataToFtpEndPoint, + successCode, + 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 f11037d84..55558160c 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 @@ -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) + 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 }) + }) } }, { @@ -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) + const user = req.kauth.grant.access_token.content.preferred_username + res + .status(responseObject.code) + .send(responseObject.body) - res - .status(responseObject.code) - .send(responseObject.body) - - logger.apiRes({ req: req, res: responseObject }) + logger.apiRes({ req: req, user: user, res: responseObject }) + }) } }, { @@ -86,14 +94,17 @@ module.exports = [ } ] - const getEdgeResourceAllVersionsEndpoint = ResponseDecorator.handleErrors(EdgeResourceController.getEdgeResourceAllVersionsEndpoint, successCode, errorCodes) - const responseObject = await getEdgeResourceAllVersionsEndpoint(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 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 }) + }) } }, { @@ -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) + 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 }) + }) } }, { @@ -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) + 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 }) + }) } }, { @@ -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) + 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 }) + }) } }, { @@ -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) + 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 }) + }) } }, { @@ -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) + 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 0b169d4b4..d3e922dda 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 @@ -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) - - res - .status(responseObject.code) - .send({ flows: responseObject.body.applications }) - - logger.apiRes({ req: req, res: responseObject }) + // 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) + const user = req.kauth.grant.access_token.content.preferred_username + res + .status(responseObject.code) + .send({ flows: responseObject.body.applications }) + + logger.apiRes({ req: req, user: user, res: responseObject }) + }) } }, { @@ -59,14 +63,17 @@ module.exports = [ } ] - const createFlowEndPoint = ResponseDecorator.handleErrors(FlowController.createApplicationEndPoint, successCode, errorCodes) - const responseObject = await createFlowEndPoint(req) - - res - .status(responseObject.code) - .send(responseObject.body) - - logger.apiRes({ req: req, res: responseObject }) + // 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) + 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 }) + }) } }, { @@ -87,14 +94,17 @@ module.exports = [ } ] - const getFlowEndPoint = ResponseDecorator.handleErrors(FlowController.getApplicationByIdEndPoint, successCode, errorCodes) - const responseObject = await getFlowEndPoint(req) - - res - .status(responseObject.code) - .send(responseObject.body) - - logger.apiRes({ req: req, res: responseObject }) + // 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) + 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 }) + }) } }, { @@ -119,14 +129,17 @@ module.exports = [ } ] - const updateFlowEndPoint = ResponseDecorator.handleErrors(FlowController.patchApplicationByIdEndPoint, successCode, errorCodes) - const responseObject = await updateFlowEndPoint(req) - - res - .status(responseObject.code) - .send(responseObject.body) - - logger.apiRes({ req: req, res: responseObject }) + // 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) + 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 }) + }) } }, { @@ -147,14 +160,17 @@ module.exports = [ } ] - const deleteFlowEndPoint = ResponseDecorator.handleErrors(FlowController.deleteApplicationByIdEndPoint, successCode, errorCodes) - const responseObject = await deleteFlowEndPoint(req) - - res - .status(responseObject.code) - .send(responseObject.body) - - logger.apiRes({ req: req, res: responseObject }) + // 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) + 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/iofog.js b/src/routes/iofog.js index 6a6ddaffb..ab7f132a5 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 @@ -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) - - res - .status(responseObject.code) - .send(responseObject.body) - - logger.apiRes({ req: req, res: responseObject }) + // 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) + 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 }) + }) } }, { @@ -64,14 +68,17 @@ module.exports = [ } ] - const createFog = ResponseDecorator.handleErrors(FogController.createFogEndPoint, successCode, errCodes) - const responseObject = await createFog(req) - - res - .status(responseObject.code) - .send(responseObject.body) - - logger.apiRes({ req: req, res: responseObject }) + // 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) + 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 }) + }) } }, { @@ -97,14 +104,17 @@ module.exports = [ } ] - const updateFog = ResponseDecorator.handleErrors(FogController.updateFogEndPoint, successCode, errCodes) - const responseObject = await updateFog(req) - - res - .status(responseObject.code) - .send(responseObject.body) - - logger.apiRes({ req: req, res: responseObject }) + // 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) + 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 }) + }) } }, { @@ -125,14 +135,17 @@ module.exports = [ } ] - const deleteFog = ResponseDecorator.handleErrors(FogController.deleteFogEndPoint, successCode, errCodes) - const responseObject = await deleteFog(req) - - res - .status(responseObject.code) - .send(responseObject.body) - - logger.apiRes({ req: req, res: responseObject }) + // 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) + 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 }) + }) } }, { @@ -153,14 +166,17 @@ module.exports = [ } ] - const getFog = ResponseDecorator.handleErrors(FogController.getFogEndPoint, successCode, errCodes) - const responseObject = await getFog(req) - - res - .status(responseObject.code) - .send(responseObject.body) - - logger.apiRes({ req: req, res: responseObject }) + // 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) + 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 }) + }) } }, { @@ -181,15 +197,17 @@ module.exports = [ } ] - const generateFogProvisioningKey = ResponseDecorator.handleErrors(FogController.generateProvisioningKeyEndPoint, - successCode, errCodes) - const responseObject = await generateFogProvisioningKey(req) - - res - .status(responseObject.code) - .send(responseObject.body) - - logger.apiRes({ req: req, res: responseObject }) + await keycloak.protect(['SRE'])(req, res, async () => { + 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, user: user, res: responseObject }) + }) } }, { @@ -214,15 +232,17 @@ module.exports = [ } ] - const setFogVersionCommand = ResponseDecorator.handleErrors(FogController.setFogVersionCommandEndPoint, - successCode, errCodes) - const responseObject = await setFogVersionCommand(req) - - res - .status(responseObject.code) - .send(responseObject.body) - - logger.apiRes({ req: req, res: responseObject }) + await keycloak.protect(['SRE'])(req, res, async () => { + 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, user: user, res: responseObject }) + }) } }, { @@ -247,15 +267,17 @@ module.exports = [ } ] - const setFogRebootCommand = ResponseDecorator.handleErrors(FogController.setFogRebootCommandEndPoint, - successCode, errCodes) - const responseObject = await setFogRebootCommand(req) - - res - .status(responseObject.code) - .send(responseObject.body) - - logger.apiRes({ req: req, res: responseObject }) + await keycloak.protect(['SRE'])(req, res, async () => { + 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, user: user, res: responseObject }) + }) } }, { @@ -276,15 +298,17 @@ module.exports = [ } ] - const getHalHardwareInfo = ResponseDecorator.handleErrors(FogController.getHalHardwareInfoEndPoint, - successCode, errCodes) - const responseObject = await getHalHardwareInfo(req) - - res - .status(responseObject.code) - .send(responseObject.body) - - logger.apiRes({ req: req, res: responseObject }) + await keycloak.protect(['SRE', 'Developer', 'Viewer'])(req, res, async () => { + 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, user: user, res: responseObject }) + }) } }, { @@ -305,14 +329,16 @@ module.exports = [ } ] - const getHalUsbInfo = ResponseDecorator.handleErrors(FogController.getHalUsbInfoEndPoint, successCode, errCodes) - const responseObject = await getHalUsbInfo(req) - - res - .status(responseObject.code) - .send(responseObject.body) + 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 }) + }) } }, { @@ -337,15 +363,17 @@ module.exports = [ } ] - const setFogPruneCommand = ResponseDecorator.handleErrors(FogController.setFogPruneCommandEndPoint, - successCode, errCodes) - const responseObject = await setFogPruneCommand(req) - - res - .status(responseObject.code) - .send(responseObject.body) - - logger.apiRes({ req: req, res: responseObject }) + await keycloak.protect(['SRE'])(req, res, async () => { + 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, user: user, res: responseObject }) + }) } } ] diff --git a/src/routes/kubelet.js b/src/routes/kubelet.js deleted file mode 100644 index 1666f7091..000000000 --- a/src/routes/kubelet.js +++ /dev/null @@ -1,434 +0,0 @@ -/* - * ******************************************************************************* - * * Copyright (c) 2020 Edgeworx, Inc. - * * - * * 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/v3/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/v3/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/v3/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/v3/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/v3/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/v3/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/v3/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/v3/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/v3/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/v3/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/v3/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/v3/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/v3/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/microservices.js b/src/routes/microservices.js index e817e2108..d59b59a6d 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 @@ -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) - - res - .status(responseObject.code) - .send(responseObject.body) - - logger.apiRes({ req: req, res: responseObject }) + 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: responseObject }) + }) } }, { @@ -59,15 +62,17 @@ module.exports = [ } ] - const getMicroservicesByApplicationEndPoint = ResponseDecorator.handleErrors(MicroservicesController.getMicroservicesByApplicationEndPoint, - successCode, errorCodes) - const responseObject = await getMicroservicesByApplicationEndPoint(req) - - res - .status(responseObject.code) - .send(responseObject.body) - - logger.apiRes({ req: req, res: responseObject }) + await keycloak.protect(['SRE', 'Developer', 'Viewer'])(req, res, async () => { + 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, user: user, res: responseObject }) + }) } }, { @@ -89,15 +94,17 @@ module.exports = [ } ] - const createMicroservicesOnFogEndPoint = ResponseDecorator.handleErrors( - MicroservicesController.createMicroserviceOnFogEndPoint, successCode, errorCodes) - const responseObject = await createMicroservicesOnFogEndPoint(req) - - res - .status(responseObject.code) - .send(responseObject.body) - - logger.apiRes({ req: req, res: responseObject }) + await keycloak.protect(['SRE', 'Developer'])(req, res, async () => { + 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, user: user, res: responseObject }) + }) } }, { @@ -120,15 +127,17 @@ module.exports = [ } ] - const createMicroservicesYAMLEndPoint = ResponseDecorator.handleErrors( - MicroservicesController.createMicroserviceYAMLEndPoint, successCode, errorCodes) - const responseObject = await createMicroservicesYAMLEndPoint(req) - - res - .status(responseObject.code) - .send(responseObject.body) - - logger.apiRes({ req: req, res: responseObject }) + await keycloak.protect(['SRE', 'Developer'])(req, res, async () => { + 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, user: user, res: responseObject }) + }) } }, { @@ -149,18 +158,81 @@ 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) + 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/pub/:tag', + middleware: async (req, res) => { + logger.apiReq(req) - res - .status(responseObject.code) - .send(responseObject.body) + 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] + } + ] - logger.apiRes({ req: req, res: responseObject }) + 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', @@ -184,18 +256,55 @@ 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) + 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', + supportSubstitution: true, + middleware: async (req, res) => { + logger.apiReq(req) - res - .status(responseObject.code) - .send(responseObject.body) + 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] + } + ] - logger.apiRes({ req: req, res: responseObject }) + 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/v3/microservices/yaml/:uuid', @@ -220,15 +329,17 @@ module.exports = [ } ] - const updateMicroserviceYAMLEndPoint = ResponseDecorator.handleErrors(MicroservicesController.updateMicroserviceYAMLEndPoint, - successCode, errorCodes) - const responseObject = await updateMicroserviceYAMLEndPoint(req) - - res - .status(responseObject.code) - .send(responseObject.body) - - logger.apiRes({ req: req, res: responseObject }) + await keycloak.protect(['SRE', 'Developer'])(req, res, async () => { + 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, user: user, res: responseObject }) + }) } }, { @@ -249,15 +360,17 @@ module.exports = [ } ] - const deleteMicroserviceEndPoint = ResponseDecorator.handleErrors(MicroservicesController.deleteMicroserviceEndPoint, - successCode, errorCodes) - const responseObject = await deleteMicroserviceEndPoint(req) - - res - .status(responseObject.code) - .send(responseObject.body) - - logger.apiRes({ req: req, res: responseObject }) + await keycloak.protect(['SRE', 'Developer'])(req, res, async () => { + 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, user: user, res: responseObject }) + }) } }, { @@ -282,15 +395,17 @@ module.exports = [ } ] - const createMicroserviceRouteEndPoint = ResponseDecorator.handleErrors( - MicroservicesController.createMicroserviceRouteEndPoint, successCode, errorCodes) - const responseObject = await createMicroserviceRouteEndPoint(req) - - res - .status(responseObject.code) - .send(responseObject.body) - - logger.apiRes({ req: req, res: responseObject }) + await keycloak.protect(['SRE', 'Developer'])(req, res, async () => { + 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, user: user, res: responseObject }) + }) } }, { @@ -315,15 +430,17 @@ module.exports = [ } ] - const deleteMicroserviceRouteEndPoint = ResponseDecorator.handleErrors( - MicroservicesController.deleteMicroserviceRouteEndPoint, successCode, errorCodes) - const responseObject = await deleteMicroserviceRouteEndPoint(req) - - res - .status(responseObject.code) - .send(responseObject.body) - - logger.apiRes({ req: req, res: responseObject }) + await keycloak.protect(['SRE', 'Developer'])(req, res, async () => { + 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, user: user, res: responseObject }) + }) } }, { @@ -348,15 +465,52 @@ 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) + 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/v3/microservices/system/:uuid/port-mapping', + middleware: async (req, res) => { + logger.apiReq(req) - res - .status(responseObject.code) - .send(responseObject.body) + 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] + } + ] - logger.apiRes({ req: req, res: responseObject }) + 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 }) + }) } }, { @@ -377,15 +531,48 @@ 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) + 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/v3/microservices/system/:uuid/port-mapping/:internalPort', + middleware: async (req, res) => { + logger.apiReq(req) - res - .status(responseObject.code) - .send(responseObject.body) + 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] + } + ] - logger.apiRes({ req: req, res: responseObject }) + await keycloak.protect(['SRE'])(req, res, async () => { + const deleteSystemMicroservicePortMapping = ResponseDecorator.handleErrors( + MicroservicesController.deleteSystemMicroservicePortMappingEndPoint, 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 }) + }) } }, { @@ -406,15 +593,17 @@ module.exports = [ } ] - const getMicroservicePortMapping = ResponseDecorator.handleErrors( - MicroservicesController.getMicroservicePortMappingListEndPoint, successCode, errorCodes) - const responseObject = await getMicroservicePortMapping(req) - - res - .status(responseObject.code) - .send(responseObject.body) - - logger.apiRes({ req: req, res: responseObject }) + await keycloak.protect(['SRE', 'Developer', 'Viewer'])(req, res, async () => { + 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, user: user, res: responseObject }) + }) } }, { @@ -435,18 +624,20 @@ module.exports = [ } ] - const listMicroserviceVolumeMappingEndPoint = ResponseDecorator.handleErrors( - MicroservicesController.listMicroserviceVolumeMappingsEndPoint, - successCode, - errorCodes - ) - const responseObject = await listMicroserviceVolumeMappingEndPoint(req) - - res - .status(responseObject.code) - .send(responseObject.body) - - logger.apiRes({ req: req, res: responseObject }) + await keycloak.protect(['SRE', 'Developer', 'Viewer'])(req, res, async () => { + const listMicroserviceVolumeMappingEndPoint = ResponseDecorator.handleErrors( + MicroservicesController.listMicroserviceVolumeMappingsEndPoint, + successCode, + 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, user: user, res: responseObject }) + }) } }, { @@ -471,18 +662,58 @@ 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) + 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/v3/microservices/system/:uuid/volume-mapping', + middleware: async (req, res) => { + logger.apiReq(req) - res - .status(responseObject.code) - .send(responseObject.body) + 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] + } + ] - logger.apiRes({ req: req, res: responseObject }) + 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 }) + }) } }, { @@ -507,18 +738,58 @@ 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) + 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/v3/microservices/system/:uuid/volume-mapping/:id', + middleware: async (req, res) => { + logger.apiReq(req) - res - .status(responseObject.code) - .send(responseObject.body) + 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] + } + ] - logger.apiRes({ req: req, res: responseObject }) + await keycloak.protect(['SRE'])(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/routes/registries.js b/src/routes/registries.js index 7f9d416a2..5f80e3c60 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 @@ -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,17 @@ 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) + 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 }) + }) } }, { @@ -61,13 +66,17 @@ 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) + 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 }) + }) } }, { @@ -91,13 +100,17 @@ 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) + 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 }) + }) } }, { @@ -122,14 +135,18 @@ 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) + 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/router.js b/src/routes/router.js index 5653f2a3a..12a64f9d2 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 @@ -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) + 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 }) + }) } }, { @@ -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) + 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 280b17cdc..105e9add5 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 @@ -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) + 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 }) + }) } }, { @@ -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) + 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 }) + }) } }, { @@ -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) + 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 }) + }) } }, { @@ -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) + 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 }) + }) } }, { @@ -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) + 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/tunnel.js b/src/routes/tunnel.js index 03a9c62ea..e3021a462 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 @@ -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,22 @@ 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) + 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 }) + }) } }, { @@ -64,13 +74,22 @@ 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) + 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/user.js b/src/routes/user.js index f010c7659..93eaa1f84 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 @@ -11,12 +11,9 @@ * */ const constants = require('../helpers/constants') - 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 = [ @@ -51,103 +48,31 @@ module.exports = [ }, { method: 'post', - path: '/api/v3/user/logout', + path: '/api/v3/user/refresh', middleware: async (req, res) => { - logger.apiReq(req) - - const successCode = constants.HTTP_CODE_NO_CONTENT - const errorCodes = [ - { - code: constants.HTTP_CODE_UNAUTHORIZED, - errors: [Errors.AuthenticationError] - } - ] + logger.apiReq('POST /api/v3/user/refresh') // don't use req as arg, because password not encrypted - const userLogoutEndPoint = ResponseDecorator.handleErrors(UserController.userLogoutEndPoint, successCode, errorCodes) - const responseObject = await userLogoutEndPoint(req) - - res - .status(responseObject.code) - .send() - } - }, - { - method: 'post', - path: '/api/v3/user/signup', - middleware: async (req, res) => { - logger.apiReq('POST /api/v3/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/v3/user/signup/resend-activation', - middleware: async (req, res) => { - logger.apiReq(req) - - const successCode = constants.HTTP_CODE_NO_CONTENT + const successCode = constants.HTTP_CODE_SUCCESS 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/v3/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] + code: constants.HTTP_CODE_UNAUTHORIZED, + errors: [Errors.InvalidCredentialsError] } ] - 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')) - } + const refreshTokenEndPoint = ResponseDecorator.handleErrors(UserController.refreshTokenEndPoint, successCode, errorCodes) + const responseObject = await refreshTokenEndPoint(req) res .status(responseObject.code) .send(responseObject.body) - logger.apiRes({ req: req, res: responseObject }) + 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 } }, { @@ -164,48 +89,23 @@ module.exports = [ } ] - const getUserProfileEndPoint = ResponseDecorator.handleErrors(UserController.getUserProfileEndPoint, successCode, errorCodes) + 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/v3/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) - + 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 }) } }, { - method: 'delete', - path: '/api/v3/user/profile', + method: 'post', + path: '/api/v3/user/logout', middleware: async (req, res) => { logger.apiReq(req) @@ -217,69 +117,12 @@ module.exports = [ } ] - 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/v3/user/password', - middleware: async (req, res) => { - logger.apiReq('PATCH /api/v3/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/v3/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) + const userLogoutEndPoint = ResponseDecorator.handleErrors(UserController.userLogoutEndPoint, successCode, errorCodes) + const responseObject = await userLogoutEndPoint(req) res .status(responseObject.code) - .send(responseObject.body) - - logger.apiRes({ req: req, res: responseObject }) + .send() } } ] 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..c03b779ae 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 @@ -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/data/managers/kubelet-access-token-manager.js b/src/schemas/controlPlane.js similarity index 54% rename from src/data/managers/kubelet-access-token-manager.js rename to src/schemas/controlPlane.js index c563fa455..79b659a93 100644 --- a/src/data/managers/kubelet-access-token-manager.js +++ b/src/schemas/controlPlane.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 @@ -11,15 +11,16 @@ * */ -const BaseManager = require('./base-manager') -const models = require('../models') -const KubeletAccessToken = models.KubeletAccessToken - -class KubeletAccessTokenManager extends BaseManager { - getEntity () { - return KubeletAccessToken - } +const details = { + id: '/profile', + type: 'object', + properties: { + }, + required: [], + additionalProperties: true } -const instance = new KubeletAccessTokenManager() -module.exports = instance +module.exports = { + mainSchemas: [details], + innerSchemas: [] +} 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..80ad9004f 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 @@ -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 fd1637bc6..92fde6ea1 100644 --- a/src/schemas/microservice.js +++ b/src/schemas/microservice.js @@ -49,7 +49,21 @@ const microserviceCreate = { 'items': { '$ref': '/env' } }, 'cmd': { 'type': 'array', - 'items': { 'type': 'string' } } + 'items': { 'type': 'string' } }, + 'cdiDevices': { + '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'], 'additionalProperties': true @@ -90,7 +104,21 @@ const microserviceUpdate = { 'items': { '$ref': '/env' } }, 'cmd': { 'type': 'array', - 'items': { 'type': 'string' } } + 'items': { 'type': 'string' } }, + 'cdiDevices': { + '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' } + } }, 'additionalProperties': true } @@ -134,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/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..d069afebd 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 @@ -11,122 +11,33 @@ * */ -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 } - }, - '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' } + password: { type: 'string' }, + totp: { type: 'string' } }, - 'required': ['email', 'password'], - 'additionalProperties': true + 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 } - }, - '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 } - }, - '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,}))$' - } +const refresh = { + id: '/refresh', + type: 'object', + properties: { + refreshToken: { type: 'string' } }, - 'required': ['email'], - 'additionalProperties': true + required: ['refreshToken'], + additionalProperties: true } module.exports = { - mainSchemas: [signUp, login, resendActivation, activateUser, activateUserCLI, updateUserProfile, - updateUserProfileCLI, updatePassword, resetUserPassword], + mainSchemas: [login, refresh], innerSchemas: [] } diff --git a/src/server.js b/src/server.js index 2f018ef15..5c91faacc 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 @@ -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') @@ -27,13 +27,14 @@ 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 swaggerFile = require('../docs/swagger.json') 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() @@ -46,7 +47,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 })) @@ -173,6 +180,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)) @@ -198,10 +208,13 @@ 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: {} + user: {}, + keycloakURL: kcURL, + keycloakRealm: kcRealm, + keycloakClientid: kcClient } if (viewerURL) { ecnViewerControllerConfig.url = viewerURL @@ -220,4 +233,3 @@ initState() startHttpServer({ api: app, viewer: viewerApp }, { api: apiPort, viewer: viewerPort }, jobs) } }) -app.use('/docs', swaggerUi.serve, swaggerUi.setup(swaggerFile)) diff --git a/src/services/access-token-service.js b/src/services/access-token-service.js deleted file mode 100644 index 6363acd20..000000000 --- a/src/services/access-token-service.js +++ /dev/null @@ -1,29 +0,0 @@ -/* - * ******************************************************************************* - * * Copyright (c) 2020 Edgeworx, Inc. - * * - * * 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 14e008d2c..fee8ebc96 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 @@ -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,6 +299,9 @@ const getAgentMicroservices = async function (fog, transaction) { config: microservice.config, rebuild: microservice.rebuild, rootHostAccess: microservice.rootHostAccess, + runAsUser: microservice.runAsUser, + platform: microservice.platform, + runtime: microservice.runtime, logSize: parseInt(microservice.logSize) || constants.MICROSERVICE_DEFAULT_LOG_SIZE, registryId, portMappings: microservice.ports, @@ -309,6 +312,7 @@ const getAgentMicroservices = async function (fog, transaction) { env, extraHosts, cmd, + cdiDevices, routes, isConsumer } @@ -369,9 +373,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 b057789ba..4b806ebc6 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 @@ -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, @@ -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) @@ -73,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) } } @@ -89,15 +88,31 @@ 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, - userId: user.id + ...conditions + } + 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) @@ -107,16 +122,16 @@ 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, 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 +145,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) { @@ -139,11 +154,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, @@ -167,13 +182,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,14 +201,14 @@ 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) { - 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) { @@ -201,7 +216,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) @@ -211,19 +226,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) @@ -240,14 +255,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) @@ -272,9 +287,8 @@ const _updateMicroservices = async function (application, microservices, user, i }) } -const getUserApplicationsEndPoint = async function (user, isCLI, transaction) { +const getUserApplicationsEndPoint = async function (isCLI, transaction) { const application = { - userId: user.id, isSystem: false } @@ -286,6 +300,19 @@ const getUserApplicationsEndPoint = async function (user, 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) @@ -303,10 +330,10 @@ 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, userId: user.id } + ? { ...conditions, isSystem: false } + : { ...conditions, isSystem: false } const attributes = { exclude: ['created_at', 'updated_at'] } const applicationRaw = await ApplicationManager.findOnePopulated(where, attributes, transaction) @@ -317,16 +344,16 @@ 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 } -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) { @@ -358,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/application-template-service.js b/src/services/application-template-service.js index 771539bba..df68d89c2 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 @@ -24,20 +24,19 @@ 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) // 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) @@ -57,31 +56,30 @@ 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, - userId: user.id + ...conditions } const where = AppHelper.deleteUndefinedFields(whereObj) 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, 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,24 +91,24 @@ 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) } -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) // 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) + return createApplicationTemplateEndPoint({ ...applicationTemplateData, name }, 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,11 +120,11 @@ 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) { - await _updateVariables(oldApplicationTemplate.id, applicationTemplateData.variables, user, isCLI, transaction) + await _updateVariables(oldApplicationTemplate.id, applicationTemplateData.variables, isCLI, transaction) } return { @@ -148,16 +146,15 @@ 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 = { - userId: user.id } const attributes = { exclude: ['created_at', 'updated_at'] } @@ -190,10 +187,10 @@ const getAllApplicationTemplatesEndPoint = async function (isCLI, transaction) { } } -async function getApplicationTemplate (conditions, user, isCLI, transaction) { +async function getApplicationTemplate (conditions, 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) @@ -203,14 +200,14 @@ 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, 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) } @@ -239,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 @@ -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 bc9e6a569..5c0b7883c 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 @@ -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, { userId: user.id }, transaction) + 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 @@ -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 @@ -58,17 +57,16 @@ 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 ? {} : { - [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 { @@ -76,18 +74,17 @@ 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 } : { 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) { @@ -96,17 +93,31 @@ async function getCatalogItem (id, user, isCLI, transaction) { return item } -const getCatalogItemEndPoint = async function (id, user, isCLI, transaction) { - return getCatalogItem(id, user, isCLI, transaction) +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 deleteCatalogItemEndPoint = async function (id, user, isCLI, transaction) { +const getCatalogItemEndPoint = async function (id, isCLI, transaction) { + return getCatalogItem(id, isCLI, transaction) +} + +const deleteCatalogItemEndPoint = async function (id, isCLI, transaction) { const where = isCLI ? { id: id } : { - userId: user.id, id: id } @@ -125,11 +136,10 @@ const deleteCatalogItemEndPoint = async function (id, user, isCLI, transaction) async function getNetworkCatalogItem (transaction) { return CatalogItemManager.findOne({ - name: 'Networking Tool', - category: 'SYSTEM', - publisher: 'Eclipse ioFog', - registry_id: 1, - user_id: null + name: 'NATs', + category: 'UTILITIES', + publisher: 'Datasance', + registry_id: 1 }, transaction) } @@ -137,9 +147,8 @@ async function getRouterCatalogItem (transaction) { return CatalogItemManager.findOne({ name: DBConstants.ROUTER_CATALOG_NAME, category: 'SYSTEM', - publisher: 'Eclipse ioFog', - registry_id: 1, - user_id: null + publisher: 'Datasance', + registry_id: 1 }, transaction) } @@ -147,19 +156,8 @@ async function getProxyCatalogItem (transaction) { return CatalogItemManager.findOne({ name: DBConstants.PROXY_CATALOG_NAME, category: 'SYSTEM', - publisher: 'Eclipse ioFog', - registry_id: 1, - user_id: null - }, transaction) -} - -async function getPortRouterCatalogItem (transaction) { - return CatalogItemManager.findOne({ - name: DBConstants.PORT_ROUTER_CATALOG_NAME, - category: 'SYSTEM', - publisher: 'Eclipse ioFog', - registry_id: 1, - user_id: null + publisher: 'Datasance', + registry_id: 1 }, transaction) } @@ -167,9 +165,8 @@ async function getBluetoothCatalogItem (transaction) { return CatalogItemManager.findOne({ name: 'RESTBlue', category: 'SYSTEM', - publisher: 'Eclipse ioFog', - registry_id: 1, - user_id: null + publisher: 'Datasance', + registry_id: 1 }, transaction) } @@ -177,17 +174,16 @@ async function getHalCatalogItem (transaction) { return CatalogItemManager.findOne({ name: 'HAL', category: 'SYSTEM', - publisher: 'Eclipse ioFog', - registry_id: 1, - user_id: null + publisher: 'Datasance', + 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 } + ? { name: name, id: { [Op.ne]: item.id } } + : { name: name } const result = await CatalogItemManager.findOne(where, transaction) if (result) { @@ -210,7 +206,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, @@ -221,8 +217,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) @@ -379,10 +374,10 @@ module.exports = { deleteCatalogItemEndPoint: TransactionDecorator.generateTransaction(deleteCatalogItemEndPoint), updateCatalogItemEndPoint: TransactionDecorator.generateTransaction(updateCatalogItemEndPoint), getCatalogItem: getCatalogItem, + getSystemCatalogItem: getSystemCatalogItem, getNetworkCatalogItem: getNetworkCatalogItem, getBluetoothCatalogItem: getBluetoothCatalogItem, getHalCatalogItem: getHalCatalogItem, getRouterCatalogItem: getRouterCatalogItem, - getProxyCatalogItem: getProxyCatalogItem, - getPortRouterCatalogItem: getPortRouterCatalogItem + getProxyCatalogItem: getProxyCatalogItem } 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..79fa63aeb 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 @@ -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 @@ -57,7 +49,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'] } } } @@ -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 98b771a75..f138683cc 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 @@ -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,12 +42,12 @@ 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 ? { 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)) @@ -75,12 +75,12 @@ 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 ? { 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)) @@ -100,14 +100,13 @@ 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 } : { - uuid: microserviceUuid, - userId: user.id + uuid: microserviceUuid } const microservice = await MicroserviceManager.findOneWithDependencies(where, {}, transaction) @@ -127,14 +126,13 @@ 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 } : { - uuid: microserviceUuid, - userId: user.id + uuid: microserviceUuid } const microservice = await MicroserviceManager.findOneWithDependencies(where, {}, transaction) if (!microservice) { diff --git a/src/services/edge-resource-service.js b/src/services/edge-resource-service.js index 360491711..10e943cae 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 @@ -23,14 +23,14 @@ const TransactionDecorator = require('../decorators/transaction-decorator') const Validator = require('../schemas') const ChangeTrackingService = require('./change-tracking-service') -async function listEdgeResources (user, transaction) { - const edgeResources = await EdgeResourceManager.findAllWithOrchestrationTags({ userId: user.id }, transaction) +async function listEdgeResources () { + const edgeResources = await EdgeResourceManager.findAllWithOrchestrationTags() 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, 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 [] } @@ -155,15 +155,14 @@ 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, 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, @@ -193,9 +192,9 @@ 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, userId: user.id }, transaction) + const oldData = await EdgeResourceManager.findOne({ name: oldName, version }, transaction) if (!oldData) { if (!edgeResourceData.name) { edgeResourceData.name = oldName @@ -203,14 +202,13 @@ 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)) } 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)) } @@ -246,8 +244,8 @@ 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) +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)) } @@ -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) +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)) } - 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)) } @@ -276,12 +274,12 @@ 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) { - const resource = await EdgeResourceManager.findOne({ name, version, userId: user.id }, 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)) } - 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 0c62a8003..000000000 --- a/src/services/email-activation-code-service.js +++ /dev/null @@ -1,64 +0,0 @@ -/* - * ******************************************************************************* - * * Copyright (c) 2020 Edgeworx, Inc. - * * - * * 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-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..1255c82d0 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 @@ -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') @@ -26,19 +24,20 @@ 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 config = require('../config') 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') -async function createFogEndPoint (fogData, user, isCLI, transaction) { +async function createFogEndPoint (fogData, isCLI, transaction) { await Validator.validate(fogData, Validator.schemas.iofogCreate) let createFogData = { @@ -49,6 +48,7 @@ async function createFogEndPoint (fogData, user, 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, @@ -68,7 +68,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 +90,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 +112,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 = { @@ -128,19 +122,15 @@ 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) - try { - await informKubelet(fog.uuid, 'POST') - } catch (e) {} - return res } @@ -158,7 +148,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 } @@ -170,6 +160,7 @@ async function updateFogEndPoint (fogData, user, 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, @@ -202,25 +193,10 @@ 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 && oldFog.userId !== user.id) { - 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)) @@ -237,6 +213,13 @@ async function updateFogEndPoint (fogData, user, 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 @@ -252,19 +235,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) + messagingPort, interRouterPort, edgeRouterPort, isEdge: routerMode === 'edge', host, requireSsl, sslProfile, saslMechanisms, authenticatePeer, caCert, tlsCert, tlsKey + }, upstreamRouters) await ChangeTrackingService.update(fogData.uuid, ChangeTrackingService.events.routerChanged, transaction) } } @@ -291,7 +274,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 } @@ -300,7 +283,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 } @@ -333,7 +316,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 +342,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) } @@ -380,9 +363,10 @@ async function _deleteFogRouter (fogData, userId, 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, user, isCLI, transaction) { +async function deleteFogEndPoint (fogData, isCLI, transaction) { await Validator.validate(fogData, Validator.schemas.iofogDelete) const queryFogData = { uuid: fogData.uuid } @@ -392,18 +376,9 @@ 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 && fog.userId !== user.id) { - 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) { @@ -469,37 +444,32 @@ 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, userId: user.id } + 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)) } - // 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) { - throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.INVALID_IOFOG_UUID, fogData.uuid)) - } - 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')) { - 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 ? {} : { userId: user.id, isSystem: false }) + const queryFogData = isSystem ? { isSystem } : (isCLI ? {} : { isSystem: false }) let fogs = await FogManager.findAllWithTags(queryFogData, transaction) fogs = _filterFogs(fogs, filters) @@ -512,7 +482,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 } @@ -528,11 +498,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 && fog.userId !== user.id) { - throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.INVALID_IOFOG_UUID, fogData.uuid)) - } - const provisioningKeyData = await FogProvisionKeyManager.updateOrCreate({ iofogUuid: fogData.uuid }, newProvision, transaction) return { @@ -541,7 +506,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 } @@ -556,11 +521,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 && fog.userId !== user.id) { - 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) } @@ -568,12 +528,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 } @@ -583,15 +543,10 @@ 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 && fog.userId !== user.id) { - 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, user, isCLI, transaction) { +async function getHalHardwareInfoEndPoint (uuidObj, isCLI, transaction) { await Validator.validate(uuidObj, Validator.schemas.halGet) const fog = await FogManager.findOne({ @@ -601,17 +556,12 @@ 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 && fog.userId !== user.id) { - throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.INVALID_IOFOG_UUID, uuidObj.uuid)) - } - return HWInfoManager.findOne({ iofogUuid: uuidObj.uuid }, 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({ @@ -621,11 +571,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 && fog.userId !== user.id) { - throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.INVALID_IOFOG_UUID, uuidObj.uuid)) - } - return USBInfoManager.findOne({ iofogUuid: uuidObj.uuid }, transaction) @@ -667,22 +612,24 @@ 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 = { uuid: AppHelper.generateRandomString(32), - name: `Hal for Fog ${fogData.uuid}`, + name: `hal-${fogData.uuid.toLowerCase()}`, config: '{}', catalogItemId: halItem.id, iofogUuid: fogData.uuid, rootHostAccess: true, logSize: Constants.MICROSERVICE_DEFAULT_LOG_SIZE, - userId: oldFog ? oldFog.userId : user.id, 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) { @@ -692,25 +639,29 @@ 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) } -async function _createBluetoothMicroserviceForFog (fogData, oldFog, user, transaction) { +async function _createBluetoothMicroserviceForFog (fogData, oldFog, transaction) { const bluetoothItem = await CatalogService.getBluetoothCatalogItem(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, rootHostAccess: true, logSize: Constants.MICROSERVICE_DEFAULT_LOG_SIZE, - userId: oldFog ? oldFog.userId : user.id, 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) { @@ -719,24 +670,13 @@ 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) } -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) { +async function setFogPruneCommandEndPoint (fogData, isCLI, transaction) { await Validator.validate(fogData, Validator.schemas.iofogPrune) const queryFogData = { uuid: fogData.uuid } @@ -746,11 +686,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 && fog.userId !== user.id) { - throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.INVALID_IOFOG_UUID, fogData.uuid)) - } - await ChangeTrackingService.update(fogData.uuid, ChangeTrackingService.events.prune, transaction) } diff --git a/src/services/kubelet-access-token-service.js b/src/services/kubelet-access-token-service.js deleted file mode 100644 index 478806e5f..000000000 --- a/src/services/kubelet-access-token-service.js +++ /dev/null @@ -1,48 +0,0 @@ -/* - * ******************************************************************************* - * * Copyright (c) 2020 Edgeworx, Inc. - * * - * * 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 bd6569cf3..000000000 --- a/src/services/kubelet-service.js +++ /dev/null @@ -1,432 +0,0 @@ -/* - * ******************************************************************************* - * * Copyright (c) 2020 Edgeworx, Inc. - * * - * * 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 8d9e88685..d5c233782 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 @@ -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') @@ -25,9 +27,8 @@ 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 { 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') @@ -55,9 +56,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) @@ -83,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)) } @@ -106,7 +107,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) { @@ -167,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 } } @@ -180,13 +192,10 @@ 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) - continue - } else if (!portMapping.isPublic) { + if (!portMapping.isPublic) { continue } @@ -198,31 +207,23 @@ async function movePublicPortsToNewFog (updatedMicroservice, user, 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, 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)) } 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) @@ -231,15 +232,13 @@ async function createPortMapping (microservice, portMappingData, user, transacti portMappingData.protocol = portMappingData.protocol || '' if (portMappingData.public) { - return _createPublicPortMapping(microservice, portMappingData, user, transaction) - } else if (portMappingData.proxy) { - return Proxy.createProxyPortMapping(microservice, portMappingData, user, transaction) + return _createPublicPortMapping(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 || '{}') @@ -252,29 +251,34 @@ async function _createOrUpdateProxyMicroservice (mapping, networkRouter, hostUui const proxyMicroserviceData = { uuid: AppHelper.generateRandomString(32), - name: 'Proxy', + name: `proxy-${hostUuid.toLowerCase()}`, config: JSON.stringify({ mappings: [mapping], - networkRouter: networkRouter + networkRouter }), catalogItemId: proxyCatalogId, iofogUuid: hostUuid, rootHostAccess: true, registryId: 1, - userId: user.id + logSize: MICROSERVICE_DEFAULT_LOG_SIZE, + 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 } -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 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 } @@ -284,29 +288,32 @@ 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, + transaction) + : null let remoteProxy 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 } - 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, + transaction) + : null } const mappingData = { @@ -315,7 +322,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) @@ -343,13 +349,11 @@ 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) } else { - await _deleteSimplePortMapping(microservice, portMapping, user, transaction) + await _deleteSimplePortMapping(microservice, portMapping, transaction) } } @@ -384,14 +388,13 @@ 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, isProxy: false, portInternal: portMappingData.internal, portExternal: portMappingData.external, - userId: microservice.userId, isUdp: portMappingData.protocol.toLowerCase() === 'udp', microserviceUuid: microservice.uuid } @@ -400,7 +403,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 = { @@ -429,9 +432,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 } @@ -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 } } @@ -469,23 +470,48 @@ async function switchOnUpdateFlagsForMicroservicesForPortMapping (microservice, } } -async function listPortMappings (microserviceUuid, user, isCLI, transaction) { +async function listPortMappings (microserviceUuid, 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) { +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, userId: user.id } + : { uuid: microserviceUuid } const microservice = await MicroserviceManager.findOne(where, transaction) if (!microservice) { @@ -504,35 +530,36 @@ 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) } } async function getPortMappings (microserviceUuid, transaction) { - return MicroservicePortManager.findAll({ microserviceUuid: microserviceUuid }, transaction) + return MicroservicePortManager.findAll({ microserviceUuid }, transaction) } -function listAllPublicPorts (user, transaction) { +function listAllPublicPorts (transaction) { return MicroservicePortManager.findAllPublicPorts(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, + deleteSystemPortMapping, + deletePortMappings, + getPortMappings, + listAllPublicPorts } diff --git a/src/services/microservice-ports/factory.js b/src/services/microservice-ports/factory.js deleted file mode 100644 index e40c52e71..000000000 --- a/src/services/microservice-ports/factory.js +++ /dev/null @@ -1,22 +0,0 @@ -/* - * ******************************************************************************* - * * Copyright (c) 2020 Edgeworx, Inc. - * * - * * 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 f6767c71b..000000000 --- a/src/services/microservice-ports/proxy.js +++ /dev/null @@ -1,224 +0,0 @@ -/* only "[a-zA-Z0-9][a-zA-Z0-9_.-]" are allowed - * ******************************************************************************* - * * Copyright (c) 2022 Edgeworx, Inc. - * * - * * 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, user, 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', - config: JSON.stringify({ - fetch_config_interval: 5, - proxies: [proxyConfig] - }), - catalogItemId: portRouterCatalogId, - iofogUuid: hostUuid, - rootHostAccess: true, - registryId: 1, - userId: user.id - } - const res = await MicroserviceManager.create(proxyMicroserviceData, transaction) - await ChangeTrackingService.update(hostUuid, ChangeTrackingService.events.microserviceCommon, transaction) - return res -} - -async function createProxyPortMapping (microservice, portMappingData, user, 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, - user, - transaction) - - const mappingData = { - isPublic: false, - isProxy: true, - portInternal: portMappingData.internal, - portExternal: portMappingData.external, - isUdp: protocol === 'udp', - userId: microservice.userId, - 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, user, 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, user, 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, - user, - 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 66ae6c0c1..a0bc47fad 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 @@ -15,8 +15,9 @@ 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 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') @@ -36,21 +37,48 @@ 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, 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 } } - if (!isCLI) { - where.userId = user.id - } + const microservices = await MicroserviceManager.findAllExcludeFields(where, transaction) const res = await Promise.all(microservices.map(async (microservice) => { @@ -62,9 +90,9 @@ async function listMicroservicesEndPoint (opt, user, isCLI, transaction) { } } -async function getMicroserviceEndPoint (microserviceUuid, user, isCLI, transaction) { +async function getMicroserviceEndPoint (microserviceUuid, isCLI, transaction) { if (!isCLI) { - await _validateMicroserviceOnGet(user.id, microserviceUuid, transaction) + await _validateMicroserviceOnGet(microserviceUuid, transaction) } const microservice = await MicroserviceManager.findOneExcludeFields({ @@ -113,11 +141,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 +164,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])) } @@ -152,7 +180,7 @@ async function _validateAgentHostTemplate (extraHost, templateArgs, userId, tran return extraHost } -async function _validateExtraHost (extraHostData, user, transaction) { +async function _validateExtraHost (extraHostData, transaction) { const extraHost = { templateType: 'Litteral', name: extraHostData.name, @@ -166,20 +194,20 @@ 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)) } -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 } @@ -197,20 +225,17 @@ 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 } else { - if (!isCLI) { - fogConditions.userId = user.id - } fogConditions.name = microserviceData.agentName } 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 @@ -218,7 +243,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)) } @@ -229,7 +254,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) @@ -242,13 +267,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) @@ -258,7 +283,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({ @@ -278,23 +303,59 @@ 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.cdiDevices) { + for (const cdiDevices of microserviceData.cdiDevices) { + await _createCdiDevices(microservice, cdiDevices, transaction) } } if (microserviceData.volumeMappings) { 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) } @@ -351,7 +412,7 @@ async function _updateRelatedExtraHosts (updatedMicroservice, transaction) { } } -async function updateMicroserviceEndPoint (microserviceUuid, microserviceData, user, isCLI, transaction, changeTrackingEnabled = true) { +async function updateSystemMicroserviceEndPoint (microserviceUuid, microserviceData, isCLI, transaction, changeTrackingEnabled = true) { await Validator.validate(microserviceData, Validator.schemas.microserviceUpdate) let needStatusReset = false const query = isCLI @@ -359,16 +420,15 @@ async function updateMicroserviceEndPoint (microserviceUuid, microserviceData, u uuid: microserviceUuid } : { - uuid: microserviceUuid, - userId: user.id + uuid: microserviceUuid } // 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, @@ -377,6 +437,10 @@ async function updateMicroserviceEndPoint (microserviceUuid, microserviceData, u rebuild: microserviceData.rebuild, iofogUuid: newFog.uuid, rootHostAccess: microserviceData.rootHostAccess, + cdiDevices: microserviceData.cdiDevices, + runAsUser: microserviceData.runAsUser, + platform: microserviceData.platform, + runtime: microserviceData.runtime, logSize: (microserviceData.logSize || constants.MICROSERVICE_DEFAULT_LOG_SIZE) * 1, registryId: microserviceData.registryId, volumeMappings: microserviceData.volumeMappings, @@ -406,7 +470,213 @@ async function updateMicroserviceEndPoint (microserviceUuid, microserviceData, u } if (microserviceDataUpdate.ports) { - await _updatePorts(microserviceDataUpdate.ports, microservice, user, transaction) + 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.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 + 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.getSystemCatalogItem(microserviceDataUpdate.catalogItemId, isCLI, transaction) + images = catalogItem.images + } else if (microserviceDataUpdate.images) { + images = microserviceDataUpdate.images + } else if (microservice.catalogItemId) { + const catalogItem = await CatalogService.getSystemCatalogItem(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.cdiDevices || + microserviceDataUpdate.runAsUser || + microserviceDataUpdate.platform || + microserviceDataUpdate.runtime || + 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.cdiDevices) { + await _updateCdiDevices(microserviceDataUpdate.cdiDevices, 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 + 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, + cdiDevices: microserviceData.cdiDevices, + runAsUser: microserviceData.runAsUser, + platform: microserviceData.platform, + runtime: microserviceData.runtime, + 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 _updatePorts(microserviceDataUpdate.ports, microservice, transaction) } if (microserviceDataUpdate.iofogUuid && microservice.iofogUuid !== microserviceDataUpdate.iofogUuid) { @@ -439,7 +709,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 @@ -461,8 +731,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 @@ -475,12 +744,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,6 +762,10 @@ async function updateMicroserviceEndPoint (microserviceUuid, microserviceData, u (microserviceDataUpdate.rootHostAccess !== undefined && microservice.rootHostAccess !== microserviceDataUpdate.rootHostAccess) || microserviceDataUpdate.env || microserviceDataUpdate.cmd || + microserviceDataUpdate.cdiDevices || + microserviceDataUpdate.runAsUser || + microserviceDataUpdate.platform || + microserviceDataUpdate.runtime || microserviceDataUpdate.volumeMappings || microserviceDataUpdate.ports || extraHosts @@ -500,7 +773,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 @@ -518,8 +791,44 @@ async function updateMicroserviceEndPoint (microserviceUuid, microserviceData, u 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, user, transaction) + 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) { @@ -568,14 +877,13 @@ 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 } : { - uuid: microserviceUuid, - userId: user.id + uuid: microserviceUuid } const microservice = await MicroserviceManager.findOneWithStatusAndCategory(where, transaction) @@ -602,13 +910,13 @@ 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) + 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)) } @@ -618,10 +926,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({ @@ -632,15 +940,36 @@ 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, isCLI, transaction) { + await Validator.validate(portMappingData, Validator.schemas.portsCreate) + await _validateMicroserviceOnGet(microserviceUuid, 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 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 createPortMappingEndPoint (microserviceUuid, portMappingData, user, isCLI, transaction) { +async function createSystemPortMappingEndPoint (microserviceUuid, portMappingData, isCLI, transaction) { await Validator.validate(portMappingData, Validator.schemas.portsCreate) const where = isCLI ? { uuid: microserviceUuid } - : { uuid: microserviceUuid, userId: user.id } + : { uuid: microserviceUuid } const microservice = await MicroserviceManager.findOne(where, transaction) if (!microservice) { @@ -653,10 +982,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 @@ -665,7 +994,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)) } @@ -673,7 +1002,6 @@ async function _createEnv (microservice, envData, user, transaction) { const msEnvData = { key: envData.key, value: envData.value, - userId: microservice.userId, microserviceUuid: microservice.uuid } @@ -681,7 +1009,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)) } @@ -695,32 +1023,138 @@ 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 _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) +} + +async function deleteSystemPortMappingEndPoint (microserviceUuid, internalPort, isCLI, transaction) { + return MicroservicePortService.deleteSystemPortMapping(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) { + // 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 !!(routes && routes.length > 0) + 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, user, isCLI, transaction) { +async function createVolumeMappingEndPoint (microserviceUuid, volumeMappingData, isCLI, transaction) { await Validator.validate(volumeMappingData, Validator.schemas.volumeMappings) const where = isCLI ? { uuid: microserviceUuid } - : { uuid: microserviceUuid, userId: user.id } + : { 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 } const microservice = await MicroserviceManager.findOne(where, transaction) if (!microservice) { @@ -752,10 +1186,31 @@ 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 } + + const microservice = await MicroserviceManager.findOne(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 deleteSystemVolumeMappingEndPoint (microserviceUuid, volumeMappingUuid, isCLI, transaction) { const where = isCLI ? { uuid: microserviceUuid } - : { uuid: microserviceUuid, userId: user.id } + : { uuid: microserviceUuid } const microservice = await MicroserviceManager.findOne(where, transaction) if (!microservice) { @@ -773,10 +1228,10 @@ 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, 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)) @@ -798,7 +1253,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 = { @@ -808,9 +1263,12 @@ async function _createMicroservice (microserviceData, user, isCLI, transaction) catalogItemId: microserviceData.catalogItemId, iofogUuid: microserviceData.iofogUuid, rootHostAccess: microserviceData.rootHostAccess, + cdiDevices: microserviceData.cdiDevices, + runAsUser: microserviceData.runAsUser, + platform: microserviceData.platform, + runtime: microserviceData.runtime, 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) @@ -823,10 +1281,10 @@ 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, {}, user.id, newMicroservice.applicationId, transaction) + await _checkForDuplicateName(newMicroservice.name, {}, newMicroservice.applicationId, transaction) // validate fog node if (newMicroservice.iofogUuid) { @@ -839,22 +1297,22 @@ 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 } // Force name conversion to string for PG const where = isCLI - ? { name: name.toString() } - : { name: name.toString(), userId: user.id } + ? { 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, userId: user.id } + ? { id: name, isSystem: false } + : { id: name, isSystem: false } const application = await ApplicationManager.findOne(where, transaction) if (!application) { @@ -926,12 +1384,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) } } @@ -964,10 +1422,31 @@ async function _updateArg (arg, microserviceUuid, transaction) { } } -async function _updatePorts (newPortMappings, microservice, user, transaction) { - await MicroservicePortService.deletePortMappings(microservice, user, 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) { - await createPortMappingEndPoint(microservice.uuid, portMapping, user, false, transaction) + await createPortMappingEndPoint(microservice.uuid, portMapping, false, transaction) + } +} + +async function _updateSystemPorts (newPortMappings, microservice, transaction) { + await MicroservicePortService.deletePortMappings(microservice, transaction) + for (const portMapping of newPortMappings) { + await createSystemPortMappingEndPoint(microservice.uuid, portMapping, false, transaction) } } @@ -979,19 +1458,17 @@ 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, - userId: userId, applicationId, delete: false } @@ -1003,10 +1480,9 @@ 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 + uuid: microserviceUuid } const microservice = await MicroserviceManager.findMicroserviceOnGet(where, transaction) if (!microservice) { @@ -1037,15 +1513,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 @@ -1061,12 +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 = [] @@ -1076,15 +1552,17 @@ 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 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] } + res.pubTags = pubTags + res.subTags = subTags res.logSize *= 1 @@ -1096,21 +1574,59 @@ async function _buildGetMicroserviceResponse (microservice, transaction) { return res } -function listAllPublicPortsEndPoint (user, transaction) { - return MicroservicePortService.listAllPublicPorts(user, transaction) +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), + 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, @@ -1119,6 +1635,9 @@ module.exports = { listMicroservicesEndPoint: TransactionDecorator.generateTransaction(listMicroservicesEndPoint), listVolumeMappingsEndPoint: TransactionDecorator.generateTransaction(listVolumeMappingsEndPoint), 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/registry-service.js b/src/services/registry-service.js index 7cc0108c8..de0a8eade 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 @@ -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) @@ -35,30 +35,26 @@ 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) 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 ? {} : { [Op.or]: [ - { - userId: user.id - }, { isPublic: true } @@ -71,23 +67,20 @@ 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 } - : { 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) + 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) { @@ -119,21 +112,16 @@ const updateRegistry = async function (registry, registryId, user, isCLI, transa 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) + await _updateChangeTracking(transaction) } -const _updateChangeTracking = async function (user, transaction) { - const fogs = await FogManager.findAll({ userId: user.id }, 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/router-service.js b/src/services/router-service.js index 7614527fe..3ccf0bcbd 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 @@ -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') @@ -51,7 +53,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 @@ -63,29 +65,36 @@ async function createRouterForFog (fogData, uuid, userId, upstreamRouters, trans 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, 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 +116,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 +144,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,17 +162,17 @@ 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)) } - 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({ @@ -179,14 +188,15 @@ 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) } else { + await MicroserviceManager.update({ uuid: routerMicroservice.uuid }, { rebuild: true }, transaction) await ChangeTrackingService.update(router.iofogUuid, ChangeTrackingService.events.microserviceConfig, transaction) } } @@ -206,44 +216,63 @@ 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 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, rootHostAccess: false, logSize: constants.MICROSERVICE_DEFAULT_LOG_SIZE, - userId, 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) { - 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, @@ -256,17 +285,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/routing-service.js b/src/services/routing-service.js index f2dde0610..f6cb1fdc4 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 @@ -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 } @@ -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)) @@ -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/scheduler-access-token-service.js b/src/services/scheduler-access-token-service.js deleted file mode 100644 index 0dec87c4d..000000000 --- a/src/services/scheduler-access-token-service.js +++ /dev/null @@ -1,48 +0,0 @@ -/* - * ******************************************************************************* - * * Copyright (c) 2020 Edgeworx, Inc. - * * - * * 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/tunnel-service.js b/src/services/tunnel-service.js index 29ce0d6a2..14142af29 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 @@ -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) } diff --git a/src/services/user-service.js b/src/services/user-service.js index 12bb45b80..fcbed54d4 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 @@ -11,383 +11,159 @@ * */ -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 https = require('https') 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) + 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 } - await _updateUser(codeData.userId, updatedObj, transaction) - } else { - await Validator.validate(codeData, Validator.schemas.activateUser) + // Make a POST request to Keycloak token endpoint + const response = await axios.request(config) - const activationCode = await EmailActivationCodeService.verifyActivationCode(codeData.activationCode, transaction) - if (!activationCode) { - throw new Errors.NotFoundError(ErrorMessages.ACTIVATION_CODE_NOT_FOUND) + // Extract the access token from the response + const accessToken = response.data.access_token + const refreshToken = response.data.refresh_token + return { + accessToken, + refreshToken } - - await _updateUser(activationCode.userId, updatedObj, transaction) - - await EmailActivationCodeService.deleteActivationCode(codeData.activationCode, transaction) + } catch (error) { + console.error('Error during login:', error) + throw new Errors.InvalidCredentialsError() } } -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 - } - : { - firstName: profileData.firstName, - lastName: profileData.lastName +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 } - updateObject = AppHelper.deleteUndefinedFields(updateObject) + // Make a POST request to Keycloak token endpoint + const response = await axios.request(config) - await UserManager.updateDetails(user, updateObject, transaction) - - return { - firstName: updateObject.firstName, - lastName: updateObject.lastName, - email: user.email - } -} - -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) - } - } + // 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) + throw new Errors.InvalidCredentialsError() } - - 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) { +const profile = async function (req, isCLI, 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 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 } - } -} -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 - } - })) - } + // Make the request using async/await + const response = await axios.request(profileconfig) - 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, - 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 + // Return the userinfo data + return response.data + } catch (error) { + console.error('Error during profile retrieval:', error) + throw new Errors.InvalidCredentialsError() } - - await _sendEmail(transporter, mailOptions) } -async function _sendEmail (transporter, mailOptions) { +const logout = async function (req, isCLI, transaction) { try { - await transporter.sendMail(mailOptions) - } catch (errMsg) { - throw new Error(ErrorMessages.EMAIL_SENDER_NOT_CONFIGURED) - } -} + 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 + } -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 the request using async/await + const response = await axios.request(logoutconfig) - return { - email: email, - password: password, - service: service - } - } catch (errMsg) { - throw new Errors.EmailActivationSetupError() + // Return the userinfo data + return response.data + } catch (error) { + console.error('Error during logout:', 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) + refresh: TransactionDecorator.generateTransaction(refresh), + profile: TransactionDecorator.generateTransaction(profile), + logout: TransactionDecorator.generateTransaction(logout) } 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) diff --git a/src/views/email-activation-temp.js b/src/views/email-activation-temp.js deleted file mode 100644 index 6f85c3fb4..000000000 --- a/src/views/email-activation-temp.js +++ /dev/null @@ -1,140 +0,0 @@ -/* - * ******************************************************************************* - * * Copyright (c) 2020 Edgeworx, Inc. - * * - * * 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 155cb39e9..000000000 --- a/src/views/email-temp.js +++ /dev/null @@ -1,76 +0,0 @@ -/* - * ******************************************************************************* - * * Copyright (c) 2020 Edgeworx, Inc. - * * - * * 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 a6f893dd9..000000000 --- a/src/views/reset-password-temp.js +++ /dev/null @@ -1,126 +0,0 @@ -/* - * ******************************************************************************* - * * Copyright (c) 2020 Edgeworx, Inc. - * * - * * 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 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 diff --git a/test/application-template-update.yaml b/test/application-template-update.yaml index d4a55b54c..5ae319646 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/v3 metadata: name: 'app-template-from-yaml' spec: diff --git a/test/application-template.yaml b/test/application-template.yaml index 2c2b6ce03..15ac7348d 100644 --- a/test/application-template.yaml +++ b/test/application-template.yaml @@ -1,5 +1,5 @@ kind: ApplicationTemplate -apiVersion: iofog.org/v3 +apiVersion: datasance.com/v3 metadata: name: 'app-template-from-yaml' spec: diff --git a/test/application-test.yaml b/test/application-test.yaml index 7d8bf35ce..ae1f589dd 100644 --- a/test/application-test.yaml +++ b/test/application-test.yaml @@ -1,5 +1,5 @@ kind: Application -apiVersion: iofog.org/v3 +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 2f1b3d3c6..0c7c35b8a 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/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 fae782fa3..2a975f602 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.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}" + "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;" + "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;" + "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", @@ -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" @@ -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", @@ -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", @@ -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", 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)) diff --git a/test/src/template/app.yml b/test/src/template/app.yml index 778dd9699..756d62eeb 100755 --- a/test/src/template/app.yml +++ b/test/src/template/app.yml @@ -1,6 +1,6 @@ --- -apiVersion: iofog.org/v2 +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 8b5dbe9d5..a271b3855 100755 --- a/test/src/template/simple.yml +++ b/test/src/template/simple.yml @@ -1,6 +1,6 @@ --- -apiVersion: iofog.org/v2 +apiVersion: datasance.com/v3 kind: Application metadata: name: edai-smartbuilding-rules-engine