From 03c6218ad16ce421b8b3d5ab8844651da9ccb8da Mon Sep 17 00:00:00 2001 From: Sean Sica <23294618+seansica@users.noreply.github.com> Date: Mon, 24 Oct 2022 10:12:28 -0400 Subject: [PATCH 01/28] re-work Docker image publishing workflow to use semver --- .github/workflows/publish.yml | 37 +++++++++++++++++++++++++++-------- 1 file changed, 29 insertions(+), 8 deletions(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 242ec16..e047378 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -1,7 +1,11 @@ name: publish + on: push: branches: [main, develop] + tags: 'v*' + pull_request: + branches: [main, develop] jobs: publish: @@ -11,13 +15,30 @@ jobs: - name: Check out the repo uses: actions/checkout@v3 - - name: Build the Docker image - run: | - echo $GITHUB_TOKEN | docker login ghcr.io -u mitre-attack --password-stdin - docker build . --tag ghcr.io/mitre-attack/attack-workbench-taxii-server:$TAG - docker push ghcr.io/mitre-attack/attack-workbench-taxii-server:$TAG - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - TAG: ${{ github.ref == 'refs/head/main' && 'latest' || 'develop' }} + - name: Docker meta + id: meta + uses: docker/metadata-action@v4 + with: + images: ghcr.io/mitre-attack/attack-workbench-taxii-server + tags: | + # will be used on a push tag event and requires a valid semver Git tag; https://github.com/docker/metadata-action#typesemver + type=semver,pattern={{version}} + # set latest tag for default branch; https://github.com/docker/metadata-action#latest-tag + type=raw,value=latest,enable={{is_default_branch}} + + - name: Login to GitHub Container Registry + uses: docker/login-action@v2 + if: github.event_name != 'pull_request' + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Build and push + uses: docker/build-push-action@v3 + with: + context: . + push: ${{ github.event_name != 'pull_request' }} + tags: ${{ steps.meta.outputs.tags }} From 2ced32de77f9ac1632b12d0b3907efcfd7cb4755 Mon Sep 17 00:00:00 2001 From: Sean Sica <23294618+seansica@users.noreply.github.com> Date: Mon, 24 Oct 2022 10:37:26 -0400 Subject: [PATCH 02/28] re-work Docker image publishing workflow to use semver --- .github/workflows/publish.yml | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index e047378..8ff711b 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -15,24 +15,25 @@ jobs: - name: Check out the repo uses: actions/checkout@v3 + - name: Login to GitHub Container Registry + uses: docker/login-action@v2 + if: github.event_name != 'pull_request' + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + - name: Docker meta id: meta uses: docker/metadata-action@v4 with: images: ghcr.io/mitre-attack/attack-workbench-taxii-server + # type=semver will be used on a push tag event and requires a valid semver Git tag; https://github.com/docker/metadata-action#typesemver + # type=raw will set latest tag for default branch; https://github.com/docker/metadata-action#latest-tag tags: | - # will be used on a push tag event and requires a valid semver Git tag; https://github.com/docker/metadata-action#typesemver type=semver,pattern={{version}} - # set latest tag for default branch; https://github.com/docker/metadata-action#latest-tag type=raw,value=latest,enable={{is_default_branch}} - - name: Login to GitHub Container Registry - uses: docker/login-action@v2 - if: github.event_name != 'pull_request' - with: - registry: ghcr.io - username: ${{ github.actor }} - password: ${{ secrets.GITHUB_TOKEN }} - name: Build and push uses: docker/build-push-action@v3 From 03022e37c79c82509070cf7e604b3b6ae6c59f29 Mon Sep 17 00:00:00 2001 From: Sean Sica <23294618+seansica@users.noreply.github.com> Date: Mon, 24 Oct 2022 10:45:13 -0400 Subject: [PATCH 03/28] re-work Docker image publishing workflow to use semver --- .github/workflows/publish.yml | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 8ff711b..fd97a87 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -15,14 +15,6 @@ jobs: - name: Check out the repo uses: actions/checkout@v3 - - name: Login to GitHub Container Registry - uses: docker/login-action@v2 - if: github.event_name != 'pull_request' - with: - registry: ghcr.io - username: ${{ github.actor }} - password: ${{ secrets.GITHUB_TOKEN }} - - name: Docker meta id: meta uses: docker/metadata-action@v4 @@ -34,6 +26,19 @@ jobs: type=semver,pattern={{version}} type=raw,value=latest,enable={{is_default_branch}} + - name: Login to GitHub Container Registry + uses: docker/login-action@v2 + if: github.event_name != 'pull_request' + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Set up QEMU + uses: docker/setup-qemu-action@v2 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v2 - name: Build and push uses: docker/build-push-action@v3 @@ -41,5 +46,6 @@ jobs: context: . push: ${{ github.event_name != 'pull_request' }} tags: ${{ steps.meta.outputs.tags }} + labels: ${{ steps.meta.outputs.labels }} From 693ab8b8d8b8f1a151485dd5c50f63002cf18d86 Mon Sep 17 00:00:00 2001 From: Sean Sica <23294618+seansica@users.noreply.github.com> Date: Mon, 24 Oct 2022 10:51:54 -0400 Subject: [PATCH 04/28] re-work Docker image publishing workflow to use semver --- .github/workflows/publish.yml | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index fd97a87..691937a 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -12,6 +12,7 @@ jobs: runs-on: ubuntu-latest name: Publish Docker image to container registry steps: + - name: Check out the repo uses: actions/checkout@v3 @@ -19,12 +20,16 @@ jobs: id: meta uses: docker/metadata-action@v4 with: - images: ghcr.io/mitre-attack/attack-workbench-taxii-server + images: | + name=ghcr.io/mitre-attack/attack-workbench-taxii-server,enable=true + name=mitre-attack/attack-workbench-taxii-server # type=semver will be used on a push tag event and requires a valid semver Git tag; https://github.com/docker/metadata-action#typesemver # type=raw will set latest tag for default branch; https://github.com/docker/metadata-action#latest-tag tags: | type=semver,pattern={{version}} type=raw,value=latest,enable={{is_default_branch}} + type=ref,event=branch + type=ref,event=tag - name: Login to GitHub Container Registry uses: docker/login-action@v2 @@ -34,12 +39,6 @@ jobs: username: ${{ github.actor }} password: ${{ secrets.GITHUB_TOKEN }} - - name: Set up QEMU - uses: docker/setup-qemu-action@v2 - - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v2 - - name: Build and push uses: docker/build-push-action@v3 with: From ffa84baf07f3a84ed83ce9bc1e1d7e97f4d9bbb4 Mon Sep 17 00:00:00 2001 From: Sean Sica <23294618+seansica@users.noreply.github.com> Date: Mon, 24 Oct 2022 11:04:55 -0400 Subject: [PATCH 05/28] re-work Docker image publishing workflow to use semver --- .github/workflows/publish.yml | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 691937a..df5a948 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -20,9 +20,7 @@ jobs: id: meta uses: docker/metadata-action@v4 with: - images: | - name=ghcr.io/mitre-attack/attack-workbench-taxii-server,enable=true - name=mitre-attack/attack-workbench-taxii-server + images: ghcr.io/mitre-attack/attack-workbench-taxii-server # type=semver will be used on a push tag event and requires a valid semver Git tag; https://github.com/docker/metadata-action#typesemver # type=raw will set latest tag for default branch; https://github.com/docker/metadata-action#latest-tag tags: | From 007382dbb68cc8568a1537c908e1e841d0242176 Mon Sep 17 00:00:00 2001 From: Sean Sica <23294618+seansica@users.noreply.github.com> Date: Wed, 16 Nov 2022 13:25:14 -0500 Subject: [PATCH 06/28] update TAXII dotenv template --- config/template.env | 178 +++++++++++++------------------------------- 1 file changed, 52 insertions(+), 126 deletions(-) diff --git a/config/template.env b/config/template.env index 3ed6710..8fb1242 100644 --- a/config/template.env +++ b/config/template.env @@ -1,144 +1,70 @@ -# TAXII 2.1 SERVER - CONFIGURATION PARAMETERS / ENVIRONMENT VARIABLES - -## TAXII_APP_ADDRESS -## Description: Indicates which network interface the server should bind to -## Default value: 0.0.0.0 -TAXII_APP_ADDRESS="0.0.0.0" - -## TAXII_APP_PORT -## Description: Specifies which port the server should listen on -## Default value: 443 -TAXII_APP_PORT=443 - -## TAXII_MAX_CONTENT_LENGTH -## Description: Limits the maximum size of the message body that the server will accept -## Default value: 0 (zero is set because only GET requests are supported at this time, so message bodies are not necessary) +# ********************************************************** +# ***** ENVIRONMENT **************************************** +# ********************************************************** +TAXII_ENV=dev + +# ********************************************************** +# ***** SERVER SETTINGS ************************************ +# ********************************************************** +TAXII_APP_ADDRESS=0.0.0.0 +TAXII_APP_PORT=5002 +TAXII_HTTPS_ENABLED=false +TAXII_SSL_PRIVATE_KEY= +TAXII_SSL_PUBLIC_KEY= +TAXII_CORS_ENABLED=false TAXII_MAX_CONTENT_LENGTH=0 -## TAXII_API_ROOT_PATH -## Description: Prefix for all TAXII 2.1 endpoints (excluding the Discovery endpoint [/taxii2/]) -## Default value: /v2.1/api/ -TAXII_API_ROOT_PATH=/v2.1/api/ - -## TAXII_API_ROOT_TITLE -## Description: A title for the API root (observed on respones to the 'Get API Root Information' endpoint -## Default value: MITRE ATT&CK TAXII 2.1 -TAXII_API_ROOT_TITLE= +# ********************************************************** +# ***** NGINX SSL/TLS CERTIFICATE AUTO REG/RENEW *********** +# ********************************************************** +CERTBOT_LE_FQDN=your.domain.org +CERBOT_LE_EMAIL=your@email.org +CERTBOT_LE_ACME_SERVER=https://acme-v02.api.letsencrypt.org/directory +CERTBOT_LE_RSA_KEY_SIZE=4096 -## TAXII_API_ROOT_DESCRIPTION -## Description: A summary or description of the API root -## Default value: 'This API Root contains TAXII 2.1 REST API endpoints that serve MITRE ATT&CK STIX 2.1 data' -TAXII_API_ROOT_DESCRIPTION= -## TAXII_CONTACT -## Description: The email address which is advertised on responses to the Discovery endpoint (/taxii2/) -## Default value: no-reply@your-company.tld -TAXII_CONTACT="no-reply@your-company.tld" -## TAXII_CACHE_TYPE -## Description: Indicates what type of cache the TAXII server should use. -## Supported values: 'default' or 'memcached' -## Default value: default -TAXII_CACHE_TYPE=default +# ********************************************************** +# ***** CONTACT INFORMATION ******************************** +# ********************************************************** +TAXII_API_ROOT_PATH=api +TAXII_API_ROOT_TITLE=ATT&CK Workbench TAXII 2.1 Server +TAXII_API_ROOT_DESCRIPTION=Provides access to the latest version of ATT&CK data through a TAXII 2.1 compliant REST API +TAXII_CONTACT=your@email.org -## TAXII_CACHE_HOST -## Description: IP or FQDN of the cache host. Supports multiple comma-separated hosts. e.g., a.b.c.d, w.x.y.z -## Default value: localhost -TAXII_CACHE_HOST=localhost -## TAXII_CACHE_PORT -## Description: Port on which cache daemon/service is listening -## Default value: 6379 (the default memcached port) -TAXII_CACHE_PORT=6379 - -## TAXII_CACHE_TTL -## Description: Amount of time a cache entry can idle in cache before removal/expiration. Measured in seconds. -## Default value: 600 (10 minutes) +# ********************************************************** +# ***** CACHE SETTINGS ************************************* +# ********************************************************** +TAXII_CACHE_TYPE=memcached +TAXII_CACHE_HOST=attack-workbench-taxii-cache +TAXII_CACHE_PORT=11211 TAXII_CACHE_TTL=600 - -## TAXII_CACHE_MAX_ITEM_SIZE -## Description: The maximum size (in bytes) per item that can be cached. Analogous to the memcached -I parameter which -## allows you to specify the maximum item size at runtime. It supports a unit postfix to allow for natural expression -## of item size. -## e.g., 52428800 == 50m or 50MB; 10485760 == 10m or 10MB -## Default value: 50m TAXII_CACHE_MAX_ITEM_SIZE=50m - -## TAXII_CACHE_RECONNECT -## Description: Indicates whether the server should continue re-attempting to connect the cache host in the event there is a disconnect -## Default value: true +TAXII_CACHE_MEM_SIZE=4096 TAXII_CACHE_RECONNECT=true -## TAXII_CORS_ENABLED -## Description: Specifies whether CORS should be enabled on the server -## Default value: false -TAXII_CORS_ENABLED=false - -## TAXII_STIX_SRC_URL -## Description: Specifies the address and port on which the Workbench REST API is listening. -## NOTE: This value is only used if TAXII_STIX_DATA_SRC is set to 'workbench' -## Default value: http://localhost:3000 -TAXII_STIX_SRC_URL= -## TAXII_STIX_DATA_SRC -## Description: Indicates how the server will source/injest STIX data. At the moment, only 'workbench' is supported. -## Default value: workbench +# ************************************************************** +# ***** STIX/WORKBENCH SETTINGS ******************************** +# ************************************************************** +TAXII_STIX_SRC_URL=http://attack-workbench-rest-api:3000 TAXII_STIX_DATA_SRC=workbench - -## TAXII_LOG_LEVEL -## Description: Default winston logging level. Conforms to RFC5424 -## Note: from MOST to LEAST important: error, warn, info, http, verbose, debug, silly -## Default value: info -TAXII_LOG_LEVEL=info - -## TAXII_LOG_TO_FILE -## Description: Specifies whether the server should write logs to file (in addition to stdout) -## Default value: false -TAXII_LOG_TO_FILE=false - -## TAXII_HTTPS_ENABLED -## Description: Specifies whether the server should use HTTPS (SSL/TLS) -## Default value: true -TAXII_HTTPS_ENABLED=true - -## TAXII_LOG_TO_HTTP_HOST -## Description: Specifies the address (IP or FQDN) of a log listener. The server will attempt to send logs to this address if a value is set. -## Default value: +TAXII_WORKBENCH_AUTH_HEADER=dGF4aWktc2VydmVyOnNlY3JldC1zcXVpcnJlbA== + +# ************************************************************** +# ***** DATABASE SETTINGS ************************************** +# ************************************************************** +TAXII_MONGO_URI=mongodb://attack-workbench-database/taxii +TAXII_HYDRATE_ON_BOOT=true + +# ********************************************************** +# ***** LOGGING SETTINGS *********************************** +# ********************************************************** +TAXII_LOG_LEVEL=verbose +TAXII_LOG_TO_FILE= TAXII_LOG_TO_HTTP_HOST= - -## TAXII_LOG_TO_HTTP_PORT -## Description: Specifies the port of the log listener. -## Default value: TAXII_LOG_TO_HTTP_PORT= - -## TAXII_LOG_TO_HTTP_PATH -## Description: Specifies the HTTP endpoint of the log listener. -## Default value: TAXII_LOG_TO_HTTP_PATH= - -## TAXII_LOG_TO_SLACK_URL -## Description: Specifies a Slack URL. The server will attempt to send logs to this address if a value is set. -## Default: TAXII_LOG_TO_SLACK_URL= - -## TAXII_LOG_TO_SENTRY_DSN -## Description: Specifies a Sentry Data Source Name (DSN). The server will attempt to send logs to this address if a -## value is set. -## NOTE: You can use the 'encodePem.js' script in the '{project-root}/scripts/' directory to automatically convert PEM -## files to base64 encoded strings. -## Default: TAXII_LOG_TO_SENTRY_DSN= - -## TAXII_SSL_PRIVATE_KEY -## Description: Base64 encoded string containing the SSL/TLS private key. If both this value is set and a valid private -## key exists at '{project-root}/config/private-key.pem', then the base64 encoded key will be used/take presedence. -## NOTE: You can use the 'encodePem.js' script in the '{project-root}/scripts/' directory to automatically convert PEM -## files to base64 encoded strings. -## Default value: -TAXII_SSL_PRIVATE_KEY= - -## TAXII_SSL_PUBlIC_KEY -## Description: Base64 encoded string containing the SSL/TLS public key. If both this value is set and a valid public -## key exists at '{project-root}/config/public-certificate.pem', then the base64 encoded key will be used/take presedence. -## Default value: -TAXII_SSL_PUBLIC_KEY= \ No newline at end of file From 031b7254ad92d73d216a9e7846f7205922084ae5 Mon Sep 17 00:00:00 2001 From: Sean Sica <23294618+seansica@users.noreply.github.com> Date: Fri, 7 Jul 2023 16:25:15 -0400 Subject: [PATCH 07/28] Modify process for publishing Docker images --- .github/workflows/publish.yml | 61 ++++++++++++++++++----------------- 1 file changed, 32 insertions(+), 29 deletions(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index df5a948..af58555 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -1,48 +1,51 @@ -name: publish +name: Build and Publish Docker Image on: push: - branches: [main, develop] - tags: 'v*' - pull_request: - branches: [main, develop] + branches: + - "master" + - "develop" + tags: + - "v*.*.*" jobs: - publish: + docker: runs-on: ubuntu-latest - name: Publish Docker image to container registry steps: - - - name: Check out the repo + - + name: Checkout uses: actions/checkout@v3 - - - name: Docker meta + - + name: Set Docker Image and Tags id: meta uses: docker/metadata-action@v4 with: - images: ghcr.io/mitre-attack/attack-workbench-taxii-server - # type=semver will be used on a push tag event and requires a valid semver Git tag; https://github.com/docker/metadata-action#typesemver - # type=raw will set latest tag for default branch; https://github.com/docker/metadata-action#latest-tag + images: | + ghcr.io/center-for-threat-informed-defense/attack-workbench-frontend tags: | - type=semver,pattern={{version}} - type=raw,value=latest,enable={{is_default_branch}} - type=ref,event=branch - type=ref,event=tag - - - name: Login to GitHub Container Registry - uses: docker/login-action@v2 + # set latest tag for master branch + type=raw,value=latest,enable=${{ github.ref == format('refs/heads/{0}', 'master') }} + # set develop tag for develop branch + type=ref,event=branch,enable=${{ github.ref == format('refs/heads/{0}', 'develop') }} + # set semver tag (vX.Y.Z) on git tag event + type=semver,pattern=v{{major}}.{{minor}}.{{patch}} + # set git short commit as Docker tag (e.g., sha-ad132f5) + type=sha + - + name: Set up Docker Buildx + uses: docker/setup-buildx-action@v2 + - + name: Login to GHCR if: github.event_name != 'pull_request' + uses: docker/login-action@v2 with: registry: ghcr.io - username: ${{ github.actor }} + username: ${{ github.repository_owner }} password: ${{ secrets.GITHUB_TOKEN }} - - - name: Build and push - uses: docker/build-push-action@v3 + - + name: Build and push + uses: docker/build-push-action@v4 with: context: . push: ${{ github.event_name != 'pull_request' }} - tags: ${{ steps.meta.outputs.tags }} - labels: ${{ steps.meta.outputs.labels }} - - + tags: ${{ steps.meta.outputs.tags }} \ No newline at end of file From 921c4b5b9fdeb9d5e64f63e176cc4a423bd0ce10 Mon Sep 17 00:00:00 2001 From: Sean Sica <23294618+seansica@users.noreply.github.com> Date: Fri, 7 Jul 2023 16:26:50 -0400 Subject: [PATCH 08/28] Change target branch ref from master to main --- .github/workflows/publish.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index af58555..080edbf 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -3,7 +3,7 @@ name: Build and Publish Docker Image on: push: branches: - - "master" + - "main" - "develop" tags: - "v*.*.*" @@ -24,7 +24,7 @@ jobs: ghcr.io/center-for-threat-informed-defense/attack-workbench-frontend tags: | # set latest tag for master branch - type=raw,value=latest,enable=${{ github.ref == format('refs/heads/{0}', 'master') }} + type=raw,value=latest,enable=${{ github.ref == format('refs/heads/{0}', 'main') }} # set develop tag for develop branch type=ref,event=branch,enable=${{ github.ref == format('refs/heads/{0}', 'develop') }} # set semver tag (vX.Y.Z) on git tag event From 2444a6abeb3973008f13cc42ab5902b04007791b Mon Sep 17 00:00:00 2001 From: Sean Sica <23294618+seansica@users.noreply.github.com> Date: Fri, 7 Jul 2023 16:30:31 -0400 Subject: [PATCH 09/28] Change org from ctid to mitre-attack in the Docker image name --- .github/workflows/publish.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 080edbf..d3b4edf 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -21,7 +21,7 @@ jobs: uses: docker/metadata-action@v4 with: images: | - ghcr.io/center-for-threat-informed-defense/attack-workbench-frontend + ghcr.io/mitre-attack/attack-workbench-frontend tags: | # set latest tag for master branch type=raw,value=latest,enable=${{ github.ref == format('refs/heads/{0}', 'main') }} From 8ad8ac34df1bd823b970d4f9abbabc21b67286dc Mon Sep 17 00:00:00 2001 From: Sean Sica <23294618+seansica@users.noreply.github.com> Date: Fri, 7 Jul 2023 16:34:24 -0400 Subject: [PATCH 10/28] Fix docker image name --- .github/workflows/publish.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index d3b4edf..1e992cd 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -21,7 +21,7 @@ jobs: uses: docker/metadata-action@v4 with: images: | - ghcr.io/mitre-attack/attack-workbench-frontend + ghcr.io/mitre-attack/attack-workbench-taxii-server tags: | # set latest tag for master branch type=raw,value=latest,enable=${{ github.ref == format('refs/heads/{0}', 'main') }} From 53aa4574988739d0b69b86bdf1973a228c383f2d Mon Sep 17 00:00:00 2001 From: Sean Sica <23294618+seansica@users.noreply.github.com> Date: Mon, 10 Jul 2023 16:47:38 -0400 Subject: [PATCH 11/28] update docker-build.sh to load dotenv file before execution --- scripts/docker-build.sh | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/scripts/docker-build.sh b/scripts/docker-build.sh index 3738e9b..11dfb9a 100755 --- a/scripts/docker-build.sh +++ b/scripts/docker-build.sh @@ -2,6 +2,14 @@ cd .. +TAXII_ENV=dev + +# Load environment variables from dotenv file +# The set -a command means that any variable or function that is defined or changed in the .env file will be exported. This means these variables will be available to any child processes spawned from the script. The set +a command then turns off the automatic export of variables, preventing variables defined later in the script from being automatically exported. +set -a +source config/${TAXII_ENV}.env +set +a + docker build \ --no-cache \ --build-arg TAXII_ENV="${TAXII_ENV}" \ From 37afd401464966c1e1d2ca74d82e554b921a988c Mon Sep 17 00:00:00 2001 From: Sean Sica <23294618+seansica@users.noreply.github.com> Date: Mon, 10 Jul 2023 16:54:33 -0400 Subject: [PATCH 12/28] Remove cache module --- config/template.env | 12 -- docs/USAGE.md | 40 ----- src/app.module.ts | 3 - src/cache/constants.ts | 4 - .../cache-module-options.interface.ts | 26 ---- src/cache/taxii-cache.module.ts | 46 ------ src/cache/taxii-cache.service.ts | 56 ------- src/config/configuration.ts | 40 ----- src/config/defaults.ts | 9 -- .../taxii-config.service.interface.ts | 7 - src/config/taxii-config.service.ts | 76 +-------- .../interfaces/collector-connect.options.ts | 2 - src/hydrate/hydrate.module.ts | 3 - .../app-module-options.interface.ts | 5 - .../workbench-connect-options.interface.ts | 3 - .../workbench/workbench.repository.ts | 144 +----------------- 16 files changed, 7 insertions(+), 469 deletions(-) delete mode 100644 src/cache/constants.ts delete mode 100644 src/cache/interfaces/cache-module-options.interface.ts delete mode 100644 src/cache/taxii-cache.module.ts delete mode 100644 src/cache/taxii-cache.service.ts diff --git a/config/template.env b/config/template.env index 8fb1242..0402f9a 100644 --- a/config/template.env +++ b/config/template.env @@ -33,18 +33,6 @@ TAXII_API_ROOT_DESCRIPTION=Provides access to the latest version of ATT&CK data TAXII_CONTACT=your@email.org -# ********************************************************** -# ***** CACHE SETTINGS ************************************* -# ********************************************************** -TAXII_CACHE_TYPE=memcached -TAXII_CACHE_HOST=attack-workbench-taxii-cache -TAXII_CACHE_PORT=11211 -TAXII_CACHE_TTL=600 -TAXII_CACHE_MAX_ITEM_SIZE=50m -TAXII_CACHE_MEM_SIZE=4096 -TAXII_CACHE_RECONNECT=true - - # ************************************************************** # ***** STIX/WORKBENCH SETTINGS ******************************** # ************************************************************** diff --git a/docs/USAGE.md b/docs/USAGE.md index 3b59c4a..c48d588 100644 --- a/docs/USAGE.md +++ b/docs/USAGE.md @@ -44,14 +44,6 @@ At present, the following environment variables are supported: | `TAXII_API_ROOT_TITLE` | str | MITRE ATT&CK TAXII 2.1 | A title for the API root (observed on responses to the 'Get API Root Information' endpoint) | | `TAXII_API_ROOT_DESCRIPTION` | str | This API Root contains TAXII 2.1 REST API endpoints that serve MITRE ATT&CK STIX 2.1 data | A summary or description of the API root | | `TAXII_CONTACT_EMAIL` | str | no-reply@your-company.tld | The email address which is advertised on responses to the Discovery endpoint (/taxii2/) | -| `TAXII_CACHE_TYPE` | str | default | Specifies what type of cache the TAXII server should use; Supported values: 'default' or 'memcached' | -| `TAXII_CACHE_HOST` | str | localhost | IP or FQDN of the cache host. Supports multiple comma-separated hosts. e.g., a.b.c.d, w.x.y.z | -| `TAXII_CACHE_PORT` | int | 6379 | Port on which cache daemon/service is listening | -| `TAXII_CACHE_TTL` | int | 600 | Amount of time a cache entry can idle in cache before removal/expiration. Measured in seconds. | -| `TAXII_CACHE_MAX_ITEM_SIZE` | int | 50m | The maximum size (in bytes) per item that can be cached. Analogous to the memcached `-I` parameter which allows you to specify the maximum item size at runtime. It supports a unit postfix to allow for natural expression of item size. | -| `TAXII_CACHE_NET_TIMEOUT` | int | 6000 | Specifies how long the TAXII server will wait for responses from Memcached. Measured in ms. | -| `TAXII_CACHE_RECONNECT` | bool | true | Specifies whether the server should continue re-attempting to connect the cache host in the event there is a disconnect | -| `TAXII_CACHE_MEM_SIZE` | int | 4096 | Sets the amount of memory allocated to memcached for object storage. ONLY USED BY MEMCACHED. | | `TAXII_CORS_ENABLED` | bool | false | Specifies whether CORS should be enabled on the server | | `TAXII_STIX_SRC_URL` | str | http://localhost:3000 | Specifies the address and port on which the Workbench REST API is listening. | | `TAXII_STIX_DATA_SRC` | str | workbench | Specifies how the server will source/ingest STIX data. At the moment, only 'workbench' is supported. | @@ -283,38 +275,6 @@ to send logs to Sentry. Please note that logging to Sentry has not been fully tested. This feature is provided as is. -## Caching -The TAXII server provides a dynamic cache provider that supports two types of caches: -1. An [in-memory cache](https://docs.nestjs.com/techniques/caching) (default) -2. [Memcached](https://memcached.org/) - -Caching is used by the `WorkbenchModule` to store responses from the Workbench REST API. - -### Memcached - -The TAXII server can be configured to use Memcached by setting environment variable `TAXII_CACHE_TYPE` to `memcached`. - -```shell -$ export TAXII_CACHE_TYPE=memcached -``` - -While external cache implementations are outside the scope of the TAXII server, a containerized instance of `memcached` -can easily be spun-up by using the Docker Compose template located in the [attack-workbench-deployment](https://github.com/mitre-attack/attack-workbench-deployment) -repository. - -The following configuration parameters can be set via environment variables when `memcached` is enabled: -- `TAXII_CACHE_HOST`: The IP address or FQDN of the Memcached server -- `TAXII_CACHE_PORT`: The port on which the Memcached server is listening -- `TAXII_CACHE_TTL`: The duration of time that an item should remain in the cache before removal -- `TAXII_CACHE_MAX_ITEM_SIZE`: The maximum size of each item allowed in the cache. This value also sets the corresponding server-side setting (i.e., Maps to the `memcached -I` flag.) -- `TAXII_CACHE_MEM_SIZE`: Sets the amount of memory allocated to memcached for object storage. (e.g., Maps to the `memcached -m` flag.) This setting only applies to the Memcached server; not the TAXII app! - -Note that the TAXII application can only map to one instance of Memcached. Multiple Memcached servers cannot be used. - -The following configuration parameters can be set via environment variables when the in-memory (`default`) cache is enabled: -- `TAXII_CACHE_TTL`: The duration of time that an item should remain in the cache before removal - - ## Scripts `package.json` contains a number of scripts that can be used to perform recurring tasks. diff --git a/src/app.module.ts b/src/app.module.ts index b32d6ba..391c148 100644 --- a/src/app.module.ts +++ b/src/app.module.ts @@ -6,7 +6,6 @@ import { } from "./common/middleware/request-context"; import { TaxiiModule } from "./taxii/taxii.module"; import { StixModule } from "./stix/stix.module"; -import { TaxiiCacheModule } from "./cache/taxii-cache.module"; import { AppConnectOptions } from "./interfaces"; import { MongooseModule } from "@nestjs/mongoose"; @@ -32,8 +31,6 @@ export class AppModule { MongooseModule.forRoot(connectOptions.databaseConnectOptions.mongoUri), - TaxiiCacheModule.forRoot(connectOptions.cacheConnectOptions), - /** This is where all user-configurable parameters are defined **/ TaxiiConfigModule, diff --git a/src/cache/constants.ts b/src/cache/constants.ts deleted file mode 100644 index e86718a..0000000 --- a/src/cache/constants.ts +++ /dev/null @@ -1,4 +0,0 @@ -export enum CACHE_OPTIONS { - DEFAULT = "default", - MEMCACHED = "memcached", -} diff --git a/src/cache/interfaces/cache-module-options.interface.ts b/src/cache/interfaces/cache-module-options.interface.ts deleted file mode 100644 index 690cc83..0000000 --- a/src/cache/interfaces/cache-module-options.interface.ts +++ /dev/null @@ -1,26 +0,0 @@ -export interface CacheConnectOptions { - type?: string; - - /** - * One IP address or FQDN string that Memcached is listening on - */ - host?: string; - /** - * The duration of time that an item should remain in the cache before being removed - */ - ttl?: number; - /** - * The maximum size of each item allowed in the cache. This value should match the corresponding server-side setting - */ - maxValueSize?: number; - /** - * Whether or not the cache client should automatically attempt to reconnect to the cache service in the event of - * a disconnection - */ - reconnect?: boolean; - - /** - * The maximum time (ms) that the cache client will await a response from the memcached server - */ - netTimeout?: number; -} diff --git a/src/cache/taxii-cache.module.ts b/src/cache/taxii-cache.module.ts deleted file mode 100644 index 95b1a17..0000000 --- a/src/cache/taxii-cache.module.ts +++ /dev/null @@ -1,46 +0,0 @@ -import { CacheModule, DynamicModule, Global, Module } from "@nestjs/common"; -import { CACHE_OPTIONS } from "./constants"; - -// ** memcached dependencies ** // -import * as Memcache from "memcache-plus"; -import * as memcachedStore from "cache-manager-memcached-store"; - -// ** interfaces ** // -import { CacheConnectOptions } from "./interfaces/cache-module-options.interface"; - -@Global() -@Module({}) -export class TaxiiCacheModule { - public static forRoot(connectOptions: CacheConnectOptions): DynamicModule { - return TaxiiCacheModule.createCacheProviders(connectOptions); - } - - private static createCacheProviders( - options: CacheConnectOptions - ): DynamicModule { - switch (options.type) { - case CACHE_OPTIONS.MEMCACHED: { - return CacheModule.register({ - isGlobal: true, - store: memcachedStore, - driver: Memcache, - // http://memcache-plus.com/initialization.html - see options - options: { - hosts: [options.host], // the address of the memcached server - maxValueSize: options.maxValueSize, // the maximum size of a given cache entry - reconnect: options.reconnect, // whether the client should attempt to reconnect if there is a disconnect - netTimeout: options.netTimeout, // the amount of time (ms) the client will wait for a response - }, - ttl: options.ttl, - }); - } - - default: { - return CacheModule.register({ - isGlobal: true, - ttl: options.ttl, - }); - } - } - } -} diff --git a/src/cache/taxii-cache.service.ts b/src/cache/taxii-cache.service.ts deleted file mode 100644 index 97a1bff..0000000 --- a/src/cache/taxii-cache.service.ts +++ /dev/null @@ -1,56 +0,0 @@ -import { CACHE_OPTIONS } from "./constants"; -import { CacheModule, DynamicModule, Injectable } from "@nestjs/common"; -import { Cache } from "cache-manager"; - -// ** memcached dependencies ** // -import * as Memcache from "memcache-plus"; -import * as memcachedStore from "cache-manager-memcached-store"; - -@Injectable() -export class TaxiiCacheService { - private readonly _cache: Cache; - - constructor(private _cacheConnectOptions) {} - - async connect(): Promise { - return this._cache - ? this._cache - : await this.initialize(this._cacheConnectOptions); - } - - public async initialize(cacheConnectOptions) { - switch (cacheConnectOptions) { - case CACHE_OPTIONS.MEMCACHED: { - return TaxiiCacheService.useMemcachedCache(cacheConnectOptions); - } - - default: - return TaxiiCacheService.useDefaultCache(cacheConnectOptions); - } - } - - private static async useDefaultCache(connectOptions): Promise { - return CacheModule.register({ - isGlobal: true, - ttl: connectOptions.ttl, - }); - } - - private static async useMemcachedCache( - connectOptions - ): Promise { - return CacheModule.register({ - isGlobal: true, - store: memcachedStore, - driver: Memcache, - // http://memcache-plus.com/initialization.html - see options - options: { - hosts: [connectOptions.host], - maxValueSize: connectOptions.maxValueSize, // 52428800 == 50m or 50MB - // 10485760 == 10m or 10MB - reconnect: true, - }, - ttl: connectOptions.ttl, - }); - } -} diff --git a/src/config/configuration.ts b/src/config/configuration.ts index 3954a03..a94c8ac 100644 --- a/src/config/configuration.ts +++ b/src/config/configuration.ts @@ -1,7 +1,6 @@ import { registerAs } from "@nestjs/config"; import * as Joi from "@hapi/joi"; import * as DEFAULTS from "./defaults"; -import { CACHE_OPTIONS } from "../cache/constants"; export const configuration = registerAs("app", () => ({ env: process.env.TAXII_ENV || DEFAULTS.DEFAULT_ENV, @@ -12,13 +11,6 @@ export const configuration = registerAs("app", () => ({ apiRootTitle: process.env.TAXII_API_ROOT_TITLE || DEFAULTS.DEFAULT_API_ROOT_TITLE, apiRootDescription: process.env.TAXII_API_ROOT_DESCRIPTION || DEFAULTS.DEFAULT_API_ROOT_DESCRIPTION, contactEmail: process.env.TAXII_CONTACT_EMAIL || DEFAULTS.DEFAULT_CONTACT_EMAIL, - cacheType: process.env.TAXII_CACHE_TYPE || DEFAULTS.DEFAULT_CACHE_TYPE, - cacheHost: process.env.TAXII_CACHE_HOST || DEFAULTS.DEFAULT_CACHE_HOST, - cachePort: process.env.TAXII_CACHE_PORT || DEFAULTS.DEFAULT_CACHE_PORT, - cacheTimeToLive: process.env.TAXII_CACHE_TTL || DEFAULTS.DEFAULT_CACHE_TTL, - cacheMaxValueSize: process.env.TAXII_CACHE_MAX_ITEM_SIZE || DEFAULTS.DEFAULT_CACHE_MAX_ITEM_SIZE, - cacheReconnect: process.env.TAXII_CACHE_RECONNECT || DEFAULTS.DEFAULT_CACHE_RECONNECT, - cacheNetTimeout: process.env.TAXII_CACHE_NET_TIMEOUT || DEFAULTS.DEFAULT_CACHE_NET_TIMEOUT, workbenchRestApiUrl: process.env.TAXII_STIX_SRC_URL || DEFAULTS.DEFAULT_WORKBENCH_REST_API_URL, workbenchAuthHeader: process.env.TAXII_WORKBENCH_AUTH_HEADER || DEFAULTS.DEFAULT_WORKBENCH_AUTH_HEADER, logLevel: process.env.TAXII_LOG_LEVEL || DEFAULTS.DEFAULT_LOG_LEVEL, @@ -72,38 +64,6 @@ export const validationSchema = Joi.object({ .email() .default(DEFAULTS.DEFAULT_CONTACT_EMAIL), - CACHE_TYPE: Joi - .string() - .valid(CACHE_OPTIONS) - .default(DEFAULTS.DEFAULT_CACHE_TYPE), - - CACHE_HOST: Joi - .string() - .default(DEFAULTS.DEFAULT_CACHE_HOST), - - CACHE_PORT: Joi - .number() - .min(1) - .max(65535) - .default(DEFAULTS.DEFAULT_CACHE_PORT), - - CACHE_TTL: Joi - .number() - .default(DEFAULTS.DEFAULT_CACHE_TTL), - - CACHE_MAX_SIZE: Joi - .number() - .min(1048576) - .default(DEFAULTS.DEFAULT_CACHE_MAX_ITEM_SIZE), - - CACHE_RECONNECT: Joi - .boolean() - .default(DEFAULTS.DEFAULT_CACHE_RECONNECT), - - CACHE_NET_TIMEOUT: Joi - .number() - .default(DEFAULTS.DEFAULT_CACHE_NET_TIMEOUT), - CORS_ENABLED: Joi .boolean() .default(DEFAULTS.DEFAULT_CORS_ENABLED), diff --git a/src/config/defaults.ts b/src/config/defaults.ts index 78742bc..483970e 100644 --- a/src/config/defaults.ts +++ b/src/config/defaults.ts @@ -1,5 +1,3 @@ -import { CACHE_OPTIONS } from "../cache/constants"; - export const DEFAULT_ENV = "dev"; export const DEFAULT_APP_ADDRESS = "0.0.0.0"; export const DEFAULT_APP_PORT = 5000; @@ -9,13 +7,6 @@ export const DEFAULT_API_ROOT_TITLE = "MITRE ATT&CK TAXII 2.1"; export const DEFAULT_API_ROOT_DESCRIPTION = "This API Root contains TAXII 2.1 REST API endpoints that serve MITRE ATT&CK STIX 2.1 data"; export const DEFAULT_CONTACT_EMAIL = "no-reply@your-company.tld"; -export const DEFAULT_CACHE_TYPE = CACHE_OPTIONS.DEFAULT; -export const DEFAULT_CACHE_HOST = "localhost"; -export const DEFAULT_CACHE_PORT = 6379; -export const DEFAULT_CACHE_TTL = 600; // measured in seconds, 600s => 10min -export const DEFAULT_CACHE_MAX_ITEM_SIZE = "50m"; // approx. 10x size of entire Enterprise ATT&CK collection paginated by 100 -export const DEFAULT_CACHE_RECONNECT = true; -export const DEFAULT_CACHE_NET_TIMEOUT = 6000; // measured in ms export const DEFAULT_CORS_ENABLED = false; export const DEFAULT_WORKBENCH_REST_API_URL = "http://localhost:3000"; export const DEFAULT_WORKBENCH_AUTH_HEADER = diff --git a/src/config/interfaces/taxii-config.service.interface.ts b/src/config/interfaces/taxii-config.service.interface.ts index a2a44b1..ab01693 100644 --- a/src/config/interfaces/taxii-config.service.interface.ts +++ b/src/config/interfaces/taxii-config.service.interface.ts @@ -2,7 +2,6 @@ export interface TaxiiConfigServiceInterface { createAppConnectOptions(); createCollectorConnectOptions(); createDatabaseConnectOptions(); - createCacheConnectOptions(); createStixConnectOptions(); get APP_ADDRESS(); get APP_PORT(); @@ -11,12 +10,6 @@ export interface TaxiiConfigServiceInterface { get API_ROOT_TITLE(); get API_ROOT_DESCRIPTION(); get CONTACT_EMAIL(); - get CACHE_TYPE(); - get CACHE_HOST(); - get CACHE_PORT(); - get CACHE_TTL(); - get CACHE_MAX_SIZE(); - get CACHE_RECONNECT(); get CORS_ENABLED(); get WORKBENCH_REST_API_URL(); get WORKBENCH_AUTH_HEADER(); diff --git a/src/config/taxii-config.service.ts b/src/config/taxii-config.service.ts index 4ece40d..6dffea8 100644 --- a/src/config/taxii-config.service.ts +++ b/src/config/taxii-config.service.ts @@ -1,9 +1,7 @@ import { Injectable, LogLevel } from "@nestjs/common"; import { ConfigService } from "@nestjs/config"; import * as fs from "fs"; -import { CACHE_OPTIONS } from "../cache/constants"; import { TaxiiConfigServiceInterface } from "./interfaces/taxii-config.service.interface"; -import { CacheConnectOptions } from "../cache/interfaces/cache-module-options.interface"; import { StixConnectOptions } from "../stix/interfaces"; import { isDefined } from "class-validator"; import { AppConnectOptions } from "../interfaces"; @@ -22,7 +20,6 @@ export class TaxiiConfigService implements TaxiiConfigServiceInterface { return { databaseConnectOptions: this.createDatabaseConnectOptions(), stixConnectOptions: this.createStixConnectOptions(), - cacheConnectOptions: this.createCacheConnectOptions(), }; } @@ -39,58 +36,11 @@ export class TaxiiConfigService implements TaxiiConfigServiceInterface { }; } - createCacheConnectOptions(): CacheConnectOptions { - const cacheType = this.configService.get("app.cacheType"); - switch (cacheType) { - // ** MEMCACHED OPTIONS ** // - case CACHE_OPTIONS.MEMCACHED: { - // const cacheHost = this.configService.get("app.cacheHost"); - // const maxValueSize: number = this.configService.get( - // "app.cacheMaxValueSize" - // ); - // const ttl: number = this.configService.get( - // "app.cacheTimeToLive" - // ); - // const reconnect: boolean = - // this.configService.get("app.cacheReconnect"); - const cacheServer = `${this.configService.get( - "app.cacheHost" - )}:${this.configService.get("app.cachePort")}`; - return { - type: cacheType, - host: cacheServer, - ttl: this.configService.get("app.cacheTimeToLive"), - maxValueSize: this.configService.get("app.cacheMaxValueSize"), - reconnect: this.configService.get("app.cacheReconnect"), - netTimeout: Number( - this.configService.get("app.cacheNetTimeout") - ), - }; - } - // ** DEFAULT CACHE OPTIONS ** // - case CACHE_OPTIONS.DEFAULT: { - // const ttl: number = this.configService.get("app.cacheTtl"); - return { - type: cacheType, - ttl: this.configService.get("app.cacheTtl"), - }; - } - // ** DEFAULT CACHE OPTIONS ** // - default: { - // const ttl: number = this.configService.get("app.cacheTtl"); - return { - ttl: this.configService.get("app.cacheTtl"), - }; - } - } - } - createStixConnectOptions(): StixConnectOptions { return { workbench: { baseUrl: this.WORKBENCH_REST_API_URL, - authorization: this.WORKBENCH_AUTH_HEADER, - cacheTtl: this.CACHE_TTL, + authorization: this.WORKBENCH_AUTH_HEADER }, }; } @@ -123,30 +73,6 @@ export class TaxiiConfigService implements TaxiiConfigServiceInterface { return this.configService.get("app.contact"); } - get CACHE_TYPE(): string { - return this.configService.get("app.cacheType"); - } - - get CACHE_HOST(): string { - return this.configService.get("app.cacheHost"); - } - - get CACHE_PORT(): number { - return this.configService.get("app.cachePort"); - } - - get CACHE_TTL(): number { - return this.configService.get("app.cacheTimeToLive"); - } - - get CACHE_MAX_SIZE(): number { - return this.configService.get("app.cacheMaxValueSize"); - } - - get CACHE_RECONNECT(): boolean { - return this.configService.get("app.cacheReconnect") === "true"; - } - get CORS_ENABLED(): boolean { return this.configService.get("app.corsEnabled") === "true"; } diff --git a/src/hydrate/collector/interfaces/collector-connect.options.ts b/src/hydrate/collector/interfaces/collector-connect.options.ts index 7aa89a6..505aae2 100644 --- a/src/hydrate/collector/interfaces/collector-connect.options.ts +++ b/src/hydrate/collector/interfaces/collector-connect.options.ts @@ -1,10 +1,8 @@ import { StixConnectOptions } from "src/stix/interfaces"; -import { CacheConnectOptions } from "src/cache/interfaces/cache-module-options.interface"; import { DatabaseConnectOptions } from "src/interfaces/database-connect-options.interface"; export interface CollectorConnectOptions { hydrateOnBoot: boolean; databaseConnectOptions: DatabaseConnectOptions; stixConnectOptions: StixConnectOptions; - cacheConnectOptions: CacheConnectOptions; } diff --git a/src/hydrate/hydrate.module.ts b/src/hydrate/hydrate.module.ts index 8e784e5..4aa9816 100644 --- a/src/hydrate/hydrate.module.ts +++ b/src/hydrate/hydrate.module.ts @@ -5,7 +5,6 @@ import { CollectorModule } from "./collector/collector.module"; import { CollectorConnectOptions } from "./collector/interfaces/collector-connect.options"; import { HydrateService } from "./hydrate.service"; import { StixModule } from "../stix/stix.module"; -import { TaxiiCacheModule } from "../cache/taxii-cache.module"; @Global() @Module({}) @@ -14,8 +13,6 @@ export class HydrateModule { return { module: HydrateModule, imports: [ - TaxiiCacheModule.forRoot(options.cacheConnectOptions), - ScheduleModule.forRoot(), MongooseModule.forRoot(options.databaseConnectOptions.mongoUri), diff --git a/src/interfaces/app-module-options.interface.ts b/src/interfaces/app-module-options.interface.ts index 2c9fd11..6955182 100644 --- a/src/interfaces/app-module-options.interface.ts +++ b/src/interfaces/app-module-options.interface.ts @@ -1,5 +1,4 @@ import { StixConnectOptions } from "../stix/interfaces"; -import { CacheConnectOptions } from "../cache/interfaces/cache-module-options.interface"; import { DatabaseConnectOptions } from "./database-connect-options.interface"; export interface AppConnectOptions { @@ -7,10 +6,6 @@ export interface AppConnectOptions { * The properties required to dynamically instantiate a StixModule */ stixConnectOptions: StixConnectOptions; - /** - * The properties required to dynamically instantiate a TaxiiCacheModule - */ - cacheConnectOptions: CacheConnectOptions; /** * The properties required to dynamically connect to the target MongoDB instance */ diff --git a/src/stix/interfaces/workbench-connect-options.interface.ts b/src/stix/interfaces/workbench-connect-options.interface.ts index f777a7b..417fe42 100644 --- a/src/stix/interfaces/workbench-connect-options.interface.ts +++ b/src/stix/interfaces/workbench-connect-options.interface.ts @@ -3,7 +3,4 @@ export interface WorkbenchConnectOptionsInterface { // A base-64 encoded Basic Authorization header for authenticating to the Workbench REST API authorization?: string; - - // The expiration time for each entry in the cache - cacheTtl: number; } diff --git a/src/stix/providers/workbench/workbench.repository.ts b/src/stix/providers/workbench/workbench.repository.ts index 2c88690..361be9f 100644 --- a/src/stix/providers/workbench/workbench.repository.ts +++ b/src/stix/providers/workbench/workbench.repository.ts @@ -1,5 +1,4 @@ import { - CACHE_MANAGER, ConsoleLogger, Inject, Injectable, @@ -11,7 +10,6 @@ import { TaxiiNotFoundException, TaxiiServiceUnavailableException, } from "src/common/exceptions"; -import { Cache } from "cache-manager"; import { WorkbenchCollectionDto } from "src/stix/dto/workbench-collection.dto"; import { plainToClass, plainToInstance } from "class-transformer"; import { WorkbenchCollectionBundleDto } from "src/stix/dto/workbench-collection-bundle.dto"; @@ -23,80 +21,13 @@ import { WORKBENCH_OPTIONS } from "src/stix/constants"; @Injectable() export class WorkbenchRepository { private readonly baseUrl: string; - private readonly cacheTtl: number; constructor( private readonly httpService: HttpService, private readonly logger: ConsoleLogger, - @Inject(WORKBENCH_OPTIONS) - private readonly options: WorkbenchConnectOptionsInterface, - @Inject(CACHE_MANAGER) private readonly cacheManager: Cache + @Inject(WORKBENCH_OPTIONS) private readonly options: WorkbenchConnectOptionsInterface, ) { this.baseUrl = options.baseUrl; - this.cacheTtl = options.cacheTtl; - } - - /** - * Utility function to cache Workbench responses - * @param url Keys will always be the full Workbench REST API endpoint (URL) that generated the response - * @param item The entire HTTP response retrieved from the connected Workbench REST API - * @private - */ - private async addToCache(url: string, item: any): Promise { - const cacheKey = this.generateKeyFromUrl(url); - this.logger.debug(`Writing STIX data at cache index: '${cacheKey}'.`); - - try { - return await this.cacheManager.set(cacheKey, item, { - ttl: this.cacheTtl, - }); - } catch (e) { - this.logger.error( - `An error occurred while writing STIX data to cache index '${cacheKey}'.` - ); - this.logger.error(e.message); - this.logger.error(e.stack); - throw e; - } - } - - private generateKeyFromUrl(url: string): string { - return url.slice(this.baseUrl.length); - } - - /** - * Utility function to retrieve cached responses from the cache - * @param url Index by which cached responses are retrieved. Keys will always be the full Workbench REST API - * endpoint (URL) that generated the response - * @private - */ - private async getFromCache(url: string): Promise { - const cacheKey = this.generateKeyFromUrl(url); - - this.logger.debug(`Requesting STIX data from cache index '${cacheKey}'.`); - let cacheResponse; - try { - // get the STIX data from the cache - cacheResponse = await this.cacheManager.get(cacheKey); - } catch (e) { - // an error occurred while attempting to read from the cache - this.logger.debug( - `An error occurred while retrieving data from cache at index '${cacheKey}'.` - ); - this.logger.error(e.message); - this.logger.error(e.stack); - throw e; - } - // cache read operation succeeded! - if (cacheResponse) { - this.logger.debug( - `Cache hit at index '${cacheKey}'. Returning cached STIX data.` - ); - return cacheResponse; - } - this.logger.debug( - `Cache miss at index '${cacheKey}'. Returning cached STIX data.` - ); } /** @@ -189,13 +120,8 @@ export class WorkbenchRepository { excludeExtraneousValues = true ): Promise { const url = `${this.baseUrl}/api/attack-objects?versions=all`; - let response: Array; - response = await this.getFromCache(url); // TODO deserialize first i.e., run the WB response through plainToInstance - if (response) { - return response; - } // Get all STIX objects from Workbench. The expected response body contains an array of STIX objects. - response = await this.fetchHttp(url); + const response: Array = await this.fetchHttp(url); // Deserialize the response, i.e., convert the response array of JSON objects to an array of // WorkbenchStixObjectDto instances const allStixObjects = []; @@ -218,13 +144,6 @@ export class WorkbenchRepository { }) ); }); - // Cache the response by URL then return - try { - await this.addToCache(url, allStixObjects); - } catch (e) { - this.logger.error("Failed to cache ATT&CK objects"); - this.logger.error(e.message); - } return allStixObjects; } @@ -240,13 +159,8 @@ export class WorkbenchRepository { url += collectionId; } - // Fetch the data from either the cache (in the case of a cache hit) or Workbench (cache miss) - let response: AttackObjectDto[]; - response = await this.getFromCache(url); - if (response) { - return response; - } - response = await this.fetchHttp(url); + // Fetch the data from Workbench + const response: AttackObjectDto[] = await this.fetchHttp(url); // Deserialize the response data into Array const collections: WorkbenchCollectionDto[] = []; @@ -256,13 +170,11 @@ export class WorkbenchRepository { * StixCollectionsDto (plural) object. */ response.forEach((collection) => { - // const wbCollection = new WorkbenchCollectionDto(collection); const wbCollection = plainToClass(WorkbenchCollectionDto, collection, { excludeExtraneousValues: true, }); collections.push(wbCollection); }); - await this.addToCache(url, collections); return collections; } @@ -275,36 +187,8 @@ export class WorkbenchRepository { ): Promise { const url = `${this.baseUrl}/api/collection-bundles?collectionId=${collectionId}`; - // Fetch the data from either the cache (in the case of a cache hit) or Workbench (cache miss) - let response: WorkbenchCollectionBundleDto; - - try { - response = await this.getFromCache(url); - - if (response) { - // cache hit - return the cached data - return response; - } else { - // cache miss - get the data from workbench - response = await this.fetchHttp(url); - } - } catch (e) { - // cache malfunction - fallback to getting the data from workbench - response = await this.fetchHttp(url); - } - - // return this.getFromCache(url) - // .then(async (response) => { - // if (response) { - // return this.doTheRest(response, url); - // } else { - // response = await this.fetchHttp(url); - // return this.doTheRest(response, url); - // } - // }) - // .catch((err) => { - // throw err; - // }); + // Fetch the data from Workbench + const response: WorkbenchCollectionBundleDto = await this.fetchHttp(url); this.logger.debug(`Retrieved STIX data! Data will be deserialized.`); @@ -315,25 +199,9 @@ export class WorkbenchRepository { { excludeExtraneousValues: true } ); - // Cache the response by URL then return - await this.addToCache(url, collectionBundle); return collectionBundle; } - // async doTheRest(response, url): Promise { - // this.logger.debug(`Retrieved STIX data! Data will be deserialized.`); - // - // // Deserialize the response body - // const collectionBundle: WorkbenchCollectionBundleDto = plainToInstance( - // WorkbenchCollectionBundleDto, - // response, - // { excludeExtraneousValues: true } - // ); - // - // // Cache the response by URL then return - // await this.addToCache(url, collectionBundle); - // return collectionBundle; - // } /** * Retrieves a single STIX object. Optionally supports retrieving multiple versions of the STIX object. From d6bdfc3104d8f8c823de9d27561d388223ecca2e Mon Sep 17 00:00:00 2001 From: Sean Sica <23294618+seansica@users.noreply.github.com> Date: Mon, 10 Jul 2023 16:54:52 -0400 Subject: [PATCH 13/28] Formatting --- .../collector/providers/collection-collector.service.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/hydrate/collector/providers/collection-collector.service.ts b/src/hydrate/collector/providers/collection-collector.service.ts index f37c327..4c0e541 100644 --- a/src/hydrate/collector/providers/collection-collector.service.ts +++ b/src/hydrate/collector/providers/collection-collector.service.ts @@ -22,8 +22,7 @@ export class CollectionCollectorService { constructor( @Inject(STIX_REPO_TOKEN) private stixRepo: StixRepositoryInterface, - @InjectModel(TaxiiCollection.name) - private collectionModel: Model + @InjectModel(TaxiiCollection.name) private collectionModel: Model ) {} @Cron(CronExpression.EVERY_30_MINUTES, { From 281e2d059879388e24a3d7e9c9c27005db3e8a08 Mon Sep 17 00:00:00 2001 From: Sean Sica <23294618+seansica@users.noreply.github.com> Date: Mon, 10 Jul 2023 16:55:15 -0400 Subject: [PATCH 14/28] Disable strict mode in AttackObject schema --- src/hydrate/collector/schema/attack-object.schema.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/hydrate/collector/schema/attack-object.schema.ts b/src/hydrate/collector/schema/attack-object.schema.ts index 64d5931..fd2a428 100644 --- a/src/hydrate/collector/schema/attack-object.schema.ts +++ b/src/hydrate/collector/schema/attack-object.schema.ts @@ -6,6 +6,7 @@ import * as mongoose from "mongoose"; @Schema({ collection: "object-resources", versionKey: false, + strict: false }) export class AttackObject extends Document { @Prop(mongoose.Schema.Types.String) From a7146ad81120673429cf6ca848934333193f4763 Mon Sep 17 00:00:00 2001 From: Sean Sica <23294618+seansica@users.noreply.github.com> Date: Mon, 10 Jul 2023 16:57:22 -0400 Subject: [PATCH 15/28] Refactor object-collector.service to bulkUpdate the database (instead of using updateOne per doc) --- .../providers/object-collector.service.ts | 47 ++++++++++++------- 1 file changed, 29 insertions(+), 18 deletions(-) diff --git a/src/hydrate/collector/providers/object-collector.service.ts b/src/hydrate/collector/providers/object-collector.service.ts index b701d7f..2f2aec3 100644 --- a/src/hydrate/collector/providers/object-collector.service.ts +++ b/src/hydrate/collector/providers/object-collector.service.ts @@ -38,8 +38,7 @@ export class ObjectCollectorService { ); constructor( - @Inject(STIX_REPO_TOKEN) - private readonly workbench: StixRepositoryInterface, + @Inject(STIX_REPO_TOKEN) private readonly workbench: StixRepositoryInterface, @InjectModel(AttackObject.name) private stixObjectModel: Model ) {} @@ -55,8 +54,7 @@ export class ObjectCollectorService { * 2. For each collection ID, request the respective collection bundle * 3. Push { collection_id, stix } for each object retrieved */ - const allAttackObjects: StixObjectInterface[] = - await this.workbench.getAllStixObjects(false); + const allAttackObjects: StixObjectInterface[] = await this.workbench.getAllStixObjects(false); this.logger.debug(`Retrieved ${allAttackObjects.length} ATT&CK objects`); @@ -108,8 +106,10 @@ export class ObjectCollectorService { `Processed ${objectsToWriteToDatabase.length} ATT&CK objects` ); - // Write each object to the database. Creates a new document if the object does not already exist. Otherwise updates + // Write object to the database using bulk operation. Creates a new document if the object does not already exist. Otherwise updates // the existing document. + let bulkOps = []; + for (const object of objectsToWriteToDatabase) { if ((object).workspace.collections.length >= 1) { // only operate on the object if the object has an ATT&CK ID @@ -125,20 +125,26 @@ export class ObjectCollectorService { "stix.created": { $eq: object.stix.created }, "stix.spec_version": { $eq: object.stix.spec_version }, }; - await this.stixObjectModel - .updateOne( - filter, - { - collection_id: collectionId, - stix: object.stix, + // push the updateOne operation into bulkOps array + bulkOps.push({ + updateOne: { + filter: filter, + update: { + $set: { + collection_id: collectionId, + stix: object.stix, + }, }, - { - upsert: true, - strict: false, // disabling strict mode allows us to capture properties not explicitly declared in the - // schema - } - ) - .exec(); + upsert: true, + strict: false, // disabling strict mode allows us to capture properties not explicitly declared in the schema + } + }); + // execute bulkWrite each 1000 operations (or at the end of the loop) + if (bulkOps.length === 1000) { + await this.stixObjectModel.bulkWrite(bulkOps); + bulkOps = []; // clear the array + } + this.logger.debug( `Synchronized STIX object '${object.stix.id}' to TAXII database` ); @@ -146,6 +152,11 @@ export class ObjectCollectorService { // end if } + // execute the remaining operations, if any + if (bulkOps.length > 0) { + await this.stixObjectModel.bulkWrite(bulkOps); + } + // end for this.logger.debug("Completed database object hydration"); } From 7e06731029cd073c446a9e117343f82eb2297ee0 Mon Sep 17 00:00:00 2001 From: Sean Sica <23294618+seansica@users.noreply.github.com> Date: Mon, 10 Jul 2023 16:58:17 -0400 Subject: [PATCH 16/28] Gitignore the entire .idea directory --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 4beb9f6..75dbb85 100644 --- a/.gitignore +++ b/.gitignore @@ -17,6 +17,7 @@ # Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 # User-specific stuff +.idea .idea/**/workspace.xml .idea/**/tasks.xml .idea/**/usage.statistics.xml From 53f6384de4a5ed8a2c3ffd1123ba848b7bfa0379 Mon Sep 17 00:00:00 2001 From: Sean Sica <23294618+seansica@users.noreply.github.com> Date: Fri, 28 Jul 2023 09:57:25 -0400 Subject: [PATCH 17/28] Resolve TypeError thrown when STIX object does not belong to a collection --- .../providers/object-collector.service.ts | 46 +++++++++++-------- 1 file changed, 27 insertions(+), 19 deletions(-) diff --git a/src/hydrate/collector/providers/object-collector.service.ts b/src/hydrate/collector/providers/object-collector.service.ts index 2f2aec3..1b03aa9 100644 --- a/src/hydrate/collector/providers/object-collector.service.ts +++ b/src/hydrate/collector/providers/object-collector.service.ts @@ -110,46 +110,54 @@ export class ObjectCollectorService { // the existing document. let bulkOps = []; + // Iterate over each object in the objectsToWriteToDatabase array for (const object of objectsToWriteToDatabase) { - if ((object).workspace.collections.length >= 1) { - // only operate on the object if the object has an ATT&CK ID - // grab the collection_id for later. we're going to include the collection_id on each STIX-object document so - // the TAXII server can easily distinguish which collection the object belongs to - const collectionId: string = (object).workspace - .collections[0].collection_ref; + // Cast each object to the type AttackObjectDto + const dto = object as AttackObjectDto; + // Check if workspace and collections properties exist before accessing collections.length + // This ensures that we only operate on objects that have at least one collection + if (dto.workspace && dto.workspace.collections && dto.workspace.collections.length >= 1) { + + // Grab the collection_id for later. This will be included in each STIX-object document + // so the TAXII server can easily distinguish which collection the object belongs to + const collectionId: string = dto.workspace.collections[0].collection_ref; + + // Define a filter based on STIX properties of the object const filter: FilterQuery = { - "stix.id": { $eq: object.stix.id }, - "stix.modified": { $eq: object.stix.modified }, - "stix.created": { $eq: object.stix.created }, - "stix.spec_version": { $eq: object.stix.spec_version }, + "stix.id": { $eq: dto.stix.id }, + "stix.modified": { $eq: dto.stix.modified }, + "stix.created": { $eq: dto.stix.created }, + "stix.spec_version": { $eq: dto.stix.spec_version }, }; - // push the updateOne operation into bulkOps array + + // Push an update operation into the bulkOps array, setting or updating the collection_id and stix properties bulkOps.push({ updateOne: { filter: filter, update: { $set: { collection_id: collectionId, - stix: object.stix, + stix: dto.stix, }, }, - upsert: true, - strict: false, // disabling strict mode allows us to capture properties not explicitly declared in the schema - } + upsert: true, // If the object doesn't exist, insert a new document. If it does exist, update the existing document + strict: false, // Disabling strict mode allows us to capture properties not explicitly declared in the schema + }, }); - // execute bulkWrite each 1000 operations (or at the end of the loop) + + // Execute bulkWrite for every 1000 operations or at the end of the loop if (bulkOps.length === 1000) { await this.stixObjectModel.bulkWrite(bulkOps); - bulkOps = []; // clear the array + bulkOps = []; // Clear the array for the next batch of operations } + // Log a debug message indicating that a STIX object has been synchronized to the TAXII database this.logger.debug( - `Synchronized STIX object '${object.stix.id}' to TAXII database` + `Synchronized STIX object '${dto.stix.id}' to TAXII database` ); } - // end if } // execute the remaining operations, if any From 61c89dbf3fc8e6733e90e5f528362464550e35a1 Mon Sep 17 00:00:00 2001 From: Sean Sica <23294618+seansica@users.noreply.github.com> Date: Wed, 17 Apr 2024 15:48:38 -0400 Subject: [PATCH 18/28] Update documentation --- README.md | 11 +- docs/README.md | 3 +- docs/SETUP.md | 338 ++++++++++++++++++++++++++++++++++ docs/USAGE.md | 481 +++++++++++++++++++++++-------------------------- 4 files changed, 574 insertions(+), 259 deletions(-) create mode 100644 docs/SETUP.md diff --git a/README.md b/README.md index e58e1cc..c8af351 100644 --- a/README.md +++ b/README.md @@ -10,8 +10,6 @@ The following resources provide supporting documentation about the TAXII protoco - [Introduction to TAXII](https://oasis-open.github.io/cti-documentation/taxii/intro.html) - [TAXII 2.1 Specification](https://docs.oasis-open.org/cti/taxii/v2.1/os/taxii-v2.1-os.html) - [OASIS Open TAXII Resources](https://oasis-open.github.io/cti-documentation/resources.html#taxii-21-specification) - - The ATT&CK Workbench application requires additional components for full operation. The [ATT&CK Workbench Frontend](https://github.com/center-for-threat-informed-defense/attack-workbench-frontend) @@ -55,7 +53,8 @@ The application uses Swagger UI module to dynamically document the available RES be accessed at the path: `/api-docs`. The [docs](/docs/README.md) folder contains additional documentation about using the TAXII Server: -- [USAGE](/docs/USAGE.md): Includes advanced details and instructions for setting up the TAXII Server. +- [SETUP](/docs/SETUP.md): Includes advanced details and instructions for setting up the TAXII Server. +- [USAGE](/docs/USAGE.md): User Guide on how to query/use the TAXII 2.1 REST API. - [CONTRIBUTING](/docs/CONTRIBUTING.md): information about how to contribute to this project. ## Install and run @@ -121,11 +120,9 @@ npm install ##### Step 3. Configure the system The app is configured using environment variables loaded from a dotenv file. A template is provided for your convenience. -See the [USAGE](./docs/USAGE.md#environment-variables) document for a list of supported environment variables and usage -descriptions. +See the [SETUP](./docs/SETUP.md#environment-variables) document for a list of supported environment variables and usage descriptions. -Store the dotenv file in the root `config/` directory, and ensure that the `TAXII_ENV` environment variable reflects the -dotenv file name. `TAXII_ENV` determines the name of the environment variable which gets loaded by the server. For example: +Store the dotenv file in the root `config/` directory, and ensure that the `TAXII_ENV` environment variable reflects the dotenv file name. `TAXII_ENV` determines the name of the environment variable which gets loaded by the server. For example: - If `TAXII_ENV` is equal to `dev`, then the server attempts to load `config/dev.env`. - If `TAXII_ENV` is equal to `prod`, then the server attempts to load `config/prod.env`. diff --git a/docs/README.md b/docs/README.md index b8a80e0..6616702 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,3 +1,4 @@ # Documentation -- [USAGE](USAGE.md): includes server configuration details +- [USAGE](USAGE.md): includes a user guide on how to query/use the TAXII 2.1 REST API +- [SETUP](SETUP.md): includes server configuration details - [CONTRIBUTING](CONTRIBUTING.md): includes information about how to contribute to this project \ No newline at end of file diff --git a/docs/SETUP.md b/docs/SETUP.md new file mode 100644 index 0000000..c90e798 --- /dev/null +++ b/docs/SETUP.md @@ -0,0 +1,338 @@ +# SETUP + +The ATT&CK Workbench TAXII server is a Node.js server designed to serve STIX 2.1 content through a +[TAXII 2.1](https://docs.oasis-open.org/cti/taxii/v2.1/csprd02/taxii-v2.1-csprd02.html) compliant REST API. It is +loosely coupled to ATT&CK Workbench in that users are empowered to connect their own STIX repositories. By default, the +TAXII server sources all STIX data from the Workbench REST API. The TAXII server can run in several deployment models: +1. As a standalone Node.js instance. +2. As a standalone Docker container. +3. As a multi-container Workbench ensemble via Docker Compose. + +## Endpoints + +All available HTTP endpoints are summarized in the `taxii` module [here](https://github.com/mitre-attack/attack-workbench-taxii-server/tree/main/src/taxii). + +While the TAXII _protocol_ does allow for POST requests, this implementation is read-only and does not provide the means +to write data to the local knowledge base. + +There are a few notable endpoint-related deviations from the TAXII 2.1 specifications: +1. The `POST` (*"Add an Object"*) and `DELETE` (*"Delete An Object"*) endpoints are not implemented. The + reason for these exclusions come from the fundamental design decision to loosely couple the TAXII 2.1 server to + Workbench. The TAXII 2.1 server reads STIX data from the Workbench REST API, and re-expresses the data in accordance + with the TAXII specification. In other words, data flow is unidirectional. We opted to omit any TAXII endpoints + that duplicate existing Workbench functionality, which happens to include the aforementioned `POST` and `DELETE` + endpoints. However, we recognize that some community members may prefer to not use Workbench, so we designed the + `stix` module to be capable of loading data from other sources. More details on the `stix` module can be found + [here](https://github.com/mitre-attack/attack-workbench-taxii-server/tree/main/src/stix). +2. The *"Get Status"* endpoint is not implemented. This endpoint only serves to monitor the status of `POST` requests +(i.e., adding objects to a collection). This endpoint was omitted because there are no `POST` endpoints to monitor. + + +## Environment Variables + +All environment variables are assessed at runtime. Any subsequent changes (after the server is started) will require +the server to be rebooted for the changes to take effect. + +At present, the following environment variables are supported: + +| Name | Type | Default Value | Description | +| ----------------------------- | ---- | ----------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `TAXII_APP_ADDRESS` | str | 0.0.0.0 | Specifies which network interface the server should bind to | +| `TAXII_APP_PORT` | int | 443 | Specifies which port the server should listen on | +| `TAXII_MAX_CONTENT_LENGTH` | int | 0 | Limits the maximum size of the message body that the server will accept | +| `TAXII_API_ROOT_PATH` | str | /api/v21/ | Prefix for all TAXII 2.1 endpoints (excluding the Discovery endpoint [/taxii2/]) | +| `TAXII_API_ROOT_TITLE` | str | MITRE ATT&CK TAXII 2.1 | A title for the API root (observed on responses to the 'Get API Root Information' endpoint) | +| `TAXII_API_ROOT_DESCRIPTION` | str | This API Root contains TAXII 2.1 REST API endpoints that serve MITRE ATT&CK STIX 2.1 data | A summary or description of the API root | +| `TAXII_CONTACT_EMAIL` | str | no-reply@your-company.tld | The email address which is advertised on responses to the Discovery endpoint (/taxii2/) | +| `TAXII_CACHE_TYPE` | str | default | Specifies what type of cache the TAXII server should use; Supported values: 'default' or 'memcached' | +| `TAXII_CACHE_HOST` | str | localhost | IP or FQDN of the cache host. Supports multiple comma-separated hosts. e.g., a.b.c.d, w.x.y.z | +| `TAXII_CACHE_PORT` | int | 6379 | Port on which cache daemon/service is listening | +| `TAXII_CACHE_TTL` | int | 600 | Amount of time a cache entry can idle in cache before removal/expiration. Measured in seconds. | +| `TAXII_CACHE_MAX_ITEM_SIZE` | int | 50m | The maximum size (in bytes) per item that can be cached. Analogous to the memcached `-I` parameter which allows you to specify the maximum item size at runtime. It supports a unit postfix to allow for natural expression of item size. | +| `TAXII_CACHE_NET_TIMEOUT` | int | 6000 | Specifies how long the TAXII server will wait for responses from Memcached. Measured in ms. | +| `TAXII_CACHE_RECONNECT` | bool | true | Specifies whether the server should continue re-attempting to connect the cache host in the event there is a disconnect | +| `TAXII_CACHE_MEM_SIZE` | int | 4096 | Sets the amount of memory allocated to memcached for object storage. ONLY USED BY MEMCACHED. | +| `TAXII_CORS_ENABLED` | bool | false | Specifies whether CORS should be enabled on the server | +| `TAXII_STIX_SRC_URL` | str | http://localhost:3000 | Specifies the address and port on which the Workbench REST API is listening. | +| `TAXII_STIX_DATA_SRC` | str | workbench | Specifies how the server will source/ingest STIX data. At the moment, only 'workbench' is supported. | +| `TAXII_WORKBENCH_AUTH_HEADER` | str | dGF4aWktc2VydmVyOnNlY3JldC1zcXVpcnJlbA== | Specifies the base64-encoded portion of the Authorization header that should be used on HTTP requests to the Workbench REST API. | +| `TAXII_MONGO_URI` | str | mongodb://localhost/taxii | Specifies the URI of the MongoDB instance. | +| `TAXII_LOG_LEVEL` | str | info | Default winston logging level. Conforms to RFC5424 | +| `TAXII_LOG_TO_FILE` | bool | false | Specifies whether the server should write logs to file (in addition to stdout) | +| `TAXII_HTTPS_ENABLED` | bool | true | Specifies whether the server should use HTTPS (SSL/TLS) | +| `TAXII_HYDRATE_ON_BOOT` | bool | false | Specifies whether the TAXII collector should begin database hydration at runtime. | +| `TAXII_LOG_TO_HTTP_HOST` | str | - | Specifies the address (IP or FQDN) of a log listener. The server will attempt to send logs to this address if a value is set. | +| `TAXII_LOG_TO_HTTP_PORT` | int | - | Specifies the port of the log listener | +| `TAXII_LOG_TO_HTTP_PATH` | str | - | Specifies the HTTP endpoint of the log listener | +| `TAXII_LOG_TO_SLACK_URL` | str | - | Specifies a Slack URL. The server will attempt to send logs to this address if a value is set. | +| `TAXII_LOG_TO_SENTRY_DSN` | str | - | Specifies a Sentry Data Source Name (DSN). The server will attempt to send logs to this address if a value is set. | +| `TAXII_SSL_PRIVATE_KEY` | str | - | Base64 encoded string containing the SSL/TLS private key. | +| `TAXII_SSL_PUBLIC_KEY` | str | - | Base64 encoded string containing the SSL/TLS public key. | + + +## Authorization + +If the TAXII server is configured to source STIX from the `WorkbenchRepository`, then the TAXII server must authenticate +to the Workbench REST API using Basic Auth. There are two steps to enabling the TAXII server to authenticate to +the Workbench REST API: + +1. Basic Auth must be enabled on the Workbench REST API and a service account & API key must be provisioned for the +TAXII server. An example is provided [here](https://github.com/center-for-threat-informed-defense/attack-workbench-rest-api/blob/develop/resources/sample-configurations/test-service-basic-apikey.json). + +2. On the TAXII server, `TAXII_WORKBENCH_AUTH_HEADER` must be set to the aforementioned encoded service account +name and API key. The values must be base64 encoded from the string format `service-name:api-key`. + +_e.g._, The Workbench REST API has configured a basic authorization service account for the TAXII server. +The username is `taxii-server` and the key is `secret-squirrel`. + +```json5 +// rest-api-service-config.json + +{ + "serviceAuthn": { + "basicApikey": { + "enable": true, + "serviceAccounts": [ + { + "name": "taxii-server", + "apikey": "secret-squirrel", + "serviceRole": "read-only" + } + ] + } + } +} +``` + +The Workbench REST API expects clients to authenticate with `Authorization` header +`Basic dGF4aWktc2VydmVyOnNlY3JldC1zcXVpcnJlbA==`. + +The string is a base-64 encoded string generated from the UTF-8 string value, `taxii-server:secret-squirrel`. + +```json +{ + "decoded": "taxii-server:secret-squirrel", + "encoded": "dGF4aWktc2VydmVyOnNlY3JldC1zcXVpcnJlbA==" +} +``` + +The TAXII server is configured to send HTTP requests to the Workbench REST API with the following header: + +```json +{ + "Authorization": "Basic dGF4aWktc2VydmVyOnNlY3JldC1zcXVpcnJlbA==" +} +``` + +The base64 encoded portion of the authorization string is injected to the TAXII server using environment variable +`TAXII_WORKBENCH_AUTH_HEADER`. + +```js +{ + Authorization: `Basic ${env.TAXII_WORKBENCH_AUTH_HEADER}` +} +``` + + +## HTTPS (TLS) + +SSL/TLS can be enabled or disabled by setting the `TAXII_HTTPS_ENABLED` environment variable. + +``` +$ export TAXII_HTTPS_ENABLED=true # enable HTTPS +$ export TAXII_HTTPS_ENABLED=false # disable HTTPS +``` + +If enabled, a private key and a public key must be provided. The public and private keys can be provided in **two ways**: + +1. Set environment variables `TAXII_SSL_PRIVATE_KEY` and `TAXII_SSL_PUBLIC_KEY`. Both keys must be base64 encoded. A + simple JS utility, `encodePem.js`, is provided in the project root directory to help convert your PEM files to base64 + encoded strings. See the `encodePem.js` file for instructions on how to use it. +2. Place the keys in `{project-root}/config/`. Name the file containing the public key `public-certificate.pem` and name + the file containing the private key `private-key.pem`. + +The server will prioritize option 1 over option 2 if both are set. In other words, if `config/private-key.pem` & +`config/public-certificate.pem` exists, *and* `TAXII_SSL_PRIVATE_KEY` & `TAXII_SSL_PRIVATE_KEY` are set, then the +former (`config/*.pem`) will take precedence. + +## Database +An instance of MongoDB is required in order to run the TAXII 2.1 server. By default, the server will query for STIX +objects from the `taxii` database. The TAXII server will generate (and serve) TAXII resources based on the contents of +the following two Mongo Collections: + +- `attackObjects` : Stores STIX resources +- `taxiicollections` : Stores TAXII Collection resources + +The `taxii` database is populated by the TAXII Collector, which can be initialized & run via `npm run hydrate`. +Synchronization is handled by the `HydrateModule` and occurs every hour at the `HH:00` and `HH:30` minute mark (_e.g._, 12:00, +12:30, 1:00, 1:30). + +The TAXII Collector can be configured to start hydrating the database as soon as it initializes by setting the +`TAXII_HYDRATE_ON_BOOT` environment variable to `true`. This can be helpful in instances where the database is empty +(and thus requires hydration) but the time is something like 12:45. In this example, rather than wait 15 minutes for the +automated task scheduler to trigger, `TAXII_HYDRATE_ON_BOOT` can be used to force hydration to occur as soon as the TAXII +collector initializes. Alternatively, if the database is already hydrated (and thus hydration is not needed at runtime), +`TAXII_HYDRATE_ON_BOOT` can be disabled. This will restrict the task scheduler to only run at the `HH:00` and `HH:30` +minute mark. + +## Clustering +The production instance of the TAXII server (`npm run start:prod`) is encapsulated in a PM2 cluster. Two independent +processes are contained in the cluster: + +1. TAXII 2.1 Server (`taxii21-server`) : Initialized by `src/main.ts`, this process runs the user-facing web API and +serves STIX data from an instance of MongoDB (as defined by the `TAXII_MONGO_URI` environment variable). + +2. TAXII Collector (`taxii21-collector`) : Initialized by `src/hydrate.ts`, this process is responsible for synchronizing +and hydrating the Mongo database. This process is expected to run in the background and operates on a timer via the +Nest.js native [task scheduler](https://docs.nestjs.com/techniques/task-scheduling). It retrieves STIX objects from an +instance of Workbench (as determined by the `TAXII_STIX_SRC_URL` environment variable) and writes them to Mongo +Collections that the `taxii21-server` process queries resources from. + +```text +/app # pm2 list +┌─────┬──────────────────────┬─────────────┬─────────┬─────────┬──────────┬────────┬──────┬───────────┬──────────┬──────────┬──────────┬──────────┐ +│ id │ name │ namespace │ version │ mode │ pid │ uptime │ ↺ │ status │ cpu │ mem │ user │ watching │ +├─────┼──────────────────────┼─────────────┼─────────┼─────────┼──────────┼────────┼──────┼───────────┼──────────┼──────────┼──────────┼──────────┤ +│ 1 │ taxii21-collector │ default │ 0.9.0 │ cluster │ 19 │ 4h │ 0 │ online │ 0% │ 96.0mb │ root │ disabled │ +│ 0 │ taxii21-server │ default │ 0.9.0 │ cluster │ 18 │ 4h │ 0 │ online │ 0% │ 129.4mb │ root │ disabled │ +│ 2 │ taxii21-server │ default │ 0.9.0 │ cluster │ 32 │ 4h │ 0 │ online │ 0% │ 129.5mb │ root │ disabled │ +│ 3 │ taxii21-server │ default │ 0.9.0 │ cluster │ 39 │ 4h │ 0 │ online │ 0% │ 129.2mb │ root │ disabled │ +│ 4 │ taxii21-server │ default │ 0.9.0 │ cluster │ 46 │ 4h │ 0 │ online │ 0% │ 129.0mb │ root │ disabled │ +└─────┴──────────────────────┴─────────────┴─────────┴─────────┴──────────┴────────┴──────┴───────────┴──────────┴──────────┴──────────┴──────────┘ +``` + +## Logging + +The TAXII server ships with a custom logger implementation that extends an instance of +[winston](https://www.npmjs.com/package/winston) to the default Nest.js module. The logger is a Nest.js provider that +uses the `REQUEST` [injection scope](https://docs.nestjs.com/fundamentals/injection-scopes) in conjunction with the +[request-context](../src/common/middleware/request-context/index.ts) module to correlate all log output to the user request. All +inbound user HTTP request objects are assigned a unique ID. + +In the following example, the server received an HTTP request on the discovery endpoint, `GET /taxii2/`. The first line +indicates that the `SetRequestIdMiddleware` provider received the request and assigned random uuid +`a48bab11-e950-5e4f-9b9d-dcd9372ac3dd` to it. The second and third lines show the request object flowing through the +request pipeline. The same UUID appears in all log output, so we can easily trace how & where the user request flowed +through the system. + +```Nest +[Nest] 1 - 06/08/2022, 2:15:28 PM LOG [SetRequestIdMiddleware] New request: [a48bab11-e950-5e4f-9b9d-dcd9372ac3dd] GET /taxii2/ - application/taxii+json;version=2.1 insomnia/2022.3.0 ::ffff:172.17.0.1 +[Nest] 1 - 06/08/2022, 2:15:28 PM DEBUG [RootController] [a48bab11-e950-5e4f-9b9d-dcd9372ac3dd] Received a discovery request +[Nest] 1 - 06/08/2022, 2:15:28 PM LOG [ResLoggerMiddleware] Outgoing response: [a48bab11-e950-5e4f-9b9d-dcd9372ac3dd] 200 GET /taxii2/ 214 - insomnia/2022.3.0 ::ffff:172.17.0.1 +``` + +### Log Level + +Environment variable `TAXII_LOG_LEVEL` is used to configure the embedded `winston` instance, which conveniently conforms +to the severity ordering specified by [RFC5424](https://tools.ietf.org/html/rfc5424). + +> Logging levels in winston conform to the severity ordering specified by RFC5424: severity of all levels is assumed to be numerically ascending from most important to least important. +> +> Each level is given a specific integer priority. The higher the priority the more important the message is considered to be, and the lower the corresponding integer priority. For example, as specified exactly in RFC5424 the syslog levels are prioritized from 0 to 7 (highest to lowest). + +Logs sent to stdout cannot be disabled or filtered at this time. + +The following values are supported by `TAXII_LOG_LEVEL`: +- `emerg` +- `alert` +- `crit` +- `error` +- `warning` +- `notice` +- `info` (default) +- `debug` + + +### Log To File + +Set environment variable `TAXII_LOG_TO_FILE` to `true` to configure the server to write logs to a file _in addition_ to +stdout. If `TAXII_LOG_TO_FILE` is not set, then the logger will not attempt to write logs to file. + +When enabled, logs are written to a file named `taxii_server_${timestamp}.log`, _e.g._, `taxii_server_2022-02-17.log`. + +Logs written to file by `winston` are formatted in `JSON`. + + +### Log To HTTP + +The embedded `winston` implementation is capable of sending logs to an HTTP endpoint. The logger can be configured to +send logs to an HTTP listener by enabling the following three environment variables: +- `TAXII_LOG_TO_HTTP_HOST`: the log listener's IP or FQDN +- `TAXII_LOG_TO_HTTP_PORT`: the log listener's port +- `TAXII_LOG_TO_HTTP_PATH`: the log listener's endpoint (e.g., `/api/logs`) + +The TAXII server will attempt to enable the HTTP log forwarder when `TAXII_LOG_TO_HTTP_HOST` is set to a defined value. + +Please note that logging to HTTP has not been fully tested. This feature is provided as is. + +### Log To Slack + +The embedded `winston` implementation takes advantage of [winston-slack-webhook-transport](https://www.npmjs.com/package/winston-slack-webhook-transport) +to forward logs to a Slack webhook. The full webhook URL can be configured via environment variable `TAXII_LOG_TO_SLACK_URL`. +If `TAXII_LOG_TO_SLACK_URL` is not set, then the logger will not attempt to send logs to Slack. + +Please note that logging to Slack has not been fully tested. This feature is provided as is. + +### Log To Sentry + +The embedded `winston` implementation takes advantage of [winston-transport-sentry-node](https://www.npmjs.com/package/winston-transport-sentry-node) +to forward logs to Sentry. The Sentry DSN path (_e.g._, `'https://******@sentry.io/12345'`) can be configured via +environment variable `TAXII_LOG_TO_SENTRY_DSN`. If `TAXII_LOG_TO_SENTRY_DSN` is not set, then the logger will not attempt +to send logs to Sentry. + +Please note that logging to Sentry has not been fully tested. This feature is provided as is. + + +## Caching +The TAXII server provides a dynamic cache provider that supports two types of caches: +1. An [in-memory cache](https://docs.nestjs.com/techniques/caching) (default) +2. [Memcached](https://memcached.org/) + +Caching is used by the `WorkbenchModule` to store responses from the Workbench REST API. + +### Memcached + +The TAXII server can be configured to use Memcached by setting environment variable `TAXII_CACHE_TYPE` to `memcached`. + +```shell +$ export TAXII_CACHE_TYPE=memcached +``` + +While external cache implementations are outside the scope of the TAXII server, a containerized instance of `memcached` +can easily be spun-up by using the Docker Compose template located in the [attack-workbench-deployment](https://github.com/mitre-attack/attack-workbench-deployment) +repository. + +The following configuration parameters can be set via environment variables when `memcached` is enabled: +- `TAXII_CACHE_HOST`: The IP address or FQDN of the Memcached server +- `TAXII_CACHE_PORT`: The port on which the Memcached server is listening +- `TAXII_CACHE_TTL`: The duration of time that an item should remain in the cache before removal +- `TAXII_CACHE_MAX_ITEM_SIZE`: The maximum size of each item allowed in the cache. This value also sets the corresponding server-side setting (i.e., Maps to the `memcached -I` flag.) +- `TAXII_CACHE_MEM_SIZE`: Sets the amount of memory allocated to memcached for object storage. (e.g., Maps to the `memcached -m` flag.) This setting only applies to the Memcached server; not the TAXII app! + +Note that the TAXII application can only map to one instance of Memcached. Multiple Memcached servers cannot be used. + +The following configuration parameters can be set via environment variables when the in-memory (`default`) cache is enabled: +- `TAXII_CACHE_TTL`: The duration of time that an item should remain in the cache before removal + + +## Scripts + +`package.json` contains a number of scripts that can be used to perform recurring tasks. +- `prebuild`: deletes the entire `dist/` directory if it exists. +- `build`: transpiles the TypeScript code to JavaScript in the `dist/` directory. +- `start`: starts the server in a single Node.js process. +- `hydrate`: starts the TAXII collector process. +- `start:prod`: starts the server in a PM2 cluster. References [ecosystem.config.js](../ecosystem.config.js) for instructions. +- `start:dev`: starts the server in "hot-reload" mode. Useful for development. +- `test:e2e`: starts the end-to-end HTTP tests to ensure that all available TAXII endpoints are working as expected. Note +that the E2E test suite requires a live, pre-populated database to run correctly. +- `test`: executes a series of unit tests to ensure that all Nest.js components/modules are working as expected. + +A few additional scripts are provided to simplify various aspects of the deployment process: + +- [docker_build.sh](../scripts/docker_build.sh) is a simple wrapper script that makes it easier to [re]build the Docker image. + +- [run.sh](../run.sh) cleans, builds, and runs a containerized instance of the TAXII server. Details are described in +the [Build from source](../README.md#build-from-source) section of the [README](../README.md) file. + +- [encode.js](../scripts/encodePem.js) is described in the [HTTPS](#https-tls) section of this document. \ No newline at end of file diff --git a/docs/USAGE.md b/docs/USAGE.md index c48d588..63aacc5 100644 --- a/docs/USAGE.md +++ b/docs/USAGE.md @@ -1,298 +1,277 @@ -# USAGE +# TAXII 2.1 API User Guide -The ATT&CK Workbench TAXII server is a Node.js server designed to serve STIX 2.1 content through a -[TAXII 2.1](https://docs.oasis-open.org/cti/taxii/v2.1/csprd02/taxii-v2.1-csprd02.html) compliant REST API. It is -loosely coupled to ATT&CK Workbench in that users are empowered to connect their own STIX repositories. By default, the -TAXII server sources all STIX data from the Workbench REST API. The TAXII server can run in several deployment models: -1. As a standalone Node.js instance. -2. As a standalone Docker container. -3. As a multi-container Workbench ensemble via Docker Compose. +## Introduction -## Endpoints +TAXII (Trusted Automated eXchange of Intelligence Information) is a protocol used to exchange cyber threat intelligence over HTTPS. TAXII 2.1 is the latest version of this protocol. -All available HTTP endpoints are summarized in the `taxii` module [here](https://github.com/mitre-attack/attack-workbench-taxii-server/tree/main/src/taxii). - -While the TAXII _protocol_ does allow for POST requests, this implementation is read-only and does not provide the means -to write data to the local knowledge base. - -There are a few notable endpoint-related deviations from the TAXII 2.1 specifications: -1. The `POST` (*"Add an Object"*) and `DELETE` (*"Delete An Object"*) endpoints are not implemented. The - reason for these exclusions come from the fundamental design decision to loosely couple the TAXII 2.1 server to - Workbench. The TAXII 2.1 server reads STIX data from the Workbench REST API, and re-expresses the data in accordance - with the TAXII specification. In other words, data flow is unidirectional. We opted to omit any TAXII endpoints - that duplicate existing Workbench functionality, which happens to include the aforementioned `POST` and `DELETE` - endpoints. However, we recognize that some community members may prefer to not use Workbench, so we designed the - `stix` module to be capable of loading data from other sources. More details on the `stix` module can be found - [here](https://github.com/mitre-attack/attack-workbench-taxii-server/tree/main/src/stix). -2. The *"Get Status"* endpoint is not implemented. This endpoint only serves to monitor the status of `POST` requests -(i.e., adding objects to a collection). This endpoint was omitted because there are no `POST` endpoints to monitor. - - -## Environment Variables - -All environment variables are assessed at runtime. Any subsequent changes (after the server is started) will require -the server to be rebooted for the changes to take effect. - -At present, the following environment variables are supported: - -| Name | Type | Default Value | Description | -|----------------------------|-------|-------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| `TAXII_APP_ADDRESS` | str | 0.0.0.0 | Specifies which network interface the server should bind to | -| `TAXII_APP_PORT` | int | 443 | Specifies which port the server should listen on | -| `TAXII_MAX_CONTENT_LENGTH` | int | 0 | Limits the maximum size of the message body that the server will accept | -| `TAXII_API_ROOT_PATH` | str | /api/v21/ | Prefix for all TAXII 2.1 endpoints (excluding the Discovery endpoint [/taxii2/]) | -| `TAXII_API_ROOT_TITLE` | str | MITRE ATT&CK TAXII 2.1 | A title for the API root (observed on responses to the 'Get API Root Information' endpoint) | -| `TAXII_API_ROOT_DESCRIPTION` | str | This API Root contains TAXII 2.1 REST API endpoints that serve MITRE ATT&CK STIX 2.1 data | A summary or description of the API root | -| `TAXII_CONTACT_EMAIL` | str | no-reply@your-company.tld | The email address which is advertised on responses to the Discovery endpoint (/taxii2/) | -| `TAXII_CORS_ENABLED` | bool | false | Specifies whether CORS should be enabled on the server | -| `TAXII_STIX_SRC_URL` | str | http://localhost:3000 | Specifies the address and port on which the Workbench REST API is listening. | -| `TAXII_STIX_DATA_SRC` | str | workbench | Specifies how the server will source/ingest STIX data. At the moment, only 'workbench' is supported. | -| `TAXII_WORKBENCH_AUTH_HEADER`| str | dGF4aWktc2VydmVyOnNlY3JldC1zcXVpcnJlbA== | Specifies the base64-encoded portion of the Authorization header that should be used on HTTP requests to the Workbench REST API. | -| `TAXII_MONGO_URI` | str | mongodb://localhost/taxii | Specifies the URI of the MongoDB instance. | -| `TAXII_LOG_LEVEL` | str | info | Default winston logging level. Conforms to RFC5424 | -| `TAXII_LOG_TO_FILE` | bool | false | Specifies whether the server should write logs to file (in addition to stdout) | -| `TAXII_HTTPS_ENABLED` | bool | true | Specifies whether the server should use HTTPS (SSL/TLS) | -| `TAXII_HYDRATE_ON_BOOT` | bool | false | Specifies whether the TAXII collector should begin database hydration at runtime. | -| `TAXII_LOG_TO_HTTP_HOST` | str | - | Specifies the address (IP or FQDN) of a log listener. The server will attempt to send logs to this address if a value is set. | -| `TAXII_LOG_TO_HTTP_PORT` | int | - | Specifies the port of the log listener | -| `TAXII_LOG_TO_HTTP_PATH` | str | - | Specifies the HTTP endpoint of the log listener | -| `TAXII_LOG_TO_SLACK_URL` | str | - | Specifies a Slack URL. The server will attempt to send logs to this address if a value is set. | -| `TAXII_LOG_TO_SENTRY_DSN` | str | - | Specifies a Sentry Data Source Name (DSN). The server will attempt to send logs to this address if a value is set. | -| `TAXII_SSL_PRIVATE_KEY` | str | - | Base64 encoded string containing the SSL/TLS private key. | -| `TAXII_SSL_PUBLIC_KEY` | str | - | Base64 encoded string containing the SSL/TLS public key. | - - -## Authorization - -If the TAXII server is configured to source STIX from the `WorkbenchRepository`, then the TAXII server must authenticate -to the Workbench REST API using Basic Auth. There are two steps to enabling the TAXII server to authenticate to -the Workbench REST API: - -1. Basic Auth must be enabled on the Workbench REST API and a service account & API key must be provisioned for the -TAXII server. An example is provided [here](https://github.com/center-for-threat-informed-defense/attack-workbench-rest-api/blob/develop/resources/sample-configurations/test-service-basic-apikey.json). - -2. On the TAXII server, `TAXII_WORKBENCH_AUTH_HEADER` must be set to the aforementioned encoded service account -name and API key. The values must be base64 encoded from the string format `service-name:api-key`. - -_e.g._, The Workbench REST API has configured a basic authorization service account for the TAXII server. -The username is `taxii-server` and the key is `secret-squirrel`. - -```json5 -// rest-api-service-config.json +## Base URL +The base URL for the TAXII 2.1 API is typically something like https:///taxii/. -{ - "serviceAuthn": { - "basicApikey": { - "enable": true, - "serviceAccounts": [ - { - "name": "taxii-server", - "apikey": "secret-squirrel", - "serviceRole": "read-only" - } - ] - } - } -} -``` +## Headers -The Workbench REST API expects clients to authenticate with `Authorization` header -`Basic dGF4aWktc2VydmVyOnNlY3JldC1zcXVpcnJlbA==`. +A valid Accept header is required. The client must specify a media type supported by the TAXII 2.1 server. These include the following: -The string is a base-64 encoded string generated from the UTF-8 string value, `taxii-server:secret-squirrel`. +| Media Type | Description | +| ---------------------------------- | ------------------------------------------------ | +| application/taxii+json;version=2.1 | TAXII version 2.1 in JSON | +| application/taxii+json | Latest version of TAXII that the server supports | -```json -{ - "decoded": "taxii-server:secret-squirrel", - "encoded": "dGF4aWktc2VydmVyOnNlY3JldC1zcXVpcnJlbA==" -} -``` -The TAXII server is configured to send HTTP requests to the Workbench REST API with the following header: +## Endpoints -```json -{ - "Authorization": "Basic dGF4aWktc2VydmVyOnNlY3JldC1zcXVpcnJlbA==" -} +### Endpoint: Discovery +``` +GET /taxii2/ ``` -The base64 encoded portion of the authorization string is injected to the TAXII server using environment variable -`TAXII_WORKBENCH_AUTH_HEADER`. +Returns information about the TAXII server, including the API roots available. + +Example request: +```bash +curl --request GET \ + --url https://attack-taxii.mitre.org/taxii2/ \ + --header 'Accept: application/taxii+json;version=2.1' +``` -```js +Example response: +```json { - Authorization: `Basic ${env.TAXII_WORKBENCH_AUTH_HEADER}` + "title": "MITRE ATT&CK TAXII 2.1", + "description": "This API Root contains TAXII 2.1 REST API endpoints that serve MITRE ATT&CK STIX 2.1 data", + "default": "api/v21", + "api_roots": [ + "api/v21" + ] } ``` +* In the example response above, the API root (``) is listed as `api/v21`. We'll use this in subsequent examples. - -## HTTPS (TLS) - -SSL/TLS can be enabled or disabled by setting the `TAXII_HTTPS_ENABLED` environment variable. - -``` -$ export TAXII_HTTPS_ENABLED=true # enable HTTPS -$ export TAXII_HTTPS_ENABLED=false # disable HTTPS +### Endpoint: Get API Root Information ``` - -If enabled, a private key and a public key must be provided. The public and private keys can be provided in **two ways**: - -1. Set environment variables `TAXII_SSL_PRIVATE_KEY` and `TAXII_SSL_PUBLIC_KEY`. Both keys must be base64 encoded. A - simple JS utility, `encodePem.js`, is provided in the project root directory to help convert your PEM files to base64 - encoded strings. See the `encodePem.js` file for instructions on how to use it. -2. Place the keys in `{project-root}/config/`. Name the file containing the public key `public-certificate.pem` and name - the file containing the private key `private-key.pem`. - -The server will prioritize option 1 over option 2 if both are set. In other words, if `config/private-key.pem` & -`config/public-certificate.pem` exists, *and* `TAXII_SSL_PRIVATE_KEY` & `TAXII_SSL_PRIVATE_KEY` are set, then the -former (`config/*.pem`) will take precedence. - -## Database -An instance of MongoDB is required in order to run the TAXII 2.1 server. By default, the server will query for STIX -objects from the `taxii` database. The TAXII server will generate (and serve) TAXII resources based on the contents of -the following two Mongo Collections: - -- `attackObjects` : Stores STIX resources -- `taxiicollections` : Stores TAXII Collection resources - -The `taxii` database is populated by the TAXII Collector, which can be initialized & run via `npm run hydrate`. -Synchronization is handled by the `HydrateModule` and occurs every hour at the `HH:00` and `HH:30` minute mark (_e.g._, 12:00, -12:30, 1:00, 1:30). - -The TAXII Collector can be configured to start hydrating the database as soon as it initializes by setting the -`TAXII_HYDRATE_ON_BOOT` environment variable to `true`. This can be helpful in instances where the database is empty -(and thus requires hydration) but the time is something like 12:45. In this example, rather than wait 15 minutes for the -automated task scheduler to trigger, `TAXII_HYDRATE_ON_BOOT` can be used to force hydration to occur as soon as the TAXII -collector initializes. Alternatively, if the database is already hydrated (and thus hydration is not needed at runtime), -`TAXII_HYDRATE_ON_BOOT` can be disabled. This will restrict the task scheduler to only run at the `HH:00` and `HH:30` -minute mark. - -## Clustering -The production instance of the TAXII server (`npm run start:prod`) is encapsulated in a PM2 cluster. Two independent -processes are contained in the cluster: - -1. TAXII 2.1 Server (`taxii21-server`) : Initialized by `src/main.ts`, this process runs the user-facing web API and -serves STIX data from an instance of MongoDB (as defined by the `TAXII_MONGO_URI` environment variable). - -2. TAXII Collector (`taxii21-collector`) : Initialized by `src/hydrate.ts`, this process is responsible for synchronizing -and hydrating the Mongo database. This process is expected to run in the background and operates on a timer via the -Nest.js native [task scheduler](https://docs.nestjs.com/techniques/task-scheduling). It retrieves STIX objects from an -instance of Workbench (as determined by the `TAXII_STIX_SRC_URL` environment variable) and writes them to Mongo -Collections that the `taxii21-server` process queries resources from. - -```text -/app # pm2 list -┌─────┬──────────────────────┬─────────────┬─────────┬─────────┬──────────┬────────┬──────┬───────────┬──────────┬──────────┬──────────┬──────────┐ -│ id │ name │ namespace │ version │ mode │ pid │ uptime │ ↺ │ status │ cpu │ mem │ user │ watching │ -├─────┼──────────────────────┼─────────────┼─────────┼─────────┼──────────┼────────┼──────┼───────────┼──────────┼──────────┼──────────┼──────────┤ -│ 1 │ taxii21-collector │ default │ 0.9.0 │ cluster │ 19 │ 4h │ 0 │ online │ 0% │ 96.0mb │ root │ disabled │ -│ 0 │ taxii21-server │ default │ 0.9.0 │ cluster │ 18 │ 4h │ 0 │ online │ 0% │ 129.4mb │ root │ disabled │ -│ 2 │ taxii21-server │ default │ 0.9.0 │ cluster │ 32 │ 4h │ 0 │ online │ 0% │ 129.5mb │ root │ disabled │ -│ 3 │ taxii21-server │ default │ 0.9.0 │ cluster │ 39 │ 4h │ 0 │ online │ 0% │ 129.2mb │ root │ disabled │ -│ 4 │ taxii21-server │ default │ 0.9.0 │ cluster │ 46 │ 4h │ 0 │ online │ 0% │ 129.0mb │ root │ disabled │ -└─────┴──────────────────────┴─────────────┴─────────┴─────────┴──────────┴────────┴──────┴───────────┴──────────┴──────────┴──────────┴──────────┘ +GET // ``` -## Logging - -The TAXII server ships with a custom logger implementation that extends an instance of -[winston](https://www.npmjs.com/package/winston) to the default Nest.js module. The logger is a Nest.js provider that -uses the `REQUEST` [injection scope](https://docs.nestjs.com/fundamentals/injection-scopes) in conjunction with the -[request-context](../src/common/middleware/request-context/index.ts) module to correlate all log output to the user request. All -inbound user HTTP request objects are assigned a unique ID. - -In the following example, the server received an HTTP request on the discovery endpoint, `GET /taxii2/`. The first line -indicates that the `SetRequestIdMiddleware` provider received the request and assigned random uuid -`a48bab11-e950-5e4f-9b9d-dcd9372ac3dd` to it. The second and third lines show the request object flowing through the -request pipeline. The same UUID appears in all log output, so we can easily trace how & where the user request flowed -through the system. +Returns information about the API root, including the collections available. -```Nest -[Nest] 1 - 06/08/2022, 2:15:28 PM LOG [SetRequestIdMiddleware] New request: [a48bab11-e950-5e4f-9b9d-dcd9372ac3dd] GET /taxii2/ - application/taxii+json;version=2.1 insomnia/2022.3.0 ::ffff:172.17.0.1 -[Nest] 1 - 06/08/2022, 2:15:28 PM DEBUG [RootController] [a48bab11-e950-5e4f-9b9d-dcd9372ac3dd] Received a discovery request -[Nest] 1 - 06/08/2022, 2:15:28 PM LOG [ResLoggerMiddleware] Outgoing response: [a48bab11-e950-5e4f-9b9d-dcd9372ac3dd] 200 GET /taxii2/ 214 - insomnia/2022.3.0 ::ffff:172.17.0.1 +Example request: +```bash +curl --request GET \ + --url https://attack-taxii.mitre.org/api/v21/ \ + --header 'Accept: application/taxii+json;version=2.1' ``` -### Log Level - -Environment variable `TAXII_LOG_LEVEL` is used to configure the embedded `winston` instance, which conveniently conforms -to the severity ordering specified by [RFC5424](https://tools.ietf.org/html/rfc5424). - -> Logging levels in winston conform to the severity ordering specified by RFC5424: severity of all levels is assumed to be numerically ascending from most important to least important. -> -> Each level is given a specific integer priority. The higher the priority the more important the message is considered to be, and the lower the corresponding integer priority. For example, as specified exactly in RFC5424 the syslog levels are prioritized from 0 to 7 (highest to lowest). +Example response: +```json +{ + "title": "MITRE ATT&CK TAXII 2.1", + "description": "This API Root contains TAXII 2.1 REST API endpoints that serve MITRE ATT&CK STIX 2.1 data", + "version": "application/taxii+json;version=2.1", + "maxContentLength": 1000 +} +``` -Logs sent to stdout cannot be disabled or filtered at this time. +### Endpoint: Get Collections +``` +GET //collections/ +``` -The following values are supported by `TAXII_LOG_LEVEL`: -- `emerg` -- `alert` -- `crit` -- `error` -- `warning` -- `notice` -- `info` (default) -- `debug` +Returns a list of the collections available at the API root. +Example request: +```bash +curl --request GET \ + --url https://attack-taxii.mitre.org/api/v21/collections \ + --header 'Accept: application/taxii+json;version=2.1' +``` -### Log To File +Example response: +```json +{ + "collections": [ + { + "id": "x-mitre-collection--1f5f1533-f617-4ca8-9ab4-6a02367fa019", + "title": "Enterprise ATT&CK", + "description": "ATT&CK for Enterprise provides a knowledge base of real-world adversary behavior targeting traditional enterprise networks. ATT&CK for Enterprise covers the following platforms: Windows, macOS, Linux, PRE, Office 365, Google Workspace, IaaS, Network, and Containers.", + "canRead": true, + "canWrite": false, + "mediaTypes": [ + "application/taxii+json;version=2.1", + "application/taxii+json" + ] + }, + { + "id": "x-mitre-collection--90c00720-636b-4485-b342-8751d232bf09", + "title": "ICS ATT&CK", + "description": "The ATT&CK for Industrial Control Systems (ICS) knowledge base categorizes the unique set of tactics, techniques, and procedures (TTPs) used by threat actors in the ICS technology domain. ATT&CK for ICS outlines the portions of an ICS attack that are out of scope of Enterprise and reflects the various phases of an adversary’s attack life cycle and the assets and systems they are known to target.", + "canRead": true, + "canWrite": false, + "mediaTypes": [ + "application/taxii+json;version=2.1", + "application/taxii+json" + ] + }, + { + "id": "x-mitre-collection--dac0d2d7-8653-445c-9bff-82f934c1e858", + "title": "Mobile ATT&CK", + "description": "ATT&CK for Mobile is a matrix of adversary behavior against mobile devices (smartphones and tablets running the Android or iOS/iPadOS operating systems). ATT&CK for Mobile builds upon NIST's Mobile Threat Catalogue and also contains a separate matrix of network-based effects, which are techniques that an adversary can employ without access to the mobile device itself.", + "canRead": true, + "canWrite": false, + "mediaTypes": [ + "application/taxii+json;version=2.1", + "application/taxii+json" + ] + } + ] +} +``` -Set environment variable `TAXII_LOG_TO_FILE` to `true` to configure the server to write logs to a file _in addition_ to -stdout. If `TAXII_LOG_TO_FILE` is not set, then the logger will not attempt to write logs to file. +The response is an object with a key called `collections`. `collections` is an array of `collection` objects. -When enabled, logs are written to a file named `taxii_server_${timestamp}.log`, _e.g._, `taxii_server_2022-02-17.log`. +Note that each `collection` object contains an `id` property. You can use these identifiers to query the 'Get Collection' endpoint described in the next section. -Logs written to file by `winston` are formatted in `JSON`. +### Endpoint: Get Collection +``` +GET //collections// +``` +Returns information about a specific collection. -### Log To HTTP +Example request: +```bash +curl --request GET \ + --url https://attack-taxii.mitre.org/api/v21/collections/x-mitre-collection--1f5f1533-f617-4ca8-9ab4-6a02367fa019 \ + --header 'Accept: application/taxii+json;version=2.1' +``` -The embedded `winston` implementation is capable of sending logs to an HTTP endpoint. The logger can be configured to -send logs to an HTTP listener by enabling the following three environment variables: -- `TAXII_LOG_TO_HTTP_HOST`: the log listener's IP or FQDN -- `TAXII_LOG_TO_HTTP_PORT`: the log listener's port -- `TAXII_LOG_TO_HTTP_PATH`: the log listener's endpoint (e.g., `/api/logs`) +Example response: +```json +{ + "id": "x-mitre-collection--1f5f1533-f617-4ca8-9ab4-6a02367fa019", + "title": "Enterprise ATT&CK", + "description": "ATT&CK for Enterprise provides a knowledge base of real-world adversary behavior targeting traditional enterprise networks. ATT&CK for Enterprise covers the following platforms: Windows, macOS, Linux, PRE, Office 365, Google Workspace, IaaS, Network, and Containers.", + "canRead": true, + "canWrite": false, + "mediaTypes": [ + "application/taxii+json;version=2.1", + "application/taxii+json" + ] +} +``` -The TAXII server will attempt to enable the HTTP log forwarder when `TAXII_LOG_TO_HTTP_HOST` is set to a defined value. +### Endpoint: Get Objects +``` +GET //collections//objects/ +``` -Please note that logging to HTTP has not been fully tested. This feature is provided as is. +Returns a list of the STIX objects in a specific collection. -### Log To Slack +Example request: +```bash +curl --request GET \ + --url https://attack-taxii.mitre.org/api/v21/collections/x-mitre-collection--1f5f1533-f617-4ca8-9ab4-6a02367fa019/objects \ + --header 'Accept: application/taxii+json;version=2.1' +``` -The embedded `winston` implementation takes advantage of [winston-slack-webhook-transport](https://www.npmjs.com/package/winston-slack-webhook-transport) -to forward logs to a Slack webhook. The full webhook URL can be configured via environment variable `TAXII_LOG_TO_SLACK_URL`. -If `TAXII_LOG_TO_SLACK_URL` is not set, then the logger will not attempt to send logs to Slack. +Example response: +```json +{ + "more": false, + "objects": [ + ...STIX 2.1 objects +] +``` -Please note that logging to Slack has not been fully tested. This feature is provided as is. +### Endpoint: Get Object +``` +GET //collections//objects// +``` +Returns a specific STIX object. -### Log To Sentry +Example request: +``` +curl --request GET \ + --url https://attack-taxii.mitre.org/api/v21/collections/x-mitre-collection--1f5f1533-f617-4ca8-9ab4-6a02367fa019/objects/attack-pattern--ad255bfe-a9e6-4b52-a258-8d3462abe842 \ + --header 'Accept: application/taxii+json;version=2.1' +``` -The embedded `winston` implementation takes advantage of [winston-transport-sentry-node](https://www.npmjs.com/package/winston-transport-sentry-node) -to forward logs to Sentry. The Sentry DSN path (_e.g._, `'https://******@sentry.io/12345'`) can be configured via -environment variable `TAXII_LOG_TO_SENTRY_DSN`. If `TAXII_LOG_TO_SENTRY_DSN` is not set, then the logger will not attempt -to send logs to Sentry. +Example response: +```json +{ + "more": false, + "objects": [ + { + "id": "attack-pattern--ad255bfe-a9e6-4b52-a258-8d3462abe842", + "modified": "2021-04-29T14:49:39.188Z", + "created": "2017-05-31T21:30:18.931Z", + "type": "attack-pattern", + "spec_version": "2.1", + "name": "Data Obfuscation", + "description": "Adversaries may obfuscate command and control traffic to make it more difficult to detect. Command and control (C2) communications are hidden (but not necessarily encrypted) in an attempt to make the content more difficult to discover or decipher and to make the communication less conspicuous and hide commands from being seen. This encompasses many methods, such as adding junk data to protocol traffic, using steganography, or impersonating legitimate protocols. ", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "command-and-control" + } + ], + "x_mitre_attack_spec_version": "2.1.0", + "x_mitre_detection": "Analyze network data for uncommon data flows (e.g., a client sending significantly more data than it receives from a server). Processes utilizing the network that do not normally have network communication or have never been seen before are suspicious. Analyze packet contents to detect communications that do not follow the expected protocol behavior for the port that is being used. (Citation: University of Birmingham C2)", + "x_mitre_domains": [ + "enterprise-attack" + ], + "x_mitre_is_subtechnique": false, + "x_mitre_modified_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_platforms": [ + "Linux", + "macOS", + "Windows" + ], + "x_mitre_version": "1.1", + "x_mitre_data_sources": [ + "Network Traffic: Network Traffic Content" + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "external_references": [ + { + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1001", + "external_id": "T1001" + }, + { + "source_name": "University of Birmingham C2", + "description": "Gardiner, J., Cova, M., Nagaraja, S. (2014, February). Command & Control Understanding, Denying and Detecting. Retrieved April 20, 2016.", + "url": "https://arxiv.org/ftp/arxiv/papers/1408/1408.1136.pdf" + } + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ] + } + ] +} +``` -Please note that logging to Sentry has not been fully tested. This feature is provided as is. +### Endpoint: Get Object Versions +``` +GET //collections//objects//versions/ +``` +### Endpoint: Get Object Manifests +``` +GET //collections//manifest/ +``` -## Scripts -`package.json` contains a number of scripts that can be used to perform recurring tasks. -- `prebuild`: deletes the entire `dist/` directory if it exists. -- `build`: transpiles the TypeScript code to JavaScript in the `dist/` directory. -- `start`: starts the server in a single Node.js process. -- `hydrate`: starts the TAXII collector process. -- `start:prod`: starts the server in a PM2 cluster. References [ecosystem.config.js](../ecosystem.config.js) for instructions. -- `start:dev`: starts the server in "hot-reload" mode. Useful for development. -- `test:e2e`: starts the end-to-end HTTP tests to ensure that all available TAXII endpoints are working as expected. Note -that the E2E test suite requires a live, pre-populated database to run correctly. -- `test`: executes a series of unit tests to ensure that all Nest.js components/modules are working as expected. +## Authentication +TAXII 2.1 does not specify an authentication method. It's up to the implementation to provide this. Common methods include Basic Auth and Bearer Tokens. -A few additional scripts are provided to simplify various aspects of the deployment process: +## Error Handling +If an error occurs, the server will return a HTTP status code in the 400 or 500 range, along with a JSON object containing more information about the error. -- [docker_build.sh](../scripts/docker_build.sh) is a simple wrapper script that makes it easier to [re]build the Docker image. +## Pagination +The TAXII 2.1 API supports pagination via the limit and next parameters. -- [run.sh](../run.sh) cleans, builds, and runs a containerized instance of the TAXII server. Details are described in -the [Build from source](../README.md#build-from-source) section of the [README](../README.md) file. +## Rate Limiting +Rate limiting is not specified by TAXII 2.1 and is up to the implementation. -- [encode.js](../scripts/encodePem.js) is described in the [HTTPS](#https-tls) section of this document. \ No newline at end of file +## Conclusion +This guide provides a basic overview of the TAXII 2.1 API. For more detailed information, refer to the official TAXII 2.1 specification.* \ No newline at end of file From 0f1205c3376da3b102944502e43f341eea84667e Mon Sep 17 00:00:00 2001 From: Sean Sica <23294618+seansica@users.noreply.github.com> Date: Thu, 18 Apr 2024 10:28:33 -0400 Subject: [PATCH 19/28] Update documentation --- docs/USAGE.md | 75 ++++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 66 insertions(+), 9 deletions(-) diff --git a/docs/USAGE.md b/docs/USAGE.md index 63aacc5..1ecbdbb 100644 --- a/docs/USAGE.md +++ b/docs/USAGE.md @@ -5,7 +5,11 @@ TAXII (Trusted Automated eXchange of Intelligence Information) is a protocol used to exchange cyber threat intelligence over HTTPS. TAXII 2.1 is the latest version of this protocol. ## Base URL -The base URL for the TAXII 2.1 API is typically something like https:///taxii/. +The MITRE ATT&CK® TAXII 2.1 API is available at `https://attack-taxii.mitre.org`. + +The MITRE ATT&CK® TAXII 2.1 API root is `/api/v21/`. + +Thus, the base URL all requests (excluding those sent to the [Discovery Endpoint](#endpoint-discovery)) is [https://attack-taxii.mitre.org/api/v21/](https://attack-taxii.mitre.org/api/v21/) ## Headers @@ -44,7 +48,7 @@ Example response: ] } ``` -* In the example response above, the API root (``) is listed as `api/v21`. We'll use this in subsequent examples. +* In the example response above, the API root (``) is listed as `api/v21`. This is the API root used by the [MITRE ATT&CK® TAXII 2.1 Server](https://attack-taxii.mitre.org). We'll use this in subsequent examples. ### Endpoint: Get API Root Information ``` @@ -102,7 +106,7 @@ Example response: { "id": "x-mitre-collection--90c00720-636b-4485-b342-8751d232bf09", "title": "ICS ATT&CK", - "description": "The ATT&CK for Industrial Control Systems (ICS) knowledge base categorizes the unique set of tactics, techniques, and procedures (TTPs) used by threat actors in the ICS technology domain. ATT&CK for ICS outlines the portions of an ICS attack that are out of scope of Enterprise and reflects the various phases of an adversary’s attack life cycle and the assets and systems they are known to target.", + "description": "The ATT&CK for Industrial Control Systems (ICS) knowledge base categorizes the unique set of tactics, techniques, and procedures (TTPs) used by threat actors in the ICS technology domain. ATT&CK for ICS outlines the portions of an ICS attack that are out of scope of Enterprise and reflects the various phases of an adversary's attack life cycle and the assets and systems they are known to target.", "canRead": true, "canWrite": false, "mediaTypes": [ @@ -255,11 +259,56 @@ Example response: GET //collections//objects//versions/ ``` +Returns a list of object versions from a collection. + +Example request: +```bash +curl --request GET \ + --url https://attack-taxii.mitre.org/api/v21/collections/x-mitre-collection--1f5f1533-f617-4ca8-9ab4-6a02367fa019/objects/malware--72f54d66-675d-4587-9bd3-4ed09f9522e4/versions/ \ + --header 'Accept: application/taxii+json;version=2.1' +``` + +Example response: +```json +{ + "more": false, + "versions": [ + "2022-04-25T14:00:00.188Z", + "2023-08-17T19:51:14.195Z" + ] +} +``` + + ### Endpoint: Get Object Manifests ``` GET //collections//manifest/ ``` +Returns manifest information about the contents of a specific collection. + +Example Request: +```bash +curl --request GET \ + --url https://attack-taxii.mitre.org/api/v21/collections/x-mitre-collection--1f5f1533-f617-4ca8-9ab4-6a02367fa019/manifest \ + --header 'Accept: application/taxii+json;version=2.1' +``` + +Example Response: +```json +{ + "more": false, + "objects": [ + { + "id": "attack-pattern--ad255bfe-a9e6-4b52-a258-8d3462abe842", + "date_added": "Wed May 31 2017 21:30:18 GMT+0000 (Coordinated Universal Time)", + "version": "2021-04-29T14:49:39.188Z", + "media_type": "application/stix+taxii;version=2.1" + } + ... + ] +} +``` ## Authentication TAXII 2.1 does not specify an authentication method. It's up to the implementation to provide this. Common methods include Basic Auth and Bearer Tokens. @@ -267,11 +316,19 @@ TAXII 2.1 does not specify an authentication method. It's up to the implementati ## Error Handling If an error occurs, the server will return a HTTP status code in the 400 or 500 range, along with a JSON object containing more information about the error. -## Pagination -The TAXII 2.1 API supports pagination via the limit and next parameters. +## Filtering + +TAXII Clients can request specific content from the TAXII Server by specifying a set of *filters* included in the request to the server. If no URL query parameter is specified then the TAXII Server returns all content for that Endpoint. + +* `added_after`, A single timestamp that filters objects to only include those objects added after the specified timestamp. The value of this parameter is a timestamp. The `added_after` parameter is not in any way related to dates or times in a STIX object or any other CTI object.
**Example**: `?added_after=2022-01-01` + +* `match[]`, The match parameter defines filtering on the specified . The list of fields that MUST be supported is defined per Endpoint. The match parameter can be specified any number of times, where each match instance specifies an additional filter to be applied to the resulting data and each MUST NOT occur more than once in a request. Said another way, all match fields are ANDed together. -## Rate Limiting -Rate limiting is not specified by TAXII 2.1 and is up to the implementation. +**Supported Fields for Match**: -## Conclusion -This guide provides a basic overview of the TAXII 2.1 API. For more detailed information, refer to the official TAXII 2.1 specification.* \ No newline at end of file +| Field | Description | +| -------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `id` | The STIX ID of the object(s) that are being requested.
**Examples**: `?match[id]=indicator--3600ad1b-fff1-4c98-bcc9-4de3bc2e2ffb` | +| `spec_version` | The specification version(s) of the STIX object that are being requested. If no `spec_version` parameter is provided, the server will return only the latest specification version that it can provide for each object.
**Examples**: `?match[spec_version]=2.0`, `?match[spec_version]=2.0,2.1` | +| `type` | The type of the object(s) that are being requested.
**Examples**: `?match[type]=indicator`, `?match[type]=indicator,sighting` | +| `version` | The version(s) of the object(s) that are being requested from either an object or manifest endpoint. If no version parameter is provided, the server will return only the latest version for each object matching the remainder of the request.
**Examples**: `?match[version]=all`, `?match[version]=last,first`, `?match[version]=first,2018-03-02T01:01:01.123Z,last`, `?match[version]=2016-03-23T01:01:01.000Z,2018-03-02T01:01:` | \ No newline at end of file From 045b5f3e6ed47898c03923d845d079b790d57669 Mon Sep 17 00:00:00 2001 From: Sean Sica <23294618+seansica@users.noreply.github.com> Date: Thu, 18 Apr 2024 10:48:40 -0400 Subject: [PATCH 20/28] Optimize the CI pipeline. * Validate git tags as SemVer strings. * Publish on GitHub Release events instead of git tag events. * Update the latest build on pushes to the develop branch. --- .github/workflows/publish.yml | 68 ++++++++++++++--------------------- 1 file changed, 27 insertions(+), 41 deletions(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 1e992cd..5d92c58 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -3,49 +3,35 @@ name: Build and Publish Docker Image on: push: branches: - - "main" - - "develop" - tags: - - "v*.*.*" + - develop + release: + types: [published] jobs: - docker: + publish: runs-on: ubuntu-latest + name: Publish Docker image to container registry steps: - - - name: Checkout + - name: Check out the repo uses: actions/checkout@v3 - - - name: Set Docker Image and Tags - id: meta - uses: docker/metadata-action@v4 - with: - images: | - ghcr.io/mitre-attack/attack-workbench-taxii-server - tags: | - # set latest tag for master branch - type=raw,value=latest,enable=${{ github.ref == format('refs/heads/{0}', 'main') }} - # set develop tag for develop branch - type=ref,event=branch,enable=${{ github.ref == format('refs/heads/{0}', 'develop') }} - # set semver tag (vX.Y.Z) on git tag event - type=semver,pattern=v{{major}}.{{minor}}.{{patch}} - # set git short commit as Docker tag (e.g., sha-ad132f5) - type=sha - - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v2 - - - name: Login to GHCR - if: github.event_name != 'pull_request' - uses: docker/login-action@v2 - with: - registry: ghcr.io - username: ${{ github.repository_owner }} - password: ${{ secrets.GITHUB_TOKEN }} - - - name: Build and push - uses: docker/build-push-action@v4 - with: - context: . - push: ${{ github.event_name != 'pull_request' }} - tags: ${{ steps.meta.outputs.tags }} \ No newline at end of file + + - name: Extract tag name + if: github.event_name == 'release' + run: echo "TAG=${GITHUB_REF#refs/tags/}" >> $GITHUB_ENV + + - name: Validate tag + if: github.event_name == 'release' + run: | + if ! [[ "${{ env.TAG }}" =~ ^[0-9]+\.[0-9]+\.[0-9]+(-[0-9A-Za-z-]+(\.[0-9A-Za-z-]+)*)?$ ]]; then + echo "Invalid tag format. The tag must follow the semantic versioning format: X.Y.Z or X.Y.Z-prerelease" + exit 1 + fi + + - name: Build and publish Docker image + run: | + echo $GITHUB_TOKEN | docker login ghcr.io -u mitre-attack --password-stdin + docker build . --tag ghcr.io/mitre-attack/attack-workbench-taxii-server:${TAG:-latest} + docker push ghcr.io/mitre-attack/attack-workbench-taxii-server:${TAG:-latest} + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + TAG: ${{ env.TAG }} \ No newline at end of file From 565bba4ff69dc369d45cc3995c46d60f4b67e725 Mon Sep 17 00:00:00 2001 From: Sean Sica <23294618+seansica@users.noreply.github.com> Date: Thu, 18 Apr 2024 11:49:18 -0400 Subject: [PATCH 21/28] Refactor match query parameter processing. * Add support for multiple/duplicate match query parameters. Filters passed this way are processed as a logical AND. * Add support for multiple comma-separated values in a match query parameter. Filters passed this way are processed as a logical OR. --- package-lock.json | 1 + src/common/models/match/match.dto.ts | 26 +-- .../pipes/parse-match-query-param.pipe.ts | 15 +- .../collections/collections.controller.ts | 29 ++- .../providers/envelope/envelope.service.ts | 12 +- .../filter/dto/object-filters.dto.ts | 4 +- src/taxii/providers/filter/filter.service.ts | 207 ++++-------------- .../providers/manifest/manifest.service.ts | 4 +- .../providers/version/version.service.ts | 4 +- 9 files changed, 94 insertions(+), 208 deletions(-) diff --git a/package-lock.json b/package-lock.json index b011faf..39cd865 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5,6 +5,7 @@ "requires": true, "packages": { "": { + "name": "attack-workbench-taxii-server", "version": "0.9.0", "license": "Apache-2.0", "dependencies": { diff --git a/src/common/models/match/match.dto.ts b/src/common/models/match/match.dto.ts index a030d25..1676304 100644 --- a/src/common/models/match/match.dto.ts +++ b/src/common/models/match/match.dto.ts @@ -8,46 +8,46 @@ export class MatchDto { @ApiProperty({ description: SWAGGER.Match.Id.Description, required: false, - type: String, + type: [String], }) - @IsString() + @IsString({ each: true }) @IsOptional() @Type(() => String) @Expose() - id?: string; + id?: string[]; @ApiProperty({ description: SWAGGER.Match.Type.Description, required: false, - type: String, + type: [String], }) - @IsString() + @IsString({ each: true }) @IsOptional() @Type(() => String) @Expose() - type?: string; + type?: string[]; @ApiProperty({ description: SWAGGER.Match.Version.Description, required: false, - type: String, + type: [String], }) - @IsString() + @IsString({ each: true }) @IsOptional() @Type(() => String) @Expose() - version?: string; + version?: string[]; @ApiProperty({ description: SWAGGER.Match.SpecVersion.Description, required: false, - type: String, + type: [String], }) - @IsString() + @IsString({ each: true }) @IsOptional() @Type(() => String) @Expose() - spec_version?: string; + spec_version?: string[]; get specVersion() { return this.spec_version; @@ -56,4 +56,4 @@ export class MatchDto { constructor(partial?: Partial) { Object.assign(this, partial); } -} +} \ No newline at end of file diff --git a/src/common/pipes/parse-match-query-param.pipe.ts b/src/common/pipes/parse-match-query-param.pipe.ts index 251834a..b9e27ae 100644 --- a/src/common/pipes/parse-match-query-param.pipe.ts +++ b/src/common/pipes/parse-match-query-param.pipe.ts @@ -8,6 +8,17 @@ import { MatchDto } from "../models/match/match.dto"; export class ParseMatchQueryParamPipe implements PipeTransform { transform(value: any, metadata: ArgumentMetadata) { if (!value) return undefined; - return new MatchDto(value); + + const matchDtos: MatchDto[] = []; + + for (const key in value) { + if (value.hasOwnProperty(key)) { + const values = value[key].split(","); + const matchDto = new MatchDto({ [key]: values }); + matchDtos.push(matchDto); + } + } + + return matchDtos; } -} +} \ No newline at end of file diff --git a/src/taxii/controllers/collections/collections.controller.ts b/src/taxii/controllers/collections/collections.controller.ts index df3b06c..a52f142 100644 --- a/src/taxii/controllers/collections/collections.controller.ts +++ b/src/taxii/controllers/collections/collections.controller.ts @@ -3,6 +3,7 @@ import { Delete, Get, Param, + ParseArrayPipe, Post, Query, UseFilters, @@ -113,16 +114,16 @@ export class CollectionsController { @TimestampQuery("added_after") addedAfter?: string, @NumberQuery("limit") limit?: number, @NumberQuery("next") next?: number, - @MatchQuery("match") match?: MatchDto + @Query("match", ParseArrayPipe, ParseMatchQueryParamPipe) matches?: MatchDto[] ): Promise { this.logger.debug( `Received request for object manifests with options { collectionId: ${collectionId}, addedAfter: ${addedAfter}, limit: ${limit}, next: ${next}, match: ${JSON.stringify( - match + matches )} }`, this.constructor.name ); return await this.manifestService - .getManifestsByCollection(collectionId, addedAfter, limit, next, match) + .getManifestsByCollection(collectionId, addedAfter, limit, next, matches) .then((manifest) => manifest.toJSON()); } @@ -139,14 +140,20 @@ export class CollectionsController { @Query("added_after", ParseTimestampPipe) addedAfter?: string, @NumberQuery("limit") limit?: number, @NumberQuery("next") next?: number, - @Query("match", ParseMatchQueryParamPipe) match?: MatchDto + @Query("match", ParseArrayPipe, ParseMatchQueryParamPipe) matches?: MatchDto[] + /** + * Quick note on the above multi-step pipeline that processes "matches": + * The ParseArrayPipe is used to parse the match query parameter as an array. + * It will automatically split the comma-separated values into an array. + * The ParseMatchQueryParamPipe is then applied to each element of the parsed array to transform it into a MatchDto object. + */ ): Promise { this.logger.debug( - `Received request for objects with options { collectionId: ${collectionId}, addedAfter: ${addedAfter}, limit: ${limit}, next: ${next}, match: ${match} }`, + `Received request for objects with options { collectionId: ${collectionId}, addedAfter: ${addedAfter}, limit: ${limit}, next: ${next}, matches: ${JSON.stringify(matches)} }`, this.constructor.name ); return await this.envelopeService - .findByCollectionId(collectionId, addedAfter, limit, next, match) + .findByCollectionId(collectionId, addedAfter, limit, next, matches) .then((envelope) => envelope.toJSON()); } @@ -164,14 +171,14 @@ export class CollectionsController { @NumberQuery("limit") limit?: number, @NumberQuery("next") next?: number, @Query("added_after", ParseTimestampPipe) addedAfter?: string, - @Query("match", ParseMatchQueryParamPipe) match?: MatchDto + @Query("match", ParseArrayPipe, ParseMatchQueryParamPipe) matches?: MatchDto[] ): Promise { this.logger.debug( `Received request for an object with options { collectionId: ${collectionId}, objectId: ${objectId} }`, this.constructor.name ); return await this.envelopeService - .findByObjectId(collectionId, objectId, addedAfter, limit, next, match) + .findByObjectId(collectionId, objectId, addedAfter, limit, next, matches) .then((envelope) => envelope.toJSON()); } @@ -218,10 +225,10 @@ export class CollectionsController { @Query("added_after", ParseTimestampPipe) addedAfter?: string, @NumberQuery("limit") limit?: number, @NumberQuery("next") next?: number, - @Query("match", ParseMatchQueryParamPipe) match?: MatchDto + @Query("match", ParseArrayPipe, ParseMatchQueryParamPipe) matches?: MatchDto[] ): Promise { this.logger.debug( - `Received request for object versions with options { collectionId: ${collectionId}, objectId: ${objectId}, addedAfter: ${addedAfter}, limit: ${limit}, next: ${next}, match: ${match} }`, + `Received request for object versions with options { collectionId: ${collectionId}, objectId: ${objectId}, addedAfter: ${addedAfter}, limit: ${limit}, next: ${next}, match: ${JSON.stringify(matches)} }`, this.constructor.name ); return this.versionsService @@ -231,7 +238,7 @@ export class CollectionsController { addedAfter, limit, next, - match + matches ) .then((versions) => versions.toJSON()); } diff --git a/src/taxii/providers/envelope/envelope.service.ts b/src/taxii/providers/envelope/envelope.service.ts index 2928b96..476274b 100644 --- a/src/taxii/providers/envelope/envelope.service.ts +++ b/src/taxii/providers/envelope/envelope.service.ts @@ -24,20 +24,20 @@ export class EnvelopeService { * @param addedAfter? All returned STIX objects must have been created before the specified date * @param limit? The total number of returned STIX objects must not exceed the pagination limit * @param next? Refers to the unique envelope ID. Indicates which envelope should be returned. - * @param match? All returned STIX objects must match all of the specified search criteria. + * @param matches? All returned STIX objects must match all of the specified search criteria. */ async findByCollectionId( collectionId: string, addedAfter?: string, limit?: number, next?: number, - match?: MatchDto + matches?: MatchDto[] ): Promise { const filters = new ObjectFiltersDto({ collectionId, addedAfter, limit, - match, + matches, }); // First, get all of the STIX objects. Once acquired, we will paginate them into envelopes. @@ -55,7 +55,7 @@ export class EnvelopeService { * @param addedAfter A single timestamp * @param limit A single integer indicating the maximum number of objects which should be included in the response * @param next - * @param match Contains object filters such as spec_version and type. See the TAXII 2.1 specification for details. + * @param matches? Contains object filters such as spec_version and type. See the TAXII 2.1 specification for details. */ async findByObjectId( collectionId: string, @@ -63,13 +63,13 @@ export class EnvelopeService { addedAfter?: string, limit?: number, next?: number, - match?: MatchDto + matches?: MatchDto[] ): Promise { const filters = new ObjectFiltersDto({ collectionId, addedAfter, limit, - match, + matches, }); const stixObjects: StixObjectPropertiesInterface[] = diff --git a/src/taxii/providers/filter/dto/object-filters.dto.ts b/src/taxii/providers/filter/dto/object-filters.dto.ts index 645d31c..7cb60e8 100644 --- a/src/taxii/providers/filter/dto/object-filters.dto.ts +++ b/src/taxii/providers/filter/dto/object-filters.dto.ts @@ -6,7 +6,7 @@ export interface ObjectFiltersOptions { objectId?: string; addedAfter?: string; limit?: number; - match?: MatchDto; + matches?: MatchDto[]; } export class ObjectFiltersDto { @@ -48,7 +48,7 @@ export class ObjectFiltersDto { * ?match[spec_version]=... */ @Type(() => MatchDto) - match?: MatchDto; + matches?: MatchDto[]; /** * Default constructor diff --git a/src/taxii/providers/filter/filter.service.ts b/src/taxii/providers/filter/filter.service.ts index 1ec47fa..6e6dbad 100644 --- a/src/taxii/providers/filter/filter.service.ts +++ b/src/taxii/providers/filter/filter.service.ts @@ -15,45 +15,52 @@ export class FilterService { stixObject: StixObjectPropertiesInterface, filters: ObjectFiltersDto ): boolean { - const { addedAfter, match } = filters; + const { addedAfter, matches } = filters; // Filter by match[id], match[type], match[version], and match[spec_version] - if (match) { - const { id, type, version, spec_version } = match; + if (matches) { + for (const match of matches) { + const { id, type, version, spec_version } = match; - // check match[id] - if (!this.hasMatchingId(stixObject, id)) { - return false; - } + /** + * For each property, we use the Array.some() method to check if any of the target + * values match the corresponding property of the stixObject. + * + * If none of the target values match, the method returns false, indicating that + * the object does not match the current match instance. + * + * Multiple match instances are treated as an AND condition, while multiple + * values within each match instance are treated as an OR condition, as per the + * TAXII 2.1 specification. + */ - // check match[type] - if (!this.hasMatchingType(stixObject, type)) { - return false; - } + // check match[id] + if (id && !id.some((targetId) => this.hasMatchingId(stixObject, targetId))) { + return false; + } - // check match[version] - if (!this.hasMatchingVersion(stixObject, version)) { - return false; - } + // check match[type] + if (type && !type.some((targetType) => this.hasMatchingType(stixObject, targetType))) { + return false; + } - // check match[spec_version] - if (!this.hasMatchingSpecVersion(stixObject, spec_version)) { - return false; + // check match[version] + if (version && !version.some((targetVersion) => this.hasMatchingVersion(stixObject, targetVersion))) { + return false; + } + + // check match[spec_version] + if (spec_version && !spec_version.some((targetSpecVersion) => this.hasMatchingSpecVersion(stixObject, targetSpecVersion))) { + return false; + } } } - // check added_after (include those objected added after the specified timestamp) - if (addedAfter) { - // if (new Date(stixObject.created).toISOString() <= addedAfter) { - if (new Date(stixObject.created) <= new Date(addedAfter)) { - /** - * We only want to store objects that are *newer* than (i.e., that come before) the added_after - * date. So, we can say that an object should be skipped if it comes before (i.e., is older - * than) then added_after date - */ - return false; - } + // check added_after (include those objects added after the specified timestamp) + if (addedAfter && new Date(stixObject.created) <= new Date(addedAfter)) { + return false; } + return true; } @@ -270,147 +277,7 @@ export class FilterService { ): Promise { return new Promise((resolve, reject) => { if (filters) { - // const { addedAfter, match } = filters; - - // if (match) { - // const { id, type, version, spec_version } = match; - // - // // check match[id] - // if (id) { - // if (stixObject.id !== match.id) { - // return reject( - // `Object (${stixObject.id}) does not match 'id' filter: (${match.id})` - // ); - // } - // } - // - // // check match[type] - // if (type) { - // if (stixObject.type !== match.type) { - // return reject( - // `Object (${stixObject.id}) does not match 'type' filter: (${match.type})` - // ); - // } - // } - // - // // check match[version] - // if (version) { - // if (stixObject.modified) { - // if ( - // new Date(stixObject.modified).toISOString() !== match.version - // ) { - // return reject( - // `Object (${stixObject.id}) does not match 'version' filter: (${match.version})` - // ); - // } - // } else if (stixObject.created) { - // if ( - // new Date(stixObject.created).toISOString() !== match.version - // ) { - // return reject( - // `Object (${stixObject.id}) does not match 'version' filter: (${match.version})` - // ); - // } - // } - // } - // - // if (!this.hasMatchingSpecVersion(stixObject, spec_version)) { - // return reject( - // `Object (${stixObject.spec_version}) does not match 'type' filter: (${match.spec_version})` - // ); - // } - // - // // if (spec_version) { - // // specVersionSwitchStatement: switch (spec_version) { - // // case SPEC_VERSION.V20: { - // // // user requested STIX version 2.0 object(s) - // // if ( - // // // verify that the current object is compliant with STIX 2.0 - // // !this.isCompliantWithSpecVersion(stixObject, spec_version) - // // ) { - // // return reject( - // // `The requested specification version was 2.0 but the current object is a different version` - // // ); // Skip this loop iteration; continue onto the next object - // // } - // // // the object is compliant with STIX 2.0 - // // break specVersionSwitchStatement; // The object passes! - // // } - // // case SPEC_VERSION.V21: { - // // // user requested STIX version 2.1 object(s) - // // if ( - // // // verify that the current object is compliant with STIX 2.1 - // // !this.isCompliantWithSpecVersion(stixObject, spec_version) - // // ) { - // // // the object is NOT compliant with STIX 2.1 - // // return reject( - // // `The requested specification version was 2.1 but the current object is a different version` - // // ); // Skip this loop iteration; continue onto the next object - // // } - // // // the object is compliant with STIX 2.1 - // // break specVersionSwitchStatement; // The object passes! - // // } - // // case SPEC_VERSION.V20_V21: { - // // // user requested STIX version 2.0 AND version 2.1 object(s) - // // // No validation is performed. Assume the object passes because all objects in the DB are either - // // // STIX 2.0 or 2.1 - // // break specVersionSwitchStatement; - // // } - // // case SPEC_VERSION.V21_V20: { - // // // user requested both STIX version 2.0 and version 2.1 object(s) - // // // Assume the object passes because all objects in the DB are either STIX 2.0 or 2.1 - // // break specVersionSwitchStatement; - // // } - // // default: { - // // // user requested an unsupported or invalid version. nothing to check; just reject it. - // // return reject( - // // "The requested specification version is unsupported or invalid" - // // ); - // // } - // // } - // // } - // // // else clause will trigger if user did not pass a spec_version filter - // // else { - // // /** - // // * If no spec_version parameter is provided, the server MUST return only the latest specification version - // // * that it can provide for each object matching the remainder of the request. - // // */ - // // - // // /** - // // * IMPORTANT NOTE: For ATT&CK Workbench TAXII 2.1 release 1.0, the default behavior mentioned above is - // // * being overridden. Instead, when no spec_version parameter is provided, the server will return the 2.0 - // // * specification version of the requested object(s). This is a temporary measure to provide relief for users - // // * that are currently using the Unfetter TAXII 2.0 server (located at cti-taxii.mitre.org) and expect - // // * STIX 2.0 objects to be returned by default. This grace period is temporary and the default expected - // // * TAXII 2.1 behavior will be restored on a later ATT&CK Workbench TAXII 2.1 version release. - // // */ - // // if ( - // // !this.isCompliantWithSpecVersion( - // // stixObject, - // // SPEC_VERSION.DEFAULT_UNSPECIFIED - // // ) - // // ) { - // // return reject( - // // `No 'specVersion' parameter is provided. Object ${stixObject.id} is not the latest specification version.` - // // ); - // // } - // // } - // } - // - // if (addedAfter) { - // // if (new Date(stixObject.created).toISOString() <= addedAfter) { - // if (Date.parse(stixObject.created) <= Date.parse(addedAfter)) { - // /** - // * We only want to store objects that are *newer* than (i.e., that come before) the added_after - // * date. So, we can say that an object should be skipped if it comes before (i.e., is older - // * than) then added_after date - // */ - // // this.logger.debug(`Skipping current object (created ${currObject.created}) B/C it is older than added_after (${added_after})`, this.constructor.name); - // return reject( - // `Object (${stixObject.id}) was not added after: ${addedAfter}` - // ); - // } - // } - // // All checks passed! Store the object to return! + // All checks passed! Store the object to return! if (!this.isMatch(stixObject, filters)) { return reject( `STIX object with ID ${stixObject.id} did not meet one or more search filters` diff --git a/src/taxii/providers/manifest/manifest.service.ts b/src/taxii/providers/manifest/manifest.service.ts index af68284..3a48438 100644 --- a/src/taxii/providers/manifest/manifest.service.ts +++ b/src/taxii/providers/manifest/manifest.service.ts @@ -22,13 +22,13 @@ export class ManifestService { addedAfter?: string, limit?: number, next?: number, - match?: MatchDto + matches?: MatchDto[] ): Promise { const searchFilters = new ObjectFiltersDto({ collectionId, addedAfter, limit, - match, + matches, }); // First, get all of the STIX objects. Once acquired, we will paginate them into envelopes. diff --git a/src/taxii/providers/version/version.service.ts b/src/taxii/providers/version/version.service.ts index 320c06e..4372a56 100644 --- a/src/taxii/providers/version/version.service.ts +++ b/src/taxii/providers/version/version.service.ts @@ -23,14 +23,14 @@ export class VersionService { addedAfter?: string, limit?: number, next?: number, - match?: MatchDto + matches?: MatchDto[] ) { const filters = new ObjectFiltersDto({ collectionId, objectId, addedAfter, limit, - match, + matches, }); // Hard-code filter DTO to retrieve all available versions of the target object From 54f362bc0434de89c92c67da000a423ae57e1d7b Mon Sep 17 00:00:00 2001 From: Sean Sica <23294618+seansica@users.noreply.github.com> Date: Tue, 23 Apr 2024 08:02:47 -0400 Subject: [PATCH 22/28] Change default HTTP listener port to 5002 --- src/config/defaults.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/config/defaults.ts b/src/config/defaults.ts index 483970e..2f12fd5 100644 --- a/src/config/defaults.ts +++ b/src/config/defaults.ts @@ -1,6 +1,6 @@ export const DEFAULT_ENV = "dev"; export const DEFAULT_APP_ADDRESS = "0.0.0.0"; -export const DEFAULT_APP_PORT = 5000; +export const DEFAULT_APP_PORT = 5002; export const DEFAULT_MAX_CONTENT_LENGTH = 1000; export const DEFAULT_API_ROOT_PATH = "api/v21"; export const DEFAULT_API_ROOT_TITLE = "MITRE ATT&CK TAXII 2.1"; From 07e7ec609c388519faa2cd2889116146144d4e74 Mon Sep 17 00:00:00 2001 From: Sean Sica <23294618+seansica@users.noreply.github.com> Date: Tue, 23 Apr 2024 08:11:04 -0400 Subject: [PATCH 23/28] Remove unused dependencies --- package-lock.json | 1042 ++++++++++++++++++++++++++------------------- package.json | 8 +- 2 files changed, 597 insertions(+), 453 deletions(-) diff --git a/package-lock.json b/package-lock.json index 39cd865..c69789e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -18,18 +18,12 @@ "@nestjs/platform-express": "^8.4.7", "@nestjs/schedule": "^1.1.0", "@nestjs/swagger": "^5.1.5", - "@types/cache-manager": "^3.4.2", "@types/object-hash": "^2.2.1", "@types/uuid": "^8.3.4", - "axios": "^0.24.0", - "cache-manager": "^4.1.0", - "cache-manager-memcached-store": "^4.0.0", "class-transformer": "^0.5.1", "class-validator": "^0.13.2", - "dotenv": "^16.0.1", "json-stringify-safe": "^5.0.1", "lodash": "^4.17.21", - "memcache-plus": "^0.2.23", "mongoose": "^6.5.1", "nest-winston": "^1.6.2", "object-hash": "^2.2.0", @@ -38,7 +32,7 @@ "rxjs": "^7.2.0", "swagger-ui-express": "^4.3.0", "uuid": "^8.3.2", - "webpack": "^5.74.0", + "webpack": "^5.91.0", "winston": "^3.6.0", "winston-slack-webhook-transport": "^2.1.0", "winston-transport-sentry-node": "^2.3.0" @@ -1265,55 +1259,55 @@ } }, "node_modules/@jridgewell/resolve-uri": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.7.tgz", - "integrity": "sha512-8cXDaBBHOr2pQ7j77Y6Vp5VDT2sIqWyWQ56TjEq4ih/a4iST3dItRe8Q9fp0rrIl9DoKhWQtUQz/YpOxLkXbNA==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/set-array": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.1.tgz", - "integrity": "sha512-Ct5MqZkLGEXTVmQYbGtx9SVqD2fqwvdubdps5D3djjAkgkKwT918VNOz65pEHFaYTeWcukmJmH5SwsA9Tn2ObQ==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/source-map": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz", - "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==", + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", + "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" } }, "node_modules/@jridgewell/source-map/node_modules/@jridgewell/gen-mapping": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.1.tgz", - "integrity": "sha512-GcHwniMlA2z+WFPWuY8lp3fsza0I8xPFMWL5+n8LYyP6PSvPrXf4+n8stDHZY2DM0zy9sVkRDy1jDI4XGzYVqg==", + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", "dependencies": { - "@jridgewell/set-array": "^1.0.0", + "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" + "@jridgewell/trace-mapping": "^0.3.24" }, "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.13", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.13.tgz", - "integrity": "sha512-GryiOJmNcWbovBxTfZSF71V/mXbgcV3MewDe3kIMCLyIh5e7SKAeUZs+rMnJ8jkMolZ/4/VsdBmMrw3l+VdZ3w==" + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.13", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.13.tgz", - "integrity": "sha512-o1xbKhp9qnIAoHJSWd6KlCZfqslL4valSF81H8ImioOAxluWYWOpWkpyktY2vnt4tbrX9XYaxovq6cgowaJp2w==", + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" } }, "node_modules/@nestjs/axios": { @@ -1835,11 +1829,6 @@ "@types/node": "*" } }, - "node_modules/@types/cache-manager": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/@types/cache-manager/-/cache-manager-3.4.3.tgz", - "integrity": "sha512-71aBXoFYXZW4TnDHHH8gExw2lS28BZaWeKefgsiJI7QYZeJfUEbMKw6CQtzGjlYQcGIWwB76hcCrkVA3YHSvsw==" - }, "node_modules/@types/connect": { "version": "3.4.35", "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", @@ -2221,6 +2210,7 @@ "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==", + "dev": true, "dependencies": { "@webassemblyjs/helper-numbers": "1.11.1", "@webassemblyjs/helper-wasm-bytecode": "1.11.1" @@ -2229,22 +2219,26 @@ "node_modules/@webassemblyjs/floating-point-hex-parser": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz", - "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==" + "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==", + "dev": true }, "node_modules/@webassemblyjs/helper-api-error": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz", - "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==" + "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==", + "dev": true }, "node_modules/@webassemblyjs/helper-buffer": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz", - "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==" + "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==", + "dev": true }, "node_modules/@webassemblyjs/helper-numbers": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz", "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==", + "dev": true, "dependencies": { "@webassemblyjs/floating-point-hex-parser": "1.11.1", "@webassemblyjs/helper-api-error": "1.11.1", @@ -2254,12 +2248,14 @@ "node_modules/@webassemblyjs/helper-wasm-bytecode": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz", - "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==" + "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==", + "dev": true }, "node_modules/@webassemblyjs/helper-wasm-section": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz", "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==", + "dev": true, "dependencies": { "@webassemblyjs/ast": "1.11.1", "@webassemblyjs/helper-buffer": "1.11.1", @@ -2271,6 +2267,7 @@ "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz", "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==", + "dev": true, "dependencies": { "@xtuc/ieee754": "^1.2.0" } @@ -2279,6 +2276,7 @@ "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz", "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==", + "dev": true, "dependencies": { "@xtuc/long": "4.2.2" } @@ -2286,12 +2284,14 @@ "node_modules/@webassemblyjs/utf8": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz", - "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==" + "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==", + "dev": true }, "node_modules/@webassemblyjs/wasm-edit": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz", "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==", + "dev": true, "dependencies": { "@webassemblyjs/ast": "1.11.1", "@webassemblyjs/helper-buffer": "1.11.1", @@ -2307,6 +2307,7 @@ "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz", "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==", + "dev": true, "dependencies": { "@webassemblyjs/ast": "1.11.1", "@webassemblyjs/helper-wasm-bytecode": "1.11.1", @@ -2319,6 +2320,7 @@ "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz", "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==", + "dev": true, "dependencies": { "@webassemblyjs/ast": "1.11.1", "@webassemblyjs/helper-buffer": "1.11.1", @@ -2330,6 +2332,7 @@ "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz", "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==", + "dev": true, "dependencies": { "@webassemblyjs/ast": "1.11.1", "@webassemblyjs/helper-api-error": "1.11.1", @@ -2343,6 +2346,7 @@ "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz", "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==", + "dev": true, "dependencies": { "@webassemblyjs/ast": "1.11.1", "@xtuc/long": "4.2.2" @@ -2377,9 +2381,9 @@ } }, "node_modules/acorn": { - "version": "8.7.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.1.tgz", - "integrity": "sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==", + "version": "8.11.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", + "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", "bin": { "acorn": "bin/acorn" }, @@ -2410,9 +2414,12 @@ } }, "node_modules/acorn-import-assertions": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", - "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==" + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", + "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", + "peerDependencies": { + "acorn": "^8" + } }, "node_modules/acorn-jsx": { "version": "5.3.2", @@ -2580,14 +2587,6 @@ "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" }, - "node_modules/axios": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.24.0.tgz", - "integrity": "sha512-Q6cWsys88HoPgAaFAVUb0WpPk0O8iTeisR9IMqy9G8AbO4NlpVknrnQS03zzF9PGAWgO3cgletO3VjV/P7VztA==", - "dependencies": { - "follow-redirects": "^1.14.4" - } - }, "node_modules/babel-jest": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-27.5.1.tgz", @@ -2737,11 +2736,6 @@ "safe-buffer": "~5.2.0" } }, - "node_modules/bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" - }, "node_modules/body-parser": { "version": "1.20.0", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.0.tgz", @@ -2806,15 +2800,28 @@ "dev": true }, "node_modules/browserslist": { - "version": "4.20.4", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.4.tgz", - "integrity": "sha512-ok1d+1WpnU24XYN7oC3QWgTyMhY/avPJ/r9T00xxvUOIparA/gc+UPUMaod3i+G6s+nI2nUb9xZ5k794uIwShw==", + "version": "4.23.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz", + "integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], "dependencies": { - "caniuse-lite": "^1.0.30001349", - "electron-to-chromium": "^1.4.147", - "escalade": "^3.1.1", - "node-releases": "^2.0.5", - "picocolors": "^1.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" @@ -2897,29 +2904,6 @@ "node": ">= 0.8" } }, - "node_modules/cache-manager": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cache-manager/-/cache-manager-4.1.0.tgz", - "integrity": "sha512-ZGM6dLxrP65bfOZmcviWMadUOCICqpLs92+P/S5tj8onz+k+tB7Gr+SAgOUHCQtfm2gYEQDHiKeul4+tYPOJ8A==", - "dependencies": { - "async": "3.2.3", - "lodash.clonedeep": "^4.5.0", - "lru-cache": "^7.10.1" - } - }, - "node_modules/cache-manager-memcached-store": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cache-manager-memcached-store/-/cache-manager-memcached-store-4.0.0.tgz", - "integrity": "sha512-Lv1WMaRC1FQHHqxE8Xbi7YWInhgfxjOmLEE6u1K0A3Rwmq+XRLyekKDM7aW9WIzF+PuII/RDKqBK/Ezo5H2QVw==" - }, - "node_modules/cache-manager/node_modules/lru-cache": { - "version": "7.13.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.13.1.tgz", - "integrity": "sha512-CHqbAq7NFlW3RSnoWXLJBxCWaZVBrfa9UEHId2M3AW8iEBurbqduNexEUCGc3SHc6iCYXNJCDi903LajSVAEPQ==", - "engines": { - "node": ">=12" - } - }, "node_modules/call-bind": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", @@ -2948,17 +2932,23 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001350", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001350.tgz", - "integrity": "sha512-NZBql38Pzd+rAu5SPXv+qmTWGQuFsRiemHCJCAPvkoDxWV19/xqL2YHF32fDJ9SDLdLqfax8+S0CO3ncDCp9Iw==" - }, - "node_modules/carrier": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/carrier/-/carrier-0.3.0.tgz", - "integrity": "sha512-G0Unz6R11Pdg/9N0qr5muv5ZOF2+oe3WH7i6eiClSd5kozdY5a2nKFfGOTajhoM1vioaAfbnj2RnRQFUDyb9Mw==", - "engines": { - "node": ">=0.3.0" - } + "version": "1.0.30001612", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001612.tgz", + "integrity": "sha512-lFgnZ07UhaCcsSZgWW0K5j4e69dK1u/ltrL9lTUiFOwNHs12S3UMIEYgBV0Z6C6hRDev7iRnMzzYmKabYdXF9g==", + "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/chalk": { "version": "3.0.0", @@ -3244,11 +3234,6 @@ "typedarray": "^0.0.6" } }, - "node_modules/connection-parse": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/connection-parse/-/connection-parse-0.0.7.tgz", - "integrity": "sha512-bTTG28diWg7R7/+qE5NZumwPbCiJOT8uPdZYu674brDjBWQctbaQbYlDKhalS+4i5HxIx+G8dZsnBHKzWpp01A==" - }, "node_modules/consola": { "version": "2.15.3", "resolved": "https://registry.npmjs.org/consola/-/consola-2.15.3.tgz", @@ -3577,14 +3562,6 @@ "node": ">=8" } }, - "node_modules/dotenv": { - "version": "16.0.1", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.1.tgz", - "integrity": "sha512-1K6hR6wtk2FviQ4kEiSjFiH5rpzEVi8WW0x96aztHVMhEspNpc4DVOUTEHtEva5VThQ8IaBX1Pe4gSzpVVUsKQ==", - "engines": { - "node": ">=12" - } - }, "node_modules/dotenv-expand": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-5.1.0.tgz", @@ -3596,9 +3573,9 @@ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" }, "node_modules/electron-to-chromium": { - "version": "1.4.148", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.148.tgz", - "integrity": "sha512-8MJk1bcQUAYkuvCyWZxaldiwoDG0E0AMzBGA6cv3WfuvJySiPgfidEPBFCRRH3cZm6SVZwo/oRlK1ehi1QNEIQ==" + "version": "1.4.746", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.746.tgz", + "integrity": "sha512-jeWaIta2rIG2FzHaYIhSuVWqC6KJYo7oSBX4Jv7g+aVujKztfvdpf+n6MGwZdC5hQXbax4nntykLH2juIQrfPg==" }, "node_modules/emittery": { "version": "0.8.1", @@ -3638,10 +3615,9 @@ } }, "node_modules/enhanced-resolve": { - "version": "5.9.3", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.9.3.tgz", - "integrity": "sha512-Bq9VSor+kjvW3f9/MiiR4eE3XYgOl7/rS8lnSxbRbF3kS0B2r+Y9w5krBWxZgDxASVZbdYrn5wT4j/Wb0J9qow==", - "dev": true, + "version": "5.16.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.16.0.tgz", + "integrity": "sha512-O+QWCviPNSSLAD9Ucn8Awv+poAkqn3T1XY5/N7kR7rQO9yfSGWkYZDwpJ+iKF7B8rxaQKWngSqACpgzeapSyoA==", "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.2.0" @@ -3662,7 +3638,8 @@ "node_modules/es-module-lexer": { "version": "0.9.3", "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", - "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==" + "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==", + "dev": true }, "node_modules/es5-ext": { "version": "0.10.61", @@ -4712,9 +4689,9 @@ } }, "node_modules/graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" }, "node_modules/has": { "version": "1.0.3", @@ -4743,15 +4720,6 @@ "node": ">= 0.4" } }, - "node_modules/hashring": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/hashring/-/hashring-3.2.0.tgz", - "integrity": "sha512-xCMovURClsQZ+TR30icCZj+34Fq1hs0y6YCASD6ZqdRfYRybb5Iadws2WS+w09mGM/kf9xyA5FCdJQGcgcraSA==", - "dependencies": { - "connection-parse": "0.0.x", - "simple-lru-cache": "0.0.x" - } - }, "node_modules/hexoid": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/hexoid/-/hexoid-1.0.0.tgz", @@ -4854,14 +4822,6 @@ "node": ">= 4" } }, - "node_modules/immutable": { - "version": "3.8.2", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-3.8.2.tgz", - "integrity": "sha512-15gZoQ38eYjEjxkorfbcgBKBL6R7T459OuK+CpcWt7O3KF4uPCx2tD0uFETlUDIyo+1789crbMhTvQBSR5yBMg==", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/import-fresh": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", @@ -6175,11 +6135,6 @@ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, - "node_modules/lodash.clonedeep": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", - "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==" - }, "node_modules/lodash.memoize": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", @@ -6329,33 +6284,6 @@ "node": ">= 0.6" } }, - "node_modules/memcache-plus": { - "version": "0.2.23", - "resolved": "https://registry.npmjs.org/memcache-plus/-/memcache-plus-0.2.23.tgz", - "integrity": "sha512-Txk6RnVaSVGduYvcu0CKepMywSB7Sz49aT/u5wPkMQJSj/izp++GRGy52ft4QHuNLirGm5GFrWgpcIAVoWc1aw==", - "dependencies": { - "bluebird": "^3.4.1", - "carrier": "^0.3.0", - "debug": "^2.2.0", - "hashring": "^3.2.0", - "immutable": "^3.8.1", - "lodash": "^4.14.0", - "ramda": "^0.24.1" - } - }, - "node_modules/memcache-plus/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/memcache-plus/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, "node_modules/memfs": { "version": "3.4.4", "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.4.4.tgz", @@ -6814,9 +6742,9 @@ "dev": true }, "node_modules/node-releases": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.5.tgz", - "integrity": "sha512-U9h1NLROZTq9uE1SNffn6WuPDg8icmi3ns4rEl/oTfIle4iLjTliCzgTsbaIFMq/Xn078/lfY/BL0GWZ+psK4Q==" + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", + "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==" }, "node_modules/normalize-path": { "version": "3.0.0", @@ -7274,11 +7202,6 @@ "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", "dev": true }, - "node_modules/ramda": { - "version": "0.24.1", - "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.24.1.tgz", - "integrity": "sha512-HEm619G8PaZMfkqCa23qiOe7r3R0brPu7ZgOsgKUsnvLhd0qhc/vTjkUovomgPWa5ECBa08fJZixth9LaoBo5w==" - }, "node_modules/randombytes": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", @@ -7546,9 +7469,9 @@ } }, "node_modules/schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", "dependencies": { "@types/json-schema": "^7.0.8", "ajv": "^6.12.5", @@ -7556,6 +7479,10 @@ }, "engines": { "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" } }, "node_modules/schema-utils/node_modules/ajv": { @@ -7636,9 +7563,9 @@ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" }, "node_modules/serialize-javascript": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", - "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", "dependencies": { "randombytes": "^2.1.0" } @@ -7721,11 +7648,6 @@ "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", "dev": true }, - "node_modules/simple-lru-cache": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/simple-lru-cache/-/simple-lru-cache-0.0.2.tgz", - "integrity": "sha512-uEv/AFO0ADI7d99OHDmh1QfYzQk/izT1vCmu/riQfh7qjBVUUgRT87E5s5h7CxWCA/+YoZerykpEthzVrW3LIw==" - }, "node_modules/simple-swizzle": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", @@ -8147,12 +8069,12 @@ } }, "node_modules/terser": { - "version": "5.14.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.14.0.tgz", - "integrity": "sha512-JC6qfIEkPBd9j1SMO3Pfn+A6w2kQV54tv+ABQLgZr7dA3k/DL/OBoYSWxzVpZev3J+bUHXfr55L8Mox7AaNo6g==", + "version": "5.30.4", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.30.4.tgz", + "integrity": "sha512-xRdd0v64a8mFK9bnsKVdoNP9GQIKUAaJPTaqEQDL4w/J8WaW4sWXXoMZ+6SimPkfT5bElreXf8m9HnmPc3E1BQ==", "dependencies": { - "@jridgewell/source-map": "^0.3.2", - "acorn": "^8.5.0", + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", "commander": "^2.20.0", "source-map-support": "~0.5.20" }, @@ -8164,18 +8086,36 @@ } }, "node_modules/terser-webpack-plugin": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.3.tgz", - "integrity": "sha512-Fx60G5HNYknNTNQnzQ1VePRuu89ZVYWfjRAeT5rITuCY/1b08s49e5kSQwHDirKZWuoKOBRFS98EUUoZ9kLEwQ==", + "version": "5.3.10", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz", + "integrity": "sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==", "dependencies": { - "@jridgewell/trace-mapping": "^0.3.7", + "@jridgewell/trace-mapping": "^0.3.20", "jest-worker": "^27.4.5", "schema-utils": "^3.1.1", - "serialize-javascript": "^6.0.0", - "terser": "^5.7.2" + "serialize-javascript": "^6.0.1", + "terser": "^5.26.0" }, "engines": { "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "uglify-js": { + "optional": true + } } }, "node_modules/terser/node_modules/commander": { @@ -8584,6 +8524,35 @@ "node": ">= 0.8" } }, + "node_modules/update-browserslist-db": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", + "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, "node_modules/uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", @@ -8686,9 +8655,9 @@ } }, "node_modules/watchpack": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", - "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.1.tgz", + "integrity": "sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg==", "dependencies": { "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.1.2" @@ -8716,33 +8685,33 @@ } }, "node_modules/webpack": { - "version": "5.74.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.74.0.tgz", - "integrity": "sha512-A2InDwnhhGN4LYctJj6M1JEaGL7Luj6LOmyBHjcI8529cm5p6VXiTIW2sn6ffvEAKmveLzvu4jrihwXtPojlAA==", + "version": "5.91.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.91.0.tgz", + "integrity": "sha512-rzVwlLeBWHJbmgTC/8TvAcu5vpJNII+MelQpylD4jNERPwpBJOE2lEcko1zJX3QJeLjTTAnQxn/OJ8bjDzVQaw==", "dependencies": { "@types/eslint-scope": "^3.7.3", - "@types/estree": "^0.0.51", - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/wasm-edit": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", + "@types/estree": "^1.0.5", + "@webassemblyjs/ast": "^1.12.1", + "@webassemblyjs/wasm-edit": "^1.12.1", + "@webassemblyjs/wasm-parser": "^1.12.1", "acorn": "^8.7.1", - "acorn-import-assertions": "^1.7.6", - "browserslist": "^4.14.5", + "acorn-import-assertions": "^1.9.0", + "browserslist": "^4.21.10", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.10.0", - "es-module-lexer": "^0.9.0", + "enhanced-resolve": "^5.16.0", + "es-module-lexer": "^1.2.1", "eslint-scope": "5.1.1", "events": "^3.2.0", "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.9", + "graceful-fs": "^4.2.11", "json-parse-even-better-errors": "^2.3.1", "loader-runner": "^4.2.0", "mime-types": "^2.1.27", "neo-async": "^2.6.2", - "schema-utils": "^3.1.0", + "schema-utils": "^3.2.0", "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.1.3", - "watchpack": "^2.4.0", + "terser-webpack-plugin": "^5.3.10", + "watchpack": "^2.4.1", "webpack-sources": "^3.2.3" }, "bin": { @@ -8750,6 +8719,15 @@ }, "engines": { "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } } }, "node_modules/webpack-node-externals": { @@ -8769,18 +8747,147 @@ "node": ">=10.13.0" } }, - "node_modules/webpack/node_modules/enhanced-resolve": { - "version": "5.10.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.10.0.tgz", - "integrity": "sha512-T0yTFjdpldGY8PmuXXR0PyQ1ufZpEGiHVrp7zHKB7jdR4qlmZHhONVM5AQOAWXuF/w3dnHbEQVrNptJgt7F+cQ==", + "node_modules/webpack/node_modules/@types/estree": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==" + }, + "node_modules/webpack/node_modules/@webassemblyjs/ast": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.12.1.tgz", + "integrity": "sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==", + "dependencies": { + "@webassemblyjs/helper-numbers": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6" + } + }, + "node_modules/webpack/node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", + "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==" + }, + "node_modules/webpack/node_modules/@webassemblyjs/helper-api-error": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", + "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==" + }, + "node_modules/webpack/node_modules/@webassemblyjs/helper-buffer": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.12.1.tgz", + "integrity": "sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==" + }, + "node_modules/webpack/node_modules/@webassemblyjs/helper-numbers": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", + "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", "dependencies": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" - }, - "engines": { - "node": ">=10.13.0" + "@webassemblyjs/floating-point-hex-parser": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/webpack/node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", + "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==" + }, + "node_modules/webpack/node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.12.1.tgz", + "integrity": "sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==", + "dependencies": { + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/wasm-gen": "1.12.1" + } + }, + "node_modules/webpack/node_modules/@webassemblyjs/ieee754": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", + "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/webpack/node_modules/@webassemblyjs/leb128": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", + "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", + "dependencies": { + "@xtuc/long": "4.2.2" } }, + "node_modules/webpack/node_modules/@webassemblyjs/utf8": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", + "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==" + }, + "node_modules/webpack/node_modules/@webassemblyjs/wasm-edit": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.12.1.tgz", + "integrity": "sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==", + "dependencies": { + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/helper-wasm-section": "1.12.1", + "@webassemblyjs/wasm-gen": "1.12.1", + "@webassemblyjs/wasm-opt": "1.12.1", + "@webassemblyjs/wasm-parser": "1.12.1", + "@webassemblyjs/wast-printer": "1.12.1" + } + }, + "node_modules/webpack/node_modules/@webassemblyjs/wasm-gen": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.12.1.tgz", + "integrity": "sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==", + "dependencies": { + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" + } + }, + "node_modules/webpack/node_modules/@webassemblyjs/wasm-opt": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.12.1.tgz", + "integrity": "sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==", + "dependencies": { + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/wasm-gen": "1.12.1", + "@webassemblyjs/wasm-parser": "1.12.1" + } + }, + "node_modules/webpack/node_modules/@webassemblyjs/wasm-parser": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.12.1.tgz", + "integrity": "sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==", + "dependencies": { + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-api-error": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" + } + }, + "node_modules/webpack/node_modules/@webassemblyjs/wast-printer": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.12.1.tgz", + "integrity": "sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==", + "dependencies": { + "@webassemblyjs/ast": "1.12.1", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/webpack/node_modules/es-module-lexer": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.0.tgz", + "integrity": "sha512-pqrTKmwEIgafsYZAGw9kszYzmagcE/n4dbgwGWLEXg7J4QFJVQRBld8j3Q3GNez79jzxZshq0bcT962QHOghjw==" + }, "node_modules/whatwg-encoding": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", @@ -10138,48 +10245,48 @@ } }, "@jridgewell/resolve-uri": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.7.tgz", - "integrity": "sha512-8cXDaBBHOr2pQ7j77Y6Vp5VDT2sIqWyWQ56TjEq4ih/a4iST3dItRe8Q9fp0rrIl9DoKhWQtUQz/YpOxLkXbNA==" + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==" }, "@jridgewell/set-array": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.1.tgz", - "integrity": "sha512-Ct5MqZkLGEXTVmQYbGtx9SVqD2fqwvdubdps5D3djjAkgkKwT918VNOz65pEHFaYTeWcukmJmH5SwsA9Tn2ObQ==" + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==" }, "@jridgewell/source-map": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz", - "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==", + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", + "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", "requires": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" }, "dependencies": { "@jridgewell/gen-mapping": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.1.tgz", - "integrity": "sha512-GcHwniMlA2z+WFPWuY8lp3fsza0I8xPFMWL5+n8LYyP6PSvPrXf4+n8stDHZY2DM0zy9sVkRDy1jDI4XGzYVqg==", + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", "requires": { - "@jridgewell/set-array": "^1.0.0", + "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" + "@jridgewell/trace-mapping": "^0.3.24" } } } }, "@jridgewell/sourcemap-codec": { - "version": "1.4.13", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.13.tgz", - "integrity": "sha512-GryiOJmNcWbovBxTfZSF71V/mXbgcV3MewDe3kIMCLyIh5e7SKAeUZs+rMnJ8jkMolZ/4/VsdBmMrw3l+VdZ3w==" + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" }, "@jridgewell/trace-mapping": { - "version": "0.3.13", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.13.tgz", - "integrity": "sha512-o1xbKhp9qnIAoHJSWd6KlCZfqslL4valSF81H8ImioOAxluWYWOpWkpyktY2vnt4tbrX9XYaxovq6cgowaJp2w==", + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", "requires": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" } }, "@nestjs/axios": { @@ -10651,11 +10758,6 @@ "@types/node": "*" } }, - "@types/cache-manager": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/@types/cache-manager/-/cache-manager-3.4.3.tgz", - "integrity": "sha512-71aBXoFYXZW4TnDHHH8gExw2lS28BZaWeKefgsiJI7QYZeJfUEbMKw6CQtzGjlYQcGIWwB76hcCrkVA3YHSvsw==" - }, "@types/connect": { "version": "3.4.35", "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", @@ -11013,6 +11115,7 @@ "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==", + "dev": true, "requires": { "@webassemblyjs/helper-numbers": "1.11.1", "@webassemblyjs/helper-wasm-bytecode": "1.11.1" @@ -11021,22 +11124,26 @@ "@webassemblyjs/floating-point-hex-parser": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz", - "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==" + "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==", + "dev": true }, "@webassemblyjs/helper-api-error": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz", - "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==" + "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==", + "dev": true }, "@webassemblyjs/helper-buffer": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz", - "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==" + "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==", + "dev": true }, "@webassemblyjs/helper-numbers": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz", "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==", + "dev": true, "requires": { "@webassemblyjs/floating-point-hex-parser": "1.11.1", "@webassemblyjs/helper-api-error": "1.11.1", @@ -11046,12 +11153,14 @@ "@webassemblyjs/helper-wasm-bytecode": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz", - "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==" + "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==", + "dev": true }, "@webassemblyjs/helper-wasm-section": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz", "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==", + "dev": true, "requires": { "@webassemblyjs/ast": "1.11.1", "@webassemblyjs/helper-buffer": "1.11.1", @@ -11063,6 +11172,7 @@ "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz", "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==", + "dev": true, "requires": { "@xtuc/ieee754": "^1.2.0" } @@ -11071,6 +11181,7 @@ "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz", "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==", + "dev": true, "requires": { "@xtuc/long": "4.2.2" } @@ -11078,12 +11189,14 @@ "@webassemblyjs/utf8": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz", - "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==" + "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==", + "dev": true }, "@webassemblyjs/wasm-edit": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz", "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==", + "dev": true, "requires": { "@webassemblyjs/ast": "1.11.1", "@webassemblyjs/helper-buffer": "1.11.1", @@ -11099,6 +11212,7 @@ "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz", "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==", + "dev": true, "requires": { "@webassemblyjs/ast": "1.11.1", "@webassemblyjs/helper-wasm-bytecode": "1.11.1", @@ -11111,6 +11225,7 @@ "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz", "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==", + "dev": true, "requires": { "@webassemblyjs/ast": "1.11.1", "@webassemblyjs/helper-buffer": "1.11.1", @@ -11122,6 +11237,7 @@ "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz", "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==", + "dev": true, "requires": { "@webassemblyjs/ast": "1.11.1", "@webassemblyjs/helper-api-error": "1.11.1", @@ -11135,6 +11251,7 @@ "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz", "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==", + "dev": true, "requires": { "@webassemblyjs/ast": "1.11.1", "@xtuc/long": "4.2.2" @@ -11166,9 +11283,9 @@ } }, "acorn": { - "version": "8.7.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.1.tgz", - "integrity": "sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==" + "version": "8.11.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", + "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==" }, "acorn-globals": { "version": "6.0.0", @@ -11189,9 +11306,10 @@ } }, "acorn-import-assertions": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", - "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==" + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", + "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", + "requires": {} }, "acorn-jsx": { "version": "5.3.2", @@ -11334,14 +11452,6 @@ "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" }, - "axios": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.24.0.tgz", - "integrity": "sha512-Q6cWsys88HoPgAaFAVUb0WpPk0O8iTeisR9IMqy9G8AbO4NlpVknrnQS03zzF9PGAWgO3cgletO3VjV/P7VztA==", - "requires": { - "follow-redirects": "^1.14.4" - } - }, "babel-jest": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-27.5.1.tgz", @@ -11474,11 +11584,6 @@ } } }, - "bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" - }, "body-parser": { "version": "1.20.0", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.0.tgz", @@ -11538,15 +11643,14 @@ "dev": true }, "browserslist": { - "version": "4.20.4", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.4.tgz", - "integrity": "sha512-ok1d+1WpnU24XYN7oC3QWgTyMhY/avPJ/r9T00xxvUOIparA/gc+UPUMaod3i+G6s+nI2nUb9xZ5k794uIwShw==", + "version": "4.23.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz", + "integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==", "requires": { - "caniuse-lite": "^1.0.30001349", - "electron-to-chromium": "^1.4.147", - "escalade": "^3.1.1", - "node-releases": "^2.0.5", - "picocolors": "^1.0.0" + "caniuse-lite": "^1.0.30001587", + "electron-to-chromium": "^1.4.668", + "node-releases": "^2.0.14", + "update-browserslist-db": "^1.0.13" } }, "bs-logger": { @@ -11608,28 +11712,6 @@ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" }, - "cache-manager": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cache-manager/-/cache-manager-4.1.0.tgz", - "integrity": "sha512-ZGM6dLxrP65bfOZmcviWMadUOCICqpLs92+P/S5tj8onz+k+tB7Gr+SAgOUHCQtfm2gYEQDHiKeul4+tYPOJ8A==", - "requires": { - "async": "3.2.3", - "lodash.clonedeep": "^4.5.0", - "lru-cache": "^7.10.1" - }, - "dependencies": { - "lru-cache": { - "version": "7.13.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.13.1.tgz", - "integrity": "sha512-CHqbAq7NFlW3RSnoWXLJBxCWaZVBrfa9UEHId2M3AW8iEBurbqduNexEUCGc3SHc6iCYXNJCDi903LajSVAEPQ==" - } - } - }, - "cache-manager-memcached-store": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cache-manager-memcached-store/-/cache-manager-memcached-store-4.0.0.tgz", - "integrity": "sha512-Lv1WMaRC1FQHHqxE8Xbi7YWInhgfxjOmLEE6u1K0A3Rwmq+XRLyekKDM7aW9WIzF+PuII/RDKqBK/Ezo5H2QVw==" - }, "call-bind": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", @@ -11652,14 +11734,9 @@ "dev": true }, "caniuse-lite": { - "version": "1.0.30001350", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001350.tgz", - "integrity": "sha512-NZBql38Pzd+rAu5SPXv+qmTWGQuFsRiemHCJCAPvkoDxWV19/xqL2YHF32fDJ9SDLdLqfax8+S0CO3ncDCp9Iw==" - }, - "carrier": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/carrier/-/carrier-0.3.0.tgz", - "integrity": "sha512-G0Unz6R11Pdg/9N0qr5muv5ZOF2+oe3WH7i6eiClSd5kozdY5a2nKFfGOTajhoM1vioaAfbnj2RnRQFUDyb9Mw==" + "version": "1.0.30001612", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001612.tgz", + "integrity": "sha512-lFgnZ07UhaCcsSZgWW0K5j4e69dK1u/ltrL9lTUiFOwNHs12S3UMIEYgBV0Z6C6hRDev7iRnMzzYmKabYdXF9g==" }, "chalk": { "version": "3.0.0", @@ -11899,11 +11976,6 @@ "typedarray": "^0.0.6" } }, - "connection-parse": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/connection-parse/-/connection-parse-0.0.7.tgz", - "integrity": "sha512-bTTG28diWg7R7/+qE5NZumwPbCiJOT8uPdZYu674brDjBWQctbaQbYlDKhalS+4i5HxIx+G8dZsnBHKzWpp01A==" - }, "consola": { "version": "2.15.3", "resolved": "https://registry.npmjs.org/consola/-/consola-2.15.3.tgz", @@ -12174,11 +12246,6 @@ } } }, - "dotenv": { - "version": "16.0.1", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.1.tgz", - "integrity": "sha512-1K6hR6wtk2FviQ4kEiSjFiH5rpzEVi8WW0x96aztHVMhEspNpc4DVOUTEHtEva5VThQ8IaBX1Pe4gSzpVVUsKQ==" - }, "dotenv-expand": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-5.1.0.tgz", @@ -12190,9 +12257,9 @@ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" }, "electron-to-chromium": { - "version": "1.4.148", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.148.tgz", - "integrity": "sha512-8MJk1bcQUAYkuvCyWZxaldiwoDG0E0AMzBGA6cv3WfuvJySiPgfidEPBFCRRH3cZm6SVZwo/oRlK1ehi1QNEIQ==" + "version": "1.4.746", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.746.tgz", + "integrity": "sha512-jeWaIta2rIG2FzHaYIhSuVWqC6KJYo7oSBX4Jv7g+aVujKztfvdpf+n6MGwZdC5hQXbax4nntykLH2juIQrfPg==" }, "emittery": { "version": "0.8.1", @@ -12226,10 +12293,9 @@ } }, "enhanced-resolve": { - "version": "5.9.3", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.9.3.tgz", - "integrity": "sha512-Bq9VSor+kjvW3f9/MiiR4eE3XYgOl7/rS8lnSxbRbF3kS0B2r+Y9w5krBWxZgDxASVZbdYrn5wT4j/Wb0J9qow==", - "dev": true, + "version": "5.16.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.16.0.tgz", + "integrity": "sha512-O+QWCviPNSSLAD9Ucn8Awv+poAkqn3T1XY5/N7kR7rQO9yfSGWkYZDwpJ+iKF7B8rxaQKWngSqACpgzeapSyoA==", "requires": { "graceful-fs": "^4.2.4", "tapable": "^2.2.0" @@ -12247,7 +12313,8 @@ "es-module-lexer": { "version": "0.9.3", "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", - "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==" + "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==", + "dev": true }, "es5-ext": { "version": "0.10.61", @@ -13107,9 +13174,9 @@ } }, "graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" }, "has": { "version": "1.0.3", @@ -13129,15 +13196,6 @@ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" }, - "hashring": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/hashring/-/hashring-3.2.0.tgz", - "integrity": "sha512-xCMovURClsQZ+TR30icCZj+34Fq1hs0y6YCASD6ZqdRfYRybb5Iadws2WS+w09mGM/kf9xyA5FCdJQGcgcraSA==", - "requires": { - "connection-parse": "0.0.x", - "simple-lru-cache": "0.0.x" - } - }, "hexoid": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/hexoid/-/hexoid-1.0.0.tgz", @@ -13216,11 +13274,6 @@ "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", "dev": true }, - "immutable": { - "version": "3.8.2", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-3.8.2.tgz", - "integrity": "sha512-15gZoQ38eYjEjxkorfbcgBKBL6R7T459OuK+CpcWt7O3KF4uPCx2tD0uFETlUDIyo+1789crbMhTvQBSR5yBMg==" - }, "import-fresh": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", @@ -14315,11 +14368,6 @@ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, - "lodash.clonedeep": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", - "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==" - }, "lodash.memoize": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", @@ -14446,35 +14494,6 @@ "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==" }, - "memcache-plus": { - "version": "0.2.23", - "resolved": "https://registry.npmjs.org/memcache-plus/-/memcache-plus-0.2.23.tgz", - "integrity": "sha512-Txk6RnVaSVGduYvcu0CKepMywSB7Sz49aT/u5wPkMQJSj/izp++GRGy52ft4QHuNLirGm5GFrWgpcIAVoWc1aw==", - "requires": { - "bluebird": "^3.4.1", - "carrier": "^0.3.0", - "debug": "^2.2.0", - "hashring": "^3.2.0", - "immutable": "^3.8.1", - "lodash": "^4.14.0", - "ramda": "^0.24.1" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - } - } - }, "memfs": { "version": "3.4.4", "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.4.4.tgz", @@ -14846,9 +14865,9 @@ "dev": true }, "node-releases": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.5.tgz", - "integrity": "sha512-U9h1NLROZTq9uE1SNffn6WuPDg8icmi3ns4rEl/oTfIle4iLjTliCzgTsbaIFMq/Xn078/lfY/BL0GWZ+psK4Q==" + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", + "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==" }, "normalize-path": { "version": "3.0.0", @@ -15205,11 +15224,6 @@ "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", "dev": true }, - "ramda": { - "version": "0.24.1", - "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.24.1.tgz", - "integrity": "sha512-HEm619G8PaZMfkqCa23qiOe7r3R0brPu7ZgOsgKUsnvLhd0qhc/vTjkUovomgPWa5ECBa08fJZixth9LaoBo5w==" - }, "randombytes": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", @@ -15423,9 +15437,9 @@ } }, "schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", "requires": { "@types/json-schema": "^7.0.8", "ajv": "^6.12.5", @@ -15507,9 +15521,9 @@ } }, "serialize-javascript": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", - "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", "requires": { "randombytes": "^2.1.0" } @@ -15577,11 +15591,6 @@ "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", "dev": true }, - "simple-lru-cache": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/simple-lru-cache/-/simple-lru-cache-0.0.2.tgz", - "integrity": "sha512-uEv/AFO0ADI7d99OHDmh1QfYzQk/izT1vCmu/riQfh7qjBVUUgRT87E5s5h7CxWCA/+YoZerykpEthzVrW3LIw==" - }, "simple-swizzle": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", @@ -15920,12 +15929,12 @@ } }, "terser": { - "version": "5.14.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.14.0.tgz", - "integrity": "sha512-JC6qfIEkPBd9j1SMO3Pfn+A6w2kQV54tv+ABQLgZr7dA3k/DL/OBoYSWxzVpZev3J+bUHXfr55L8Mox7AaNo6g==", + "version": "5.30.4", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.30.4.tgz", + "integrity": "sha512-xRdd0v64a8mFK9bnsKVdoNP9GQIKUAaJPTaqEQDL4w/J8WaW4sWXXoMZ+6SimPkfT5bElreXf8m9HnmPc3E1BQ==", "requires": { - "@jridgewell/source-map": "^0.3.2", - "acorn": "^8.5.0", + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", "commander": "^2.20.0", "source-map-support": "~0.5.20" }, @@ -15938,15 +15947,15 @@ } }, "terser-webpack-plugin": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.3.tgz", - "integrity": "sha512-Fx60G5HNYknNTNQnzQ1VePRuu89ZVYWfjRAeT5rITuCY/1b08s49e5kSQwHDirKZWuoKOBRFS98EUUoZ9kLEwQ==", + "version": "5.3.10", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz", + "integrity": "sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==", "requires": { - "@jridgewell/trace-mapping": "^0.3.7", + "@jridgewell/trace-mapping": "^0.3.20", "jest-worker": "^27.4.5", "schema-utils": "^3.1.1", - "serialize-javascript": "^6.0.0", - "terser": "^5.7.2" + "serialize-javascript": "^6.0.1", + "terser": "^5.26.0" } }, "test-exclude": { @@ -16275,6 +16284,15 @@ "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==" }, + "update-browserslist-db": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", + "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", + "requires": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + } + }, "uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", @@ -16359,9 +16377,9 @@ } }, "watchpack": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", - "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.1.tgz", + "integrity": "sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg==", "requires": { "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.1.2" @@ -16383,44 +16401,176 @@ "dev": true }, "webpack": { - "version": "5.74.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.74.0.tgz", - "integrity": "sha512-A2InDwnhhGN4LYctJj6M1JEaGL7Luj6LOmyBHjcI8529cm5p6VXiTIW2sn6ffvEAKmveLzvu4jrihwXtPojlAA==", + "version": "5.91.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.91.0.tgz", + "integrity": "sha512-rzVwlLeBWHJbmgTC/8TvAcu5vpJNII+MelQpylD4jNERPwpBJOE2lEcko1zJX3QJeLjTTAnQxn/OJ8bjDzVQaw==", "requires": { "@types/eslint-scope": "^3.7.3", - "@types/estree": "^0.0.51", - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/wasm-edit": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", + "@types/estree": "^1.0.5", + "@webassemblyjs/ast": "^1.12.1", + "@webassemblyjs/wasm-edit": "^1.12.1", + "@webassemblyjs/wasm-parser": "^1.12.1", "acorn": "^8.7.1", - "acorn-import-assertions": "^1.7.6", - "browserslist": "^4.14.5", + "acorn-import-assertions": "^1.9.0", + "browserslist": "^4.21.10", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.10.0", - "es-module-lexer": "^0.9.0", + "enhanced-resolve": "^5.16.0", + "es-module-lexer": "^1.2.1", "eslint-scope": "5.1.1", "events": "^3.2.0", "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.9", + "graceful-fs": "^4.2.11", "json-parse-even-better-errors": "^2.3.1", "loader-runner": "^4.2.0", "mime-types": "^2.1.27", "neo-async": "^2.6.2", - "schema-utils": "^3.1.0", + "schema-utils": "^3.2.0", "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.1.3", - "watchpack": "^2.4.0", + "terser-webpack-plugin": "^5.3.10", + "watchpack": "^2.4.1", "webpack-sources": "^3.2.3" }, "dependencies": { - "enhanced-resolve": { - "version": "5.10.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.10.0.tgz", - "integrity": "sha512-T0yTFjdpldGY8PmuXXR0PyQ1ufZpEGiHVrp7zHKB7jdR4qlmZHhONVM5AQOAWXuF/w3dnHbEQVrNptJgt7F+cQ==", + "@types/estree": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==" + }, + "@webassemblyjs/ast": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.12.1.tgz", + "integrity": "sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==", + "requires": { + "@webassemblyjs/helper-numbers": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6" + } + }, + "@webassemblyjs/floating-point-hex-parser": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", + "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==" + }, + "@webassemblyjs/helper-api-error": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", + "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==" + }, + "@webassemblyjs/helper-buffer": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.12.1.tgz", + "integrity": "sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==" + }, + "@webassemblyjs/helper-numbers": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", + "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", + "requires": { + "@webassemblyjs/floating-point-hex-parser": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/helper-wasm-bytecode": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", + "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==" + }, + "@webassemblyjs/helper-wasm-section": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.12.1.tgz", + "integrity": "sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==", + "requires": { + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/wasm-gen": "1.12.1" + } + }, + "@webassemblyjs/ieee754": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", + "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", "requires": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" + "@xtuc/ieee754": "^1.2.0" } + }, + "@webassemblyjs/leb128": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", + "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", + "requires": { + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/utf8": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", + "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==" + }, + "@webassemblyjs/wasm-edit": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.12.1.tgz", + "integrity": "sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==", + "requires": { + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/helper-wasm-section": "1.12.1", + "@webassemblyjs/wasm-gen": "1.12.1", + "@webassemblyjs/wasm-opt": "1.12.1", + "@webassemblyjs/wasm-parser": "1.12.1", + "@webassemblyjs/wast-printer": "1.12.1" + } + }, + "@webassemblyjs/wasm-gen": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.12.1.tgz", + "integrity": "sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==", + "requires": { + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" + } + }, + "@webassemblyjs/wasm-opt": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.12.1.tgz", + "integrity": "sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==", + "requires": { + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/wasm-gen": "1.12.1", + "@webassemblyjs/wasm-parser": "1.12.1" + } + }, + "@webassemblyjs/wasm-parser": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.12.1.tgz", + "integrity": "sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==", + "requires": { + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-api-error": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" + } + }, + "@webassemblyjs/wast-printer": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.12.1.tgz", + "integrity": "sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==", + "requires": { + "@webassemblyjs/ast": "1.12.1", + "@xtuc/long": "4.2.2" + } + }, + "es-module-lexer": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.0.tgz", + "integrity": "sha512-pqrTKmwEIgafsYZAGw9kszYzmagcE/n4dbgwGWLEXg7J4QFJVQRBld8j3Q3GNez79jzxZshq0bcT962QHOghjw==" } } }, diff --git a/package.json b/package.json index 73c80b2..c7c8e56 100644 --- a/package.json +++ b/package.json @@ -46,18 +46,12 @@ "@nestjs/platform-express": "^8.4.7", "@nestjs/schedule": "^1.1.0", "@nestjs/swagger": "^5.1.5", - "@types/cache-manager": "^3.4.2", "@types/object-hash": "^2.2.1", "@types/uuid": "^8.3.4", - "axios": "^0.24.0", - "cache-manager": "^4.1.0", - "cache-manager-memcached-store": "^4.0.0", "class-transformer": "^0.5.1", "class-validator": "^0.13.2", - "dotenv": "^16.0.1", "json-stringify-safe": "^5.0.1", "lodash": "^4.17.21", - "memcache-plus": "^0.2.23", "mongoose": "^6.5.1", "nest-winston": "^1.6.2", "object-hash": "^2.2.0", @@ -66,7 +60,7 @@ "rxjs": "^7.2.0", "swagger-ui-express": "^4.3.0", "uuid": "^8.3.2", - "webpack": "^5.74.0", + "webpack": "^5.91.0", "winston": "^3.6.0", "winston-slack-webhook-transport": "^2.1.0", "winston-transport-sentry-node": "^2.3.0" From 8b4201db6b66605912c60143b3d7536be8052535 Mon Sep 17 00:00:00 2001 From: Sean Sica <23294618+seansica@users.noreply.github.com> Date: Tue, 23 Apr 2024 14:59:47 -0400 Subject: [PATCH 24/28] Move DI of TaxiiLogger from TaxiiModule to AppModule. --- src/app.module.ts | 4 ++++ src/taxii/taxii.module.ts | 2 -- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/app.module.ts b/src/app.module.ts index 391c148..e190e7c 100644 --- a/src/app.module.ts +++ b/src/app.module.ts @@ -8,6 +8,7 @@ import { TaxiiModule } from "./taxii/taxii.module"; import { StixModule } from "./stix/stix.module"; import { AppConnectOptions } from "./interfaces"; import { MongooseModule } from "@nestjs/mongoose"; +import { TaxiiLoggerModule } from "./common/logger/taxii-logger.module"; @Global() @Module({}) @@ -29,11 +30,14 @@ export class AppModule { isGlobal: true, }), + MongooseModule.forRoot(connectOptions.databaseConnectOptions.mongoUri), /** This is where all user-configurable parameters are defined **/ TaxiiConfigModule, + TaxiiLoggerModule, + /** This is where all TAXII providers and HTTP controllers are hosted. **/ TaxiiModule, diff --git a/src/taxii/taxii.module.ts b/src/taxii/taxii.module.ts index 4c43e0a..2307646 100644 --- a/src/taxii/taxii.module.ts +++ b/src/taxii/taxii.module.ts @@ -17,7 +17,6 @@ import { CollectionsController } from "src/taxii/controllers/collections/collect import { RootController } from "src/taxii/controllers/root/root.controller"; // ** providers ** // -import { TaxiiLoggerModule } from "src/common/logger/taxii-logger.module"; import { DiscoveryModule, CollectionModule, @@ -35,7 +34,6 @@ import { ManifestModule, VersionModule, EnvelopeModule, - TaxiiLoggerModule, ], controllers: [CollectionsController, RootController], providers: [ From be45b26889d0c62e00121f2318e26a5f456402d0 Mon Sep 17 00:00:00 2001 From: Sean Sica <23294618+seansica@users.noreply.github.com> Date: Tue, 23 Apr 2024 15:00:04 -0400 Subject: [PATCH 25/28] Refactor ParseMatchQueryParamPipe --- src/common/pipes/parse-match-query-param.pipe.ts | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/common/pipes/parse-match-query-param.pipe.ts b/src/common/pipes/parse-match-query-param.pipe.ts index b9e27ae..8358951 100644 --- a/src/common/pipes/parse-match-query-param.pipe.ts +++ b/src/common/pipes/parse-match-query-param.pipe.ts @@ -13,12 +13,16 @@ export class ParseMatchQueryParamPipe implements PipeTransform { for (const key in value) { if (value.hasOwnProperty(key)) { - const values = value[key].split(","); - const matchDto = new MatchDto({ [key]: values }); + // removes the square brackets using a regular expression and + // then splits the values by commas to create a MatchDto instance for + // each field. + const field = key.replace(/[\[\]]/g, ''); + const values = value[key].split(','); + const matchDto = new MatchDto({ [field]: values }); matchDtos.push(matchDto); } } - + return matchDtos; } } \ No newline at end of file From ffbccc162428b0d42612542047dab9f55ef38ced Mon Sep 17 00:00:00 2001 From: Sean Sica <23294618+seansica@users.noreply.github.com> Date: Tue, 23 Apr 2024 15:00:29 -0400 Subject: [PATCH 26/28] Remove ParseMatchQueryParamPipe from match URL query parameter processing pipeline --- .../controllers/collections/collections.controller.ts | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/taxii/controllers/collections/collections.controller.ts b/src/taxii/controllers/collections/collections.controller.ts index a52f142..63b6f1a 100644 --- a/src/taxii/controllers/collections/collections.controller.ts +++ b/src/taxii/controllers/collections/collections.controller.ts @@ -3,7 +3,6 @@ import { Delete, Get, Param, - ParseArrayPipe, Post, Query, UseFilters, @@ -114,7 +113,7 @@ export class CollectionsController { @TimestampQuery("added_after") addedAfter?: string, @NumberQuery("limit") limit?: number, @NumberQuery("next") next?: number, - @Query("match", ParseArrayPipe, ParseMatchQueryParamPipe) matches?: MatchDto[] + @Query("match", ParseMatchQueryParamPipe) matches?: MatchDto[] ): Promise { this.logger.debug( `Received request for object manifests with options { collectionId: ${collectionId}, addedAfter: ${addedAfter}, limit: ${limit}, next: ${next}, match: ${JSON.stringify( @@ -140,7 +139,7 @@ export class CollectionsController { @Query("added_after", ParseTimestampPipe) addedAfter?: string, @NumberQuery("limit") limit?: number, @NumberQuery("next") next?: number, - @Query("match", ParseArrayPipe, ParseMatchQueryParamPipe) matches?: MatchDto[] + @Query("match", ParseMatchQueryParamPipe) matches?: MatchDto[] /** * Quick note on the above multi-step pipeline that processes "matches": * The ParseArrayPipe is used to parse the match query parameter as an array. @@ -171,7 +170,7 @@ export class CollectionsController { @NumberQuery("limit") limit?: number, @NumberQuery("next") next?: number, @Query("added_after", ParseTimestampPipe) addedAfter?: string, - @Query("match", ParseArrayPipe, ParseMatchQueryParamPipe) matches?: MatchDto[] + @Query("match", ParseMatchQueryParamPipe) matches?: MatchDto[] ): Promise { this.logger.debug( `Received request for an object with options { collectionId: ${collectionId}, objectId: ${objectId} }`, @@ -225,7 +224,7 @@ export class CollectionsController { @Query("added_after", ParseTimestampPipe) addedAfter?: string, @NumberQuery("limit") limit?: number, @NumberQuery("next") next?: number, - @Query("match", ParseArrayPipe, ParseMatchQueryParamPipe) matches?: MatchDto[] + @Query("match", ParseMatchQueryParamPipe) matches?: MatchDto[] ): Promise { this.logger.debug( `Received request for object versions with options { collectionId: ${collectionId}, objectId: ${objectId}, addedAfter: ${addedAfter}, limit: ${limit}, next: ${next}, match: ${JSON.stringify(matches)} }`, From 7d1aa19b58dd8612de189feb114c0509d5182ce2 Mon Sep 17 00:00:00 2001 From: Sean Sica <23294618+seansica@users.noreply.github.com> Date: Tue, 23 Apr 2024 15:36:24 -0400 Subject: [PATCH 27/28] Add Bruno API testing files --- bruno/Get A Collection.bru | 55 +++++++++++++++++++++ bruno/Get API Root Information.bru | 36 ++++++++++++++ bruno/Get An Object.bru | 73 +++++++++++++++++++++++++++ bruno/Get Collections.bru | 61 +++++++++++++++++++++++ bruno/Get Object Manifests.bru | 78 +++++++++++++++++++++++++++++ bruno/Get Object Versions.bru | 57 +++++++++++++++++++++ bruno/Get Objects.bru | 79 ++++++++++++++++++++++++++++++ bruno/Server Discovery.bru | 36 ++++++++++++++ bruno/bruno.json | 13 +++++ bruno/collection.bru | 3 ++ bruno/environments/local.bru | 3 ++ 11 files changed, 494 insertions(+) create mode 100644 bruno/Get A Collection.bru create mode 100644 bruno/Get API Root Information.bru create mode 100644 bruno/Get An Object.bru create mode 100644 bruno/Get Collections.bru create mode 100644 bruno/Get Object Manifests.bru create mode 100644 bruno/Get Object Versions.bru create mode 100644 bruno/Get Objects.bru create mode 100644 bruno/Server Discovery.bru create mode 100644 bruno/bruno.json create mode 100644 bruno/collection.bru create mode 100644 bruno/environments/local.bru diff --git a/bruno/Get A Collection.bru b/bruno/Get A Collection.bru new file mode 100644 index 0000000..1a79216 --- /dev/null +++ b/bruno/Get A Collection.bru @@ -0,0 +1,55 @@ +meta { + name: Get A Collection + type: http + seq: 4 +} + +get { + url: {{host}}/api/v21/collections/{{collectionId}} + body: none + auth: none +} + +headers { + Accept: application/taxii+json;version=2.1 +} + +vars:pre-request { + collectionId: x-mitre-collection--dac0d2d7-8653-445c-9bff-82f934c1e858 + ~collectionId: x-mitre-collection--1f5f1533-f617-4ca8-9ab4-6a02367fa019 +} + +tests { + test("Verify response status code", function() { + expect(res.getStatus()).to.equal(200); + }); + + test("Verify response content type", function() { + const contentType = res.getHeader('content-type'); + expect(contentType).to.include('application/stix+json'); + expect(contentType).to.include('version=2.1'); + }); + + test("Verify response body", function() { + const collection = res.getBody(); + + expect(collection).to.have.property('id').that.is.a('string').and.is.not.empty; + + expect(collection).to.have.property('title').that.is.a('string').and.is.not.empty; + + if (collection.hasOwnProperty('description')) { + expect(collection.description).to.be.a('string'); + } + + expect(collection).to.have.property('canRead').that.is.a('boolean'); + + expect(collection).to.have.property('canWrite').that.is.a('boolean'); + + if (collection.hasOwnProperty('mediaTypes')) { + expect(collection.mediaTypes).to.be.an('array').and.not.be.empty; + collection.mediaTypes.forEach(mediaType => { + expect(mediaType).to.be.a('string').and.include('application/taxii+json'); + }); + } + }); +} \ No newline at end of file diff --git a/bruno/Get API Root Information.bru b/bruno/Get API Root Information.bru new file mode 100644 index 0000000..81aceb7 --- /dev/null +++ b/bruno/Get API Root Information.bru @@ -0,0 +1,36 @@ +meta { + name: Get API Root Information + type: http + seq: 2 +} + +get { + url: {{host}}/api/v21/ + body: none + auth: none +} + +headers { + Accept: application/taxii+json;version=2.1 +} + +tests { + test("Verify response status code", function() { + expect(res.getStatus()).to.equal(200); + }); + + test("Verify response content type", function() { + const contentType = res.getHeader('content-type'); + expect(contentType).to.include('application/stix+json'); + expect(contentType).to.include('version=2.1'); + }); + + test("Verify response body", function() { + const data = res.getBody(); + expect(data).to.have.property('title').that.is.a('string').and.is.not.empty; + expect(data).to.have.property('description').that.is.a('string').and.is.not.empty; + expect(data).to.have.property('version').that.is.a('string').and.startsWith('application/taxii+json'); + expect(data).to.have.property('maxContentLength').that.is.a('string'); + expect(parseInt(data.maxContentLength)).to.be.a('number').and.not.NaN; + }); +} diff --git a/bruno/Get An Object.bru b/bruno/Get An Object.bru new file mode 100644 index 0000000..e00c8b7 --- /dev/null +++ b/bruno/Get An Object.bru @@ -0,0 +1,73 @@ +meta { + name: Get An Object + type: http + seq: 6 +} + +get { + url: {{host}}/api/v21/collections/{{collectionId}}/objects/{{objectId}} + body: none + auth: none +} + +headers { + Accept: application/taxii+json;version=2.1 +} + +vars:pre-request { + collectionId: x-mitre-collection--dac0d2d7-8653-445c-9bff-82f934c1e858 + objectId: intrusion-set--bef4c620-0787-42a8-a96d-b7eb6e85917c +} + +tests { + const { validateObject } = require('./util/object-validation'); + + test("Verify response status code", function() { + expect(res.getStatus()).to.equal(200); + }); + + test("Verify response content type", function() { + const contentType = res.getHeader('content-type'); + expect(contentType).to.include('application/stix+json'); + expect(contentType).to.include('version=2.1'); + }); + + test("Verify returned object ID matches requested object ID", function() { + const requestedObjectId = 'intrusion-set--bef4c620-0787-42a8-a96d-b7eb6e85917c'; + const data = res.getBody(); + expect(data.objects).to.be.an('array'); + if (data.objects.length > 0) { + data.objects.forEach(obj => { + expect(obj.id).to.equal(requestedObjectId); + }); + } + }); + + test("Verify object properties", function() { + const data = res.getBody(); + const failedObjects = []; + + expect(data.objects).to.be.an('array'); + + data.objects.forEach((obj, index) => { + try { + validateObject(obj); + } catch (err) { + failedObjects.push({ + index: index, + object: obj, + error: err.message + }); + } + }); + + if (failedObjects.length > 0) { + const failureMessage = `${failedObjects.length} object(s) failed validation:\n\n` + + failedObjects.map(failedObj => { + return `Index: ${failedObj.index}\nObject: ${JSON.stringify(failedObj.object)}\nError: ${failedObj.error}\n`; + }).join('\n'); + + throw new Error(failureMessage); + } + }); +} \ No newline at end of file diff --git a/bruno/Get Collections.bru b/bruno/Get Collections.bru new file mode 100644 index 0000000..4f0d8b3 --- /dev/null +++ b/bruno/Get Collections.bru @@ -0,0 +1,61 @@ +meta { + name: Get Collections + type: http + seq: 3 +} + +get { + url: {{host}}/api/v21/collections/ + body: none + auth: none +} + +headers { + Accept: application/taxii+json;version=2.1 +} + +tests { + test("Verify response status code", function() { + expect(res.getStatus()).to.equal(200); + }); + + test("Verify response content type", function() { + const contentType = res.getHeader('content-type'); + expect(contentType).to.include('application/stix+json'); + expect(contentType).to.include('version=2.1'); + }); + + test("Verify response body", function() { + const data = res.getBody(); + + if (data.hasOwnProperty('collections')) { + expect(data.collections).to.be.an('array'); + + data.collections.forEach(collection => { + + expect(collection).to.have.property('id').that.is.a('string'); + + expect(collection).to.have.property('title').that.is.a('string').and.is.not.empty; + + if (collection.hasOwnProperty('description')) { + expect(collection.description).to.be.a('string'); + } + + if (collection.hasOwnProperty('alias')) { + expect(collection.alias).to.be.a('string'); + } + + expect(collection).to.have.property('canRead').that.is.a('boolean'); + + expect(collection).to.have.property('canWrite').that.is.a('boolean'); + + if (collection.hasOwnProperty('mediaTypes')) { + expect(collection.mediaTypes).to.be.an('array').and.not.be.empty; + collection.mediaTypes.forEach(mediaType => { + expect(mediaType).to.be.a('string').and.include('application/taxii+json'); + }); + } + }); + } + }); +} \ No newline at end of file diff --git a/bruno/Get Object Manifests.bru b/bruno/Get Object Manifests.bru new file mode 100644 index 0000000..0427944 --- /dev/null +++ b/bruno/Get Object Manifests.bru @@ -0,0 +1,78 @@ +meta { + name: Get Object Manifests + type: http + seq: 7 +} + +get { + url: {{host}}/api/v21/collections/{{collectionId}}/manifest + body: none + auth: none +} + +headers { + Accept: application/taxii+json;version=2.1 +} + +vars:pre-request { + collectionId: x-mitre-collection--dac0d2d7-8653-445c-9bff-82f934c1e858 +} + +tests { + test("Verify response status code", function() { + expect(res.getStatus()).to.equal(200); + }); + + test("Verify response content type", function() { + const contentType = res.getHeader('content-type'); + expect(contentType).to.include('application/stix+json'); + expect(contentType).to.include('version=2.1'); + }); + + test("Verify response body structure", function() { + const data = res.getBody(); + expect(data).to.have.property('more').that.is.a('boolean'); + + if (data.hasOwnProperty('objects')) { + expect(data.objects).to.be.an('array'); + } else { + expect(data).to.be.an('object').and.to.be.empty; + } + }); + + test("Verify manifest-record properties", function() { + const data = res.getBody(); + const failedObjects = []; + + if (data.hasOwnProperty('objects')) { + data.objects.forEach((obj, index) => { + try { + expect(obj).to.have.property('id').that.is.a('string'); + expect(obj).to.have.property('date_added').that.is.a('string'); + + if (!obj.id.includes('marking-definition')) { + expect(obj).to.have.property('version').that.is.a('string'); + } + + if (obj.hasOwnProperty('media_type')) { + expect(obj.media_type).to.be.a('string'); + } + } catch (err) { + failedObjects.push({ + index: index, + object: obj, + error: err.message + }); + } + if (failedObjects.length > 0) { + const failureMessage = `${failedObjects.length} object(s) failed validation:\n\n` + + failedObjects.map(failedObj => { + return `Index: ${failedObj.index}\nObject: ${JSON.stringify(failedObj.object)}\nError: ${failedObj.error}\n`; + }).join('\n'); + + throw new Error(failureMessage); + } + }); + } + }); +} \ No newline at end of file diff --git a/bruno/Get Object Versions.bru b/bruno/Get Object Versions.bru new file mode 100644 index 0000000..b58e6c2 --- /dev/null +++ b/bruno/Get Object Versions.bru @@ -0,0 +1,57 @@ +meta { + name: Get Object Versions + type: http + seq: 8 +} + +get { + url: {{host}}/api/v21/collections/{{collectionId}}/objects/{{objectId}}/versions/ + body: none + auth: none +} + +query { + ~limit: 1 +} + +headers { + Accept: application/taxii+json;version=2.1 +} + +vars:pre-request { + collectionId: x-mitre-collection--1f5f1533-f617-4ca8-9ab4-6a02367fa019 + objectId: malware--72f54d66-675d-4587-9bd3-4ed09f9522e4 +} + +tests { + test("Verify response status code", function() { + expect(res.getStatus()).to.equal(200); + }); + + test("Verify response content type", function() { + const contentType = res.getHeader('content-type'); + expect(contentType).to.include('application/stix+json'); + expect(contentType).to.include('version=2.1'); + }); + + test("Verify response body structure", function() { + const data = res.getBody(); + expect(data).to.have.property('more').that.is.a('boolean'); + + if (data.hasOwnProperty('versions')) { + expect(data.versions).to.be.an('array'); + } else { + expect(data).to.be.an('object').and.to.be.empty; + } + }); + + test("Verify version properties", function() { + const data = res.getBody(); + + if (data.hasOwnProperty('versions')) { + data.versions.forEach(version => { + expect(version).to.be.a('string'); + }); + } + }); +} \ No newline at end of file diff --git a/bruno/Get Objects.bru b/bruno/Get Objects.bru new file mode 100644 index 0000000..277c4e3 --- /dev/null +++ b/bruno/Get Objects.bru @@ -0,0 +1,79 @@ +meta { + name: Get Objects + type: http + seq: 5 +} + +get { + url: {{host}}/api/v21/collections/{{collectionId}}/objects?limit=100 + body: none + auth: none +} + +query { + limit: 100 + ~added_after: 2024-01-01 + ~match[type]: tool + ~match[type]: intrusion-set,tool + ~next: 1 + ~match[type]: intrusion-set +} + +headers { + Accept: application/taxii+json;version=2.1 +} + +vars:pre-request { + collectionId: x-mitre-collection--dac0d2d7-8653-445c-9bff-82f934c1e858 + ~collectionId: x-mitre-collection--1f5f1533-f617-4ca8-9ab4-6a02367fa019 +} + +tests { + const { validateObject } = require('./util/object-validation'); + + test("Verify response status code", function() { + expect(res.getStatus()).to.equal(200); + }); + + test("Verify response content type", function() { + const contentType = res.getHeader('content-type'); + expect(contentType).to.include('application/stix+json'); + expect(contentType).to.include('version=2.1'); + }); + + test("Verify response body structure", function() { + const data = res.getBody(); + expect(data).to.have.property('more').that.is.a('boolean'); + expect(data).to.have.property('objects').that.is.an('array'); + + if (data.more === true) { + expect(data).to.have.property('next').that.is.a('string'); + } + }); + + test("Verify objects properties", function() { + const data = res.getBody(); + const failedObjects = []; + + data.objects.forEach((obj, index) => { + try { + validateObject(obj); + } catch (err) { + failedObjects.push({ + index: index, + object: obj, + error: err.message + }); + } + }); + + if (failedObjects.length > 0) { + const failureMessage = `${failedObjects.length} object(s) failed validation:\n\n` + + failedObjects.map(failedObj => { + return `Index: ${failedObj.index}\nObject: ${JSON.stringify(failedObj.object)}\nError: ${failedObj.error}\n`; + }).join('\n'); + + throw new Error(failureMessage); + } + }); +} \ No newline at end of file diff --git a/bruno/Server Discovery.bru b/bruno/Server Discovery.bru new file mode 100644 index 0000000..1b0e4f0 --- /dev/null +++ b/bruno/Server Discovery.bru @@ -0,0 +1,36 @@ +meta { + name: Server Discovery + type: http + seq: 1 +} + +get { + url: {{host}}/taxii2/ + body: none + auth: none +} + +headers { + Accept: application/taxii+json;version=2.1 +} + +tests { + test("Verify response status code", function() { + expect(res.getStatus()).to.equal(200); + }); + + test("Verify response content type", function() { + const contentType = res.getHeader('content-type'); + expect(contentType).to.include('application/stix+json'); + expect(contentType).to.include('version=2.1'); + }); + + test("Verify response body", function() { + const data = res.getBody(); + expect(data).to.have.property('title').that.is.a('string'); + expect(data).to.have.property('description').that.is.a('string'); + expect(data).to.have.property('default').that.is.a('string'); + expect(data).to.have.property('api_roots').that.is.an('array'); + expect(data.api_roots).to.include(data.default); + }); +} diff --git a/bruno/bruno.json b/bruno/bruno.json new file mode 100644 index 0000000..6902cba --- /dev/null +++ b/bruno/bruno.json @@ -0,0 +1,13 @@ +{ + "version": "1", + "name": "TAXII 2.1 Server", + "type": "collection", + "presets": { + "requestType": "http", + "requestUrl": "" + }, + "ignore": [ + "node_modules", + ".git" + ] +} \ No newline at end of file diff --git a/bruno/collection.bru b/bruno/collection.bru new file mode 100644 index 0000000..0ae725a --- /dev/null +++ b/bruno/collection.bru @@ -0,0 +1,3 @@ +headers { + Accept: application/taxii+json;version=2.1 +} diff --git a/bruno/environments/local.bru b/bruno/environments/local.bru new file mode 100644 index 0000000..2738304 --- /dev/null +++ b/bruno/environments/local.bru @@ -0,0 +1,3 @@ +vars { + host: http://127.0.0.1:5001 +} From 57c4040c465349707947c072d79824db9d92e17f Mon Sep 17 00:00:00 2001 From: Sean Sica <23294618+seansica@users.noreply.github.com> Date: Tue, 23 Apr 2024 15:55:45 -0400 Subject: [PATCH 28/28] Add CI pipeline for testing the public TAXII server via Bruno --- .github/workflows/api-tests-bruno.yml | 29 + bruno/environments/aws.bru | 3 + bruno/package-lock.json | 3289 +++++++++++++++++++++++++ bruno/package.json | 33 + package-lock.json | 392 ++- 5 files changed, 3671 insertions(+), 75 deletions(-) create mode 100644 .github/workflows/api-tests-bruno.yml create mode 100644 bruno/environments/aws.bru create mode 100644 bruno/package-lock.json create mode 100644 bruno/package.json diff --git a/.github/workflows/api-tests-bruno.yml b/.github/workflows/api-tests-bruno.yml new file mode 100644 index 0000000..40d967c --- /dev/null +++ b/.github/workflows/api-tests-bruno.yml @@ -0,0 +1,29 @@ +# This workflow runs the API tests for the bruno application on the latest version of Ubuntu + +name: API Tests - Bruno + +on: + workflow_dispatch: +permissions: + contents: read + actions: read + checks: write +jobs: + run_bruno_api_test: + name: API Tests by Bruno + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - name: Install dependencies and run tests + run: | + cd bruno + npm install + npm run test + + - name: Publish Test Report + uses: dorny/test-reporter@v1 + if: success() || failure() # run this step even if previous step failed + with: + name: Bruno API Tests # Name of the check run which will be created + path: bruno/report.xml # Path to test results + reporter: java-junit # Format of test results \ No newline at end of file diff --git a/bruno/environments/aws.bru b/bruno/environments/aws.bru new file mode 100644 index 0000000..daac118 --- /dev/null +++ b/bruno/environments/aws.bru @@ -0,0 +1,3 @@ +vars { + host: https://attack-taxii.mitre.org +} diff --git a/bruno/package-lock.json b/bruno/package-lock.json new file mode 100644 index 0000000..abed6f3 --- /dev/null +++ b/bruno/package-lock.json @@ -0,0 +1,3289 @@ +{ + "name": "bruno", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "bruno", + "version": "1.0.0", + "license": "Apache-2.0", + "dependencies": { + "@usebruno/cli": "^1.14.0", + "xml2js": "^0.6.2", + "xmldom": "^0.6.0", + "xpath": "^0.0.34" + } + }, + "node_modules/@aws-crypto/ie11-detection": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/ie11-detection/-/ie11-detection-3.0.0.tgz", + "integrity": "sha512-341lBBkiY1DfDNKai/wXM3aujNBkXR7tq1URPQDL9wi3AUbI80NR74uF1TXHMm7po1AcnFk8iu2S2IeU/+/A+Q==", + "dependencies": { + "tslib": "^1.11.1" + } + }, + "node_modules/@aws-crypto/ie11-detection/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/@aws-crypto/sha256-browser": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-3.0.0.tgz", + "integrity": "sha512-8VLmW2B+gjFbU5uMeqtQM6Nj0/F1bro80xQXCW6CQBWgosFWXTx77aeOF5CAIAmbOK64SdMBJdNr6J41yP5mvQ==", + "dependencies": { + "@aws-crypto/ie11-detection": "^3.0.0", + "@aws-crypto/sha256-js": "^3.0.0", + "@aws-crypto/supports-web-crypto": "^3.0.0", + "@aws-crypto/util": "^3.0.0", + "@aws-sdk/types": "^3.222.0", + "@aws-sdk/util-locate-window": "^3.0.0", + "@aws-sdk/util-utf8-browser": "^3.0.0", + "tslib": "^1.11.1" + } + }, + "node_modules/@aws-crypto/sha256-browser/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/@aws-crypto/sha256-js": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-3.0.0.tgz", + "integrity": "sha512-PnNN7os0+yd1XvXAy23CFOmTbMaDxgxXtTKHybrJ39Y8kGzBATgBFibWJKH6BhytLI/Zyszs87xCOBNyBig6vQ==", + "dependencies": { + "@aws-crypto/util": "^3.0.0", + "@aws-sdk/types": "^3.222.0", + "tslib": "^1.11.1" + } + }, + "node_modules/@aws-crypto/sha256-js/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/@aws-crypto/supports-web-crypto": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-3.0.0.tgz", + "integrity": "sha512-06hBdMwUAb2WFTuGG73LSC0wfPu93xWwo5vL2et9eymgmu3Id5vFAHBbajVWiGhPO37qcsdCap/FqXvJGJWPIg==", + "dependencies": { + "tslib": "^1.11.1" + } + }, + "node_modules/@aws-crypto/supports-web-crypto/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/@aws-crypto/util": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-3.0.0.tgz", + "integrity": "sha512-2OJlpeJpCR48CC8r+uKVChzs9Iungj9wkZrl8Z041DWEWvyIHILYKCPNzJghKsivj+S3mLo6BVc7mBNzdxA46w==", + "dependencies": { + "@aws-sdk/types": "^3.222.0", + "@aws-sdk/util-utf8-browser": "^3.0.0", + "tslib": "^1.11.1" + } + }, + "node_modules/@aws-crypto/util/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/@aws-sdk/client-cognito-identity": { + "version": "3.525.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.525.0.tgz", + "integrity": "sha512-LxI9rfn6Vy/EX6I7as14PAKqAhUwVQviaMV/xCLQIubgdVj1xfexVURdiSk7GQshpcwtrs+GQWV21yP+3AX/7A==", + "dependencies": { + "@aws-crypto/sha256-browser": "3.0.0", + "@aws-crypto/sha256-js": "3.0.0", + "@aws-sdk/client-sts": "3.525.0", + "@aws-sdk/core": "3.525.0", + "@aws-sdk/credential-provider-node": "3.525.0", + "@aws-sdk/middleware-host-header": "3.523.0", + "@aws-sdk/middleware-logger": "3.523.0", + "@aws-sdk/middleware-recursion-detection": "3.523.0", + "@aws-sdk/middleware-user-agent": "3.525.0", + "@aws-sdk/region-config-resolver": "3.525.0", + "@aws-sdk/types": "3.523.0", + "@aws-sdk/util-endpoints": "3.525.0", + "@aws-sdk/util-user-agent-browser": "3.523.0", + "@aws-sdk/util-user-agent-node": "3.525.0", + "@smithy/config-resolver": "^2.1.4", + "@smithy/core": "^1.3.5", + "@smithy/fetch-http-handler": "^2.4.3", + "@smithy/hash-node": "^2.1.3", + "@smithy/invalid-dependency": "^2.1.3", + "@smithy/middleware-content-length": "^2.1.3", + "@smithy/middleware-endpoint": "^2.4.4", + "@smithy/middleware-retry": "^2.1.4", + "@smithy/middleware-serde": "^2.1.3", + "@smithy/middleware-stack": "^2.1.3", + "@smithy/node-config-provider": "^2.2.4", + "@smithy/node-http-handler": "^2.4.1", + "@smithy/protocol-http": "^3.2.1", + "@smithy/smithy-client": "^2.4.2", + "@smithy/types": "^2.10.1", + "@smithy/url-parser": "^2.1.3", + "@smithy/util-base64": "^2.1.1", + "@smithy/util-body-length-browser": "^2.1.1", + "@smithy/util-body-length-node": "^2.2.1", + "@smithy/util-defaults-mode-browser": "^2.1.4", + "@smithy/util-defaults-mode-node": "^2.2.3", + "@smithy/util-endpoints": "^1.1.4", + "@smithy/util-middleware": "^2.1.3", + "@smithy/util-retry": "^2.1.3", + "@smithy/util-utf8": "^2.1.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-sso": { + "version": "3.525.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.525.0.tgz", + "integrity": "sha512-6KwGQWFoNLH1UupdWPFdKPfTgjSz1kN8/r8aCzuvvXBe4Pz+iDUZ6FEJzGWNc9AapjvZDNO1hs23slomM9rTaA==", + "dependencies": { + "@aws-crypto/sha256-browser": "3.0.0", + "@aws-crypto/sha256-js": "3.0.0", + "@aws-sdk/core": "3.525.0", + "@aws-sdk/middleware-host-header": "3.523.0", + "@aws-sdk/middleware-logger": "3.523.0", + "@aws-sdk/middleware-recursion-detection": "3.523.0", + "@aws-sdk/middleware-user-agent": "3.525.0", + "@aws-sdk/region-config-resolver": "3.525.0", + "@aws-sdk/types": "3.523.0", + "@aws-sdk/util-endpoints": "3.525.0", + "@aws-sdk/util-user-agent-browser": "3.523.0", + "@aws-sdk/util-user-agent-node": "3.525.0", + "@smithy/config-resolver": "^2.1.4", + "@smithy/core": "^1.3.5", + "@smithy/fetch-http-handler": "^2.4.3", + "@smithy/hash-node": "^2.1.3", + "@smithy/invalid-dependency": "^2.1.3", + "@smithy/middleware-content-length": "^2.1.3", + "@smithy/middleware-endpoint": "^2.4.4", + "@smithy/middleware-retry": "^2.1.4", + "@smithy/middleware-serde": "^2.1.3", + "@smithy/middleware-stack": "^2.1.3", + "@smithy/node-config-provider": "^2.2.4", + "@smithy/node-http-handler": "^2.4.1", + "@smithy/protocol-http": "^3.2.1", + "@smithy/smithy-client": "^2.4.2", + "@smithy/types": "^2.10.1", + "@smithy/url-parser": "^2.1.3", + "@smithy/util-base64": "^2.1.1", + "@smithy/util-body-length-browser": "^2.1.1", + "@smithy/util-body-length-node": "^2.2.1", + "@smithy/util-defaults-mode-browser": "^2.1.4", + "@smithy/util-defaults-mode-node": "^2.2.3", + "@smithy/util-endpoints": "^1.1.4", + "@smithy/util-middleware": "^2.1.3", + "@smithy/util-retry": "^2.1.3", + "@smithy/util-utf8": "^2.1.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-sso-oidc": { + "version": "3.525.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.525.0.tgz", + "integrity": "sha512-zz13k/6RkjPSLmReSeGxd8wzGiiZa4Odr2Tv3wTcxClM4wOjD+zOgGv4Fe32b9AMqaueiCdjbvdu7AKcYxFA4A==", + "dependencies": { + "@aws-crypto/sha256-browser": "3.0.0", + "@aws-crypto/sha256-js": "3.0.0", + "@aws-sdk/client-sts": "3.525.0", + "@aws-sdk/core": "3.525.0", + "@aws-sdk/middleware-host-header": "3.523.0", + "@aws-sdk/middleware-logger": "3.523.0", + "@aws-sdk/middleware-recursion-detection": "3.523.0", + "@aws-sdk/middleware-user-agent": "3.525.0", + "@aws-sdk/region-config-resolver": "3.525.0", + "@aws-sdk/types": "3.523.0", + "@aws-sdk/util-endpoints": "3.525.0", + "@aws-sdk/util-user-agent-browser": "3.523.0", + "@aws-sdk/util-user-agent-node": "3.525.0", + "@smithy/config-resolver": "^2.1.4", + "@smithy/core": "^1.3.5", + "@smithy/fetch-http-handler": "^2.4.3", + "@smithy/hash-node": "^2.1.3", + "@smithy/invalid-dependency": "^2.1.3", + "@smithy/middleware-content-length": "^2.1.3", + "@smithy/middleware-endpoint": "^2.4.4", + "@smithy/middleware-retry": "^2.1.4", + "@smithy/middleware-serde": "^2.1.3", + "@smithy/middleware-stack": "^2.1.3", + "@smithy/node-config-provider": "^2.2.4", + "@smithy/node-http-handler": "^2.4.1", + "@smithy/protocol-http": "^3.2.1", + "@smithy/smithy-client": "^2.4.2", + "@smithy/types": "^2.10.1", + "@smithy/url-parser": "^2.1.3", + "@smithy/util-base64": "^2.1.1", + "@smithy/util-body-length-browser": "^2.1.1", + "@smithy/util-body-length-node": "^2.2.1", + "@smithy/util-defaults-mode-browser": "^2.1.4", + "@smithy/util-defaults-mode-node": "^2.2.3", + "@smithy/util-endpoints": "^1.1.4", + "@smithy/util-middleware": "^2.1.3", + "@smithy/util-retry": "^2.1.3", + "@smithy/util-utf8": "^2.1.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "@aws-sdk/credential-provider-node": "^3.525.0" + } + }, + "node_modules/@aws-sdk/client-sts": { + "version": "3.525.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.525.0.tgz", + "integrity": "sha512-a8NUGRvO6rkfTZCbMaCsjDjLbERCwIUU9dIywFYcRgbFhkupJ7fSaZz3Het98U51M9ZbTEpaTa3fz0HaJv8VJw==", + "dependencies": { + "@aws-crypto/sha256-browser": "3.0.0", + "@aws-crypto/sha256-js": "3.0.0", + "@aws-sdk/core": "3.525.0", + "@aws-sdk/middleware-host-header": "3.523.0", + "@aws-sdk/middleware-logger": "3.523.0", + "@aws-sdk/middleware-recursion-detection": "3.523.0", + "@aws-sdk/middleware-user-agent": "3.525.0", + "@aws-sdk/region-config-resolver": "3.525.0", + "@aws-sdk/types": "3.523.0", + "@aws-sdk/util-endpoints": "3.525.0", + "@aws-sdk/util-user-agent-browser": "3.523.0", + "@aws-sdk/util-user-agent-node": "3.525.0", + "@smithy/config-resolver": "^2.1.4", + "@smithy/core": "^1.3.5", + "@smithy/fetch-http-handler": "^2.4.3", + "@smithy/hash-node": "^2.1.3", + "@smithy/invalid-dependency": "^2.1.3", + "@smithy/middleware-content-length": "^2.1.3", + "@smithy/middleware-endpoint": "^2.4.4", + "@smithy/middleware-retry": "^2.1.4", + "@smithy/middleware-serde": "^2.1.3", + "@smithy/middleware-stack": "^2.1.3", + "@smithy/node-config-provider": "^2.2.4", + "@smithy/node-http-handler": "^2.4.1", + "@smithy/protocol-http": "^3.2.1", + "@smithy/smithy-client": "^2.4.2", + "@smithy/types": "^2.10.1", + "@smithy/url-parser": "^2.1.3", + "@smithy/util-base64": "^2.1.1", + "@smithy/util-body-length-browser": "^2.1.1", + "@smithy/util-body-length-node": "^2.2.1", + "@smithy/util-defaults-mode-browser": "^2.1.4", + "@smithy/util-defaults-mode-node": "^2.2.3", + "@smithy/util-endpoints": "^1.1.4", + "@smithy/util-middleware": "^2.1.3", + "@smithy/util-retry": "^2.1.3", + "@smithy/util-utf8": "^2.1.1", + "fast-xml-parser": "4.2.5", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "@aws-sdk/credential-provider-node": "^3.525.0" + } + }, + "node_modules/@aws-sdk/core": { + "version": "3.525.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.525.0.tgz", + "integrity": "sha512-E3LtEtMWCriQOFZpVKpLYzbdw/v2PAOEAMhn2VRRZ1g0/g1TXzQrfhEU2yd8l/vQEJaCJ82ooGGg7YECviBUxA==", + "dependencies": { + "@smithy/core": "^1.3.5", + "@smithy/protocol-http": "^3.2.1", + "@smithy/signature-v4": "^2.1.3", + "@smithy/smithy-client": "^2.4.2", + "@smithy/types": "^2.10.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-cognito-identity": { + "version": "3.525.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.525.0.tgz", + "integrity": "sha512-0djjCN/zN6QFQt1xU64VBOSRP4wJckU6U7FjLPrGpL6w03hF0dUmVUXjhQZe5WKNPCicVc2S3BYPohl/PzCx1w==", + "dependencies": { + "@aws-sdk/client-cognito-identity": "3.525.0", + "@aws-sdk/types": "3.523.0", + "@smithy/property-provider": "^2.1.3", + "@smithy/types": "^2.10.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-env": { + "version": "3.523.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.523.0.tgz", + "integrity": "sha512-Y6DWdH6/OuMDoNKVzZlNeBc6f1Yjk1lYMjANKpIhMbkRCvLJw/PYZKOZa8WpXbTYdgg9XLjKybnLIb3ww3uuzA==", + "dependencies": { + "@aws-sdk/types": "3.523.0", + "@smithy/property-provider": "^2.1.3", + "@smithy/types": "^2.10.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-http": { + "version": "3.525.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.525.0.tgz", + "integrity": "sha512-RNWQGuSBQZhl3iqklOslUEfQ4br1V3DCPboMpeqFtddUWJV3m2u2extFur9/4Uy+1EHVF120IwZUKtd8dF+ibw==", + "dependencies": { + "@aws-sdk/types": "3.523.0", + "@smithy/fetch-http-handler": "^2.4.3", + "@smithy/node-http-handler": "^2.4.1", + "@smithy/property-provider": "^2.1.3", + "@smithy/protocol-http": "^3.2.1", + "@smithy/smithy-client": "^2.4.2", + "@smithy/types": "^2.10.1", + "@smithy/util-stream": "^2.1.3", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-ini": { + "version": "3.525.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.525.0.tgz", + "integrity": "sha512-JDnccfK5JRb9jcgpc9lirL9PyCwGIqY0nKdw3LlX5WL5vTpTG4E1q7rLAlpNh7/tFD1n66Itarfv2tsyHMIqCw==", + "dependencies": { + "@aws-sdk/client-sts": "3.525.0", + "@aws-sdk/credential-provider-env": "3.523.0", + "@aws-sdk/credential-provider-process": "3.523.0", + "@aws-sdk/credential-provider-sso": "3.525.0", + "@aws-sdk/credential-provider-web-identity": "3.525.0", + "@aws-sdk/types": "3.523.0", + "@smithy/credential-provider-imds": "^2.2.3", + "@smithy/property-provider": "^2.1.3", + "@smithy/shared-ini-file-loader": "^2.3.3", + "@smithy/types": "^2.10.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-node": { + "version": "3.525.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.525.0.tgz", + "integrity": "sha512-RJXlO8goGXpnoHQAyrCcJ0QtWEOFa34LSbfdqBIjQX/fwnjUuEmiGdXTV3AZmwYQ7juk49tfBneHbtOP3AGqsQ==", + "dependencies": { + "@aws-sdk/credential-provider-env": "3.523.0", + "@aws-sdk/credential-provider-http": "3.525.0", + "@aws-sdk/credential-provider-ini": "3.525.0", + "@aws-sdk/credential-provider-process": "3.523.0", + "@aws-sdk/credential-provider-sso": "3.525.0", + "@aws-sdk/credential-provider-web-identity": "3.525.0", + "@aws-sdk/types": "3.523.0", + "@smithy/credential-provider-imds": "^2.2.3", + "@smithy/property-provider": "^2.1.3", + "@smithy/shared-ini-file-loader": "^2.3.3", + "@smithy/types": "^2.10.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-process": { + "version": "3.523.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.523.0.tgz", + "integrity": "sha512-f0LP9KlFmMvPWdKeUKYlZ6FkQAECUeZMmISsv6NKtvPCI9e4O4cLTeR09telwDK8P0HrgcRuZfXM7E30m8re0Q==", + "dependencies": { + "@aws-sdk/types": "3.523.0", + "@smithy/property-provider": "^2.1.3", + "@smithy/shared-ini-file-loader": "^2.3.3", + "@smithy/types": "^2.10.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-sso": { + "version": "3.525.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.525.0.tgz", + "integrity": "sha512-7V7ybtufxdD3plxeIeB6aqHZeFIUlAyPphXIUgXrGY10iNcosL970rQPBeggsohe4gCM6UvY2TfMeEcr+ZE8FA==", + "dependencies": { + "@aws-sdk/client-sso": "3.525.0", + "@aws-sdk/token-providers": "3.525.0", + "@aws-sdk/types": "3.523.0", + "@smithy/property-provider": "^2.1.3", + "@smithy/shared-ini-file-loader": "^2.3.3", + "@smithy/types": "^2.10.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-web-identity": { + "version": "3.525.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.525.0.tgz", + "integrity": "sha512-sAukOjR1oKb2JXG4nPpuBFpSwGUhrrY17PG/xbTy8NAoLLhrqRwnErcLfdTfmj6tH+3094k6ws/Sh8a35ae7fA==", + "dependencies": { + "@aws-sdk/client-sts": "3.525.0", + "@aws-sdk/types": "3.523.0", + "@smithy/property-provider": "^2.1.3", + "@smithy/types": "^2.10.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-providers": { + "version": "3.525.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-providers/-/credential-providers-3.525.0.tgz", + "integrity": "sha512-zj439Ok1s44nahIJKpBM4jhAxnSw20flXQpMD2aeGdvUuKm2xmzZP0lX5z9a+XQWFtNh251ZcSt2p+RwtLKtiw==", + "dependencies": { + "@aws-sdk/client-cognito-identity": "3.525.0", + "@aws-sdk/client-sso": "3.525.0", + "@aws-sdk/client-sts": "3.525.0", + "@aws-sdk/credential-provider-cognito-identity": "3.525.0", + "@aws-sdk/credential-provider-env": "3.523.0", + "@aws-sdk/credential-provider-http": "3.525.0", + "@aws-sdk/credential-provider-ini": "3.525.0", + "@aws-sdk/credential-provider-node": "3.525.0", + "@aws-sdk/credential-provider-process": "3.523.0", + "@aws-sdk/credential-provider-sso": "3.525.0", + "@aws-sdk/credential-provider-web-identity": "3.525.0", + "@aws-sdk/types": "3.523.0", + "@smithy/credential-provider-imds": "^2.2.3", + "@smithy/property-provider": "^2.1.3", + "@smithy/types": "^2.10.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-host-header": { + "version": "3.523.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.523.0.tgz", + "integrity": "sha512-4g3q7Ta9sdD9TMUuohBAkbx/e3I/juTqfKi7TPgP+8jxcYX72MOsgemAMHuP6CX27eyj4dpvjH+w4SIVDiDSmg==", + "dependencies": { + "@aws-sdk/types": "3.523.0", + "@smithy/protocol-http": "^3.2.1", + "@smithy/types": "^2.10.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-logger": { + "version": "3.523.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.523.0.tgz", + "integrity": "sha512-PeDNJNhfiaZx54LBaLTXzUaJ9LXFwDFFIksipjqjvxMafnoVcQwKbkoPUWLe5ytT4nnL1LogD3s55mERFUsnwg==", + "dependencies": { + "@aws-sdk/types": "3.523.0", + "@smithy/types": "^2.10.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-recursion-detection": { + "version": "3.523.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.523.0.tgz", + "integrity": "sha512-nZ3Vt7ehfSDYnrcg/aAfjjvpdE+61B3Zk68i6/hSUIegT3IH9H1vSW67NDKVp+50hcEfzWwM2HMPXxlzuyFyrw==", + "dependencies": { + "@aws-sdk/types": "3.523.0", + "@smithy/protocol-http": "^3.2.1", + "@smithy/types": "^2.10.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-user-agent": { + "version": "3.525.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.525.0.tgz", + "integrity": "sha512-4al/6uO+t/QIYXK2OgqzDKQzzLAYJza1vWFS+S0lJ3jLNGyLB5BMU5KqWjDzevYZ4eCnz2Nn7z0FveUTNz8YdQ==", + "dependencies": { + "@aws-sdk/types": "3.523.0", + "@aws-sdk/util-endpoints": "3.525.0", + "@smithy/protocol-http": "^3.2.1", + "@smithy/types": "^2.10.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/region-config-resolver": { + "version": "3.525.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.525.0.tgz", + "integrity": "sha512-8kFqXk6UyKgTMi7N7QlhA6qM4pGPWbiUXqEY2RgUWngtxqNFGeM9JTexZeuavQI+qLLe09VPShPNX71fEDcM6w==", + "dependencies": { + "@aws-sdk/types": "3.523.0", + "@smithy/node-config-provider": "^2.2.4", + "@smithy/types": "^2.10.1", + "@smithy/util-config-provider": "^2.2.1", + "@smithy/util-middleware": "^2.1.3", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/token-providers": { + "version": "3.525.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.525.0.tgz", + "integrity": "sha512-puVjbxuK0Dq7PTQ2HdddHy2eQjOH8GZbump74yWJa6JVpRW84LlOcNmP+79x4Kscvz2ldWB8XDFw/pcCiSDe5A==", + "dependencies": { + "@aws-sdk/client-sso-oidc": "3.525.0", + "@aws-sdk/types": "3.523.0", + "@smithy/property-provider": "^2.1.3", + "@smithy/shared-ini-file-loader": "^2.3.3", + "@smithy/types": "^2.10.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/types": { + "version": "3.523.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.523.0.tgz", + "integrity": "sha512-AqGIu4u+SxPiUuNBp2acCVcq80KDUFjxe6e3cMTvKWTzCbrVk1AXv0dAaJnCmdkWIha6zJDWxpIk/aL4EGhZ9A==", + "dependencies": { + "@smithy/types": "^2.10.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/util-endpoints": { + "version": "3.525.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.525.0.tgz", + "integrity": "sha512-DIW7WWU5tIGkeeKX6NJUyrEIdWMiqjLQG3XBzaUj+ufIENwNjdAHhlD8l2vX7Yr3JZRT6yN/84wBCj7Tw1xd1g==", + "dependencies": { + "@aws-sdk/types": "3.523.0", + "@smithy/types": "^2.10.1", + "@smithy/util-endpoints": "^1.1.4", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/util-locate-window": { + "version": "3.535.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.535.0.tgz", + "integrity": "sha512-PHJ3SL6d2jpcgbqdgiPxkXpu7Drc2PYViwxSIqvvMKhDwzSB1W3mMvtpzwKM4IE7zLFodZo0GKjJ9AsoXndXhA==", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/util-user-agent-browser": { + "version": "3.523.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.523.0.tgz", + "integrity": "sha512-6ZRNdGHX6+HQFqTbIA5+i8RWzxFyxsZv8D3soRfpdyWIKkzhSz8IyRKXRciwKBJDaC7OX2jzGE90wxRQft27nA==", + "dependencies": { + "@aws-sdk/types": "3.523.0", + "@smithy/types": "^2.10.1", + "bowser": "^2.11.0", + "tslib": "^2.5.0" + } + }, + "node_modules/@aws-sdk/util-user-agent-node": { + "version": "3.525.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.525.0.tgz", + "integrity": "sha512-88Wjt4efyUSBGcyIuh1dvoMqY1k15jpJc5A/3yi67clBQEFsu9QCodQCQPqmRjV3VRcMtBOk+jeCTiUzTY5dRQ==", + "dependencies": { + "@aws-sdk/types": "3.523.0", + "@smithy/node-config-provider": "^2.2.4", + "@smithy/types": "^2.10.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "aws-crt": ">=1.0.0" + }, + "peerDependenciesMeta": { + "aws-crt": { + "optional": true + } + } + }, + "node_modules/@aws-sdk/util-utf8-browser": { + "version": "3.259.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8-browser/-/util-utf8-browser-3.259.0.tgz", + "integrity": "sha512-UvFa/vR+e19XookZF8RzFZBrw2EUkQWxiBW0yYQAhvk3C+QVGl0H3ouca8LDBlBfQKXwmW3huo/59H8rwb1wJw==", + "dependencies": { + "tslib": "^2.3.1" + } + }, + "node_modules/@inquirer/figures": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.1.tgz", + "integrity": "sha512-mtup3wVKia3ZwULPHcbs4Mor8Voi+iIXEWD7wCNbIO6lYR62oPCTQyrddi5OMYVXHzeCSoneZwJuS8sBvlEwDw==", + "engines": { + "node": ">=18" + } + }, + "node_modules/@ljharb/through": { + "version": "2.3.13", + "resolved": "https://registry.npmjs.org/@ljharb/through/-/through-2.3.13.tgz", + "integrity": "sha512-/gKJun8NNiWGZJkGzI/Ragc53cOdcLNdzjLaIa+GEjguQs0ulsurx8WN0jijdK9yPqDvziX995sMRLyLt1uZMQ==", + "dependencies": { + "call-bind": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/@n8n/vm2": { + "version": "3.9.23", + "resolved": "https://registry.npmjs.org/@n8n/vm2/-/vm2-3.9.23.tgz", + "integrity": "sha512-yu+It+L89uljQsCJ2e9cQaXzoXJe9bU69QQIoWUOcUw0u5Zon37DuB7bdNNsjKS1ZdFD+fBWCQpq/FkqHsSjXQ==", + "peer": true, + "dependencies": { + "acorn": "^8.7.0", + "acorn-walk": "^8.2.0" + }, + "bin": { + "vm2": "bin/vm2" + }, + "engines": { + "node": ">=18.10", + "pnpm": ">=8.6.12" + } + }, + "node_modules/@postman/form-data": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@postman/form-data/-/form-data-3.1.1.tgz", + "integrity": "sha512-vjh8Q2a8S6UCm/KKs31XFJqEEgmbjBmpPNVV2eVav6905wyFAwaUOBGA1NPBI4ERH9MMZc6w0umFgM6WbEPMdg==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@postman/tough-cookie": { + "version": "4.1.3-postman.1", + "resolved": "https://registry.npmjs.org/@postman/tough-cookie/-/tough-cookie-4.1.3-postman.1.tgz", + "integrity": "sha512-txpgUqZOnWYnUHZpHjkfb0IwVH4qJmyq77pPnJLlfhMtdCLMFTEeQHlzQiK906aaNCe4NEB5fGJHo9uzGbFMeA==", + "dependencies": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.2.0", + "url-parse": "^1.5.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@postman/tough-cookie/node_modules/universalify": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", + "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", + "engines": { + "node": ">= 4.0.0" + } + }, + "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==", + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@smithy/abort-controller": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-2.2.0.tgz", + "integrity": "sha512-wRlta7GuLWpTqtFfGo+nZyOO1vEvewdNR1R4rTxpC8XU6vG/NDyrFBhwLZsqg1NUoR1noVaXJPC/7ZK47QCySw==", + "dependencies": { + "@smithy/types": "^2.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/config-resolver": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-2.2.0.tgz", + "integrity": "sha512-fsiMgd8toyUba6n1WRmr+qACzXltpdDkPTAaDqc8QqPBUzO+/JKwL6bUBseHVi8tu9l+3JOK+tSf7cay+4B3LA==", + "dependencies": { + "@smithy/node-config-provider": "^2.3.0", + "@smithy/types": "^2.12.0", + "@smithy/util-config-provider": "^2.3.0", + "@smithy/util-middleware": "^2.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/core": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/@smithy/core/-/core-1.4.2.tgz", + "integrity": "sha512-2fek3I0KZHWJlRLvRTqxTEri+qV0GRHrJIoLFuBMZB4EMg4WgeBGfF0X6abnrNYpq55KJ6R4D6x4f0vLnhzinA==", + "dependencies": { + "@smithy/middleware-endpoint": "^2.5.1", + "@smithy/middleware-retry": "^2.3.1", + "@smithy/middleware-serde": "^2.3.0", + "@smithy/protocol-http": "^3.3.0", + "@smithy/smithy-client": "^2.5.1", + "@smithy/types": "^2.12.0", + "@smithy/util-middleware": "^2.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/credential-provider-imds": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-2.3.0.tgz", + "integrity": "sha512-BWB9mIukO1wjEOo1Ojgl6LrG4avcaC7T/ZP6ptmAaW4xluhSIPZhY+/PI5YKzlk+jsm+4sQZB45Bt1OfMeQa3w==", + "dependencies": { + "@smithy/node-config-provider": "^2.3.0", + "@smithy/property-provider": "^2.2.0", + "@smithy/types": "^2.12.0", + "@smithy/url-parser": "^2.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/fetch-http-handler": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-2.5.0.tgz", + "integrity": "sha512-BOWEBeppWhLn/no/JxUL/ghTfANTjT7kg3Ww2rPqTUY9R4yHPXxJ9JhMe3Z03LN3aPwiwlpDIUcVw1xDyHqEhw==", + "dependencies": { + "@smithy/protocol-http": "^3.3.0", + "@smithy/querystring-builder": "^2.2.0", + "@smithy/types": "^2.12.0", + "@smithy/util-base64": "^2.3.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@smithy/hash-node": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-2.2.0.tgz", + "integrity": "sha512-zLWaC/5aWpMrHKpoDF6nqpNtBhlAYKF/7+9yMN7GpdR8CzohnWfGtMznPybnwSS8saaXBMxIGwJqR4HmRp6b3g==", + "dependencies": { + "@smithy/types": "^2.12.0", + "@smithy/util-buffer-from": "^2.2.0", + "@smithy/util-utf8": "^2.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/invalid-dependency": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-2.2.0.tgz", + "integrity": "sha512-nEDASdbKFKPXN2O6lOlTgrEEOO9NHIeO+HVvZnkqc8h5U9g3BIhWsvzFo+UcUbliMHvKNPD/zVxDrkP1Sbgp8Q==", + "dependencies": { + "@smithy/types": "^2.12.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@smithy/is-array-buffer": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz", + "integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/middleware-content-length": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-2.2.0.tgz", + "integrity": "sha512-5bl2LG1Ah/7E5cMSC+q+h3IpVHMeOkG0yLRyQT1p2aMJkSrZG7RlXHPuAgb7EyaFeidKEnnd/fNaLLaKlHGzDQ==", + "dependencies": { + "@smithy/protocol-http": "^3.3.0", + "@smithy/types": "^2.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/middleware-endpoint": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-2.5.1.tgz", + "integrity": "sha512-1/8kFp6Fl4OsSIVTWHnNjLnTL8IqpIb/D3sTSczrKFnrE9VMNWxnrRKNvpUHOJ6zpGD5f62TPm7+17ilTJpiCQ==", + "dependencies": { + "@smithy/middleware-serde": "^2.3.0", + "@smithy/node-config-provider": "^2.3.0", + "@smithy/shared-ini-file-loader": "^2.4.0", + "@smithy/types": "^2.12.0", + "@smithy/url-parser": "^2.2.0", + "@smithy/util-middleware": "^2.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/middleware-retry": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-2.3.1.tgz", + "integrity": "sha512-P2bGufFpFdYcWvqpyqqmalRtwFUNUA8vHjJR5iGqbfR6mp65qKOLcUd6lTr4S9Gn/enynSrSf3p3FVgVAf6bXA==", + "dependencies": { + "@smithy/node-config-provider": "^2.3.0", + "@smithy/protocol-http": "^3.3.0", + "@smithy/service-error-classification": "^2.1.5", + "@smithy/smithy-client": "^2.5.1", + "@smithy/types": "^2.12.0", + "@smithy/util-middleware": "^2.2.0", + "@smithy/util-retry": "^2.2.0", + "tslib": "^2.6.2", + "uuid": "^9.0.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/middleware-serde": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-2.3.0.tgz", + "integrity": "sha512-sIADe7ojwqTyvEQBe1nc/GXB9wdHhi9UwyX0lTyttmUWDJLP655ZYE1WngnNyXREme8I27KCaUhyhZWRXL0q7Q==", + "dependencies": { + "@smithy/types": "^2.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/middleware-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-2.2.0.tgz", + "integrity": "sha512-Qntc3jrtwwrsAC+X8wms8zhrTr0sFXnyEGhZd9sLtsJ/6gGQKFzNB+wWbOcpJd7BR8ThNCoKt76BuQahfMvpeA==", + "dependencies": { + "@smithy/types": "^2.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/node-config-provider": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-2.3.0.tgz", + "integrity": "sha512-0elK5/03a1JPWMDPaS726Iw6LpQg80gFut1tNpPfxFuChEEklo2yL823V94SpTZTxmKlXFtFgsP55uh3dErnIg==", + "dependencies": { + "@smithy/property-provider": "^2.2.0", + "@smithy/shared-ini-file-loader": "^2.4.0", + "@smithy/types": "^2.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/node-http-handler": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-2.5.0.tgz", + "integrity": "sha512-mVGyPBzkkGQsPoxQUbxlEfRjrj6FPyA3u3u2VXGr9hT8wilsoQdZdvKpMBFMB8Crfhv5dNkKHIW0Yyuc7eABqA==", + "dependencies": { + "@smithy/abort-controller": "^2.2.0", + "@smithy/protocol-http": "^3.3.0", + "@smithy/querystring-builder": "^2.2.0", + "@smithy/types": "^2.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/property-provider": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-2.2.0.tgz", + "integrity": "sha512-+xiil2lFhtTRzXkx8F053AV46QnIw6e7MV8od5Mi68E1ICOjCeCHw2XfLnDEUHnT9WGUIkwcqavXjfwuJbGlpg==", + "dependencies": { + "@smithy/types": "^2.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/protocol-http": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-3.3.0.tgz", + "integrity": "sha512-Xy5XK1AFWW2nlY/biWZXu6/krgbaf2dg0q492D8M5qthsnU2H+UgFeZLbM76FnH7s6RO/xhQRkj+T6KBO3JzgQ==", + "dependencies": { + "@smithy/types": "^2.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/querystring-builder": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-2.2.0.tgz", + "integrity": "sha512-L1kSeviUWL+emq3CUVSgdogoM/D9QMFaqxL/dd0X7PCNWmPXqt+ExtrBjqT0V7HLN03Vs9SuiLrG3zy3JGnE5A==", + "dependencies": { + "@smithy/types": "^2.12.0", + "@smithy/util-uri-escape": "^2.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/querystring-parser": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-2.2.0.tgz", + "integrity": "sha512-BvHCDrKfbG5Yhbpj4vsbuPV2GgcpHiAkLeIlcA1LtfpMz3jrqizP1+OguSNSj1MwBHEiN+jwNisXLGdajGDQJA==", + "dependencies": { + "@smithy/types": "^2.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/service-error-classification": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-2.1.5.tgz", + "integrity": "sha512-uBDTIBBEdAQryvHdc5W8sS5YX7RQzF683XrHePVdFmAgKiMofU15FLSM0/HU03hKTnazdNRFa0YHS7+ArwoUSQ==", + "dependencies": { + "@smithy/types": "^2.12.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/shared-ini-file-loader": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-2.4.0.tgz", + "integrity": "sha512-WyujUJL8e1B6Z4PBfAqC/aGY1+C7T0w20Gih3yrvJSk97gpiVfB+y7c46T4Nunk+ZngLq0rOIdeVeIklk0R3OA==", + "dependencies": { + "@smithy/types": "^2.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/signature-v4": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-2.3.0.tgz", + "integrity": "sha512-ui/NlpILU+6HAQBfJX8BBsDXuKSNrjTSuOYArRblcrErwKFutjrCNb/OExfVRyj9+26F9J+ZmfWT+fKWuDrH3Q==", + "dependencies": { + "@smithy/is-array-buffer": "^2.2.0", + "@smithy/types": "^2.12.0", + "@smithy/util-hex-encoding": "^2.2.0", + "@smithy/util-middleware": "^2.2.0", + "@smithy/util-uri-escape": "^2.2.0", + "@smithy/util-utf8": "^2.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/smithy-client": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-2.5.1.tgz", + "integrity": "sha512-jrbSQrYCho0yDaaf92qWgd+7nAeap5LtHTI51KXqmpIFCceKU3K9+vIVTUH72bOJngBMqa4kyu1VJhRcSrk/CQ==", + "dependencies": { + "@smithy/middleware-endpoint": "^2.5.1", + "@smithy/middleware-stack": "^2.2.0", + "@smithy/protocol-http": "^3.3.0", + "@smithy/types": "^2.12.0", + "@smithy/util-stream": "^2.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/types": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.12.0.tgz", + "integrity": "sha512-QwYgloJ0sVNBeBuBs65cIkTbfzV/Q6ZNPCJ99EICFEdJYG50nGIY/uYXp+TbsdJReIuPr0a0kXmCvren3MbRRw==", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/url-parser": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-2.2.0.tgz", + "integrity": "sha512-hoA4zm61q1mNTpksiSWp2nEl1dt3j726HdRhiNgVJQMj7mLp7dprtF57mOB6JvEk/x9d2bsuL5hlqZbBuHQylQ==", + "dependencies": { + "@smithy/querystring-parser": "^2.2.0", + "@smithy/types": "^2.12.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@smithy/util-base64": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-2.3.0.tgz", + "integrity": "sha512-s3+eVwNeJuXUwuMbusncZNViuhv2LjVJ1nMwTqSA0XAC7gjKhqqxRdJPhR8+YrkoZ9IiIbFk/yK6ACe/xlF+hw==", + "dependencies": { + "@smithy/util-buffer-from": "^2.2.0", + "@smithy/util-utf8": "^2.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/util-body-length-browser": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-2.2.0.tgz", + "integrity": "sha512-dtpw9uQP7W+n3vOtx0CfBD5EWd7EPdIdsQnWTDoFf77e3VUf05uA7R7TGipIo8e4WL2kuPdnsr3hMQn9ziYj5w==", + "dependencies": { + "tslib": "^2.6.2" + } + }, + "node_modules/@smithy/util-body-length-node": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-2.3.0.tgz", + "integrity": "sha512-ITWT1Wqjubf2CJthb0BuT9+bpzBfXeMokH/AAa5EJQgbv9aPMVfnM76iFIZVFf50hYXGbtiV71BHAthNWd6+dw==", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/util-buffer-from": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz", + "integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==", + "dependencies": { + "@smithy/is-array-buffer": "^2.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/util-config-provider": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-2.3.0.tgz", + "integrity": "sha512-HZkzrRcuFN1k70RLqlNK4FnPXKOpkik1+4JaBoHNJn+RnJGYqaa3c5/+XtLOXhlKzlRgNvyaLieHTW2VwGN0VQ==", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/util-defaults-mode-browser": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-2.2.1.tgz", + "integrity": "sha512-RtKW+8j8skk17SYowucwRUjeh4mCtnm5odCL0Lm2NtHQBsYKrNW0od9Rhopu9wF1gHMfHeWF7i90NwBz/U22Kw==", + "dependencies": { + "@smithy/property-provider": "^2.2.0", + "@smithy/smithy-client": "^2.5.1", + "@smithy/types": "^2.12.0", + "bowser": "^2.11.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@smithy/util-defaults-mode-node": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-2.3.1.tgz", + "integrity": "sha512-vkMXHQ0BcLFysBMWgSBLSk3+leMpFSyyFj8zQtv5ZyUBx8/owVh1/pPEkzmW/DR/Gy/5c8vjLDD9gZjXNKbrpA==", + "dependencies": { + "@smithy/config-resolver": "^2.2.0", + "@smithy/credential-provider-imds": "^2.3.0", + "@smithy/node-config-provider": "^2.3.0", + "@smithy/property-provider": "^2.2.0", + "@smithy/smithy-client": "^2.5.1", + "@smithy/types": "^2.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@smithy/util-endpoints": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-1.2.0.tgz", + "integrity": "sha512-BuDHv8zRjsE5zXd3PxFXFknzBG3owCpjq8G3FcsXW3CykYXuEqM3nTSsmLzw5q+T12ZYuDlVUZKBdpNbhVtlrQ==", + "dependencies": { + "@smithy/node-config-provider": "^2.3.0", + "@smithy/types": "^2.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@smithy/util-hex-encoding": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-2.2.0.tgz", + "integrity": "sha512-7iKXR+/4TpLK194pVjKiasIyqMtTYJsgKgM242Y9uzt5dhHnUDvMNb+3xIhRJ9QhvqGii/5cRUt4fJn3dtXNHQ==", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/util-middleware": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-2.2.0.tgz", + "integrity": "sha512-L1qpleXf9QD6LwLCJ5jddGkgWyuSvWBkJwWAZ6kFkdifdso+sk3L3O1HdmPvCdnCK3IS4qWyPxev01QMnfHSBw==", + "dependencies": { + "@smithy/types": "^2.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/util-retry": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-2.2.0.tgz", + "integrity": "sha512-q9+pAFPTfftHXRytmZ7GzLFFrEGavqapFc06XxzZFcSIGERXMerXxCitjOG1prVDR9QdjqotF40SWvbqcCpf8g==", + "dependencies": { + "@smithy/service-error-classification": "^2.1.5", + "@smithy/types": "^2.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@smithy/util-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-2.2.0.tgz", + "integrity": "sha512-17faEXbYWIRst1aU9SvPZyMdWmqIrduZjVOqCPMIsWFNxs5yQQgFrJL6b2SdiCzyW9mJoDjFtgi53xx7EH+BXA==", + "dependencies": { + "@smithy/fetch-http-handler": "^2.5.0", + "@smithy/node-http-handler": "^2.5.0", + "@smithy/types": "^2.12.0", + "@smithy/util-base64": "^2.3.0", + "@smithy/util-buffer-from": "^2.2.0", + "@smithy/util-hex-encoding": "^2.2.0", + "@smithy/util-utf8": "^2.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/util-uri-escape": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-2.2.0.tgz", + "integrity": "sha512-jtmJMyt1xMD/d8OtbVJ2gFZOSKc+ueYJZPW20ULW1GOp/q/YIM0wNh+u8ZFao9UaIGz4WoPW8hC64qlWLIfoDA==", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/util-utf8": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", + "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==", + "dependencies": { + "@smithy/util-buffer-from": "^2.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@usebruno/cli": { + "version": "1.14.0", + "resolved": "https://registry.npmjs.org/@usebruno/cli/-/cli-1.14.0.tgz", + "integrity": "sha512-MiB2Mwtsscujvb4abdtGvQ6/UW7nGLsQPJ8VDpjm+F+A1/UCG5PFHLpqMBEeoAWlntDBVg85l9pTMjy+5AKnRA==", + "dependencies": { + "@aws-sdk/credential-providers": "3.525.0", + "@usebruno/common": "0.1.0", + "@usebruno/js": "0.11.0", + "@usebruno/lang": "0.12.0", + "aws4-axios": "^3.3.0", + "axios": "^1.5.1", + "chai": "^4.3.7", + "chalk": "^3.0.0", + "decomment": "^0.9.5", + "form-data": "^4.0.0", + "fs-extra": "^10.1.0", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.2", + "inquirer": "^9.1.4", + "json-bigint": "^1.0.0", + "lodash": "^4.17.21", + "mustache": "^4.2.0", + "qs": "^6.11.0", + "socks-proxy-agent": "^8.0.2", + "vm2": "^3.9.13", + "xmlbuilder": "^15.1.1", + "yargs": "^17.6.2" + }, + "bin": { + "bru": "bin/bru.js" + } + }, + "node_modules/@usebruno/cli/node_modules/xmlbuilder": { + "version": "15.1.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-15.1.1.tgz", + "integrity": "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==", + "engines": { + "node": ">=8.0" + } + }, + "node_modules/@usebruno/common": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@usebruno/common/-/common-0.1.0.tgz", + "integrity": "sha512-JtuS1JUmpB/pylSNjXJVHc4ZBMnW15CvCRxGLX55LGfJVpk0ihSsCMtHwKZsuIPvi8sUIIJ9ksFuAdygAmKBeQ==" + }, + "node_modules/@usebruno/js": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@usebruno/js/-/js-0.11.0.tgz", + "integrity": "sha512-csbKAnFtLTupG46aMIahRWeNW8/rdDeaZPtvr4kIzcHDPNmKNowcFcrIR4VSpceh47Ltpm8n0sgzrHzw8P8Yjg==", + "dependencies": { + "@usebruno/query": "0.1.0", + "ajv": "^8.12.0", + "ajv-formats": "^2.1.1", + "atob": "^2.1.2", + "axios": "^1.5.1", + "btoa": "^1.2.1", + "chai": "^4.3.7", + "chai-string": "^1.5.0", + "crypto-js": "^4.1.1", + "handlebars": "^4.7.8", + "json-query": "^2.2.2", + "lodash": "^4.17.21", + "moment": "^2.29.4", + "nanoid": "3.3.4", + "node-fetch": "2.*", + "node-vault": "^0.10.2", + "uuid": "^9.0.0" + }, + "peerDependencies": { + "@n8n/vm2": "^3.9.23" + } + }, + "node_modules/@usebruno/lang": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@usebruno/lang/-/lang-0.12.0.tgz", + "integrity": "sha512-aERfAHkYTG+DSnmt0nS48tkrEuHUVaGA5JFReCjU6Q4w2D8MlAC3PGv93xE0Grl0/o0oWgMXz1xES0syXUtjOw==", + "dependencies": { + "arcsecond": "^5.0.0", + "dotenv": "^16.3.1", + "lodash": "^4.17.21", + "ohm-js": "^16.6.0" + } + }, + "node_modules/@usebruno/query": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@usebruno/query/-/query-0.1.0.tgz", + "integrity": "sha512-+upwS01y6mMHS91pgh1Iu2nclish7N4otviIs7dJmNLI4AO3UyC3hEFzykls5A6p7mlbVSP2DCCFOPGThhPVCg==" + }, + "node_modules/acorn": { + "version": "8.11.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", + "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.2.tgz", + "integrity": "sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==", + "engines": { + "node": ">=0.4.0" + } + }, + "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==", + "dependencies": { + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/arcsecond": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/arcsecond/-/arcsecond-5.0.0.tgz", + "integrity": "sha512-J/fHdyadnsIencRsM6oUSsraCKG+Ni9Udcgr/eusxjTzX3SEQtCUQSpP0YtImFPfIK6DdT1nqwN0ng4FqNmwgA==" + }, + "node_modules/asn1": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", + "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", + "dependencies": { + "safer-buffer": "~2.1.0" + } + }, + "node_modules/assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/assertion-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", + "engines": { + "node": "*" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "node_modules/atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "bin": { + "atob": "bin/atob.js" + }, + "engines": { + "node": ">= 4.5.0" + } + }, + "node_modules/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/aws4-axios": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/aws4-axios/-/aws4-axios-3.3.4.tgz", + "integrity": "sha512-pcyliHZ1G6DqWvP1ITHX/LH+yc2vDzx6epB+/XDPA1oBZeIFyh71MlwjHcGemHRxcVq8pW5tzNln4S6GgZ1BFw==", + "workspaces": [ + "infra" + ], + "dependencies": { + "@aws-sdk/client-sts": "^3.4.1", + "aws4": "^1.12.0" + }, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "axios": ">=1.6.0" + } + }, + "node_modules/axios": { + "version": "1.6.8", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.8.tgz", + "integrity": "sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ==", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/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/bignumber.js": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.2.tgz", + "integrity": "sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==", + "engines": { + "node": "*" + } + }, + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/bluebird": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-2.11.0.tgz", + "integrity": "sha512-UfFSr22dmHPQqPP9XWHRhq+gWnHCYguQGkXQlbyPtW5qTnhFWA8/iXg765tH0cAjy7l/zPJ1aBTO0g5XgA7kvQ==" + }, + "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/brotli": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/brotli/-/brotli-1.3.3.tgz", + "integrity": "sha512-oTKjJdShmDuGW94SyyaoQvAjf30dZaHnjJ8uAF+u2/vGJkJbJPJAT1gDiOJP5v1Zb6f9KEyW/1HpuaWIXtGHPg==", + "dependencies": { + "base64-js": "^1.1.2" + } + }, + "node_modules/btoa": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/btoa/-/btoa-1.2.1.tgz", + "integrity": "sha512-SB4/MIGlsiVkMcHmT+pSmIPoNDoHg+7cMzmt3Uxt628MTz2487DKSqK/fuhFBrkuqrYv5UCEnACpF4dTFNKc/g==", + "bin": { + "btoa": "bin/btoa.js" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/call-bind": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/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.4.1", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.4.1.tgz", + "integrity": "sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==", + "dependencies": { + "assertion-error": "^1.1.0", + "check-error": "^1.0.3", + "deep-eql": "^4.1.3", + "get-func-name": "^2.0.2", + "loupe": "^2.3.6", + "pathval": "^1.1.1", + "type-detect": "^4.0.8" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chai-string": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/chai-string/-/chai-string-1.5.0.tgz", + "integrity": "sha512-sydDC3S3pNAQMYwJrs6dQX0oBQ6KfIPuOZ78n7rocW0eJJlsHPh2t3kwW7xfwYA/1Bf6/arGtSUo16rxR2JFlw==", + "peerDependencies": { + "chai": "^4.1.2" + } + }, + "node_modules/chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==" + }, + "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==", + "dependencies": { + "get-func-name": "^2.0.2" + }, + "engines": { + "node": "*" + } + }, + "node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-spinners": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", + "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-width": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", + "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", + "engines": { + "node": ">= 12" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/cliui/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/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/crypto-js": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.2.0.tgz", + "integrity": "sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==" + }, + "node_modules/dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", + "dependencies": { + "assert-plus": "^1.0.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decomment": { + "version": "0.9.5", + "resolved": "https://registry.npmjs.org/decomment/-/decomment-0.9.5.tgz", + "integrity": "sha512-h0TZ8t6Dp49duwyDHo3iw67mnh9/UpFiSSiOb5gDK1sqoXzrfX/SQxIUQd2R2QEiSnqib0KF2fnKnGfAhAs6lg==", + "dependencies": { + "esprima": "4.0.1" + }, + "engines": { + "node": ">=6.4", + "npm": ">=2.15" + } + }, + "node_modules/deep-eql": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz", + "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==", + "dependencies": { + "type-detect": "^4.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/defaults": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", + "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", + "dependencies": { + "clone": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/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/dotenv": { + "version": "16.4.5", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz", + "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", + "dependencies": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "node_modules/ecc-jsbn/node_modules/jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==" + }, + "node_modules/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/es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "dependencies": { + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/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/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/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==", + "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/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-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-xml-parser": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.2.5.tgz", + "integrity": "sha512-B9/wizE4WngqQftFPmdaMYlXoJlJOYxGQOanC77fq9k8+Z0v5dDSVh+3glErdIROP//s/jgb7ZuxKfB8nVyo0g==", + "funding": [ + { + "type": "paypal", + "url": "https://paypal.me/naturalintelligence" + }, + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "dependencies": { + "strnum": "^1.0.5" + }, + "bin": { + "fxparser": "src/cli/cli.js" + } + }, + "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.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", + "engines": { + "node": "*" + } + }, + "node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "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/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-func-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", + "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==", + "engines": { + "node": "*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/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/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" + }, + "node_modules/handlebars": { + "version": "4.7.8", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", + "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", + "dependencies": { + "minimist": "^1.2.5", + "neo-async": "^2.6.2", + "source-map": "^0.6.1", + "wordwrap": "^1.0.0" + }, + "bin": { + "handlebars": "bin/handlebars" + }, + "engines": { + "node": ">=0.4.7" + }, + "optionalDependencies": { + "uglify-js": "^3.1.4" + } + }, + "node_modules/har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==", + "engines": { + "node": ">=4" + } + }, + "node_modules/har-validator": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", + "deprecated": "this library is no longer supported", + "dependencies": { + "ajv": "^6.12.3", + "har-schema": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/har-validator/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/har-validator/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/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/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/http-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/http-signature": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.3.6.tgz", + "integrity": "sha512-3adrsD6zqo4GsTqtO7FyrejHNv+NgiIfAfv68+jVlFmSr9OGy7zrxONceFRLKvnnZA5jbxQBX1u9PpB6Wi32Gw==", + "dependencies": { + "assert-plus": "^1.0.0", + "jsprim": "^2.0.2", + "sshpk": "^1.14.1" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/https-proxy-agent": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.4.tgz", + "integrity": "sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg==", + "dependencies": { + "agent-base": "^7.0.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/inquirer": { + "version": "9.2.19", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-9.2.19.tgz", + "integrity": "sha512-WpxOT71HGsFya6/mj5PUue0sWwbpbiPfAR+332zLj/siB0QA1PZM8v3GepegFV1Op189UxHUCF6y8AySdtOMVA==", + "dependencies": { + "@inquirer/figures": "^1.0.1", + "@ljharb/through": "^2.3.13", + "ansi-escapes": "^4.3.2", + "chalk": "^5.3.0", + "cli-cursor": "^3.1.0", + "cli-width": "^4.1.0", + "external-editor": "^3.1.0", + "lodash": "^4.17.21", + "mute-stream": "1.0.0", + "ora": "^5.4.1", + "run-async": "^3.0.0", + "rxjs": "^7.8.1", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^6.2.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/inquirer/node_modules/chalk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/ip-address": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", + "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==", + "dependencies": { + "jsbn": "1.1.0", + "sprintf-js": "^1.1.3" + }, + "engines": { + "node": ">= 12" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-interactive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", + "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" + }, + "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==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==" + }, + "node_modules/jsbn": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz", + "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==" + }, + "node_modules/json-bigint": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz", + "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==", + "dependencies": { + "bignumber.js": "^9.0.0" + } + }, + "node_modules/json-query": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/json-query/-/json-query-2.2.2.tgz", + "integrity": "sha512-y+IcVZSdqNmS4fO8t1uZF6RMMs0xh3SrTjJr9bp1X3+v0Q13+7Cyv12dSmKwDswp/H427BVtpkLWhGxYu3ZWRA==", + "engines": { + "node": "*" + } + }, + "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": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, + "node_modules/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/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jsprim": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-2.0.2.tgz", + "integrity": "sha512-gqXddjPqQ6G40VdnI6T6yObEC+pDNvyP95wdQhkWkg7crHH3km5qP1FsOXEkzEQwnz6gz5qGTn1c2Y52wP3OyQ==", + "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/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "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==", + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-symbols/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/loupe": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.7.tgz", + "integrity": "sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==", + "dependencies": { + "get-func-name": "^2.0.1" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-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/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/moment": { + "version": "2.30.1", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz", + "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==", + "engines": { + "node": "*" + } + }, + "node_modules/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/mustache": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/mustache/-/mustache-4.2.0.tgz", + "integrity": "sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==", + "bin": { + "mustache": "bin/mustache" + } + }, + "node_modules/mute-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-1.0.0.tgz", + "integrity": "sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/nanoid": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", + "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "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/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-vault": { + "version": "0.10.2", + "resolved": "https://registry.npmjs.org/node-vault/-/node-vault-0.10.2.tgz", + "integrity": "sha512-//uc9/YImE7Dx0QHdwMiAzLaOumiKUnOUP8DymgtkZ8nsq6/V2LKvEu6kw91Lcruw8lWUfj4DO7CIXNPRWBuuA==", + "dependencies": { + "debug": "^4.3.4", + "mustache": "^4.2.0", + "postman-request": "^2.88.1-postman.33", + "tv4": "^1.3.0" + }, + "engines": { + "node": ">= 16.0.0" + } + }, + "node_modules/oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "engines": { + "node": "*" + } + }, + "node_modules/object-inspect": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", + "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/ohm-js": { + "version": "16.6.0", + "resolved": "https://registry.npmjs.org/ohm-js/-/ohm-js-16.6.0.tgz", + "integrity": "sha512-X9P4koSGa7swgVQ0gt71UCYtkAQGOjciJPJAz74kDxWt8nXbH5HrDOQG6qBDH7SR40ktNv4x61BwpTDE9q4lRA==", + "engines": { + "node": ">=0.12.1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", + "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", + "dependencies": { + "bl": "^4.1.0", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "is-unicode-supported": "^0.1.0", + "log-symbols": "^4.1.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pathval": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", + "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", + "engines": { + "node": "*" + } + }, + "node_modules/performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==" + }, + "node_modules/postman-request": { + "version": "2.88.1-postman.33", + "resolved": "https://registry.npmjs.org/postman-request/-/postman-request-2.88.1-postman.33.tgz", + "integrity": "sha512-uL9sCML4gPH6Z4hreDWbeinKU0p0Ke261nU7OvII95NU22HN6Dk7T/SaVPaj6T4TsQqGKIFw6/woLZnH7ugFNA==", + "dependencies": { + "@postman/form-data": "~3.1.1", + "@postman/tough-cookie": "~4.1.3-postman.1", + "@postman/tunnel-agent": "^0.6.3", + "aws-sign2": "~0.7.0", + "aws4": "^1.12.0", + "brotli": "^1.3.3", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "har-validator": "~5.1.3", + "http-signature": "~1.3.1", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "^2.1.35", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.3", + "safe-buffer": "^5.1.2", + "stream-length": "^1.0.2", + "uuid": "^8.3.2" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/postman-request/node_modules/qs": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", + "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/postman-request/node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, + "node_modules/psl": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==" + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/qs": { + "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.6" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==" + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==" + }, + "node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/run-async": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-3.0.0.tgz", + "integrity": "sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q==", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/rxjs": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/sax": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.3.0.tgz", + "integrity": "sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA==" + }, + "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": { + "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": ">= 0.4" + } + }, + "node_modules/side-channel": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + }, + "node_modules/smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.3.tgz", + "integrity": "sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==", + "dependencies": { + "ip-address": "^9.0.5", + "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.0.0", + "npm": ">= 3.0.0" + } + }, + "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==", + "dependencies": { + "agent-base": "^7.1.1", + "debug": "^4.3.4", + "socks": "^2.7.1" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sprintf-js": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", + "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==" + }, + "node_modules/sshpk": { + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.18.0.tgz", + "integrity": "sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==", + "dependencies": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + }, + "bin": { + "sshpk-conv": "bin/sshpk-conv", + "sshpk-sign": "bin/sshpk-sign", + "sshpk-verify": "bin/sshpk-verify" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sshpk/node_modules/jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==" + }, + "node_modules/stream-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/stream-length/-/stream-length-1.0.2.tgz", + "integrity": "sha512-aI+qKFiwoDV4rsXiS7WRoCt+v2RX1nUj17+KJC5r2gfh5xoSJIfP6Y3Do/HtvesFcTSWthIuJ3l1cvKQY/+nZg==", + "dependencies": { + "bluebird": "^2.6.2" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strnum": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz", + "integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==" + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dependencies": { + "os-tmpdir": "~1.0.2" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, + "node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + }, + "node_modules/tv4": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/tv4/-/tv4-1.3.0.tgz", + "integrity": "sha512-afizzfpJgvPr+eDkREK4MxJ/+r8nEEHcmitwgnPUqpaP+FpwQyadnxNoSACbgc/b1LsZYtODGoPiFxQrgJgjvw==", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==" + }, + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "engines": { + "node": ">=4" + } + }, + "node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/uglify-js": { + "version": "3.17.4", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz", + "integrity": "sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==", + "optional": true, + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/url-parse": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "node_modules/uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", + "engines": [ + "node >=0.6.0" + ], + "dependencies": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "node_modules/vm2": { + "version": "3.9.19", + "resolved": "https://registry.npmjs.org/vm2/-/vm2-3.9.19.tgz", + "integrity": "sha512-J637XF0DHDMV57R6JyVsTak7nIL8gy5KH4r1HiwWLf/4GBbb5MKL5y7LpmF4A8E2nR6XmzpmMFQ7V7ppPTmUQg==", + "deprecated": "The library contains critical security issues and should not be used for production! The maintenance of the project has been discontinued. Consider migrating your code to isolated-vm.", + "dependencies": { + "acorn": "^8.7.0", + "acorn-walk": "^8.2.0" + }, + "bin": { + "vm2": "bin/vm2" + }, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", + "dependencies": { + "defaults": "^1.0.3" + } + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==" + }, + "node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/xml2js": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.6.2.tgz", + "integrity": "sha512-T4rieHaC1EXcES0Kxxj4JWgaUQHDk+qwHcYOCFHfiwKz7tOVPLq7Hjq9dM1WCMhylqMEfP7hMcOIChvotiZegA==", + "dependencies": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/xmlbuilder": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", + "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/xmldom": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/xmldom/-/xmldom-0.6.0.tgz", + "integrity": "sha512-iAcin401y58LckRZ0TkI4k0VSM1Qg0KGSc3i8rU+xrxe19A/BN1zHyVSJY7uoutVlaTSzYyk/v5AmkewAP7jtg==", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/xpath": { + "version": "0.0.34", + "resolved": "https://registry.npmjs.org/xpath/-/xpath-0.0.34.tgz", + "integrity": "sha512-FxF6+rkr1rNSQrhUNYrAFJpRXNzlDoMxeXN5qI84939ylEv3qqPFKa85Oxr6tDaJKqwW6KKyo2v26TSv3k6LeA==", + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "engines": { + "node": ">=12" + } + } + } +} diff --git a/bruno/package.json b/bruno/package.json new file mode 100644 index 0000000..f8ca8ed --- /dev/null +++ b/bruno/package.json @@ -0,0 +1,33 @@ +{ + "name": "bruno", + "version": "1.0.0", + "description": "API tests for MITRE ATT&CK Workbench TAXII 2.1 API Server", + "main": "index.js", + "scripts": { + "test": "bru run --env aws --format junit --output report.xml" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/mitre-attack/attack-workbench-taxii-server.git" + }, + "keywords": [ + "taxii", + "stix", + "mitre", + "attack", + "att&ck", + "cti" + ], + "author": "Sean Sica", + "license": "Apache-2.0", + "bugs": { + "url": "https://github.com/mitre-attack/attack-workbench-taxii-server/issues" + }, + "homepage": "https://github.com/mitre-attack/attack-workbench-taxii-server#readme", + "dependencies": { + "@usebruno/cli": "^1.14.0", + "xml2js": "^0.6.2", + "xmldom": "^0.6.0", + "xpath": "^0.0.34" + } +} diff --git a/package-lock.json b/package-lock.json index c69789e..e5dfcbe 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2905,12 +2905,21 @@ } }, "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==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/callsites": { @@ -3447,6 +3456,22 @@ "clone": "^1.0.2" } }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -3635,6 +3660,25 @@ "is-arrayish": "^0.2.1" } }, + "node_modules/es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "dependencies": { + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/es-module-lexer": { "version": "0.9.3", "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", @@ -4419,11 +4463,22 @@ "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==" }, "node_modules/follow-redirects": { - "version": "1.15.1", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.1.tgz", - "integrity": "sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA==", + "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.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } } }, "node_modules/fork-ts-checker-webpack-plugin": { @@ -4558,9 +4613,12 @@ } }, "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + "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/functional-red-black-tree": { "version": "1.0.1", @@ -4587,13 +4645,21 @@ } }, "node_modules/get-intrinsic": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.2.tgz", - "integrity": "sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.3" + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/get-package-type": { @@ -4688,6 +4754,17 @@ "node": ">=10" } }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/graceful-fs": { "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", @@ -4697,6 +4774,7 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, "dependencies": { "function-bind": "^1.1.1" }, @@ -4712,6 +4790,28 @@ "node": ">=8" } }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/has-symbols": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", @@ -4720,6 +4820,17 @@ "node": ">= 0.4" } }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/hexoid": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/hexoid/-/hexoid-1.0.0.tgz", @@ -4938,10 +5049,22 @@ "node": ">= 0.10" } }, - "node_modules/ip": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", - "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==" + "node_modules/ip-address": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", + "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==", + "dependencies": { + "jsbn": "1.1.0", + "sprintf-js": "^1.1.3" + }, + "engines": { + "node": ">= 12" + } + }, + "node_modules/ip-address/node_modules/sprintf-js": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", + "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==" }, "node_modules/ipaddr.js": { "version": "1.9.1", @@ -5958,6 +6081,11 @@ "js-yaml": "bin/js-yaml.js" } }, + "node_modules/jsbn": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz", + "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==" + }, "node_modules/jsdom": { "version": "16.7.0", "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.7.0.tgz", @@ -6790,9 +6918,12 @@ } }, "node_modules/object-inspect": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", - "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==" + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", + "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/on-finished": { "version": "2.4.1", @@ -7419,9 +7550,9 @@ } }, "node_modules/rxjs": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.5.5.tgz", - "integrity": "sha512-sy+H0pQofO95VDmFLzyaw9xNJU4KTRSwQIGM6+iG3SypAtCiLDzpeG8sJrNCWn2Up9km+KhkvTdbkrdy+yzZdw==", + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", "dependencies": { "tslib": "^2.1.0" } @@ -7584,6 +7715,22 @@ "node": ">= 0.8.0" } }, + "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": { + "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": ">= 0.4" + } + }, "node_modules/setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", @@ -7628,13 +7775,20 @@ } }, "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==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/sift": { @@ -7686,15 +7840,15 @@ } }, "node_modules/socks": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.0.tgz", - "integrity": "sha512-scnOe9y4VuiNUULJN72GrM26BNOjVsfPXI+j+98PkyEfsIXroa5ofyjT+FzGvn/xHs73U2JtoBYAVx9Hl4quSA==", + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.3.tgz", + "integrity": "sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==", "dependencies": { - "ip": "^2.0.0", + "ip-address": "^9.0.5", "smart-buffer": "^4.2.0" }, "engines": { - "node": ">= 10.13.0", + "node": ">= 10.0.0", "npm": ">= 3.0.0" } }, @@ -11713,12 +11867,15 @@ "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" }, "call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", "requires": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" + "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" } }, "callsites": { @@ -12163,6 +12320,16 @@ "clone": "^1.0.2" } }, + "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==", + "requires": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + } + }, "delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -12310,6 +12477,19 @@ "is-arrayish": "^0.2.1" } }, + "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==", + "requires": { + "get-intrinsic": "^1.2.4" + } + }, + "es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==" + }, "es-module-lexer": { "version": "0.9.3", "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", @@ -12961,9 +13141,9 @@ "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==" }, "follow-redirects": { - "version": "1.15.1", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.1.tgz", - "integrity": "sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA==" + "version": "1.15.6", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", + "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==" }, "fork-ts-checker-webpack-plugin": { "version": "7.2.11", @@ -13073,9 +13253,9 @@ "optional": true }, "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==" }, "functional-red-black-tree": { "version": "1.0.1", @@ -13096,13 +13276,15 @@ "dev": true }, "get-intrinsic": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.2.tgz", - "integrity": "sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", "requires": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.3" + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" } }, "get-package-type": { @@ -13173,6 +13355,14 @@ "slash": "^3.0.0" } }, + "gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "requires": { + "get-intrinsic": "^1.1.3" + } + }, "graceful-fs": { "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", @@ -13182,6 +13372,7 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, "requires": { "function-bind": "^1.1.1" } @@ -13191,11 +13382,32 @@ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" }, + "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==", + "requires": { + "es-define-property": "^1.0.0" + } + }, + "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==" + }, "has-symbols": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" }, + "hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "requires": { + "function-bind": "^1.1.2" + } + }, "hexoid": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/hexoid/-/hexoid-1.0.0.tgz", @@ -13368,10 +13580,21 @@ "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", "dev": true }, - "ip": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", - "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==" + "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==", + "requires": { + "jsbn": "1.1.0", + "sprintf-js": "^1.1.3" + }, + "dependencies": { + "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==" + } + } }, "ipaddr.js": { "version": "1.9.1", @@ -14221,6 +14444,11 @@ "argparse": "^2.0.1" } }, + "jsbn": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz", + "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==" + }, "jsdom": { "version": "16.7.0", "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.7.0.tgz", @@ -14901,9 +15129,9 @@ "integrity": "sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==" }, "object-inspect": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", - "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==" + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", + "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==" }, "on-finished": { "version": "2.4.1", @@ -15396,9 +15624,9 @@ } }, "rxjs": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.5.5.tgz", - "integrity": "sha512-sy+H0pQofO95VDmFLzyaw9xNJU4KTRSwQIGM6+iG3SypAtCiLDzpeG8sJrNCWn2Up9km+KhkvTdbkrdy+yzZdw==", + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", "requires": { "tslib": "^2.1.0" } @@ -15539,6 +15767,19 @@ "send": "0.18.0" } }, + "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==", + "requires": { + "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" + } + }, "setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", @@ -15571,13 +15812,14 @@ } }, "side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "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==", "requires": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" } }, "sift": { @@ -15624,11 +15866,11 @@ "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==" }, "socks": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.0.tgz", - "integrity": "sha512-scnOe9y4VuiNUULJN72GrM26BNOjVsfPXI+j+98PkyEfsIXroa5ofyjT+FzGvn/xHs73U2JtoBYAVx9Hl4quSA==", + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.3.tgz", + "integrity": "sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==", "requires": { - "ip": "^2.0.0", + "ip-address": "^9.0.5", "smart-buffer": "^4.2.0" } },