diff --git a/.github/pull_request_labeler.yaml b/.github/pull_request_labeler.yaml
index 60e22451..466c1c4c 100644
--- a/.github/pull_request_labeler.yaml
+++ b/.github/pull_request_labeler.yaml
@@ -62,12 +62,6 @@ python:
- changed-files:
- any-glob-to-any-file: '**/*.py'
-diode-netbox-plugin:
- - changed-files:
- - any-glob-to-any-file:
- - 'diode-netbox-plugin/*'
- - 'diode-netbox-plugin/**/*'
-
diode-proto:
- changed-files:
- any-glob-to-any-file:
diff --git a/.github/workflows/python-netbox-plugin-lint-tests.yml b/.github/workflows/python-netbox-plugin-lint-tests.yml
deleted file mode 100644
index 6c046a77..00000000
--- a/.github/workflows/python-netbox-plugin-lint-tests.yml
+++ /dev/null
@@ -1,55 +0,0 @@
-name: Python NetBox plugin - lint and tests
-on:
- workflow_dispatch:
- pull_request:
- paths:
- - "diode-netbox-plugin/**"
- push:
- branches:
- - "!release"
- paths:
- - "diode-netbox-plugin/**"
-
-concurrency:
- group: ${{ github.workflow }}
- cancel-in-progress: false
-
-permissions:
- contents: write
- checks: write
- pull-requests: write
-
-jobs:
- tests:
- runs-on: ubuntu-latest
- timeout-minutes: 10
- strategy:
- matrix:
- python-version: [ "3.10" ]
- defaults:
- run:
- working-directory: diode-netbox-plugin
- steps:
- - uses: actions/checkout@v4
- - name: Setup Python
- uses: actions/setup-python@v5
- with:
- python-version: ${{ matrix.python }}
- - name: Install dependencies
- run: |
- python -m pip install --upgrade pip
- pip install .
- pip install .[dev]
- pip install .[test]
- - name: Lint with Ruff
- run: |
- ruff check --output-format=github netbox_diode_plugin/ tests/
- continue-on-error: true
- - name: Test
- run: |
- make docker-compose-netbox-plugin-test-cover
- - name: Coverage comment
- uses: orgoro/coverage@v3.2
- with:
- coverageFile: ./diode-netbox-plugin/docker/coverage/report.xml
- token: ${{ secrets.GITHUB_TOKEN }}
diff --git a/.github/workflows/python-netbox-plugin-release.yaml b/.github/workflows/python-netbox-plugin-release.yaml
deleted file mode 100644
index c9e7fd3e..00000000
--- a/.github/workflows/python-netbox-plugin-release.yaml
+++ /dev/null
@@ -1,74 +0,0 @@
-name: Python Netbox plugin - release
-on:
- workflow_dispatch:
- push:
- branches: [release]
- paths:
- - "diode-netbox-plugin/**"
-env:
- GH_TOKEN: ${{ secrets.ORB_CI_GH_TOKEN }}
- SEMANTIC_RELEASE_PACKAGE: ${{ github.repository }}
- APP_DIR: diode-netbox-plugin
- PYTHON_RUNTIME_VERSION: "3.11"
- PYTHON_PACKAGE_NAME: netboxlabs-diode-netbox-plugin
-
-jobs:
- get-next-version:
- uses: netboxlabs/diode/.github/workflows/reusable_semantic_release_get_next_version.yaml@develop
- with:
- # passed vars need hard coding - https://docs.github.com/en/actions/using-workflows/reusing-workflows#limitations
- app_name: diode-netbox-plugin
- app_dir: diode-netbox-plugin
- secrets: inherit
-
- build:
- name: Build
- needs: [get-next-version]
- runs-on: ubuntu-latest
- permissions:
- id-token: write
- contents: read
- defaults:
- run:
- working-directory: ${{ env.APP_DIR }}
- env:
- BUILD_VERSION: ${{ needs.get-next-version.outputs.new-release-version }}
- BUILD_TRACK: release
- BUILD_COMMIT: ${{ needs.get-next-version.outputs.short-sha }}
- steps:
- - uses: actions/checkout@v3
- - uses: actions/setup-python@v5
- with:
- python-version: ${{ env.PYTHON_RUNTIME_VERSION }}
- - name: Insert version variables into Python
- run: |
- sed -i "s/__commit_hash__ = .*/__commit_hash__ = \"${BUILD_COMMIT}\"/" netbox_diode_plugin/version.py
- sed -i "s/__track__ = .*/__track__ = \"${BUILD_TRACK}\"/" netbox_diode_plugin/version.py
- sed -i "s/__version__ = .*/__version__ = \"${BUILD_VERSION}\"/" netbox_diode_plugin/version.py
- - name: Display contents of version.py
- run: cat netbox_diode_plugin/version.py
- - name: Build sdist package
- run: |
- pip install toml-cli
- toml set --toml-path pyproject.toml project.version ${{ env.BUILD_VERSION }}
- cat pyproject.toml | grep version
- python3 -m pip install --upgrade build
- python3 -m build --sdist --outdir dist/
- - name: Upload artifact
- uses: actions/upload-artifact@v4
- with:
- name: ${{ env.PYTHON_PACKAGE_NAME }}-${{ env.BUILD_VERSION }}.tar.gz
- path: ${{ env.APP_DIR }}/dist/${{ env.PYTHON_PACKAGE_NAME }}-${{ env.BUILD_VERSION }}.tar.gz
- retention-days: 30
- if-no-files-found: error
- - name: Publish release distributions to PyPI
- uses: pypa/gh-action-pypi-publish@release/v1
- with:
- packages-dir: ${{ env.APP_DIR }}/dist
-
- semantic-release:
- uses: netboxlabs/diode/.github/workflows/reusable_semantic_release.yaml@develop
- needs: [build]
- with:
- app_dir: diode-netbox-plugin
- secrets: inherit
diff --git a/diode-netbox-plugin/.gitignore b/diode-netbox-plugin/.gitignore
deleted file mode 100644
index 35c795ba..00000000
--- a/diode-netbox-plugin/.gitignore
+++ /dev/null
@@ -1,2 +0,0 @@
-docker/coverage
-!docker/netbox/env
diff --git a/diode-netbox-plugin/.releaserc.json b/diode-netbox-plugin/.releaserc.json
deleted file mode 100644
index a02bb5f3..00000000
--- a/diode-netbox-plugin/.releaserc.json
+++ /dev/null
@@ -1,36 +0,0 @@
-{
- "branches": "release",
- "repositoryUrl": "https://github.com/netboxlabs/diode",
- "debug": "true",
- "extends": "semantic-release-monorepo",
- "tagFormat": "diode-netbox-plugin/v${version}",
- "plugins": [
- ["semantic-release-export-data"],
- ["@semantic-release/commit-analyzer", {
- "releaseRules": [
- { "message": "*", "release": "patch"},
- { "message": "fix*", "release": "patch" },
- { "message": "feat*", "release": "minor" },
- { "message": "perf*", "release": "major" }
- ]
- }],
- "@semantic-release/release-notes-generator",
- [
- "@semantic-release/changelog",
- {
- "changelogFile": "CHANGELOG.md",
- "changelogTitle": "# Semantic Versioning Changelog"
- }
- ],
- [
- "@semantic-release/github",
- {
- "assets": [
- {
- "path": "release/**"
- }
- ]
- }
- ]
- ]
-}
diff --git a/diode-netbox-plugin/LICENSE.txt b/diode-netbox-plugin/LICENSE.txt
deleted file mode 100644
index e69de29b..00000000
diff --git a/diode-netbox-plugin/Makefile b/diode-netbox-plugin/Makefile
deleted file mode 100644
index 82161660..00000000
--- a/diode-netbox-plugin/Makefile
+++ /dev/null
@@ -1,24 +0,0 @@
-.PHONY: docker-compose-netbox-plugin-up docker-compose-netbox-plugin-down docker-compose-netbox-plugin-build docker-compose-netbox-plugin-test docker-compose-netbox-plugin-test-cover
-
-ifneq ($(shell docker compose version 2>/dev/null),)
- DOCKER_COMPOSE := docker compose
-else
- DOCKER_COMPOSE := docker-compose
-endif
-
-docker-compose-netbox-plugin-up:
- @$(DOCKER_COMPOSE) -f docker/docker-compose.yaml up -d --build
-
-docker-compose-netbox-plugin-down:
- @$(DOCKER_COMPOSE) -f docker/docker-compose.yaml down
-
-docker-compose-netbox-plugin-test:
- -@$(DOCKER_COMPOSE) -f docker/docker-compose.yaml run --rm netbox ./manage.py test --keepdb netbox_diode_plugin
- @$(MAKE) docker-compose-netbox-plugin-down
-
-docker-compose-netbox-plugin-build:
- -@$(DOCKER_COMPOSE) -f docker/docker-compose.yaml build
-
-docker-compose-netbox-plugin-test-cover:
- -@$(DOCKER_COMPOSE) -f docker/docker-compose.yaml run --rm -u root -e COVERAGE_FILE=/opt/netbox/netbox/coverage/.coverage netbox sh -c "coverage run --source=netbox_diode_plugin ./manage.py test --keepdb netbox_diode_plugin && coverage xml -o /opt/netbox/netbox/coverage/report.xml && coverage report -m | tee /opt/netbox/netbox/coverage/report.txt"
- @$(MAKE) docker-compose-netbox-plugin-down
diff --git a/diode-netbox-plugin/README.md b/diode-netbox-plugin/README.md
deleted file mode 100644
index b8502b7a..00000000
--- a/diode-netbox-plugin/README.md
+++ /dev/null
@@ -1,21 +0,0 @@
-# Diode NetBox Plugin
-
-## Installation
-
-```bash
-pip install netboxlabs-diode-netbox-plugin
-```
-
-In your `configuration.py` file, add `netbox_diode_plugin` to the `PLUGINS` list.
-
-```python
-PLUGINS = [
- "netbox_diode_plugin",
-]
-```
-
-## Running Tests
-
-```bash
-make docker-compose-netbox-plugin-test
-```
\ No newline at end of file
diff --git a/diode-netbox-plugin/diode-netbox-plugin.iml b/diode-netbox-plugin/diode-netbox-plugin.iml
deleted file mode 100644
index 06c0b237..00000000
--- a/diode-netbox-plugin/diode-netbox-plugin.iml
+++ /dev/null
@@ -1,24 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/diode-netbox-plugin/docker/Dockerfile-diode-netbox-plugin b/diode-netbox-plugin/docker/Dockerfile-diode-netbox-plugin
deleted file mode 100644
index b3e2c9e5..00000000
--- a/diode-netbox-plugin/docker/Dockerfile-diode-netbox-plugin
+++ /dev/null
@@ -1,10 +0,0 @@
-FROM netboxcommunity/netbox:v4.0-2.9.1
-
-COPY ./netbox/configuration/ /etc/netbox/config/
-RUN chmod 755 /etc/netbox/config/* && \
- chown unit:root /etc/netbox/config/*
-
-COPY ./netbox/enable-diode-plugin.sh /opt/netbox/enable-diode-plugin.sh
-
-COPY ./requirements-diode-netbox-plugin.txt /opt/netbox/
-RUN /opt/netbox/venv/bin/pip install --no-warn-script-location -r /opt/netbox/requirements-diode-netbox-plugin.txt
diff --git a/diode-netbox-plugin/docker/docker-compose.yaml b/diode-netbox-plugin/docker/docker-compose.yaml
deleted file mode 100644
index 751df566..00000000
--- a/diode-netbox-plugin/docker/docker-compose.yaml
+++ /dev/null
@@ -1,72 +0,0 @@
-name: diode-netbox-plugin
-services:
- netbox: &netbox
- image: netboxcommunity/netbox:v4.0-2.9.1-diode-netbox-plugin
- build:
- context: .
- dockerfile: Dockerfile-diode-netbox-plugin
- pull: true
- depends_on:
- - netbox-postgres
- - netbox-redis
- - netbox-redis-cache
- env_file: netbox/env/netbox.env
- user: 'unit:root'
- healthcheck:
- start_period: 60s
- timeout: 3s
- interval: 15s
- test: "curl -f http://localhost:8080/netbox/api/ || exit 1"
- volumes:
- - ./netbox/docker-entrypoint.sh:/opt/netbox/docker-entrypoint.sh:z,ro
- - ./netbox/nginx-unit.json:/opt/netbox/nginx-unit.json:z,ro
- - ../netbox_diode_plugin:/opt/netbox/netbox/netbox_diode_plugin:ro
- - ./netbox/launch-netbox.sh:/opt/netbox/launch-netbox.sh:z,ro
- - ./coverage:/opt/netbox/netbox/coverage:z,rw
- - netbox-media-files:/opt/netbox/netbox/media:rw
- - netbox-reports-files:/opt/netbox/netbox/reports:rw
- - netbox-scripts-files:/opt/netbox/netbox/scripts:rw
- ports:
- - "8000:8080"
-
- # postgres
- netbox-postgres:
- image: docker.io/postgres:16-alpine
- env_file: netbox/env/postgres.env
- volumes:
- - netbox-postgres-data:/var/lib/postgresql/data
-
- # redis
- netbox-redis:
- image: docker.io/redis:7-alpine
- command:
- - sh
- - -c # this is to evaluate the $REDIS_PASSWORD from the env
- - redis-server --appendonly yes --requirepass $$REDIS_PASSWORD ## $$ because of docker-compose
- env_file: netbox/env/redis.env
- volumes:
- - netbox-redis-data:/data
-
- netbox-redis-cache:
- image: docker.io/redis:7-alpine
- command:
- - sh
- - -c # this is to evaluate the $REDIS_PASSWORD from the env
- - redis-server --requirepass $$REDIS_PASSWORD ## $$ because of docker-compose
- env_file: netbox/env/redis-cache.env
- volumes:
- - netbox-redis-cache-data:/data
-
-volumes:
- netbox-media-files:
- driver: local
- netbox-postgres-data:
- driver: local
- netbox-redis-cache-data:
- driver: local
- netbox-redis-data:
- driver: local
- netbox-reports-files:
- driver: local
- netbox-scripts-files:
- driver: local
diff --git a/diode-netbox-plugin/docker/netbox/configuration/configuration.py b/diode-netbox-plugin/docker/netbox/configuration/configuration.py
deleted file mode 100644
index cc51c599..00000000
--- a/diode-netbox-plugin/docker/netbox/configuration/configuration.py
+++ /dev/null
@@ -1,324 +0,0 @@
-####
-## We recommend to not edit this file.
-## Create separate files to overwrite the settings.
-## See `extra.py` as an example.
-####
-
-import re
-from os import environ
-from os.path import abspath, dirname, join
-from typing import Any, Callable
-
-# For reference see https://docs.netbox.dev/en/stable/configuration/
-# Based on https://github.com/netbox-community/netbox/blob/develop/netbox/netbox/configuration_example.py
-
-###
-# NetBox-Docker Helper functions
-###
-
-# Read secret from file
-def _read_secret(secret_name: str, default: str | None = None) -> str | None:
- try:
- f = open('/run/secrets/' + secret_name, encoding='utf-8')
- except OSError:
- return default
- else:
- with f:
- return f.readline().strip()
-
-
-# If the `map_fn` isn't defined, then the value that is read from the environment (or the default value if not found) is returned.
-# If the `map_fn` is defined, then `map_fn` is invoked and the value (that was read from the environment or the default value if not found)
-# is passed to it as a parameter. The value returned from `map_fn` is then the return value of this function.
-# The `map_fn` is not invoked, if the value (that was read from the environment or the default value if not found) is None.
-def _environ_get_and_map(variable_name: str, default: str | None = None,
- map_fn: Callable[[str], Any | None] = None) -> Any | None:
- env_value = environ.get(variable_name, default)
-
- if env_value is None:
- return env_value
-
- if not map_fn:
- return env_value
-
- return map_fn(env_value)
-
-
-_AS_BOOL = lambda value: value.lower() == 'true'
-_AS_INT = lambda value: int(value)
-_AS_LIST = lambda value: list(filter(None, value.split(' ')))
-
-_BASE_DIR = dirname(dirname(abspath(__file__)))
-
-#########################
-# #
-# Required settings #
-# #
-#########################
-
-# This is a list of valid fully-qualified domain names (FQDNs) for the NetBox server. NetBox will not permit write
-# access to the server via any other hostnames. The first FQDN in the list will be treated as the preferred name.
-#
-# Example: ALLOWED_HOSTS = ['netbox.example.com', 'netbox.internal.local']
-ALLOWED_HOSTS = environ.get('ALLOWED_HOSTS', '*').split(' ')
-# ensure that '*' or 'localhost' is always in ALLOWED_HOSTS (needed for health checks)
-if '*' not in ALLOWED_HOSTS and 'localhost' not in ALLOWED_HOSTS:
- ALLOWED_HOSTS.append('localhost')
-
-# PostgreSQL database configuration. See the Django documentation for a complete list of available parameters:
-# https://docs.djangoproject.com/en/stable/ref/settings/#databases
-DATABASE = {
- 'NAME': environ.get('DB_NAME', 'netbox'), # Database name
- 'USER': environ.get('DB_USER', ''), # PostgreSQL username
- 'PASSWORD': _read_secret('db_password', environ.get('DB_PASSWORD', '')),
- # PostgreSQL password
- 'HOST': environ.get('DB_HOST', 'localhost'), # Database server
- 'PORT': environ.get('DB_PORT', ''), # Database port (leave blank for default)
- 'OPTIONS': {'sslmode': environ.get('DB_SSLMODE', 'prefer')},
- # Database connection SSLMODE
- 'CONN_MAX_AGE': _environ_get_and_map('DB_CONN_MAX_AGE', '300', _AS_INT),
- # Max database connection age
- 'DISABLE_SERVER_SIDE_CURSORS': _environ_get_and_map('DB_DISABLE_SERVER_SIDE_CURSORS', 'False', _AS_BOOL),
- # Disable the use of server-side cursors transaction pooling
-}
-
-# Redis database settings. Redis is used for caching and for queuing background tasks such as webhook events. A separate
-# configuration exists for each. Full connection details are required in both sections, and it is strongly recommended
-# to use two separate database IDs.
-REDIS = {
- 'tasks': {
- 'HOST': environ.get('REDIS_HOST', 'localhost'),
- 'PORT': _environ_get_and_map('REDIS_PORT', 6379, _AS_INT),
- 'USERNAME': environ.get('REDIS_USERNAME', ''),
- 'PASSWORD': _read_secret('redis_password', environ.get('REDIS_PASSWORD', '')),
- 'DATABASE': _environ_get_and_map('REDIS_DATABASE', 0, _AS_INT),
- 'SSL': _environ_get_and_map('REDIS_SSL', 'False', _AS_BOOL),
- 'INSECURE_SKIP_TLS_VERIFY': _environ_get_and_map('REDIS_INSECURE_SKIP_TLS_VERIFY', 'False', _AS_BOOL),
- },
- 'caching': {
- 'HOST': environ.get('REDIS_CACHE_HOST', environ.get('REDIS_HOST', 'localhost')),
- 'PORT': _environ_get_and_map('REDIS_CACHE_PORT', environ.get('REDIS_PORT', '6379'), _AS_INT),
- 'USERNAME': environ.get('REDIS_CACHE_USERNAME', environ.get('REDIS_USERNAME', '')),
- 'PASSWORD': _read_secret('redis_cache_password',
- environ.get('REDIS_CACHE_PASSWORD', environ.get('REDIS_PASSWORD', ''))),
- 'DATABASE': _environ_get_and_map('REDIS_CACHE_DATABASE', '1', _AS_INT),
- 'SSL': _environ_get_and_map('REDIS_CACHE_SSL', environ.get('REDIS_SSL', 'False'), _AS_BOOL),
- 'INSECURE_SKIP_TLS_VERIFY': _environ_get_and_map('REDIS_CACHE_INSECURE_SKIP_TLS_VERIFY',
- environ.get('REDIS_INSECURE_SKIP_TLS_VERIFY', 'False'),
- _AS_BOOL),
- },
-}
-
-# This key is used for secure generation of random numbers and strings. It must never be exposed outside of this file.
-# For optimal security, SECRET_KEY should be at least 50 characters in length and contain a mix of letters, numbers, and
-# symbols. NetBox will not run without this defined. For more information, see
-# https://docs.djangoproject.com/en/stable/ref/settings/#std:setting-SECRET_KEY
-SECRET_KEY = _read_secret('secret_key', environ.get('SECRET_KEY', ''))
-
-#########################
-# #
-# Optional settings #
-# #
-#########################
-
-# # Specify one or more name and email address tuples representing NetBox administrators. These people will be notified of
-# # application errors (assuming correct email settings are provided).
-# ADMINS = [
-# # ['John Doe', 'jdoe@example.com'],
-# ]
-
-if 'ALLOWED_URL_SCHEMES' in environ:
- ALLOWED_URL_SCHEMES = _environ_get_and_map('ALLOWED_URL_SCHEMES', None, _AS_LIST)
-
-# Optionally display a persistent banner at the top and/or bottom of every page. HTML is allowed. To display the same
-# content in both banners, define BANNER_TOP and set BANNER_BOTTOM = BANNER_TOP.
-if 'BANNER_TOP' in environ:
- BANNER_TOP = environ.get('BANNER_TOP', None)
-if 'BANNER_BOTTOM' in environ:
- BANNER_BOTTOM = environ.get('BANNER_BOTTOM', None)
-
-# Text to include on the login page above the login form. HTML is allowed.
-if 'BANNER_LOGIN' in environ:
- BANNER_LOGIN = environ.get('BANNER_LOGIN', None)
-
-# Maximum number of days to retain logged changes. Set to 0 to retain changes indefinitely. (Default: 90)
-if 'CHANGELOG_RETENTION' in environ:
- CHANGELOG_RETENTION = _environ_get_and_map('CHANGELOG_RETENTION', None, _AS_INT)
-
-# Maximum number of days to retain job results (scripts and reports). Set to 0 to retain job results in the database indefinitely. (Default: 90)
-if 'JOB_RETENTION' in environ:
- JOB_RETENTION = _environ_get_and_map('JOB_RETENTION', None, _AS_INT)
-# JOBRESULT_RETENTION was renamed to JOB_RETENTION in the v3.5.0 release of NetBox. For backwards compatibility, map JOBRESULT_RETENTION to JOB_RETENTION
-elif 'JOBRESULT_RETENTION' in environ:
- JOB_RETENTION = _environ_get_and_map('JOBRESULT_RETENTION', None, _AS_INT)
-
-# API Cross-Origin Resource Sharing (CORS) settings. If CORS_ORIGIN_ALLOW_ALL is set to True, all origins will be
-# allowed. Otherwise, define a list of allowed origins using either CORS_ORIGIN_WHITELIST or
-# CORS_ORIGIN_REGEX_WHITELIST. For more information, see https://github.com/ottoyiu/django-cors-headers
-CORS_ORIGIN_ALLOW_ALL = _environ_get_and_map('CORS_ORIGIN_ALLOW_ALL', 'False', _AS_BOOL)
-CORS_ORIGIN_WHITELIST = _environ_get_and_map('CORS_ORIGIN_WHITELIST', 'https://localhost', _AS_LIST)
-CORS_ORIGIN_REGEX_WHITELIST = [re.compile(r) for r in _environ_get_and_map('CORS_ORIGIN_REGEX_WHITELIST', '', _AS_LIST)]
-
-# Set to True to enable server debugging. WARNING: Debugging introduces a substantial performance penalty and may reveal
-# sensitive information about your installation. Only enable debugging while performing testing.
-# Never enable debugging on a production system.
-DEBUG = _environ_get_and_map('DEBUG', 'False', _AS_BOOL)
-
-# This parameter serves as a safeguard to prevent some potentially dangerous behavior,
-# such as generating new database schema migrations.
-# Set this to True only if you are actively developing the NetBox code base.
-DEVELOPER = _environ_get_and_map('DEVELOPER', 'False', _AS_BOOL)
-
-# Email settings
-EMAIL = {
- 'SERVER': environ.get('EMAIL_SERVER', 'localhost'),
- 'PORT': _environ_get_and_map('EMAIL_PORT', 25, _AS_INT),
- 'USERNAME': environ.get('EMAIL_USERNAME', ''),
- 'PASSWORD': _read_secret('email_password', environ.get('EMAIL_PASSWORD', '')),
- 'USE_SSL': _environ_get_and_map('EMAIL_USE_SSL', 'False', _AS_BOOL),
- 'USE_TLS': _environ_get_and_map('EMAIL_USE_TLS', 'False', _AS_BOOL),
- 'SSL_CERTFILE': environ.get('EMAIL_SSL_CERTFILE', ''),
- 'SSL_KEYFILE': environ.get('EMAIL_SSL_KEYFILE', ''),
- 'TIMEOUT': _environ_get_and_map('EMAIL_TIMEOUT', 10, _AS_INT), # seconds
- 'FROM_EMAIL': environ.get('EMAIL_FROM', ''),
-}
-
-# Enforcement of unique IP space can be toggled on a per-VRF basis. To enforce unique IP space within the global table
-# (all prefixes and IP addresses not assigned to a VRF), set ENFORCE_GLOBAL_UNIQUE to True.
-if 'ENFORCE_GLOBAL_UNIQUE' in environ:
- ENFORCE_GLOBAL_UNIQUE = _environ_get_and_map('ENFORCE_GLOBAL_UNIQUE', None, _AS_BOOL)
-
-# Exempt certain models from the enforcement of view permissions. Models listed here will be viewable by all users and
-# by anonymous users. List models in the form `.`. Add '*' to this list to exempt all models.
-EXEMPT_VIEW_PERMISSIONS = _environ_get_and_map('EXEMPT_VIEW_PERMISSIONS', '', _AS_LIST)
-
-# HTTP proxies NetBox should use when sending outbound HTTP requests (e.g. for webhooks).
-# HTTP_PROXIES = {
-# 'http': 'http://10.10.1.10:3128',
-# 'https': 'http://10.10.1.10:1080',
-# }
-
-# IP addresses recognized as internal to the system. The debugging toolbar will be available only to clients accessing
-# NetBox from an internal IP.
-INTERNAL_IPS = _environ_get_and_map('INTERNAL_IPS', '127.0.0.1 ::1', _AS_LIST)
-
-# Enable GraphQL API.
-if 'GRAPHQL_ENABLED' in environ:
- GRAPHQL_ENABLED = _environ_get_and_map('GRAPHQL_ENABLED', None, _AS_BOOL)
-
-# # Enable custom logging. Please see the Django documentation for detailed guidance on configuring custom logs:
-# # https://docs.djangoproject.com/en/stable/topics/logging/
-# LOGGING = {}
-
-# Automatically reset the lifetime of a valid session upon each authenticated request. Enables users to remain
-# authenticated to NetBox indefinitely.
-LOGIN_PERSISTENCE = _environ_get_and_map('LOGIN_PERSISTENCE', 'False', _AS_BOOL)
-
-# Setting this to True will permit only authenticated users to access any part of NetBox. By default, anonymous users
-# are permitted to access most data in NetBox (excluding secrets) but not make any changes.
-LOGIN_REQUIRED = _environ_get_and_map('LOGIN_REQUIRED', 'False', _AS_BOOL)
-
-# The length of time (in seconds) for which a user will remain logged into the web UI before being prompted to
-# re-authenticate. (Default: 1209600 [14 days])
-LOGIN_TIMEOUT = _environ_get_and_map('LOGIN_TIMEOUT', 1209600, _AS_INT)
-
-# Setting this to True will display a "maintenance mode" banner at the top of every page.
-if 'MAINTENANCE_MODE' in environ:
- MAINTENANCE_MODE = _environ_get_and_map('MAINTENANCE_MODE', None, _AS_BOOL)
-
-# Maps provider
-if 'MAPS_URL' in environ:
- MAPS_URL = environ.get('MAPS_URL', None)
-
-# An API consumer can request an arbitrary number of objects =by appending the "limit" parameter to the URL (e.g.
-# "?limit=1000"). This setting defines the maximum limit. Setting it to 0 or None will allow an API consumer to request
-# all objects by specifying "?limit=0".
-if 'MAX_PAGE_SIZE' in environ:
- MAX_PAGE_SIZE = _environ_get_and_map('MAX_PAGE_SIZE', None, _AS_INT)
-
-# The file path where uploaded media such as image attachments are stored. A trailing slash is not needed. Note that
-# the default value of this setting is derived from the installed location.
-MEDIA_ROOT = environ.get('MEDIA_ROOT', join(_BASE_DIR, 'media'))
-
-# Expose Prometheus monitoring metrics at the HTTP endpoint '/metrics'
-METRICS_ENABLED = _environ_get_and_map('METRICS_ENABLED', 'False', _AS_BOOL)
-
-# Determine how many objects to display per page within a list. (Default: 50)
-if 'PAGINATE_COUNT' in environ:
- PAGINATE_COUNT = _environ_get_and_map('PAGINATE_COUNT', None, _AS_INT)
-
-# # Enable installed plugins. Add the name of each plugin to the list.
-# PLUGINS = []
-
-# # Plugins configuration settings. These settings are used by various plugins that the user may have installed.
-# # Each key in the dictionary is the name of an installed plugin and its value is a dictionary of settings.
-# PLUGINS_CONFIG = {
-# }
-
-# When determining the primary IP address for a device, IPv6 is preferred over IPv4 by default. Set this to True to
-# prefer IPv4 instead.
-if 'PREFER_IPV4' in environ:
- PREFER_IPV4 = _environ_get_and_map('PREFER_IPV4', None, _AS_BOOL)
-
-# The default value for the amperage field when creating new power feeds.
-if 'POWERFEED_DEFAULT_AMPERAGE' in environ:
- POWERFEED_DEFAULT_AMPERAGE = _environ_get_and_map('POWERFEED_DEFAULT_AMPERAGE', None, _AS_INT)
-
-# The default value (percentage) for the max_utilization field when creating new power feeds.
-if 'POWERFEED_DEFAULT_MAX_UTILIZATION' in environ:
- POWERFEED_DEFAULT_MAX_UTILIZATION = _environ_get_and_map('POWERFEED_DEFAULT_MAX_UTILIZATION', None, _AS_INT)
-
-# The default value for the voltage field when creating new power feeds.
-if 'POWERFEED_DEFAULT_VOLTAGE' in environ:
- POWERFEED_DEFAULT_VOLTAGE = _environ_get_and_map('POWERFEED_DEFAULT_VOLTAGE', None, _AS_INT)
-
-# Rack elevation size defaults, in pixels. For best results, the ratio of width to height should be roughly 10:1.
-if 'RACK_ELEVATION_DEFAULT_UNIT_HEIGHT' in environ:
- RACK_ELEVATION_DEFAULT_UNIT_HEIGHT = _environ_get_and_map('RACK_ELEVATION_DEFAULT_UNIT_HEIGHT', None, _AS_INT)
-if 'RACK_ELEVATION_DEFAULT_UNIT_WIDTH' in environ:
- RACK_ELEVATION_DEFAULT_UNIT_WIDTH = _environ_get_and_map('RACK_ELEVATION_DEFAULT_UNIT_WIDTH', None, _AS_INT)
-
-# Remote authentication support
-REMOTE_AUTH_ENABLED = _environ_get_and_map('REMOTE_AUTH_ENABLED', 'False', _AS_BOOL)
-REMOTE_AUTH_BACKEND = _environ_get_and_map('REMOTE_AUTH_BACKEND', 'netbox.authentication.RemoteUserBackend', _AS_LIST)
-REMOTE_AUTH_HEADER = environ.get('REMOTE_AUTH_HEADER', 'HTTP_REMOTE_USER')
-REMOTE_AUTH_AUTO_CREATE_USER = _environ_get_and_map('REMOTE_AUTH_AUTO_CREATE_USER', 'False', _AS_BOOL)
-REMOTE_AUTH_DEFAULT_GROUPS = _environ_get_and_map('REMOTE_AUTH_DEFAULT_GROUPS', '', _AS_LIST)
-# REMOTE_AUTH_DEFAULT_PERMISSIONS = {}
-
-# This repository is used to check whether there is a new release of NetBox available. Set to None to disable the
-# version check or use the URL below to check for release in the official NetBox repository.
-RELEASE_CHECK_URL = environ.get('RELEASE_CHECK_URL', None)
-# RELEASE_CHECK_URL = 'https://api.github.com/repos/netbox-community/netbox/releases'
-
-# Maximum execution time for background tasks, in seconds.
-RQ_DEFAULT_TIMEOUT = _environ_get_and_map('RQ_DEFAULT_TIMEOUT', 300, _AS_INT)
-
-# The name to use for the csrf token cookie.
-CSRF_COOKIE_NAME = environ.get('CSRF_COOKIE_NAME', 'csrftoken')
-
-# Cross-Site-Request-Forgery-Attack settings. If Netbox is sitting behind a reverse proxy, you might need to set the CSRF_TRUSTED_ORIGINS flag.
-# Django 4.0 requires to specify the URL Scheme in this setting. An example environment variable could be specified like:
-# CSRF_TRUSTED_ORIGINS=https://demo.netbox.dev http://demo.netbox.dev
-CSRF_TRUSTED_ORIGINS = _environ_get_and_map('CSRF_TRUSTED_ORIGINS', '', _AS_LIST)
-
-# The name to use for the session cookie.
-SESSION_COOKIE_NAME = environ.get('SESSION_COOKIE_NAME', 'sessionid')
-
-# By default, NetBox will store session data in the database. Alternatively, a file path can be specified here to use
-# local file storage instead. (This can be useful for enabling authentication on a standby instance with read-only
-# database access.) Note that the user as which NetBox runs must have read and write permissions to this path.
-SESSION_FILE_PATH = environ.get('SESSION_FILE_PATH', environ.get('SESSIONS_ROOT', None))
-
-# Time zone (default: UTC)
-TIME_ZONE = environ.get('TIME_ZONE', 'UTC')
-
-# Date/time formatting. See the following link for supported formats:
-# https://docs.djangoproject.com/en/stable/ref/templates/builtins/#date
-DATE_FORMAT = environ.get('DATE_FORMAT', 'N j, Y')
-SHORT_DATE_FORMAT = environ.get('SHORT_DATE_FORMAT', 'Y-m-d')
-TIME_FORMAT = environ.get('TIME_FORMAT', 'g:i a')
-SHORT_TIME_FORMAT = environ.get('SHORT_TIME_FORMAT', 'H:i:s')
-DATETIME_FORMAT = environ.get('DATETIME_FORMAT', 'N j, Y g:i a')
-SHORT_DATETIME_FORMAT = environ.get('SHORT_DATETIME_FORMAT', 'Y-m-d H:i')
-BASE_PATH = environ.get('BASE_PATH', '')
diff --git a/diode-netbox-plugin/docker/netbox/configuration/extra.py b/diode-netbox-plugin/docker/netbox/configuration/extra.py
deleted file mode 100644
index 8bd13371..00000000
--- a/diode-netbox-plugin/docker/netbox/configuration/extra.py
+++ /dev/null
@@ -1,49 +0,0 @@
-####
-## This file contains extra configuration options that can't be configured
-## directly through environment variables.
-####
-
-## Specify one or more name and email address tuples representing NetBox administrators. These people will be notified of
-## application errors (assuming correct email settings are provided).
-# ADMINS = [
-# # ['John Doe', 'jdoe@example.com'],
-# ]
-
-
-## URL schemes that are allowed within links in NetBox
-# ALLOWED_URL_SCHEMES = (
-# 'file', 'ftp', 'ftps', 'http', 'https', 'irc', 'mailto', 'sftp', 'ssh', 'tel', 'telnet', 'tftp', 'vnc', 'xmpp',
-# )
-
-## Enable installed plugins. Add the name of each plugin to the list.
-# from netbox.configuration.configuration import PLUGINS
-# PLUGINS.append('my_plugin')
-
-## Plugins configuration settings. These settings are used by various plugins that the user may have installed.
-## Each key in the dictionary is the name of an installed plugin and its value is a dictionary of settings.
-# from netbox.configuration.configuration import PLUGINS_CONFIG
-# PLUGINS_CONFIG['my_plugin'] = {
-# 'foo': 'bar',
-# 'buzz': 'bazz'
-# }
-
-
-## Remote authentication support
-# REMOTE_AUTH_DEFAULT_PERMISSIONS = {}
-
-
-## By default uploaded media is stored on the local filesystem. Using Django-storages is also supported. Provide the
-## class path of the storage driver in STORAGE_BACKEND and any configuration options in STORAGE_CONFIG. For example:
-# STORAGE_BACKEND = 'storages.backends.s3boto3.S3Boto3Storage'
-# STORAGE_CONFIG = {
-# 'AWS_ACCESS_KEY_ID': 'Key ID',
-# 'AWS_SECRET_ACCESS_KEY': 'Secret',
-# 'AWS_STORAGE_BUCKET_NAME': 'netbox',
-# 'AWS_S3_REGION_NAME': 'eu-west-1',
-# }
-
-
-## This file can contain arbitrary Python code, e.g.:
-# from datetime import datetime
-# now = datetime.now().strftime("%d/%m/%Y %H:%M:%S")
-# BANNER_TOP = f''
diff --git a/diode-netbox-plugin/docker/netbox/configuration/ldap/extra.py b/diode-netbox-plugin/docker/netbox/configuration/ldap/extra.py
deleted file mode 100644
index 45051978..00000000
--- a/diode-netbox-plugin/docker/netbox/configuration/ldap/extra.py
+++ /dev/null
@@ -1,28 +0,0 @@
-####
-## This file contains extra configuration options that can't be configured
-## directly through environment variables.
-## All vairables set here overwrite any existing found in ldap_config.py
-####
-
-# # This Python script inherits all the imports from ldap_config.py
-# from django_auth_ldap.config import LDAPGroupQuery # Imported since not in ldap_config.py
-
-# # Sets a base requirement of membetship to netbox-user-ro, netbox-user-rw, or netbox-user-admin.
-# AUTH_LDAP_REQUIRE_GROUP = (
-# LDAPGroupQuery("cn=netbox-user-ro,ou=groups,dc=example,dc=com")
-# | LDAPGroupQuery("cn=netbox-user-rw,ou=groups,dc=example,dc=com")
-# | LDAPGroupQuery("cn=netbox-user-admin,ou=groups,dc=example,dc=com")
-# )
-
-# # Sets LDAP Flag groups variables with example.
-# AUTH_LDAP_USER_FLAGS_BY_GROUP = {
-# "is_staff": (
-# LDAPGroupQuery("cn=netbox-user-ro,ou=groups,dc=example,dc=com")
-# | LDAPGroupQuery("cn=netbox-user-rw,ou=groups,dc=example,dc=com")
-# | LDAPGroupQuery("cn=netbox-user-admin,ou=groups,dc=example,dc=com")
-# ),
-# "is_superuser": "cn=netbox-user-admin,ou=groups,dc=example,dc=com",
-# }
-
-# # Sets LDAP Mirror groups variables with example groups
-# AUTH_LDAP_MIRROR_GROUPS = ["netbox-user-ro", "netbox-user-rw", "netbox-user-admin"]
diff --git a/diode-netbox-plugin/docker/netbox/configuration/ldap/ldap_config.py b/diode-netbox-plugin/docker/netbox/configuration/ldap/ldap_config.py
deleted file mode 100644
index 32743c72..00000000
--- a/diode-netbox-plugin/docker/netbox/configuration/ldap/ldap_config.py
+++ /dev/null
@@ -1,113 +0,0 @@
-from importlib import import_module
-from os import environ
-
-import ldap
-from django_auth_ldap.config import LDAPSearch
-
-
-# Read secret from file
-def _read_secret(secret_name, default=None):
- try:
- f = open('/run/secrets/' + secret_name, encoding='utf-8')
- except OSError:
- return default
- else:
- with f:
- return f.readline().strip()
-
-
-# Import and return the group type based on string name
-def _import_group_type(group_type_name):
- mod = import_module('django_auth_ldap.config')
- try:
- return getattr(mod, group_type_name)()
- except:
- return None
-
-
-# Server URI
-AUTH_LDAP_SERVER_URI = environ.get('AUTH_LDAP_SERVER_URI', '')
-
-# The following may be needed if you are binding to Active Directory.
-AUTH_LDAP_CONNECTION_OPTIONS = {
- ldap.OPT_REFERRALS: 0
-}
-
-AUTH_LDAP_BIND_AS_AUTHENTICATING_USER = environ.get('AUTH_LDAP_BIND_AS_AUTHENTICATING_USER', 'False').lower() == 'true'
-
-# Set the DN and password for the NetBox service account if needed.
-if not AUTH_LDAP_BIND_AS_AUTHENTICATING_USER:
- AUTH_LDAP_BIND_DN = environ.get('AUTH_LDAP_BIND_DN', '')
- AUTH_LDAP_BIND_PASSWORD = _read_secret('auth_ldap_bind_password', environ.get('AUTH_LDAP_BIND_PASSWORD', ''))
-
-# Set a string template that describes any user’s distinguished name based on the username.
-AUTH_LDAP_USER_DN_TEMPLATE = environ.get('AUTH_LDAP_USER_DN_TEMPLATE', None)
-
-# Enable STARTTLS for ldap authentication.
-AUTH_LDAP_START_TLS = environ.get('AUTH_LDAP_START_TLS', 'False').lower() == 'true'
-
-# Include this setting if you want to ignore certificate errors. This might be needed to accept a self-signed cert.
-# Note that this is a NetBox-specific setting which sets:
-# ldap.set_option(ldap.OPT_X_TLS_REQUIRE_CERT, ldap.OPT_X_TLS_NEVER)
-LDAP_IGNORE_CERT_ERRORS = environ.get('LDAP_IGNORE_CERT_ERRORS', 'False').lower() == 'true'
-
-# Include this setting if you want to validate the LDAP server certificates against a CA certificate directory on your server
-# Note that this is a NetBox-specific setting which sets:
-# ldap.set_option(ldap.OPT_X_TLS_CACERTDIR, LDAP_CA_CERT_DIR)
-LDAP_CA_CERT_DIR = environ.get('LDAP_CA_CERT_DIR', None)
-
-# Include this setting if you want to validate the LDAP server certificates against your own CA.
-# Note that this is a NetBox-specific setting which sets:
-# ldap.set_option(ldap.OPT_X_TLS_CACERTFILE, LDAP_CA_CERT_FILE)
-LDAP_CA_CERT_FILE = environ.get('LDAP_CA_CERT_FILE', None)
-
-AUTH_LDAP_USER_SEARCH_BASEDN = environ.get('AUTH_LDAP_USER_SEARCH_BASEDN', '')
-AUTH_LDAP_USER_SEARCH_ATTR = environ.get('AUTH_LDAP_USER_SEARCH_ATTR', 'sAMAccountName')
-AUTH_LDAP_USER_SEARCH_FILTER: str = environ.get(
- 'AUTH_LDAP_USER_SEARCH_FILTER', f'({AUTH_LDAP_USER_SEARCH_ATTR}=%(user)s)'
-)
-
-AUTH_LDAP_USER_SEARCH = LDAPSearch(
- AUTH_LDAP_USER_SEARCH_BASEDN, ldap.SCOPE_SUBTREE, AUTH_LDAP_USER_SEARCH_FILTER
-)
-
-# This search ought to return all groups to which the user belongs. django_auth_ldap uses this to determine group
-# heirarchy.
-
-AUTH_LDAP_GROUP_SEARCH_BASEDN = environ.get('AUTH_LDAP_GROUP_SEARCH_BASEDN', '')
-AUTH_LDAP_GROUP_SEARCH_CLASS = environ.get('AUTH_LDAP_GROUP_SEARCH_CLASS', 'group')
-
-AUTH_LDAP_GROUP_SEARCH_FILTER: str = environ.get(
- 'AUTH_LDAP_GROUP_SEARCH_FILTER', f'(objectclass={AUTH_LDAP_GROUP_SEARCH_CLASS})'
-)
-AUTH_LDAP_GROUP_SEARCH = LDAPSearch(
- AUTH_LDAP_GROUP_SEARCH_BASEDN, ldap.SCOPE_SUBTREE, AUTH_LDAP_GROUP_SEARCH_FILTER
-)
-AUTH_LDAP_GROUP_TYPE = _import_group_type(environ.get('AUTH_LDAP_GROUP_TYPE', 'GroupOfNamesType'))
-
-# Define a group required to login.
-AUTH_LDAP_REQUIRE_GROUP = environ.get('AUTH_LDAP_REQUIRE_GROUP_DN')
-
-# Define special user types using groups. Exercise great caution when assigning superuser status.
-AUTH_LDAP_USER_FLAGS_BY_GROUP = {}
-
-if AUTH_LDAP_REQUIRE_GROUP is not None:
- AUTH_LDAP_USER_FLAGS_BY_GROUP = {
- "is_active": environ.get('AUTH_LDAP_REQUIRE_GROUP_DN', ''),
- "is_staff": environ.get('AUTH_LDAP_IS_ADMIN_DN', ''),
- "is_superuser": environ.get('AUTH_LDAP_IS_SUPERUSER_DN', '')
- }
-
-# For more granular permissions, we can map LDAP groups to Django groups.
-AUTH_LDAP_FIND_GROUP_PERMS = environ.get('AUTH_LDAP_FIND_GROUP_PERMS', 'True').lower() == 'true'
-AUTH_LDAP_MIRROR_GROUPS = environ.get('AUTH_LDAP_MIRROR_GROUPS', '').lower() == 'true'
-
-# Cache groups for one hour to reduce LDAP traffic
-AUTH_LDAP_CACHE_TIMEOUT = int(environ.get('AUTH_LDAP_CACHE_TIMEOUT', 3600))
-
-# Populate the Django user from the LDAP directory.
-AUTH_LDAP_USER_ATTR_MAP = {
- "first_name": environ.get('AUTH_LDAP_ATTR_FIRSTNAME', 'givenName'),
- "last_name": environ.get('AUTH_LDAP_ATTR_LASTNAME', 'sn'),
- "email": environ.get('AUTH_LDAP_ATTR_MAIL', 'mail')
-}
diff --git a/diode-netbox-plugin/docker/netbox/configuration/logging.py b/diode-netbox-plugin/docker/netbox/configuration/logging.py
deleted file mode 100644
index d786768d..00000000
--- a/diode-netbox-plugin/docker/netbox/configuration/logging.py
+++ /dev/null
@@ -1,55 +0,0 @@
-# # Remove first comment(#) on each line to implement this working logging example.
-# # Add LOGLEVEL environment variable to netbox if you use this example & want a different log level.
-# from os import environ
-
-# # Set LOGLEVEL in netbox.env or docker-compose.overide.yml to override a logging level of INFO.
-# LOGLEVEL = environ.get('LOGLEVEL', 'INFO')
-
-# LOGGING = {
-
-# 'version': 1,
-# 'disable_existing_loggers': False,
-# 'formatters': {
-# 'verbose': {
-# 'format': '{levelname} {asctime} {module} {process:d} {thread:d} {message}',
-# 'style': '{',
-# },
-# 'simple': {
-# 'format': '{levelname} {message}',
-# 'style': '{',
-# },
-# },
-# 'filters': {
-# 'require_debug_false': {
-# '()': 'django.utils.log.RequireDebugFalse',
-# },
-# },
-# 'handlers': {
-# 'console': {
-# 'level': LOGLEVEL,
-# 'filters': ['require_debug_false'],
-# 'class': 'logging.StreamHandler',
-# 'formatter': 'simple'
-# },
-# 'mail_admins': {
-# 'level': 'ERROR',
-# 'class': 'django.utils.log.AdminEmailHandler',
-# 'filters': ['require_debug_false']
-# }
-# },
-# 'loggers': {
-# 'django': {
-# 'handlers': ['console'],
-# 'propagate': True,
-# },
-# 'django.request': {
-# 'handlers': ['mail_admins'],
-# 'level': 'ERROR',
-# 'propagate': False,
-# },
-# 'django_auth_ldap': {
-# 'handlers': ['console',],
-# 'level': LOGLEVEL,
-# }
-# }
-# }
diff --git a/diode-netbox-plugin/docker/netbox/configuration/plugins.py b/diode-netbox-plugin/docker/netbox/configuration/plugins.py
deleted file mode 100644
index da31c764..00000000
--- a/diode-netbox-plugin/docker/netbox/configuration/plugins.py
+++ /dev/null
@@ -1,13 +0,0 @@
-# Add your plugins and plugin settings here.
-# Of course uncomment this file out.
-
-# To learn how to build images with your required plugins
-# See https://github.com/netbox-community/netbox-docker/wiki/Using-Netbox-Plugins
-
-PLUGINS = ["netbox_diode_plugin"]
-
-# PLUGINS_CONFIG = {
-# "netbox_diode_plugin": {
-#
-# }
-# }
diff --git a/diode-netbox-plugin/docker/netbox/docker-entrypoint.sh b/diode-netbox-plugin/docker/netbox/docker-entrypoint.sh
deleted file mode 100755
index fb25e67d..00000000
--- a/diode-netbox-plugin/docker/netbox/docker-entrypoint.sh
+++ /dev/null
@@ -1,100 +0,0 @@
-#!/bin/bash
-# Runs on every start of the NetBox Docker container
-
-# Stop when an error occures
-set -e
-
-# Allows NetBox to be run as non-root users
-umask 002
-
-# Load correct Python3 env
-# shellcheck disable=SC1091
-source /opt/netbox/venv/bin/activate
-
-# Try to connect to the DB
-DB_WAIT_TIMEOUT=${DB_WAIT_TIMEOUT-3}
-MAX_DB_WAIT_TIME=${MAX_DB_WAIT_TIME-30}
-CUR_DB_WAIT_TIME=0
-while [ "${CUR_DB_WAIT_TIME}" -lt "${MAX_DB_WAIT_TIME}" ]; do
- # Read and truncate connection error tracebacks to last line by default
- exec {psfd}< <(./manage.py showmigrations 2>&1)
- read -rd '' DB_ERR <&$psfd || :
- exec {psfd}<&-
- wait $! && break
- if [ -n "$DB_WAIT_DEBUG" ]; then
- echo "$DB_ERR"
- else
- readarray -tn 0 DB_ERR_LINES <<<"$DB_ERR"
- echo "${DB_ERR_LINES[@]: -1}"
- echo "[ Use DB_WAIT_DEBUG=1 in netbox.env to print full traceback for errors here ]"
- fi
- echo "⏳ Waiting on DB... (${CUR_DB_WAIT_TIME}s / ${MAX_DB_WAIT_TIME}s)"
- sleep "${DB_WAIT_TIMEOUT}"
- CUR_DB_WAIT_TIME=$((CUR_DB_WAIT_TIME + DB_WAIT_TIMEOUT))
-done
-if [ "${CUR_DB_WAIT_TIME}" -ge "${MAX_DB_WAIT_TIME}" ]; then
- echo "❌ Waited ${MAX_DB_WAIT_TIME}s or more for the DB to become ready."
- exit 1
-fi
-# Check if update is needed
-if ! ./manage.py migrate --check >/dev/null 2>&1; then
- echo "⚙️ Applying database migrations"
- ./manage.py migrate --no-input
- echo "⚙️ Running trace_paths"
- ./manage.py trace_paths --no-input
- echo "⚙️ Removing stale content types"
- ./manage.py remove_stale_contenttypes --no-input
- echo "⚙️ Removing expired user sessions"
- ./manage.py clearsessions
- echo "⚙️ Building search index (lazy)"
- ./manage.py reindex --lazy
-fi
-
-# Create Superuser if required
-if [ "$SKIP_SUPERUSER" == "true" ]; then
- echo "↩️ Skip creating the superuser"
-else
- if [ -z ${SUPERUSER_NAME+x} ]; then
- SUPERUSER_NAME='admin'
- fi
- if [ -z ${SUPERUSER_EMAIL+x} ]; then
- SUPERUSER_EMAIL='admin@example.com'
- fi
- if [ -f "/run/secrets/superuser_password" ]; then
- SUPERUSER_PASSWORD="$( /etc/netbox/config/plugins.py
-
-./manage.py configurediodeplugin || echo "❌ enabling diode-netbox-plugin failed" && exit 1
-
-echo "✅ diode-netbox-plugin enabled successfully!"
\ No newline at end of file
diff --git a/diode-netbox-plugin/docker/netbox/env/netbox.env b/diode-netbox-plugin/docker/netbox/env/netbox.env
deleted file mode 100644
index 04c095c7..00000000
--- a/diode-netbox-plugin/docker/netbox/env/netbox.env
+++ /dev/null
@@ -1,43 +0,0 @@
-CORS_ORIGIN_ALLOW_ALL=True
-DB_HOST=netbox-postgres
-DB_NAME=netbox
-DB_PASSWORD=J5brHrAXFLQSif0K
-DB_USER=netbox
-EMAIL_FROM=netbox@bar.com
-EMAIL_PASSWORD=
-EMAIL_PORT=25
-EMAIL_SERVER=localhost
-EMAIL_SSL_CERTFILE=
-EMAIL_SSL_KEYFILE=
-EMAIL_TIMEOUT=5
-EMAIL_USERNAME=netbox
-# EMAIL_USE_SSL and EMAIL_USE_TLS are mutually exclusive, i.e. they can't both be `true`!
-EMAIL_USE_SSL=false
-EMAIL_USE_TLS=false
-GRAPHQL_ENABLED=true
-HOUSEKEEPING_INTERVAL=86400
-MEDIA_ROOT=/opt/netbox/netbox/media
-METRICS_ENABLED=false
-REDIS_CACHE_DATABASE=1
-REDIS_CACHE_HOST=netbox-redis-cache
-REDIS_CACHE_INSECURE_SKIP_TLS_VERIFY=false
-REDIS_CACHE_PASSWORD=t4Ph722qJ5QHeQ1qfu36
-REDIS_CACHE_SSL=false
-REDIS_DATABASE=0
-REDIS_HOST=netbox-redis
-REDIS_INSECURE_SKIP_TLS_VERIFY=false
-REDIS_PASSWORD=H733Kdjndks81
-REDIS_SSL=false
-RELEASE_CHECK_URL=https://api.github.com/repos/netbox-community/netbox/releases
-SECRET_KEY='r(m)9nLGnz$(_q3N4z1k(EFsMCjjjzx08x9VhNVcfd%6RF#r!6DE@+V5Zk2X'
-SKIP_SUPERUSER=false
-SUPERUSER_API_TOKEN=
-SUPERUSER_EMAIL=
-SUPERUSER_NAME=admin
-SUPERUSER_PASSWORD=admin
-WEBHOOKS_ENABLED=true
-RELOAD_NETBOX_ON_DIODE_PLUGIN_CHANGE=true
-DIODE_TO_NETBOX_API_KEY=1368dbad13e418d5a443d93cf255edde03a2a754
-NETBOX_TO_DIODE_API_KEY=1e99338b8cab5fc637bc55f390bda1446f619c42
-INGESTION_API_KEY=5a52c45ee8231156cb620d193b0291912dd15433
-BASE_PATH=netbox/
diff --git a/diode-netbox-plugin/docker/netbox/env/postgres.env b/diode-netbox-plugin/docker/netbox/env/postgres.env
deleted file mode 100644
index bb7b53c6..00000000
--- a/diode-netbox-plugin/docker/netbox/env/postgres.env
+++ /dev/null
@@ -1,3 +0,0 @@
-POSTGRES_DB=netbox
-POSTGRES_PASSWORD=J5brHrAXFLQSif0K
-POSTGRES_USER=netbox
diff --git a/diode-netbox-plugin/docker/netbox/env/redis-cache.env b/diode-netbox-plugin/docker/netbox/env/redis-cache.env
deleted file mode 100644
index 6285c33a..00000000
--- a/diode-netbox-plugin/docker/netbox/env/redis-cache.env
+++ /dev/null
@@ -1 +0,0 @@
-REDIS_PASSWORD=t4Ph722qJ5QHeQ1qfu36
diff --git a/diode-netbox-plugin/docker/netbox/env/redis.env b/diode-netbox-plugin/docker/netbox/env/redis.env
deleted file mode 100644
index 44a19871..00000000
--- a/diode-netbox-plugin/docker/netbox/env/redis.env
+++ /dev/null
@@ -1 +0,0 @@
-REDIS_PASSWORD=H733Kdjndks81
diff --git a/diode-netbox-plugin/docker/netbox/launch-netbox.sh b/diode-netbox-plugin/docker/netbox/launch-netbox.sh
deleted file mode 100755
index df0b4625..00000000
--- a/diode-netbox-plugin/docker/netbox/launch-netbox.sh
+++ /dev/null
@@ -1,77 +0,0 @@
-#!/bin/bash
-
-UNIT_CONFIG="${UNIT_CONFIG-/opt/netbox/nginx-unit.json}"
-# Also used in "nginx-unit.json"
-UNIT_SOCKET="/opt/unit/unit.sock"
-
-load_configuration() {
- MAX_WAIT=10
- WAIT_COUNT=0
- while [ ! -S $UNIT_SOCKET ]; do
- if [ $WAIT_COUNT -ge $MAX_WAIT ]; then
- echo "⚠️ No control socket found; configuration will not be loaded."
- return 1
- fi
-
- WAIT_COUNT=$((WAIT_COUNT + 1))
- echo "⏳ Waiting for control socket to be created... (${WAIT_COUNT}/${MAX_WAIT})"
-
- sleep 1
- done
-
- # even when the control socket exists, it does not mean unit has finished initialisation
- # this curl call will get a reply once unit is fully launched
- curl --silent --output /dev/null --request GET --unix-socket $UNIT_SOCKET http://localhost/
-
- echo "⚙️ Applying configuration from $UNIT_CONFIG"
-
- RESP_CODE=$(
- curl \
- --silent \
- --output /dev/null \
- --write-out '%{http_code}' \
- --request PUT \
- --data-binary "@${UNIT_CONFIG}" \
- --unix-socket $UNIT_SOCKET \
- http://localhost/config
- )
- if [ "$RESP_CODE" != "200" ]; then
- echo "⚠️ Could no load Unit configuration"
- kill "$(cat /opt/unit/unit.pid)"
- return 1
- fi
-
- echo "✅ Unit configuration loaded successfully"
-}
-
-reload_netbox() {
- if [ "$RELOAD_NETBOX_ON_DIODE_PLUGIN_CHANGE" == "true" ]; then
- netbox_diode_plugin_md5=$(find /opt/netbox/netbox/netbox_diode_plugin -type f -name "*.py" -exec md5sum {} + | md5sum | awk '{print $1}')
-
- while true; do
- new_md5=$(find /opt/netbox/netbox/netbox_diode_plugin -type f -name "*.py" -exec md5sum {} + | md5sum | awk '{print $1}')
- if [ "$netbox_diode_plugin_md5" != "$new_md5" ]; then
- echo "🔄 Reloading NetBox"
- curl --silent --output /dev/null --unix-socket /opt/unit/unit.sock -X GET http://localhost/control/applications/netbox/restart
- netbox_diode_plugin_md5=$new_md5
- fi
- sleep 1
- done
- fi
-}
-
-load_configuration &
-
-sh /opt/netbox/enable-diode-plugin.sh &
-
-reload_netbox &
-
-exec unitd \
- --no-daemon \
- --control unix:$UNIT_SOCKET \
- --pid /opt/unit/unit.pid \
- --log /dev/stdout \
- --statedir /opt/unit/state/ \
- --tmpdir /opt/unit/tmp/ \
- --user unit \
- --group root
diff --git a/diode-netbox-plugin/docker/netbox/nginx-unit.json b/diode-netbox-plugin/docker/netbox/nginx-unit.json
deleted file mode 100644
index 82e62ef4..00000000
--- a/diode-netbox-plugin/docker/netbox/nginx-unit.json
+++ /dev/null
@@ -1,65 +0,0 @@
-{
- "listeners": {
- "0.0.0.0:8080": {
- "pass": "routes/main"
- },
- "[::]:8080": {
- "pass": "routes/main"
- },
- "0.0.0.0:8081": {
- "pass": "routes/status"
- },
- "[::]:8081": {
- "pass": "routes/status"
- }
- },
- "routes": {
- "main": [
- {
- "match": {
- "uri": "/static/*"
- },
- "action": {
- "share": "/opt/netbox/netbox${uri}"
- }
- },
- {
- "match": {
- "uri": "/netbox/static/*"
- },
- "action": {
- "share": "/opt/netbox${uri}"
- }
- },
- {
- "action": {
- "pass": "applications/netbox"
- }
- }
- ],
- "status": [
- {
- "match": {
- "uri": "/status/*"
- },
- "action": {
- "proxy": "http://unix:/opt/unit/unit.sock"
- }
- }
- ]
- },
- "applications": {
- "netbox": {
- "type": "python 3",
- "path": "/opt/netbox/netbox/",
- "module": "netbox.wsgi",
- "home": "/opt/netbox/venv",
- "processes": {
- "max": 4,
- "spare": 1,
- "idle_timeout": 120
- }
- }
- },
- "access_log": "/dev/stdout"
-}
diff --git a/diode-netbox-plugin/docker/requirements-diode-netbox-plugin.txt b/diode-netbox-plugin/docker/requirements-diode-netbox-plugin.txt
deleted file mode 100644
index 125913e9..00000000
--- a/diode-netbox-plugin/docker/requirements-diode-netbox-plugin.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-pytest==8.0.2
-grpcio==1.62.1
-coverage==7.6.0
diff --git a/diode-netbox-plugin/netbox_diode_plugin/__init__.py b/diode-netbox-plugin/netbox_diode_plugin/__init__.py
deleted file mode 100644
index d702bf1b..00000000
--- a/diode-netbox-plugin/netbox_diode_plugin/__init__.py
+++ /dev/null
@@ -1,21 +0,0 @@
-#!/usr/bin/env python
-# Copyright 2024 NetBox Labs Inc
-"""Diode Netbox Plugin."""
-
-from netbox.plugins import PluginConfig
-
-from .version import version_semver
-
-
-class NetBoxDiodePluginConfig(PluginConfig):
- """NetBox Diode plugin configuration."""
-
- name = "netbox_diode_plugin"
- verbose_name = "NetBox Labs, Diode Plugin"
- description = "Diode plugin for NetBox."
- version = version_semver()
- base_url = "diode"
- min_version = "3.7.2"
-
-
-config = NetBoxDiodePluginConfig
diff --git a/diode-netbox-plugin/netbox_diode_plugin/api/__init__.py b/diode-netbox-plugin/netbox_diode_plugin/api/__init__.py
deleted file mode 100644
index 54f875f1..00000000
--- a/diode-netbox-plugin/netbox_diode_plugin/api/__init__.py
+++ /dev/null
@@ -1,3 +0,0 @@
-#!/usr/bin/env python
-# Copyright 2024 NetBox Labs Inc
-"""Diode Netbox Plugin - API."""
diff --git a/diode-netbox-plugin/netbox_diode_plugin/api/permissions.py b/diode-netbox-plugin/netbox_diode_plugin/api/permissions.py
deleted file mode 100644
index d6f93884..00000000
--- a/diode-netbox-plugin/netbox_diode_plugin/api/permissions.py
+++ /dev/null
@@ -1,25 +0,0 @@
-#!/usr/bin/env python
-# Copyright 2024 NetBox Labs Inc
-"""Diode Netbox Plugin - API Permissions."""
-
-from rest_framework.permissions import SAFE_METHODS, BasePermission
-
-
-class IsDiodeReader(BasePermission):
- """Custom permission to allow users that has permission "netbox_diode_plugin.view_objectstate" to view the object type."""
-
- def has_permission(self, request, view):
- """Check if the request is in SAFE_METHODS and user has netbox_diode_plugin.view_diode permission."""
- return request.method in SAFE_METHODS and request.user.has_perm(
- "netbox_diode_plugin.view_diode"
- )
-
-
-class IsDiodeWriter(BasePermission):
- """Custom permission to allow users that has permission "netbox_diode_plugin.add_diode" and POST requests."""
-
- def has_permission(self, request, view):
- """Check if the request is in POST and user has netbox_diode_plugin.add_diode permission."""
- return request.method in ["POST"] and request.user.has_perm(
- "netbox_diode_plugin.add_diode"
- )
diff --git a/diode-netbox-plugin/netbox_diode_plugin/api/serializers.py b/diode-netbox-plugin/netbox_diode_plugin/api/serializers.py
deleted file mode 100644
index ca73371d..00000000
--- a/diode-netbox-plugin/netbox_diode_plugin/api/serializers.py
+++ /dev/null
@@ -1,255 +0,0 @@
-#!/usr/bin/env python
-# Copyright 2024 NetBox Labs Inc
-"""Diode Netbox Plugin - Serializers."""
-import copy
-import logging
-from collections import OrderedDict
-
-from dcim.api.serializers import (
- DeviceRoleSerializer,
- DeviceSerializer,
- DeviceTypeSerializer,
- InterfaceSerializer,
- ManufacturerSerializer,
- PlatformSerializer,
- SiteSerializer,
-)
-from django.core.exceptions import FieldDoesNotExist
-from extras.models import ObjectChange
-from ipam.api.serializers import IPAddressSerializer, PrefixSerializer
-from rest_framework import serializers
-from rest_framework.utils.serializer_helpers import ReturnDict
-from utilities.api import get_serializer_for_model
-
-logger = logging.getLogger("netbox.netbox_diode_plugin.api.serializers")
-
-
-def dynamic_import(name):
- """Dynamically import a class from an absolute path string."""
- components = name.split(".")
- mod = __import__(components[0])
- for comp in components[1:]:
- mod = getattr(mod, comp)
- return mod
-
-
-def get_diode_serializer(instance):
- """Get the Diode serializer based on instance model."""
- serializer = get_serializer_for_model(instance)
-
- serializer_name = f"netbox_diode_plugin.api.serializers.Diode{serializer.__name__}"
-
- try:
- serializer = dynamic_import(serializer_name)
- except AttributeError:
- logger.warning(f"Could not find serializer for {serializer_name}")
- pass
-
- return serializer
-
-
-class ObjectStateSerializer(serializers.Serializer):
- """Object State Serializer."""
-
- object_type = serializers.SerializerMethodField(read_only=True)
- object_change_id = serializers.SerializerMethodField(read_only=True)
- object = serializers.SerializerMethodField(read_only=True)
-
- def get_object_type(self, instance):
- """
- Get the object type from context sent from view.
-
- Return a string with the format "app.model".
- """
- return self.context.get("object_type")
-
- def get_object_change_id(self, instance):
- """
- Get the object changed based on instance ID.
-
- Return the ID of last change.
- """
- object_changed = (
- ObjectChange.objects.filter(changed_object_id=instance.id)
- .order_by("-id")
- .values_list("id", flat=True)
- )
- return object_changed[0] if len(object_changed) > 0 else None
-
- def get_object(self, instance):
- """
- Get the serializer based on instance model.
-
- Get the data from the model according to its ID.
- Return the object according to serializer defined in the Netbox.
- """
- serializer = get_diode_serializer(instance)
-
- object_data = instance.__class__.objects.filter(id=instance.id)
-
- context = {"request": self.context.get("request")}
-
- data = serializer(object_data, context=context, many=True).data[0]
-
- return data
-
-
-class ChangeSerialiazer(serializers.Serializer):
- """ChangeSet Serializer."""
-
- change_id = serializers.UUIDField(required=True)
- change_type = serializers.CharField(required=True)
- object_version = serializers.IntegerField(required=False, allow_null=True)
- object_type = serializers.CharField(required=True)
- object_id = serializers.IntegerField(required=False, allow_null=True)
- data = serializers.DictField(required=True)
-
-
-class ApplyChangeSetRequestSerializer(serializers.Serializer):
- """ApplyChangeSet request Serializer."""
-
- change_set_id = serializers.UUIDField(required=True)
- change_set = serializers.ListField(
- child=ChangeSerialiazer(), required=True, allow_empty=False
- )
-
-
-class DiodeIPAddressSerializer(IPAddressSerializer):
- """Diode IP Address Serializer."""
-
- class Meta:
- """Meta class."""
-
- model = IPAddressSerializer.Meta.model
- fields = IPAddressSerializer.Meta.fields
-
- def get_assigned_object(self, obj):
- """Get the assigned object based on the instance model."""
- if obj.assigned_object is None:
- return None
-
- serializer = get_diode_serializer(obj.assigned_object)
-
- context = {"request": self.context["request"]}
- assigned_object = serializer(obj.assigned_object, context=context).data
-
- if assigned_object.get("device"):
- device_serializer = get_diode_serializer(obj.assigned_object.device)
- device = device_serializer(obj.assigned_object.device, context=context).data
- assigned_object["device"] = device
-
- if serializer.__name__.endswith("InterfaceSerializer"):
- assigned_object = {"interface": assigned_object}
-
- return assigned_object
-
-
-class DiodeSiteSerializer(SiteSerializer):
- """Diode Site Serializer."""
-
- status = serializers.CharField()
-
- class Meta:
- """Meta class."""
-
- model = SiteSerializer.Meta.model
- fields = SiteSerializer.Meta.fields
-
-
-class DiodeDeviceRoleSerializer(DeviceRoleSerializer):
- """Diode Device Role Serializer."""
-
- class Meta:
- """Meta class."""
-
- model = DeviceRoleSerializer.Meta.model
- fields = DeviceRoleSerializer.Meta.fields
-
-
-class DiodeManufacturerSerializer(ManufacturerSerializer):
- """Diode Manufacturer Serializer."""
-
- class Meta:
- """Meta class."""
-
- model = ManufacturerSerializer.Meta.model
- fields = ManufacturerSerializer.Meta.fields
-
-
-class DiodePlatformSerializer(PlatformSerializer):
- """Diode Platform Serializer."""
-
- manufacturer = DiodeManufacturerSerializer(required=False, allow_null=True)
-
- class Meta:
- """Meta class."""
-
- model = PlatformSerializer.Meta.model
- fields = PlatformSerializer.Meta.fields
-
-
-class DiodeDeviceTypeSerializer(DeviceTypeSerializer):
- """Diode Device Type Serializer."""
-
- default_platform = DiodePlatformSerializer(required=False, allow_null=True)
- manufacturer = DiodeManufacturerSerializer(required=False, allow_null=True)
-
- class Meta:
- """Meta class."""
-
- model = DeviceTypeSerializer.Meta.model
- fields = DeviceTypeSerializer.Meta.fields
-
-
-class DiodeDeviceSerializer(DeviceSerializer):
- """Diode Device Serializer."""
-
- site = DiodeSiteSerializer()
- device_type = DiodeDeviceTypeSerializer()
- role = DiodeDeviceRoleSerializer()
- platform = DiodePlatformSerializer(required=False, allow_null=True)
- status = serializers.CharField()
-
- class Meta:
- """Meta class."""
-
- model = DeviceSerializer.Meta.model
- fields = DeviceSerializer.Meta.fields
-
-
-class DiodeNestedInterfaceSerializer(InterfaceSerializer):
- """Diode Nested Interface Serializer."""
-
- class Meta:
- """Meta class."""
-
- model = InterfaceSerializer.Meta.model
- fields = InterfaceSerializer.Meta.fields
-
-
-class DiodeInterfaceSerializer(InterfaceSerializer):
- """Diode Interface Serializer."""
-
- device = DiodeDeviceSerializer()
- parent = DiodeNestedInterfaceSerializer()
- type = serializers.CharField()
- mode = serializers.CharField()
-
- class Meta:
- """Meta class."""
-
- model = InterfaceSerializer.Meta.model
- fields = InterfaceSerializer.Meta.fields
-
-
-class DiodePrefixSerializer(PrefixSerializer):
- """Diode Prefix Serializer."""
-
- site = DiodeSiteSerializer()
- status = serializers.CharField()
-
- class Meta:
- """Meta class."""
-
- model = PrefixSerializer.Meta.model
- fields = PrefixSerializer.Meta.fields
diff --git a/diode-netbox-plugin/netbox_diode_plugin/api/urls.py b/diode-netbox-plugin/netbox_diode_plugin/api/urls.py
deleted file mode 100644
index f3c1bce7..00000000
--- a/diode-netbox-plugin/netbox_diode_plugin/api/urls.py
+++ /dev/null
@@ -1,16 +0,0 @@
-#!/usr/bin/env python
-# Copyright 2024 NetBox Labs Inc
-"""Diode Netbox Plugin - API URLs."""
-
-from django.urls import include, path
-from netbox.api.routers import NetBoxRouter
-
-from .views import ApplyChangeSetView, ObjectStateView
-
-router = NetBoxRouter()
-
-urlpatterns = [
- path("object-state/", ObjectStateView.as_view()),
- path("apply-change-set/", ApplyChangeSetView.as_view()),
- path("", include(router.urls)),
-]
diff --git a/diode-netbox-plugin/netbox_diode_plugin/api/views.py b/diode-netbox-plugin/netbox_diode_plugin/api/views.py
deleted file mode 100644
index 8d8a222e..00000000
--- a/diode-netbox-plugin/netbox_diode_plugin/api/views.py
+++ /dev/null
@@ -1,475 +0,0 @@
-#!/usr/bin/env python
-# Copyright 2024 NetBox Labs Inc
-"""Diode Netbox Plugin - API Views."""
-from typing import Any, Dict, Optional
-
-from django.conf import settings
-from packaging import version
-
-if version.parse(settings.VERSION).major >= 4:
- from core.models import ObjectType as NetBoxType
-else:
- from django.contrib.contenttypes.models import ContentType as NetBoxType
-from django.core.exceptions import FieldError
-from django.db import transaction
-from django.db.models import Q
-from extras.models import CachedValue
-from netbox.search import LookupTypes
-from rest_framework import status, views
-from rest_framework.exceptions import ValidationError
-from rest_framework.permissions import IsAuthenticated
-from rest_framework.response import Response
-from utilities.api import get_serializer_for_model
-
-from netbox_diode_plugin.api.permissions import IsDiodeReader, IsDiodeWriter
-from netbox_diode_plugin.api.serializers import (
- ApplyChangeSetRequestSerializer,
- ObjectStateSerializer,
-)
-
-
-class ObjectStateView(views.APIView):
- """ObjectState view."""
-
- permission_classes = [IsAuthenticated, IsDiodeReader]
-
- def _get_lookups(self, object_type_model: str) -> tuple:
- """
- This method returns a tuple of related object lookups based on the provided object type model.
-
- Args:
- ----
- object_type_model (str): The name of the object type model.
-
- Returns:
- -------
- tuple: A tuple of related object lookups. The tuple is empty if the object type model does not match any
- of the specified models.
-
- """
- if "'ipam.models.ip.ipaddress'" in object_type_model:
- return "interface", "interface__device", "interface__device__site"
- if "'dcim.models.device_components.interface'" in object_type_model:
- return "device", "device__site"
- if "'dcim.models.devices.device'" in object_type_model:
- return ("site",)
- return ()
-
- def get(self, request, *args, **kwargs):
- """
- Return a JSON with object_type, object_change_id, and object.
-
- Search for objects according to object type.
- If the obj_type parameter is not in the parameters, raise a ValidationError.
- When object ID is provided in the request, search using it in the model specified by object type.
- If ID is not provided, use the q parameter for searching.
- Lookup is iexact
- """
- object_type = self.request.query_params.get("object_type", None)
-
- if not object_type:
- raise ValidationError("object_type parameter is required")
-
- app_label, model_name = object_type.split(".")
- object_content_type = NetBoxType.objects.get_by_natural_key(
- app_label, model_name
- )
- object_type_model = object_content_type.model_class()
-
- object_id = self.request.query_params.get("id", None)
-
- if object_id:
- queryset = object_type_model.objects.filter(id=object_id)
- else:
- lookup = LookupTypes.EXACT
- search_value = self.request.query_params.get("q", None)
- if not search_value:
- raise ValidationError("id or q parameter is required")
-
- query_filter = Q(**{f"value__{lookup}": search_value})
- query_filter &= Q(object_type__in=[object_content_type])
-
- object_id_in_cached_value = CachedValue.objects.filter(
- query_filter
- ).values_list("object_id", flat=True)
-
- queryset = object_type_model.objects.filter(
- id__in=object_id_in_cached_value
- )
-
- lookups = self._get_lookups(str(object_type_model).lower())
-
- if lookups:
- queryset = queryset.prefetch_related(*lookups)
-
- additional_attributes_query_filter = (
- self._additional_attributes_query_filter()
- )
-
- if additional_attributes_query_filter:
- try:
- queryset = queryset.filter(**additional_attributes_query_filter)
- except (FieldError, ValueError):
- return Response(
- {"errors": ["invalid additional attributes provided"]},
- status=status.HTTP_400_BAD_REQUEST,
- )
-
- self.check_object_permissions(request, queryset)
-
- serializer = ObjectStateSerializer(
- queryset,
- many=True,
- context={
- "request": request,
- "object_type": f"{object_type}",
- },
- )
-
- if len(serializer.data) > 0:
- return Response(serializer.data[0])
- return Response({})
-
- def _additional_attributes_query_filter(self):
- additional_attributes = {}
- for attr in self.request.query_params:
- if attr not in ["object_type", "id", "q"]:
- additional_attributes[attr] = self.request.query_params.get(attr)
-
- return dict(additional_attributes.items())
-
-
-class ApplyChangeSetView(views.APIView):
- """ApplyChangeSet view."""
-
- permission_classes = [IsAuthenticated, IsDiodeWriter]
-
- @staticmethod
- def _get_object_type_model(object_type: str):
- """Get the object type model from object_type."""
- app_label, model_name = object_type.split(".")
- object_content_type = NetBoxType.objects.get_by_natural_key(
- app_label, model_name
- )
- return object_content_type.model_class()
-
- def _get_assigned_object_type(self, model_name: str):
- """Get the object type model from applied IPAddress assigned object."""
- assignable_object_types = {
- "interface": "dcim.interface",
- }
- return assignable_object_types.get(model_name.lower(), None)
-
- def _get_serializer(
- self,
- change_type: str,
- object_id: int,
- object_type: str,
- object_data: dict,
- change_set_id: str,
- ):
- """Get the serializer for the object type."""
- object_type_model = self._get_object_type_model(object_type)
- if change_type == "create":
- serializer = get_serializer_for_model(object_type_model)(
- data=object_data, context={"request": self.request}
- )
- elif change_type == "update":
- lookups = ()
- args = {}
-
- primary_ip_to_set: Optional[dict] = None
-
- if object_id:
- args["id"] = object_id
- elif object_type == "dcim.device" and any(
- object_data.get(attr) for attr in ("primary_ip4", "primary_ip6")
- ):
- ip_address = self._retrieve_primary_ip_address(
- "primary_ip4", object_data
- )
-
- if ip_address is None:
- ip_address = self._retrieve_primary_ip_address(
- "primary_ip6", object_data
- )
-
- if ip_address is None:
- raise ValidationError("primary IP not found")
-
- if ip_address:
- primary_ip_to_set = {
- "id": ip_address.id,
- "family": ip_address.family,
- }
-
- lookups = ("site",)
- args["name"] = object_data.get("name")
- args["site__name"] = object_data.get("site").get("name")
- else:
- raise ValidationError("object_id parameter is required")
-
- try:
- instance = object_type_model.objects.prefetch_related(*lookups).get(
- **args
- )
- if object_type == "dcim.device" and primary_ip_to_set:
- object_data = {
- "id": instance.id,
- "device_type": instance.device_type.id,
- "role": instance.role.id,
- "site": instance.site.id,
- f'primary_ip{primary_ip_to_set.get("family")}': primary_ip_to_set.get(
- "id"
- ),
- }
- except object_type_model.DoesNotExist:
- raise ValidationError(f"object with id {object_id} does not exist")
-
- serializer = get_serializer_for_model(object_type_model)(
- instance, data=object_data, context={"request": self.request}
- )
- else:
- raise ValidationError("Invalid change_type")
- return serializer
-
- def _retrieve_primary_ip_address(self, primary_ip_attr: str, object_data: dict):
- ip_address = object_data.get(primary_ip_attr)
- if ip_address is None:
- return None
-
- ipaddress_assigned_object = object_data.get(primary_ip_attr, {}).get(
- "assigned_object", None
- )
- if ipaddress_assigned_object is None:
- return None
-
- interface = ipaddress_assigned_object.get("interface")
- if interface is None:
- return None
-
- interface_device = interface.get("device")
- if interface_device is None:
- return None
-
- ip_address_object = self._get_object_type_model("ipam.ipaddress").objects.get(
- address=ip_address.get("address"),
- interface__name=interface.get("name"),
- interface__device__name=interface_device.get("name"),
- interface__device__site__name=interface_device.get("site").get("name"),
- )
- return ip_address_object
-
- @staticmethod
- def _get_error_response(change_set_id, error):
- return Response(
- {
- "change_set_id": change_set_id,
- "result": "failed",
- "errors": error,
- },
- status=status.HTTP_400_BAD_REQUEST,
- )
-
- def _ipaddress_assigned_object(self, change_set: list) -> list:
- ipaddress_assigned_object = [
- change.get("data").get("assigned_object", None)
- for change in change_set
- if change.get("object_type") == "ipam.ipaddress"
- and change.get("data", {}).get("assigned_object", None)
- ]
-
- return ipaddress_assigned_object
-
- def _retrieve_assigned_object_interface_device_lookup_args(
- self, device: dict
- ) -> dict:
- """
- This method retrieves the lookup arguments for the interface device of an assigned object.
-
- Args:
- ----
- device (dict): A dictionary containing the details of the device. It should contain either 'id' or 'name'
- of the device and 'site' which is another dictionary containing either 'id' or 'name' of the site.
-
- Returns:
- -------
- dict: A dictionary containing the lookup arguments for the interface device.
-
- Raises:
- ------
- ValidationError: If neither 'id' nor 'name' is provided for the device or the site.
-
- """
- args = {}
- if device.get("id"):
- args["device__id"] = device.get("id")
- elif device.get("name"):
- args["device__name"] = device.get("name")
- else:
- raise ValidationError(
- "Interface device needs to have either id or name provided"
- )
-
- site = device.get("site", {})
- if site:
- if site.get("id"):
- args["device__site__id"] = site.get("id")
- elif site.get("name"):
- args["device__site__name"] = site.get("name")
- else:
- raise ValidationError(
- "Interface device site needs to have either id or name provided"
- )
- return args
-
- def _handle_ipaddress_assigned_object(
- self, object_data: dict, ipaddress_assigned_object: list
- ) -> Optional[Dict[str, Any]]:
- """Handle IPAM IP address assigned object."""
- if any(ipaddress_assigned_object):
- assigned_object_keys = list(ipaddress_assigned_object[0].keys())
- model_name = assigned_object_keys[0]
- assigned_object_type = self._get_assigned_object_type(model_name)
- assigned_object_model = self._get_object_type_model(assigned_object_type)
- assigned_object_properties_dict = dict(
- ipaddress_assigned_object[0][model_name].items()
- )
-
- if len(assigned_object_properties_dict) == 0:
- return {"assigned_object": f"properties not provided for {model_name}"}
-
- try:
- lookups = (
- ("device", "device__site") if model_name == "interface" else ()
- )
- args = {}
-
- if model_name == "interface":
- if assigned_object_properties_dict.get("id"):
- args["id"] = assigned_object_properties_dict.get("id")
- elif assigned_object_properties_dict.get("name"):
- try:
- device = assigned_object_properties_dict.get("device", {})
- args = self._retrieve_assigned_object_interface_device_lookup_args(
- device
- )
- args["name"] = assigned_object_properties_dict.get("name")
- except ValidationError as e:
- return {"assigned_object": str(e)}
- else:
- error = f"provided properties '{assigned_object_properties_dict}' not sufficient to retrieve {model_name}"
- return {"assigned_object": error}
-
- assigned_object_instance = (
- assigned_object_model.objects.prefetch_related(*lookups).get(**args)
- )
- except assigned_object_model.DoesNotExist:
- return {
- "assigned_object": f"Assigned object with name {ipaddress_assigned_object[0][model_name]} does not exist"
- }
-
- object_data.pop("assigned_object")
- object_data["assigned_object_type"] = assigned_object_type
- object_data["assigned_object_id"] = assigned_object_instance.id
- return None
-
- def post(self, request, *args, **kwargs):
- """
- Create a new change set and apply it to the current state.
-
- The request body should contain a list of changes to be applied.
- """
- serializer_errors = []
-
- request_serializer = ApplyChangeSetRequestSerializer(data=request.data)
-
- change_set_id = self.request.data.get("change_set_id", None)
-
- if not request_serializer.is_valid():
- for field_error_name in request_serializer.errors:
- self._extract_serializer_errors(
- field_error_name, request_serializer, serializer_errors
- )
-
- return self._get_error_response(change_set_id, serializer_errors)
-
- change_set = request_serializer.data.get("change_set", None)
-
- ipaddress_assigned_object = self._ipaddress_assigned_object(change_set)
-
- try:
- with transaction.atomic():
- for change in change_set:
- change_id = change.get("change_id", None)
- change_type = change.get("change_type", None)
- object_type = change.get("object_type", None)
- object_data = change.get("data", None)
- object_id = change.get("object_id", None)
-
- errors = None
- if (
- any(ipaddress_assigned_object)
- and object_type == "ipam.ipaddress"
- ):
- errors = self._handle_ipaddress_assigned_object(
- object_data, ipaddress_assigned_object
- )
-
- if errors is not None:
- serializer_errors.append({"change_id": change_id, **errors})
- continue
-
- serializer = self._get_serializer(
- change_type, object_id, object_type, object_data, change_set_id
- )
-
- if serializer.is_valid():
- serializer.save()
- else:
- errors_dict = {
- field_name: f"{field_name}: {str(field_errors[0])}"
- for field_name, field_errors in serializer.errors.items()
- }
-
- serializer_errors.append(
- {"change_id": change_id, **errors_dict}
- )
- if len(serializer_errors) > 0:
- raise ApplyChangeSetException
- except ApplyChangeSetException:
- return self._get_error_response(change_set_id, serializer_errors)
-
- data = {"change_set_id": change_set_id, "result": "success"}
- return Response(data, status=status.HTTP_200_OK)
-
- def _extract_serializer_errors(
- self, field_error_name, request_serializer, serializer_errors
- ):
- if isinstance(request_serializer.errors[field_error_name], dict):
- for error_index, error_values in request_serializer.errors[
- field_error_name
- ].items():
- errors_dict = {
- "change_id": request_serializer.data.get("change_set")[
- error_index
- ].get("change_id")
- }
-
- for field_name, field_errors in error_values.items():
- errors_dict[field_name] = f"{str(field_errors[0])}"
-
- serializer_errors.append(errors_dict)
- else:
- errors = {
- field_error_name: f"{str(field_errors)}"
- for field_errors in request_serializer.errors[field_error_name]
- }
-
- serializer_errors.append(errors)
-
-
-class ApplyChangeSetException(Exception):
- """ApplyChangeSetException used to cause atomic transaction rollback."""
-
- pass
diff --git a/diode-netbox-plugin/netbox_diode_plugin/management/__init__.py b/diode-netbox-plugin/netbox_diode_plugin/management/__init__.py
deleted file mode 100644
index 89239e40..00000000
--- a/diode-netbox-plugin/netbox_diode_plugin/management/__init__.py
+++ /dev/null
@@ -1,3 +0,0 @@
-#!/usr/bin/env python
-# Copyright 2024 NetBox Labs Inc
-"""Diode Netbox Plugin - Management."""
diff --git a/diode-netbox-plugin/netbox_diode_plugin/management/commands/__init__.py b/diode-netbox-plugin/netbox_diode_plugin/management/commands/__init__.py
deleted file mode 100644
index 0ae9db5b..00000000
--- a/diode-netbox-plugin/netbox_diode_plugin/management/commands/__init__.py
+++ /dev/null
@@ -1,3 +0,0 @@
-#!/usr/bin/env python
-# Copyright 2024 NetBox Labs Inc
-"""Diode Netbox Plugin - Management commands."""
diff --git a/diode-netbox-plugin/netbox_diode_plugin/management/commands/configurediodeplugin.py b/diode-netbox-plugin/netbox_diode_plugin/management/commands/configurediodeplugin.py
deleted file mode 100644
index 08c62e7b..00000000
--- a/diode-netbox-plugin/netbox_diode_plugin/management/commands/configurediodeplugin.py
+++ /dev/null
@@ -1,75 +0,0 @@
-#!/usr/bin/env python
-# Copyright 2024 NetBox Labs Inc
-"""Diode Netbox Plugin - Configure Diode plugin command."""
-
-import os
-
-from django.conf import settings
-from django.contrib.auth import get_user_model
-from django.core.management.base import BaseCommand
-from packaging import version
-from users.models import Group, ObjectPermission, Token
-
-if version.parse(settings.VERSION).major >= 4:
- from core.models import ObjectType as NetBoxType
-else:
- from django.contrib.contenttypes.models import ContentType as NetBoxType
-
-User = get_user_model()
-
-
-def _create_user_with_token(
- username: str, group: Group, is_superuser: bool = False
-) -> User:
- """Create a user with the given username and API key if it does not exist."""
- try:
- user = User.objects.get(username=username)
- except User.DoesNotExist:
- if is_superuser:
- user = User.objects.create_superuser(username=username, is_active=True)
- else:
- user = User.objects.create(username=username, is_active=True)
-
- user.groups.add(*[group.id])
-
- if not Token.objects.filter(user=user).exists():
- Token.objects.create(user=user, key=os.getenv(f"{username}_API_KEY"))
-
- return user
-
-
-class Command(BaseCommand):
- """Configure NetBox Diode plugin."""
-
- help = "Configure NetBox Diode plugin"
-
- diode_to_netbox_username = "DIODE_TO_NETBOX"
- netbox_to_diode_username = "NETBOX_TO_DIODE"
- ingestion_username = "INGESTION"
-
- def handle(self, *args, **options):
- """Handle command execution."""
- self.stdout.write("Configuring NetBox Diode plugin...")
-
- group, _ = Group.objects.get_or_create(name="diode")
-
- diode_to_netbox_user = _create_user_with_token(
- self.diode_to_netbox_username, group
- )
- _ = _create_user_with_token(self.netbox_to_diode_username, group, True)
- _ = _create_user_with_token(self.ingestion_username, group)
-
- diode_plugin_object_type = NetBoxType.objects.get(
- app_label="netbox_diode_plugin", model="diode"
- )
-
- permission, _ = ObjectPermission.objects.get_or_create(
- name="Diode",
- actions=["add", "view"],
- )
-
- permission.groups.set([group])
- permission.users.set([diode_to_netbox_user])
- permission.object_types.set([diode_plugin_object_type])
-
- self.stdout.write("Finished.")
diff --git a/diode-netbox-plugin/netbox_diode_plugin/migrations/__init__.py b/diode-netbox-plugin/netbox_diode_plugin/migrations/__init__.py
deleted file mode 100644
index 7cd32684..00000000
--- a/diode-netbox-plugin/netbox_diode_plugin/migrations/__init__.py
+++ /dev/null
@@ -1,3 +0,0 @@
-#!/usr/bin/env python
-# Copyright 2024 NetBox Labs Inc
-"""Diode Netbox Plugin - Database migrations."""
diff --git a/diode-netbox-plugin/netbox_diode_plugin/models.py b/diode-netbox-plugin/netbox_diode_plugin/models.py
deleted file mode 100644
index 679aebb5..00000000
--- a/diode-netbox-plugin/netbox_diode_plugin/models.py
+++ /dev/null
@@ -1,21 +0,0 @@
-# !/usr/bin/env python
-# Copyright 2024 NetBox Labs Inc
-"""Diode Netbox Plugin - Models."""
-
-from django.db import models
-
-
-class Diode(models.Model):
- """Dummy model used to generate permissions for Diode NetBox Plugin. Does not exist in the database."""
-
- class Meta:
- """Meta class."""
-
- managed = False
-
- default_permissions = ()
-
- permissions = (
- ("view_diode", "Can view Diode"),
- ("add_diode", "Can apply change sets from Diode"),
- )
diff --git a/diode-netbox-plugin/netbox_diode_plugin/navigation.py b/diode-netbox-plugin/netbox_diode_plugin/navigation.py
deleted file mode 100644
index e522425b..00000000
--- a/diode-netbox-plugin/netbox_diode_plugin/navigation.py
+++ /dev/null
@@ -1,25 +0,0 @@
-#!/usr/bin/env python
-# Copyright 2024 NetBox Labs Inc
-"""Diode Netbox Plugin - Navigation."""
-
-
-from netbox.plugins import PluginMenu, PluginMenuItem
-
-# default arguments for the PluginMenuItem class
-display_state = {
- "link": "plugins:netbox_diode_plugin:display_state",
- "link_text": "Display state",
- "staff_only": True, # 3.6+ feature
-}
-
-
-menu = PluginMenu(
- label="NetBox Labs",
- groups=(
- (
- "Diode",
- (PluginMenuItem(**display_state),),
- ),
- ),
- icon_class="mdi mdi-arrow-collapse-right",
-)
diff --git a/diode-netbox-plugin/netbox_diode_plugin/search.py b/diode-netbox-plugin/netbox_diode_plugin/search.py
deleted file mode 100644
index b0b98a81..00000000
--- a/diode-netbox-plugin/netbox_diode_plugin/search.py
+++ /dev/null
@@ -1,18 +0,0 @@
-#!/usr/bin/env python
-# Copyright 2024 NetBox Labs Inc
-"""Diode Netbox Plugin - Search."""
-
-from extras.models import Tag
-from netbox.search import SearchIndex, register_search
-
-
-@register_search
-class TagIndex(SearchIndex):
- """Search index for tags."""
-
- model = Tag
- fields = (
- ("name", 100),
- ("slug", 110),
- )
- display_attrs = ("color",)
diff --git a/diode-netbox-plugin/netbox_diode_plugin/tables.py b/diode-netbox-plugin/netbox_diode_plugin/tables.py
deleted file mode 100644
index e53324de..00000000
--- a/diode-netbox-plugin/netbox_diode_plugin/tables.py
+++ /dev/null
@@ -1,5 +0,0 @@
-#!/usr/bin/env python
-# Copyright 2024 NetBox Labs Inc
-"""Diode Netbox Plugin - Tables."""
-
-from django_tables2 import tables
diff --git a/diode-netbox-plugin/netbox_diode_plugin/templates/diode/display_state.html b/diode-netbox-plugin/netbox_diode_plugin/templates/diode/display_state.html
deleted file mode 100644
index 9211e806..00000000
--- a/diode-netbox-plugin/netbox_diode_plugin/templates/diode/display_state.html
+++ /dev/null
@@ -1,9 +0,0 @@
-{% extends 'base/layout.html' %}
-
-{% block title %}
-Display state
-{% endblock title %}
-
-{% block content %}
-State placeholder
-{% endblock content %}
\ No newline at end of file
diff --git a/diode-netbox-plugin/netbox_diode_plugin/tests/__init__.py b/diode-netbox-plugin/netbox_diode_plugin/tests/__init__.py
deleted file mode 100644
index 6e08b262..00000000
--- a/diode-netbox-plugin/netbox_diode_plugin/tests/__init__.py
+++ /dev/null
@@ -1,3 +0,0 @@
-#!/usr/bin/env python
-# Copyright 2024 NetBox Labs Inc
-"""Diode Netbox Plugin."""
diff --git a/diode-netbox-plugin/netbox_diode_plugin/tests/test_apply_change_set.py b/diode-netbox-plugin/netbox_diode_plugin/tests/test_apply_change_set.py
deleted file mode 100644
index d107509a..00000000
--- a/diode-netbox-plugin/netbox_diode_plugin/tests/test_apply_change_set.py
+++ /dev/null
@@ -1,987 +0,0 @@
-#!/usr/bin/env python
-# Copyright 2024 NetBox Labs Inc
-"""Diode Netbox Plugin - Tests for ApplyChangeSetView."""
-import uuid
-
-from dcim.models import (
- Device,
- DeviceRole,
- DeviceType,
- Interface,
- Manufacturer,
- Rack,
- Site,
-)
-from django.contrib.auth import get_user_model
-from ipam.models import ASN, RIR, IPAddress
-from netaddr import IPNetwork
-from rest_framework import status
-from users.models import Token
-from utilities.testing import APITestCase
-from virtualization.models import Cluster, ClusterType
-
-User = get_user_model()
-
-
-class BaseApplyChangeSet(APITestCase):
- """Base ApplyChangeSet test case."""
-
- def setUp(self):
- """Set up test."""
- # Necessary to use with signals.
- self.user_netbox_to_diode = User.objects.create_user(username="NETBOX_TO_DIODE")
- Token.objects.create(user=self.user_netbox_to_diode)
-
- self.user = User.objects.create_user(username="testcommonuser")
- self.add_permissions("netbox_diode_plugin.add_diode")
- self.user_token = Token.objects.create(user=self.user)
-
- self.user_header = {"HTTP_AUTHORIZATION": f"Token {self.user_token.key}"}
-
- rir = RIR.objects.create(name="RFC 6996", is_private=True)
- self.asns = [ASN(asn=65000 + i, rir=rir) for i in range(8)]
- ASN.objects.bulk_create(self.asns)
-
- self.sites = (
- Site(
- id=10,
- name="Site 1",
- slug="site-1",
- facility="Alpha",
- description="First test site",
- physical_address="123 Fake St Lincoln NE 68588",
- shipping_address="123 Fake St Lincoln NE 68588",
- comments="Lorem ipsum etcetera",
- ),
- Site(
- id=20,
- name="Site 2",
- slug="site-2",
- facility="Bravo",
- description="Second test site",
- physical_address="725 Cyrus Valleys Suite 761 Douglasfort NE 57761",
- shipping_address="725 Cyrus Valleys Suite 761 Douglasfort NE 57761",
- comments="Lorem ipsum etcetera",
- ),
- )
- Site.objects.bulk_create(self.sites)
-
- self.racks = (
- Rack(name="Rack 1", site=self.sites[0]),
- Rack(name="Rack 2", site=self.sites[1]),
- )
- Rack.objects.bulk_create(self.racks)
-
- manufacturer = Manufacturer.objects.create(
- name="Manufacturer 1", slug="manufacturer-1"
- )
-
- self.device_types = (
- DeviceType(
- manufacturer=manufacturer, model="Device Type 1", slug="device-type-1"
- ),
- DeviceType(
- manufacturer=manufacturer,
- model="Device Type 2",
- slug="device-type-2",
- u_height=2,
- ),
- )
- DeviceType.objects.bulk_create(self.device_types)
-
- self.roles = (
- DeviceRole(name="Device Role 1", slug="device-role-1", color="ff0000"),
- DeviceRole(name="Device Role 2", slug="device-role-2", color="00ff00"),
- )
- DeviceRole.objects.bulk_create(self.roles)
-
- cluster_type = ClusterType.objects.create(
- name="Cluster Type 1", slug="cluster-type-1"
- )
-
- self.clusters = (
- Cluster(name="Cluster 1", type=cluster_type),
- Cluster(name="Cluster 2", type=cluster_type),
- )
- Cluster.objects.bulk_create(self.clusters)
-
- self.devices = (
- Device(
- id=10,
- device_type=self.device_types[0],
- role=self.roles[0],
- name="Device 1",
- site=self.sites[0],
- rack=self.racks[0],
- cluster=self.clusters[0],
- local_context_data={"A": 1},
- ),
- Device(
- id=20,
- device_type=self.device_types[0],
- role=self.roles[0],
- name="Device 2",
- site=self.sites[0],
- rack=self.racks[0],
- cluster=self.clusters[0],
- local_context_data={"B": 2},
- ),
- )
- Device.objects.bulk_create(self.devices)
-
- self.interfaces = (
- Interface(name="Interface 1", device=self.devices[0], type="1000baset"),
- Interface(name="Interface 2", device=self.devices[0], type="1000baset"),
- Interface(name="Interface 3", device=self.devices[0], type="1000baset"),
- Interface(name="Interface 4", device=self.devices[0], type="1000baset"),
- Interface(name="Interface 5", device=self.devices[0], type="1000baset"),
- )
- Interface.objects.bulk_create(self.interfaces)
-
- self.ip_addresses = (
- IPAddress(
- address=IPNetwork("10.0.0.1/24"), assigned_object=self.interfaces[0]
- ),
- IPAddress(
- address=IPNetwork("192.0.2.1/24"), assigned_object=self.interfaces[1]
- ),
- )
- IPAddress.objects.bulk_create(self.ip_addresses)
-
- self.url = "/netbox/api/plugins/diode/apply-change-set/"
-
- def send_request(self, payload, status_code=status.HTTP_200_OK):
- """Post the payload to the url and return the response."""
- response = self.client.post(
- self.url, data=payload, format="json", **self.user_header
- )
- self.assertEqual(response.status_code, status_code)
- return response
-
-
-class ApplyChangeSetTestCase(BaseApplyChangeSet):
- """ApplyChangeSet test cases."""
-
- @staticmethod
- def get_change_id(payload, index):
- """Get change_id from payload."""
- return payload.get("change_set")[index].get("change_id")
-
- def test_change_type_create_return_200(self):
- """Test create change_type with successful."""
- payload = {
- "change_set_id": str(uuid.uuid4()),
- "change_set": [
- {
- "change_id": str(uuid.uuid4()),
- "change_type": "create",
- "object_version": None,
- "object_type": "dcim.site",
- "object_id": None,
- "data": {
- "name": "Site A",
- "slug": "site-a",
- "facility": "Alpha",
- "description": "",
- "physical_address": "123 Fake St Lincoln NE 68588",
- "shipping_address": "123 Fake St Lincoln NE 68588",
- "comments": "Lorem ipsum etcetera",
- "asns": [self.asns[0].pk, self.asns[1].pk],
- },
- },
- {
- "change_id": str(uuid.uuid4()),
- "change_type": "create",
- "object_version": None,
- "object_type": "dcim.interface",
- "object_id": None,
- "data": {
- "name": "Interface 1",
- "device": self.devices[1].pk,
- "type": "other",
- },
- },
- {
- "change_id": str(uuid.uuid4()),
- "change_type": "create",
- "object_version": None,
- "object_type": "ipam.ipaddress",
- "object_id": None,
- "data": {
- "address": "192.163.2.1/24",
- "assigned_object": {
- "interface": {"id": self.interfaces[2].pk},
- },
- },
- },
- ],
- }
-
- response = self.send_request(payload)
-
- self.assertEqual(response.json().get("result"), "success")
-
- def test_change_type_update_return_200(self):
- """Test update change_type with successful."""
- payload = {
- "change_set_id": str(uuid.uuid4()),
- "change_set": [
- {
- "change_id": str(uuid.uuid4()),
- "change_type": "update",
- "object_version": None,
- "object_type": "dcim.site",
- "object_id": 20,
- "data": {
- "name": "Site A",
- "slug": "site-a",
- "facility": "Alpha",
- "description": "",
- "physical_address": "123 Fake St Lincoln NE 68588",
- "shipping_address": "123 Fake St Lincoln NE 68588",
- "comments": "Lorem ipsum etcetera",
- "asns": [self.asns[0].pk, self.asns[1].pk],
- },
- },
- ],
- }
-
- response = self.client.post(
- self.url, payload, format="json", **self.user_header
- )
-
- site_updated = Site.objects.get(id=20)
-
- self.assertEqual(response.json().get("result"), "success")
- self.assertEqual(site_updated.name, "Site A")
-
- def test_change_type_create_with_error_return_400(self):
- """Test create change_type with wrong payload."""
- payload = {
- "change_set_id": str(uuid.uuid4()),
- "change_set": [
- {
- "change_id": str(uuid.uuid4()),
- "change_type": "create",
- "object_version": None,
- "object_type": "dcim.site",
- "object_id": None,
- "data": {
- "name": "Site A",
- "slug": "site-a",
- "facility": "Alpha",
- "description": "",
- "physical_address": "123 Fake St Lincoln NE 68588",
- "shipping_address": "123 Fake St Lincoln NE 68588",
- "comments": "Lorem ipsum etcetera",
- "asns": 1,
- },
- },
- ],
- }
-
- response = self.send_request(payload, status_code=status.HTTP_400_BAD_REQUEST)
-
- site_created = Site.objects.filter(name="Site A")
-
- self.assertEqual(response.json().get("result"), "failed")
- self.assertEqual(
- response.json().get("errors")[0].get("change_id"),
- self.get_change_id(payload, 0),
- )
- self.assertIn(
- 'Expected a list of items but got type "int".',
- response.json().get("errors")[0].get("asns"),
- )
- self.assertFalse(site_created.exists())
-
- def test_change_type_update_with_error_return_400(self):
- """Test update change_type with wrong payload."""
- payload = {
- "change_set_id": str(uuid.uuid4()),
- "change_set": [
- {
- "change_id": str(uuid.uuid4()),
- "change_type": "update",
- "object_version": None,
- "object_type": "dcim.site",
- "object_id": 20,
- "data": {
- "name": "Site A",
- "slug": "site-a",
- "facility": "Alpha",
- "description": "",
- "physical_address": "123 Fake St Lincoln NE 68588",
- "shipping_address": "123 Fake St Lincoln NE 68588",
- "comments": "Lorem ipsum etcetera",
- "asns": 1,
- },
- },
- ],
- }
-
- response = self.send_request(payload, status_code=status.HTTP_400_BAD_REQUEST)
-
- site_updated = Site.objects.get(id=20)
-
- self.assertEqual(response.json().get("result"), "failed")
- self.assertEqual(
- response.json().get("errors")[0].get("change_id"),
- self.get_change_id(payload, 0),
- )
- self.assertIn(
- 'Expected a list of items but got type "int".',
- response.json().get("errors")[0].get("asns"),
- )
- self.assertEqual(site_updated.name, "Site 2")
-
- def test_change_type_create_with_multiples_objects_return_200(self):
- """Test create change type with two objects."""
- payload = {
- "change_set_id": str(uuid.uuid4()),
- "change_set": [
- {
- "change_id": str(uuid.uuid4()),
- "change_type": "create",
- "object_version": None,
- "object_type": "dcim.site",
- "object_id": None,
- "data": {
- "name": "Site Z",
- "slug": "site-z",
- "facility": "Omega",
- "description": "",
- "physical_address": "123 Fake St Lincoln NE 68588",
- "shipping_address": "123 Fake St Lincoln NE 68588",
- "comments": "Lorem ipsum etcetera",
- "asns": [self.asns[0].pk, self.asns[1].pk],
- },
- },
- {
- "change_id": str(uuid.uuid4()),
- "change_type": "create",
- "object_version": None,
- "object_type": "dcim.device",
- "object_id": None,
- "data": {
- "device_type": self.device_types[1].pk,
- "role": self.roles[1].pk,
- "name": "Test Device 500",
- "site": self.sites[1].pk,
- "rack": self.racks[1].pk,
- "cluster": self.clusters[1].pk,
- },
- },
- ],
- }
-
- response = self.send_request(payload)
-
- self.assertEqual(response.json().get("result"), "success")
-
- def test_change_type_update_with_multiples_objects_return_200(self):
- """Test update change type with two objects."""
- payload = {
- "change_set_id": str(uuid.uuid4()),
- "change_set": [
- {
- "change_id": str(uuid.uuid4()),
- "change_type": "update",
- "object_version": None,
- "object_type": "dcim.site",
- "object_id": 20,
- "data": {
- "name": "Site A",
- "slug": "site-a",
- "facility": "Alpha",
- "description": "",
- "physical_address": "123 Fake St Lincoln NE 68588",
- "shipping_address": "123 Fake St Lincoln NE 68588",
- "comments": "Lorem ipsum etcetera",
- "asns": [self.asns[0].pk, self.asns[1].pk],
- },
- },
- {
- "change_id": str(uuid.uuid4()),
- "change_type": "update",
- "object_version": None,
- "object_type": "dcim.device",
- "object_id": 10,
- "data": {
- "device_type": self.device_types[1].pk,
- "role": self.roles[1].pk,
- "name": "Test Device 3",
- "site": self.sites[1].pk,
- "rack": self.racks[1].pk,
- "cluster": self.clusters[1].pk,
- },
- },
- ],
- }
-
- response = self.send_request(payload)
-
- site_updated = Site.objects.get(id=20)
- device_updated = Device.objects.get(id=10)
-
- self.assertEqual(response.json().get("result"), "success")
- self.assertEqual(site_updated.name, "Site A")
- self.assertEqual(device_updated.name, "Test Device 3")
-
- def test_change_type_create_and_update_with_error_in_one_object_return_400(self):
- """Test create and update change type with one object with error."""
- payload = {
- "change_set_id": str(uuid.uuid4()),
- "change_set": [
- {
- "change_id": str(uuid.uuid4()),
- "change_type": "create",
- "object_version": None,
- "object_type": "dcim.site",
- "object_id": None,
- "data": {
- "name": "Site Z",
- "slug": "site-z",
- "facility": "Alpha",
- "description": "",
- "physical_address": "123 Fake St Lincoln NE 68588",
- "shipping_address": "123 Fake St Lincoln NE 68588",
- "comments": "Lorem ipsum etcetera",
- "asns": [self.asns[0].pk, self.asns[1].pk],
- },
- },
- {
- "change_id": str(uuid.uuid4()),
- "change_type": "update",
- "object_version": None,
- "object_type": "dcim.device",
- "object_id": 10,
- "data": {
- "device_type": 3,
- "role": self.roles[1].pk,
- "name": "Test Device 4",
- "site": self.sites[1].pk,
- "rack": self.racks[1].pk,
- "cluster": self.clusters[1].pk,
- },
- },
- ],
- }
-
- response = self.send_request(payload, status_code=status.HTTP_400_BAD_REQUEST)
-
- site_created = Site.objects.filter(name="Site Z")
- device_created = Device.objects.filter(name="Test Device 4")
-
- self.assertEqual(response.json().get("result"), "failed")
- self.assertEqual(
- response.json().get("errors")[0].get("change_id"),
- self.get_change_id(payload, 1),
- )
- self.assertIn(
- "Related object not found using the provided numeric ID",
- response.json().get("errors")[0].get("device_type"),
- )
- self.assertFalse(site_created.exists())
- self.assertFalse(device_created.exists())
-
- def test_multiples_create_type_error_in_two_objects_return_400(self):
- """Test create with error in two objects."""
- payload = {
- "change_set_id": str(uuid.uuid4()),
- "change_set": [
- {
- "change_id": str(uuid.uuid4()),
- "change_type": "create",
- "object_version": None,
- "object_type": "dcim.site",
- "object_id": None,
- "data": {
- "name": "Site Z",
- "slug": "site-z",
- "facility": "Alpha",
- "description": "",
- "physical_address": "123 Fake St Lincoln NE 68588",
- "shipping_address": "123 Fake St Lincoln NE 68588",
- "comments": "Lorem ipsum etcetera",
- "asns": [self.asns[0].pk, self.asns[1].pk],
- },
- },
- {
- "change_id": str(uuid.uuid4()),
- "change_type": "create",
- "object_version": None,
- "object_type": "dcim.device",
- "object_id": None,
- "data": {
- "device_type": 3,
- "role": self.roles[1].pk,
- "name": "Test Device 4",
- "site": self.sites[1].pk,
- "rack": self.racks[1].pk,
- "cluster": self.clusters[1].pk,
- },
- },
- {
- "change_id": str(uuid.uuid4()),
- "change_type": "create",
- "object_version": None,
- "object_type": "dcim.device",
- "object_id": None,
- "data": {
- "device_type": 100,
- "role": 10,
- "name": "Test Device 40",
- "site": self.sites[1].pk,
- "rack": self.racks[1].pk,
- "cluster": self.clusters[1].pk,
- },
- },
- ],
- }
-
- response = self.send_request(payload, status_code=status.HTTP_400_BAD_REQUEST)
-
- site_created = Site.objects.filter(name="Site Z")
- device_created = Device.objects.filter(name="Test Device 4")
-
- self.assertEqual(response.json().get("result"), "failed")
-
- self.assertEqual(
- response.json().get("errors")[0].get("change_id"),
- self.get_change_id(payload, 1),
- )
- self.assertIn(
- "Related object not found using the provided numeric ID",
- response.json().get("errors")[0].get("device_type"),
- )
-
- self.assertEqual(
- response.json().get("errors")[1].get("change_id"),
- self.get_change_id(payload, 2),
- )
- self.assertIn(
- "Related object not found using the provided numeric ID",
- response.json().get("errors")[1].get("device_type"),
- )
-
- self.assertFalse(site_created.exists())
- self.assertFalse(device_created.exists())
-
- def test_change_type_update_with_object_id_not_exist_return_400(self):
- """Test update object with nonexistent object_id."""
- payload = {
- "change_set_id": str(uuid.uuid4()),
- "change_set": [
- {
- "change_id": str(uuid.uuid4()),
- "change_type": "update",
- "object_version": None,
- "object_type": "dcim.site",
- "object_id": 30,
- "data": {
- "name": "Site A",
- "slug": "site-a",
- "facility": "Alpha",
- "description": "",
- "physical_address": "123 Fake St Lincoln NE 68588",
- "shipping_address": "123 Fake St Lincoln NE 68588",
- "comments": "Lorem ipsum etcetera",
- "asns": 1,
- },
- },
- ],
- }
-
- response = self.client.post(
- self.url, payload, format="json", **self.user_header
- )
-
- site_updated = Site.objects.get(id=20)
-
- self.assertEqual(response.json()[0], "object with id 30 does not exist")
- self.assertEqual(site_updated.name, "Site 2")
-
- def test_change_set_id_field_not_provided_return_400(self):
- """Test update object with change_set_id incorrect."""
- payload = {
- "change_set_id": None,
- "change_set": [
- {
- "change_id": str(uuid.uuid4()),
- "change_type": "update",
- "object_version": None,
- "object_type": "dcim.site",
- "object_id": 20,
- "data": {
- "name": "Site A",
- "slug": "site-a",
- "facility": "Alpha",
- "description": "",
- "physical_address": "123 Fake St Lincoln NE 68588",
- "shipping_address": "123 Fake St Lincoln NE 68588",
- "comments": "Lorem ipsum etcetera",
- "asns": 1,
- },
- },
- ],
- }
-
- response = self.send_request(payload, status_code=status.HTTP_400_BAD_REQUEST)
-
- self.assertIsNone(response.json().get("errors")[0].get("change_id"))
- self.assertEqual(
- response.json().get("errors")[0].get("change_set_id"),
- "This field may not be null.",
- )
-
- def test_change_set_id_change_id_and_change_type_field_not_provided_return_400(
- self,
- ):
- """Test update object with change_set_id, change_id, and change_type incorrect."""
- payload = {
- "change_set_id": "",
- "change_set": [
- {
- "change_id": "",
- "change_type": "",
- "object_version": None,
- "object_type": "dcim.site",
- "object_id": 20,
- "data": {
- "name": "Site A",
- "slug": "site-a",
- "facility": "Alpha",
- "description": "",
- "physical_address": "123 Fake St Lincoln NE 68588",
- "shipping_address": "123 Fake St Lincoln NE 68588",
- "comments": "Lorem ipsum etcetera",
- "asns": 1,
- },
- },
- ],
- }
-
- response = self.send_request(payload, status_code=status.HTTP_400_BAD_REQUEST)
-
- self.assertEqual(
- response.json().get("errors")[0].get("change_set_id"),
- "Must be a valid UUID.",
- )
- self.assertEqual(
- response.json().get("errors")[1].get("change_id"),
- "Must be a valid UUID.",
- )
- self.assertEqual(
- response.json().get("errors")[1].get("change_type"),
- "This field may not be blank.",
- )
-
- def test_change_set_id_field_and_change_set_not_provided_return_400(self):
- """Test update object with change_set_id and change_set incorrect."""
- payload = {
- "change_set_id": "",
- "change_set": [],
- }
-
- response = self.send_request(payload, status_code=status.HTTP_400_BAD_REQUEST)
-
- self.assertEqual(
- response.json().get("errors")[0].get("change_set_id"),
- "Must be a valid UUID.",
- )
- self.assertEqual(
- response.json().get("errors")[1].get("change_set"),
- "This list may not be empty.",
- )
-
- def test_change_type_and_object_type_provided_return_400(
- self,
- ):
- """Test change_type and object_type incorrect."""
- payload = {
- "change_set_id": str(uuid.uuid4()),
- "change_set": [
- {
- "change_id": str(uuid.uuid4()),
- "change_type": None,
- "object_version": None,
- "object_type": "",
- "object_id": None,
- "data": {
- "name": "Site A",
- "slug": "site-a",
- "facility": "Alpha",
- "description": "",
- "physical_address": "123 Fake St Lincoln NE 68588",
- "shipping_address": "123 Fake St Lincoln NE 68588",
- "comments": "Lorem ipsum etcetera",
- },
- },
- {
- "change_id": str(uuid.uuid4()),
- "change_type": "",
- "object_version": None,
- "object_type": "dcim.site",
- "object_id": None,
- "data": {
- "name": "Site Z",
- "slug": "site-z",
- "facility": "Betha",
- "description": "",
- "physical_address": "123 Fake St Lincoln NE 68588",
- "shipping_address": "123 Fake St Lincoln NE 68588",
- "comments": "Lorem ipsum etcetera",
- },
- },
- ],
- }
-
- response = self.send_request(payload, status_code=status.HTTP_400_BAD_REQUEST)
-
- # First item of change_set
- self.assertEqual(
- response.json().get("errors")[0].get("change_id"),
- self.get_change_id(payload, 0),
- )
- self.assertEqual(
- response.json().get("errors")[0].get("change_type"),
- "This field may not be null.",
- )
- self.assertEqual(
- response.json().get("errors")[0].get("object_type"),
- "This field may not be blank.",
- )
-
- # Second item of change_set
- self.assertEqual(
- response.json().get("errors")[1].get("change_id"),
- self.get_change_id(payload, 1),
- )
- self.assertEqual(
- response.json().get("errors")[1].get("change_type"),
- "This field may not be blank.",
- )
-
- def test_create_ip_address_return_200(self):
- """Test create ip_address with successful."""
- payload = {
- "change_set_id": str(uuid.uuid4()),
- "change_set": [
- {
- "change_id": str(uuid.uuid4()),
- "change_type": "create",
- "object_version": None,
- "object_type": "ipam.ipaddress",
- "object_id": None,
- "data": {
- "address": "192.161.3.1/24",
- "assigned_object": {
- "interface": {
- "name": self.interfaces[3].name,
- "device": {
- "name": self.devices[0].name,
- "site": {"name": self.sites[0].name},
- },
- },
- },
- },
- },
- ],
- }
- response = self.send_request(payload)
-
- self.assertEqual(response.json().get("result"), "success")
-
- def test_create_ip_address_return_400(self):
- """Test create ip_address with missing interface name."""
- payload = {
- "change_set_id": str(uuid.uuid4()),
- "change_set": [
- {
- "change_id": str(uuid.uuid4()),
- "change_type": "create",
- "object_version": None,
- "object_type": "ipam.ipaddress",
- "object_id": None,
- "data": {
- "address": "192.161.3.1/24",
- "assigned_object": {
- "interface": {
- # Forcing to miss the name of the interface
- "device": {
- "name": self.devices[0].name,
- "site": {"name": self.sites[0].name},
- },
- },
- },
- },
- },
- ],
- }
- response = self.send_request(payload, status_code=status.HTTP_400_BAD_REQUEST)
-
- self.assertIn(
- "not sufficient to retrieve interface",
- response.json().get("errors")[0].get("assigned_object"),
- )
-
- def test_create_ip_address_not_exist_interface_return_400(self):
- """Test create ip_address with not valid interface."""
- payload = {
- "change_set_id": str(uuid.uuid4()),
- "change_set": [
- {
- "change_id": str(uuid.uuid4()),
- "change_type": "create",
- "object_version": None,
- "object_type": "ipam.ipaddress",
- "object_id": None,
- "data": {
- "address": "192.161.3.1/24",
- "assigned_object": {
- "interface": {
- "name": "not_exist",
- "device": {
- "name": self.devices[0].name,
- "site": {"name": self.sites[0].name},
- },
- },
- },
- },
- },
- ],
- }
- response = self.send_request(payload, status_code=status.HTTP_400_BAD_REQUEST)
-
- self.assertIn(
- "does not exist",
- response.json().get("errors")[0].get("assigned_object"),
- )
-
- def test_create_ip_address_missing_device_interface_return_400(self):
- """Test create ip_address with missing device interface name."""
- payload = {
- "change_set_id": str(uuid.uuid4()),
- "change_set": [
- {
- "change_id": str(uuid.uuid4()),
- "change_type": "create",
- "object_version": None,
- "object_type": "ipam.ipaddress",
- "object_id": None,
- "data": {
- "address": "192.161.3.1/24",
- "assigned_object": {
- "interface": {
- "name": "not_exist",
- "device": {
- "site": {"name": self.sites[0].name},
- },
- },
- },
- },
- },
- ],
- }
- response = self.send_request(payload, status_code=status.HTTP_400_BAD_REQUEST)
-
- self.assertIn(
- "Interface device needs to have either id or name provided",
- response.json().get("errors")[0].get("assigned_object"),
- )
-
- def test_create_ip_address_missing_interface_device_site_return_400(self):
- """Test create ip_address with missing interface device site name."""
- payload = {
- "change_set_id": str(uuid.uuid4()),
- "change_set": [
- {
- "change_id": str(uuid.uuid4()),
- "change_type": "create",
- "object_version": None,
- "object_type": "ipam.ipaddress",
- "object_id": None,
- "data": {
- "address": "192.161.3.1/24",
- "assigned_object": {
- "interface": {
- "name": "not_exist",
- "device": {
- "name": self.devices[0].name,
- "site": {"facility": "Betha"},
- },
- },
- },
- },
- },
- ],
- }
- response = self.send_request(payload, status_code=status.HTTP_400_BAD_REQUEST)
-
- self.assertIn(
- "Interface device site needs to have either id or name provided",
- response.json().get("errors")[0].get("assigned_object"),
- )
-
- def test_primary_ip_address_not_found_return_400(self):
- """Test update primary ip address with site name."""
- payload = {
- "change_set_id": str(uuid.uuid4()),
- "change_set": [
- {
- "change_id": str(uuid.uuid4()),
- "change_type": "update",
- "object_version": None,
- "object_type": "dcim.device",
- "data": {
- "name": self.devices[0].name,
- "site": {"name": self.sites[0].name},
- "primary_ip6": {
- "address": "2001:DB8:0000:0000:244:17FF:FEB6:D37D/64",
- },
- },
- },
- ],
- }
- response = self.send_request(payload, status_code=status.HTTP_400_BAD_REQUEST)
-
- self.assertEqual(response.json()[0], "primary IP not found")
-
- def test_add_primary_ip_address_to_device(self):
- """Add primary ip address to device."""
- payload = {
- "change_set_id": str(uuid.uuid4()),
- "change_set": [
- {
- "change_id": str(uuid.uuid4()),
- "change_type": "update",
- "object_version": None,
- "object_type": "dcim.device",
- "data": {
- "name": self.devices[0].name,
- "site": {"name": self.sites[0].name},
- "primary_ip4": {
- "address": str(self.ip_addresses[0].address),
- "assigned_object": {
- "interface": {
- "name": self.interfaces[0].name,
- "device": {
- "name": self.devices[0].name,
- "site": {"name": self.sites[0].name},
- },
- },
- },
- },
- },
- },
- ],
- }
-
- response = self.send_request(payload)
-
- device_updated = Device.objects.get(id=10)
-
- self.assertEqual(response.json().get("result"), "success")
- self.assertEqual(device_updated.name, self.devices[0].name)
- self.assertEqual(device_updated.primary_ip4, self.ip_addresses[0])
diff --git a/diode-netbox-plugin/netbox_diode_plugin/tests/test_object_state.py b/diode-netbox-plugin/netbox_diode_plugin/tests/test_object_state.py
deleted file mode 100644
index ab9d841d..00000000
--- a/diode-netbox-plugin/netbox_diode_plugin/tests/test_object_state.py
+++ /dev/null
@@ -1,328 +0,0 @@
-#!/usr/bin/env python
-# Copyright 2024 NetBox Labs Inc
-"""Diode Netbox Plugin - Tests for ObjectStateView."""
-
-from dcim.models import (
- Device,
- DeviceRole,
- DeviceType,
- Interface,
- Manufacturer,
- Rack,
- Site,
-)
-from django.contrib.auth import get_user_model
-from django.core.management import call_command
-from ipam.models import IPAddress
-from netaddr import IPNetwork
-from rest_framework import status
-from users.models import Token
-from utilities.testing import APITestCase
-from virtualization.models import Cluster, ClusterType
-
-User = get_user_model()
-
-
-class ObjectStateTestCase(APITestCase):
- """ObjectState test cases."""
-
- @classmethod
- def setUpClass(cls):
- """Set up class."""
- super().setUpClass()
-
- cls.sites = (
- Site(
- name="Site 1",
- slug="site-1",
- facility="Alpha",
- description="First test site",
- physical_address="123 Fake St Lincoln NE 68588",
- shipping_address="123 Fake St Lincoln NE 68588",
- comments="Lorem ipsum etcetera",
- ),
- Site(
- name="Site 2",
- slug="site-2",
- facility="Bravo",
- description="Second test site",
- physical_address="725 Cyrus Valleys Suite 761 Douglasfort NE 57761",
- shipping_address="725 Cyrus Valleys Suite 761 Douglasfort NE 57761",
- comments="Lorem ipsum etcetera",
- ),
- Site(
- name="Site 3",
- slug="site-3",
- facility="Charlie",
- description="Third test site",
- physical_address="2321 Dovie Dale East Cristobal AK 71959",
- shipping_address="2321 Dovie Dale East Cristobal AK 71959",
- comments="Lorem ipsum etcetera",
- ),
- )
- Site.objects.bulk_create(cls.sites)
-
- cls.manufacturer = (
- Manufacturer(name="Cisco", slug="cisco"),
- Manufacturer(name="Manufacturer 2", slug="manufacturer-2"),
- )
-
- Manufacturer.objects.bulk_create(cls.manufacturer)
-
- cls.device_types = (
- DeviceType(
- manufacturer=cls.manufacturer[0],
- model="ISR4321",
- slug="isr4321",
- ),
- DeviceType(
- manufacturer=cls.manufacturer[1],
- model="ISR4321",
- slug="isr4321",
- ),
- DeviceType(
- manufacturer=cls.manufacturer[1],
- model="Device Type 2",
- slug="device-type-2",
- u_height=2,
- ),
- )
- DeviceType.objects.bulk_create(cls.device_types)
-
- cls.roles = (
- DeviceRole(name="Device Role 1", slug="device-role-1", color="ff0000"),
- DeviceRole(name="Device Role 2", slug="device-role-2", color="00ff00"),
- )
- DeviceRole.objects.bulk_create(cls.roles)
-
- cls.racks = (
- Rack(name="Rack 1", site=cls.sites[0]),
- Rack(name="Rack 2", site=cls.sites[1]),
- )
- Rack.objects.bulk_create(cls.racks)
-
- cluster_type = ClusterType.objects.create(
- name="Cluster Type 1", slug="cluster-type-1"
- )
-
- cls.clusters = (
- Cluster(name="Cluster 1", type=cluster_type),
- Cluster(name="Cluster 2", type=cluster_type),
- )
- Cluster.objects.bulk_create(cls.clusters)
-
- cls.devices = (
- Device(
- id=10,
- device_type=cls.device_types[0],
- role=cls.roles[0],
- name="Device 1",
- site=cls.sites[0],
- rack=cls.racks[0],
- cluster=cls.clusters[0],
- local_context_data={"A": 1},
- ),
- Device(
- id=20,
- device_type=cls.device_types[0],
- role=cls.roles[0],
- name="Device 2",
- site=cls.sites[0],
- rack=cls.racks[0],
- cluster=cls.clusters[0],
- local_context_data={"B": 2},
- ),
- )
- Device.objects.bulk_create(cls.devices)
-
- cls.interfaces = (
- Interface(name="Interface 1", device=cls.devices[0], type="1000baset"),
- Interface(name="Interface 2", device=cls.devices[0], type="1000baset"),
- Interface(name="Interface 3", device=cls.devices[0], type="1000baset"),
- Interface(name="Interface 4", device=cls.devices[0], type="1000baset"),
- Interface(name="Interface 5", device=cls.devices[0], type="1000baset"),
- )
- Interface.objects.bulk_create(cls.interfaces)
-
- cls.ip_addresses = (
- IPAddress(
- address=IPNetwork("10.0.0.1/24"), assigned_object=cls.interfaces[0]
- ),
- IPAddress(
- address=IPNetwork("192.0.2.1/24"), assigned_object=cls.interfaces[1]
- ),
- )
- IPAddress.objects.bulk_create(cls.ip_addresses)
-
- # call_command is because the searching using q parameter uses CachedValue to get the object ID
- call_command("reindex")
-
- def setUp(self):
- """Set up test."""
- self.root_user = User.objects.create_user(
- username="root_user", is_staff=True, is_superuser=True
- )
- self.root_token = Token.objects.create(user=self.root_user)
-
- self.user = User.objects.create_user(username="testcommonuser")
- self.add_permissions("netbox_diode_plugin.view_diode")
- self.user_token = Token.objects.create(user=self.user)
-
- # another_user does not have permission.
- self.another_user = User.objects.create_user(username="another_user")
- self.another_user_token = Token.objects.create(user=self.another_user)
-
- self.root_header = {"HTTP_AUTHORIZATION": f"Token {self.root_token.key}"}
- self.user_header = {"HTTP_AUTHORIZATION": f"Token {self.user_token.key}"}
- self.another_user_header = {
- "HTTP_AUTHORIZATION": f"Token {self.another_user_token.key}"
- }
-
- self.url = "/netbox/api/plugins/diode/object-state/"
-
- def test_return_object_state_using_id(self):
- """Test searching using id parameter - Root User."""
- site_id = Site.objects.get(name=self.sites[0]).id
- query_parameters = {"id": site_id, "object_type": "dcim.site"}
-
- response = self.client.get(self.url, query_parameters, **self.root_header)
-
- self.assertEqual(response.status_code, status.HTTP_200_OK)
- self.assertEqual(response.json().get("object").get("name"), "Site 1")
-
- def test_return_object_state_using_q(self):
- """Test searching using q parameter - Root User."""
- query_parameters = {"q": "Site 2", "object_type": "dcim.site"}
-
- response = self.client.get(self.url, query_parameters, **self.root_header)
-
- self.assertEqual(response.status_code, status.HTTP_200_OK)
- self.assertEqual(response.json().get("object").get("name"), "Site 2")
-
- def test_object_not_found_return_empty(self):
- """Test empty searching - Root User."""
- query_parameters = {"q": "Site 10", "object_type": "dcim.site"}
-
- response = self.client.get(self.url, query_parameters, **self.root_header)
-
- self.assertEqual(response.status_code, status.HTTP_200_OK)
- self.assertEqual(response.json(), {})
-
- def test_missing_object_type_return_400(self):
- """Test API behavior with missing object type - Root User."""
- query_parameters = {"q": "Site 10", "object_type": ""}
-
- response = self.client.get(self.url, query_parameters, **self.root_header)
-
- self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
-
- def test_missing_q_and_id_parameters_return_400(self):
- """Test API behavior with missing q and ID parameters - Root User."""
- query_parameters = {"object_type": "dcim.site"}
-
- response = self.client.get(self.url, query_parameters, **self.root_header)
-
- self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
-
- def test_request_user_not_authenticated_return_403(self):
- """Test API behavior with user unauthenticated."""
- query_parameters = {"id": 1, "object_type": "dcim.site"}
-
- response = self.client.get(self.url, query_parameters)
-
- self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN)
-
- def test_common_user_with_permissions_get_object_state_using_id(self):
- """Test searching using id parameter for Common User with permission."""
- site_id = Site.objects.get(name=self.sites[0]).id
- query_parameters = {"id": site_id, "object_type": "dcim.site"}
-
- response = self.client.get(self.url, query_parameters, **self.user_header)
-
- self.assertEqual(response.status_code, status.HTTP_200_OK)
- self.assertEqual(response.json().get("object").get("name"), "Site 1")
-
- def test_common_user_without_permissions_get_object_state_using_id_return_403(self):
- """
- Test searching using id parameter for Common User without permission.
-
- User has no permissions.
- """
- query_parameters = {"id": 1, "object_type": "dcim.device"}
-
- response = self.client.get(
- self.url, query_parameters, **self.another_user_header
- )
-
- self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN)
-
- def test_return_object_state_using_q_objects_with_different_manufacturer_return_cisco_manufacturer(
- self,
- ):
- """Test searching using q parameter - DevicesTypes with different manufacturer."""
- query_parameters = {
- "q": "ISR4321",
- "object_type": "dcim.devicetype",
- "manufacturer__name": "Cisco",
- }
-
- response = self.client.get(self.url, query_parameters, **self.root_header)
-
- self.assertEqual(response.status_code, status.HTTP_200_OK)
- self.assertEqual(response.json().get("object").get("model"), "ISR4321")
- self.assertEqual(
- response.json().get("object").get("manufacturer").get("name"), "Cisco"
- )
-
- def test_invalid_object_state_using_q_objects_and_wrong_additional_attributes_return_400(
- self,
- ):
- """Test searching using q parameter - invalid additional attributes."""
- query_parameters = {
- "q": "ISR4321",
- "object_type": "dcim.devicetype",
- "attr_name": "manufacturer.name",
- "attr_value": "Cisco",
- }
-
- response = self.client.get(self.url, query_parameters, **self.root_header)
-
- self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
-
- def test_common_user_with_permissions_get_device_state(self):
- """Test searching for device using q parameter."""
- query_parameters = {
- "q": self.devices[0].name,
- "object_type": "dcim.device",
- "site": self.sites[0].id,
- }
-
- response = self.client.get(self.url, query_parameters, **self.user_header)
- self.assertEqual(response.status_code, status.HTTP_200_OK)
-
- def test_common_user_with_permissions_get_interface_state(self):
- """Test searching for interface using q parameter."""
- query_parameters = {
- "q": self.interfaces[0].name,
- "object_type": "dcim.interface",
- "device": self.devices[0].id,
- "device__site": self.sites[0].id,
- }
-
- response = self.client.get(self.url, query_parameters, **self.user_header)
- self.assertEqual(response.status_code, status.HTTP_200_OK)
-
- def test_common_user_with_permissions_get_ip_state(self):
- """Test searching for ip using q parameter."""
- query_parameters = {
- "q": self.ip_addresses[0].address.ip,
- "object_type": "ipam.ipaddress",
- "interface": self.interfaces[0].id,
- "interface__device": self.devices[0].id,
- "interface__device__site": self.sites[0].id,
- }
-
- response = self.client.get(self.url, query_parameters, **self.user_header)
- self.assertEqual(response.status_code, status.HTTP_200_OK)
-
-
diff --git a/diode-netbox-plugin/netbox_diode_plugin/urls.py b/diode-netbox-plugin/netbox_diode_plugin/urls.py
deleted file mode 100644
index 8aaa07c4..00000000
--- a/diode-netbox-plugin/netbox_diode_plugin/urls.py
+++ /dev/null
@@ -1,12 +0,0 @@
-#!/usr/bin/env python
-# Copyright 2024 NetBox Labs Inc
-"""Diode Netbox Plugin - URLs."""
-
-from django.urls import path
-
-from . import views
-
-urlpatterns = (
- path("display-state/", views.DisplayStateView.as_view(), name="display_state"),
-
-)
diff --git a/diode-netbox-plugin/netbox_diode_plugin/version.py b/diode-netbox-plugin/netbox_diode_plugin/version.py
deleted file mode 100644
index 2de2087c..00000000
--- a/diode-netbox-plugin/netbox_diode_plugin/version.py
+++ /dev/null
@@ -1,19 +0,0 @@
-#!/usr/bin/env python
-# Copyright 2024 NetBox Labs Inc
-"""Version stamp."""
-
-# These properties are injected at build time by the build process.
-
-__commit_hash__ = "unknown"
-__track__ = "dev"
-__version__ = "0.0.0"
-
-
-def version_display():
- """Display the version, track and hash together."""
- return f"v{__version__}-{__track__}-{__commit_hash__}"
-
-
-def version_semver():
- """Semantic version."""
- return __version__
diff --git a/diode-netbox-plugin/netbox_diode_plugin/views.py b/diode-netbox-plugin/netbox_diode_plugin/views.py
deleted file mode 100644
index d1a7cd19..00000000
--- a/diode-netbox-plugin/netbox_diode_plugin/views.py
+++ /dev/null
@@ -1,15 +0,0 @@
-#!/usr/bin/env python
-# Copyright 2024 NetBox Labs Inc
-"""Diode Netbox Plugin - Views."""
-
-from django.shortcuts import render
-from django.views.generic import View
-
-
-class DisplayStateView(View):
- """Display state view."""
-
- def get(self, request):
- """Render a display state template."""
- return render(request, "diode/display_state.html")
-
diff --git a/diode-netbox-plugin/package-lock.json b/diode-netbox-plugin/package-lock.json
deleted file mode 100644
index 706f00be..00000000
--- a/diode-netbox-plugin/package-lock.json
+++ /dev/null
@@ -1,6902 +0,0 @@
-{
- "name": "diode-netbox-plugin",
- "version": "1.0.0",
- "lockfileVersion": 3,
- "requires": true,
- "packages": {
- "": {
- "name": "diode-netbox-plugin",
- "version": "1.0.0",
- "devDependencies": {
- "@semantic-release/changelog": "^6.0.3",
- "semantic-release-export-data": "^1.0.1",
- "semantic-release-monorepo": "^7.0.0"
- }
- },
- "node_modules/@actions/core": {
- "version": "1.10.1",
- "resolved": "https://registry.npmjs.org/@actions/core/-/core-1.10.1.tgz",
- "integrity": "sha512-3lBR9EDAY+iYIpTnTIXmWcNbX3T2kCkAEQGIQx4NVQ0575nk2k3GRZDTPQG+vVtS2izSLmINlxXf0uLtnrTP+g==",
- "dev": true,
- "dependencies": {
- "@actions/http-client": "^2.0.1",
- "uuid": "^8.3.2"
- }
- },
- "node_modules/@actions/http-client": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/@actions/http-client/-/http-client-2.2.0.tgz",
- "integrity": "sha512-q+epW0trjVUUHboliPb4UF9g2msf+w61b32tAkFEwL/IwP0DQWgbCMM0Hbe3e3WXSKz5VcUXbzJQgy8Hkra/Lg==",
- "dev": true,
- "dependencies": {
- "tunnel": "^0.0.6",
- "undici": "^5.25.4"
- }
- },
- "node_modules/@babel/code-frame": {
- "version": "7.23.5",
- "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz",
- "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==",
- "dev": true,
- "dependencies": {
- "@babel/highlight": "^7.23.4",
- "chalk": "^2.4.2"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/code-frame/node_modules/ansi-styles": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
- "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
- "dev": true,
- "dependencies": {
- "color-convert": "^1.9.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/@babel/code-frame/node_modules/chalk": {
- "version": "2.4.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
- "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
- "dev": true,
- "dependencies": {
- "ansi-styles": "^3.2.1",
- "escape-string-regexp": "^1.0.5",
- "supports-color": "^5.3.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/@babel/code-frame/node_modules/color-convert": {
- "version": "1.9.3",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
- "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
- "dev": true,
- "dependencies": {
- "color-name": "1.1.3"
- }
- },
- "node_modules/@babel/code-frame/node_modules/color-name": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
- "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
- "dev": true
- },
- "node_modules/@babel/code-frame/node_modules/has-flag": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
- "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
- "dev": true,
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/@babel/code-frame/node_modules/supports-color": {
- "version": "5.5.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
- "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
- "dev": true,
- "dependencies": {
- "has-flag": "^3.0.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/@babel/helper-validator-identifier": {
- "version": "7.22.20",
- "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz",
- "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==",
- "dev": true,
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/highlight": {
- "version": "7.23.4",
- "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz",
- "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==",
- "dev": true,
- "dependencies": {
- "@babel/helper-validator-identifier": "^7.22.20",
- "chalk": "^2.4.2",
- "js-tokens": "^4.0.0"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/highlight/node_modules/ansi-styles": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
- "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
- "dev": true,
- "dependencies": {
- "color-convert": "^1.9.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/@babel/highlight/node_modules/chalk": {
- "version": "2.4.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
- "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
- "dev": true,
- "dependencies": {
- "ansi-styles": "^3.2.1",
- "escape-string-regexp": "^1.0.5",
- "supports-color": "^5.3.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/@babel/highlight/node_modules/color-convert": {
- "version": "1.9.3",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
- "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
- "dev": true,
- "dependencies": {
- "color-name": "1.1.3"
- }
- },
- "node_modules/@babel/highlight/node_modules/color-name": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
- "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
- "dev": true
- },
- "node_modules/@babel/highlight/node_modules/has-flag": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
- "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
- "dev": true,
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/@babel/highlight/node_modules/supports-color": {
- "version": "5.5.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
- "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
- "dev": true,
- "dependencies": {
- "has-flag": "^3.0.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/@colors/colors": {
- "version": "1.5.0",
- "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz",
- "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==",
- "dev": true,
- "optional": true,
- "peer": true,
- "engines": {
- "node": ">=0.1.90"
- }
- },
- "node_modules/@fastify/busboy": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.0.tgz",
- "integrity": "sha512-+KpH+QxZU7O4675t3mnkQKcZZg56u+K/Ct2K+N2AZYNVK8kyeo/bI18tI8aPm3tvNNRyTWfj6s5tnGNlcbQRsA==",
- "dev": true,
- "engines": {
- "node": ">=14"
- }
- },
- "node_modules/@nodelib/fs.scandir": {
- "version": "2.1.5",
- "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
- "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
- "dev": true,
- "dependencies": {
- "@nodelib/fs.stat": "2.0.5",
- "run-parallel": "^1.1.9"
- },
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/@nodelib/fs.stat": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
- "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
- "dev": true,
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/@nodelib/fs.walk": {
- "version": "1.2.8",
- "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
- "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
- "dev": true,
- "dependencies": {
- "@nodelib/fs.scandir": "2.1.5",
- "fastq": "^1.6.0"
- },
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/@octokit/auth-token": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-3.0.4.tgz",
- "integrity": "sha512-TWFX7cZF2LXoCvdmJWY7XVPi74aSY0+FfBZNSXEXFkMpjcqsQwDSYVv5FhRFaI0V1ECnwbz4j59T/G+rXNWaIQ==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": ">= 14"
- }
- },
- "node_modules/@octokit/core": {
- "version": "4.2.4",
- "resolved": "https://registry.npmjs.org/@octokit/core/-/core-4.2.4.tgz",
- "integrity": "sha512-rYKilwgzQ7/imScn3M9/pFfUf4I1AZEH3KhyJmtPdE2zfaXAn2mFfUy4FbKewzc2We5y/LlKLj36fWJLKC2SIQ==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "@octokit/auth-token": "^3.0.0",
- "@octokit/graphql": "^5.0.0",
- "@octokit/request": "^6.0.0",
- "@octokit/request-error": "^3.0.0",
- "@octokit/types": "^9.0.0",
- "before-after-hook": "^2.2.0",
- "universal-user-agent": "^6.0.0"
- },
- "engines": {
- "node": ">= 14"
- }
- },
- "node_modules/@octokit/endpoint": {
- "version": "7.0.6",
- "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-7.0.6.tgz",
- "integrity": "sha512-5L4fseVRUsDFGR00tMWD/Trdeeihn999rTMGRMC1G/Ldi1uWlWJzI98H4Iak5DB/RVvQuyMYKqSK/R6mbSOQyg==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "@octokit/types": "^9.0.0",
- "is-plain-object": "^5.0.0",
- "universal-user-agent": "^6.0.0"
- },
- "engines": {
- "node": ">= 14"
- }
- },
- "node_modules/@octokit/graphql": {
- "version": "5.0.6",
- "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-5.0.6.tgz",
- "integrity": "sha512-Fxyxdy/JH0MnIB5h+UQ3yCoh1FG4kWXfFKkpWqjZHw/p+Kc8Y44Hu/kCgNBT6nU1shNumEchmW/sUO1JuQnPcw==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "@octokit/request": "^6.0.0",
- "@octokit/types": "^9.0.0",
- "universal-user-agent": "^6.0.0"
- },
- "engines": {
- "node": ">= 14"
- }
- },
- "node_modules/@octokit/openapi-types": {
- "version": "18.1.1",
- "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-18.1.1.tgz",
- "integrity": "sha512-VRaeH8nCDtF5aXWnjPuEMIYf1itK/s3JYyJcWFJT8X9pSNnBtriDf7wlEWsGuhPLl4QIH4xM8fqTXDwJ3Mu6sw==",
- "dev": true,
- "peer": true
- },
- "node_modules/@octokit/plugin-paginate-rest": {
- "version": "6.1.2",
- "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-6.1.2.tgz",
- "integrity": "sha512-qhrmtQeHU/IivxucOV1bbI/xZyC/iOBhclokv7Sut5vnejAIAEXVcGQeRpQlU39E0WwK9lNvJHphHri/DB6lbQ==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "@octokit/tsconfig": "^1.0.2",
- "@octokit/types": "^9.2.3"
- },
- "engines": {
- "node": ">= 14"
- },
- "peerDependencies": {
- "@octokit/core": ">=4"
- }
- },
- "node_modules/@octokit/plugin-retry": {
- "version": "4.1.6",
- "resolved": "https://registry.npmjs.org/@octokit/plugin-retry/-/plugin-retry-4.1.6.tgz",
- "integrity": "sha512-obkYzIgEC75r8+9Pnfiiqy3y/x1bc3QLE5B7qvv9wi9Kj0R5tGQFC6QMBg1154WQ9lAVypuQDGyp3hNpp15gQQ==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "@octokit/types": "^9.0.0",
- "bottleneck": "^2.15.3"
- },
- "engines": {
- "node": ">= 14"
- },
- "peerDependencies": {
- "@octokit/core": ">=3"
- }
- },
- "node_modules/@octokit/plugin-throttling": {
- "version": "5.2.3",
- "resolved": "https://registry.npmjs.org/@octokit/plugin-throttling/-/plugin-throttling-5.2.3.tgz",
- "integrity": "sha512-C9CFg9mrf6cugneKiaI841iG8DOv6P5XXkjmiNNut+swePxQ7RWEdAZRp5rJoE1hjsIqiYcKa/ZkOQ+ujPI39Q==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "@octokit/types": "^9.0.0",
- "bottleneck": "^2.15.3"
- },
- "engines": {
- "node": ">= 14"
- },
- "peerDependencies": {
- "@octokit/core": "^4.0.0"
- }
- },
- "node_modules/@octokit/request": {
- "version": "6.2.8",
- "resolved": "https://registry.npmjs.org/@octokit/request/-/request-6.2.8.tgz",
- "integrity": "sha512-ow4+pkVQ+6XVVsekSYBzJC0VTVvh/FCTUUgTsboGq+DTeWdyIFV8WSCdo0RIxk6wSkBTHqIK1mYuY7nOBXOchw==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "@octokit/endpoint": "^7.0.0",
- "@octokit/request-error": "^3.0.0",
- "@octokit/types": "^9.0.0",
- "is-plain-object": "^5.0.0",
- "node-fetch": "^2.6.7",
- "universal-user-agent": "^6.0.0"
- },
- "engines": {
- "node": ">= 14"
- }
- },
- "node_modules/@octokit/request-error": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-3.0.3.tgz",
- "integrity": "sha512-crqw3V5Iy2uOU5Np+8M/YexTlT8zxCfI+qu+LxUB7SZpje4Qmx3mub5DfEKSO8Ylyk0aogi6TYdf6kxzh2BguQ==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "@octokit/types": "^9.0.0",
- "deprecation": "^2.0.0",
- "once": "^1.4.0"
- },
- "engines": {
- "node": ">= 14"
- }
- },
- "node_modules/@octokit/tsconfig": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/@octokit/tsconfig/-/tsconfig-1.0.2.tgz",
- "integrity": "sha512-I0vDR0rdtP8p2lGMzvsJzbhdOWy405HcGovrspJ8RRibHnyRgggUSNO5AIox5LmqiwmatHKYsvj6VGFHkqS7lA==",
- "dev": true,
- "peer": true
- },
- "node_modules/@octokit/types": {
- "version": "9.3.2",
- "resolved": "https://registry.npmjs.org/@octokit/types/-/types-9.3.2.tgz",
- "integrity": "sha512-D4iHGTdAnEEVsB8fl95m1hiz7D5YiRdQ9b/OEb3BYRVwbLsGHcRVPz+u+BgRLNk0Q0/4iZCBqDN96j2XNxfXrA==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "@octokit/openapi-types": "^18.0.0"
- }
- },
- "node_modules/@pnpm/config.env-replace": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/@pnpm/config.env-replace/-/config.env-replace-1.1.0.tgz",
- "integrity": "sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": ">=12.22.0"
- }
- },
- "node_modules/@pnpm/network.ca-file": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/@pnpm/network.ca-file/-/network.ca-file-1.0.2.tgz",
- "integrity": "sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "graceful-fs": "4.2.10"
- },
- "engines": {
- "node": ">=12.22.0"
- }
- },
- "node_modules/@pnpm/network.ca-file/node_modules/graceful-fs": {
- "version": "4.2.10",
- "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz",
- "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==",
- "dev": true,
- "peer": true
- },
- "node_modules/@pnpm/npm-conf": {
- "version": "2.2.2",
- "resolved": "https://registry.npmjs.org/@pnpm/npm-conf/-/npm-conf-2.2.2.tgz",
- "integrity": "sha512-UA91GwWPhFExt3IizW6bOeY/pQ0BkuNwKjk9iQW9KqxluGCrg4VenZ0/L+2Y0+ZOtme72EVvg6v0zo3AMQRCeA==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "@pnpm/config.env-replace": "^1.1.0",
- "@pnpm/network.ca-file": "^1.0.1",
- "config-chain": "^1.1.11"
- },
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@semantic-release/changelog": {
- "version": "6.0.3",
- "resolved": "https://registry.npmjs.org/@semantic-release/changelog/-/changelog-6.0.3.tgz",
- "integrity": "sha512-dZuR5qByyfe3Y03TpmCvAxCyTnp7r5XwtHRf/8vD9EAn4ZWbavUX8adMtXYzE86EVh0gyLA7lm5yW4IV30XUag==",
- "dev": true,
- "dependencies": {
- "@semantic-release/error": "^3.0.0",
- "aggregate-error": "^3.0.0",
- "fs-extra": "^11.0.0",
- "lodash": "^4.17.4"
- },
- "engines": {
- "node": ">=14.17"
- },
- "peerDependencies": {
- "semantic-release": ">=18.0.0"
- }
- },
- "node_modules/@semantic-release/commit-analyzer": {
- "version": "9.0.2",
- "resolved": "https://registry.npmjs.org/@semantic-release/commit-analyzer/-/commit-analyzer-9.0.2.tgz",
- "integrity": "sha512-E+dr6L+xIHZkX4zNMe6Rnwg4YQrWNXK+rNsvwOPpdFppvZO1olE2fIgWhv89TkQErygevbjsZFSIxp+u6w2e5g==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "conventional-changelog-angular": "^5.0.0",
- "conventional-commits-filter": "^2.0.0",
- "conventional-commits-parser": "^3.2.3",
- "debug": "^4.0.0",
- "import-from": "^4.0.0",
- "lodash": "^4.17.4",
- "micromatch": "^4.0.2"
- },
- "engines": {
- "node": ">=14.17"
- },
- "peerDependencies": {
- "semantic-release": ">=18.0.0-beta.1"
- }
- },
- "node_modules/@semantic-release/error": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/@semantic-release/error/-/error-3.0.0.tgz",
- "integrity": "sha512-5hiM4Un+tpl4cKw3lV4UgzJj+SmfNIDCLLw0TepzQxz9ZGV5ixnqkzIVF+3tp0ZHgcMKE+VNGHJjEeyFG2dcSw==",
- "dev": true,
- "engines": {
- "node": ">=14.17"
- }
- },
- "node_modules/@semantic-release/github": {
- "version": "8.1.0",
- "resolved": "https://registry.npmjs.org/@semantic-release/github/-/github-8.1.0.tgz",
- "integrity": "sha512-erR9E5rpdsz0dW1I7785JtndQuMWN/iDcemcptf67tBNOmBUN0b2YNOgcjYUnBpgRpZ5ozfBHrK7Bz+2ets/Dg==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "@octokit/core": "^4.2.1",
- "@octokit/plugin-paginate-rest": "^6.1.2",
- "@octokit/plugin-retry": "^4.1.3",
- "@octokit/plugin-throttling": "^5.2.3",
- "@semantic-release/error": "^3.0.0",
- "aggregate-error": "^3.0.0",
- "debug": "^4.0.0",
- "dir-glob": "^3.0.0",
- "fs-extra": "^11.0.0",
- "globby": "^11.0.0",
- "http-proxy-agent": "^7.0.0",
- "https-proxy-agent": "^7.0.0",
- "issue-parser": "^6.0.0",
- "lodash": "^4.17.4",
- "mime": "^3.0.0",
- "p-filter": "^2.0.0",
- "url-join": "^4.0.0"
- },
- "engines": {
- "node": ">=14.17"
- },
- "peerDependencies": {
- "semantic-release": ">=18.0.0-beta.1"
- }
- },
- "node_modules/@semantic-release/npm": {
- "version": "9.0.2",
- "resolved": "https://registry.npmjs.org/@semantic-release/npm/-/npm-9.0.2.tgz",
- "integrity": "sha512-zgsynF6McdzxPnFet+a4iO9HpAlARXOM5adz7VGVCvj0ne8wtL2ZOQoDV2wZPDmdEotDIbVeJjafhelZjs9j6g==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "@semantic-release/error": "^3.0.0",
- "aggregate-error": "^3.0.0",
- "execa": "^5.0.0",
- "fs-extra": "^11.0.0",
- "lodash": "^4.17.15",
- "nerf-dart": "^1.0.0",
- "normalize-url": "^6.0.0",
- "npm": "^8.3.0",
- "rc": "^1.2.8",
- "read-pkg": "^5.0.0",
- "registry-auth-token": "^5.0.0",
- "semver": "^7.1.2",
- "tempy": "^1.0.0"
- },
- "engines": {
- "node": ">=16 || ^14.17"
- },
- "peerDependencies": {
- "semantic-release": ">=19.0.0"
- }
- },
- "node_modules/@semantic-release/release-notes-generator": {
- "version": "10.0.3",
- "resolved": "https://registry.npmjs.org/@semantic-release/release-notes-generator/-/release-notes-generator-10.0.3.tgz",
- "integrity": "sha512-k4x4VhIKneOWoBGHkx0qZogNjCldLPRiAjnIpMnlUh6PtaWXp/T+C9U7/TaNDDtgDa5HMbHl4WlREdxHio6/3w==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "conventional-changelog-angular": "^5.0.0",
- "conventional-changelog-writer": "^5.0.0",
- "conventional-commits-filter": "^2.0.0",
- "conventional-commits-parser": "^3.2.3",
- "debug": "^4.0.0",
- "get-stream": "^6.0.0",
- "import-from": "^4.0.0",
- "into-stream": "^6.0.0",
- "lodash": "^4.17.4",
- "read-pkg-up": "^7.0.0"
- },
- "engines": {
- "node": ">=14.17"
- },
- "peerDependencies": {
- "semantic-release": ">=18.0.0-beta.1"
- }
- },
- "node_modules/@types/minimist": {
- "version": "1.2.5",
- "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.5.tgz",
- "integrity": "sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==",
- "dev": true,
- "peer": true
- },
- "node_modules/@types/normalize-package-data": {
- "version": "2.4.4",
- "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz",
- "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==",
- "dev": true
- },
- "node_modules/@types/parse-json": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz",
- "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==",
- "dev": true,
- "peer": true
- },
- "node_modules/agent-base": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.0.tgz",
- "integrity": "sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "debug": "^4.3.4"
- },
- "engines": {
- "node": ">= 14"
- }
- },
- "node_modules/aggregate-error": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz",
- "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==",
- "dev": true,
- "dependencies": {
- "clean-stack": "^2.0.0",
- "indent-string": "^4.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/ansi-escapes": {
- "version": "6.2.0",
- "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-6.2.0.tgz",
- "integrity": "sha512-kzRaCqXnpzWs+3z5ABPQiVke+iq0KXkHo8xiWV4RPTi5Yli0l97BEQuhXV1s7+aSU/fu1kUuxgS4MsQ0fRuygw==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "type-fest": "^3.0.0"
- },
- "engines": {
- "node": ">=14.16"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/ansi-regex": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
- "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/ansi-styles": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
- "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "color-convert": "^2.0.1"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
- }
- },
- "node_modules/ansicolors": {
- "version": "0.3.2",
- "resolved": "https://registry.npmjs.org/ansicolors/-/ansicolors-0.3.2.tgz",
- "integrity": "sha512-QXu7BPrP29VllRxH8GwB7x5iX5qWKAAMLqKQGWTeLWVlNHNOpVMJ91dsxQAIWXpjuW5wqvxu3Jd/nRjrJ+0pqg==",
- "dev": true,
- "peer": true
- },
- "node_modules/argv-formatter": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/argv-formatter/-/argv-formatter-1.0.0.tgz",
- "integrity": "sha512-F2+Hkm9xFaRg+GkaNnbwXNDV5O6pnCFEmqyhvfC/Ic5LbgOWjJh3L+mN/s91rxVL3znE7DYVpW0GJFT+4YBgWw==",
- "dev": true
- },
- "node_modules/array-ify": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz",
- "integrity": "sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==",
- "dev": true,
- "peer": true
- },
- "node_modules/array-union": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
- "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/arrify": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz",
- "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/balanced-match": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
- "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
- "dev": true
- },
- "node_modules/before-after-hook": {
- "version": "2.2.3",
- "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.3.tgz",
- "integrity": "sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==",
- "dev": true,
- "peer": true
- },
- "node_modules/bottleneck": {
- "version": "2.19.5",
- "resolved": "https://registry.npmjs.org/bottleneck/-/bottleneck-2.19.5.tgz",
- "integrity": "sha512-VHiNCbI1lKdl44tGrhNfU3lup0Tj/ZBMJB5/2ZbNXRCPuRCO7ed2mgcK4r17y+KB2EfuYuRaVlwNbAeaWGSpbw==",
- "dev": true,
- "peer": true
- },
- "node_modules/brace-expansion": {
- "version": "1.1.11",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
- "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
- "dev": true,
- "dependencies": {
- "balanced-match": "^1.0.0",
- "concat-map": "0.0.1"
- }
- },
- "node_modules/braces": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
- "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
- "dev": true,
- "dependencies": {
- "fill-range": "^7.0.1"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/callsites": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
- "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/camelcase": {
- "version": "5.3.1",
- "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
- "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/camelcase-keys": {
- "version": "6.2.2",
- "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz",
- "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "camelcase": "^5.3.1",
- "map-obj": "^4.0.0",
- "quick-lru": "^4.0.1"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/cardinal": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/cardinal/-/cardinal-2.1.1.tgz",
- "integrity": "sha512-JSr5eOgoEymtYHBjNWyjrMqet9Am2miJhlfKNdqLp6zoeAh0KN5dRAcxlecj5mAJrmQomgiOBj35xHLrFjqBpw==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "ansicolors": "~0.3.2",
- "redeyed": "~2.1.0"
- },
- "bin": {
- "cdl": "bin/cdl.js"
- }
- },
- "node_modules/chalk": {
- "version": "5.3.0",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz",
- "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": "^12.17.0 || ^14.13 || >=16.0.0"
- },
- "funding": {
- "url": "https://github.com/chalk/chalk?sponsor=1"
- }
- },
- "node_modules/clean-stack": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz",
- "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==",
- "dev": true,
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/cli-table3": {
- "version": "0.6.3",
- "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.3.tgz",
- "integrity": "sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "string-width": "^4.2.0"
- },
- "engines": {
- "node": "10.* || >= 12.*"
- },
- "optionalDependencies": {
- "@colors/colors": "1.5.0"
- }
- },
- "node_modules/cliui": {
- "version": "7.0.4",
- "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz",
- "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "string-width": "^4.2.0",
- "strip-ansi": "^6.0.0",
- "wrap-ansi": "^7.0.0"
- }
- },
- "node_modules/color-convert": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
- "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "color-name": "~1.1.4"
- },
- "engines": {
- "node": ">=7.0.0"
- }
- },
- "node_modules/color-name": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
- "dev": true,
- "peer": true
- },
- "node_modules/compare-func": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-2.0.0.tgz",
- "integrity": "sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "array-ify": "^1.0.0",
- "dot-prop": "^5.1.0"
- }
- },
- "node_modules/concat-map": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
- "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
- "dev": true
- },
- "node_modules/config-chain": {
- "version": "1.1.13",
- "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz",
- "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "ini": "^1.3.4",
- "proto-list": "~1.2.1"
- }
- },
- "node_modules/conventional-changelog-angular": {
- "version": "5.0.13",
- "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-5.0.13.tgz",
- "integrity": "sha512-i/gipMxs7s8L/QeuavPF2hLnJgH6pEZAttySB6aiQLWcX3puWDL3ACVmvBhJGxnAy52Qc15ua26BufY6KpmrVA==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "compare-func": "^2.0.0",
- "q": "^1.5.1"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/conventional-changelog-writer": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-5.0.1.tgz",
- "integrity": "sha512-5WsuKUfxW7suLblAbFnxAcrvf6r+0b7GvNaWUwUIk0bXMnENP/PEieGKVUQrjPqwPT4o3EPAASBXiY6iHooLOQ==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "conventional-commits-filter": "^2.0.7",
- "dateformat": "^3.0.0",
- "handlebars": "^4.7.7",
- "json-stringify-safe": "^5.0.1",
- "lodash": "^4.17.15",
- "meow": "^8.0.0",
- "semver": "^6.0.0",
- "split": "^1.0.0",
- "through2": "^4.0.0"
- },
- "bin": {
- "conventional-changelog-writer": "cli.js"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/conventional-changelog-writer/node_modules/semver": {
- "version": "6.3.1",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
- "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
- "dev": true,
- "peer": true,
- "bin": {
- "semver": "bin/semver.js"
- }
- },
- "node_modules/conventional-commits-filter": {
- "version": "2.0.7",
- "resolved": "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-2.0.7.tgz",
- "integrity": "sha512-ASS9SamOP4TbCClsRHxIHXRfcGCnIoQqkvAzCSbZzTFLfcTqJVugB0agRgsEELsqaeWgsXv513eS116wnlSSPA==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "lodash.ismatch": "^4.4.0",
- "modify-values": "^1.0.0"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/conventional-commits-parser": {
- "version": "3.2.4",
- "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-3.2.4.tgz",
- "integrity": "sha512-nK7sAtfi+QXbxHCYfhpZsfRtaitZLIA6889kFIouLvz6repszQDgxBu7wf2WbU+Dco7sAnNCJYERCwt54WPC2Q==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "is-text-path": "^1.0.1",
- "JSONStream": "^1.0.4",
- "lodash": "^4.17.15",
- "meow": "^8.0.0",
- "split2": "^3.0.0",
- "through2": "^4.0.0"
- },
- "bin": {
- "conventional-commits-parser": "cli.js"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/core-util-is": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
- "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==",
- "dev": true
- },
- "node_modules/cosmiconfig": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz",
- "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "@types/parse-json": "^4.0.0",
- "import-fresh": "^3.2.1",
- "parse-json": "^5.0.0",
- "path-type": "^4.0.0",
- "yaml": "^1.10.0"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/cross-spawn": {
- "version": "7.0.3",
- "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
- "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "path-key": "^3.1.0",
- "shebang-command": "^2.0.0",
- "which": "^2.0.1"
- },
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/crypto-random-string": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz",
- "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/dateformat": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz",
- "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": "*"
- }
- },
- "node_modules/debug": {
- "version": "4.3.4",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
- "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "ms": "2.1.2"
- },
- "engines": {
- "node": ">=6.0"
- },
- "peerDependenciesMeta": {
- "supports-color": {
- "optional": true
- }
- }
- },
- "node_modules/decamelize": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
- "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/decamelize-keys": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.1.tgz",
- "integrity": "sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "decamelize": "^1.1.0",
- "map-obj": "^1.0.0"
- },
- "engines": {
- "node": ">=0.10.0"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/decamelize-keys/node_modules/map-obj": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz",
- "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/deep-extend": {
- "version": "0.6.0",
- "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz",
- "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": ">=4.0.0"
- }
- },
- "node_modules/del": {
- "version": "6.1.1",
- "resolved": "https://registry.npmjs.org/del/-/del-6.1.1.tgz",
- "integrity": "sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg==",
- "dev": true,
- "dependencies": {
- "globby": "^11.0.1",
- "graceful-fs": "^4.2.4",
- "is-glob": "^4.0.1",
- "is-path-cwd": "^2.2.0",
- "is-path-inside": "^3.0.2",
- "p-map": "^4.0.0",
- "rimraf": "^3.0.2",
- "slash": "^3.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/del/node_modules/p-map": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz",
- "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==",
- "dev": true,
- "dependencies": {
- "aggregate-error": "^3.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/deprecation": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz",
- "integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==",
- "dev": true,
- "peer": true
- },
- "node_modules/dir-glob": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
- "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==",
- "dev": true,
- "dependencies": {
- "path-type": "^4.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/dot-prop": {
- "version": "5.3.0",
- "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz",
- "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "is-obj": "^2.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/duplexer2": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz",
- "integrity": "sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==",
- "dev": true,
- "dependencies": {
- "readable-stream": "^2.0.2"
- }
- },
- "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==",
- "dev": true,
- "peer": true
- },
- "node_modules/env-ci": {
- "version": "5.5.0",
- "resolved": "https://registry.npmjs.org/env-ci/-/env-ci-5.5.0.tgz",
- "integrity": "sha512-o0JdWIbOLP+WJKIUt36hz1ImQQFuN92nhsfTkHHap+J8CiI8WgGpH/a9jEGHh4/TU5BUUGjlnKXNoDb57+ne+A==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "execa": "^5.0.0",
- "fromentries": "^1.3.2",
- "java-properties": "^1.0.0"
- },
- "engines": {
- "node": ">=10.17"
- }
- },
- "node_modules/error-ex": {
- "version": "1.3.2",
- "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
- "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
- "dev": true,
- "dependencies": {
- "is-arrayish": "^0.2.1"
- }
- },
- "node_modules/escalade": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
- "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/escape-string-regexp": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
- "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
- "dev": true,
- "engines": {
- "node": ">=0.8.0"
- }
- },
- "node_modules/esprima": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
- "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
- "dev": true,
- "peer": true,
- "bin": {
- "esparse": "bin/esparse.js",
- "esvalidate": "bin/esvalidate.js"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/execa": {
- "version": "5.1.1",
- "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz",
- "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "cross-spawn": "^7.0.3",
- "get-stream": "^6.0.0",
- "human-signals": "^2.1.0",
- "is-stream": "^2.0.0",
- "merge-stream": "^2.0.0",
- "npm-run-path": "^4.0.1",
- "onetime": "^5.1.2",
- "signal-exit": "^3.0.3",
- "strip-final-newline": "^2.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sindresorhus/execa?sponsor=1"
- }
- },
- "node_modules/fast-glob": {
- "version": "3.3.2",
- "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz",
- "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==",
- "dev": true,
- "dependencies": {
- "@nodelib/fs.stat": "^2.0.2",
- "@nodelib/fs.walk": "^1.2.3",
- "glob-parent": "^5.1.2",
- "merge2": "^1.3.0",
- "micromatch": "^4.0.4"
- },
- "engines": {
- "node": ">=8.6.0"
- }
- },
- "node_modules/fastq": {
- "version": "1.16.0",
- "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.16.0.tgz",
- "integrity": "sha512-ifCoaXsDrsdkWTtiNJX5uzHDsrck5TzfKKDcuFFTIrrc/BS076qgEIfoIy1VeZqViznfKiysPYTh/QeHtnIsYA==",
- "dev": true,
- "dependencies": {
- "reusify": "^1.0.4"
- }
- },
- "node_modules/figures": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz",
- "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "escape-string-regexp": "^1.0.5"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/file-url": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/file-url/-/file-url-3.0.0.tgz",
- "integrity": "sha512-g872QGsHexznxkIAdK8UiZRe7SkE6kvylShU4Nsj8NvfvZag7S0QuQ4IgvPDkk75HxgjIVDwycFTDAgIiO4nDA==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/fill-range": {
- "version": "7.0.1",
- "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
- "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
- "dev": true,
- "dependencies": {
- "to-regex-range": "^5.0.1"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/find-up": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
- "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "locate-path": "^5.0.0",
- "path-exists": "^4.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/find-versions": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/find-versions/-/find-versions-4.0.0.tgz",
- "integrity": "sha512-wgpWy002tA+wgmO27buH/9KzyEOQnKsG/R0yrcjPT9BOFm0zRBVQbZ95nRGXWMywS8YR5knRbpohio0bcJABxQ==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "semver-regex": "^3.1.2"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/from2": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz",
- "integrity": "sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "inherits": "^2.0.1",
- "readable-stream": "^2.0.0"
- }
- },
- "node_modules/fromentries": {
- "version": "1.3.2",
- "resolved": "https://registry.npmjs.org/fromentries/-/fromentries-1.3.2.tgz",
- "integrity": "sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==",
- "dev": true,
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/feross"
- },
- {
- "type": "patreon",
- "url": "https://www.patreon.com/feross"
- },
- {
- "type": "consulting",
- "url": "https://feross.org/support"
- }
- ],
- "peer": true
- },
- "node_modules/fs-extra": {
- "version": "11.2.0",
- "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz",
- "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==",
- "dev": true,
- "dependencies": {
- "graceful-fs": "^4.2.0",
- "jsonfile": "^6.0.1",
- "universalify": "^2.0.0"
- },
- "engines": {
- "node": ">=14.14"
- }
- },
- "node_modules/fs.realpath": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
- "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==",
- "dev": true
- },
- "node_modules/function-bind": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
- "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
- "dev": true,
- "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==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": "6.* || 8.* || >= 10.*"
- }
- },
- "node_modules/get-stream": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
- "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==",
- "dev": true,
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/git-log-parser": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/git-log-parser/-/git-log-parser-1.2.0.tgz",
- "integrity": "sha512-rnCVNfkTL8tdNryFuaY0fYiBWEBcgF748O6ZI61rslBvr2o7U65c2/6npCRqH40vuAhtgtDiqLTJjBVdrejCzA==",
- "dev": true,
- "dependencies": {
- "argv-formatter": "~1.0.0",
- "spawn-error-forwarder": "~1.0.0",
- "split2": "~1.0.0",
- "stream-combiner2": "~1.1.1",
- "through2": "~2.0.0",
- "traverse": "~0.6.6"
- }
- },
- "node_modules/git-log-parser/node_modules/split2": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/split2/-/split2-1.0.0.tgz",
- "integrity": "sha512-NKywug4u4pX/AZBB1FCPzZ6/7O+Xhz1qMVbzTvvKvikjO99oPN87SkK08mEY9P63/5lWjK+wgOOgApnTg5r6qg==",
- "dev": true,
- "dependencies": {
- "through2": "~2.0.0"
- }
- },
- "node_modules/git-log-parser/node_modules/through2": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz",
- "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==",
- "dev": true,
- "dependencies": {
- "readable-stream": "~2.3.6",
- "xtend": "~4.0.1"
- }
- },
- "node_modules/glob": {
- "version": "7.2.3",
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
- "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
- "dev": true,
- "dependencies": {
- "fs.realpath": "^1.0.0",
- "inflight": "^1.0.4",
- "inherits": "2",
- "minimatch": "^3.1.1",
- "once": "^1.3.0",
- "path-is-absolute": "^1.0.0"
- },
- "engines": {
- "node": "*"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
- "node_modules/glob-parent": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
- "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
- "dev": true,
- "dependencies": {
- "is-glob": "^4.0.1"
- },
- "engines": {
- "node": ">= 6"
- }
- },
- "node_modules/globby": {
- "version": "11.1.0",
- "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz",
- "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==",
- "dev": true,
- "dependencies": {
- "array-union": "^2.1.0",
- "dir-glob": "^3.0.1",
- "fast-glob": "^3.2.9",
- "ignore": "^5.2.0",
- "merge2": "^1.4.1",
- "slash": "^3.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/graceful-fs": {
- "version": "4.2.11",
- "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
- "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
- "dev": true
- },
- "node_modules/handlebars": {
- "version": "4.7.8",
- "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz",
- "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "minimist": "^1.2.5",
- "neo-async": "^2.6.2",
- "source-map": "^0.6.1",
- "wordwrap": "^1.0.0"
- },
- "bin": {
- "handlebars": "bin/handlebars"
- },
- "engines": {
- "node": ">=0.4.7"
- },
- "optionalDependencies": {
- "uglify-js": "^3.1.4"
- }
- },
- "node_modules/hard-rejection": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz",
- "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/has-flag": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
- "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/hasown": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz",
- "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==",
- "dev": true,
- "dependencies": {
- "function-bind": "^1.1.2"
- },
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/hook-std": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/hook-std/-/hook-std-2.0.0.tgz",
- "integrity": "sha512-zZ6T5WcuBMIUVh49iPQS9t977t7C0l7OtHrpeMb5uk48JdflRX0NSFvCekfYNmGQETnLq9W/isMyHl69kxGi8g==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/hosted-git-info": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz",
- "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "lru-cache": "^6.0.0"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/http-proxy-agent": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.0.tgz",
- "integrity": "sha512-+ZT+iBxVUQ1asugqnD6oWoRiS25AkjNfG085dKJGtGxkdwLQrMKU5wJr2bOOFAXzKcTuqq+7fZlTMgG3SRfIYQ==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "agent-base": "^7.1.0",
- "debug": "^4.3.4"
- },
- "engines": {
- "node": ">= 14"
- }
- },
- "node_modules/https-proxy-agent": {
- "version": "7.0.2",
- "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.2.tgz",
- "integrity": "sha512-NmLNjm6ucYwtcUmL7JQC1ZQ57LmHP4lT15FQ8D61nak1rO6DH+fz5qNK2Ap5UN4ZapYICE3/0KodcLYSPsPbaA==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "agent-base": "^7.0.2",
- "debug": "4"
- },
- "engines": {
- "node": ">= 14"
- }
- },
- "node_modules/human-signals": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz",
- "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": ">=10.17.0"
- }
- },
- "node_modules/ignore": {
- "version": "5.3.0",
- "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.0.tgz",
- "integrity": "sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==",
- "dev": true,
- "engines": {
- "node": ">= 4"
- }
- },
- "node_modules/import-fresh": {
- "version": "3.3.0",
- "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
- "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "parent-module": "^1.0.0",
- "resolve-from": "^4.0.0"
- },
- "engines": {
- "node": ">=6"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/import-fresh/node_modules/resolve-from": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
- "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/import-from": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/import-from/-/import-from-4.0.0.tgz",
- "integrity": "sha512-P9J71vT5nLlDeV8FHs5nNxaLbrpfAV5cF5srvbZfpwpcJoM/xZR3hiv+q+SAnuSmuGbXMWud063iIMx/V/EWZQ==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": ">=12.2"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/indent-string": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz",
- "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/inflight": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
- "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
- "dev": true,
- "dependencies": {
- "once": "^1.3.0",
- "wrappy": "1"
- }
- },
- "node_modules/inherits": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
- "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
- "dev": true
- },
- "node_modules/ini": {
- "version": "1.3.8",
- "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz",
- "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==",
- "dev": true,
- "peer": true
- },
- "node_modules/into-stream": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/into-stream/-/into-stream-6.0.0.tgz",
- "integrity": "sha512-XHbaOAvP+uFKUFsOgoNPRjLkwB+I22JFPFe5OjTkQ0nwgj6+pSjb4NmB6VMxaPshLiOf+zcpOCBQuLwC1KHhZA==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "from2": "^2.3.0",
- "p-is-promise": "^3.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/is-arrayish": {
- "version": "0.2.1",
- "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
- "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==",
- "dev": true
- },
- "node_modules/is-core-module": {
- "version": "2.13.1",
- "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz",
- "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==",
- "dev": true,
- "dependencies": {
- "hasown": "^2.0.0"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-extglob": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
- "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/is-fullwidth-code-point": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
- "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/is-glob": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
- "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
- "dev": true,
- "dependencies": {
- "is-extglob": "^2.1.1"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/is-number": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
- "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
- "dev": true,
- "engines": {
- "node": ">=0.12.0"
- }
- },
- "node_modules/is-obj": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz",
- "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/is-path-cwd": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz",
- "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==",
- "dev": true,
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/is-path-inside": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz",
- "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/is-plain-obj": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz",
- "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/is-plain-object": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz",
- "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/is-stream": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
- "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
- "dev": true,
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/is-text-path": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-1.0.1.tgz",
- "integrity": "sha512-xFuJpne9oFz5qDaodwmmG08e3CawH/2ZV8Qqza1Ko7Sk8POWbkRdwIoAWVhqvq0XeUzANEhKo2n0IXUGBm7A/w==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "text-extensions": "^1.0.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/isarray": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
- "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==",
- "dev": true
- },
- "node_modules/isexe": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
- "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
- "dev": true
- },
- "node_modules/issue-parser": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/issue-parser/-/issue-parser-6.0.0.tgz",
- "integrity": "sha512-zKa/Dxq2lGsBIXQ7CUZWTHfvxPC2ej0KfO7fIPqLlHB9J2hJ7rGhZ5rilhuufylr4RXYPzJUeFjKxz305OsNlA==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "lodash.capitalize": "^4.2.1",
- "lodash.escaperegexp": "^4.1.2",
- "lodash.isplainobject": "^4.0.6",
- "lodash.isstring": "^4.0.1",
- "lodash.uniqby": "^4.7.0"
- },
- "engines": {
- "node": ">=10.13"
- }
- },
- "node_modules/java-properties": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/java-properties/-/java-properties-1.0.2.tgz",
- "integrity": "sha512-qjdpeo2yKlYTH7nFdK0vbZWuTCesk4o63v5iVOlhMQPfuIZQfW/HI35SjfhA+4qpg36rnFSvUK5b1m+ckIblQQ==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": ">= 0.6.0"
- }
- },
- "node_modules/js-tokens": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
- "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
- "dev": true
- },
- "node_modules/json-parse-better-errors": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz",
- "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==",
- "dev": true,
- "peer": true
- },
- "node_modules/json-parse-even-better-errors": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
- "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==",
- "dev": true
- },
- "node_modules/json-stringify-safe": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
- "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==",
- "dev": true,
- "peer": true
- },
- "node_modules/jsonfile": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz",
- "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
- "dev": true,
- "dependencies": {
- "universalify": "^2.0.0"
- },
- "optionalDependencies": {
- "graceful-fs": "^4.1.6"
- }
- },
- "node_modules/jsonparse": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz",
- "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==",
- "dev": true,
- "engines": [
- "node >= 0.2.0"
- ],
- "peer": true
- },
- "node_modules/JSONStream": {
- "version": "1.3.5",
- "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz",
- "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "jsonparse": "^1.2.0",
- "through": ">=2.2.7 <3"
- },
- "bin": {
- "JSONStream": "bin.js"
- },
- "engines": {
- "node": "*"
- }
- },
- "node_modules/kind-of": {
- "version": "6.0.3",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
- "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/lines-and-columns": {
- "version": "1.2.4",
- "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
- "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==",
- "dev": true
- },
- "node_modules/load-json-file": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz",
- "integrity": "sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "graceful-fs": "^4.1.2",
- "parse-json": "^4.0.0",
- "pify": "^3.0.0",
- "strip-bom": "^3.0.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/load-json-file/node_modules/parse-json": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz",
- "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "error-ex": "^1.3.1",
- "json-parse-better-errors": "^1.0.1"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/locate-path": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
- "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "p-locate": "^4.1.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/lodash": {
- "version": "4.17.21",
- "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
- "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
- "dev": true
- },
- "node_modules/lodash.capitalize": {
- "version": "4.2.1",
- "resolved": "https://registry.npmjs.org/lodash.capitalize/-/lodash.capitalize-4.2.1.tgz",
- "integrity": "sha512-kZzYOKspf8XVX5AvmQF94gQW0lejFVgb80G85bU4ZWzoJ6C03PQg3coYAUpSTpQWelrZELd3XWgHzw4Ck5kaIw==",
- "dev": true,
- "peer": true
- },
- "node_modules/lodash.escaperegexp": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz",
- "integrity": "sha512-TM9YBvyC84ZxE3rgfefxUWiQKLilstD6k7PTGt6wfbtXF8ixIJLOL3VYyV/z+ZiPLsVxAsKAFVwWlWeb2Y8Yyw==",
- "dev": true,
- "peer": true
- },
- "node_modules/lodash.ismatch": {
- "version": "4.4.0",
- "resolved": "https://registry.npmjs.org/lodash.ismatch/-/lodash.ismatch-4.4.0.tgz",
- "integrity": "sha512-fPMfXjGQEV9Xsq/8MTSgUf255gawYRbjwMyDbcvDhXgV7enSZA0hynz6vMPnpAb5iONEzBHBPsT+0zes5Z301g==",
- "dev": true,
- "peer": true
- },
- "node_modules/lodash.isplainobject": {
- "version": "4.0.6",
- "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz",
- "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==",
- "dev": true,
- "peer": true
- },
- "node_modules/lodash.isstring": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz",
- "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==",
- "dev": true,
- "peer": true
- },
- "node_modules/lodash.uniqby": {
- "version": "4.7.0",
- "resolved": "https://registry.npmjs.org/lodash.uniqby/-/lodash.uniqby-4.7.0.tgz",
- "integrity": "sha512-e/zcLx6CSbmaEgFHCA7BnoQKyCtKMxnuWrJygbwPs/AIn+IMKl66L8/s+wBUn5LRw2pZx3bUHibiV1b6aTWIww==",
- "dev": true,
- "peer": true
- },
- "node_modules/lru-cache": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
- "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "yallist": "^4.0.0"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/map-obj": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz",
- "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/marked": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/marked/-/marked-4.3.0.tgz",
- "integrity": "sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==",
- "dev": true,
- "peer": true,
- "bin": {
- "marked": "bin/marked.js"
- },
- "engines": {
- "node": ">= 12"
- }
- },
- "node_modules/marked-terminal": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/marked-terminal/-/marked-terminal-5.2.0.tgz",
- "integrity": "sha512-Piv6yNwAQXGFjZSaiNljyNFw7jKDdGrw70FSbtxEyldLsyeuV5ZHm/1wW++kWbrOF1VPnUgYOhB2oLL0ZpnekA==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "ansi-escapes": "^6.2.0",
- "cardinal": "^2.1.1",
- "chalk": "^5.2.0",
- "cli-table3": "^0.6.3",
- "node-emoji": "^1.11.0",
- "supports-hyperlinks": "^2.3.0"
- },
- "engines": {
- "node": ">=14.13.1 || >=16.0.0"
- },
- "peerDependencies": {
- "marked": "^1.0.0 || ^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0"
- }
- },
- "node_modules/meow": {
- "version": "8.1.2",
- "resolved": "https://registry.npmjs.org/meow/-/meow-8.1.2.tgz",
- "integrity": "sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "@types/minimist": "^1.2.0",
- "camelcase-keys": "^6.2.2",
- "decamelize-keys": "^1.1.0",
- "hard-rejection": "^2.1.0",
- "minimist-options": "4.1.0",
- "normalize-package-data": "^3.0.0",
- "read-pkg-up": "^7.0.1",
- "redent": "^3.0.0",
- "trim-newlines": "^3.0.0",
- "type-fest": "^0.18.0",
- "yargs-parser": "^20.2.3"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/meow/node_modules/type-fest": {
- "version": "0.18.1",
- "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz",
- "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/merge-stream": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
- "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==",
- "dev": true,
- "peer": true
- },
- "node_modules/merge2": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
- "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
- "dev": true,
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/micromatch": {
- "version": "4.0.5",
- "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz",
- "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==",
- "dev": true,
- "dependencies": {
- "braces": "^3.0.2",
- "picomatch": "^2.3.1"
- },
- "engines": {
- "node": ">=8.6"
- }
- },
- "node_modules/mime": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz",
- "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==",
- "dev": true,
- "peer": true,
- "bin": {
- "mime": "cli.js"
- },
- "engines": {
- "node": ">=10.0.0"
- }
- },
- "node_modules/mimic-fn": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
- "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/min-indent": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz",
- "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/minimatch": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
- "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
- "dev": true,
- "dependencies": {
- "brace-expansion": "^1.1.7"
- },
- "engines": {
- "node": "*"
- }
- },
- "node_modules/minimist": {
- "version": "1.2.8",
- "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",
- "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
- "dev": true,
- "peer": true,
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/minimist-options": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz",
- "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "arrify": "^1.0.1",
- "is-plain-obj": "^1.1.0",
- "kind-of": "^6.0.3"
- },
- "engines": {
- "node": ">= 6"
- }
- },
- "node_modules/modify-values": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/modify-values/-/modify-values-1.0.1.tgz",
- "integrity": "sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/ms": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
- "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
- "dev": true
- },
- "node_modules/neo-async": {
- "version": "2.6.2",
- "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz",
- "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==",
- "dev": true,
- "peer": true
- },
- "node_modules/nerf-dart": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/nerf-dart/-/nerf-dart-1.0.0.tgz",
- "integrity": "sha512-EZSPZB70jiVsivaBLYDCyntd5eH8NTSMOn3rB+HxwdmKThGELLdYv8qVIMWvZEFy9w8ZZpW9h9OB32l1rGtj7g==",
- "dev": true,
- "peer": true
- },
- "node_modules/node-emoji": {
- "version": "1.11.0",
- "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.11.0.tgz",
- "integrity": "sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "lodash": "^4.17.21"
- }
- },
- "node_modules/node-fetch": {
- "version": "2.7.0",
- "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz",
- "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "whatwg-url": "^5.0.0"
- },
- "engines": {
- "node": "4.x || >=6.0.0"
- },
- "peerDependencies": {
- "encoding": "^0.1.0"
- },
- "peerDependenciesMeta": {
- "encoding": {
- "optional": true
- }
- }
- },
- "node_modules/normalize-package-data": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz",
- "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "hosted-git-info": "^4.0.1",
- "is-core-module": "^2.5.0",
- "semver": "^7.3.4",
- "validate-npm-package-license": "^3.0.1"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/normalize-url": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz",
- "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/npm": {
- "version": "8.19.4",
- "resolved": "https://registry.npmjs.org/npm/-/npm-8.19.4.tgz",
- "integrity": "sha512-3HANl8i9DKnUA89P4KEgVNN28EjSeDCmvEqbzOAuxCFDzdBZzjUl99zgnGpOUumvW5lvJo2HKcjrsc+tfyv1Hw==",
- "bundleDependencies": [
- "@isaacs/string-locale-compare",
- "@npmcli/arborist",
- "@npmcli/ci-detect",
- "@npmcli/config",
- "@npmcli/fs",
- "@npmcli/map-workspaces",
- "@npmcli/package-json",
- "@npmcli/run-script",
- "abbrev",
- "archy",
- "cacache",
- "chalk",
- "chownr",
- "cli-columns",
- "cli-table3",
- "columnify",
- "fastest-levenshtein",
- "fs-minipass",
- "glob",
- "graceful-fs",
- "hosted-git-info",
- "ini",
- "init-package-json",
- "is-cidr",
- "json-parse-even-better-errors",
- "libnpmaccess",
- "libnpmdiff",
- "libnpmexec",
- "libnpmfund",
- "libnpmhook",
- "libnpmorg",
- "libnpmpack",
- "libnpmpublish",
- "libnpmsearch",
- "libnpmteam",
- "libnpmversion",
- "make-fetch-happen",
- "minimatch",
- "minipass",
- "minipass-pipeline",
- "mkdirp",
- "mkdirp-infer-owner",
- "ms",
- "node-gyp",
- "nopt",
- "npm-audit-report",
- "npm-install-checks",
- "npm-package-arg",
- "npm-pick-manifest",
- "npm-profile",
- "npm-registry-fetch",
- "npm-user-validate",
- "npmlog",
- "opener",
- "p-map",
- "pacote",
- "parse-conflict-json",
- "proc-log",
- "qrcode-terminal",
- "read",
- "read-package-json",
- "read-package-json-fast",
- "readdir-scoped-modules",
- "rimraf",
- "semver",
- "ssri",
- "tar",
- "text-table",
- "tiny-relative-date",
- "treeverse",
- "validate-npm-package-name",
- "which",
- "write-file-atomic"
- ],
- "dev": true,
- "peer": true,
- "dependencies": {
- "@isaacs/string-locale-compare": "^1.1.0",
- "@npmcli/arborist": "^5.6.3",
- "@npmcli/ci-detect": "^2.0.0",
- "@npmcli/config": "^4.2.1",
- "@npmcli/fs": "^2.1.0",
- "@npmcli/map-workspaces": "^2.0.3",
- "@npmcli/package-json": "^2.0.0",
- "@npmcli/run-script": "^4.2.1",
- "abbrev": "~1.1.1",
- "archy": "~1.0.0",
- "cacache": "^16.1.3",
- "chalk": "^4.1.2",
- "chownr": "^2.0.0",
- "cli-columns": "^4.0.0",
- "cli-table3": "^0.6.2",
- "columnify": "^1.6.0",
- "fastest-levenshtein": "^1.0.12",
- "fs-minipass": "^2.1.0",
- "glob": "^8.0.1",
- "graceful-fs": "^4.2.10",
- "hosted-git-info": "^5.2.1",
- "ini": "^3.0.1",
- "init-package-json": "^3.0.2",
- "is-cidr": "^4.0.2",
- "json-parse-even-better-errors": "^2.3.1",
- "libnpmaccess": "^6.0.4",
- "libnpmdiff": "^4.0.5",
- "libnpmexec": "^4.0.14",
- "libnpmfund": "^3.0.5",
- "libnpmhook": "^8.0.4",
- "libnpmorg": "^4.0.4",
- "libnpmpack": "^4.1.3",
- "libnpmpublish": "^6.0.5",
- "libnpmsearch": "^5.0.4",
- "libnpmteam": "^4.0.4",
- "libnpmversion": "^3.0.7",
- "make-fetch-happen": "^10.2.0",
- "minimatch": "^5.1.0",
- "minipass": "^3.1.6",
- "minipass-pipeline": "^1.2.4",
- "mkdirp": "^1.0.4",
- "mkdirp-infer-owner": "^2.0.0",
- "ms": "^2.1.2",
- "node-gyp": "^9.1.0",
- "nopt": "^6.0.0",
- "npm-audit-report": "^3.0.0",
- "npm-install-checks": "^5.0.0",
- "npm-package-arg": "^9.1.0",
- "npm-pick-manifest": "^7.0.2",
- "npm-profile": "^6.2.0",
- "npm-registry-fetch": "^13.3.1",
- "npm-user-validate": "^1.0.1",
- "npmlog": "^6.0.2",
- "opener": "^1.5.2",
- "p-map": "^4.0.0",
- "pacote": "^13.6.2",
- "parse-conflict-json": "^2.0.2",
- "proc-log": "^2.0.1",
- "qrcode-terminal": "^0.12.0",
- "read": "~1.0.7",
- "read-package-json": "^5.0.2",
- "read-package-json-fast": "^2.0.3",
- "readdir-scoped-modules": "^1.1.0",
- "rimraf": "^3.0.2",
- "semver": "^7.3.7",
- "ssri": "^9.0.1",
- "tar": "^6.1.11",
- "text-table": "~0.2.0",
- "tiny-relative-date": "^1.3.0",
- "treeverse": "^2.0.0",
- "validate-npm-package-name": "^4.0.0",
- "which": "^2.0.2",
- "write-file-atomic": "^4.0.1"
- },
- "bin": {
- "npm": "bin/npm-cli.js",
- "npx": "bin/npx-cli.js"
- },
- "engines": {
- "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
- }
- },
- "node_modules/npm-run-path": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz",
- "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "path-key": "^3.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/npm/node_modules/@colors/colors": {
- "version": "1.5.0",
- "dev": true,
- "inBundle": true,
- "license": "MIT",
- "optional": true,
- "peer": true,
- "engines": {
- "node": ">=0.1.90"
- }
- },
- "node_modules/npm/node_modules/@gar/promisify": {
- "version": "1.1.3",
- "dev": true,
- "inBundle": true,
- "license": "MIT",
- "peer": true
- },
- "node_modules/npm/node_modules/@isaacs/string-locale-compare": {
- "version": "1.1.0",
- "dev": true,
- "inBundle": true,
- "license": "ISC",
- "peer": true
- },
- "node_modules/npm/node_modules/@npmcli/arborist": {
- "version": "5.6.3",
- "dev": true,
- "inBundle": true,
- "license": "ISC",
- "peer": true,
- "dependencies": {
- "@isaacs/string-locale-compare": "^1.1.0",
- "@npmcli/installed-package-contents": "^1.0.7",
- "@npmcli/map-workspaces": "^2.0.3",
- "@npmcli/metavuln-calculator": "^3.0.1",
- "@npmcli/move-file": "^2.0.0",
- "@npmcli/name-from-folder": "^1.0.1",
- "@npmcli/node-gyp": "^2.0.0",
- "@npmcli/package-json": "^2.0.0",
- "@npmcli/query": "^1.2.0",
- "@npmcli/run-script": "^4.1.3",
- "bin-links": "^3.0.3",
- "cacache": "^16.1.3",
- "common-ancestor-path": "^1.0.1",
- "hosted-git-info": "^5.2.1",
- "json-parse-even-better-errors": "^2.3.1",
- "json-stringify-nice": "^1.1.4",
- "minimatch": "^5.1.0",
- "mkdirp": "^1.0.4",
- "mkdirp-infer-owner": "^2.0.0",
- "nopt": "^6.0.0",
- "npm-install-checks": "^5.0.0",
- "npm-package-arg": "^9.0.0",
- "npm-pick-manifest": "^7.0.2",
- "npm-registry-fetch": "^13.0.0",
- "npmlog": "^6.0.2",
- "pacote": "^13.6.1",
- "parse-conflict-json": "^2.0.1",
- "proc-log": "^2.0.0",
- "promise-all-reject-late": "^1.0.0",
- "promise-call-limit": "^1.0.1",
- "read-package-json-fast": "^2.0.2",
- "readdir-scoped-modules": "^1.1.0",
- "rimraf": "^3.0.2",
- "semver": "^7.3.7",
- "ssri": "^9.0.0",
- "treeverse": "^2.0.0",
- "walk-up-path": "^1.0.0"
- },
- "bin": {
- "arborist": "bin/index.js"
- },
- "engines": {
- "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
- }
- },
- "node_modules/npm/node_modules/@npmcli/ci-detect": {
- "version": "2.0.0",
- "dev": true,
- "inBundle": true,
- "license": "ISC",
- "peer": true,
- "engines": {
- "node": "^12.13.0 || ^14.15.0 || >=16"
- }
- },
- "node_modules/npm/node_modules/@npmcli/config": {
- "version": "4.2.2",
- "dev": true,
- "inBundle": true,
- "license": "ISC",
- "peer": true,
- "dependencies": {
- "@npmcli/map-workspaces": "^2.0.2",
- "ini": "^3.0.0",
- "mkdirp-infer-owner": "^2.0.0",
- "nopt": "^6.0.0",
- "proc-log": "^2.0.0",
- "read-package-json-fast": "^2.0.3",
- "semver": "^7.3.5",
- "walk-up-path": "^1.0.0"
- },
- "engines": {
- "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
- }
- },
- "node_modules/npm/node_modules/@npmcli/disparity-colors": {
- "version": "2.0.0",
- "dev": true,
- "inBundle": true,
- "license": "ISC",
- "peer": true,
- "dependencies": {
- "ansi-styles": "^4.3.0"
- },
- "engines": {
- "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
- }
- },
- "node_modules/npm/node_modules/@npmcli/fs": {
- "version": "2.1.2",
- "dev": true,
- "inBundle": true,
- "license": "ISC",
- "peer": true,
- "dependencies": {
- "@gar/promisify": "^1.1.3",
- "semver": "^7.3.5"
- },
- "engines": {
- "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
- }
- },
- "node_modules/npm/node_modules/@npmcli/git": {
- "version": "3.0.2",
- "dev": true,
- "inBundle": true,
- "license": "ISC",
- "peer": true,
- "dependencies": {
- "@npmcli/promise-spawn": "^3.0.0",
- "lru-cache": "^7.4.4",
- "mkdirp": "^1.0.4",
- "npm-pick-manifest": "^7.0.0",
- "proc-log": "^2.0.0",
- "promise-inflight": "^1.0.1",
- "promise-retry": "^2.0.1",
- "semver": "^7.3.5",
- "which": "^2.0.2"
- },
- "engines": {
- "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
- }
- },
- "node_modules/npm/node_modules/@npmcli/installed-package-contents": {
- "version": "1.0.7",
- "dev": true,
- "inBundle": true,
- "license": "ISC",
- "peer": true,
- "dependencies": {
- "npm-bundled": "^1.1.1",
- "npm-normalize-package-bin": "^1.0.1"
- },
- "bin": {
- "installed-package-contents": "index.js"
- },
- "engines": {
- "node": ">= 10"
- }
- },
- "node_modules/npm/node_modules/@npmcli/installed-package-contents/node_modules/npm-bundled": {
- "version": "1.1.2",
- "dev": true,
- "inBundle": true,
- "license": "ISC",
- "peer": true,
- "dependencies": {
- "npm-normalize-package-bin": "^1.0.1"
- }
- },
- "node_modules/npm/node_modules/@npmcli/map-workspaces": {
- "version": "2.0.4",
- "dev": true,
- "inBundle": true,
- "license": "ISC",
- "peer": true,
- "dependencies": {
- "@npmcli/name-from-folder": "^1.0.1",
- "glob": "^8.0.1",
- "minimatch": "^5.0.1",
- "read-package-json-fast": "^2.0.3"
- },
- "engines": {
- "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
- }
- },
- "node_modules/npm/node_modules/@npmcli/metavuln-calculator": {
- "version": "3.1.1",
- "dev": true,
- "inBundle": true,
- "license": "ISC",
- "peer": true,
- "dependencies": {
- "cacache": "^16.0.0",
- "json-parse-even-better-errors": "^2.3.1",
- "pacote": "^13.0.3",
- "semver": "^7.3.5"
- },
- "engines": {
- "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
- }
- },
- "node_modules/npm/node_modules/@npmcli/move-file": {
- "version": "2.0.1",
- "dev": true,
- "inBundle": true,
- "license": "MIT",
- "peer": true,
- "dependencies": {
- "mkdirp": "^1.0.4",
- "rimraf": "^3.0.2"
- },
- "engines": {
- "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
- }
- },
- "node_modules/npm/node_modules/@npmcli/name-from-folder": {
- "version": "1.0.1",
- "dev": true,
- "inBundle": true,
- "license": "ISC",
- "peer": true
- },
- "node_modules/npm/node_modules/@npmcli/node-gyp": {
- "version": "2.0.0",
- "dev": true,
- "inBundle": true,
- "license": "ISC",
- "peer": true,
- "engines": {
- "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
- }
- },
- "node_modules/npm/node_modules/@npmcli/package-json": {
- "version": "2.0.0",
- "dev": true,
- "inBundle": true,
- "license": "ISC",
- "peer": true,
- "dependencies": {
- "json-parse-even-better-errors": "^2.3.1"
- },
- "engines": {
- "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
- }
- },
- "node_modules/npm/node_modules/@npmcli/promise-spawn": {
- "version": "3.0.0",
- "dev": true,
- "inBundle": true,
- "license": "ISC",
- "peer": true,
- "dependencies": {
- "infer-owner": "^1.0.4"
- },
- "engines": {
- "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
- }
- },
- "node_modules/npm/node_modules/@npmcli/query": {
- "version": "1.2.0",
- "dev": true,
- "inBundle": true,
- "license": "ISC",
- "peer": true,
- "dependencies": {
- "npm-package-arg": "^9.1.0",
- "postcss-selector-parser": "^6.0.10",
- "semver": "^7.3.7"
- },
- "engines": {
- "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
- }
- },
- "node_modules/npm/node_modules/@npmcli/run-script": {
- "version": "4.2.1",
- "dev": true,
- "inBundle": true,
- "license": "ISC",
- "peer": true,
- "dependencies": {
- "@npmcli/node-gyp": "^2.0.0",
- "@npmcli/promise-spawn": "^3.0.0",
- "node-gyp": "^9.0.0",
- "read-package-json-fast": "^2.0.3",
- "which": "^2.0.2"
- },
- "engines": {
- "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
- }
- },
- "node_modules/npm/node_modules/@tootallnate/once": {
- "version": "2.0.0",
- "dev": true,
- "inBundle": true,
- "license": "MIT",
- "peer": true,
- "engines": {
- "node": ">= 10"
- }
- },
- "node_modules/npm/node_modules/abbrev": {
- "version": "1.1.1",
- "dev": true,
- "inBundle": true,
- "license": "ISC",
- "peer": true
- },
- "node_modules/npm/node_modules/agent-base": {
- "version": "6.0.2",
- "dev": true,
- "inBundle": true,
- "license": "MIT",
- "peer": true,
- "dependencies": {
- "debug": "4"
- },
- "engines": {
- "node": ">= 6.0.0"
- }
- },
- "node_modules/npm/node_modules/agentkeepalive": {
- "version": "4.2.1",
- "dev": true,
- "inBundle": true,
- "license": "MIT",
- "peer": true,
- "dependencies": {
- "debug": "^4.1.0",
- "depd": "^1.1.2",
- "humanize-ms": "^1.2.1"
- },
- "engines": {
- "node": ">= 8.0.0"
- }
- },
- "node_modules/npm/node_modules/aggregate-error": {
- "version": "3.1.0",
- "dev": true,
- "inBundle": true,
- "license": "MIT",
- "peer": true,
- "dependencies": {
- "clean-stack": "^2.0.0",
- "indent-string": "^4.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/npm/node_modules/ansi-regex": {
- "version": "5.0.1",
- "dev": true,
- "inBundle": true,
- "license": "MIT",
- "peer": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/npm/node_modules/ansi-styles": {
- "version": "4.3.0",
- "dev": true,
- "inBundle": true,
- "license": "MIT",
- "peer": true,
- "dependencies": {
- "color-convert": "^2.0.1"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
- }
- },
- "node_modules/npm/node_modules/aproba": {
- "version": "2.0.0",
- "dev": true,
- "inBundle": true,
- "license": "ISC",
- "peer": true
- },
- "node_modules/npm/node_modules/archy": {
- "version": "1.0.0",
- "dev": true,
- "inBundle": true,
- "license": "MIT",
- "peer": true
- },
- "node_modules/npm/node_modules/are-we-there-yet": {
- "version": "3.0.1",
- "dev": true,
- "inBundle": true,
- "license": "ISC",
- "peer": true,
- "dependencies": {
- "delegates": "^1.0.0",
- "readable-stream": "^3.6.0"
- },
- "engines": {
- "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
- }
- },
- "node_modules/npm/node_modules/asap": {
- "version": "2.0.6",
- "dev": true,
- "inBundle": true,
- "license": "MIT",
- "peer": true
- },
- "node_modules/npm/node_modules/balanced-match": {
- "version": "1.0.2",
- "dev": true,
- "inBundle": true,
- "license": "MIT",
- "peer": true
- },
- "node_modules/npm/node_modules/bin-links": {
- "version": "3.0.3",
- "dev": true,
- "inBundle": true,
- "license": "ISC",
- "peer": true,
- "dependencies": {
- "cmd-shim": "^5.0.0",
- "mkdirp-infer-owner": "^2.0.0",
- "npm-normalize-package-bin": "^2.0.0",
- "read-cmd-shim": "^3.0.0",
- "rimraf": "^3.0.0",
- "write-file-atomic": "^4.0.0"
- },
- "engines": {
- "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
- }
- },
- "node_modules/npm/node_modules/bin-links/node_modules/npm-normalize-package-bin": {
- "version": "2.0.0",
- "dev": true,
- "inBundle": true,
- "license": "ISC",
- "peer": true,
- "engines": {
- "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
- }
- },
- "node_modules/npm/node_modules/binary-extensions": {
- "version": "2.2.0",
- "dev": true,
- "inBundle": true,
- "license": "MIT",
- "peer": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/npm/node_modules/brace-expansion": {
- "version": "2.0.1",
- "dev": true,
- "inBundle": true,
- "license": "MIT",
- "peer": true,
- "dependencies": {
- "balanced-match": "^1.0.0"
- }
- },
- "node_modules/npm/node_modules/builtins": {
- "version": "5.0.1",
- "dev": true,
- "inBundle": true,
- "license": "MIT",
- "peer": true,
- "dependencies": {
- "semver": "^7.0.0"
- }
- },
- "node_modules/npm/node_modules/cacache": {
- "version": "16.1.3",
- "dev": true,
- "inBundle": true,
- "license": "ISC",
- "peer": true,
- "dependencies": {
- "@npmcli/fs": "^2.1.0",
- "@npmcli/move-file": "^2.0.0",
- "chownr": "^2.0.0",
- "fs-minipass": "^2.1.0",
- "glob": "^8.0.1",
- "infer-owner": "^1.0.4",
- "lru-cache": "^7.7.1",
- "minipass": "^3.1.6",
- "minipass-collect": "^1.0.2",
- "minipass-flush": "^1.0.5",
- "minipass-pipeline": "^1.2.4",
- "mkdirp": "^1.0.4",
- "p-map": "^4.0.0",
- "promise-inflight": "^1.0.1",
- "rimraf": "^3.0.2",
- "ssri": "^9.0.0",
- "tar": "^6.1.11",
- "unique-filename": "^2.0.0"
- },
- "engines": {
- "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
- }
- },
- "node_modules/npm/node_modules/chalk": {
- "version": "4.1.2",
- "dev": true,
- "inBundle": true,
- "license": "MIT",
- "peer": true,
- "dependencies": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/chalk?sponsor=1"
- }
- },
- "node_modules/npm/node_modules/chownr": {
- "version": "2.0.0",
- "dev": true,
- "inBundle": true,
- "license": "ISC",
- "peer": true,
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/npm/node_modules/cidr-regex": {
- "version": "3.1.1",
- "dev": true,
- "inBundle": true,
- "license": "BSD-2-Clause",
- "peer": true,
- "dependencies": {
- "ip-regex": "^4.1.0"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/npm/node_modules/clean-stack": {
- "version": "2.2.0",
- "dev": true,
- "inBundle": true,
- "license": "MIT",
- "peer": true,
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/npm/node_modules/cli-columns": {
- "version": "4.0.0",
- "dev": true,
- "inBundle": true,
- "license": "MIT",
- "peer": true,
- "dependencies": {
- "string-width": "^4.2.3",
- "strip-ansi": "^6.0.1"
- },
- "engines": {
- "node": ">= 10"
- }
- },
- "node_modules/npm/node_modules/cli-table3": {
- "version": "0.6.2",
- "dev": true,
- "inBundle": true,
- "license": "MIT",
- "peer": true,
- "dependencies": {
- "string-width": "^4.2.0"
- },
- "engines": {
- "node": "10.* || >= 12.*"
- },
- "optionalDependencies": {
- "@colors/colors": "1.5.0"
- }
- },
- "node_modules/npm/node_modules/clone": {
- "version": "1.0.4",
- "dev": true,
- "inBundle": true,
- "license": "MIT",
- "peer": true,
- "engines": {
- "node": ">=0.8"
- }
- },
- "node_modules/npm/node_modules/cmd-shim": {
- "version": "5.0.0",
- "dev": true,
- "inBundle": true,
- "license": "ISC",
- "peer": true,
- "dependencies": {
- "mkdirp-infer-owner": "^2.0.0"
- },
- "engines": {
- "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
- }
- },
- "node_modules/npm/node_modules/color-convert": {
- "version": "2.0.1",
- "dev": true,
- "inBundle": true,
- "license": "MIT",
- "peer": true,
- "dependencies": {
- "color-name": "~1.1.4"
- },
- "engines": {
- "node": ">=7.0.0"
- }
- },
- "node_modules/npm/node_modules/color-name": {
- "version": "1.1.4",
- "dev": true,
- "inBundle": true,
- "license": "MIT",
- "peer": true
- },
- "node_modules/npm/node_modules/color-support": {
- "version": "1.1.3",
- "dev": true,
- "inBundle": true,
- "license": "ISC",
- "peer": true,
- "bin": {
- "color-support": "bin.js"
- }
- },
- "node_modules/npm/node_modules/columnify": {
- "version": "1.6.0",
- "dev": true,
- "inBundle": true,
- "license": "MIT",
- "peer": true,
- "dependencies": {
- "strip-ansi": "^6.0.1",
- "wcwidth": "^1.0.0"
- },
- "engines": {
- "node": ">=8.0.0"
- }
- },
- "node_modules/npm/node_modules/common-ancestor-path": {
- "version": "1.0.1",
- "dev": true,
- "inBundle": true,
- "license": "ISC",
- "peer": true
- },
- "node_modules/npm/node_modules/concat-map": {
- "version": "0.0.1",
- "dev": true,
- "inBundle": true,
- "license": "MIT",
- "peer": true
- },
- "node_modules/npm/node_modules/console-control-strings": {
- "version": "1.1.0",
- "dev": true,
- "inBundle": true,
- "license": "ISC",
- "peer": true
- },
- "node_modules/npm/node_modules/cssesc": {
- "version": "3.0.0",
- "dev": true,
- "inBundle": true,
- "license": "MIT",
- "peer": true,
- "bin": {
- "cssesc": "bin/cssesc"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/npm/node_modules/debug": {
- "version": "4.3.4",
- "dev": true,
- "inBundle": true,
- "license": "MIT",
- "peer": true,
- "dependencies": {
- "ms": "2.1.2"
- },
- "engines": {
- "node": ">=6.0"
- },
- "peerDependenciesMeta": {
- "supports-color": {
- "optional": true
- }
- }
- },
- "node_modules/npm/node_modules/debug/node_modules/ms": {
- "version": "2.1.2",
- "dev": true,
- "inBundle": true,
- "license": "MIT",
- "peer": true
- },
- "node_modules/npm/node_modules/debuglog": {
- "version": "1.0.1",
- "dev": true,
- "inBundle": true,
- "license": "MIT",
- "peer": true,
- "engines": {
- "node": "*"
- }
- },
- "node_modules/npm/node_modules/defaults": {
- "version": "1.0.3",
- "dev": true,
- "inBundle": true,
- "license": "MIT",
- "peer": true,
- "dependencies": {
- "clone": "^1.0.2"
- }
- },
- "node_modules/npm/node_modules/delegates": {
- "version": "1.0.0",
- "dev": true,
- "inBundle": true,
- "license": "MIT",
- "peer": true
- },
- "node_modules/npm/node_modules/depd": {
- "version": "1.1.2",
- "dev": true,
- "inBundle": true,
- "license": "MIT",
- "peer": true,
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/npm/node_modules/dezalgo": {
- "version": "1.0.4",
- "dev": true,
- "inBundle": true,
- "license": "ISC",
- "peer": true,
- "dependencies": {
- "asap": "^2.0.0",
- "wrappy": "1"
- }
- },
- "node_modules/npm/node_modules/diff": {
- "version": "5.1.0",
- "dev": true,
- "inBundle": true,
- "license": "BSD-3-Clause",
- "peer": true,
- "engines": {
- "node": ">=0.3.1"
- }
- },
- "node_modules/npm/node_modules/emoji-regex": {
- "version": "8.0.0",
- "dev": true,
- "inBundle": true,
- "license": "MIT",
- "peer": true
- },
- "node_modules/npm/node_modules/encoding": {
- "version": "0.1.13",
- "dev": true,
- "inBundle": true,
- "license": "MIT",
- "optional": true,
- "peer": true,
- "dependencies": {
- "iconv-lite": "^0.6.2"
- }
- },
- "node_modules/npm/node_modules/env-paths": {
- "version": "2.2.1",
- "dev": true,
- "inBundle": true,
- "license": "MIT",
- "peer": true,
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/npm/node_modules/err-code": {
- "version": "2.0.3",
- "dev": true,
- "inBundle": true,
- "license": "MIT",
- "peer": true
- },
- "node_modules/npm/node_modules/fastest-levenshtein": {
- "version": "1.0.12",
- "dev": true,
- "inBundle": true,
- "license": "MIT",
- "peer": true
- },
- "node_modules/npm/node_modules/fs-minipass": {
- "version": "2.1.0",
- "dev": true,
- "inBundle": true,
- "license": "ISC",
- "peer": true,
- "dependencies": {
- "minipass": "^3.0.0"
- },
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/npm/node_modules/fs.realpath": {
- "version": "1.0.0",
- "dev": true,
- "inBundle": true,
- "license": "ISC",
- "peer": true
- },
- "node_modules/npm/node_modules/function-bind": {
- "version": "1.1.1",
- "dev": true,
- "inBundle": true,
- "license": "MIT",
- "peer": true
- },
- "node_modules/npm/node_modules/gauge": {
- "version": "4.0.4",
- "dev": true,
- "inBundle": true,
- "license": "ISC",
- "peer": true,
- "dependencies": {
- "aproba": "^1.0.3 || ^2.0.0",
- "color-support": "^1.1.3",
- "console-control-strings": "^1.1.0",
- "has-unicode": "^2.0.1",
- "signal-exit": "^3.0.7",
- "string-width": "^4.2.3",
- "strip-ansi": "^6.0.1",
- "wide-align": "^1.1.5"
- },
- "engines": {
- "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
- }
- },
- "node_modules/npm/node_modules/glob": {
- "version": "8.0.3",
- "dev": true,
- "inBundle": true,
- "license": "ISC",
- "peer": true,
- "dependencies": {
- "fs.realpath": "^1.0.0",
- "inflight": "^1.0.4",
- "inherits": "2",
- "minimatch": "^5.0.1",
- "once": "^1.3.0"
- },
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
- "node_modules/npm/node_modules/graceful-fs": {
- "version": "4.2.10",
- "dev": true,
- "inBundle": true,
- "license": "ISC",
- "peer": true
- },
- "node_modules/npm/node_modules/has": {
- "version": "1.0.3",
- "dev": true,
- "inBundle": true,
- "license": "MIT",
- "peer": true,
- "dependencies": {
- "function-bind": "^1.1.1"
- },
- "engines": {
- "node": ">= 0.4.0"
- }
- },
- "node_modules/npm/node_modules/has-flag": {
- "version": "4.0.0",
- "dev": true,
- "inBundle": true,
- "license": "MIT",
- "peer": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/npm/node_modules/has-unicode": {
- "version": "2.0.1",
- "dev": true,
- "inBundle": true,
- "license": "ISC",
- "peer": true
- },
- "node_modules/npm/node_modules/hosted-git-info": {
- "version": "5.2.1",
- "dev": true,
- "inBundle": true,
- "license": "ISC",
- "peer": true,
- "dependencies": {
- "lru-cache": "^7.5.1"
- },
- "engines": {
- "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
- }
- },
- "node_modules/npm/node_modules/http-cache-semantics": {
- "version": "4.1.1",
- "dev": true,
- "inBundle": true,
- "license": "BSD-2-Clause",
- "peer": true
- },
- "node_modules/npm/node_modules/http-proxy-agent": {
- "version": "5.0.0",
- "dev": true,
- "inBundle": true,
- "license": "MIT",
- "peer": true,
- "dependencies": {
- "@tootallnate/once": "2",
- "agent-base": "6",
- "debug": "4"
- },
- "engines": {
- "node": ">= 6"
- }
- },
- "node_modules/npm/node_modules/https-proxy-agent": {
- "version": "5.0.1",
- "dev": true,
- "inBundle": true,
- "license": "MIT",
- "peer": true,
- "dependencies": {
- "agent-base": "6",
- "debug": "4"
- },
- "engines": {
- "node": ">= 6"
- }
- },
- "node_modules/npm/node_modules/humanize-ms": {
- "version": "1.2.1",
- "dev": true,
- "inBundle": true,
- "license": "MIT",
- "peer": true,
- "dependencies": {
- "ms": "^2.0.0"
- }
- },
- "node_modules/npm/node_modules/iconv-lite": {
- "version": "0.6.3",
- "dev": true,
- "inBundle": true,
- "license": "MIT",
- "optional": true,
- "peer": true,
- "dependencies": {
- "safer-buffer": ">= 2.1.2 < 3.0.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/npm/node_modules/ignore-walk": {
- "version": "5.0.1",
- "dev": true,
- "inBundle": true,
- "license": "ISC",
- "peer": true,
- "dependencies": {
- "minimatch": "^5.0.1"
- },
- "engines": {
- "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
- }
- },
- "node_modules/npm/node_modules/imurmurhash": {
- "version": "0.1.4",
- "dev": true,
- "inBundle": true,
- "license": "MIT",
- "peer": true,
- "engines": {
- "node": ">=0.8.19"
- }
- },
- "node_modules/npm/node_modules/indent-string": {
- "version": "4.0.0",
- "dev": true,
- "inBundle": true,
- "license": "MIT",
- "peer": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/npm/node_modules/infer-owner": {
- "version": "1.0.4",
- "dev": true,
- "inBundle": true,
- "license": "ISC",
- "peer": true
- },
- "node_modules/npm/node_modules/inflight": {
- "version": "1.0.6",
- "dev": true,
- "inBundle": true,
- "license": "ISC",
- "peer": true,
- "dependencies": {
- "once": "^1.3.0",
- "wrappy": "1"
- }
- },
- "node_modules/npm/node_modules/inherits": {
- "version": "2.0.4",
- "dev": true,
- "inBundle": true,
- "license": "ISC",
- "peer": true
- },
- "node_modules/npm/node_modules/ini": {
- "version": "3.0.1",
- "dev": true,
- "inBundle": true,
- "license": "ISC",
- "peer": true,
- "engines": {
- "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
- }
- },
- "node_modules/npm/node_modules/init-package-json": {
- "version": "3.0.2",
- "dev": true,
- "inBundle": true,
- "license": "ISC",
- "peer": true,
- "dependencies": {
- "npm-package-arg": "^9.0.1",
- "promzard": "^0.3.0",
- "read": "^1.0.7",
- "read-package-json": "^5.0.0",
- "semver": "^7.3.5",
- "validate-npm-package-license": "^3.0.4",
- "validate-npm-package-name": "^4.0.0"
- },
- "engines": {
- "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
- }
- },
- "node_modules/npm/node_modules/ip": {
- "version": "2.0.0",
- "dev": true,
- "inBundle": true,
- "license": "MIT",
- "peer": true
- },
- "node_modules/npm/node_modules/ip-regex": {
- "version": "4.3.0",
- "dev": true,
- "inBundle": true,
- "license": "MIT",
- "peer": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/npm/node_modules/is-cidr": {
- "version": "4.0.2",
- "dev": true,
- "inBundle": true,
- "license": "BSD-2-Clause",
- "peer": true,
- "dependencies": {
- "cidr-regex": "^3.1.1"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/npm/node_modules/is-core-module": {
- "version": "2.10.0",
- "dev": true,
- "inBundle": true,
- "license": "MIT",
- "peer": true,
- "dependencies": {
- "has": "^1.0.3"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/npm/node_modules/is-fullwidth-code-point": {
- "version": "3.0.0",
- "dev": true,
- "inBundle": true,
- "license": "MIT",
- "peer": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/npm/node_modules/is-lambda": {
- "version": "1.0.1",
- "dev": true,
- "inBundle": true,
- "license": "MIT",
- "peer": true
- },
- "node_modules/npm/node_modules/isexe": {
- "version": "2.0.0",
- "dev": true,
- "inBundle": true,
- "license": "ISC",
- "peer": true
- },
- "node_modules/npm/node_modules/json-parse-even-better-errors": {
- "version": "2.3.1",
- "dev": true,
- "inBundle": true,
- "license": "MIT",
- "peer": true
- },
- "node_modules/npm/node_modules/json-stringify-nice": {
- "version": "1.1.4",
- "dev": true,
- "inBundle": true,
- "license": "ISC",
- "peer": true,
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
- "node_modules/npm/node_modules/jsonparse": {
- "version": "1.3.1",
- "dev": true,
- "engines": [
- "node >= 0.2.0"
- ],
- "inBundle": true,
- "license": "MIT",
- "peer": true
- },
- "node_modules/npm/node_modules/just-diff": {
- "version": "5.1.1",
- "dev": true,
- "inBundle": true,
- "license": "MIT",
- "peer": true
- },
- "node_modules/npm/node_modules/just-diff-apply": {
- "version": "5.4.1",
- "dev": true,
- "inBundle": true,
- "license": "MIT",
- "peer": true
- },
- "node_modules/npm/node_modules/libnpmaccess": {
- "version": "6.0.4",
- "dev": true,
- "inBundle": true,
- "license": "ISC",
- "peer": true,
- "dependencies": {
- "aproba": "^2.0.0",
- "minipass": "^3.1.1",
- "npm-package-arg": "^9.0.1",
- "npm-registry-fetch": "^13.0.0"
- },
- "engines": {
- "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
- }
- },
- "node_modules/npm/node_modules/libnpmdiff": {
- "version": "4.0.5",
- "dev": true,
- "inBundle": true,
- "license": "ISC",
- "peer": true,
- "dependencies": {
- "@npmcli/disparity-colors": "^2.0.0",
- "@npmcli/installed-package-contents": "^1.0.7",
- "binary-extensions": "^2.2.0",
- "diff": "^5.1.0",
- "minimatch": "^5.0.1",
- "npm-package-arg": "^9.0.1",
- "pacote": "^13.6.1",
- "tar": "^6.1.0"
- },
- "engines": {
- "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
- }
- },
- "node_modules/npm/node_modules/libnpmexec": {
- "version": "4.0.14",
- "dev": true,
- "inBundle": true,
- "license": "ISC",
- "peer": true,
- "dependencies": {
- "@npmcli/arborist": "^5.6.3",
- "@npmcli/ci-detect": "^2.0.0",
- "@npmcli/fs": "^2.1.1",
- "@npmcli/run-script": "^4.2.0",
- "chalk": "^4.1.0",
- "mkdirp-infer-owner": "^2.0.0",
- "npm-package-arg": "^9.0.1",
- "npmlog": "^6.0.2",
- "pacote": "^13.6.1",
- "proc-log": "^2.0.0",
- "read": "^1.0.7",
- "read-package-json-fast": "^2.0.2",
- "semver": "^7.3.7",
- "walk-up-path": "^1.0.0"
- },
- "engines": {
- "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
- }
- },
- "node_modules/npm/node_modules/libnpmfund": {
- "version": "3.0.5",
- "dev": true,
- "inBundle": true,
- "license": "ISC",
- "peer": true,
- "dependencies": {
- "@npmcli/arborist": "^5.6.3"
- },
- "engines": {
- "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
- }
- },
- "node_modules/npm/node_modules/libnpmhook": {
- "version": "8.0.4",
- "dev": true,
- "inBundle": true,
- "license": "ISC",
- "peer": true,
- "dependencies": {
- "aproba": "^2.0.0",
- "npm-registry-fetch": "^13.0.0"
- },
- "engines": {
- "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
- }
- },
- "node_modules/npm/node_modules/libnpmorg": {
- "version": "4.0.4",
- "dev": true,
- "inBundle": true,
- "license": "ISC",
- "peer": true,
- "dependencies": {
- "aproba": "^2.0.0",
- "npm-registry-fetch": "^13.0.0"
- },
- "engines": {
- "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
- }
- },
- "node_modules/npm/node_modules/libnpmpack": {
- "version": "4.1.3",
- "dev": true,
- "inBundle": true,
- "license": "ISC",
- "peer": true,
- "dependencies": {
- "@npmcli/run-script": "^4.1.3",
- "npm-package-arg": "^9.0.1",
- "pacote": "^13.6.1"
- },
- "engines": {
- "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
- }
- },
- "node_modules/npm/node_modules/libnpmpublish": {
- "version": "6.0.5",
- "dev": true,
- "inBundle": true,
- "license": "ISC",
- "peer": true,
- "dependencies": {
- "normalize-package-data": "^4.0.0",
- "npm-package-arg": "^9.0.1",
- "npm-registry-fetch": "^13.0.0",
- "semver": "^7.3.7",
- "ssri": "^9.0.0"
- },
- "engines": {
- "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
- }
- },
- "node_modules/npm/node_modules/libnpmsearch": {
- "version": "5.0.4",
- "dev": true,
- "inBundle": true,
- "license": "ISC",
- "peer": true,
- "dependencies": {
- "npm-registry-fetch": "^13.0.0"
- },
- "engines": {
- "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
- }
- },
- "node_modules/npm/node_modules/libnpmteam": {
- "version": "4.0.4",
- "dev": true,
- "inBundle": true,
- "license": "ISC",
- "peer": true,
- "dependencies": {
- "aproba": "^2.0.0",
- "npm-registry-fetch": "^13.0.0"
- },
- "engines": {
- "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
- }
- },
- "node_modules/npm/node_modules/libnpmversion": {
- "version": "3.0.7",
- "dev": true,
- "inBundle": true,
- "license": "ISC",
- "peer": true,
- "dependencies": {
- "@npmcli/git": "^3.0.0",
- "@npmcli/run-script": "^4.1.3",
- "json-parse-even-better-errors": "^2.3.1",
- "proc-log": "^2.0.0",
- "semver": "^7.3.7"
- },
- "engines": {
- "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
- }
- },
- "node_modules/npm/node_modules/lru-cache": {
- "version": "7.13.2",
- "dev": true,
- "inBundle": true,
- "license": "ISC",
- "peer": true,
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/npm/node_modules/make-fetch-happen": {
- "version": "10.2.1",
- "dev": true,
- "inBundle": true,
- "license": "ISC",
- "peer": true,
- "dependencies": {
- "agentkeepalive": "^4.2.1",
- "cacache": "^16.1.0",
- "http-cache-semantics": "^4.1.0",
- "http-proxy-agent": "^5.0.0",
- "https-proxy-agent": "^5.0.0",
- "is-lambda": "^1.0.1",
- "lru-cache": "^7.7.1",
- "minipass": "^3.1.6",
- "minipass-collect": "^1.0.2",
- "minipass-fetch": "^2.0.3",
- "minipass-flush": "^1.0.5",
- "minipass-pipeline": "^1.2.4",
- "negotiator": "^0.6.3",
- "promise-retry": "^2.0.1",
- "socks-proxy-agent": "^7.0.0",
- "ssri": "^9.0.0"
- },
- "engines": {
- "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
- }
- },
- "node_modules/npm/node_modules/minimatch": {
- "version": "5.1.0",
- "dev": true,
- "inBundle": true,
- "license": "ISC",
- "peer": true,
- "dependencies": {
- "brace-expansion": "^2.0.1"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/npm/node_modules/minipass": {
- "version": "3.3.4",
- "dev": true,
- "inBundle": true,
- "license": "ISC",
- "peer": true,
- "dependencies": {
- "yallist": "^4.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/npm/node_modules/minipass-collect": {
- "version": "1.0.2",
- "dev": true,
- "inBundle": true,
- "license": "ISC",
- "peer": true,
- "dependencies": {
- "minipass": "^3.0.0"
- },
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/npm/node_modules/minipass-fetch": {
- "version": "2.1.1",
- "dev": true,
- "inBundle": true,
- "license": "MIT",
- "peer": true,
- "dependencies": {
- "minipass": "^3.1.6",
- "minipass-sized": "^1.0.3",
- "minizlib": "^2.1.2"
- },
- "engines": {
- "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
- },
- "optionalDependencies": {
- "encoding": "^0.1.13"
- }
- },
- "node_modules/npm/node_modules/minipass-flush": {
- "version": "1.0.5",
- "dev": true,
- "inBundle": true,
- "license": "ISC",
- "peer": true,
- "dependencies": {
- "minipass": "^3.0.0"
- },
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/npm/node_modules/minipass-json-stream": {
- "version": "1.0.1",
- "dev": true,
- "inBundle": true,
- "license": "MIT",
- "peer": true,
- "dependencies": {
- "jsonparse": "^1.3.1",
- "minipass": "^3.0.0"
- }
- },
- "node_modules/npm/node_modules/minipass-pipeline": {
- "version": "1.2.4",
- "dev": true,
- "inBundle": true,
- "license": "ISC",
- "peer": true,
- "dependencies": {
- "minipass": "^3.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/npm/node_modules/minipass-sized": {
- "version": "1.0.3",
- "dev": true,
- "inBundle": true,
- "license": "ISC",
- "peer": true,
- "dependencies": {
- "minipass": "^3.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/npm/node_modules/minizlib": {
- "version": "2.1.2",
- "dev": true,
- "inBundle": true,
- "license": "MIT",
- "peer": true,
- "dependencies": {
- "minipass": "^3.0.0",
- "yallist": "^4.0.0"
- },
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/npm/node_modules/mkdirp": {
- "version": "1.0.4",
- "dev": true,
- "inBundle": true,
- "license": "MIT",
- "peer": true,
- "bin": {
- "mkdirp": "bin/cmd.js"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/npm/node_modules/mkdirp-infer-owner": {
- "version": "2.0.0",
- "dev": true,
- "inBundle": true,
- "license": "ISC",
- "peer": true,
- "dependencies": {
- "chownr": "^2.0.0",
- "infer-owner": "^1.0.4",
- "mkdirp": "^1.0.3"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/npm/node_modules/ms": {
- "version": "2.1.3",
- "dev": true,
- "inBundle": true,
- "license": "MIT",
- "peer": true
- },
- "node_modules/npm/node_modules/mute-stream": {
- "version": "0.0.8",
- "dev": true,
- "inBundle": true,
- "license": "ISC",
- "peer": true
- },
- "node_modules/npm/node_modules/negotiator": {
- "version": "0.6.3",
- "dev": true,
- "inBundle": true,
- "license": "MIT",
- "peer": true,
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/npm/node_modules/node-gyp": {
- "version": "9.1.0",
- "dev": true,
- "inBundle": true,
- "license": "MIT",
- "peer": true,
- "dependencies": {
- "env-paths": "^2.2.0",
- "glob": "^7.1.4",
- "graceful-fs": "^4.2.6",
- "make-fetch-happen": "^10.0.3",
- "nopt": "^5.0.0",
- "npmlog": "^6.0.0",
- "rimraf": "^3.0.2",
- "semver": "^7.3.5",
- "tar": "^6.1.2",
- "which": "^2.0.2"
- },
- "bin": {
- "node-gyp": "bin/node-gyp.js"
- },
- "engines": {
- "node": "^12.22 || ^14.13 || >=16"
- }
- },
- "node_modules/npm/node_modules/node-gyp/node_modules/brace-expansion": {
- "version": "1.1.11",
- "dev": true,
- "inBundle": true,
- "license": "MIT",
- "peer": true,
- "dependencies": {
- "balanced-match": "^1.0.0",
- "concat-map": "0.0.1"
- }
- },
- "node_modules/npm/node_modules/node-gyp/node_modules/glob": {
- "version": "7.2.3",
- "dev": true,
- "inBundle": true,
- "license": "ISC",
- "peer": true,
- "dependencies": {
- "fs.realpath": "^1.0.0",
- "inflight": "^1.0.4",
- "inherits": "2",
- "minimatch": "^3.1.1",
- "once": "^1.3.0",
- "path-is-absolute": "^1.0.0"
- },
- "engines": {
- "node": "*"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
- "node_modules/npm/node_modules/node-gyp/node_modules/minimatch": {
- "version": "3.1.2",
- "dev": true,
- "inBundle": true,
- "license": "ISC",
- "peer": true,
- "dependencies": {
- "brace-expansion": "^1.1.7"
- },
- "engines": {
- "node": "*"
- }
- },
- "node_modules/npm/node_modules/node-gyp/node_modules/nopt": {
- "version": "5.0.0",
- "dev": true,
- "inBundle": true,
- "license": "ISC",
- "peer": true,
- "dependencies": {
- "abbrev": "1"
- },
- "bin": {
- "nopt": "bin/nopt.js"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/npm/node_modules/nopt": {
- "version": "6.0.0",
- "dev": true,
- "inBundle": true,
- "license": "ISC",
- "peer": true,
- "dependencies": {
- "abbrev": "^1.0.0"
- },
- "bin": {
- "nopt": "bin/nopt.js"
- },
- "engines": {
- "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
- }
- },
- "node_modules/npm/node_modules/normalize-package-data": {
- "version": "4.0.1",
- "dev": true,
- "inBundle": true,
- "license": "BSD-2-Clause",
- "peer": true,
- "dependencies": {
- "hosted-git-info": "^5.0.0",
- "is-core-module": "^2.8.1",
- "semver": "^7.3.5",
- "validate-npm-package-license": "^3.0.4"
- },
- "engines": {
- "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
- }
- },
- "node_modules/npm/node_modules/npm-audit-report": {
- "version": "3.0.0",
- "dev": true,
- "inBundle": true,
- "license": "ISC",
- "peer": true,
- "dependencies": {
- "chalk": "^4.0.0"
- },
- "engines": {
- "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
- }
- },
- "node_modules/npm/node_modules/npm-bundled": {
- "version": "2.0.1",
- "dev": true,
- "inBundle": true,
- "license": "ISC",
- "peer": true,
- "dependencies": {
- "npm-normalize-package-bin": "^2.0.0"
- },
- "engines": {
- "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
- }
- },
- "node_modules/npm/node_modules/npm-bundled/node_modules/npm-normalize-package-bin": {
- "version": "2.0.0",
- "dev": true,
- "inBundle": true,
- "license": "ISC",
- "peer": true,
- "engines": {
- "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
- }
- },
- "node_modules/npm/node_modules/npm-install-checks": {
- "version": "5.0.0",
- "dev": true,
- "inBundle": true,
- "license": "BSD-2-Clause",
- "peer": true,
- "dependencies": {
- "semver": "^7.1.1"
- },
- "engines": {
- "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
- }
- },
- "node_modules/npm/node_modules/npm-normalize-package-bin": {
- "version": "1.0.1",
- "dev": true,
- "inBundle": true,
- "license": "ISC",
- "peer": true
- },
- "node_modules/npm/node_modules/npm-package-arg": {
- "version": "9.1.0",
- "dev": true,
- "inBundle": true,
- "license": "ISC",
- "peer": true,
- "dependencies": {
- "hosted-git-info": "^5.0.0",
- "proc-log": "^2.0.1",
- "semver": "^7.3.5",
- "validate-npm-package-name": "^4.0.0"
- },
- "engines": {
- "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
- }
- },
- "node_modules/npm/node_modules/npm-packlist": {
- "version": "5.1.3",
- "dev": true,
- "inBundle": true,
- "license": "ISC",
- "peer": true,
- "dependencies": {
- "glob": "^8.0.1",
- "ignore-walk": "^5.0.1",
- "npm-bundled": "^2.0.0",
- "npm-normalize-package-bin": "^2.0.0"
- },
- "bin": {
- "npm-packlist": "bin/index.js"
- },
- "engines": {
- "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
- }
- },
- "node_modules/npm/node_modules/npm-packlist/node_modules/npm-normalize-package-bin": {
- "version": "2.0.0",
- "dev": true,
- "inBundle": true,
- "license": "ISC",
- "peer": true,
- "engines": {
- "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
- }
- },
- "node_modules/npm/node_modules/npm-pick-manifest": {
- "version": "7.0.2",
- "dev": true,
- "inBundle": true,
- "license": "ISC",
- "peer": true,
- "dependencies": {
- "npm-install-checks": "^5.0.0",
- "npm-normalize-package-bin": "^2.0.0",
- "npm-package-arg": "^9.0.0",
- "semver": "^7.3.5"
- },
- "engines": {
- "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
- }
- },
- "node_modules/npm/node_modules/npm-pick-manifest/node_modules/npm-normalize-package-bin": {
- "version": "2.0.0",
- "dev": true,
- "inBundle": true,
- "license": "ISC",
- "peer": true,
- "engines": {
- "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
- }
- },
- "node_modules/npm/node_modules/npm-profile": {
- "version": "6.2.1",
- "dev": true,
- "inBundle": true,
- "license": "ISC",
- "peer": true,
- "dependencies": {
- "npm-registry-fetch": "^13.0.1",
- "proc-log": "^2.0.0"
- },
- "engines": {
- "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
- }
- },
- "node_modules/npm/node_modules/npm-registry-fetch": {
- "version": "13.3.1",
- "dev": true,
- "inBundle": true,
- "license": "ISC",
- "peer": true,
- "dependencies": {
- "make-fetch-happen": "^10.0.6",
- "minipass": "^3.1.6",
- "minipass-fetch": "^2.0.3",
- "minipass-json-stream": "^1.0.1",
- "minizlib": "^2.1.2",
- "npm-package-arg": "^9.0.1",
- "proc-log": "^2.0.0"
- },
- "engines": {
- "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
- }
- },
- "node_modules/npm/node_modules/npm-user-validate": {
- "version": "1.0.1",
- "dev": true,
- "inBundle": true,
- "license": "BSD-2-Clause",
- "peer": true
- },
- "node_modules/npm/node_modules/npmlog": {
- "version": "6.0.2",
- "dev": true,
- "inBundle": true,
- "license": "ISC",
- "peer": true,
- "dependencies": {
- "are-we-there-yet": "^3.0.0",
- "console-control-strings": "^1.1.0",
- "gauge": "^4.0.3",
- "set-blocking": "^2.0.0"
- },
- "engines": {
- "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
- }
- },
- "node_modules/npm/node_modules/once": {
- "version": "1.4.0",
- "dev": true,
- "inBundle": true,
- "license": "ISC",
- "peer": true,
- "dependencies": {
- "wrappy": "1"
- }
- },
- "node_modules/npm/node_modules/opener": {
- "version": "1.5.2",
- "dev": true,
- "inBundle": true,
- "license": "(WTFPL OR MIT)",
- "peer": true,
- "bin": {
- "opener": "bin/opener-bin.js"
- }
- },
- "node_modules/npm/node_modules/p-map": {
- "version": "4.0.0",
- "dev": true,
- "inBundle": true,
- "license": "MIT",
- "peer": true,
- "dependencies": {
- "aggregate-error": "^3.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/npm/node_modules/pacote": {
- "version": "13.6.2",
- "dev": true,
- "inBundle": true,
- "license": "ISC",
- "peer": true,
- "dependencies": {
- "@npmcli/git": "^3.0.0",
- "@npmcli/installed-package-contents": "^1.0.7",
- "@npmcli/promise-spawn": "^3.0.0",
- "@npmcli/run-script": "^4.1.0",
- "cacache": "^16.0.0",
- "chownr": "^2.0.0",
- "fs-minipass": "^2.1.0",
- "infer-owner": "^1.0.4",
- "minipass": "^3.1.6",
- "mkdirp": "^1.0.4",
- "npm-package-arg": "^9.0.0",
- "npm-packlist": "^5.1.0",
- "npm-pick-manifest": "^7.0.0",
- "npm-registry-fetch": "^13.0.1",
- "proc-log": "^2.0.0",
- "promise-retry": "^2.0.1",
- "read-package-json": "^5.0.0",
- "read-package-json-fast": "^2.0.3",
- "rimraf": "^3.0.2",
- "ssri": "^9.0.0",
- "tar": "^6.1.11"
- },
- "bin": {
- "pacote": "lib/bin.js"
- },
- "engines": {
- "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
- }
- },
- "node_modules/npm/node_modules/parse-conflict-json": {
- "version": "2.0.2",
- "dev": true,
- "inBundle": true,
- "license": "ISC",
- "peer": true,
- "dependencies": {
- "json-parse-even-better-errors": "^2.3.1",
- "just-diff": "^5.0.1",
- "just-diff-apply": "^5.2.0"
- },
- "engines": {
- "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
- }
- },
- "node_modules/npm/node_modules/path-is-absolute": {
- "version": "1.0.1",
- "dev": true,
- "inBundle": true,
- "license": "MIT",
- "peer": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/npm/node_modules/postcss-selector-parser": {
- "version": "6.0.10",
- "dev": true,
- "inBundle": true,
- "license": "MIT",
- "peer": true,
- "dependencies": {
- "cssesc": "^3.0.0",
- "util-deprecate": "^1.0.2"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/npm/node_modules/proc-log": {
- "version": "2.0.1",
- "dev": true,
- "inBundle": true,
- "license": "ISC",
- "peer": true,
- "engines": {
- "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
- }
- },
- "node_modules/npm/node_modules/promise-all-reject-late": {
- "version": "1.0.1",
- "dev": true,
- "inBundle": true,
- "license": "ISC",
- "peer": true,
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
- "node_modules/npm/node_modules/promise-call-limit": {
- "version": "1.0.1",
- "dev": true,
- "inBundle": true,
- "license": "ISC",
- "peer": true,
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
- "node_modules/npm/node_modules/promise-inflight": {
- "version": "1.0.1",
- "dev": true,
- "inBundle": true,
- "license": "ISC",
- "peer": true
- },
- "node_modules/npm/node_modules/promise-retry": {
- "version": "2.0.1",
- "dev": true,
- "inBundle": true,
- "license": "MIT",
- "peer": true,
- "dependencies": {
- "err-code": "^2.0.2",
- "retry": "^0.12.0"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/npm/node_modules/promzard": {
- "version": "0.3.0",
- "dev": true,
- "inBundle": true,
- "license": "ISC",
- "peer": true,
- "dependencies": {
- "read": "1"
- }
- },
- "node_modules/npm/node_modules/qrcode-terminal": {
- "version": "0.12.0",
- "dev": true,
- "inBundle": true,
- "peer": true,
- "bin": {
- "qrcode-terminal": "bin/qrcode-terminal.js"
- }
- },
- "node_modules/npm/node_modules/read": {
- "version": "1.0.7",
- "dev": true,
- "inBundle": true,
- "license": "ISC",
- "peer": true,
- "dependencies": {
- "mute-stream": "~0.0.4"
- },
- "engines": {
- "node": ">=0.8"
- }
- },
- "node_modules/npm/node_modules/read-cmd-shim": {
- "version": "3.0.0",
- "dev": true,
- "inBundle": true,
- "license": "ISC",
- "peer": true,
- "engines": {
- "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
- }
- },
- "node_modules/npm/node_modules/read-package-json": {
- "version": "5.0.2",
- "dev": true,
- "inBundle": true,
- "license": "ISC",
- "peer": true,
- "dependencies": {
- "glob": "^8.0.1",
- "json-parse-even-better-errors": "^2.3.1",
- "normalize-package-data": "^4.0.0",
- "npm-normalize-package-bin": "^2.0.0"
- },
- "engines": {
- "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
- }
- },
- "node_modules/npm/node_modules/read-package-json-fast": {
- "version": "2.0.3",
- "dev": true,
- "inBundle": true,
- "license": "ISC",
- "peer": true,
- "dependencies": {
- "json-parse-even-better-errors": "^2.3.0",
- "npm-normalize-package-bin": "^1.0.1"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/npm/node_modules/read-package-json/node_modules/npm-normalize-package-bin": {
- "version": "2.0.0",
- "dev": true,
- "inBundle": true,
- "license": "ISC",
- "peer": true,
- "engines": {
- "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
- }
- },
- "node_modules/npm/node_modules/readable-stream": {
- "version": "3.6.0",
- "dev": true,
- "inBundle": true,
- "license": "MIT",
- "peer": true,
- "dependencies": {
- "inherits": "^2.0.3",
- "string_decoder": "^1.1.1",
- "util-deprecate": "^1.0.1"
- },
- "engines": {
- "node": ">= 6"
- }
- },
- "node_modules/npm/node_modules/readdir-scoped-modules": {
- "version": "1.1.0",
- "dev": true,
- "inBundle": true,
- "license": "ISC",
- "peer": true,
- "dependencies": {
- "debuglog": "^1.0.1",
- "dezalgo": "^1.0.0",
- "graceful-fs": "^4.1.2",
- "once": "^1.3.0"
- }
- },
- "node_modules/npm/node_modules/retry": {
- "version": "0.12.0",
- "dev": true,
- "inBundle": true,
- "license": "MIT",
- "peer": true,
- "engines": {
- "node": ">= 4"
- }
- },
- "node_modules/npm/node_modules/rimraf": {
- "version": "3.0.2",
- "dev": true,
- "inBundle": true,
- "license": "ISC",
- "peer": true,
- "dependencies": {
- "glob": "^7.1.3"
- },
- "bin": {
- "rimraf": "bin.js"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
- "node_modules/npm/node_modules/rimraf/node_modules/brace-expansion": {
- "version": "1.1.11",
- "dev": true,
- "inBundle": true,
- "license": "MIT",
- "peer": true,
- "dependencies": {
- "balanced-match": "^1.0.0",
- "concat-map": "0.0.1"
- }
- },
- "node_modules/npm/node_modules/rimraf/node_modules/glob": {
- "version": "7.2.3",
- "dev": true,
- "inBundle": true,
- "license": "ISC",
- "peer": true,
- "dependencies": {
- "fs.realpath": "^1.0.0",
- "inflight": "^1.0.4",
- "inherits": "2",
- "minimatch": "^3.1.1",
- "once": "^1.3.0",
- "path-is-absolute": "^1.0.0"
- },
- "engines": {
- "node": "*"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
- "node_modules/npm/node_modules/rimraf/node_modules/minimatch": {
- "version": "3.1.2",
- "dev": true,
- "inBundle": true,
- "license": "ISC",
- "peer": true,
- "dependencies": {
- "brace-expansion": "^1.1.7"
- },
- "engines": {
- "node": "*"
- }
- },
- "node_modules/npm/node_modules/safe-buffer": {
- "version": "5.2.1",
- "dev": true,
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/feross"
- },
- {
- "type": "patreon",
- "url": "https://www.patreon.com/feross"
- },
- {
- "type": "consulting",
- "url": "https://feross.org/support"
- }
- ],
- "inBundle": true,
- "license": "MIT",
- "peer": true
- },
- "node_modules/npm/node_modules/safer-buffer": {
- "version": "2.1.2",
- "dev": true,
- "inBundle": true,
- "license": "MIT",
- "optional": true,
- "peer": true
- },
- "node_modules/npm/node_modules/semver": {
- "version": "7.3.7",
- "dev": true,
- "inBundle": true,
- "license": "ISC",
- "peer": true,
- "dependencies": {
- "lru-cache": "^6.0.0"
- },
- "bin": {
- "semver": "bin/semver.js"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/npm/node_modules/semver/node_modules/lru-cache": {
- "version": "6.0.0",
- "dev": true,
- "inBundle": true,
- "license": "ISC",
- "peer": true,
- "dependencies": {
- "yallist": "^4.0.0"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/npm/node_modules/set-blocking": {
- "version": "2.0.0",
- "dev": true,
- "inBundle": true,
- "license": "ISC",
- "peer": true
- },
- "node_modules/npm/node_modules/signal-exit": {
- "version": "3.0.7",
- "dev": true,
- "inBundle": true,
- "license": "ISC",
- "peer": true
- },
- "node_modules/npm/node_modules/smart-buffer": {
- "version": "4.2.0",
- "dev": true,
- "inBundle": true,
- "license": "MIT",
- "peer": true,
- "engines": {
- "node": ">= 6.0.0",
- "npm": ">= 3.0.0"
- }
- },
- "node_modules/npm/node_modules/socks": {
- "version": "2.7.0",
- "dev": true,
- "inBundle": true,
- "license": "MIT",
- "peer": true,
- "dependencies": {
- "ip": "^2.0.0",
- "smart-buffer": "^4.2.0"
- },
- "engines": {
- "node": ">= 10.13.0",
- "npm": ">= 3.0.0"
- }
- },
- "node_modules/npm/node_modules/socks-proxy-agent": {
- "version": "7.0.0",
- "dev": true,
- "inBundle": true,
- "license": "MIT",
- "peer": true,
- "dependencies": {
- "agent-base": "^6.0.2",
- "debug": "^4.3.3",
- "socks": "^2.6.2"
- },
- "engines": {
- "node": ">= 10"
- }
- },
- "node_modules/npm/node_modules/spdx-correct": {
- "version": "3.1.1",
- "dev": true,
- "inBundle": true,
- "license": "Apache-2.0",
- "peer": true,
- "dependencies": {
- "spdx-expression-parse": "^3.0.0",
- "spdx-license-ids": "^3.0.0"
- }
- },
- "node_modules/npm/node_modules/spdx-exceptions": {
- "version": "2.3.0",
- "dev": true,
- "inBundle": true,
- "license": "CC-BY-3.0",
- "peer": true
- },
- "node_modules/npm/node_modules/spdx-expression-parse": {
- "version": "3.0.1",
- "dev": true,
- "inBundle": true,
- "license": "MIT",
- "peer": true,
- "dependencies": {
- "spdx-exceptions": "^2.1.0",
- "spdx-license-ids": "^3.0.0"
- }
- },
- "node_modules/npm/node_modules/spdx-license-ids": {
- "version": "3.0.11",
- "dev": true,
- "inBundle": true,
- "license": "CC0-1.0",
- "peer": true
- },
- "node_modules/npm/node_modules/ssri": {
- "version": "9.0.1",
- "dev": true,
- "inBundle": true,
- "license": "ISC",
- "peer": true,
- "dependencies": {
- "minipass": "^3.1.1"
- },
- "engines": {
- "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
- }
- },
- "node_modules/npm/node_modules/string_decoder": {
- "version": "1.3.0",
- "dev": true,
- "inBundle": true,
- "license": "MIT",
- "peer": true,
- "dependencies": {
- "safe-buffer": "~5.2.0"
- }
- },
- "node_modules/npm/node_modules/string-width": {
- "version": "4.2.3",
- "dev": true,
- "inBundle": true,
- "license": "MIT",
- "peer": true,
- "dependencies": {
- "emoji-regex": "^8.0.0",
- "is-fullwidth-code-point": "^3.0.0",
- "strip-ansi": "^6.0.1"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/npm/node_modules/strip-ansi": {
- "version": "6.0.1",
- "dev": true,
- "inBundle": true,
- "license": "MIT",
- "peer": true,
- "dependencies": {
- "ansi-regex": "^5.0.1"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/npm/node_modules/supports-color": {
- "version": "7.2.0",
- "dev": true,
- "inBundle": true,
- "license": "MIT",
- "peer": true,
- "dependencies": {
- "has-flag": "^4.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/npm/node_modules/tar": {
- "version": "6.1.11",
- "dev": true,
- "inBundle": true,
- "license": "ISC",
- "peer": true,
- "dependencies": {
- "chownr": "^2.0.0",
- "fs-minipass": "^2.0.0",
- "minipass": "^3.0.0",
- "minizlib": "^2.1.1",
- "mkdirp": "^1.0.3",
- "yallist": "^4.0.0"
- },
- "engines": {
- "node": ">= 10"
- }
- },
- "node_modules/npm/node_modules/text-table": {
- "version": "0.2.0",
- "dev": true,
- "inBundle": true,
- "license": "MIT",
- "peer": true
- },
- "node_modules/npm/node_modules/tiny-relative-date": {
- "version": "1.3.0",
- "dev": true,
- "inBundle": true,
- "license": "MIT",
- "peer": true
- },
- "node_modules/npm/node_modules/treeverse": {
- "version": "2.0.0",
- "dev": true,
- "inBundle": true,
- "license": "ISC",
- "peer": true,
- "engines": {
- "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
- }
- },
- "node_modules/npm/node_modules/unique-filename": {
- "version": "2.0.1",
- "dev": true,
- "inBundle": true,
- "license": "ISC",
- "peer": true,
- "dependencies": {
- "unique-slug": "^3.0.0"
- },
- "engines": {
- "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
- }
- },
- "node_modules/npm/node_modules/unique-slug": {
- "version": "3.0.0",
- "dev": true,
- "inBundle": true,
- "license": "ISC",
- "peer": true,
- "dependencies": {
- "imurmurhash": "^0.1.4"
- },
- "engines": {
- "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
- }
- },
- "node_modules/npm/node_modules/util-deprecate": {
- "version": "1.0.2",
- "dev": true,
- "inBundle": true,
- "license": "MIT",
- "peer": true
- },
- "node_modules/npm/node_modules/validate-npm-package-license": {
- "version": "3.0.4",
- "dev": true,
- "inBundle": true,
- "license": "Apache-2.0",
- "peer": true,
- "dependencies": {
- "spdx-correct": "^3.0.0",
- "spdx-expression-parse": "^3.0.0"
- }
- },
- "node_modules/npm/node_modules/validate-npm-package-name": {
- "version": "4.0.0",
- "dev": true,
- "inBundle": true,
- "license": "ISC",
- "peer": true,
- "dependencies": {
- "builtins": "^5.0.0"
- },
- "engines": {
- "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
- }
- },
- "node_modules/npm/node_modules/walk-up-path": {
- "version": "1.0.0",
- "dev": true,
- "inBundle": true,
- "license": "ISC",
- "peer": true
- },
- "node_modules/npm/node_modules/wcwidth": {
- "version": "1.0.1",
- "dev": true,
- "inBundle": true,
- "license": "MIT",
- "peer": true,
- "dependencies": {
- "defaults": "^1.0.3"
- }
- },
- "node_modules/npm/node_modules/which": {
- "version": "2.0.2",
- "dev": true,
- "inBundle": true,
- "license": "ISC",
- "peer": true,
- "dependencies": {
- "isexe": "^2.0.0"
- },
- "bin": {
- "node-which": "bin/node-which"
- },
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/npm/node_modules/wide-align": {
- "version": "1.1.5",
- "dev": true,
- "inBundle": true,
- "license": "ISC",
- "peer": true,
- "dependencies": {
- "string-width": "^1.0.2 || 2 || 3 || 4"
- }
- },
- "node_modules/npm/node_modules/wrappy": {
- "version": "1.0.2",
- "dev": true,
- "inBundle": true,
- "license": "ISC",
- "peer": true
- },
- "node_modules/npm/node_modules/write-file-atomic": {
- "version": "4.0.2",
- "dev": true,
- "inBundle": true,
- "license": "ISC",
- "peer": true,
- "dependencies": {
- "imurmurhash": "^0.1.4",
- "signal-exit": "^3.0.7"
- },
- "engines": {
- "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
- }
- },
- "node_modules/npm/node_modules/yallist": {
- "version": "4.0.0",
- "dev": true,
- "inBundle": true,
- "license": "ISC",
- "peer": true
- },
- "node_modules/once": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
- "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
- "dev": true,
- "dependencies": {
- "wrappy": "1"
- }
- },
- "node_modules/onetime": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz",
- "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "mimic-fn": "^2.1.0"
- },
- "engines": {
- "node": ">=6"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/p-each-series": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-2.2.0.tgz",
- "integrity": "sha512-ycIL2+1V32th+8scbpTvyHNaHe02z0sjgh91XXjAk+ZeXoPN4Z46DVUnzdso0aX4KckKw0FNNFHdjZ2UsZvxiA==",
- "dev": true,
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/p-filter": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/p-filter/-/p-filter-2.1.0.tgz",
- "integrity": "sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "p-map": "^2.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/p-finally": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz",
- "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==",
- "dev": true,
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/p-is-promise": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-3.0.0.tgz",
- "integrity": "sha512-Wo8VsW4IRQSKVXsJCn7TomUaVtyfjVDn3nUP7kE967BQk0CwFpdbZs0X0uk5sW9mkBa9eNM7hCMaG93WUAwxYQ==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/p-limit": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
- "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "p-try": "^2.0.0"
- },
- "engines": {
- "node": ">=6"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/p-locate": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
- "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "p-limit": "^2.2.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/p-map": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz",
- "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/p-reduce": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/p-reduce/-/p-reduce-2.1.0.tgz",
- "integrity": "sha512-2USApvnsutq8uoxZBGbbWM0JIYLiEMJ9RlaN7fAzVNb9OZN0SHjjTTfIcb667XynS5Y1VhwDJVDa72TnPzAYWw==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/p-try": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
- "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/parent-module": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
- "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "callsites": "^3.0.0"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/parse-json": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz",
- "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==",
- "dev": true,
- "dependencies": {
- "@babel/code-frame": "^7.0.0",
- "error-ex": "^1.3.1",
- "json-parse-even-better-errors": "^2.3.0",
- "lines-and-columns": "^1.1.6"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/path-exists": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
- "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/path-is-absolute": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
- "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/path-key": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
- "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/path-parse": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
- "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
- "dev": true
- },
- "node_modules/path-type": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
- "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/picomatch": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
- "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
- "dev": true,
- "engines": {
- "node": ">=8.6"
- },
- "funding": {
- "url": "https://github.com/sponsors/jonschlinkert"
- }
- },
- "node_modules/pify": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
- "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/pkg-conf": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/pkg-conf/-/pkg-conf-2.1.0.tgz",
- "integrity": "sha512-C+VUP+8jis7EsQZIhDYmS5qlNtjv2yP4SNtjXK9AP1ZcTRlnSfuumaTnRfYZnYgUUYVIKqL0fRvmUGDV2fmp6g==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "find-up": "^2.0.0",
- "load-json-file": "^4.0.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/pkg-conf/node_modules/find-up": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz",
- "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "locate-path": "^2.0.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/pkg-conf/node_modules/locate-path": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz",
- "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "p-locate": "^2.0.0",
- "path-exists": "^3.0.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/pkg-conf/node_modules/p-limit": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz",
- "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "p-try": "^1.0.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/pkg-conf/node_modules/p-locate": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz",
- "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "p-limit": "^1.1.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/pkg-conf/node_modules/p-try": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz",
- "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/pkg-conf/node_modules/path-exists": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
- "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/pkg-up": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-2.0.0.tgz",
- "integrity": "sha512-fjAPuiws93rm7mPUu21RdBnkeZNrbfCFCwfAhPWY+rR3zG0ubpe5cEReHOw5fIbfmsxEV/g2kSxGTATY3Bpnwg==",
- "dev": true,
- "dependencies": {
- "find-up": "^2.1.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/pkg-up/node_modules/find-up": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz",
- "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==",
- "dev": true,
- "dependencies": {
- "locate-path": "^2.0.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/pkg-up/node_modules/locate-path": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz",
- "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==",
- "dev": true,
- "dependencies": {
- "p-locate": "^2.0.0",
- "path-exists": "^3.0.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/pkg-up/node_modules/p-limit": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz",
- "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==",
- "dev": true,
- "dependencies": {
- "p-try": "^1.0.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/pkg-up/node_modules/p-locate": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz",
- "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==",
- "dev": true,
- "dependencies": {
- "p-limit": "^1.1.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/pkg-up/node_modules/p-try": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz",
- "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==",
- "dev": true,
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/pkg-up/node_modules/path-exists": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
- "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==",
- "dev": true,
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/process-nextick-args": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
- "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==",
- "dev": true
- },
- "node_modules/proto-list": {
- "version": "1.2.4",
- "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz",
- "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==",
- "dev": true,
- "peer": true
- },
- "node_modules/pseudomap": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz",
- "integrity": "sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==",
- "dev": true
- },
- "node_modules/q": {
- "version": "1.5.1",
- "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz",
- "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": ">=0.6.0",
- "teleport": ">=0.2.0"
- }
- },
- "node_modules/queue-microtask": {
- "version": "1.2.3",
- "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
- "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
- "dev": true,
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/feross"
- },
- {
- "type": "patreon",
- "url": "https://www.patreon.com/feross"
- },
- {
- "type": "consulting",
- "url": "https://feross.org/support"
- }
- ]
- },
- "node_modules/quick-lru": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz",
- "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/ramda": {
- "version": "0.25.0",
- "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.25.0.tgz",
- "integrity": "sha512-GXpfrYVPwx3K7RQ6aYT8KPS8XViSXUVJT1ONhoKPE9VAleW42YE+U+8VEyGWt41EnEQW7gwecYJriTI0pKoecQ==",
- "dev": true
- },
- "node_modules/rc": {
- "version": "1.2.8",
- "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz",
- "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "deep-extend": "^0.6.0",
- "ini": "~1.3.0",
- "minimist": "^1.2.0",
- "strip-json-comments": "~2.0.1"
- },
- "bin": {
- "rc": "cli.js"
- }
- },
- "node_modules/read-pkg": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz",
- "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==",
- "dev": true,
- "dependencies": {
- "@types/normalize-package-data": "^2.4.0",
- "normalize-package-data": "^2.5.0",
- "parse-json": "^5.0.0",
- "type-fest": "^0.6.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/read-pkg-up": {
- "version": "7.0.1",
- "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz",
- "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "find-up": "^4.1.0",
- "read-pkg": "^5.2.0",
- "type-fest": "^0.8.1"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/read-pkg-up/node_modules/type-fest": {
- "version": "0.8.1",
- "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz",
- "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/read-pkg/node_modules/hosted-git-info": {
- "version": "2.8.9",
- "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz",
- "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==",
- "dev": true
- },
- "node_modules/read-pkg/node_modules/normalize-package-data": {
- "version": "2.5.0",
- "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz",
- "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==",
- "dev": true,
- "dependencies": {
- "hosted-git-info": "^2.1.4",
- "resolve": "^1.10.0",
- "semver": "2 || 3 || 4 || 5",
- "validate-npm-package-license": "^3.0.1"
- }
- },
- "node_modules/read-pkg/node_modules/semver": {
- "version": "5.7.2",
- "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz",
- "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==",
- "dev": true,
- "bin": {
- "semver": "bin/semver"
- }
- },
- "node_modules/read-pkg/node_modules/type-fest": {
- "version": "0.6.0",
- "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz",
- "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/readable-stream": {
- "version": "2.3.8",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz",
- "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==",
- "dev": true,
- "dependencies": {
- "core-util-is": "~1.0.0",
- "inherits": "~2.0.3",
- "isarray": "~1.0.0",
- "process-nextick-args": "~2.0.0",
- "safe-buffer": "~5.1.1",
- "string_decoder": "~1.1.1",
- "util-deprecate": "~1.0.1"
- }
- },
- "node_modules/redent": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz",
- "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "indent-string": "^4.0.0",
- "strip-indent": "^3.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/redeyed": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/redeyed/-/redeyed-2.1.1.tgz",
- "integrity": "sha512-FNpGGo1DycYAdnrKFxCMmKYgo/mILAqtRYbkdQD8Ep/Hk2PQ5+aEAEx+IU713RTDmuBaH0c8P5ZozurNu5ObRQ==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "esprima": "~4.0.0"
- }
- },
- "node_modules/registry-auth-token": {
- "version": "5.0.2",
- "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-5.0.2.tgz",
- "integrity": "sha512-o/3ikDxtXaA59BmZuZrJZDJv8NMDGSj+6j6XaeBmHw8eY1i1qd9+6H+LjVvQXx3HN6aRCGa1cUdJ9RaJZUugnQ==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "@pnpm/npm-conf": "^2.1.0"
- },
- "engines": {
- "node": ">=14"
- }
- },
- "node_modules/require-directory": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
- "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/resolve": {
- "version": "1.22.8",
- "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz",
- "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==",
- "dev": true,
- "dependencies": {
- "is-core-module": "^2.13.0",
- "path-parse": "^1.0.7",
- "supports-preserve-symlinks-flag": "^1.0.0"
- },
- "bin": {
- "resolve": "bin/resolve"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/resolve-from": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
- "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/reusify": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
- "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
- "dev": true,
- "engines": {
- "iojs": ">=1.0.0",
- "node": ">=0.10.0"
- }
- },
- "node_modules/rimraf": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
- "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
- "dev": true,
- "dependencies": {
- "glob": "^7.1.3"
- },
- "bin": {
- "rimraf": "bin.js"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
- "node_modules/run-parallel": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
- "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
- "dev": true,
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/feross"
- },
- {
- "type": "patreon",
- "url": "https://www.patreon.com/feross"
- },
- {
- "type": "consulting",
- "url": "https://feross.org/support"
- }
- ],
- "dependencies": {
- "queue-microtask": "^1.2.2"
- }
- },
- "node_modules/safe-buffer": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
- "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
- "dev": true
- },
- "node_modules/semantic-release": {
- "version": "19.0.5",
- "resolved": "https://registry.npmjs.org/semantic-release/-/semantic-release-19.0.5.tgz",
- "integrity": "sha512-NMPKdfpXTnPn49FDogMBi36SiBfXkSOJqCkk0E4iWOY1tusvvgBwqUmxTX1kmlT6kIYed9YwNKD1sfPpqa5yaA==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "@semantic-release/commit-analyzer": "^9.0.2",
- "@semantic-release/error": "^3.0.0",
- "@semantic-release/github": "^8.0.0",
- "@semantic-release/npm": "^9.0.0",
- "@semantic-release/release-notes-generator": "^10.0.0",
- "aggregate-error": "^3.0.0",
- "cosmiconfig": "^7.0.0",
- "debug": "^4.0.0",
- "env-ci": "^5.0.0",
- "execa": "^5.0.0",
- "figures": "^3.0.0",
- "find-versions": "^4.0.0",
- "get-stream": "^6.0.0",
- "git-log-parser": "^1.2.0",
- "hook-std": "^2.0.0",
- "hosted-git-info": "^4.0.0",
- "lodash": "^4.17.21",
- "marked": "^4.0.10",
- "marked-terminal": "^5.0.0",
- "micromatch": "^4.0.2",
- "p-each-series": "^2.1.0",
- "p-reduce": "^2.0.0",
- "read-pkg-up": "^7.0.0",
- "resolve-from": "^5.0.0",
- "semver": "^7.3.2",
- "semver-diff": "^3.1.1",
- "signale": "^1.2.1",
- "yargs": "^16.2.0"
- },
- "bin": {
- "semantic-release": "bin/semantic-release.js"
- },
- "engines": {
- "node": ">=16 || ^14.17"
- }
- },
- "node_modules/semantic-release-export-data": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/semantic-release-export-data/-/semantic-release-export-data-1.0.1.tgz",
- "integrity": "sha512-6vlgrrzzcMi/REhQd65Bh4dfSKmgwXOJ/Q2RVlT9WsU4Ya1T2qGpkSrMfG/n6oFRrqBdbDlyZgxNd94ziW+vSg==",
- "dev": true,
- "dependencies": {
- "@actions/core": "^1.10.0"
- },
- "peerDependencies": {
- "semantic-release": ">=18"
- }
- },
- "node_modules/semantic-release-monorepo": {
- "version": "7.0.8",
- "resolved": "https://registry.npmjs.org/semantic-release-monorepo/-/semantic-release-monorepo-7.0.8.tgz",
- "integrity": "sha512-L2n7FZEYvjxXop6C7svk8xZH1/2N58CV1dN+veeAGZ8363FG+AKNKLN1r4wAL86e5xIu1HiOOASm10X+rN6XWg==",
- "dev": true,
- "dependencies": {
- "debug": "^3.1.0",
- "execa": "^0.8.0",
- "file-url": "^3.0.0",
- "fs-extra": "^10.0.1",
- "get-stream": "^6.0.1",
- "git-log-parser": "^1.2.0",
- "p-each-series": "^2.1.0",
- "p-limit": "^1.2.0",
- "pkg-up": "^2.0.0",
- "ramda": "^0.25.0",
- "read-pkg": "^5.0.0",
- "semantic-release-plugin-decorators": "^3.0.0",
- "tempy": "1.0.1"
- },
- "peerDependencies": {
- "semantic-release": ">=15.11.x < 20"
- }
- },
- "node_modules/semantic-release-monorepo/node_modules/cross-spawn": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz",
- "integrity": "sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==",
- "dev": true,
- "dependencies": {
- "lru-cache": "^4.0.1",
- "shebang-command": "^1.2.0",
- "which": "^1.2.9"
- }
- },
- "node_modules/semantic-release-monorepo/node_modules/debug": {
- "version": "3.2.7",
- "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
- "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
- "dev": true,
- "dependencies": {
- "ms": "^2.1.1"
- }
- },
- "node_modules/semantic-release-monorepo/node_modules/execa": {
- "version": "0.8.0",
- "resolved": "https://registry.npmjs.org/execa/-/execa-0.8.0.tgz",
- "integrity": "sha512-zDWS+Rb1E8BlqqhALSt9kUhss8Qq4nN3iof3gsOdyINksElaPyNBtKUMTR62qhvgVWR0CqCX7sdnKe4MnUbFEA==",
- "dev": true,
- "dependencies": {
- "cross-spawn": "^5.0.1",
- "get-stream": "^3.0.0",
- "is-stream": "^1.1.0",
- "npm-run-path": "^2.0.0",
- "p-finally": "^1.0.0",
- "signal-exit": "^3.0.0",
- "strip-eof": "^1.0.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/semantic-release-monorepo/node_modules/execa/node_modules/get-stream": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz",
- "integrity": "sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==",
- "dev": true,
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/semantic-release-monorepo/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==",
- "dev": true,
- "dependencies": {
- "graceful-fs": "^4.2.0",
- "jsonfile": "^6.0.1",
- "universalify": "^2.0.0"
- },
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/semantic-release-monorepo/node_modules/is-stream": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz",
- "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/semantic-release-monorepo/node_modules/lru-cache": {
- "version": "4.1.5",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz",
- "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==",
- "dev": true,
- "dependencies": {
- "pseudomap": "^1.0.2",
- "yallist": "^2.1.2"
- }
- },
- "node_modules/semantic-release-monorepo/node_modules/npm-run-path": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz",
- "integrity": "sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==",
- "dev": true,
- "dependencies": {
- "path-key": "^2.0.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/semantic-release-monorepo/node_modules/p-limit": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz",
- "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==",
- "dev": true,
- "dependencies": {
- "p-try": "^1.0.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/semantic-release-monorepo/node_modules/p-try": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz",
- "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==",
- "dev": true,
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/semantic-release-monorepo/node_modules/path-key": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz",
- "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==",
- "dev": true,
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/semantic-release-monorepo/node_modules/shebang-command": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
- "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==",
- "dev": true,
- "dependencies": {
- "shebang-regex": "^1.0.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/semantic-release-monorepo/node_modules/shebang-regex": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz",
- "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/semantic-release-monorepo/node_modules/which": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
- "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
- "dev": true,
- "dependencies": {
- "isexe": "^2.0.0"
- },
- "bin": {
- "which": "bin/which"
- }
- },
- "node_modules/semantic-release-monorepo/node_modules/yallist": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz",
- "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==",
- "dev": true
- },
- "node_modules/semantic-release-plugin-decorators": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/semantic-release-plugin-decorators/-/semantic-release-plugin-decorators-3.0.3.tgz",
- "integrity": "sha512-YTB2z64yyqEzABJ3yFesV9s5izZ4oKdbYDTu/2whVdlGQYCwsWkw9XYRCnvXzPdWPSWYmCPdJwMJ5w433rncig==",
- "dev": true,
- "peerDependencies": {
- "semantic-release": ">=11 < 20"
- }
- },
- "node_modules/semver": {
- "version": "7.5.4",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz",
- "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "lru-cache": "^6.0.0"
- },
- "bin": {
- "semver": "bin/semver.js"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/semver-diff": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz",
- "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "semver": "^6.3.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/semver-diff/node_modules/semver": {
- "version": "6.3.1",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
- "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
- "dev": true,
- "peer": true,
- "bin": {
- "semver": "bin/semver.js"
- }
- },
- "node_modules/semver-regex": {
- "version": "3.1.4",
- "resolved": "https://registry.npmjs.org/semver-regex/-/semver-regex-3.1.4.tgz",
- "integrity": "sha512-6IiqeZNgq01qGf0TId0t3NvKzSvUsjcpdEO3AQNeIjR6A2+ckTnQlDpl4qu1bjRv0RzN3FP9hzFmws3lKqRWkA==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/shebang-command": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
- "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "shebang-regex": "^3.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/shebang-regex": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
- "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/signal-exit": {
- "version": "3.0.7",
- "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
- "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
- "dev": true
- },
- "node_modules/signale": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/signale/-/signale-1.4.0.tgz",
- "integrity": "sha512-iuh+gPf28RkltuJC7W5MRi6XAjTDCAPC/prJUpQoG4vIP3MJZ+GTydVnodXA7pwvTKb2cA0m9OFZW/cdWy/I/w==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "chalk": "^2.3.2",
- "figures": "^2.0.0",
- "pkg-conf": "^2.1.0"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/signale/node_modules/ansi-styles": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
- "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "color-convert": "^1.9.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/signale/node_modules/chalk": {
- "version": "2.4.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
- "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "ansi-styles": "^3.2.1",
- "escape-string-regexp": "^1.0.5",
- "supports-color": "^5.3.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/signale/node_modules/color-convert": {
- "version": "1.9.3",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
- "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "color-name": "1.1.3"
- }
- },
- "node_modules/signale/node_modules/color-name": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
- "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
- "dev": true,
- "peer": true
- },
- "node_modules/signale/node_modules/figures": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz",
- "integrity": "sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "escape-string-regexp": "^1.0.5"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/signale/node_modules/has-flag": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
- "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/signale/node_modules/supports-color": {
- "version": "5.5.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
- "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "has-flag": "^3.0.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/slash": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
- "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/source-map": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
- "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/spawn-error-forwarder": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/spawn-error-forwarder/-/spawn-error-forwarder-1.0.0.tgz",
- "integrity": "sha512-gRjMgK5uFjbCvdibeGJuy3I5OYz6VLoVdsOJdA6wV0WlfQVLFueoqMxwwYD9RODdgb6oUIvlRlsyFSiQkMKu0g==",
- "dev": true
- },
- "node_modules/spdx-correct": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz",
- "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==",
- "dev": true,
- "dependencies": {
- "spdx-expression-parse": "^3.0.0",
- "spdx-license-ids": "^3.0.0"
- }
- },
- "node_modules/spdx-exceptions": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz",
- "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==",
- "dev": true
- },
- "node_modules/spdx-expression-parse": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz",
- "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==",
- "dev": true,
- "dependencies": {
- "spdx-exceptions": "^2.1.0",
- "spdx-license-ids": "^3.0.0"
- }
- },
- "node_modules/spdx-license-ids": {
- "version": "3.0.16",
- "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.16.tgz",
- "integrity": "sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw==",
- "dev": true
- },
- "node_modules/split": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz",
- "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "through": "2"
- },
- "engines": {
- "node": "*"
- }
- },
- "node_modules/split2": {
- "version": "3.2.2",
- "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz",
- "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "readable-stream": "^3.0.0"
- }
- },
- "node_modules/split2/node_modules/readable-stream": {
- "version": "3.6.2",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz",
- "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "inherits": "^2.0.3",
- "string_decoder": "^1.1.1",
- "util-deprecate": "^1.0.1"
- },
- "engines": {
- "node": ">= 6"
- }
- },
- "node_modules/stream-combiner2": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.1.1.tgz",
- "integrity": "sha512-3PnJbYgS56AeWgtKF5jtJRT6uFJe56Z0Hc5Ngg/6sI6rIt8iiMBTa9cvdyFfpMQjaVHr8dusbNeFGIIonxOvKw==",
- "dev": true,
- "dependencies": {
- "duplexer2": "~0.1.0",
- "readable-stream": "^2.0.2"
- }
- },
- "node_modules/string_decoder": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
- "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
- "dev": true,
- "dependencies": {
- "safe-buffer": "~5.1.0"
- }
- },
- "node_modules/string-width": {
- "version": "4.2.3",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
- "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
- "dev": true,
- "peer": true,
- "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==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "ansi-regex": "^5.0.1"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/strip-bom": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
- "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/strip-eof": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz",
- "integrity": "sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/strip-final-newline": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz",
- "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/strip-indent": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz",
- "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "min-indent": "^1.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/strip-json-comments": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
- "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/supports-color": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
- "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "has-flag": "^4.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/supports-hyperlinks": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz",
- "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "has-flag": "^4.0.0",
- "supports-color": "^7.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/supports-preserve-symlinks-flag": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
- "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
- "dev": true,
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/temp-dir": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz",
- "integrity": "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/tempy": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/tempy/-/tempy-1.0.1.tgz",
- "integrity": "sha512-biM9brNqxSc04Ee71hzFbryD11nX7VPhQQY32AdDmjFvodsRFz/3ufeoTZ6uYkRFfGo188tENcASNs3vTdsM0w==",
- "dev": true,
- "dependencies": {
- "del": "^6.0.0",
- "is-stream": "^2.0.0",
- "temp-dir": "^2.0.0",
- "type-fest": "^0.16.0",
- "unique-string": "^2.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/tempy/node_modules/type-fest": {
- "version": "0.16.0",
- "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.16.0.tgz",
- "integrity": "sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==",
- "dev": true,
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/text-extensions": {
- "version": "1.9.0",
- "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-1.9.0.tgz",
- "integrity": "sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": ">=0.10"
- }
- },
- "node_modules/through": {
- "version": "2.3.8",
- "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
- "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==",
- "dev": true,
- "peer": true
- },
- "node_modules/through2": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz",
- "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "readable-stream": "3"
- }
- },
- "node_modules/through2/node_modules/readable-stream": {
- "version": "3.6.2",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz",
- "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "inherits": "^2.0.3",
- "string_decoder": "^1.1.1",
- "util-deprecate": "^1.0.1"
- },
- "engines": {
- "node": ">= 6"
- }
- },
- "node_modules/to-regex-range": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
- "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
- "dev": true,
- "dependencies": {
- "is-number": "^7.0.0"
- },
- "engines": {
- "node": ">=8.0"
- }
- },
- "node_modules/tr46": {
- "version": "0.0.3",
- "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
- "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==",
- "dev": true,
- "peer": true
- },
- "node_modules/traverse": {
- "version": "0.6.8",
- "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.6.8.tgz",
- "integrity": "sha512-aXJDbk6SnumuaZSANd21XAo15ucCDE38H4fkqiGsc3MhCK+wOlZvLP9cB/TvpHT0mOyWgC4Z8EwRlzqYSUzdsA==",
- "dev": true,
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/trim-newlines": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz",
- "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/tunnel": {
- "version": "0.0.6",
- "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz",
- "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==",
- "dev": true,
- "engines": {
- "node": ">=0.6.11 <=0.7.0 || >=0.7.3"
- }
- },
- "node_modules/type-fest": {
- "version": "3.13.1",
- "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-3.13.1.tgz",
- "integrity": "sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": ">=14.16"
- },
- "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==",
- "dev": true,
- "optional": true,
- "peer": true,
- "bin": {
- "uglifyjs": "bin/uglifyjs"
- },
- "engines": {
- "node": ">=0.8.0"
- }
- },
- "node_modules/undici": {
- "version": "5.28.4",
- "resolved": "https://registry.npmjs.org/undici/-/undici-5.28.4.tgz",
- "integrity": "sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g==",
- "dev": true,
- "dependencies": {
- "@fastify/busboy": "^2.0.0"
- },
- "engines": {
- "node": ">=14.0"
- }
- },
- "node_modules/unique-string": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz",
- "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==",
- "dev": true,
- "dependencies": {
- "crypto-random-string": "^2.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/universal-user-agent": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.1.tgz",
- "integrity": "sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ==",
- "dev": true,
- "peer": true
- },
- "node_modules/universalify": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz",
- "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==",
- "dev": true,
- "engines": {
- "node": ">= 10.0.0"
- }
- },
- "node_modules/url-join": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.1.tgz",
- "integrity": "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==",
- "dev": true,
- "peer": true
- },
- "node_modules/util-deprecate": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
- "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
- "dev": true
- },
- "node_modules/uuid": {
- "version": "8.3.2",
- "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
- "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==",
- "dev": true,
- "bin": {
- "uuid": "dist/bin/uuid"
- }
- },
- "node_modules/validate-npm-package-license": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz",
- "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==",
- "dev": true,
- "dependencies": {
- "spdx-correct": "^3.0.0",
- "spdx-expression-parse": "^3.0.0"
- }
- },
- "node_modules/webidl-conversions": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
- "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==",
- "dev": true,
- "peer": true
- },
- "node_modules/whatwg-url": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz",
- "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "tr46": "~0.0.3",
- "webidl-conversions": "^3.0.0"
- }
- },
- "node_modules/which": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
- "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "isexe": "^2.0.0"
- },
- "bin": {
- "node-which": "bin/node-which"
- },
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/wordwrap": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
- "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==",
- "dev": true,
- "peer": true
- },
- "node_modules/wrap-ansi": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
- "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "ansi-styles": "^4.0.0",
- "string-width": "^4.1.0",
- "strip-ansi": "^6.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
- }
- },
- "node_modules/wrappy": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
- "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
- "dev": true
- },
- "node_modules/xtend": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
- "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==",
- "dev": true,
- "engines": {
- "node": ">=0.4"
- }
- },
- "node_modules/y18n": {
- "version": "5.0.8",
- "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
- "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/yallist": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
- "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
- "dev": true,
- "peer": true
- },
- "node_modules/yaml": {
- "version": "1.10.2",
- "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz",
- "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": ">= 6"
- }
- },
- "node_modules/yargs": {
- "version": "16.2.0",
- "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz",
- "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "cliui": "^7.0.2",
- "escalade": "^3.1.1",
- "get-caller-file": "^2.0.5",
- "require-directory": "^2.1.1",
- "string-width": "^4.2.0",
- "y18n": "^5.0.5",
- "yargs-parser": "^20.2.2"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/yargs-parser": {
- "version": "20.2.9",
- "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz",
- "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": ">=10"
- }
- }
- }
-}
diff --git a/diode-netbox-plugin/package.json b/diode-netbox-plugin/package.json
deleted file mode 100644
index 4edacfe8..00000000
--- a/diode-netbox-plugin/package.json
+++ /dev/null
@@ -1,10 +0,0 @@
-{
- "name": "diode-netbox-plugin",
- "version": "1.0.0",
- "extends": "semantic-release-monorepo",
- "devDependencies": {
- "semantic-release-monorepo": "^7.0.8",
- "semantic-release-export-data": "^1.0.1",
- "@semantic-release/changelog": "^6.0.3"
- }
-}
diff --git a/diode-netbox-plugin/pyproject.toml b/diode-netbox-plugin/pyproject.toml
deleted file mode 100644
index 14d66ee6..00000000
--- a/diode-netbox-plugin/pyproject.toml
+++ /dev/null
@@ -1,58 +0,0 @@
-[project]
-name = "netboxlabs-diode-netbox-plugin"
-version = "0.0.1" # Overwritten during the build process
-description = "NetBox Labs, Diode Netbox plugin"
-readme = "README.md" # Optional
-requires-python = ">=3.7"
-license = {file = "LICENSE.txt"}
-authors = [
- {name = "NetBox Labs", email = "support@netboxlabs.com" } # Optional
-]
-maintainers = [
- {name = "NetBox Labs", email = "support@netboxlabs.com" } # Optional
-]
-
-classifiers = [ # Optional
- "Development Status :: 3 - Alpha",
- "Intended Audience :: Developers",
- "Topic :: Software Development :: Build Tools",
- "License :: OSI Approved :: MIT License",
- "Programming Language :: Python :: 3",
- "Programming Language :: Python :: 3 :: Only",
- 'Programming Language :: Python :: 3.8',
- 'Programming Language :: Python :: 3.9',
- 'Programming Language :: Python :: 3.10',
- 'Programming Language :: Python :: 3.11',
-]
-
-dependencies = [
- "grpcio==1.62.1",
-]
-
-[project.optional-dependencies] # Optional
-dev = ["black", "check-manifest", "ruff"]
-test = ["coverage", "pytest", "pytest-cov"]
-
-[project.urls] # Optional
-"Homepage" = "https://netboxlabs.com/"
-
-[project.scripts] # Optional
-
-[tool.setuptools]
-py-modules = []
-
-[build-system]
-requires = ["setuptools>=43.0.0", "wheel"]
-build-backend = "setuptools.build_meta"
-
-
-[tool.ruff]
-line-length = 140
-
-[tool.ruff.format]
-quote-style = "double"
-indent-style = "space"
-
-[tool.ruff.lint]
-select = ["C", "D", "E", "F", "I", "R", "UP", "W"]
-ignore = ["F401", "D203", "D212", "D400", "D401", "D404", "RET504"]
diff --git a/diode-netbox-plugin/tests/test_version.py b/diode-netbox-plugin/tests/test_version.py
deleted file mode 100644
index d14336aa..00000000
--- a/diode-netbox-plugin/tests/test_version.py
+++ /dev/null
@@ -1,10 +0,0 @@
-#!/usr/bin/env python
-# Copyright 2024 NetBox Labs Inc
-"""NetBox Labs - Tests."""
-
-from netbox_diode_plugin.version import version_semver
-
-
-def test_version():
- """Check the injected semver."""
- assert version_semver() == "0.0.0"
diff --git a/diode-server/docker/diode/netbox_diode_plugin b/diode-server/docker/diode/netbox_diode_plugin
deleted file mode 120000
index 120b3492..00000000
--- a/diode-server/docker/diode/netbox_diode_plugin
+++ /dev/null
@@ -1 +0,0 @@
-../../../diode-netbox-plugin/netbox_diode_plugin
\ No newline at end of file
diff --git a/diode-server/docker/diode/requirements-plugins.txt b/diode-server/docker/diode/requirements-plugins.txt
deleted file mode 100644
index d71220ee..00000000
--- a/diode-server/docker/diode/requirements-plugins.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-pytest==8.0.2
-grpcio==1.62.1
diff --git a/diode-server/docker/docker-compose.netbox.yaml b/diode-server/docker/docker-compose.netbox.yaml
index 1212e349..8a72d5d5 100644
--- a/diode-server/docker/docker-compose.netbox.yaml
+++ b/diode-server/docker/docker-compose.netbox.yaml
@@ -19,7 +19,6 @@ services:
volumes:
- ./netbox/docker-entrypoint.sh:/opt/netbox/docker-entrypoint.sh:z,ro
- ./netbox/nginx-unit.json:/opt/netbox/nginx-unit.json:z,ro
- - ./diode/netbox_diode_plugin:/opt/netbox/netbox/netbox_diode_plugin:rw
- ./netbox/configuration:/etc/netbox/config:z,rw
- ./netbox/launch-netbox.sh:/opt/netbox/launch-netbox.sh:z,ro
- netbox-media-files:/opt/netbox/netbox/media:rw
diff --git a/diode-server/docker/netbox/Dockerfile-diode b/diode-server/docker/netbox/Dockerfile-diode
index f43647e9..ebefd3dc 100644
--- a/diode-server/docker/netbox/Dockerfile-diode
+++ b/diode-server/docker/netbox/Dockerfile-diode
@@ -1,4 +1,3 @@
FROM netboxcommunity/netbox:v4.0-2.9.1
-COPY ../diode/requirements-plugins.txt /opt/netbox/
-RUN /opt/netbox/venv/bin/pip install --no-warn-script-location -r /opt/netbox/requirements-plugins.txt
+RUN /opt/netbox/venv/bin/pip install --no-warn-script-location netboxlabs-diode-netbox-plugin