2
0
mirror of https://github.com/inventree/InvenTree.git synced 2025-06-18 13:05:42 +00:00

Merge branch 'master' of https://github.com/inventree/InvenTree into matmair/issue6281

This commit is contained in:
Matthias Mair
2024-04-08 18:41:57 +02:00
43 changed files with 809 additions and 374 deletions

View File

@ -89,6 +89,7 @@ jobs:
docker run --rm inventree-test invoke --list docker run --rm inventree-test invoke --list
docker run --rm inventree-test gunicorn --version docker run --rm inventree-test gunicorn --version
docker run --rm inventree-test pg_dump --version docker run --rm inventree-test pg_dump --version
docker run --rm inventree-test test -f /home/inventree/src/backend/InvenTree/manage.py
- name: Build Docker Image - name: Build Docker Image
# Build the development docker image (using docker-compose.yml) # Build the development docker image (using docker-compose.yml)
run: docker compose --project-directory . -f contrib/container/dev-docker-compose.yml build --no-cache run: docker compose --project-directory . -f contrib/container/dev-docker-compose.yml build --no-cache

View File

@ -24,6 +24,7 @@ env:
permissions: permissions:
contents: read contents: read
jobs: jobs:
paths-filter: paths-filter:
name: Filter name: Filter
@ -34,6 +35,7 @@ jobs:
migrations: ${{ steps.filter.outputs.migrations }} migrations: ${{ steps.filter.outputs.migrations }}
frontend: ${{ steps.filter.outputs.frontend }} frontend: ${{ steps.filter.outputs.frontend }}
api: ${{ steps.filter.outputs.api }} api: ${{ steps.filter.outputs.api }}
force: ${{ steps.force.outputs.force }}
steps: steps:
- uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # pin@v4.1.1 - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # pin@v4.1.1
@ -48,10 +50,18 @@ jobs:
migrations: migrations:
- '**/migrations/**' - '**/migrations/**'
- '.github/workflows**' - '.github/workflows**'
- 'src/backend/requirements.txt'
api: api:
- 'InvenTree/InvenTree/api_version.py' - 'src/backend/InvenTree/InvenTree/api_version.py'
frontend: frontend:
- 'src/frontend/**' - 'src/frontend/**'
- name: Is CI being forced?
run: echo "force=true" >> $GITHUB_OUTPUT
id: force
if: |
contains(github.event.pull_request.labels.*.name, 'dependency') ||
contains(github.event.pull_request.labels.*.name, 'full-run')
javascript: javascript:
name: Style - Classic UI [JS] name: Style - Classic UI [JS]
@ -73,13 +83,13 @@ jobs:
- name: Lint Javascript Files - name: Lint Javascript Files
run: | run: |
python src/backend/InvenTree/manage.py prerender python src/backend/InvenTree/manage.py prerender
npx eslint src/backend/InvenTree/InvenTree/static_i18n/i18n/*.js cd src/backend && npx eslint InvenTree/InvenTree/static_i18n/i18n/*.js
pre-commit: pre-commit:
name: Style [pre-commit] name: Style [pre-commit]
runs-on: ubuntu-20.04 runs-on: ubuntu-20.04
needs: paths-filter needs: paths-filter
if: needs.paths-filter.outputs.server == 'true' || needs.paths-filter.outputs.frontend == 'true' if: needs.paths-filter.outputs.server == 'true' || needs.paths-filter.outputs.frontend == 'true' || needs.paths-filter.outputs.force == 'true'
steps: steps:
- uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # pin@v4.1.1 - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # pin@v4.1.1
@ -125,7 +135,7 @@ jobs:
name: Tests - API Schema Documentation name: Tests - API Schema Documentation
runs-on: ubuntu-20.04 runs-on: ubuntu-20.04
needs: paths-filter needs: paths-filter
if: needs.paths-filter.outputs.server == 'true' if: needs.paths-filter.outputs.server == 'true' || needs.paths-filter.outputs.force == 'true'
env: env:
INVENTREE_DB_ENGINE: django.db.backends.sqlite3 INVENTREE_DB_ENGINE: django.db.backends.sqlite3
INVENTREE_DB_NAME: ../inventree_unit_test_db.sqlite3 INVENTREE_DB_NAME: ../inventree_unit_test_db.sqlite3
@ -276,12 +286,21 @@ jobs:
run: python3 .github/scripts/check_migration_files.py run: python3 .github/scripts/check_migration_files.py
- name: Coverage Tests - name: Coverage Tests
run: invoke test --coverage run: invoke test --coverage
- name: Upload Coverage Report - name: Upload Coverage Report to Coveralls
if: always()
uses: coverallsapp/github-action@3dfc5567390f6fa9267c0ee9c251e4c8c3f18949 # pin@v2.2.3 uses: coverallsapp/github-action@3dfc5567390f6fa9267c0ee9c251e4c8c3f18949 # pin@v2.2.3
with: with:
github-token: ${{ secrets.GITHUB_TOKEN }} github-token: ${{ secrets.GITHUB_TOKEN }}
flag-name: backend flag-name: backend
git-commit: ${{ github.sha }}
git-branch: ${{ github.ref }}
parallel: true parallel: true
- name: Upload coverage reports to Codecov
uses: codecov/codecov-action@v4.0.1
with:
token: ${{ secrets.CODECOV_TOKEN }}
slug: inventree/InvenTree
flags: backend
postgres: postgres:
name: Tests - DB [PostgreSQL] name: Tests - DB [PostgreSQL]
@ -373,7 +392,7 @@ jobs:
name: Tests - Migrations [PostgreSQL] name: Tests - Migrations [PostgreSQL]
runs-on: ubuntu-latest runs-on: ubuntu-latest
needs: paths-filter needs: paths-filter
if: github.ref == 'refs/heads/master' && needs.paths-filter.outputs.migrations == 'true' if: ${{ (needs.paths-filter.outputs.force == 'true') || (github.ref == 'refs/heads/master' && needs.paths-filter.outputs.migrations == 'true') }}
env: env:
INVENTREE_DB_ENGINE: django.db.backends.postgresql INVENTREE_DB_ENGINE: django.db.backends.postgresql
@ -404,13 +423,27 @@ jobs:
dev-install: true dev-install: true
update: true update: true
- name: Run Tests - name: Run Tests
run: invoke test --migrations --report run: invoke test --migrations --report --coverage
- name: Upload Coverage Report to Coveralls
if: always()
uses: coverallsapp/github-action@3dfc5567390f6fa9267c0ee9c251e4c8c3f18949 # pin@v2.2.3
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
flag-name: migrations
git-commit: ${{ github.sha }}
git-branch: ${{ github.ref }}
- name: Upload coverage reports to Codecov
uses: codecov/codecov-action@v4.0.1
with:
token: ${{ secrets.CODECOV_TOKEN }}
slug: inventree/InvenTree
flags: migrations
migrations-checks: migrations-checks:
name: Tests - Full Migration [SQLite] name: Tests - Full Migration [SQLite]
runs-on: ubuntu-latest runs-on: ubuntu-latest
needs: paths-filter needs: paths-filter
if: github.ref == 'refs/heads/master' && needs.paths-filter.outputs.migrations == 'true' if: ${{ (needs.paths-filter.outputs.force == 'true') || (github.ref == 'refs/heads/master' && needs.paths-filter.outputs.migrations == 'true') }}
env: env:
INVENTREE_DB_ENGINE: sqlite3 INVENTREE_DB_ENGINE: sqlite3
@ -467,7 +500,7 @@ jobs:
runs-on: ubuntu-20.04 runs-on: ubuntu-20.04
timeout-minutes: 60 timeout-minutes: 60
needs: [ 'pre-commit', 'paths-filter' ] needs: [ 'pre-commit', 'paths-filter' ]
if: needs.paths-filter.outputs.frontend == 'true' if: needs.paths-filter.outputs.frontend == 'true' || needs.paths-filter.outputs.force == 'true'
env: env:
INVENTREE_DB_ENGINE: sqlite3 INVENTREE_DB_ENGINE: sqlite3
INVENTREE_DB_NAME: /home/runner/work/InvenTree/db.sqlite3 INVENTREE_DB_NAME: /home/runner/work/InvenTree/db.sqlite3
@ -491,30 +524,24 @@ jobs:
run: cd src/frontend && npx playwright install --with-deps run: cd src/frontend && npx playwright install --with-deps
- name: Run Playwright tests - name: Run Playwright tests
run: cd src/frontend && npx nyc playwright test run: cd src/frontend && npx nyc playwright test
- uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # pin@v4.3.1
name: Upload playwright report
if: always()
with:
name: playwright-report
path: src/frontend/playwright-report/
retention-days: 30
- name: Report coverage - name: Report coverage
if: always() if: always()
run: cd src/frontend && npx nyc report --report-dir ./coverage --temp-dir .nyc_output --reporter=lcov --exclude-after-remap false run: cd src/frontend && npx nyc report --report-dir ./coverage --temp-dir .nyc_output --reporter=lcov --exclude-after-remap false
- uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # pin@v4.3.1 - name: Upload Coverage Report to Coveralls
name: Upload coverage report
if: always()
with:
name: coverage
path: src/frontend/coverage/
retention-days: 30
- name: Upload Coverage Report
if: always() if: always()
uses: coverallsapp/github-action@3dfc5567390f6fa9267c0ee9c251e4c8c3f18949 # pin@v2.2.3 uses: coverallsapp/github-action@3dfc5567390f6fa9267c0ee9c251e4c8c3f18949 # pin@v2.2.3
with: with:
github-token: ${{ secrets.GITHUB_TOKEN }} github-token: ${{ secrets.GITHUB_TOKEN }}
flag-name: pui flag-name: pui
git-commit: ${{ github.sha }}
git-branch: ${{ github.ref }}
parallel: true parallel: true
- name: Upload coverage reports to Codecov
uses: codecov/codecov-action@v4.0.1
with:
token: ${{ secrets.CODECOV_TOKEN }}
slug: inventree/InvenTree
flags: pui
platform_ui_build: platform_ui_build:
name: Build - UI Platform name: Build - UI Platform
@ -530,11 +557,11 @@ jobs:
- name: Install dependencies - name: Install dependencies
run: cd src/frontend && yarn install run: cd src/frontend && yarn install
- name: Build frontend - name: Build frontend
run: cd src/frontend && npm run compile && npm run build run: cd src/frontend && yarn run compile && yarn run build
- name: Zip frontend - name: Zip frontend
run: | run: |
cd src/backend/InvenTree/web/static cd src/backend/InvenTree/web/static
zip -r frontend-build.zip web/ zip -r frontend-build.zip web/ web/.vite
- uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # pin@v4.3.1 - uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # pin@v4.3.1
with: with:
name: frontend-build name: frontend-build
@ -543,13 +570,15 @@ jobs:
finish_coverage: finish_coverage:
name: Finish Coverage name: Finish Coverage
runs-on: ubuntu-20.04 runs-on: ubuntu-20.04
needs: ["platform_ui", "coverage", "paths-filter"] needs: ["platform_ui", "coverage", "migration-tests", "paths-filter"]
if: needs.paths-filter.outputs.server == 'true' || needs.paths-filter.outputs.frontend == 'true' if: (needs.paths-filter.outputs.server == 'true' || needs.paths-filter.outputs.frontend == 'true' || needs.paths-filter.outputs.force == 'true') && (needs.platform_ui.result == 'success' || needs.coverage.result == 'success' || needs.migration-tests.result == 'success')
steps: steps:
- name: Finish coverage reporting - name: Finish coverage reporting
uses: coverallsapp/github-action@3dfc5567390f6fa9267c0ee9c251e4c8c3f18949 # pin@v2.2.3 uses: coverallsapp/github-action@3dfc5567390f6fa9267c0ee9c251e4c8c3f18949 # pin@v2.2.3
with: with:
github-token: ${{ secrets.GITHUB_TOKEN }} github-token: ${{ secrets.GITHUB_TOKEN }}
carryforward: "pui,backend" carryforward: "pui,backend,migrations"
parallel-finished: true parallel-finished: true
git-commit: ${{ github.sha }}
git-branch: ${{ github.ref }}

1
.gitignore vendored
View File

@ -85,6 +85,7 @@ env/
# Locale stats file # Locale stats file
src/backend/InvenTree/InvenTree/locale_stats.json src/backend/InvenTree/InvenTree/locale_stats.json
src/backend/InvenTree/InvenTree/licenses.txt
# node.js # node.js
node_modules/ node_modules/

View File

@ -17,7 +17,7 @@ repos:
- id: check-yaml - id: check-yaml
- id: mixed-line-ending - id: mixed-line-ending
- repo: https://github.com/astral-sh/ruff-pre-commit - repo: https://github.com/astral-sh/ruff-pre-commit
rev: v0.3.4 rev: v0.3.5
hooks: hooks:
- id: ruff-format - id: ruff-format
args: [--preview] args: [--preview]
@ -27,7 +27,7 @@ repos:
--preview --preview
] ]
- repo: https://github.com/astral-sh/uv-pre-commit - repo: https://github.com/astral-sh/uv-pre-commit
rev: v0.1.24 rev: 0.1.29
hooks: hooks:
- id: pip-compile - id: pip-compile
name: pip-compile requirements-dev.in name: pip-compile requirements-dev.in
@ -61,7 +61,7 @@ repos:
- "prettier@^2.4.1" - "prettier@^2.4.1"
- "@trivago/prettier-plugin-sort-imports" - "@trivago/prettier-plugin-sort-imports"
- repo: https://github.com/pre-commit/mirrors-eslint - repo: https://github.com/pre-commit/mirrors-eslint
rev: "v9.0.0-rc.0" rev: "v9.0.0"
hooks: hooks:
- id: eslint - id: eslint
additional_dependencies: additional_dependencies:

View File

@ -14,6 +14,7 @@
[![Maintainability Rating](https://sonarcloud.io/api/project_badges/measure?project=inventree_InvenTree&metric=sqale_rating)](https://sonarcloud.io/summary/new_code?id=inventree_InvenTree) [![Maintainability Rating](https://sonarcloud.io/api/project_badges/measure?project=inventree_InvenTree&metric=sqale_rating)](https://sonarcloud.io/summary/new_code?id=inventree_InvenTree)
[![Coveralls](https://img.shields.io/coveralls/github/inventree/InvenTree)](https://coveralls.io/github/inventree/InvenTree) [![Coveralls](https://img.shields.io/coveralls/github/inventree/InvenTree)](https://coveralls.io/github/inventree/InvenTree)
[![codecov](https://codecov.io/gh/inventree/InvenTree/graph/badge.svg?token=9DZRGUUV7B)](https://codecov.io/gh/inventree/InvenTree)
[![Crowdin](https://badges.crowdin.net/inventree/localized.svg)](https://crowdin.com/project/inventree) [![Crowdin](https://badges.crowdin.net/inventree/localized.svg)](https://crowdin.com/project/inventree)
![GitHub commit activity](https://img.shields.io/github/commit-activity/m/inventree/inventree) ![GitHub commit activity](https://img.shields.io/github/commit-activity/m/inventree/inventree)
[![Docker Pulls](https://img.shields.io/docker/pulls/inventree/inventree)](https://hub.docker.com/r/inventree/inventree) [![Docker Pulls](https://img.shields.io/docker/pulls/inventree/inventree)](https://hub.docker.com/r/inventree/inventree)

28
codecov.yml Normal file
View File

@ -0,0 +1,28 @@
coverage:
status:
project:
default:
target: 82%
github_checks:
annotations: true
flag_management:
default_rules:
carryforward: true
individual_flags:
- name: backend
carryforward: true
statuses:
- type: project
target: 85%
- name: migrations
carryforward: true
statuses:
- type: project
target: 50%
- name: pui
carryforward: true
statuses:
- type: project
target: 45%

View File

@ -33,6 +33,8 @@ ENV INVENTREE_MEDIA_ROOT="${INVENTREE_DATA_DIR}/media"
ENV INVENTREE_BACKUP_DIR="${INVENTREE_DATA_DIR}/backup" ENV INVENTREE_BACKUP_DIR="${INVENTREE_DATA_DIR}/backup"
ENV INVENTREE_PLUGIN_DIR="${INVENTREE_DATA_DIR}/plugins" ENV INVENTREE_PLUGIN_DIR="${INVENTREE_DATA_DIR}/plugins"
ENV INVENTREE_BACKEND_DIR="${INVENTREE_HOME}/src/backend"
# InvenTree configuration files # InvenTree configuration files
ENV INVENTREE_CONFIG_FILE="${INVENTREE_DATA_DIR}/config.yaml" ENV INVENTREE_CONFIG_FILE="${INVENTREE_DATA_DIR}/config.yaml"
ENV INVENTREE_SECRET_KEY_FILE="${INVENTREE_DATA_DIR}/secret_key.txt" ENV INVENTREE_SECRET_KEY_FILE="${INVENTREE_DATA_DIR}/secret_key.txt"
@ -122,19 +124,16 @@ ENV INVENTREE_COMMIT_DATE="${commit_date}"
ENV PATH=/root/.local/bin:$PATH ENV PATH=/root/.local/bin:$PATH
COPY --from=prebuild /root/.local /root/.local COPY --from=prebuild /root/.local /root/.local
ENV INVENTREE_BACKEND_DIR="${INVENTREE_HOME}"
# Copy source code # Copy source code
COPY src/backend/InvenTree ./InvenTree COPY src/backend/InvenTree ${INVENTREE_BACKEND_DIR}/InvenTree
COPY --from=frontend ${INVENTREE_HOME}/src/backend/InvenTree/web/static/web ./src/backend/InvenTree/web/static/web COPY --from=frontend ${INVENTREE_BACKEND_DIR}/InvenTree/web/static/web ${INVENTREE_BACKEND_DIR}/InvenTree/web/static/web
# Launch the production server # Launch the production server
CMD gunicorn -c ./gunicorn.conf.py InvenTree.wsgi -b 0.0.0.0:8000 --chdir ./InvenTree CMD gunicorn -c ./gunicorn.conf.py InvenTree.wsgi -b 0.0.0.0:8000 --chdir ${INVENTREE_BACKEND_DIR}/InvenTree
FROM inventree_base AS dev FROM inventree_base AS dev
ENV INVENTREE_BACKEND_DIR="${INVENTREE_HOME}/src/backend"
# Vite server (for local frontend development) # Vite server (for local frontend development)
EXPOSE 5173 EXPOSE 5173

View File

@ -27,13 +27,13 @@ The following guide provides a streamlined production InvenTree installation, wi
### Required Files ### Required Files
The following files required for this setup are provided with the InvenTree source, located in the `./docker/` directory of the [InvenTree source code](https://github.com/inventree/InvenTree/tree/master/docker/): The following files required for this setup are provided with the InvenTree source, located in the `/contrib/container/` directory of the [InvenTree source code](https://github.com/inventree/InvenTree/tree/master/contrib/container/):
| Filename | Description | | Filename | Description |
| --- | --- | | --- | --- |
| [docker-compose.yml](https://github.com/inventree/InvenTree/blob/master/docker/docker-compose.yml) | The docker compose script | | [docker-compose.yml](https://github.com/inventree/InvenTree/blob/master/contrib/container/docker-compose.yml) | The docker compose script |
| [.env](https://github.com/inventree/InvenTree/blob/master/docker/.env) | Environment variables | | [.env](https://github.com/inventree/InvenTree/blob/master/contrib/container/.env) | Environment variables |
| [Caddyfile](https://github.com/inventree/InvenTree/blob/master/docker/Caddyfile) | Caddy configuration file | | [Caddyfile](https://github.com/inventree/InvenTree/blob/master/contrib/container/Caddyfile) | Caddy configuration file |
Download these files to a directory on your local machine. Download these files to a directory on your local machine.

View File

@ -84,25 +84,48 @@ class InvenTreeResource(ModelResource):
return [f for f in fields if f.column_name not in fields_to_exclude] return [f for f in fields if f.column_name not in fields_to_exclude]
def before_import(self, dataset, using_transactions, dry_run, **kwargs):
"""Run custom code before importing data.
- Determine the list of fields which need to be converted to empty strings
"""
# Construct a map of field names
db_fields = {field.name: field for field in self.Meta.model._meta.fields}
for field_name, field in self.fields.items():
# Skip read-only fields (they cannot be imported)
if field.readonly:
continue
# Determine the name of the associated column in the dataset
column = getattr(field, 'column_name', field_name)
# Determine the attribute name of the associated database field
attribute = getattr(field, 'attribute', field_name)
# Check if the associated database field is a non-nullable string
if db_field := db_fields.get(attribute):
if (
isinstance(db_field, CharField)
and db_field.blank
and not db_field.null
):
if column not in self.CONVERT_NULL_FIELDS:
self.CONVERT_NULL_FIELDS.append(column)
return super().before_import(dataset, using_transactions, dry_run, **kwargs)
def before_import_row(self, row, row_number=None, **kwargs): def before_import_row(self, row, row_number=None, **kwargs):
"""Run custom code before importing each row. """Run custom code before importing each row.
- Convert any null fields to empty strings, for fields which do not support null values - Convert any null fields to empty strings, for fields which do not support null values
""" """
# We can automatically determine which fields might need such a conversion
for field in self.Meta.model._meta.fields:
if (
isinstance(field, CharField)
and field.blank
and not field.null
and field.name not in self.CONVERT_NULL_FIELDS
):
self.CONVERT_NULL_FIELDS.append(field.name)
for field in self.CONVERT_NULL_FIELDS: for field in self.CONVERT_NULL_FIELDS:
if field in row and row[field] is None: if field in row and row[field] is None:
row[field] = '' row[field] = ''
return super().before_import_row(row, row_number, **kwargs)
class CustomRateAdmin(RateAdmin): class CustomRateAdmin(RateAdmin):
"""Admin interface for the Rate class.""" """Admin interface for the Rate class."""

View File

@ -1,6 +1,9 @@
"""Main JSON interface views.""" """Main JSON interface views."""
import json
import logging
import sys import sys
from pathlib import Path
from django.conf import settings from django.conf import settings
from django.db import transaction from django.db import transaction
@ -31,6 +34,60 @@ from .status import check_system_health, is_worker_running
from .version import inventreeApiText from .version import inventreeApiText
from .views import AjaxView from .views import AjaxView
logger = logging.getLogger('inventree')
class LicenseViewSerializer(serializers.Serializer):
"""Serializer for license information."""
backend = serializers.CharField(help_text='Backend licenses texts', read_only=True)
frontend = serializers.CharField(
help_text='Frontend licenses texts', read_only=True
)
class LicenseView(APIView):
"""Simple JSON endpoint for InvenTree license information."""
permission_classes = [permissions.IsAuthenticated]
def read_license_file(self, path: Path) -> list:
"""Extract license information from the provided file.
Arguments:
path: Path to the license file
Returns: A list of items containing the license information
"""
# Check if the file exists
if not path.exists():
logger.error("License file not found at '%s'", path)
return []
try:
data = json.loads(path.read_text())
except json.JSONDecodeError as e:
logger.exception("Failed to parse license file '%s': %s", path, e)
return []
except Exception as e:
logger.exception("Exception while reading license file '%s': %s", path, e)
return []
# Ensure consistent string between backend and frontend licenses
return [{key.lower(): value for key, value in entry.items()} for entry in data]
@extend_schema(responses={200: OpenApiResponse(response=LicenseViewSerializer)})
def get(self, request, *args, **kwargs):
"""Return information about the InvenTree server."""
backend = Path(__file__).parent.joinpath('licenses.txt')
frontend = Path(__file__).parent.parent.joinpath(
'web/static/web/.vite/dependencies.json'
)
return JsonResponse({
'backend': self.read_license_file(backend),
'frontend': self.read_license_file(frontend),
})
class VersionViewSerializer(serializers.Serializer): class VersionViewSerializer(serializers.Serializer):
"""Serializer for a single version.""" """Serializer for a single version."""

View File

@ -1,11 +1,14 @@
"""InvenTree API version information.""" """InvenTree API version information."""
# InvenTree API version # InvenTree API version
INVENTREE_API_VERSION = 185 INVENTREE_API_VERSION = 186
"""Increment this API version number whenever there is a significant change to the API that any clients need to know about.""" """Increment this API version number whenever there is a significant change to the API that any clients need to know about."""
INVENTREE_API_TEXT = """ INVENTREE_API_TEXT = """
v186 - 2024-03-26 : https://github.com/inventree/InvenTree/pull/6855
- Adds license information to the API
v185 - 2024-03-24 : https://github.com/inventree/InvenTree/pull/6836 v185 - 2024-03-24 : https://github.com/inventree/InvenTree/pull/6836
- Remove /plugin/activate endpoint - Remove /plugin/activate endpoint
- Update docstrings and typing for various API endpoints (no functional changes) - Update docstrings and typing for various API endpoints (no functional changes)

View File

@ -265,6 +265,26 @@ MIDDLEWARE = CONFIG.get(
], ],
) )
# In DEBUG mode, add support for django-querycount
# Ref: https://github.com/bradmontgomery/django-querycount
if DEBUG and get_boolean_setting(
'INVENTREE_DEBUG_QUERYCOUNT', 'debug_querycount', False
):
MIDDLEWARE.append('querycount.middleware.QueryCountMiddleware')
QUERYCOUNT = {
'THRESHOLDS': {
'MEDIUM': 50,
'HIGH': 200,
'MIN_TIME_TO_LOG': 0,
'MIN_QUERY_COUNT_TO_LOG': 0,
},
'IGNORE_REQUEST_PATTERNS': ['^(?!\/(api)?(plugin)?\/).*'],
'IGNORE_SQL_PATTERNS': [],
'DISPLAY_DUPLICATES': 3,
'RESPONSE_HEADER': 'X-Django-Query-Count',
}
AUTHENTICATION_BACKENDS = CONFIG.get( AUTHENTICATION_BACKENDS = CONFIG.get(
'authentication_backends', 'authentication_backends',
[ [

View File

@ -1148,12 +1148,8 @@ class TestSettings(InvenTreeTestCase):
superuser = True superuser = True
def in_env_context(self, envs=None): def in_env_context(self, envs):
"""Patch the env to include the given dict.""" """Patch the env to include the given dict."""
# Set default - see B006
if envs is None:
envs = {}
return mock.patch.dict(os.environ, envs) return mock.patch.dict(os.environ, envs)
def run_reload(self, envs=None): def run_reload(self, envs=None):
@ -1588,15 +1584,15 @@ class ClassValidationMixinTest(TestCase):
def test(self): def test(self):
"""Test function.""" """Test function."""
pass ...
def test1(self): def test1(self):
"""Test function.""" """Test function."""
pass ...
def test2(self): def test2(self):
"""Test function.""" """Test function."""
pass ...
required_attributes = ['NAME'] required_attributes = ['NAME']
required_overrides = [test, [test1, test2]] required_overrides = [test, [test1, test2]]
@ -1616,11 +1612,11 @@ class ClassValidationMixinTest(TestCase):
def test(self): def test(self):
"""Test function.""" """Test function."""
pass ...
def test2(self): def test2(self):
"""Test function.""" """Test function."""
pass ...
TestClass.validate() TestClass.validate()
@ -1643,7 +1639,7 @@ class ClassValidationMixinTest(TestCase):
def test2(self): def test2(self):
"""Test function.""" """Test function."""
pass ...
with self.assertRaisesRegex( with self.assertRaisesRegex(
NotImplementedError, NotImplementedError,

View File

@ -157,12 +157,14 @@ class UserMixin:
if type(assign_all) is not bool: if type(assign_all) is not bool:
# Raise exception if common mistake is made! # Raise exception if common mistake is made!
raise TypeError('assignRole: assign_all must be a boolean value') raise TypeError(
'assignRole: assign_all must be a boolean value'
) # pragma: no cover
if not role and not assign_all: if not role and not assign_all:
raise ValueError( raise ValueError(
'assignRole: either role must be provided, or assign_all must be set' 'assignRole: either role must be provided, or assign_all must be set'
) ) # pragma: no cover
if not assign_all and role: if not assign_all and role:
rule, perm = role.split('.') rule, perm = role.split('.')
@ -241,14 +243,18 @@ class InvenTreeAPITestCase(ExchangeRateMixin, UserMixin, APITestCase):
yield # your test will be run here yield # your test will be run here
if verbose: if verbose:
msg = '\r\n%s' % json.dumps(context.captured_queries, indent=4) msg = '\r\n%s' % json.dumps(
context.captured_queries, indent=4
) # pragma: no cover
else: else:
msg = None msg = None
n = len(context.captured_queries) n = len(context.captured_queries)
if debug: if debug:
print(f'Expected less than {value} queries, got {n} queries') print(
f'Expected less than {value} queries, got {n} queries'
) # pragma: no cover
self.assertLess(n, value, msg=msg) self.assertLess(n, value, msg=msg)
@ -258,7 +264,7 @@ class InvenTreeAPITestCase(ExchangeRateMixin, UserMixin, APITestCase):
if expected_code is None: if expected_code is None:
return return
if expected_code != response.status_code: if expected_code != response.status_code: # pragma: no cover
print( print(
f"Unexpected {method} response at '{url}': status_code = {response.status_code}" f"Unexpected {method} response at '{url}': status_code = {response.status_code}"
) )
@ -280,11 +286,7 @@ class InvenTreeAPITestCase(ExchangeRateMixin, UserMixin, APITestCase):
response = self.client.options(url) response = self.client.options(url)
self.assertEqual(response.status_code, 200) self.assertEqual(response.status_code, 200)
actions = response.data.get('actions', None) actions = response.data.get('actions', {})
if not actions:
actions = {}
return actions return actions
def get(self, url, data=None, expected_code=200, format='json', **kwargs): def get(self, url, data=None, expected_code=200, format='json', **kwargs):

View File

@ -39,7 +39,14 @@ from stock.urls import stock_urls
from web.urls import api_urls as web_api_urls from web.urls import api_urls as web_api_urls
from web.urls import urlpatterns as platform_urls from web.urls import urlpatterns as platform_urls
from .api import APISearchView, InfoView, NotFoundView, VersionTextView, VersionView from .api import (
APISearchView,
InfoView,
LicenseView,
NotFoundView,
VersionTextView,
VersionView,
)
from .magic_login import GetSimpleLoginView from .magic_login import GetSimpleLoginView
from .social_auth_urls import ( from .social_auth_urls import (
EmailListView, EmailListView,
@ -99,6 +106,7 @@ apipatterns = [
name='schema', name='schema',
), ),
# InvenTree information endpoints # InvenTree information endpoints
path('license/', LicenseView.as_view(), name='api-license'), # license info
path( path(
'version-text', VersionTextView.as_view(), name='api-version-text' 'version-text', VersionTextView.as_view(), name='api-version-text'
), # version text ), # version text
@ -377,6 +385,7 @@ if settings.ENABLE_CLASSIC_FRONTEND:
classic_frontendpatterns = [ classic_frontendpatterns = [
# Apps # Apps
#
path('build/', include(build_urls)), path('build/', include(build_urls)),
path('common/', include(common_urls)), path('common/', include(common_urls)),
path('company/', include(company_urls)), path('company/', include(company_urls)),

View File

@ -46,7 +46,7 @@ class NewsFeedTests(TestCase):
"""Tests that news feed is updated when accessing a valid URL.""" """Tests that news feed is updated when accessing a valid URL."""
try: try:
common_tasks.update_news_feed() common_tasks.update_news_feed()
except Exception as ex: except Exception as ex: # pragma: no cover
self.fail(f'News feed raised exceptions: {ex}') self.fail(f'News feed raised exceptions: {ex}')
self.assertNotEqual(NewsFeedEntry.objects.all().count(), 0) self.assertNotEqual(NewsFeedEntry.objects.all().count(), 0)

View File

@ -1048,18 +1048,18 @@ class ColorThemeTest(TestCase):
"""Test that default choices are returned.""" """Test that default choices are returned."""
result = ColorTheme.get_color_themes_choices() result = ColorTheme.get_color_themes_choices()
# skip # skip due to directories not being set up
if not result: if not result:
return return # pragma: no cover
self.assertIn(('default', 'Default'), result) self.assertIn(('default', 'Default'), result)
def test_valid_choice(self): def test_valid_choice(self):
"""Check that is_valid_choice works correctly.""" """Check that is_valid_choice works correctly."""
result = ColorTheme.get_color_themes_choices() result = ColorTheme.get_color_themes_choices()
# skip # skip due to directories not being set up
if not result: if not result:
return return # pragma: no cover
# check wrong reference # check wrong reference
self.assertFalse(ColorTheme.is_valid_choice('abcdd')) self.assertFalse(ColorTheme.is_valid_choice('abcdd'))
@ -1099,10 +1099,12 @@ class CurrencyAPITests(InvenTreeAPITestCase):
# Exit early # Exit early
return return
# Delay and try again # Delay and try again - might have problems with exchange rate endpoint
time.sleep(10) time.sleep(10) # pragma: no cover
raise TimeoutError('Could not refresh currency exchange data after 5 attempts') raise TimeoutError(
'Could not refresh currency exchange data after 5 attempts'
) # pragma: no cover
class NotesImageTest(InvenTreeAPITestCase): class NotesImageTest(InvenTreeAPITestCase):

View File

@ -5,9 +5,6 @@ from InvenTree.unit_test import InvenTreeTestCase
from .transition import StateTransitionMixin, TransitionMethod, storage from .transition import StateTransitionMixin, TransitionMethod, storage
# Global variables to determine which transition classes raises an exception # Global variables to determine which transition classes raises an exception
global raise_storage
global raise_function
raise_storage = False raise_storage = False
raise_function = False raise_function = False
@ -90,7 +87,7 @@ class TransitionTests(InvenTreeTestCase):
if raise_function: if raise_function:
return 1234 return 1234
else: else:
return False return False # pragma: no cover # Return false to keep other transitions working
storage.collect() storage.collect()
self.assertIn(ValidImplementationNoEffect, storage.list) self.assertIn(ValidImplementationNoEffect, storage.list)

View File

@ -23,7 +23,7 @@ class GeneralStatus(StatusCode):
def GHI(self): # This should be ignored def GHI(self): # This should be ignored
"""A invalid function.""" """A invalid function."""
pass ...
class GeneralStateTest(InvenTreeTestCase): class GeneralStateTest(InvenTreeTestCase):

View File

@ -64,11 +64,6 @@ class LabelTest(InvenTreeAPITestCase):
response = self.get(url, {'enabled': False}) response = self.get(url, {'enabled': False})
self.assertEqual(len(response.data), 0) self.assertEqual(len(response.data), 0)
# Disable each report
for label in labels:
label.enabled = False
label.save()
# Filter by "enabled" status # Filter by "enabled" status
response = self.get(url, {'enabled': True}) response = self.get(url, {'enabled': True})
self.assertEqual(len(response.data), 0) self.assertEqual(len(response.data), 0)

View File

@ -143,7 +143,7 @@ class MachineAPITest(TestMachineRegistryMixin, InvenTreeAPITestCase):
for error in errors_msgs: for error in errors_msgs:
if re.match(pattern, error): if re.match(pattern, error):
break break
else: else: # pragma: no cover
errors_str = '\n'.join([f'- {e}' for e in errors_msgs]) errors_str = '\n'.join([f'- {e}' for e in errors_msgs])
self.fail( self.fail(
f"""Error message matching pattern '{pattern}' not found in machine registry errors:\n{errors_str}""" f"""Error message matching pattern '{pattern}' not found in machine registry errors:\n{errors_str}"""

View File

@ -272,15 +272,21 @@ class TestLabelPrinterMachineType(TestMachineRegistryMixin, InvenTreeAPITestCase
self.print_labels.assert_called_once() self.print_labels.assert_called_once()
self.assertEqual(self.print_labels.call_args.args[0], self.machine.machine) self.assertEqual(self.print_labels.call_args.args[0], self.machine.machine)
self.assertEqual(self.print_labels.call_args.args[1], label) self.assertEqual(self.print_labels.call_args.args[1], label)
self.assertQuerySetEqual(
self.print_labels.call_args.args[2], parts, transform=lambda x: x # TODO re-activate test
) # self.assertQuerySetEqual(
# self.print_labels.call_args.args[2], parts, transform=lambda x: x
# )
self.assertIn('printing_options', self.print_labels.call_args.kwargs) self.assertIn('printing_options', self.print_labels.call_args.kwargs)
self.assertEqual( self.assertEqual(
self.print_labels.call_args.kwargs['printing_options'], self.print_labels.call_args.kwargs['printing_options'],
{'copies': 1, 'test_option': 2}, {'copies': 1, 'test_option': 2},
) )
return
# TODO re-activate test
# test the single print label method calls # test the single print label method calls
self.assertEqual(self.print_label.call_count, 2) self.assertEqual(self.print_label.call_count, 2)
self.assertEqual(self.print_label.call_args.args[0], self.machine.machine) self.assertEqual(self.print_label.call_args.args[0], self.machine.machine)

View File

@ -62,16 +62,19 @@ class SettingsMixin:
"""Does this plugin use custom global settings.""" """Does this plugin use custom global settings."""
return bool(self.settings) return bool(self.settings)
def get_setting(self, key, cache=False): def get_setting(self, key, cache=False, backup_value=None):
"""Return the 'value' of the setting associated with this plugin. """Return the 'value' of the setting associated with this plugin.
Arguments: Arguments:
key: The 'name' of the setting value to be retrieved key: The 'name' of the setting value to be retrieved
cache: Whether to use RAM cached value (default = False) cache: Whether to use RAM cached value (default = False)
backup_value: A backup value to return if the setting is not found
""" """
from plugin.models import PluginSetting from plugin.models import PluginSetting
return PluginSetting.get_setting(key, plugin=self.plugin_config(), cache=cache) return PluginSetting.get_setting(
key, plugin=self.plugin_config(), cache=cache, backup_value=backup_value
)
def set_setting(self, key, value, user=None): def set_setting(self, key, value, user=None):
"""Set plugin setting value by key.""" """Set plugin setting value by key."""

View File

@ -11,6 +11,15 @@ from stock.models import StockItem, StockLocation
class LocatePluginTests(InvenTreeAPITestCase): class LocatePluginTests(InvenTreeAPITestCase):
"""Tests for LocateMixin.""" """Tests for LocateMixin."""
def setUp(self):
"""Set up the test case."""
super().setUp()
# Activate plugin
config = registry.get_plugin('samplelocate').plugin_config()
config.active = True
config.save()
fixtures = ['category', 'part', 'location', 'stock'] fixtures = ['category', 'part', 'location', 'stock']
def test_installed(self): def test_installed(self):

View File

@ -554,9 +554,6 @@ class StockItemListTest(StockAPITestCase):
) )
self.assertTrue(len(response.data) < StockItem.objects.count()) self.assertTrue(len(response.data) < StockItem.objects.count())
for result in response.data:
self.assertIsNone(result['location'])
# Filter with "cascade=True" # Filter with "cascade=True"
response = self.get( response = self.get(
self.list_url, {'location': 'null', 'cascade': True}, expected_code=200 self.list_url, {'location': 'null', 'cascade': True}, expected_code=200

View File

@ -26,6 +26,11 @@ class TemplateTagTest(InvenTreeTestCase):
def test_spa_bundle(self): def test_spa_bundle(self):
"""Test the 'spa_bundle' template tag.""" """Test the 'spa_bundle' template tag."""
resp = spa_helper.spa_bundle() resp = spa_helper.spa_bundle()
if not resp:
# No Vite, no test
# TODO: Add a test for the non-Vite case (docker)
return # pragma: no cover
shipped_js = resp.split('<script type="module" src="')[1:] shipped_js = resp.split('<script type="module" src="')[1:]
self.assertTrue(len(shipped_js) > 0) self.assertTrue(len(shipped_js) > 0)
self.assertTrue(len(shipped_js) == 3) self.assertTrue(len(shipped_js) == 3)

View File

@ -1,5 +1,5 @@
{ {
"name": "InvenTree", "name": "backend",
"lockfileVersion": 3, "lockfileVersion": 3,
"requires": true, "requires": true,
"packages": { "packages": {
@ -95,9 +95,9 @@
} }
}, },
"node_modules/@humanwhocodes/object-schema": { "node_modules/@humanwhocodes/object-schema": {
"version": "2.0.2", "version": "2.0.3",
"resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz", "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz",
"integrity": "sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==" "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA=="
}, },
"node_modules/@nodelib/fs.scandir": { "node_modules/@nodelib/fs.scandir": {
"version": "2.1.5", "version": "2.1.5",
@ -472,9 +472,9 @@
"integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==" "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw=="
}, },
"node_modules/fastq": { "node_modules/fastq": {
"version": "1.15.0", "version": "1.17.1",
"resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz",
"integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==",
"dependencies": { "dependencies": {
"reusify": "^1.0.4" "reusify": "^1.0.4"
} }
@ -506,11 +506,12 @@
} }
}, },
"node_modules/flat-cache": { "node_modules/flat-cache": {
"version": "3.0.4", "version": "3.2.0",
"resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz",
"integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==",
"dependencies": { "dependencies": {
"flatted": "^3.1.0", "flatted": "^3.2.9",
"keyv": "^4.5.3",
"rimraf": "^3.0.2" "rimraf": "^3.0.2"
}, },
"engines": { "engines": {
@ -518,9 +519,9 @@
} }
}, },
"node_modules/flatted": { "node_modules/flatted": {
"version": "3.2.7", "version": "3.3.1",
"resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz",
"integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==" "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw=="
}, },
"node_modules/fs.realpath": { "node_modules/fs.realpath": {
"version": "1.0.0", "version": "1.0.0",
@ -672,6 +673,11 @@
"js-yaml": "bin/js-yaml.js" "js-yaml": "bin/js-yaml.js"
} }
}, },
"node_modules/json-buffer": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz",
"integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ=="
},
"node_modules/json-schema-traverse": { "node_modules/json-schema-traverse": {
"version": "0.4.1", "version": "0.4.1",
"resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
@ -682,6 +688,14 @@
"resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
"integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==" "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw=="
}, },
"node_modules/keyv": {
"version": "4.5.4",
"resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz",
"integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==",
"dependencies": {
"json-buffer": "3.0.1"
}
},
"node_modules/levn": { "node_modules/levn": {
"version": "0.4.1", "version": "0.4.1",
"resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",

View File

@ -2,6 +2,7 @@
-c requirements.txt -c requirements.txt
coverage[toml] # Unit test coverage coverage[toml] # Unit test coverage
coveralls==2.1.2 # Coveralls linking (for tracking coverage) # PINNED 2022-06-28 - Old version needed for correct upload coveralls==2.1.2 # Coveralls linking (for tracking coverage) # PINNED 2022-06-28 - Old version needed for correct upload
django-querycount # Display number of URL queries for requests
django-slowtests # Show which unit tests are running slowly django-slowtests # Show which unit tests are running slowly
django-test-migrations # Unit testing for database migrations django-test-migrations # Unit testing for database migrations
isort # python import sorting isort # python import sorting

View File

@ -1,8 +1,8 @@
# This file was autogenerated by uv via the following command: # This file was autogenerated by uv via the following command:
# uv pip compile src/backend/requirements-dev.in -o src/backend/requirements-dev.txt --python-version=3.9 --no-strip-extras # uv pip compile src/backend/requirements-dev.in -o src/backend/requirements-dev.txt --python-version=3.9 --no-strip-extras
asgiref==3.8.0 asgiref==3.8.1
# via django # via django
build==1.1.1 build==1.2.1
# via pip-tools # via pip-tools
certifi==2024.2.2 certifi==2024.2.2
# via requests # via requests
@ -25,17 +25,18 @@ distlib==0.3.8
# via virtualenv # via virtualenv
django==4.2.11 django==4.2.11
# via django-slowtests # via django-slowtests
django-querycount==0.8.3
django-slowtests==1.1.1 django-slowtests==1.1.1
django-test-migrations==1.3.0 django-test-migrations==1.3.0
docopt==0.6.2 docopt==0.6.2
# via coveralls # via coveralls
filelock==3.13.1 filelock==3.13.3
# via virtualenv # via virtualenv
identify==2.5.35 identify==2.5.35
# via pre-commit # via pre-commit
idna==3.6 idna==3.6
# via requests # via requests
importlib-metadata==6.11.0 importlib-metadata==7.0.0
# via build # via build
isort==5.13.2 isort==5.13.2
nodeenv==1.8.0 nodeenv==1.8.0
@ -49,7 +50,7 @@ pip-tools==7.4.1
platformdirs==4.2.0 platformdirs==4.2.0
# via virtualenv # via virtualenv
pre-commit==3.7.0 pre-commit==3.7.0
pycparser==2.21 pycparser==2.22
# via cffi # via cffi
pyproject-hooks==1.0.0 pyproject-hooks==1.0.0
# via # via
@ -72,7 +73,7 @@ tomli==2.0.1
# build # build
# pip-tools # pip-tools
# pyproject-hooks # pyproject-hooks
typing-extensions==4.10.0 typing-extensions==4.11.0
# via # via
# asgiref # asgiref
# django-test-migrations # django-test-migrations

View File

@ -17,7 +17,7 @@ django-maintenance-mode # Shut down application while reloading
django-markdownify # Markdown rendering django-markdownify # Markdown rendering
django-mptt # Modified Preorder Tree Traversal django-mptt # Modified Preorder Tree Traversal
django-markdownify # Markdown rendering django-markdownify # Markdown rendering
django-money>=3.0.0,<3.5.0 # Django app for currency management # FIXED 2023-10-31 3.3.0 breaks due to https://github.com/django-money/django-money/issues/731 django-money>=3.0.0,<3.3.0 # Django app for currency management # FIXED 2023-10-31 3.3.0 breaks due to https://github.com/django-money/django-money/issues/731
django-mptt # Modified Preorder Tree Traversal django-mptt # Modified Preorder Tree Traversal
django-redis>=5.0.0 # Redis integration django-redis>=5.0.0 # Redis integration
django-q2 # Background task scheduling django-q2 # Background task scheduling
@ -41,6 +41,7 @@ gunicorn # Gunicorn web server
pdf2image # PDF to image conversion pdf2image # PDF to image conversion
pillow # Image manipulation pillow # Image manipulation
pint==0.21 # Unit conversion # FIXED 2023-05-30 breaks tests https://github.com/matmair/InvenTree/actions/runs/5095665936/jobs/9160852560 pint==0.21 # Unit conversion # FIXED 2023-05-30 breaks tests https://github.com/matmair/InvenTree/actions/runs/5095665936/jobs/9160852560
pip-licenses # License information for installed packages
python-barcode[images] # Barcode generator python-barcode[images] # Barcode generator
python-dotenv # Environment variable management python-dotenv # Environment variable management
pyyaml>=6.0.1 # YAML parsing pyyaml>=6.0.1 # YAML parsing

View File

@ -1,6 +1,6 @@
# This file was autogenerated by uv via the following command: # This file was autogenerated by uv via the following command:
# uv pip compile src/backend/requirements.in -o src/backend/requirements.txt --python-version=3.9 --no-strip-extras # uv pip compile src/backend/requirements.in -o src/backend/requirements.txt --python-version=3.9 --no-strip-extras
asgiref==3.8.0 asgiref==3.8.1
# via # via
# django # django
# django-cors-headers # django-cors-headers
@ -84,7 +84,7 @@ django-cors-headers==4.3.1
django-crispy-forms==1.14.0 django-crispy-forms==1.14.0
django-dbbackup==4.1.0 django-dbbackup==4.1.0
django-error-report-2==0.4.2 django-error-report-2==0.4.2
django-filter==24.1 django-filter==24.2
django-flags==5.0.13 django-flags==5.0.13
django-formtools==2.5.1 django-formtools==2.5.1
django-ical==1.9.2 django-ical==1.9.2
@ -96,7 +96,7 @@ django-markdownify==0.9.3
django-money==3.2.0 django-money==3.2.0
django-mptt==0.16.0 django-mptt==0.16.0
django-otp==1.3.0 django-otp==1.3.0
django-picklefield==3.1 django-picklefield==3.2
# via django-q2 # via django-q2
django-q-sentry==0.1.6 django-q-sentry==0.1.6
django-q2==1.6.2 django-q2==1.6.2
@ -117,12 +117,12 @@ djangorestframework==3.14.0
# djangorestframework-simplejwt # djangorestframework-simplejwt
# drf-spectacular # drf-spectacular
djangorestframework-simplejwt[crypto]==5.3.1 djangorestframework-simplejwt[crypto]==5.3.1
drf-spectacular==0.27.1 drf-spectacular==0.27.2
dulwich==0.21.7 dulwich==0.21.7
et-xmlfile==1.1.0 et-xmlfile==1.1.0
# via openpyxl # via openpyxl
feedparser==6.0.11 feedparser==6.0.11
fonttools[woff]==4.50.0 fonttools[woff]==4.51.0
# via weasyprint # via weasyprint
googleapis-common-protos==1.63.0 googleapis-common-protos==1.63.0
# via # via
@ -137,7 +137,7 @@ icalendar==5.0.12
# via django-ical # via django-ical
idna==3.6 idna==3.6
# via requests # via requests
importlib-metadata==6.11.0 importlib-metadata==7.0.0
# via # via
# django-q2 # django-q2
# markdown # markdown
@ -164,7 +164,7 @@ odfpy==1.4.1
# via tablib # via tablib
openpyxl==3.1.2 openpyxl==3.1.2
# via tablib # via tablib
opentelemetry-api==1.23.0 opentelemetry-api==1.24.0
# via # via
# opentelemetry-exporter-otlp-proto-grpc # opentelemetry-exporter-otlp-proto-grpc
# opentelemetry-exporter-otlp-proto-http # opentelemetry-exporter-otlp-proto-http
@ -174,43 +174,43 @@ opentelemetry-api==1.23.0
# opentelemetry-instrumentation-requests # opentelemetry-instrumentation-requests
# opentelemetry-instrumentation-wsgi # opentelemetry-instrumentation-wsgi
# opentelemetry-sdk # opentelemetry-sdk
opentelemetry-exporter-otlp==1.23.0 opentelemetry-exporter-otlp==1.24.0
opentelemetry-exporter-otlp-proto-common==1.23.0 opentelemetry-exporter-otlp-proto-common==1.24.0
# via # via
# opentelemetry-exporter-otlp-proto-grpc # opentelemetry-exporter-otlp-proto-grpc
# opentelemetry-exporter-otlp-proto-http # opentelemetry-exporter-otlp-proto-http
opentelemetry-exporter-otlp-proto-grpc==1.23.0 opentelemetry-exporter-otlp-proto-grpc==1.24.0
# via opentelemetry-exporter-otlp # via opentelemetry-exporter-otlp
opentelemetry-exporter-otlp-proto-http==1.23.0 opentelemetry-exporter-otlp-proto-http==1.24.0
# via opentelemetry-exporter-otlp # via opentelemetry-exporter-otlp
opentelemetry-instrumentation==0.44b0 opentelemetry-instrumentation==0.45b0
# via # via
# opentelemetry-instrumentation-django # opentelemetry-instrumentation-django
# opentelemetry-instrumentation-redis # opentelemetry-instrumentation-redis
# opentelemetry-instrumentation-requests # opentelemetry-instrumentation-requests
# opentelemetry-instrumentation-wsgi # opentelemetry-instrumentation-wsgi
opentelemetry-instrumentation-django==0.44b0 opentelemetry-instrumentation-django==0.45b0
opentelemetry-instrumentation-redis==0.44b0 opentelemetry-instrumentation-redis==0.45b0
opentelemetry-instrumentation-requests==0.44b0 opentelemetry-instrumentation-requests==0.45b0
opentelemetry-instrumentation-wsgi==0.44b0 opentelemetry-instrumentation-wsgi==0.45b0
# via opentelemetry-instrumentation-django # via opentelemetry-instrumentation-django
opentelemetry-proto==1.23.0 opentelemetry-proto==1.24.0
# via # via
# opentelemetry-exporter-otlp-proto-common # opentelemetry-exporter-otlp-proto-common
# opentelemetry-exporter-otlp-proto-grpc # opentelemetry-exporter-otlp-proto-grpc
# opentelemetry-exporter-otlp-proto-http # opentelemetry-exporter-otlp-proto-http
opentelemetry-sdk==1.23.0 opentelemetry-sdk==1.24.0
# via # via
# opentelemetry-exporter-otlp-proto-grpc # opentelemetry-exporter-otlp-proto-grpc
# opentelemetry-exporter-otlp-proto-http # opentelemetry-exporter-otlp-proto-http
opentelemetry-semantic-conventions==0.44b0 opentelemetry-semantic-conventions==0.45b0
# via # via
# opentelemetry-instrumentation-django # opentelemetry-instrumentation-django
# opentelemetry-instrumentation-redis # opentelemetry-instrumentation-redis
# opentelemetry-instrumentation-requests # opentelemetry-instrumentation-requests
# opentelemetry-instrumentation-wsgi # opentelemetry-instrumentation-wsgi
# opentelemetry-sdk # opentelemetry-sdk
opentelemetry-util-http==0.44b0 opentelemetry-util-http==0.45b0
# via # via
# opentelemetry-instrumentation-django # opentelemetry-instrumentation-django
# opentelemetry-instrumentation-requests # opentelemetry-instrumentation-requests
@ -218,7 +218,7 @@ opentelemetry-util-http==0.44b0
packaging==24.0 packaging==24.0
# via gunicorn # via gunicorn
pdf2image==1.17.0 pdf2image==1.17.0
pillow==10.2.0 pillow==10.3.0
# via # via
# django-stdimage # django-stdimage
# pdf2image # pdf2image
@ -226,13 +226,16 @@ pillow==10.2.0
# qrcode # qrcode
# weasyprint # weasyprint
pint==0.21 pint==0.21
pip-licenses==4.4.0
prettytable==3.10.0
# via pip-licenses
protobuf==4.25.3 protobuf==4.25.3
# via # via
# googleapis-common-protos # googleapis-common-protos
# opentelemetry-proto # opentelemetry-proto
py-moneyed==3.0 py-moneyed==3.0
# via django-money # via django-money
pycparser==2.21 pycparser==2.22
# via cffi # via cffi
pydyf==0.9.0 pydyf==0.9.0
# via weasyprint # via weasyprint
@ -279,13 +282,13 @@ requests==2.31.0
# django-allauth # django-allauth
# opentelemetry-exporter-otlp-proto-http # opentelemetry-exporter-otlp-proto-http
# requests-oauthlib # requests-oauthlib
requests-oauthlib==1.4.0 requests-oauthlib==2.0.0
# via django-allauth # via django-allauth
rpds-py==0.18.0 rpds-py==0.18.0
# via # via
# jsonschema # jsonschema
# referencing # referencing
sentry-sdk==1.43.0 sentry-sdk==1.44.1
# via django-q-sentry # via django-q-sentry
setuptools==69.2.0 setuptools==69.2.0
# via # via
@ -309,7 +312,7 @@ tinycss2==1.2.1
# bleach # bleach
# cssselect2 # cssselect2
# weasyprint # weasyprint
typing-extensions==4.10.0 typing-extensions==4.11.0
# via # via
# asgiref # asgiref
# drf-spectacular # drf-spectacular
@ -325,6 +328,8 @@ urllib3==2.2.1
# dulwich # dulwich
# requests # requests
# sentry-sdk # sentry-sdk
wcwidth==0.2.13
# via prettytable
weasyprint==61.2 weasyprint==61.2
# via django-weasyprint # via django-weasyprint
webencodings==0.5.1 webencodings==0.5.1

View File

@ -66,6 +66,7 @@
"@vitejs/plugin-react": "^4.2.1", "@vitejs/plugin-react": "^4.2.1",
"babel-plugin-macros": "^3.1.0", "babel-plugin-macros": "^3.1.0",
"nyc": "^15.1.0", "nyc": "^15.1.0",
"rollup-plugin-license": "^3.3.1",
"typescript": "^5.3.3", "typescript": "^5.3.3",
"vite": "^5.2.7", "vite": "^5.2.7",
"vite-plugin-babel-macros": "^1.0.6", "vite-plugin-babel-macros": "^1.0.6",

View File

@ -0,0 +1,90 @@
import { Trans, t } from '@lingui/macro';
import {
Accordion,
Alert,
Divider,
Group,
LoadingOverlay,
Space,
Stack,
Tabs,
Text
} from '@mantine/core';
import { useQuery } from '@tanstack/react-query';
import { api } from '../../App';
import { ApiEndpoints } from '../../enums/ApiEndpoints';
import { apiUrl } from '../../states/ApiState';
export function LicenceView(entries: Readonly<any[]>) {
return (
<Stack spacing="xs">
<Divider />
{entries?.length > 0 && (
<Accordion variant="contained" defaultValue="-">
{entries?.map((entry: any, index: number) => (
<Accordion.Item key={entry.name} value={`entry-${index}`}>
<Accordion.Control>
<Group position="apart" grow>
<Text>{entry.name}</Text>
<Text>{entry.license}</Text>
<Space />
<Text>{entry.version}</Text>
</Group>
</Accordion.Control>
<Accordion.Panel style={{ whiteSpace: 'pre-line' }}>
{entry.licensetext || t`No license text available`}
</Accordion.Panel>
</Accordion.Item>
))}
</Accordion>
)}
</Stack>
);
}
export function LicenseModal() {
const { data, isFetching, isError } = useQuery({
queryKey: ['license'],
queryFn: () =>
api
.get(apiUrl(ApiEndpoints.license))
.then((res) => res.data ?? {})
.catch(() => {})
});
return (
<Stack spacing="xs">
<Divider />
<LoadingOverlay visible={isFetching} />
{isFetching && (
<Text>
<Trans>Loading license information</Trans>
</Text>
)}
{isError ? (
<Alert color="red" title={t`Error`}>
<Text>
<Trans>Failed to fetch license information</Trans>
</Text>
</Alert>
) : (
<Tabs defaultValue={Object.keys(data)[0] ?? ''}>
<Tabs.List>
{Object.keys(data ?? {}).map((key) => (
<Tabs.Tab key={key} value={key}>
<Trans>{key} Packages</Trans>
</Tabs.Tab>
))}
</Tabs.List>
{Object.keys(data ?? {}).map((key) => (
<Tabs.Panel key={key} value={key}>
{LicenceView(data[key] ?? [])}
</Tabs.Panel>
))}
</Tabs>
)}
</Stack>
);
}

View File

@ -10,6 +10,7 @@ import { ModalsProvider } from '@mantine/modals';
import { Notifications } from '@mantine/notifications'; import { Notifications } from '@mantine/notifications';
import { AboutInvenTreeModal } from '../components/modals/AboutInvenTreeModal'; import { AboutInvenTreeModal } from '../components/modals/AboutInvenTreeModal';
import { LicenseModal } from '../components/modals/LicenseModal';
import { QrCodeModal } from '../components/modals/QrCodeModal'; import { QrCodeModal } from '../components/modals/QrCodeModal';
import { ServerInfoModal } from '../components/modals/ServerInfoModal'; import { ServerInfoModal } from '../components/modals/ServerInfoModal';
import { useLocalState } from '../states/LocalState'; import { useLocalState } from '../states/LocalState';
@ -65,7 +66,8 @@ export function ThemeContext({ children }: { children: JSX.Element }) {
modals={{ modals={{
qr: QrCodeModal, qr: QrCodeModal,
info: ServerInfoModal, info: ServerInfoModal,
about: AboutInvenTreeModal about: AboutInvenTreeModal,
license: LicenseModal
}} }}
> >
{children} {children}

View File

@ -96,8 +96,19 @@ function aboutInvenTree() {
innerProps: {} innerProps: {}
}); });
} }
function licenseInfo() {
return openContextModal({
modal: 'license',
title: (
<StylishText size="xl">
<Trans>License Information</Trans>
</StylishText>
),
size: 'xl',
innerProps: {}
});
}
// TODO @matmair: Add the following pages and adjust the links
export const aboutLinks: DocumentationLinkItem[] = [ export const aboutLinks: DocumentationLinkItem[] = [
{ {
id: 'instance', id: 'instance',
@ -114,8 +125,7 @@ export const aboutLinks: DocumentationLinkItem[] = [
{ {
id: 'licenses', id: 'licenses',
title: <Trans>Licenses</Trans>, title: <Trans>Licenses</Trans>,
description: <Trans>Licenses for packages used by InvenTree</Trans>, description: <Trans>Licenses for dependencies of the service</Trans>,
link: '/licenses', action: licenseInfo
placeholder: true
} }
]; ];

View File

@ -40,6 +40,7 @@ export enum ApiEndpoints {
news = 'news/', news = 'news/',
global_status = 'generic/status/', global_status = 'generic/status/',
version = 'version/', version = 'version/',
license = 'license/',
sso_providers = 'auth/providers/', sso_providers = 'auth/providers/',
group_list = 'user/group/', group_list = 'user/group/',
owner_list = 'user/owner/', owner_list = 'user/owner/',

View File

@ -30,6 +30,7 @@ let loaded_vals = (window.INVENTREE_SETTINGS || {}) as any;
Object.keys(loaded_vals).forEach((key) => { Object.keys(loaded_vals).forEach((key) => {
if (loaded_vals[key] === undefined) { if (loaded_vals[key] === undefined) {
delete loaded_vals[key]; delete loaded_vals[key];
// check for empty server list // check for empty server list
} else if (key === 'server_list' && loaded_vals[key].length === 0) { } else if (key === 'server_list' && loaded_vals[key].length === 0) {
delete loaded_vals[key]; delete loaded_vals[key];

View File

@ -1,4 +1,5 @@
import { setApiDefaults } from '../App'; import { setApiDefaults } from '../App';
import { useServerApiState } from './ApiState';
import { useSessionState } from './SessionState'; import { useSessionState } from './SessionState';
import { useGlobalSettingsState, useUserSettingsState } from './SettingsState'; import { useGlobalSettingsState, useUserSettingsState } from './SettingsState';
import { useGlobalStatusState } from './StatusState'; import { useGlobalStatusState } from './StatusState';
@ -131,6 +132,7 @@ export function fetchGlobalStates() {
setApiDefaults(); setApiDefaults();
useServerApiState.getState().fetchServerApiState();
useUserState.getState().fetchUserState(); useUserState.getState().fetchUserState();
useUserSettingsState.getState().fetchSettings(); useUserSettingsState.getState().fetchSettings();
useGlobalSettingsState.getState().fetchSettings(); useGlobalSettingsState.getState().fetchSettings();

View File

@ -1,5 +1,6 @@
import react from '@vitejs/plugin-react'; import react from '@vitejs/plugin-react';
import { platform, release } from 'node:os'; import { platform, release } from 'node:os';
import license from 'rollup-plugin-license';
import { defineConfig, splitVendorChunkPlugin } from 'vite'; import { defineConfig, splitVendorChunkPlugin } from 'vite';
import istanbul from 'vite-plugin-istanbul'; import istanbul from 'vite-plugin-istanbul';
@ -19,6 +20,19 @@ export default defineConfig({
} }
}), }),
splitVendorChunkPlugin(), splitVendorChunkPlugin(),
license({
sourcemap: true,
thirdParty: {
includePrivate: true,
multipleVersions: true,
output: {
file: '../backend/InvenTree/web/static/web/.vite/dependencies.json',
template(dependencies) {
return JSON.stringify(dependencies);
}
}
}
}),
istanbul({ istanbul({
include: 'src/*', include: 'src/*',
exclude: ['node_modules', 'test/'], exclude: ['node_modules', 'test/'],

View File

@ -19,22 +19,22 @@
picocolors "^1.0.0" picocolors "^1.0.0"
"@babel/compat-data@^7.23.5": "@babel/compat-data@^7.23.5":
version "7.24.1" version "7.24.4"
resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.24.1.tgz#31c1f66435f2a9c329bb5716a6d6186c516c3742" resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.24.4.tgz#6f102372e9094f25d908ca0d34fc74c74606059a"
integrity sha512-Pc65opHDliVpRHuKfzI+gSA4zcgr65O4cl64fFJIWEEh8JoHIHh0Oez1Eo8Arz8zq/JhgKodQaxEwUPRtZylVA== integrity sha512-vg8Gih2MLK+kOkHJp4gBEIkyaIi00jgWot2D9QOmmfLC8jINSOzmCLta6Bvz/JSBCqnegV0L80jhxkol5GWNfQ==
"@babel/core@^7.17.7", "@babel/core@^7.21.0", "@babel/core@^7.23.5", "@babel/core@^7.23.9", "@babel/core@^7.7.5": "@babel/core@^7.17.7", "@babel/core@^7.21.0", "@babel/core@^7.23.5", "@babel/core@^7.23.9", "@babel/core@^7.7.5":
version "7.24.3" version "7.24.4"
resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.24.3.tgz#568864247ea10fbd4eff04dda1e05f9e2ea985c3" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.24.4.tgz#1f758428e88e0d8c563874741bc4ffc4f71a4717"
integrity sha512-5FcvN1JHw2sHJChotgx8Ek0lyuh4kCKelgMTTqhYJJtloNvUfpAFMeNQUtdlIaktwrSV9LtCdqwk48wL2wBacQ== integrity sha512-MBVlMXP+kkl5394RBLSxxk/iLTeVGuXTV3cIDXavPpMMqnSnt6apKgan/U8O3USWZCWZT/TbgfEpKa4uMgN4Dg==
dependencies: dependencies:
"@ampproject/remapping" "^2.2.0" "@ampproject/remapping" "^2.2.0"
"@babel/code-frame" "^7.24.2" "@babel/code-frame" "^7.24.2"
"@babel/generator" "^7.24.1" "@babel/generator" "^7.24.4"
"@babel/helper-compilation-targets" "^7.23.6" "@babel/helper-compilation-targets" "^7.23.6"
"@babel/helper-module-transforms" "^7.23.3" "@babel/helper-module-transforms" "^7.23.3"
"@babel/helpers" "^7.24.1" "@babel/helpers" "^7.24.4"
"@babel/parser" "^7.24.1" "@babel/parser" "^7.24.4"
"@babel/template" "^7.24.0" "@babel/template" "^7.24.0"
"@babel/traverse" "^7.24.1" "@babel/traverse" "^7.24.1"
"@babel/types" "^7.24.0" "@babel/types" "^7.24.0"
@ -44,10 +44,10 @@
json5 "^2.2.3" json5 "^2.2.3"
semver "^6.3.1" semver "^6.3.1"
"@babel/generator@^7.21.1", "@babel/generator@^7.24.1": "@babel/generator@^7.21.1", "@babel/generator@^7.24.1", "@babel/generator@^7.24.4":
version "7.24.1" version "7.24.4"
resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.24.1.tgz#e67e06f68568a4ebf194d1c6014235344f0476d0" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.24.4.tgz#1fc55532b88adf952025d5d2d1e71f946cb1c498"
integrity sha512-DfCRfZsBcrPEHUfuBMgbJ1Ut01Y/itOs+hY2nFLgqsqXd52/iSiVq5TITtUasIUgm+IIKdY2/1I7auiQOEeC9A== integrity sha512-Xd6+v6SnjWVx/nus+y0l1sxMOTOMBkyL4+BIdbALyatQnAe/SRVjANeDPSCYaX+i1iJmuGSKf3Z+E+V/va1Hvw==
dependencies: dependencies:
"@babel/types" "^7.24.0" "@babel/types" "^7.24.0"
"@jridgewell/gen-mapping" "^0.3.5" "@jridgewell/gen-mapping" "^0.3.5"
@ -72,10 +72,10 @@
lru-cache "^5.1.1" lru-cache "^5.1.1"
semver "^6.3.1" semver "^6.3.1"
"@babel/helper-create-class-features-plugin@^7.24.1": "@babel/helper-create-class-features-plugin@^7.24.4":
version "7.24.1" version "7.24.4"
resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.1.tgz#db58bf57137b623b916e24874ab7188d93d7f68f" resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.4.tgz#c806f73788a6800a5cfbbc04d2df7ee4d927cce3"
integrity sha512-1yJa9dX9g//V6fDebXoEfEsxkZHk3Hcbm+zLhyu6qVgYFLvmTALTeV+jNU9e5RnYtioBrGEOdoI2joMSNQ/+aA== integrity sha512-lG75yeuUSVu0pIcbhiYMXBXANHrpUPaOfu7ryAzskCgKUHuAxRQI5ssrtmF0X9UXldPlvT0XM/A4F44OXRt6iQ==
dependencies: dependencies:
"@babel/helper-annotate-as-pure" "^7.22.5" "@babel/helper-annotate-as-pure" "^7.22.5"
"@babel/helper-environment-visitor" "^7.22.20" "@babel/helper-environment-visitor" "^7.22.20"
@ -189,10 +189,10 @@
resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz#907a3fbd4523426285365d1206c423c4c5520307" resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz#907a3fbd4523426285365d1206c423c4c5520307"
integrity sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw== integrity sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==
"@babel/helpers@^7.24.1": "@babel/helpers@^7.24.4":
version "7.24.1" version "7.24.4"
resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.24.1.tgz#183e44714b9eba36c3038e442516587b1e0a1a94" resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.24.4.tgz#dc00907fd0d95da74563c142ef4cd21f2cb856b6"
integrity sha512-BpU09QqEe6ZCHuIHFphEFgvNSrubve1FtyMton26ekZ85gRGi6LrTF7zArARp2YvyFxloeiRmtSCq5sjh1WqIg== integrity sha512-FewdlZbSiwaVGlgT1DPANDuCHaDMiOo+D/IDYRFYjHOuv66xMSJ7fQwwODwRNAPkADIO/z1EoF/l2BCWlWABDw==
dependencies: dependencies:
"@babel/template" "^7.24.0" "@babel/template" "^7.24.0"
"@babel/traverse" "^7.24.1" "@babel/traverse" "^7.24.1"
@ -208,10 +208,10 @@
js-tokens "^4.0.0" js-tokens "^4.0.0"
picocolors "^1.0.0" picocolors "^1.0.0"
"@babel/parser@^7.1.0", "@babel/parser@^7.20.7", "@babel/parser@^7.21.2", "@babel/parser@^7.23.9", "@babel/parser@^7.24.0", "@babel/parser@^7.24.1": "@babel/parser@^7.1.0", "@babel/parser@^7.20.7", "@babel/parser@^7.21.2", "@babel/parser@^7.23.9", "@babel/parser@^7.24.0", "@babel/parser@^7.24.1", "@babel/parser@^7.24.4":
version "7.24.1" version "7.24.4"
resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.24.1.tgz#1e416d3627393fab1cb5b0f2f1796a100ae9133a" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.24.4.tgz#234487a110d89ad5a3ed4a8a566c36b9453e8c88"
integrity sha512-Zo9c7N3xdOIQrNip7Lc9wvRPzlRtovHVE4lkz8WEDr7uYh/GMQhSiIgFxGIArRHYdJE5kxtZjAf8rT0xhdLCzg== integrity sha512-zTvEBcghmeBma9QIGunWevvBAp4/Qu9Bdq+2k0Ot4fVMD6v3dsC9WOcRSKk7tRRyBM/53yKMJko9xOatGQAwSg==
"@babel/plugin-syntax-jsx@^7.16.7", "@babel/plugin-syntax-jsx@^7.22.5", "@babel/plugin-syntax-jsx@^7.23.3", "@babel/plugin-syntax-jsx@^7.24.1": "@babel/plugin-syntax-jsx@^7.16.7", "@babel/plugin-syntax-jsx@^7.22.5", "@babel/plugin-syntax-jsx@^7.23.3", "@babel/plugin-syntax-jsx@^7.24.1":
version "7.24.1" version "7.24.1"
@ -284,12 +284,12 @@
"@babel/helper-plugin-utils" "^7.24.0" "@babel/helper-plugin-utils" "^7.24.0"
"@babel/plugin-transform-typescript@^7.24.1": "@babel/plugin-transform-typescript@^7.24.1":
version "7.24.1" version "7.24.4"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.24.1.tgz#5c05e28bb76c7dfe7d6c5bed9951324fd2d3ab07" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.24.4.tgz#03e0492537a4b953e491f53f2bc88245574ebd15"
integrity sha512-liYSESjX2fZ7JyBFkYG78nfvHlMKE6IpNdTVnxmlYUR+j5ZLsitFbaAE+eJSK2zPPkNWNw4mXL51rQ8WrvdK0w== integrity sha512-79t3CQ8+oBGk/80SQ8MN3Bs3obf83zJ0YZjDmDaEZN8MqhMI760apl5z6a20kFeMXBwJX99VpKT8CKxEBp5H1g==
dependencies: dependencies:
"@babel/helper-annotate-as-pure" "^7.22.5" "@babel/helper-annotate-as-pure" "^7.22.5"
"@babel/helper-create-class-features-plugin" "^7.24.1" "@babel/helper-create-class-features-plugin" "^7.24.4"
"@babel/helper-plugin-utils" "^7.24.0" "@babel/helper-plugin-utils" "^7.24.0"
"@babel/plugin-syntax-typescript" "^7.24.1" "@babel/plugin-syntax-typescript" "^7.24.1"
@ -317,9 +317,9 @@
"@babel/plugin-transform-typescript" "^7.24.1" "@babel/plugin-transform-typescript" "^7.24.1"
"@babel/runtime@^7.10.2", "@babel/runtime@^7.12.0", "@babel/runtime@^7.12.5", "@babel/runtime@^7.13.10", "@babel/runtime@^7.18.3", "@babel/runtime@^7.18.6", "@babel/runtime@^7.20.13", "@babel/runtime@^7.21.0", "@babel/runtime@^7.5.5", "@babel/runtime@^7.8.7": "@babel/runtime@^7.10.2", "@babel/runtime@^7.12.0", "@babel/runtime@^7.12.5", "@babel/runtime@^7.13.10", "@babel/runtime@^7.18.3", "@babel/runtime@^7.18.6", "@babel/runtime@^7.20.13", "@babel/runtime@^7.21.0", "@babel/runtime@^7.5.5", "@babel/runtime@^7.8.7":
version "7.24.1" version "7.24.4"
resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.24.1.tgz#431f9a794d173b53720e69a6464abc6f0e2a5c57" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.24.4.tgz#de795accd698007a66ba44add6cc86542aff1edd"
integrity sha512-+BIznRzyqBf+2wCTxcKE3wDjfGeCoVE61KSHGpkzqrLi8qxqFwBeUFyId2cxkTmm55fzDGnm0+yCxaxygrLUnQ== integrity sha512-dkxf7+hn8mFBwKjs9bvBlArzLVxVbS8usaPUDd5p2a9JCL9tB8OaOVN1isD4+Xyk4ns89/xeOmbQvgdK7IIVdA==
dependencies: dependencies:
regenerator-runtime "^0.14.0" regenerator-runtime "^0.14.0"
@ -476,9 +476,9 @@
"@lezer/highlight" "^1.0.0" "@lezer/highlight" "^1.0.0"
"@codemirror/view@^6.0.0", "@codemirror/view@^6.17.0", "@codemirror/view@^6.23.0": "@codemirror/view@^6.0.0", "@codemirror/view@^6.17.0", "@codemirror/view@^6.23.0":
version "6.26.0" version "6.26.1"
resolved "https://registry.yarnpkg.com/@codemirror/view/-/view-6.26.0.tgz#ab5a85aa8ebfb953cb5534e07d0a3751f9a3869a" resolved "https://registry.yarnpkg.com/@codemirror/view/-/view-6.26.1.tgz#ab99cf35c576bc65f5804ab49db730b65c3fad3f"
integrity sha512-nSSmzONpqsNzshPOxiKhK203R6BvABepugAe34QfQDbNDslyjkqBuKgrK5ZBvqNXpfxz5iLrlGTmEfhbQyH46A== integrity sha512-wLw0t3R9AwOSQThdZ5Onw8QQtem5asE7+bPlnzc57eubPqiuJKIzwjMZ+C42vQett+iva+J8VgFV4RYWDBh5FA==
dependencies: dependencies:
"@codemirror/state" "^6.4.0" "@codemirror/state" "^6.4.0"
style-mod "^4.1.0" style-mod "^4.1.0"
@ -544,9 +544,9 @@
hoist-non-react-statics "^3.3.1" hoist-non-react-statics "^3.3.1"
"@emotion/serialize@^1.1.2", "@emotion/serialize@^1.1.3": "@emotion/serialize@^1.1.2", "@emotion/serialize@^1.1.3":
version "1.1.3" version "1.1.4"
resolved "https://registry.yarnpkg.com/@emotion/serialize/-/serialize-1.1.3.tgz#84b77bfcfe3b7bb47d326602f640ccfcacd5ffb0" resolved "https://registry.yarnpkg.com/@emotion/serialize/-/serialize-1.1.4.tgz#fc8f6d80c492cfa08801d544a05331d1cc7cd451"
integrity sha512-iD4D6QVZFDhcbH0RAG1uVu1CwVLMWUkCvAqqlewO/rxf8+87yIBAlt4+AxMiiKPLs5hFc0owNk/sLLAOROw3cA== integrity sha512-RIN04MBT8g+FnDwgvIUi8czvr1LU1alUMI05LekWB5DGyTm8cCBMCRpq3GqaiyEDRptEXOyXnvZ58GZYu4kBxQ==
dependencies: dependencies:
"@emotion/hash" "^0.9.1" "@emotion/hash" "^0.9.1"
"@emotion/memoize" "^0.8.1" "@emotion/memoize" "^0.8.1"
@ -850,11 +850,6 @@
resolved "https://registry.yarnpkg.com/@floating-ui/utils/-/utils-0.2.1.tgz#16308cea045f0fc777b6ff20a9f25474dd8293d2" resolved "https://registry.yarnpkg.com/@floating-ui/utils/-/utils-0.2.1.tgz#16308cea045f0fc777b6ff20a9f25474dd8293d2"
integrity sha512-9TANp6GPoMtYzQdt54kfAyMmz1+osLlXdg2ENroU7zzrtflTLrrC/lgrIfaSe+Wu0b89GKccT7vxXA0MoAIO+Q== integrity sha512-9TANp6GPoMtYzQdt54kfAyMmz1+osLlXdg2ENroU7zzrtflTLrrC/lgrIfaSe+Wu0b89GKccT7vxXA0MoAIO+Q==
"@fortawesome/fontawesome-common-types@6.5.1":
version "6.5.1"
resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.5.1.tgz#fdb1ec4952b689f5f7aa0bffe46180bb35490032"
integrity sha512-GkWzv+L6d2bI5f/Vk6ikJ9xtl7dfXtoRu3YGE6nq0p/FFqA1ebMOAWg3XgRyb0I6LYyYkiAo+3/KrwuBp8xG7A==
"@fortawesome/fontawesome-common-types@6.5.2": "@fortawesome/fontawesome-common-types@6.5.2":
version "6.5.2" version "6.5.2"
resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.5.2.tgz#eaf2f5699f73cef198454ebc0c414e3688898179" resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.5.2.tgz#eaf2f5699f73cef198454ebc0c414e3688898179"
@ -942,7 +937,7 @@
resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.2.1.tgz#558fb6472ed16a4c850b889530e6b36438c49280" resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.2.1.tgz#558fb6472ed16a4c850b889530e6b36438c49280"
integrity sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A== integrity sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==
"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14": "@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14", "@jridgewell/sourcemap-codec@^1.4.15":
version "1.4.15" version "1.4.15"
resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32"
integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==
@ -986,9 +981,9 @@
"@lezer/lr" "^1.0.0" "@lezer/lr" "^1.0.0"
"@lezer/javascript@^1.0.0": "@lezer/javascript@^1.0.0":
version "1.4.13" version "1.4.14"
resolved "https://registry.yarnpkg.com/@lezer/javascript/-/javascript-1.4.13.tgz#e6459a000e1d7369db3e97b1764da63eeb5afe1b" resolved "https://registry.yarnpkg.com/@lezer/javascript/-/javascript-1.4.14.tgz#d94bf2b6338c1c458e1e9f79f2caf5063f346c3e"
integrity sha512-5IBr8LIO3xJdJH1e9aj/ZNLE4LSbdsx25wFmGRAZsj2zSmwAYjx26JyU/BYOCpRQlu1jcv1z3vy4NB9+UkfRow== integrity sha512-GEdUyspTRgc5dwIGebUk+f3BekvqEWVIYsIuAC3pA8e8wcikGwBZRWRa450L0s8noGWuULwnmi4yjxTnYz9PpA==
dependencies: dependencies:
"@lezer/common" "^1.2.0" "@lezer/common" "^1.2.0"
"@lezer/highlight" "^1.1.3" "@lezer/highlight" "^1.1.3"
@ -1001,33 +996,33 @@
dependencies: dependencies:
"@lezer/common" "^1.0.0" "@lezer/common" "^1.0.0"
"@lingui/babel-plugin-extract-messages@4.7.2": "@lingui/babel-plugin-extract-messages@4.8.0":
version "4.7.2" version "4.8.0"
resolved "https://registry.yarnpkg.com/@lingui/babel-plugin-extract-messages/-/babel-plugin-extract-messages-4.7.2.tgz#747be72efe613a92b10342fcd39c5e6fbf2bcecd" resolved "https://registry.yarnpkg.com/@lingui/babel-plugin-extract-messages/-/babel-plugin-extract-messages-4.8.0.tgz#8e8cf4b335393b5db148b493a93b1348d6875463"
integrity sha512-ZdgILXO0ElrRa16cxsHqEL6tswSJZVrbkrZsZXbqGsRNEXs/7g9vWQLAAgUnF258i14wibqJStArVbDMGqQ/Zw== integrity sha512-xTYhK97eS3/MCaxxgNXPSrsDorYRvhycf3hhbARAi5fCgxFh0MihIoM6NaPrLWndccOD+iHiBlOGhyKa0rVXbw==
"@lingui/cli@^4.7.2": "@lingui/cli@^4.7.2":
version "4.7.2" version "4.8.0"
resolved "https://registry.yarnpkg.com/@lingui/cli/-/cli-4.7.2.tgz#b0a2cb36a077755755ac320368f8befcf84c9154" resolved "https://registry.yarnpkg.com/@lingui/cli/-/cli-4.8.0.tgz#a0a72e7ec53ce9cf0a4a7e3e79e804ace145a1e6"
integrity sha512-b9DlFKKySifpyN3sCDBJX+hWeFoLEXA1KXsJ+3jIdknalsy/ZRAyPpD8jklcwoPgXUgtc0G4thZN+RW5pt4ljg== integrity sha512-MW4KtT9+PKq18XjjL++dHtIiIVIRafOgzwlqZ6aSkYM6pb4Q/F/Glm6cqj3SJTEdmWL5RS/2WrXGkrrMSG2ixg==
dependencies: dependencies:
"@babel/core" "^7.21.0" "@babel/core" "^7.21.0"
"@babel/generator" "^7.21.1" "@babel/generator" "^7.21.1"
"@babel/parser" "^7.21.2" "@babel/parser" "^7.21.2"
"@babel/runtime" "^7.21.0" "@babel/runtime" "^7.21.0"
"@babel/types" "^7.21.2" "@babel/types" "^7.21.2"
"@lingui/babel-plugin-extract-messages" "4.7.2" "@lingui/babel-plugin-extract-messages" "4.8.0"
"@lingui/conf" "4.7.2" "@lingui/conf" "4.8.0"
"@lingui/core" "4.7.2" "@lingui/core" "4.8.0"
"@lingui/format-po" "4.7.2" "@lingui/format-po" "4.8.0"
"@lingui/message-utils" "4.7.2" "@lingui/message-utils" "4.8.0"
babel-plugin-macros "^3.0.1" babel-plugin-macros "^3.0.1"
chalk "^4.1.0" chalk "^4.1.0"
chokidar "3.5.1" chokidar "3.5.1"
cli-table "0.3.6" cli-table "0.3.6"
commander "^10.0.0" commander "^10.0.0"
convert-source-map "^2.0.0" convert-source-map "^2.0.0"
date-fns "^2.16.1" date-fns "^3.6.0"
esbuild "^0.17.10" esbuild "^0.17.10"
glob "^7.1.4" glob "^7.1.4"
inquirer "^7.3.3" inquirer "^7.3.3"
@ -1041,10 +1036,10 @@
ramda "^0.27.1" ramda "^0.27.1"
source-map "^0.8.0-beta.0" source-map "^0.8.0-beta.0"
"@lingui/conf@4.7.2": "@lingui/conf@4.8.0":
version "4.7.2" version "4.8.0"
resolved "https://registry.yarnpkg.com/@lingui/conf/-/conf-4.7.2.tgz#9cf0611c3366b83c3c8a8be203cbbf8f099b0be4" resolved "https://registry.yarnpkg.com/@lingui/conf/-/conf-4.8.0.tgz#d2675806fcafecc6ad29d30d1e273fd28835d20e"
integrity sha512-zlajCM0J7SYPpw/MOslMMJQHUaymdlHS42gWVhE17clKOOBz+xPG5kl7OXI4p3FpPDaP+ZzMMk6Z8bq7r6iSjQ== integrity sha512-7Vfa25kjY0KBHxrIDIF5QM7jCFRkZO5OjmsJ7xnTYwYhU91gytWcCz7pMn20rLW931w+K+QyIGBroHu60Sj3zA==
dependencies: dependencies:
"@babel/runtime" "^7.20.13" "@babel/runtime" "^7.20.13"
chalk "^4.1.0" chalk "^4.1.0"
@ -1053,51 +1048,51 @@
jiti "^1.17.1" jiti "^1.17.1"
lodash.get "^4.4.2" lodash.get "^4.4.2"
"@lingui/core@4.7.2", "@lingui/core@^4.7.1": "@lingui/core@4.8.0", "@lingui/core@^4.7.1":
version "4.7.2" version "4.8.0"
resolved "https://registry.yarnpkg.com/@lingui/core/-/core-4.7.2.tgz#b42272e041dc7a9d698d19d3c2899e5840ae22c0" resolved "https://registry.yarnpkg.com/@lingui/core/-/core-4.8.0.tgz#9d94857e50e82b118d75074cbed41c1358c76ae0"
integrity sha512-6ZClr1NZV9vanMcwiRLpimQl/7Ot1xSKggIYfWDD8hUrDvuPa2FIb59avNmDBrAadcmr4IeJl+z/DmzudZNXbA== integrity sha512-csETD7Vi2SSvH1F+gASGPf9TISoQFxA3YTB7MbRthtqK73TtWbEAmNtztIYPjPtNQemd7GwFztT/X6OANbjYhA==
dependencies: dependencies:
"@babel/runtime" "^7.20.13" "@babel/runtime" "^7.20.13"
"@lingui/message-utils" "4.7.2" "@lingui/message-utils" "4.8.0"
unraw "^3.0.0" unraw "^3.0.0"
"@lingui/format-po@4.7.2": "@lingui/format-po@4.8.0":
version "4.7.2" version "4.8.0"
resolved "https://registry.yarnpkg.com/@lingui/format-po/-/format-po-4.7.2.tgz#e8c4c43b2b5b7cf4254600558a9204ce9e510b25" resolved "https://registry.yarnpkg.com/@lingui/format-po/-/format-po-4.8.0.tgz#00bbee70efe5025f8022b746596aaf51d77f0b9d"
integrity sha512-bpjeNLZNTAImBGXoxtu/XkvWJaduKsZTug7GJegJjScyCh7LNMFeRoJS7NO50YFqqWKfz4GH5KXza2EAmO4NWg== integrity sha512-EnVZInemKaVChkh/kecZqxktwFgsb5dpF9cAm6FVH+xdKvVLKViWPcZSUPR2y4I3YS8eAtfpBapwoyAVeQo68A==
dependencies: dependencies:
"@lingui/conf" "4.7.2" "@lingui/conf" "4.8.0"
"@lingui/message-utils" "4.7.2" "@lingui/message-utils" "4.8.0"
date-fns "^2.29.3" date-fns "^3.6.0"
pofile "^1.1.4" pofile "^1.1.4"
"@lingui/macro@^4.7.2": "@lingui/macro@^4.7.2":
version "4.7.2" version "4.8.0"
resolved "https://registry.yarnpkg.com/@lingui/macro/-/macro-4.7.2.tgz#b28eb590e753245d11b5058b3e1d85fe997583ca" resolved "https://registry.yarnpkg.com/@lingui/macro/-/macro-4.8.0.tgz#00f98bd3bc2b022e03c020e73a9594b61802788e"
integrity sha512-QCwH8cFGrWQNemFLaSnpjRX+rohnbtl+pbTKvdiu2WYH4CVievpx8WHUcTD+hTvFqGUWRKTgCbc3fMxQJnkgmw== integrity sha512-5/MGOzuBAqi7vQhn6/8HO0/pPdqk+bLO7QzLsz8imEL58amaBbQmc0WmQRI4DvUknIQnnqlMx5wSAyXuHridrg==
dependencies: dependencies:
"@babel/runtime" "^7.20.13" "@babel/runtime" "^7.20.13"
"@babel/types" "^7.20.7" "@babel/types" "^7.20.7"
"@lingui/conf" "4.7.2" "@lingui/conf" "4.8.0"
"@lingui/core" "4.7.2" "@lingui/core" "4.8.0"
"@lingui/message-utils" "4.7.2" "@lingui/message-utils" "4.8.0"
"@lingui/message-utils@4.7.2": "@lingui/message-utils@4.8.0":
version "4.7.2" version "4.8.0"
resolved "https://registry.yarnpkg.com/@lingui/message-utils/-/message-utils-4.7.2.tgz#75ec495e59c331009c38ba7169c25ce3aad0145a" resolved "https://registry.yarnpkg.com/@lingui/message-utils/-/message-utils-4.8.0.tgz#2d2004e8b78d37f7f59d1d6184d0c1f25f708a8f"
integrity sha512-/LAKXNNR//JDCUKmfJQ5ucZK9HLcpT35C/YYNhk/2HWPSUdmocz4g7a0+SuFR/IeTOLTtWfSQWQvecl1ITQh/Q== integrity sha512-iGTGhtlREy2MwZU9mgs3jydCmf/ik+7th9z1NznNzUBJVcebLD/KPMWRJEkXHkVghLWeCxulvh8PZ08CmyuCzQ==
dependencies: dependencies:
"@messageformat/parser" "^5.0.0" "@messageformat/parser" "^5.0.0"
js-sha256 "^0.10.1" js-sha256 "^0.10.1"
"@lingui/react@^4.7.2": "@lingui/react@^4.7.2":
version "4.7.2" version "4.8.0"
resolved "https://registry.yarnpkg.com/@lingui/react/-/react-4.7.2.tgz#3e7912e53e60184f9e9f995f34eb538c1e3a0c08" resolved "https://registry.yarnpkg.com/@lingui/react/-/react-4.8.0.tgz#7d9d24f465f6fdbf76cff622f4f8538a65d71546"
integrity sha512-7pbeGQ+vLiaW83yB44LgdA2amBFCp/Mr34WRom14NdOWvMnREt3jUHgAuPd/15TGVkUBqia1vTJSjgF/BabR1A== integrity sha512-GVoGDYZAN9wHrEvQWljxS1CZqZ80yLtK0LS8Y907RLlmD3GXLwNvT63iJUHwRu4710HNdgD7qM7XNOgPZZNu7A==
dependencies: dependencies:
"@babel/runtime" "^7.20.13" "@babel/runtime" "^7.20.13"
"@lingui/core" "4.7.2" "@lingui/core" "4.8.0"
"@mantine/carousel@<7": "@mantine/carousel@<7":
version "6.0.21" version "6.0.21"
@ -1191,11 +1186,11 @@
react-draggable "^4.4.5" react-draggable "^4.4.5"
"@playwright/test@^1.41.2": "@playwright/test@^1.41.2":
version "1.42.1" version "1.43.0"
resolved "https://registry.yarnpkg.com/@playwright/test/-/test-1.42.1.tgz#9eff7417bcaa770e9e9a00439e078284b301f31c" resolved "https://registry.yarnpkg.com/@playwright/test/-/test-1.43.0.tgz#5d90f247b26d404dd5d81c60f9c7c5e5159eb664"
integrity sha512-Gq9rmS54mjBL/7/MvBaNOBwbfnh7beHvS6oS4srqXFcQHpQCV1+c8JXWE8VLPyRDhgS3H8x8A7hztqI9VnwrAQ== integrity sha512-Ebw0+MCqoYflop7wVKj711ccbNlrwTBCtjY5rlbiY9kHL2bCYxq+qltK6uPsVBGGAOb033H2VO0YobcQVxoW7Q==
dependencies: dependencies:
playwright "1.42.1" playwright "1.43.0"
"@radix-ui/number@1.0.0": "@radix-ui/number@1.0.0":
version "1.0.0" version "1.0.0"
@ -1292,70 +1287,80 @@
resolved "https://registry.yarnpkg.com/@remix-run/router/-/router-1.15.3.tgz#d2509048d69dbb72d5389a14945339f1430b2d3c" resolved "https://registry.yarnpkg.com/@remix-run/router/-/router-1.15.3.tgz#d2509048d69dbb72d5389a14945339f1430b2d3c"
integrity sha512-Oy8rmScVrVxWZVOpEF57ovlnhpZ8CCPlnIIumVcV9nFdiSIrus99+Lw78ekXyGvVDlIsFJbSfmSovJUhCWYV3w== integrity sha512-Oy8rmScVrVxWZVOpEF57ovlnhpZ8CCPlnIIumVcV9nFdiSIrus99+Lw78ekXyGvVDlIsFJbSfmSovJUhCWYV3w==
"@rollup/rollup-android-arm-eabi@4.13.0": "@rollup/rollup-android-arm-eabi@4.14.0":
version "4.13.0" version "4.14.0"
resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.13.0.tgz#b98786c1304b4ff8db3a873180b778649b5dff2b" resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.14.0.tgz#57936f50d0335e2e7bfac496d209606fa516add4"
integrity sha512-5ZYPOuaAqEH/W3gYsRkxQATBW3Ii1MfaT4EQstTnLKViLi2gLSQmlmtTpGucNP3sXEpOiI5tdGhjdE111ekyEg== integrity sha512-jwXtxYbRt1V+CdQSy6Z+uZti7JF5irRKF8hlKfEnF/xJpcNGuuiZMBvuoYM+x9sr9iWGnzrlM0+9hvQ1kgkf1w==
"@rollup/rollup-android-arm64@4.13.0": "@rollup/rollup-android-arm64@4.14.0":
version "4.13.0" version "4.14.0"
resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.13.0.tgz#8833679af11172b1bf1ab7cb3bad84df4caf0c9e" resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.14.0.tgz#81bba83b37382a2d0e30ceced06c8d3d85138054"
integrity sha512-BSbaCmn8ZadK3UAQdlauSvtaJjhlDEjS5hEVVIN3A4bbl3X+otyf/kOJV08bYiRxfejP3DXFzO2jz3G20107+Q== integrity sha512-fI9nduZhCccjzlsA/OuAwtFGWocxA4gqXGTLvOyiF8d+8o0fZUeSztixkYjcGq1fGZY3Tkq4yRvHPFxU+jdZ9Q==
"@rollup/rollup-darwin-arm64@4.13.0": "@rollup/rollup-darwin-arm64@4.14.0":
version "4.13.0" version "4.14.0"
resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.13.0.tgz#ef02d73e0a95d406e0eb4fd61a53d5d17775659b" resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.14.0.tgz#a371bd723a5c4c4a33376da72abfc3938066842b"
integrity sha512-Ovf2evVaP6sW5Ut0GHyUSOqA6tVKfrTHddtmxGQc1CTQa1Cw3/KMCDEEICZBbyppcwnhMwcDce9ZRxdWRpVd6g== integrity sha512-BcnSPRM76/cD2gQC+rQNGBN6GStBs2pl/FpweW8JYuz5J/IEa0Fr4AtrPv766DB/6b2MZ/AfSIOSGw3nEIP8SA==
"@rollup/rollup-darwin-x64@4.13.0": "@rollup/rollup-darwin-x64@4.14.0":
version "4.13.0" version "4.14.0"
resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.13.0.tgz#3ce5b9bcf92b3341a5c1c58a3e6bcce0ea9e7455" resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.14.0.tgz#8baf2fda277c9729125017c65651296282412886"
integrity sha512-U+Jcxm89UTK592vZ2J9st9ajRv/hrwHdnvyuJpa5A2ngGSVHypigidkQJP+YiGL6JODiUeMzkqQzbCG3At81Gg== integrity sha512-LDyFB9GRolGN7XI6955aFeI3wCdCUszFWumWU0deHA8VpR3nWRrjG6GtGjBrQxQKFevnUTHKCfPR4IvrW3kCgQ==
"@rollup/rollup-linux-arm-gnueabihf@4.13.0": "@rollup/rollup-linux-arm-gnueabihf@4.14.0":
version "4.13.0" version "4.14.0"
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.13.0.tgz#3d3d2c018bdd8e037c6bfedd52acfff1c97e4be4" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.14.0.tgz#822830a8f7388d5b81d04c69415408d3bab1079b"
integrity sha512-8wZidaUJUTIR5T4vRS22VkSMOVooG0F4N+JSwQXWSRiC6yfEsFMLTYRFHvby5mFFuExHa/yAp9juSphQQJAijQ== integrity sha512-ygrGVhQP47mRh0AAD0zl6QqCbNsf0eTo+vgwkY6LunBcg0f2Jv365GXlDUECIyoXp1kKwL5WW6rsO429DBY/bA==
"@rollup/rollup-linux-arm64-gnu@4.13.0": "@rollup/rollup-linux-arm64-gnu@4.14.0":
version "4.13.0" version "4.14.0"
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.13.0.tgz#5fc8cc978ff396eaa136d7bfe05b5b9138064143" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.14.0.tgz#e20fbe1bd4414c7119f9e0bba8ad17a6666c8365"
integrity sha512-Iu0Kno1vrD7zHQDxOmvweqLkAzjxEVqNhUIXBsZ8hu8Oak7/5VTPrxOEZXYC1nmrBVJp0ZcL2E7lSuuOVaE3+w== integrity sha512-x+uJ6MAYRlHGe9wi4HQjxpaKHPM3d3JjqqCkeC5gpnnI6OWovLdXTpfa8trjxPLnWKyBsSi5kne+146GAxFt4A==
"@rollup/rollup-linux-arm64-musl@4.13.0": "@rollup/rollup-linux-arm64-musl@4.14.0":
version "4.13.0" version "4.14.0"
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.13.0.tgz#f2ae7d7bed416ffa26d6b948ac5772b520700eef" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.14.0.tgz#13f475596a62e1924f13fe1c8cf2c40e09a99b47"
integrity sha512-C31QrW47llgVyrRjIwiOwsHFcaIwmkKi3PCroQY5aVq4H0A5v/vVVAtFsI1nfBngtoRpeREvZOkIhmRwUKkAdw== integrity sha512-nrRw8ZTQKg6+Lttwqo6a2VxR9tOroa2m91XbdQ2sUUzHoedXlsyvY1fN4xWdqz8PKmf4orDwejxXHjh7YBGUCA==
"@rollup/rollup-linux-riscv64-gnu@4.13.0": "@rollup/rollup-linux-powerpc64le-gnu@4.14.0":
version "4.13.0" version "4.14.0"
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.13.0.tgz#303d57a328ee9a50c85385936f31cf62306d30b6" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.14.0.tgz#6a431c441420d1c510a205e08c6673355a0a2ea9"
integrity sha512-Oq90dtMHvthFOPMl7pt7KmxzX7E71AfyIhh+cPhLY9oko97Zf2C9tt/XJD4RgxhaGeAraAXDtqxvKE1y/j35lA== integrity sha512-xV0d5jDb4aFu84XKr+lcUJ9y3qpIWhttO3Qev97z8DKLXR62LC3cXT/bMZXrjLF9X+P5oSmJTzAhqwUbY96PnA==
"@rollup/rollup-linux-x64-gnu@4.13.0": "@rollup/rollup-linux-riscv64-gnu@4.14.0":
version "4.13.0" version "4.14.0"
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.13.0.tgz#f672f6508f090fc73f08ba40ff76c20b57424778" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.14.0.tgz#53d9448962c3f9ed7a1672269655476ea2d67567"
integrity sha512-yUD/8wMffnTKuiIsl6xU+4IA8UNhQ/f1sAnQebmE/lyQ8abjsVyDkyRkWop0kdMhKMprpNIhPmYlCxgHrPoXoA== integrity sha512-SDDhBQwZX6LPRoPYjAZWyL27LbcBo7WdBFWJi5PI9RPCzU8ijzkQn7tt8NXiXRiFMJCVpkuMkBf4OxSxVMizAw==
"@rollup/rollup-linux-x64-musl@4.13.0": "@rollup/rollup-linux-s390x-gnu@4.14.0":
version "4.13.0" version "4.14.0"
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.13.0.tgz#d2f34b1b157f3e7f13925bca3288192a66755a89" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.14.0.tgz#95f0c133b324da3e7e5c7d12855e0eb71d21a946"
integrity sha512-9RyNqoFNdF0vu/qqX63fKotBh43fJQeYC98hCaf89DYQpv+xu0D8QFSOS0biA7cGuqJFOc1bJ+m2rhhsKcw1hw== integrity sha512-RxB/qez8zIDshNJDufYlTT0ZTVut5eCpAZ3bdXDU9yTxBzui3KhbGjROK2OYTTor7alM7XBhssgoO3CZ0XD3qA==
"@rollup/rollup-win32-arm64-msvc@4.13.0": "@rollup/rollup-linux-x64-gnu@4.14.0":
version "4.13.0" version "4.14.0"
resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.13.0.tgz#8ffecc980ae4d9899eb2f9c4ae471a8d58d2da6b" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.14.0.tgz#820ada75c68ead1acc486e41238ca0d8f8531478"
integrity sha512-46ue8ymtm/5PUU6pCvjlic0z82qWkxv54GTJZgHrQUuZnVH+tvvSP0LsozIDsCBFO4VjJ13N68wqrKSeScUKdA== integrity sha512-C6y6z2eCNCfhZxT9u+jAM2Fup89ZjiG5pIzZIDycs1IwESviLxwkQcFRGLjnDrP+PT+v5i4YFvlcfAs+LnreXg==
"@rollup/rollup-win32-ia32-msvc@4.13.0": "@rollup/rollup-linux-x64-musl@4.14.0":
version "4.13.0" version "4.14.0"
resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.13.0.tgz#a7505884f415662e088365b9218b2b03a88fc6f2" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.14.0.tgz#ca74f22e125efbe94c1148d989ef93329b464443"
integrity sha512-P5/MqLdLSlqxbeuJ3YDeX37srC8mCflSyTrUsgbU1c/U9j6l2g2GiIdYaGD9QjdMQPMSgYm7hgg0551wHyIluw== integrity sha512-i0QwbHYfnOMYsBEyjxcwGu5SMIi9sImDVjDg087hpzXqhBSosxkE7gyIYFHgfFl4mr7RrXksIBZ4DoLoP4FhJg==
"@rollup/rollup-win32-x64-msvc@4.13.0": "@rollup/rollup-win32-arm64-msvc@4.14.0":
version "4.13.0" version "4.14.0"
resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.13.0.tgz#6abd79db7ff8d01a58865ba20a63cfd23d9e2a10" resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.14.0.tgz#269023332297051d037a9593dcba92c10fef726b"
integrity sha512-UKXUQNbO3DOhzLRwHSpa0HnhhCgNODvfoPWv2FCXme8N/ANFfhIPMGuOT+QuKd16+B5yxZ0HdpNlqPvTMS1qfw== integrity sha512-Fq52EYb0riNHLBTAcL0cun+rRwyZ10S9vKzhGKKgeD+XbwunszSY0rVMco5KbOsTlwovP2rTOkiII/fQ4ih/zQ==
"@rollup/rollup-win32-ia32-msvc@4.14.0":
version "4.14.0"
resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.14.0.tgz#d7701438daf964011fd7ca33e3f13f3ff5129e7b"
integrity sha512-e/PBHxPdJ00O9p5Ui43+vixSgVf4NlLsmV6QneGERJ3lnjIua/kim6PRFe3iDueT1rQcgSkYP8ZBBXa/h4iPvw==
"@rollup/rollup-win32-x64-msvc@4.14.0":
version "4.14.0"
resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.14.0.tgz#0bb7ac3cd1c3292db1f39afdabfd03ccea3a3d34"
integrity sha512-aGg7iToJjdklmxlUlJh/PaPNa4PmqHfyRMLunbL3eaMO0gp656+q1zOKkpJ/CVe9CryJv6tAN1HDoR8cNGzkag==
"@sentry-internal/feedback@7.109.0": "@sentry-internal/feedback@7.109.0":
version "7.109.0" version "7.109.0"
@ -1456,17 +1461,17 @@
resolved "https://registry.yarnpkg.com/@tabler/icons/-/icons-3.1.0.tgz#d69d184eae572db6adb452b511562442133cc26d" resolved "https://registry.yarnpkg.com/@tabler/icons/-/icons-3.1.0.tgz#d69d184eae572db6adb452b511562442133cc26d"
integrity sha512-CpZGyS1IVJKFcv88yZ2sYZIpWWhQ6oy76BQKQ5SF0fGgOqgyqKdBGG/YGyyMW632on37MX7VqQIMTzN/uQqmFg== integrity sha512-CpZGyS1IVJKFcv88yZ2sYZIpWWhQ6oy76BQKQ5SF0fGgOqgyqKdBGG/YGyyMW632on37MX7VqQIMTzN/uQqmFg==
"@tanstack/query-core@5.28.13": "@tanstack/query-core@5.29.0":
version "5.28.13" version "5.29.0"
resolved "https://registry.yarnpkg.com/@tanstack/query-core/-/query-core-5.28.13.tgz#15c187c23b87a393e91d0fd2ea6dfc22b8a85b75" resolved "https://registry.yarnpkg.com/@tanstack/query-core/-/query-core-5.29.0.tgz#d0b3d12c07d5a47f42ab0c1ed4f317106f3d4b20"
integrity sha512-C3+CCOcza+mrZ7LglQbjeYEOTEC3LV0VN0eYaIN6GvqAZ8Foegdgch7n6QYPtT4FuLae5ALy+m+ZMEKpD6tMCQ== integrity sha512-WgPTRs58hm9CMzEr5jpISe8HXa3qKQ8CxewdYZeVnA54JrPY9B1CZiwsCoLpLkf0dGRZq+LcX5OiJb0bEsOFww==
"@tanstack/react-query@^5.28.14": "@tanstack/react-query@^5.28.14":
version "5.28.14" version "5.29.0"
resolved "https://registry.yarnpkg.com/@tanstack/react-query/-/react-query-5.28.14.tgz#9585b6300eb8f167ed374e2748043dc8d6476709" resolved "https://registry.yarnpkg.com/@tanstack/react-query/-/react-query-5.29.0.tgz#42b3a2de4ed1d63666f0af04392a34b5e70d49c0"
integrity sha512-cZqt03Igb3I9tM72qNX5TAAmeYl75Z+k4Mv92VkXIXc2hCrv0fIywd7GN3JV1BBJl4mr7Cc+OOKKOPy8sNVOkA== integrity sha512-yxlhHB73jaBla6h5B6zPaGmQjokkzAhMHN4veotkPNiQ3Ac/mCxgABRZPsJJrgCTvhpcncBZcDBFxaR2B37vug==
dependencies: dependencies:
"@tanstack/query-core" "5.28.13" "@tanstack/query-core" "5.29.0"
"@types/babel__core@^7.1.18", "@types/babel__core@^7.20.5": "@types/babel__core@^7.1.18", "@types/babel__core@^7.20.5":
version "7.20.5" version "7.20.5"
@ -1543,9 +1548,9 @@
integrity sha512-a79Yc3TOk6dGdituy8hmTTJXjOkZ7zsFYV10L337ttq/rec8lRMDBpV7fL3uLx6TgbFCa5DU/h8FmIBQPSbU0w== integrity sha512-a79Yc3TOk6dGdituy8hmTTJXjOkZ7zsFYV10L337ttq/rec8lRMDBpV7fL3uLx6TgbFCa5DU/h8FmIBQPSbU0w==
"@types/node@*", "@types/node@^20.12.3": "@types/node@*", "@types/node@^20.12.3":
version "20.12.3" version "20.12.5"
resolved "https://registry.yarnpkg.com/@types/node/-/node-20.12.3.tgz#d6658c2c7776c1cad93534bb45428195ed840c65" resolved "https://registry.yarnpkg.com/@types/node/-/node-20.12.5.tgz#74c4f31ab17955d0b5808cdc8fd2839526ad00b3"
integrity sha512-sD+ia2ubTeWrOu+YMF+MTAB7E+O7qsMqAbMfW7DG3K1URwhZ5hN1pLlRVGbf4wDFzSfikL05M17EyorS86jShw== integrity sha512-BD+BjQ9LS/D8ST9p5uqBxghlN+S42iuNxjsUGjeZobe/ciXzk2qb1B6IXc6AnRLS+yFJRpN2IPEHMzwspfDJNw==
dependencies: dependencies:
undici-types "~5.26.4" undici-types "~5.26.4"
@ -1555,14 +1560,14 @@
integrity sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw== integrity sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==
"@types/prop-types@*": "@types/prop-types@*":
version "15.7.11" version "15.7.12"
resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.11.tgz#2596fb352ee96a1379c657734d4b913a613ad563" resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.12.tgz#12bb1e2be27293c1406acb6af1c3f3a1481d98c6"
integrity sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng== integrity sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==
"@types/react-dom@^18.2.23": "@types/react-dom@^18.2.23":
version "18.2.23" version "18.2.24"
resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.2.23.tgz#112338760f622a16d64271b408355f2f27f6302c" resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.2.24.tgz#8dda8f449ae436a7a6e91efed8035d4ab03ff759"
integrity sha512-ZQ71wgGOTmDYpnav2knkjr3qXdAFu0vsk8Ci5w3pGAIdj7/kKAyn+VsQDhXsmzzzepAiI9leWMmubXz690AI/A== integrity sha512-cN6upcKd8zkGy4HU9F1+/s98Hrp6D4MOcippK4PoE8OZRngohHZpbJn1GsaDLz87MqvHNoT13nHvNqM9ocRHZg==
dependencies: dependencies:
"@types/react" "*" "@types/react" "*"
@ -1769,6 +1774,11 @@ aria-hidden@^1.1.3:
dependencies: dependencies:
tslib "^2.0.0" tslib "^2.0.0"
array-find-index@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1"
integrity sha512-M1HQyIXcBGtVywBt8WVdim+lrNaK7VHp99Qt5pSNziXznKHViIBbXWtfRTpEFpF/c4FdfxNAsCCwPp5phBYJtw==
asynckit@^0.4.0: asynckit@^0.4.0:
version "0.4.0" version "0.4.0"
resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79"
@ -1896,9 +1906,9 @@ camelize@^1.0.0:
integrity sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ== integrity sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==
caniuse-lite@^1.0.30001587: caniuse-lite@^1.0.30001587:
version "1.0.30001599" version "1.0.30001606"
resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001599.tgz#571cf4f3f1506df9bf41fcbb6d10d5d017817bce" resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001606.tgz#b4d5f67ab0746a3b8b5b6d1f06e39c51beb39a9e"
integrity sha512-LRAQHZ4yT1+f9LemSMeqdMpMxZcc4RMWdj4tiFe3G8tNkWK+E58g+/tzotb5cU6TbcVJLr4fySiAW7XmxQvZQA== integrity sha512-LPbwnW4vfpJId225pwjZJOgX1m9sGfbw/RKJvw/t0QhYOOaTXHvkjVGFGPpvwEzufrjvTlsULnVTxdy4/6cqkg==
chalk@^2.4.2: chalk@^2.4.2:
version "2.4.2" version "2.4.2"
@ -2061,6 +2071,11 @@ commander@^10.0.0:
resolved "https://registry.yarnpkg.com/commander/-/commander-10.0.1.tgz#881ee46b4f77d1c1dccc5823433aa39b022cbe06" resolved "https://registry.yarnpkg.com/commander/-/commander-10.0.1.tgz#881ee46b4f77d1c1dccc5823433aa39b022cbe06"
integrity sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug== integrity sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==
commenting@~1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/commenting/-/commenting-1.1.0.tgz#fae14345c6437b8554f30bc6aa6c1e1633033590"
integrity sha512-YeNK4tavZwtH7jEgK1ZINXzLKm6DZdEMfsaaieOsCAN0S8vsY7UeuO3Q7d/M018EFgE+IeUAuBOKkFccBZsUZA==
commondir@^1.0.1: commondir@^1.0.1:
version "1.0.1" version "1.0.1"
resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b"
@ -2140,12 +2155,10 @@ csstype@^3.0.2:
resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.3.tgz#d80ff294d114fb0e6ac500fbf85b60137d7eff81" resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.3.tgz#d80ff294d114fb0e6ac500fbf85b60137d7eff81"
integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw== integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==
date-fns@^2.16.1, date-fns@^2.29.3: date-fns@^3.6.0:
version "2.30.0" version "3.6.0"
resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.30.0.tgz#f367e644839ff57894ec6ac480de40cae4b0f4d0" resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-3.6.0.tgz#f20ca4fe94f8b754951b24240676e8618c0206bf"
integrity sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw== integrity sha512-fRHTG8g/Gif+kSh50gaGEdToemgfj74aRX3swtiouboip5JDLAyDE9F11nHMIcvOaXeOC6D7SpNhi7uFyB7Uww==
dependencies:
"@babel/runtime" "^7.21.0"
dayjs@^1.11.10: dayjs@^1.11.10:
version "1.11.10" version "1.11.10"
@ -2208,27 +2221,27 @@ easymde@^2.18.0:
marked "^4.1.0" marked "^4.1.0"
electron-to-chromium@^1.4.668: electron-to-chromium@^1.4.668:
version "1.4.714" version "1.4.729"
resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.714.tgz#708fdc8d5bdec824e41fe8b1b0e10af508a10946" resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.729.tgz#8477d21e2a50993781950885b2731d92ad532c00"
integrity sha512-OfnVHt+nMRH9Ua5koH/2gKlCAXbG+u1yXwLKyBVqNboBV34ZTwb846RUe8K5mtE1uhz0BXoMarZ13JCQr+sBtQ== integrity sha512-bx7+5Saea/qu14kmPTDHQxkp2UnziG3iajUQu3BxFvCOnpAJdDbMV4rSl+EqFDkkpNNVUFlR1kDfpL59xfy1HA==
embla-carousel-react@^8.0.0: embla-carousel-react@^8.0.0:
version "8.0.0" version "8.0.1"
resolved "https://registry.yarnpkg.com/embla-carousel-react/-/embla-carousel-react-8.0.0.tgz#73abd0a30c2faa37532ae3c4c0b484867e066d5f" resolved "https://registry.yarnpkg.com/embla-carousel-react/-/embla-carousel-react-8.0.1.tgz#6c0420e54079a3f47fad1b4e982be782066f5b2c"
integrity sha512-qT0dii8ZwoCtEIBE6ogjqU2+5IwnGfdt2teKjCzW88JRErflhlCpz8KjWnW8xoRZOP8g0clRtsMEFoAgS/elfA== integrity sha512-cpFQ/HwCsjBjzpu9Z9IHmZ9DaCSf/wo4q+qUTcRW3SsNv+1Q8IY7Y8J2QIyTmz0vOWY7tliu3uE2gqRH7ZDwOQ==
dependencies: dependencies:
embla-carousel "8.0.0" embla-carousel "8.0.1"
embla-carousel-reactive-utils "8.0.0" embla-carousel-reactive-utils "8.0.1"
embla-carousel-reactive-utils@8.0.0: embla-carousel-reactive-utils@8.0.1:
version "8.0.0" version "8.0.1"
resolved "https://registry.yarnpkg.com/embla-carousel-reactive-utils/-/embla-carousel-reactive-utils-8.0.0.tgz#65342e9feb8d2780fcb1d1d6050ce41837385efa" resolved "https://registry.yarnpkg.com/embla-carousel-reactive-utils/-/embla-carousel-reactive-utils-8.0.1.tgz#7fe11dd07bf9f8e95debdc2e4415d608fe8723c6"
integrity sha512-JCw0CqCXI7tbHDRogBb9PoeMLyjEC1vpN0lDOzUjmlfVgtfF+ffLaOK8bVtXVUEbNs/3guGe3NSzA5J5aYzLzw== integrity sha512-KBSkz2h9LwVFkOrwzIJKgXbmEDlIShkreeOHnV8Cph09AdBMzb412nRkcctbeDcuG9x3CVsqLzJrSXnZeYhFPQ==
embla-carousel@8.0.0: embla-carousel@8.0.1:
version "8.0.0" version "8.0.1"
resolved "https://registry.yarnpkg.com/embla-carousel/-/embla-carousel-8.0.0.tgz#164d0faafe3220c2584c08d45a738c9fb4efc344" resolved "https://registry.yarnpkg.com/embla-carousel/-/embla-carousel-8.0.1.tgz#a9dd052d91a97b15c362723611ba7687193dba99"
integrity sha512-ecixcyqS6oKD2nh5Nj5MObcgoSILWNI/GtBxkidn5ytFaCCmwVHo2SecksaQZHcARMMpIR2dWOlSIdA1LkZFUA== integrity sha512-RsaMRyBCd144N95gb3XoI+H9zj3RI4y0qcfvKYEh2tIAIEenL9CW9vwzltCeoYkWYipGdkvup+HGT9ewG1YTEw==
emoji-regex@^8.0.0: emoji-regex@^8.0.0:
version "8.0.0" version "8.0.0"
@ -2481,7 +2494,7 @@ glob-parent@~5.1.0:
dependencies: dependencies:
is-glob "^4.0.1" is-glob "^4.0.1"
glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: glob@^7.1.3, glob@^7.1.4, glob@^7.1.6, glob@~7.2.0:
version "7.2.3" version "7.2.3"
resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b"
integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==
@ -2863,7 +2876,7 @@ lodash.sortby@^4.7.0:
resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438"
integrity sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA== integrity sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==
lodash@^4.17.19, lodash@^4.17.21: lodash@^4.17.19, lodash@^4.17.21, lodash@~4.17.21:
version "4.17.21" version "4.17.21"
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c"
integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==
@ -2897,6 +2910,13 @@ lru-cache@^6.0.0:
dependencies: dependencies:
yallist "^4.0.0" yallist "^4.0.0"
magic-string@~0.30.0:
version "0.30.9"
resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.9.tgz#8927ae21bfdd856310e07a1bc8dd5e73cb6c251d"
integrity sha512-S1+hd+dIrC8EZqKyT9DstTH/0Z+f76kmmvZnkfQVmOpDEF9iVgdYif3Q/pIWHmCoo59bQVGW0kVL3e2nl+9+Sw==
dependencies:
"@jridgewell/sourcemap-codec" "^1.4.15"
make-dir@^3.0.0, make-dir@^3.0.2: make-dir@^3.0.0, make-dir@^3.0.2:
version "3.1.0" version "3.1.0"
resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f"
@ -2958,6 +2978,16 @@ minimatch@^3.0.4, minimatch@^3.1.1:
dependencies: dependencies:
brace-expansion "^1.1.7" brace-expansion "^1.1.7"
mkdirp@~3.0.0:
version "3.0.1"
resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-3.0.1.tgz#e44e4c5607fb279c168241713cc6e0fea9adcb50"
integrity sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==
moment@~2.30.1:
version "2.30.1"
resolved "https://registry.yarnpkg.com/moment/-/moment-2.30.1.tgz#f8c91c07b7a786e30c59926df530b4eac96974ae"
integrity sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==
moo@^0.5.1: moo@^0.5.1:
version "0.5.2" version "0.5.2"
resolved "https://registry.yarnpkg.com/moo/-/moo-0.5.2.tgz#f9fe82473bc7c184b0d32e2215d3f6e67278733c" resolved "https://registry.yarnpkg.com/moo/-/moo-0.5.2.tgz#f9fe82473bc7c184b0d32e2215d3f6e67278733c"
@ -3115,6 +3145,11 @@ package-hash@^4.0.0:
lodash.flattendeep "^4.4.0" lodash.flattendeep "^4.4.0"
release-zalgo "^1.0.0" release-zalgo "^1.0.0"
package-name-regex@~2.0.6:
version "2.0.6"
resolved "https://registry.yarnpkg.com/package-name-regex/-/package-name-regex-2.0.6.tgz#b54bcb04d950e38082b7bb38fa558e01c1679334"
integrity sha512-gFL35q7kbE/zBaPA3UKhp2vSzcPYx2ecbYuwv1ucE9Il6IIgBDweBlH8D68UFGZic2MkllKa2KHCfC1IQBQUYA==
parent-module@^1.0.0: parent-module@^1.0.0:
version "1.0.1" version "1.0.1"
resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2"
@ -3191,17 +3226,17 @@ pkg-up@^3.1.0:
dependencies: dependencies:
find-up "^3.0.0" find-up "^3.0.0"
playwright-core@1.42.1: playwright-core@1.43.0:
version "1.42.1" version "1.43.0"
resolved "https://registry.yarnpkg.com/playwright-core/-/playwright-core-1.42.1.tgz#13c150b93c940a3280ab1d3fbc945bc855c9459e" resolved "https://registry.yarnpkg.com/playwright-core/-/playwright-core-1.43.0.tgz#d8079acb653abebb0b63062e432479647a4e1271"
integrity sha512-mxz6zclokgrke9p1vtdy/COWBH+eOZgYUVVU34C73M+4j4HLlQJHtfcqiqqxpP0o8HhMkflvfbquLX5dg6wlfA== integrity sha512-iWFjyBUH97+pUFiyTqSLd8cDMMOS0r2ZYz2qEsPjH8/bX++sbIJT35MSwKnp1r/OQBAqC5XO99xFbJ9XClhf4w==
playwright@1.42.1: playwright@1.43.0:
version "1.42.1" version "1.43.0"
resolved "https://registry.yarnpkg.com/playwright/-/playwright-1.42.1.tgz#79c828b51fe3830211137550542426111dc8239f" resolved "https://registry.yarnpkg.com/playwright/-/playwright-1.43.0.tgz#2c2efd4ee2a25defd8c24c98ccb342bdd9d435f5"
integrity sha512-PgwB03s2DZBcNRoW+1w9E+VkLBxweib6KTXM0M3tkiT4jVxKSi6PmVJ591J+0u10LUrgxB7dLRbiJqO5s2QPMg== integrity sha512-SiOKHbVjTSf6wHuGCbqrEyzlm6qvXcv7mENP+OZon1I07brfZLGdfWV0l/efAzVx7TF3Z45ov1gPEkku9q25YQ==
dependencies: dependencies:
playwright-core "1.42.1" playwright-core "1.43.0"
optionalDependencies: optionalDependencies:
fsevents "2.3.2" fsevents "2.3.2"
@ -3514,26 +3549,43 @@ rimraf@^3.0.0:
dependencies: dependencies:
glob "^7.1.3" glob "^7.1.3"
rollup-plugin-license@^3.3.1:
version "3.3.1"
resolved "https://registry.yarnpkg.com/rollup-plugin-license/-/rollup-plugin-license-3.3.1.tgz#73b68e33477524198d6f3f9befc905f59bf37c53"
integrity sha512-lwZ/J8QgSnP0unVOH2FQuOBkeiyp0EBvrbYdNU33lOaYD8xP9Zoki+PGoWMD31EUq8Q07GGocSABTYlWMKkwuw==
dependencies:
commenting "~1.1.0"
glob "~7.2.0"
lodash "~4.17.21"
magic-string "~0.30.0"
mkdirp "~3.0.0"
moment "~2.30.1"
package-name-regex "~2.0.6"
spdx-expression-validate "~2.0.0"
spdx-satisfies "~5.0.1"
rollup@^4.13.0: rollup@^4.13.0:
version "4.13.0" version "4.14.0"
resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.13.0.tgz#dd2ae144b4cdc2ea25420477f68d4937a721237a" resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.14.0.tgz#c3e2cd479f1b2358b65c1f810fa05b51603d7be8"
integrity sha512-3YegKemjoQnYKmsBlOHfMLVPPA5xLkQ8MHLLSw/fBrFaVkEayL51DilPpNNLq1exr98F2B1TzrV0FUlN3gWRPg== integrity sha512-Qe7w62TyawbDzB4yt32R0+AbIo6m1/sqO7UPzFS8Z/ksL5mrfhA0v4CavfdmFav3D+ub4QeAgsGEe84DoWe/nQ==
dependencies: dependencies:
"@types/estree" "1.0.5" "@types/estree" "1.0.5"
optionalDependencies: optionalDependencies:
"@rollup/rollup-android-arm-eabi" "4.13.0" "@rollup/rollup-android-arm-eabi" "4.14.0"
"@rollup/rollup-android-arm64" "4.13.0" "@rollup/rollup-android-arm64" "4.14.0"
"@rollup/rollup-darwin-arm64" "4.13.0" "@rollup/rollup-darwin-arm64" "4.14.0"
"@rollup/rollup-darwin-x64" "4.13.0" "@rollup/rollup-darwin-x64" "4.14.0"
"@rollup/rollup-linux-arm-gnueabihf" "4.13.0" "@rollup/rollup-linux-arm-gnueabihf" "4.14.0"
"@rollup/rollup-linux-arm64-gnu" "4.13.0" "@rollup/rollup-linux-arm64-gnu" "4.14.0"
"@rollup/rollup-linux-arm64-musl" "4.13.0" "@rollup/rollup-linux-arm64-musl" "4.14.0"
"@rollup/rollup-linux-riscv64-gnu" "4.13.0" "@rollup/rollup-linux-powerpc64le-gnu" "4.14.0"
"@rollup/rollup-linux-x64-gnu" "4.13.0" "@rollup/rollup-linux-riscv64-gnu" "4.14.0"
"@rollup/rollup-linux-x64-musl" "4.13.0" "@rollup/rollup-linux-s390x-gnu" "4.14.0"
"@rollup/rollup-win32-arm64-msvc" "4.13.0" "@rollup/rollup-linux-x64-gnu" "4.14.0"
"@rollup/rollup-win32-ia32-msvc" "4.13.0" "@rollup/rollup-linux-x64-musl" "4.14.0"
"@rollup/rollup-win32-x64-msvc" "4.13.0" "@rollup/rollup-win32-arm64-msvc" "4.14.0"
"@rollup/rollup-win32-ia32-msvc" "4.14.0"
"@rollup/rollup-win32-x64-msvc" "4.14.0"
fsevents "~2.3.2" fsevents "~2.3.2"
run-async@^2.4.0: run-async@^2.4.0:
@ -3643,6 +3695,54 @@ spawn-wrap@^2.0.0:
signal-exit "^3.0.2" signal-exit "^3.0.2"
which "^2.0.1" which "^2.0.1"
spdx-compare@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/spdx-compare/-/spdx-compare-1.0.0.tgz#2c55f117362078d7409e6d7b08ce70a857cd3ed7"
integrity sha512-C1mDZOX0hnu0ep9dfmuoi03+eOdDoz2yvK79RxbcrVEG1NO1Ph35yW102DHWKN4pk80nwCgeMmSY5L25VE4D9A==
dependencies:
array-find-index "^1.0.2"
spdx-expression-parse "^3.0.0"
spdx-ranges "^2.0.0"
spdx-exceptions@^2.1.0:
version "2.5.0"
resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz#5d607d27fc806f66d7b64a766650fa890f04ed66"
integrity sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==
spdx-expression-parse@^3.0.0:
version "3.0.1"
resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679"
integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==
dependencies:
spdx-exceptions "^2.1.0"
spdx-license-ids "^3.0.0"
spdx-expression-validate@~2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/spdx-expression-validate/-/spdx-expression-validate-2.0.0.tgz#25c9408e1c63fad94fff5517bb7101ffcd23350b"
integrity sha512-b3wydZLM+Tc6CFvaRDBOF9d76oGIHNCLYFeHbftFXUWjnfZWganmDmvtM5sm1cRwJc/VDBMLyGGrsLFd1vOxbg==
dependencies:
spdx-expression-parse "^3.0.0"
spdx-license-ids@^3.0.0:
version "3.0.17"
resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.17.tgz#887da8aa73218e51a1d917502d79863161a93f9c"
integrity sha512-sh8PWc/ftMqAAdFiBu6Fy6JUOYjqDJBJvIhpfDMyHrr0Rbp5liZqd4TjtQ/RgfLjKFZb+LMx5hpml5qOWy0qvg==
spdx-ranges@^2.0.0:
version "2.1.1"
resolved "https://registry.yarnpkg.com/spdx-ranges/-/spdx-ranges-2.1.1.tgz#87573927ba51e92b3f4550ab60bfc83dd07bac20"
integrity sha512-mcdpQFV7UDAgLpXEE/jOMqvK4LBoO0uTQg0uvXUewmEFhpiZx5yJSZITHB8w1ZahKdhfZqP5GPEOKLyEq5p8XA==
spdx-satisfies@~5.0.1:
version "5.0.1"
resolved "https://registry.yarnpkg.com/spdx-satisfies/-/spdx-satisfies-5.0.1.tgz#9feeb2524686c08e5f7933c16248d4fdf07ed6a6"
integrity sha512-Nwor6W6gzFp8XX4neaKQ7ChV4wmpSh2sSDemMFSzHxpTw460jxFYeOn+jq4ybnSSw/5sc3pjka9MQPouksQNpw==
dependencies:
spdx-compare "^1.0.0"
spdx-expression-parse "^3.0.0"
spdx-ranges "^2.0.0"
sprintf-js@~1.0.2: sprintf-js@~1.0.2:
version "1.0.3" version "1.0.3"
resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c"
@ -3794,9 +3894,9 @@ typedarray-to-buffer@^3.1.5:
is-typedarray "^1.0.0" is-typedarray "^1.0.0"
typescript@^5.3.3: typescript@^5.3.3:
version "5.4.3" version "5.4.4"
resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.4.3.tgz#5c6fedd4c87bee01cd7a528a30145521f8e0feff" resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.4.4.tgz#eb2471e7b0a5f1377523700a21669dce30c2d952"
integrity sha512-KrPd3PKaCLr78MalgiwJnA25Nm8HAmdwN3mYUYZgG/wizIo9EainNVQI9/yDavtVFRN2h3k8uf3GLHuhDMgEHg== integrity sha512-dGE2Vv8cpVvw28v8HCPqyb08EzbBURxDpuhJvTrusShUfGnhHBafDsLdS1EhhxyL6BJQE+2cT3dDPAv+MQ6oLw==
typo-js@*: typo-js@*:
version "1.2.4" version "1.2.4"
@ -3892,9 +3992,9 @@ vite-plugin-istanbul@^6.0.0:
test-exclude "^6.0.0" test-exclude "^6.0.0"
vite@^5.2.7: vite@^5.2.7:
version "5.2.7" version "5.2.8"
resolved "https://registry.yarnpkg.com/vite/-/vite-5.2.7.tgz#e1b8a985eb54fcb9467d7f7f009d87485016df6e" resolved "https://registry.yarnpkg.com/vite/-/vite-5.2.8.tgz#a99e09939f1a502992381395ce93efa40a2844aa"
integrity sha512-k14PWOKLI6pMaSzAuGtT+Cf0YmIx12z9YGon39onaJNy8DLBfBJrzg9FQEmkAM5lpHBZs9wksWAsyF/HkpEwJA== integrity sha512-OyZR+c1CE8yeHw5V5t59aXsUPPVTHMDjEZz8MgguLL/Q7NblxhZUlTu9xSPqlsUO/y+X7dlU05jdhvyycD55DA==
dependencies: dependencies:
esbuild "^0.20.1" esbuild "^0.20.1"
postcss "^8.4.38" postcss "^8.4.38"

View File

@ -55,6 +55,9 @@ def apps():
'users', 'users',
'plugin', 'plugin',
'InvenTree', 'InvenTree',
'generic',
'machine',
'web',
] ]
@ -244,6 +247,12 @@ def install(c, uv=False):
# Run plugins install # Run plugins install
plugins(c, uv=uv) plugins(c, uv=uv)
# Compile license information
lic_path = managePyDir().joinpath('InvenTree', 'licenses.txt')
c.run(
f'pip-licenses --format=json --with-license-file --no-license-path > {lic_path}'
)
@task(help={'tests': 'Set up test dataset at the end'}) @task(help={'tests': 'Set up test dataset at the end'})
def setup_dev(c, tests=False): def setup_dev(c, tests=False):