diff --git a/.copier-answers.yml b/.copier-answers.yml index 6ee05b6..d6e4919 100644 --- a/.copier-answers.yml +++ b/.copier-answers.yml @@ -1,20 +1,15 @@ # Changes here will be overwritten by Copier; NEVER EDIT MANUALLY -_commit: v4.2.4 +_commit: v4.3.5 _src_path: https://github.com/jupyterlab/extension-template author_email: datalab@tuwien.ac.at -author_name: Florian Jaeger -data_format: string -file_extension: '' +author_name: Florian Jaeger, Marijana Petojevic, Matthias Matt has_binder: true has_settings: true kind: server labextension_name: grader-labextension -mimetype: '' -mimetype_name: '' project_short_description: Grader Labextension is a JupyterLab extension to enable automatic grading of assignment notebooks. python_name: grader_labextension -repository: https://github.com/TU-Wien-dataLAB/Grader-Labextension +repository: https://github.com/TU-Wien-dataLAB/grader-labextension test: true -viewer_name: '' diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 8d45143..0fc57f2 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -44,4 +44,4 @@ jobs: retention-days: 1 path: | ./dist - !./dist/**/*.md \ No newline at end of file + !./dist/**/*.md diff --git a/.github/workflows/management_issue_assign.yml b/.github/workflows/management_issue_assign.yml deleted file mode 100644 index 897131b..0000000 --- a/.github/workflows/management_issue_assign.yml +++ /dev/null @@ -1,40 +0,0 @@ -name: "Project Management Issue Assign Actions" - -on: - issues: - types: - - assigned - -jobs: - send_issue_to_management_tool: - runs-on: ubuntu-latest - steps: - - name: View issue information - env: - TITLE: ${{ github.event.issue.title }} - BODY: ${{ github.event.issue.body }} - NUMBER: ${{ github.event.issue.number }} - URL: ${{ github.event.issue.html_url }} - ASSIGNEE: ${{ github.event.issue.assignee.login }} - run: | - echo "Issue title: $TITLE" - echo "Issue body: $BODY" - echo "Issue number: $NUMBER" - echo "Issue url: $URL" - echo "Issue assignee: $ASSIGNEE" - - - name: Send issue to GitLab CI - env: - TITLE: ${{ github.event.issue.title }} - BODY: ${{ github.event.issue.body }} - run: | - curl -X POST --fail \ - -F token=${{ secrets.GITLAB_CI_TRIGGER_TOKEN }} \ - -F "ref=main" \ - -F "variables[ACTION]=ASSIGN" \ - -F "variables[TITLE]=$TITLE" \ - -F "variables[DESCRIPTION]=$BODY" \ - -F "variables[ASSIGNEE]=$ASSIGNEE" \ - -F "variables[URL]=$URL" \ - -F "variables[SOURCE]=github" \ - ${{ secrets.GITLAB_CI_TRIGGER_URL }} diff --git a/.github/workflows/management_issue_closure.yml b/.github/workflows/management_issue_closure.yml deleted file mode 100644 index 334d7c2..0000000 --- a/.github/workflows/management_issue_closure.yml +++ /dev/null @@ -1,37 +0,0 @@ -name: "Project Management Issues Closure Actions" - -on: - issues: - types: - - closed - -jobs: - send_issue_to_management_tool: - runs-on: ubuntu-latest - steps: - - name: View issue information - env: - TITLE: ${{ github.event.issue.title }} - BODY: ${{ github.event.issue.body }} - NUMBER: ${{ github.event.issue.number }} - URL: ${{ github.event.issue.html_url }} - run: | - echo "Issue title: $TITLE" - echo "Issue body: $BODY" - echo "Issue number: $NUMBER" - echo "Issue url: $URL" - - - name: Send issue to GitLab CI - env: - TITLE: ${{ github.event.issue.title }} - BODY: ${{ github.event.issue.body }} - run: | - curl -X POST --fail \ - -F token=${{ secrets.GITLAB_CI_TRIGGER_TOKEN }} \ - -F "ref=main" \ - -F "variables[ACTION]=CLOSE" \ - -F "variables[TITLE]=$TITLE" \ - -F "variables[DESCRIPTION]=$BODY" \ - -F "variables[URL]=$URL" \ - -F "variables[SOURCE]=github" \ - ${{ secrets.GITLAB_CI_TRIGGER_URL }} diff --git a/.github/workflows/management_issue_creation.yml b/.github/workflows/management_issue_creation.yml deleted file mode 100644 index 7ff884e..0000000 --- a/.github/workflows/management_issue_creation.yml +++ /dev/null @@ -1,38 +0,0 @@ -name: "Project Management Issue Creation Actions" - -on: - issues: - types: - - opened - - reopened - -jobs: - send_issue_to_management_tool: - runs-on: ubuntu-latest - steps: - - name: View issue information - env: - TITLE: ${{ github.event.issue.title }} - BODY: ${{ github.event.issue.body }} - NUMBER: ${{ github.event.issue.number }} - URL: ${{ github.event.issue.html_url }} - run: | - echo "Issue title: $TITLE" - echo "Issue body: $BODY" - echo "Issue number: $NUMBER" - echo "Issue url: $URL" - - - name: Send issue to GitLab CI - env: - TITLE: ${{ github.event.issue.title }} - BODY: ${{ github.event.issue.body }} - run: | - curl -X POST --fail \ - -F token=${{ secrets.GITLAB_CI_TRIGGER_TOKEN }} \ - -F "ref=main" \ - -F "variables[ACTION]=OPEN" \ - -F "variables[TITLE]=$TITLE" \ - -F "variables[DESCRIPTION]=$BODY" \ - -F "variables[URL]=$URL" \ - -F "variables[SOURCE]=github" \ - ${{ secrets.GITLAB_CI_TRIGGER_URL }} diff --git a/.gitignore b/.gitignore index cc36381..bbaf62c 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ +.vscode/ *.bundle.* lib/ node_modules/ @@ -15,6 +16,11 @@ grader_labextension/_version.py ui-tests/test-results/ ui-tests/playwright-report/ + +jupyterhub_cookie_secret +jupyterhub-proxy.pid +jupyterhub.sqlite + # Created by https://www.gitignore.io/api/python # Edit at https://www.gitignore.io/?templates=python diff --git a/Dockerfile b/Dockerfile index f56f453..533de83 100644 --- a/Dockerfile +++ b/Dockerfile @@ -6,7 +6,7 @@ ARG REGISTRY=quay.io ARG OWNER=jupyter -ARG BASE_CONTAINER=$REGISTRY/$OWNER/datascience-notebook +ARG BASE_CONTAINER=$REGISTRY/$OWNER/datascience-notebook:latest FROM $BASE_CONTAINER USER root @@ -18,10 +18,11 @@ RUN apt-get update &&\ RUN apt-get clean && \ rm -rf /var/lib/apt/lists/* -COPY ./ /Grader-Labextension +COPY ./ /grader-labextension -RUN python3 -m pip install /Grader-Labextension -RUN rm -rf /Grader-Labextension +RUN mamba install nodejs +RUN python3 -m pip install /grader-labextension +RUN rm -rf /grader-labextension WORKDIR /home/jovyan diff --git a/LICENSE b/LICENSE index a699b43..1e2b20c 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ BSD 3-Clause License -Copyright (c) 2024, Florian Jaeger +Copyright (c) 2024, Florian Jaeger, Marijana Petojevic, Matthias Matt All rights reserved. Redistribution and use in source and binary forms, with or without diff --git a/README.md b/README.md index 92248d2..4c8826d 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,9 @@ # grader_labextension -[![Github Actions Status](https://github.com/TU-Wien-dataLAB/Grader-Labextension/workflows/Build/badge.svg)](https://github.com/TU-Wien-dataLAB/Grader-Labextension/actions/workflows/build.yml)[![Binder](https://mybinder.org/badge_logo.svg)](https://mybinder.org/v2/gh/TU-Wien-dataLAB/Grader-Labextension/main?urlpath=lab) +[![Github Actions Status](https://github.com/TU-Wien-dataLAB/grader-labextension/workflows/Build/badge.svg)](https://github.com/TU-Wien-dataLAB/grader-labextension/actions/workflows/build.yml) +[![Binder](https://mybinder.org/badge_logo.svg)](https://mybinder.org/v2/gh/TU-Wien-dataLAB/grader-labextension/main?urlpath=lab) + + Grader Labextension is a JupyterLab extension to enable automatic grading of assignment notebooks. This extension is composed of a Python package named `grader_labextension` diff --git a/RELEASE.md b/RELEASE.md index e7238e9..8f62068 100644 --- a/RELEASE.md +++ b/RELEASE.md @@ -58,52 +58,21 @@ npm publish --access public ## Automated releases with the Jupyter Releaser -The extension repository should already be compatible with the Jupyter Releaser. - -Check out the [workflow documentation](https://jupyter-releaser.readthedocs.io/en/latest/get_started/making_release_from_repo.html) for more information. +The extension repository should already be compatible with the Jupyter Releaser. But +the GitHub repository and the package managers need to be properly set up. Please +follow the instructions of the Jupyter Releaser [checklist](https://jupyter-releaser.readthedocs.io/en/latest/how_to_guides/convert_repo_from_repo.html). Here is a summary of the steps to cut a new release: -- Add tokens to the [Github Secrets](https://docs.github.com/en/actions/security-guides/encrypted-secrets) in the repository: - - `ADMIN_GITHUB_TOKEN` (with "public_repo" and "repo:status" permissions); see the [documentation](https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/creating-a-personal-access-token) - - `NPM_TOKEN` (with "automation" permission); see the [documentation](https://docs.npmjs.com/creating-and-viewing-access-tokens) -- Set up PyPI - -
Using PyPI trusted publisher (modern way) - -- Set up your PyPI project by [adding a trusted publisher](https://docs.pypi.org/trusted-publishers/adding-a-publisher/) - - The _workflow name_ is `publish-release.yml` and the _environment_ should be left blank. -- Ensure the publish release job as `permissions`: `id-token : write` (see the [documentation](https://docs.pypi.org/trusted-publishers/using-a-publisher/)) - -
- -
Using PyPI token (legacy way) - -- If the repo generates PyPI release(s), create a scoped PyPI [token](https://packaging.python.org/guides/publishing-package-distribution-releases-using-github-actions-ci-cd-workflows/#saving-credentials-on-github). We recommend using a scoped token for security reasons. - -- You can store the token as `PYPI_TOKEN` in your fork's `Secrets`. - - - Advanced usage: if you are releasing multiple repos, you can create a secret named `PYPI_TOKEN_MAP` instead of `PYPI_TOKEN` that is formatted as follows: - - ```text - owner1/repo1,token1 - owner2/repo2,token2 - ``` - - If you have multiple Python packages in the same repository, you can point to them as follows: - - ```text - owner1/repo1/path/to/package1,token1 - owner1/repo1/path/to/package2,token2 - ``` - -
- - Go to the Actions panel - Run the "Step 1: Prep Release" workflow - Check the draft changelog - Run the "Step 2: Publish Release" workflow +> [!NOTE] +> Check out the [workflow documentation](https://jupyter-releaser.readthedocs.io/en/latest/get_started/making_release_from_repo.html) +> for more information. + ## Publishing to `conda-forge` If the package is not on conda forge yet, check the documentation to learn how to add it: https://conda-forge.org/docs/maintainer/adding_pkgs.html diff --git a/binder/db.sql b/binder/db.sql new file mode 100644 index 0000000..e61375d --- /dev/null +++ b/binder/db.sql @@ -0,0 +1,139 @@ +PRAGMA foreign_keys=OFF; +BEGIN TRANSACTION; +CREATE TABLE alembic_version ( + version_num VARCHAR(32) NOT NULL, + CONSTRAINT alembic_version_pkc PRIMARY KEY (version_num) +); +INSERT INTO alembic_version VALUES('a0718dae969d'); +CREATE TABLE lecture ( + id INTEGER NOT NULL, + name VARCHAR(255), + code VARCHAR(255), + state VARCHAR(8) NOT NULL, + deleted VARCHAR(7) DEFAULT 'active' NOT NULL, + created_at DATETIME NOT NULL, + updated_at DATETIME NOT NULL, + PRIMARY KEY (id), + UNIQUE (code) +); +INSERT INTO lecture VALUES(1,'lect1','lect1','active','active','2024-11-04 13:11:45.883175','2024-11-04 13:11:45.883180'); +CREATE TABLE assignment ( + id INTEGER NOT NULL, + name VARCHAR(255) NOT NULL, + type VARCHAR(5) DEFAULT 'user' NOT NULL, + lectid INTEGER, + duedate DATETIME, + automatic_grading VARCHAR(10) DEFAULT 'unassisted' NOT NULL, + points DECIMAL(10, 3) NOT NULL, + status VARCHAR(8), + deleted VARCHAR(7) DEFAULT 'active' NOT NULL, + max_submissions INTEGER, + allow_files BOOLEAN NOT NULL, + properties TEXT, + created_at DATETIME NOT NULL, + updated_at DATETIME NOT NULL, settings TEXT DEFAULT '{}' NOT NULL, + PRIMARY KEY (id), + FOREIGN KEY(lectid) REFERENCES lecture (id), + CONSTRAINT u_name_in_lect UNIQUE (name, lectid, deleted) +); +CREATE TABLE takepart ( + username VARCHAR(255) NOT NULL, + lectid INTEGER NOT NULL, + role VARCHAR(255) NOT NULL, + PRIMARY KEY (username, lectid), + FOREIGN KEY(lectid) REFERENCES lecture (id), + FOREIGN KEY(username) REFERENCES user (name) +); +INSERT INTO takepart VALUES('admin',1,'instructor'); +INSERT INTO takepart VALUES('instructor',1,'instructor'); +INSERT INTO takepart VALUES('student',1,'student'); +CREATE TABLE IF NOT EXISTS "group" ( + id INTEGER NOT NULL, + name VARCHAR(255) NOT NULL, + lectid INTEGER NOT NULL, + PRIMARY KEY (id), + FOREIGN KEY(lectid) REFERENCES lecture (id) +); +CREATE TABLE partof ( + username VARCHAR(255) NOT NULL, + group_id INTEGER NOT NULL, + PRIMARY KEY (username, group_id), + FOREIGN KEY(group_id) REFERENCES "group" (id), + FOREIGN KEY(username) REFERENCES user (name) +); +CREATE TABLE submission ( + id INTEGER NOT NULL, + date DATETIME, + auto_status VARCHAR(20) NOT NULL, + manual_status VARCHAR(15) NOT NULL, + edited BOOLEAN, + score DECIMAL(10, 3), + assignid INTEGER, + username VARCHAR(255), + commit_hash VARCHAR(40) NOT NULL, + updated_at DATETIME NOT NULL, grading_score DECIMAL(10, 3), score_scaling DECIMAL(10, 3) DEFAULT '1.0' NOT NULL, feedback_status VARCHAR(17) DEFAULT 'not_generated' NOT NULL, deleted VARCHAR(7) DEFAULT 'active' NOT NULL, + PRIMARY KEY (id), + FOREIGN KEY(assignid) REFERENCES assignment (id), + FOREIGN KEY(username) REFERENCES user (name) +); +CREATE TABLE submission_logs ( + sub_id INTEGER NOT NULL, + logs TEXT, + PRIMARY KEY (sub_id), + FOREIGN KEY(sub_id) REFERENCES submission (id) +); +CREATE TABLE submission_properties ( + sub_id INTEGER NOT NULL, + properties TEXT, + PRIMARY KEY (sub_id), + FOREIGN KEY(sub_id) REFERENCES submission (id) +); +CREATE TABLE api_token ( + username VARCHAR(255), + id INTEGER, + hashed VARCHAR(255), + prefix VARCHAR(16), + client_id VARCHAR(255), + session_id VARCHAR(255), + created DATETIME, + expires_at DATETIME, + last_activity DATETIME, + note VARCHAR(1023), + scopes TEXT, + PRIMARY KEY (id), + FOREIGN KEY(username) REFERENCES user (name) +); +INSERT INTO api_token VALUES('instructor',1,'sha512:1:e1256354cdcaa527:2ff86945adeccfe0d7e145f3309ab2bdbe3ebade042040a66fd59c71653d5e0e86137a46a3669c83747b5c30da514a4cc390f9552705c0186b4154f42e078cc8','EFlj','hub','4518493cdf7944589e435d42c739ea7f','2024-11-04 13:12:05.114740','2024-11-18 13:12:05.113774','2024-11-04 13:12:05.126583','','["identify"]'); +CREATE TABLE oauth_client ( + id INTEGER, + identifier VARCHAR(255), + description VARCHAR(1023), + secret VARCHAR(255), + redirect_uri VARCHAR(1023), + allowed_scopes TEXT, + PRIMARY KEY (id), + UNIQUE (identifier) +); +INSERT INTO oauth_client VALUES(1,'hub','hub','sha512:16384:f0aa7f9c0c4a8803:cb18a221118c0358afa76cbb194189d2a01f0df1ab3f280c4dab96d1bb841282da14a47fd215741ec1c1c24cf843a647a7d248adeb1239acf549a23fce68bb24','http://localhost:8080/hub/oauth_callback',NULL); +CREATE TABLE oauth_code ( + id INTEGER, + client_id VARCHAR(255), + code VARCHAR(36), + expires_at INTEGER, + redirect_uri VARCHAR(1023), + session_id VARCHAR(255), + username VARCHAR(255), + scopes TEXT, + PRIMARY KEY (id), + FOREIGN KEY(client_id) REFERENCES oauth_client (identifier), + FOREIGN KEY(username) REFERENCES user (name) +); +CREATE TABLE IF NOT EXISTS "user" ( + name VARCHAR(255) NOT NULL, + encrypted_auth_state BLOB, + cookie_id VARCHAR(255) NOT NULL, + PRIMARY KEY (name), + CONSTRAINT uq_user_cookie UNIQUE (cookie_id) +); +INSERT INTO user VALUES('instructor',NULL,'0eead4756d8a4e9f8af65949b1d8bdd6'); +COMMIT; diff --git a/binder/environment.yml b/binder/environment.yml index 8b232c4..91e2a9c 100644 --- a/binder/environment.yml +++ b/binder/environment.yml @@ -25,31 +25,22 @@ dependencies: - jupyterlab-geojson=3.4 # Python Kernel - ipykernel=6.24.0 - - xeus-python=0.14.3 - ipywidgets=8 - ipyleaflet=0.17.3 - altair=5.0.1 - bqplot=0.12.40 - - dask=2023.7.0 - matplotlib-base=3.7.1 - pandas=2.0.3 - - python=3.10 + - python=3.11 - scikit-image=0.21.0 - scikit-learn=1.3.0 - seaborn-base=0.12.2 - - sympy=1.12 - traittypes=0.2.1 - # C++ Kernel - - xeus-cling=0.13.0 - - xtensor=0.23.10 - - xtensor-blas=0.19.2 - - xwidgets=0.26.1 - - xleaflet=0.16.0 # CLI tools - pip - vim - git + - sqlite - pip: - - grader-service==0.3.0 - - grader-labextension==0.4.0 - - traitlets==5.9.0 \ No newline at end of file + - grader-service==0.5.1 + - grader-labextension==0.6.1 diff --git a/binder/grader_service_config.py b/binder/grader_service_config.py index 33e521c..ece6f8e 100644 --- a/binder/grader_service_config.py +++ b/binder/grader_service_config.py @@ -1,12 +1,30 @@ +print("Loading config file") + import os from grader_service.autograding.local_grader import LocalAutogradeExecutor c.GraderService.service_host = "127.0.0.1" -c.JupyterHubGroupAuthenticator.hub_api_url = "http://127.0.0.1:8081/hub/api" - -c.LocalAutogradeExecutor.relative_input_path = "convert_in" -c.LocalAutogradeExecutor.relative_output_path = "convert_out" +import os +cwd = os.getcwd() +c.GraderService.grader_service_dir = os.path.join(cwd, "grader_service_dir") c.RequestHandlerConfig.autograde_executor_class = LocalAutogradeExecutor + +c.CeleryApp.conf = dict( + broker_url='amqp://localhost', + result_backend='rpc://', + task_serializer='json', + result_serializer='json', + accept_content=['json'], + broker_connection_retry_on_startup=True, + task_always_eager=True +) +c.CeleryApp.worker_kwargs = dict(concurrency=1, pool="prefork") + +from grader_service.auth.dummy import DummyAuthenticator + +c.GraderService.authenticator_class = DummyAuthenticator +c.Authenticator.allowed_users = {'admin', 'instructor', 'student', 'tutor'} +c.Authenticator.admin_users = {'admin'} diff --git a/binder/hub_auth_mock.py b/binder/hub_auth_mock.py deleted file mode 100644 index 76531be..0000000 --- a/binder/hub_auth_mock.py +++ /dev/null @@ -1,26 +0,0 @@ -import asyncio -import tornado.web - - -class MainHandler(tornado.web.RequestHandler): - def get(self): - print("Returning dummy user") - self.set_header("Content-Type", "application/json") - dummy_user = '{"kind": "user", "admin": true, "groups": ["lect1:instructor"], "name": "instructor"}' - self.write(dummy_user) - - -def make_app(): - return tornado.web.Application([ - (r"/hub/api/user", MainHandler), - ]) - - -async def main(): - app = make_app() - app.listen(8081) - await asyncio.Event().wait() - - -if __name__ == "__main__": - asyncio.run(main()) diff --git a/binder/start b/binder/start index ecbd5b6..06eb614 100644 --- a/binder/start +++ b/binder/start @@ -6,11 +6,13 @@ mkdir "./grader_service_dir" export GRADER_SERVICE_DIRECTORY="$(pwd)/grader_service_dir" export JUPYTERHUB_API_TOKEN="1234" export JUPYTERHUB_API_URL="http://127.0.0.1:4010" - -python3 binder/hub_auth_mock.py & +export GRADER_API_TOKEN="EFljC6HTHSB1EzWzBNNFLaZ5lmLb9k" cd grader_service_dir -grader-service-migrate +# grader-service-migrate + +sqlite3 grader.db < db.sql + cd .. grader-service -f binder/grader_service_config.py & diff --git a/grader_labextension/__init__.py b/grader_labextension/__init__.py index 4ae2e49..56d5fba 100644 --- a/grader_labextension/__init__.py +++ b/grader_labextension/__init__.py @@ -9,11 +9,9 @@ __version__ = "dev" import asyncio -from tornado.httpclient import HTTPClientError from grader_labextension.registry import HandlerPathRegistry from grader_labextension.handlers.base_handler import HandlerConfig -from traitlets.config.loader import Config -from grader_labextension.services.request import RequestService +from grader_labextension.services.request import RequestService, RequestServiceError def _jupyter_labextension_paths(): @@ -62,13 +60,13 @@ async def get_grader_config(): try: response: dict = await request_service.request( "GET", - f"{handler_config.service_base_url}/config", + f"{handler_config.service_base_url}api/config", header=dict( - Authorization="Token " + HandlerConfig.instance().hub_api_token), + Authorization="Token " + HandlerConfig.instance().grader_api_token), ) - except HTTPClientError as e: + except RequestServiceError as e: log.error("Error: could not get grader config") - log.error(e.response) + log.error(e) response = dict() for key, value in response.items(): web_app.settings['page_config_data'][key] = value @@ -81,7 +79,7 @@ async def get_grader_config(): log.info(f'{web_app.settings["server_root_dir"]=}') log.info("base_url: " + base_url) handlers = HandlerPathRegistry.handler_list( - base_url=base_url + "grader_labextension") + base_url=base_url + "grader_labextension/") log.info("Subscribed handlers:") log.info([str(h[0]) for h in handlers]) diff --git a/grader_labextension/api/models/assignment.py b/grader_labextension/api/models/assignment.py index 51b4c1f..6e92aa7 100644 --- a/grader_labextension/api/models/assignment.py +++ b/grader_labextension/api/models/assignment.py @@ -1,11 +1,8 @@ -# coding: utf-8 - -from __future__ import absolute_import from datetime import date, datetime # noqa: F401 from typing import List, Dict # noqa: F401 -from grader_labextension.api.models.base_model_ import Model +from grader_labextension.api.models.base_model import Model from grader_labextension.api.models.assignment_settings import AssignmentSettings from grader_labextension.api import util @@ -90,7 +87,7 @@ def from_dict(cls, dikt) -> 'Assignment': return util.deserialize_model(dikt, cls) @property - def id(self): + def id(self) -> int: """Gets the id of this Assignment. @@ -100,7 +97,7 @@ def id(self): return self._id @id.setter - def id(self, id): + def id(self, id: int): """Sets the id of this Assignment. @@ -111,7 +108,7 @@ def id(self, id): self._id = id @property - def name(self): + def name(self) -> str: """Gets the name of this Assignment. @@ -121,7 +118,7 @@ def name(self): return self._name @name.setter - def name(self, name): + def name(self, name: str): """Sets the name of this Assignment. @@ -132,7 +129,7 @@ def name(self, name): self._name = name @property - def type(self): + def type(self) -> str: """Gets the type of this Assignment. @@ -142,7 +139,7 @@ def type(self): return self._type @type.setter - def type(self, type): + def type(self, type: str): """Sets the type of this Assignment. @@ -159,7 +156,7 @@ def type(self, type): self._type = type @property - def due_date(self): + def due_date(self) -> datetime: """Gets the due_date of this Assignment. @@ -169,7 +166,7 @@ def due_date(self): return self._due_date @due_date.setter - def due_date(self, due_date): + def due_date(self, due_date: datetime): """Sets the due_date of this Assignment. @@ -180,7 +177,7 @@ def due_date(self, due_date): self._due_date = due_date @property - def status(self): + def status(self) -> str: """Gets the status of this Assignment. @@ -190,7 +187,7 @@ def status(self): return self._status @status.setter - def status(self, status): + def status(self, status: str): """Sets the status of this Assignment. @@ -207,7 +204,7 @@ def status(self, status): self._status = status @property - def points(self): + def points(self) -> float: """Gets the points of this Assignment. @@ -217,7 +214,7 @@ def points(self): return self._points @points.setter - def points(self, points): + def points(self, points: float): """Sets the points of this Assignment. @@ -228,7 +225,7 @@ def points(self, points): self._points = points @property - def automatic_grading(self): + def automatic_grading(self) -> str: """Gets the automatic_grading of this Assignment. @@ -238,7 +235,7 @@ def automatic_grading(self): return self._automatic_grading @automatic_grading.setter - def automatic_grading(self, automatic_grading): + def automatic_grading(self, automatic_grading: str): """Sets the automatic_grading of this Assignment. @@ -255,7 +252,7 @@ def automatic_grading(self, automatic_grading): self._automatic_grading = automatic_grading @property - def max_submissions(self): + def max_submissions(self) -> int: """Gets the max_submissions of this Assignment. @@ -265,7 +262,7 @@ def max_submissions(self): return self._max_submissions @max_submissions.setter - def max_submissions(self, max_submissions): + def max_submissions(self, max_submissions: int): """Sets the max_submissions of this Assignment. @@ -276,7 +273,7 @@ def max_submissions(self, max_submissions): self._max_submissions = max_submissions @property - def allow_files(self): + def allow_files(self) -> bool: """Gets the allow_files of this Assignment. @@ -286,7 +283,7 @@ def allow_files(self): return self._allow_files @allow_files.setter - def allow_files(self, allow_files): + def allow_files(self, allow_files: bool): """Sets the allow_files of this Assignment. @@ -297,7 +294,7 @@ def allow_files(self, allow_files): self._allow_files = allow_files @property - def settings(self): + def settings(self) -> AssignmentSettings: """Gets the settings of this Assignment. @@ -307,7 +304,7 @@ def settings(self): return self._settings @settings.setter - def settings(self, settings): + def settings(self, settings: AssignmentSettings): """Sets the settings of this Assignment. diff --git a/grader_labextension/api/models/assignment_detail.py b/grader_labextension/api/models/assignment_detail.py index f5e5ddb..f9cd6ce 100644 --- a/grader_labextension/api/models/assignment_detail.py +++ b/grader_labextension/api/models/assignment_detail.py @@ -1,11 +1,8 @@ -# coding: utf-8 - -from __future__ import absolute_import from datetime import date, datetime # noqa: F401 from typing import List, Dict # noqa: F401 -from grader_labextension.api.models.base_model_ import Model +from grader_labextension.api.models.base_model import Model from grader_labextension.api.models.submission import Submission from grader_labextension.api import util @@ -90,7 +87,7 @@ def from_dict(cls, dikt) -> 'AssignmentDetail': return util.deserialize_model(dikt, cls) @property - def id(self): + def id(self) -> int: """Gets the id of this AssignmentDetail. @@ -100,7 +97,7 @@ def id(self): return self._id @id.setter - def id(self, id): + def id(self, id: int): """Sets the id of this AssignmentDetail. @@ -111,7 +108,7 @@ def id(self, id): self._id = id @property - def name(self): + def name(self) -> str: """Gets the name of this AssignmentDetail. @@ -121,7 +118,7 @@ def name(self): return self._name @name.setter - def name(self, name): + def name(self, name: str): """Sets the name of this AssignmentDetail. @@ -132,7 +129,7 @@ def name(self, name): self._name = name @property - def type(self): + def type(self) -> str: """Gets the type of this AssignmentDetail. @@ -142,7 +139,7 @@ def type(self): return self._type @type.setter - def type(self, type): + def type(self, type: str): """Sets the type of this AssignmentDetail. @@ -159,7 +156,7 @@ def type(self, type): self._type = type @property - def due_date(self): + def due_date(self) -> datetime: """Gets the due_date of this AssignmentDetail. @@ -169,7 +166,7 @@ def due_date(self): return self._due_date @due_date.setter - def due_date(self, due_date): + def due_date(self, due_date: datetime): """Sets the due_date of this AssignmentDetail. @@ -180,7 +177,7 @@ def due_date(self, due_date): self._due_date = due_date @property - def status(self): + def status(self) -> str: """Gets the status of this AssignmentDetail. @@ -190,7 +187,7 @@ def status(self): return self._status @status.setter - def status(self, status): + def status(self, status: str): """Sets the status of this AssignmentDetail. @@ -207,7 +204,7 @@ def status(self, status): self._status = status @property - def points(self): + def points(self) -> float: """Gets the points of this AssignmentDetail. @@ -217,7 +214,7 @@ def points(self): return self._points @points.setter - def points(self, points): + def points(self, points: float): """Sets the points of this AssignmentDetail. @@ -228,7 +225,7 @@ def points(self, points): self._points = points @property - def automatic_grading(self): + def automatic_grading(self) -> str: """Gets the automatic_grading of this AssignmentDetail. @@ -238,7 +235,7 @@ def automatic_grading(self): return self._automatic_grading @automatic_grading.setter - def automatic_grading(self, automatic_grading): + def automatic_grading(self, automatic_grading: str): """Sets the automatic_grading of this AssignmentDetail. @@ -255,7 +252,7 @@ def automatic_grading(self, automatic_grading): self._automatic_grading = automatic_grading @property - def max_submissions(self): + def max_submissions(self) -> int: """Gets the max_submissions of this AssignmentDetail. @@ -265,7 +262,7 @@ def max_submissions(self): return self._max_submissions @max_submissions.setter - def max_submissions(self, max_submissions): + def max_submissions(self, max_submissions: int): """Sets the max_submissions of this AssignmentDetail. @@ -276,7 +273,7 @@ def max_submissions(self, max_submissions): self._max_submissions = max_submissions @property - def allow_files(self): + def allow_files(self) -> bool: """Gets the allow_files of this AssignmentDetail. @@ -286,7 +283,7 @@ def allow_files(self): return self._allow_files @allow_files.setter - def allow_files(self, allow_files): + def allow_files(self, allow_files: bool): """Sets the allow_files of this AssignmentDetail. @@ -297,7 +294,7 @@ def allow_files(self, allow_files): self._allow_files = allow_files @property - def submissions(self): + def submissions(self) -> List[Submission]: """Gets the submissions of this AssignmentDetail. @@ -307,7 +304,7 @@ def submissions(self): return self._submissions @submissions.setter - def submissions(self, submissions): + def submissions(self, submissions: List[Submission]): """Sets the submissions of this AssignmentDetail. diff --git a/grader_labextension/api/models/assignment_settings.py b/grader_labextension/api/models/assignment_settings.py index e55b6dc..8712513 100644 --- a/grader_labextension/api/models/assignment_settings.py +++ b/grader_labextension/api/models/assignment_settings.py @@ -1,11 +1,8 @@ -# coding: utf-8 - -from __future__ import absolute_import from datetime import date, datetime # noqa: F401 from typing import List, Dict # noqa: F401 -from grader_labextension.api.models.base_model_ import Model +from grader_labextension.api.models.base_model import Model from grader_labextension.api.models.submission_period import SubmissionPeriod from grader_labextension.api import util @@ -45,7 +42,7 @@ def from_dict(cls, dikt) -> 'AssignmentSettings': return util.deserialize_model(dikt, cls) @property - def late_submission(self): + def late_submission(self) -> List[SubmissionPeriod]: """Gets the late_submission of this AssignmentSettings. @@ -55,7 +52,7 @@ def late_submission(self): return self._late_submission @late_submission.setter - def late_submission(self, late_submission): + def late_submission(self, late_submission: List[SubmissionPeriod]): """Sets the late_submission of this AssignmentSettings. diff --git a/grader_labextension/api/models/base_model_.py b/grader_labextension/api/models/base_model.py similarity index 95% rename from grader_labextension/api/models/base_model_.py rename to grader_labextension/api/models/base_model.py index c9ecec7..48bcaf9 100644 --- a/grader_labextension/api/models/base_model_.py +++ b/grader_labextension/api/models/base_model.py @@ -1,6 +1,5 @@ import pprint -import six import typing from grader_labextension.api import util @@ -8,7 +7,7 @@ T = typing.TypeVar('T') -class Model(object): +class Model: # openapiTypes: The key is attribute name and the # value is attribute type. openapi_types: typing.Dict[str, type] = {} @@ -29,7 +28,7 @@ def to_dict(self): """ result = {} - for attr, _ in six.iteritems(self.openapi_types): + for attr in self.openapi_types: value = getattr(self, attr) if isinstance(value, list): result[attr] = list(map( diff --git a/grader_labextension/api/models/error_message.py b/grader_labextension/api/models/error_message.py index a994268..da56073 100644 --- a/grader_labextension/api/models/error_message.py +++ b/grader_labextension/api/models/error_message.py @@ -1,11 +1,8 @@ -# coding: utf-8 - -from __future__ import absolute_import from datetime import date, datetime # noqa: F401 from typing import List, Dict # noqa: F401 -from grader_labextension.api.models.base_model_ import Model +from grader_labextension.api.models.base_model import Model from grader_labextension.api import util @@ -63,7 +60,7 @@ def from_dict(cls, dikt) -> 'ErrorMessage': return util.deserialize_model(dikt, cls) @property - def code(self): + def code(self) -> int: """Gets the code of this ErrorMessage. @@ -73,7 +70,7 @@ def code(self): return self._code @code.setter - def code(self, code): + def code(self, code: int): """Sets the code of this ErrorMessage. @@ -86,7 +83,7 @@ def code(self, code): self._code = code @property - def error(self): + def error(self) -> str: """Gets the error of this ErrorMessage. @@ -96,7 +93,7 @@ def error(self): return self._error @error.setter - def error(self, error): + def error(self, error: str): """Sets the error of this ErrorMessage. @@ -109,7 +106,7 @@ def error(self, error): self._error = error @property - def path(self): + def path(self) -> str: """Gets the path of this ErrorMessage. @@ -119,7 +116,7 @@ def path(self): return self._path @path.setter - def path(self, path): + def path(self, path: str): """Sets the path of this ErrorMessage. @@ -132,7 +129,7 @@ def path(self, path): self._path = path @property - def message(self): + def message(self) -> str: """Gets the message of this ErrorMessage. @@ -142,7 +139,7 @@ def message(self): return self._message @message.setter - def message(self, message): + def message(self, message: str): """Sets the message of this ErrorMessage. @@ -153,7 +150,7 @@ def message(self, message): self._message = message @property - def traceback(self): + def traceback(self) -> str: """Gets the traceback of this ErrorMessage. @@ -163,7 +160,7 @@ def traceback(self): return self._traceback @traceback.setter - def traceback(self, traceback): + def traceback(self, traceback: str): """Sets the traceback of this ErrorMessage. diff --git a/grader_labextension/api/models/lecture.py b/grader_labextension/api/models/lecture.py index 900cfa2..698444c 100644 --- a/grader_labextension/api/models/lecture.py +++ b/grader_labextension/api/models/lecture.py @@ -1,11 +1,8 @@ -# coding: utf-8 - -from __future__ import absolute_import from datetime import date, datetime # noqa: F401 from typing import List, Dict # noqa: F401 -from grader_labextension.api.models.base_model_ import Model +from grader_labextension.api.models.base_model import Model from grader_labextension.api import util @@ -58,7 +55,7 @@ def from_dict(cls, dikt) -> 'Lecture': return util.deserialize_model(dikt, cls) @property - def id(self): + def id(self) -> int: """Gets the id of this Lecture. @@ -68,7 +65,7 @@ def id(self): return self._id @id.setter - def id(self, id): + def id(self, id: int): """Sets the id of this Lecture. @@ -79,7 +76,7 @@ def id(self, id): self._id = id @property - def name(self): + def name(self) -> str: """Gets the name of this Lecture. @@ -89,7 +86,7 @@ def name(self): return self._name @name.setter - def name(self, name): + def name(self, name: str): """Sets the name of this Lecture. @@ -100,7 +97,7 @@ def name(self, name): self._name = name @property - def code(self): + def code(self) -> str: """Gets the code of this Lecture. @@ -110,7 +107,7 @@ def code(self): return self._code @code.setter - def code(self, code): + def code(self, code: str): """Sets the code of this Lecture. @@ -121,7 +118,7 @@ def code(self, code): self._code = code @property - def complete(self): + def complete(self) -> bool: """Gets the complete of this Lecture. @@ -131,7 +128,7 @@ def complete(self): return self._complete @complete.setter - def complete(self, complete): + def complete(self, complete: bool): """Sets the complete of this Lecture. diff --git a/grader_labextension/api/models/remote_file_status.py b/grader_labextension/api/models/remote_file_status.py new file mode 100644 index 0000000..df288c0 --- /dev/null +++ b/grader_labextension/api/models/remote_file_status.py @@ -0,0 +1,67 @@ +from datetime import date, datetime # noqa: F401 + +from typing import List, Dict # noqa: F401 + +from grader_labextension.api.models.base_model import Model +from grader_labextension.api import util + + +class RemoteFileStatus(Model): + """NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + + Do not edit the class manually. + """ + + def __init__(self, status=None): # noqa: E501 + """RemoteFileStatus - a model defined in OpenAPI + + :param status: The status of this RemoteFileStatus. # noqa: E501 + :type status: str + """ + self.openapi_types = { + 'status': str + } + + self.attribute_map = { + 'status': 'status' + } + + self._status = status + + @classmethod + def from_dict(cls, dikt) -> 'RemoteFileStatus': + """Returns the dict as a model + + :param dikt: A dict. + :type: dict + :return: The RemoteFileStatus of this RemoteFileStatus. # noqa: E501 + :rtype: RemoteFileStatus + """ + return util.deserialize_model(dikt, cls) + + @property + def status(self) -> str: + """Gets the status of this RemoteFileStatus. + + + :return: The status of this RemoteFileStatus. + :rtype: str + """ + return self._status + + @status.setter + def status(self, status: str): + """Sets the status of this RemoteFileStatus. + + + :param status: The status of this RemoteFileStatus. + :type status: str + """ + allowed_values = ["UP_TO_DATE", "DIVERGENT", "PULL_NEEDED", "PUSH_NEEDED", "NO_REMOTE_REPO"] # noqa: E501 + if status not in allowed_values: + raise ValueError( + "Invalid value for `status` ({0}), must be one of {1}" + .format(status, allowed_values) + ) + + self._status = status diff --git a/grader_labextension/api/models/submission.py b/grader_labextension/api/models/submission.py index 30ed916..be56e0e 100644 --- a/grader_labextension/api/models/submission.py +++ b/grader_labextension/api/models/submission.py @@ -1,11 +1,8 @@ -# coding: utf-8 - -from __future__ import absolute_import from datetime import date, datetime # noqa: F401 from typing import List, Dict # noqa: F401 -from grader_labextension.api.models.base_model_ import Model +from grader_labextension.api.models.base_model import Model from grader_labextension.api import util @@ -98,7 +95,7 @@ def from_dict(cls, dikt) -> 'Submission': return util.deserialize_model(dikt, cls) @property - def id(self): + def id(self) -> int: """Gets the id of this Submission. @@ -108,7 +105,7 @@ def id(self): return self._id @id.setter - def id(self, id): + def id(self, id: int): """Sets the id of this Submission. @@ -119,7 +116,7 @@ def id(self, id): self._id = id @property - def submitted_at(self): + def submitted_at(self) -> datetime: """Gets the submitted_at of this Submission. @@ -129,7 +126,7 @@ def submitted_at(self): return self._submitted_at @submitted_at.setter - def submitted_at(self, submitted_at): + def submitted_at(self, submitted_at: datetime): """Sets the submitted_at of this Submission. @@ -140,7 +137,7 @@ def submitted_at(self, submitted_at): self._submitted_at = submitted_at @property - def auto_status(self): + def auto_status(self) -> str: """Gets the auto_status of this Submission. @@ -150,7 +147,7 @@ def auto_status(self): return self._auto_status @auto_status.setter - def auto_status(self, auto_status): + def auto_status(self, auto_status: str): """Sets the auto_status of this Submission. @@ -167,7 +164,7 @@ def auto_status(self, auto_status): self._auto_status = auto_status @property - def manual_status(self): + def manual_status(self) -> str: """Gets the manual_status of this Submission. @@ -177,7 +174,7 @@ def manual_status(self): return self._manual_status @manual_status.setter - def manual_status(self, manual_status): + def manual_status(self, manual_status: str): """Sets the manual_status of this Submission. @@ -194,7 +191,7 @@ def manual_status(self, manual_status): self._manual_status = manual_status @property - def username(self): + def username(self) -> str: """Gets the username of this Submission. @@ -204,7 +201,7 @@ def username(self): return self._username @username.setter - def username(self, username): + def username(self, username: str): """Sets the username of this Submission. @@ -215,7 +212,7 @@ def username(self, username): self._username = username @property - def grading_score(self): + def grading_score(self) -> float: """Gets the grading_score of this Submission. @@ -225,7 +222,7 @@ def grading_score(self): return self._grading_score @grading_score.setter - def grading_score(self, grading_score): + def grading_score(self, grading_score: float): """Sets the grading_score of this Submission. @@ -236,7 +233,7 @@ def grading_score(self, grading_score): self._grading_score = grading_score @property - def score_scaling(self): + def score_scaling(self) -> float: """Gets the score_scaling of this Submission. @@ -246,7 +243,7 @@ def score_scaling(self): return self._score_scaling @score_scaling.setter - def score_scaling(self, score_scaling): + def score_scaling(self, score_scaling: float): """Sets the score_scaling of this Submission. @@ -261,7 +258,7 @@ def score_scaling(self, score_scaling): self._score_scaling = score_scaling @property - def score(self): + def score(self) -> float: """Gets the score of this Submission. @@ -271,7 +268,7 @@ def score(self): return self._score @score.setter - def score(self, score): + def score(self, score: float): """Sets the score of this Submission. @@ -282,7 +279,7 @@ def score(self, score): self._score = score @property - def assignid(self): + def assignid(self) -> int: """Gets the assignid of this Submission. @@ -292,7 +289,7 @@ def assignid(self): return self._assignid @assignid.setter - def assignid(self, assignid): + def assignid(self, assignid: int): """Sets the assignid of this Submission. @@ -303,7 +300,7 @@ def assignid(self, assignid): self._assignid = assignid @property - def commit_hash(self): + def commit_hash(self) -> str: """Gets the commit_hash of this Submission. @@ -313,7 +310,7 @@ def commit_hash(self): return self._commit_hash @commit_hash.setter - def commit_hash(self, commit_hash): + def commit_hash(self, commit_hash: str): """Sets the commit_hash of this Submission. @@ -324,7 +321,7 @@ def commit_hash(self, commit_hash): self._commit_hash = commit_hash @property - def feedback_status(self): + def feedback_status(self) -> str: """Gets the feedback_status of this Submission. @@ -334,7 +331,7 @@ def feedback_status(self): return self._feedback_status @feedback_status.setter - def feedback_status(self, feedback_status): + def feedback_status(self, feedback_status: str): """Sets the feedback_status of this Submission. @@ -344,14 +341,14 @@ def feedback_status(self, feedback_status): allowed_values = ["not_generated", "generating", "generated", "generation_failed", "feedback_outdated"] # noqa: E501 if feedback_status not in allowed_values: raise ValueError( - "Invalid value for `auto_status` ({0}), must be one of {1}" + "Invalid value for `feedback_status` ({0}), must be one of {1}" .format(feedback_status, allowed_values) ) self._feedback_status = feedback_status @property - def edited(self): + def edited(self) -> bool: """Gets the edited of this Submission. @@ -361,7 +358,7 @@ def edited(self): return self._edited @edited.setter - def edited(self, edited): + def edited(self, edited: bool): """Sets the edited of this Submission. diff --git a/grader_labextension/api/models/submission_period.py b/grader_labextension/api/models/submission_period.py index 08173bb..87972c7 100644 --- a/grader_labextension/api/models/submission_period.py +++ b/grader_labextension/api/models/submission_period.py @@ -1,11 +1,8 @@ -# coding: utf-8 - -from __future__ import absolute_import from datetime import date, datetime # noqa: F401 from typing import List, Dict # noqa: F401 -from grader_labextension.api.models.base_model_ import Model +from grader_labextension.api.models.base_model import Model from grader_labextension.api import util @@ -48,7 +45,7 @@ def from_dict(cls, dikt) -> 'SubmissionPeriod': return util.deserialize_model(dikt, cls) @property - def period(self): + def period(self) -> str: """Gets the period of this SubmissionPeriod. @@ -58,7 +55,7 @@ def period(self): return self._period @period.setter - def period(self, period): + def period(self, period: str): """Sets the period of this SubmissionPeriod. @@ -69,7 +66,7 @@ def period(self, period): self._period = period @property - def scaling(self): + def scaling(self) -> float: """Gets the scaling of this SubmissionPeriod. @@ -79,7 +76,7 @@ def scaling(self): return self._scaling @scaling.setter - def scaling(self, scaling): + def scaling(self, scaling: float): """Sets the scaling of this SubmissionPeriod. diff --git a/grader_labextension/api/models/user.py b/grader_labextension/api/models/user.py index c53a5dc..0165360 100644 --- a/grader_labextension/api/models/user.py +++ b/grader_labextension/api/models/user.py @@ -1,11 +1,8 @@ -# coding: utf-8 - -from __future__ import absolute_import from datetime import date, datetime # noqa: F401 from typing import List, Dict # noqa: F401 -from grader_labextension.api.models.base_model_ import Model +from grader_labextension.api.models.base_model import Model from grader_labextension.api import util @@ -43,7 +40,7 @@ def from_dict(cls, dikt) -> 'User': return util.deserialize_model(dikt, cls) @property - def name(self): + def name(self) -> str: """Gets the name of this User. @@ -53,7 +50,7 @@ def name(self): return self._name @name.setter - def name(self, name): + def name(self, name: str): """Sets the name of this User. diff --git a/grader_labextension/api/models/user_submissions_inner.py b/grader_labextension/api/models/user_submissions_inner.py index e4fc03d..f07e7f8 100644 --- a/grader_labextension/api/models/user_submissions_inner.py +++ b/grader_labextension/api/models/user_submissions_inner.py @@ -1,11 +1,8 @@ -# coding: utf-8 - -from __future__ import absolute_import from datetime import date, datetime # noqa: F401 from typing import List, Dict # noqa: F401 -from grader_labextension.api.models.base_model_ import Model +from grader_labextension.api.models.base_model import Model from grader_labextension.api.models.submission import Submission from grader_labextension.api.models.user import User from grader_labextension.api import util @@ -52,7 +49,7 @@ def from_dict(cls, dikt) -> 'UserSubmissionsInner': return util.deserialize_model(dikt, cls) @property - def user(self): + def user(self) -> User: """Gets the user of this UserSubmissionsInner. @@ -62,7 +59,7 @@ def user(self): return self._user @user.setter - def user(self, user): + def user(self, user: User): """Sets the user of this UserSubmissionsInner. @@ -73,7 +70,7 @@ def user(self, user): self._user = user @property - def submissions(self): + def submissions(self) -> List[Submission]: """Gets the submissions of this UserSubmissionsInner. @@ -83,7 +80,7 @@ def submissions(self): return self._submissions @submissions.setter - def submissions(self, submissions): + def submissions(self, submissions: List[Submission]): """Sets the submissions of this UserSubmissionsInner. diff --git a/grader_labextension/api/typing_utils.py b/grader_labextension/api/typing_utils.py index 0563f81..74e3c91 100644 --- a/grader_labextension/api/typing_utils.py +++ b/grader_labextension/api/typing_utils.py @@ -1,5 +1,3 @@ -# coding: utf-8 - import sys if sys.version_info < (3, 7): diff --git a/grader_labextension/api/util.py b/grader_labextension/api/util.py index a4122c1..b49ffb4 100644 --- a/grader_labextension/api/util.py +++ b/grader_labextension/api/util.py @@ -1,6 +1,5 @@ import datetime -import six import typing from grader_labextension.api import typing_utils @@ -16,7 +15,7 @@ def _deserialize(data, klass): if data is None: return None - if klass in six.integer_types or klass in (float, str, bool, bytearray): + if klass in (int, float, str, bool, bytearray): return _deserialize_primitive(data, klass) elif klass == object: return _deserialize_object(data) @@ -45,7 +44,7 @@ def _deserialize_primitive(data, klass): try: value = klass(data) except UnicodeEncodeError: - value = six.u(data) + value = data except TypeError: value = data return value @@ -110,7 +109,7 @@ def deserialize_model(data, klass): if not instance.openapi_types: return data - for attr, attr_type in six.iteritems(instance.openapi_types): + for attr, attr_type in instance.openapi_types.items(): if data is not None \ and instance.attribute_map[attr] in data \ and isinstance(data, (list, dict)): @@ -145,4 +144,4 @@ def _deserialize_dict(data, boxed_type): :rtype: dict """ return {k: _deserialize(v, boxed_type) - for k, v in six.iteritems(data)} + for k, v in data.items() } diff --git a/grader_labextension/api_handler.py b/grader_labextension/api_handler.py index 4976a5c..c1f471b 100644 --- a/grader_labextension/api_handler.py +++ b/grader_labextension/api_handler.py @@ -13,6 +13,6 @@ class HealthHandler(ExtensionBaseHandler): @tornado.web.authenticated def get(self): - response = "Grader Labextension: Health OK" + response = {"health": "OK"} self.write(response) diff --git a/grader_labextension/handlers/assignment.py b/grader_labextension/handlers/assignment.py index 56a14c3..aa133bf 100644 --- a/grader_labextension/handlers/assignment.py +++ b/grader_labextension/handlers/assignment.py @@ -7,23 +7,22 @@ import json import shutil -from tornado.httpclient import HTTPClientError -from tornado.web import HTTPError +from tornado.web import HTTPError, authenticated from grader_labextension.registry import register_handler from grader_labextension.handlers.base_handler import ExtensionBaseHandler, cache -from grader_labextension.services.request import RequestService +from grader_labextension.services.request import RequestService, RequestServiceError import tornado import os -@register_handler(path=r"\/lectures\/(?P\d*)\/assignments\/?") +@register_handler(path=r"api\/lectures\/(?P\d*)\/assignments\/?") class AssignmentBaseHandler(ExtensionBaseHandler): """ Tornado Handler class for http requests to /lectures/{lecture_id}/assignments. """ - @cache(max_age=30) + @authenticated async def get(self, lecture_id: int): """Sends a GET request to the grader service and returns assignments of the lecture @@ -33,19 +32,19 @@ async def get(self, lecture_id: int): try: response = await self.request_service.request( method="GET", - endpoint=f"{self.service_base_url}/lectures/{lecture_id}/assignments", + endpoint=f"{self.service_base_url}api/lectures/{lecture_id}/assignments", header=self.grader_authentication_header, response_callback=self.set_service_headers ) lecture = await self.request_service.request( "GET", - f"{self.service_base_url}/lectures/{lecture_id}", + f"{self.service_base_url}api/lectures/{lecture_id}", header=self.grader_authentication_header, ) - except HTTPClientError as e: - self.log.error(e.response) - raise HTTPError(e.code, reason=e.response.reason) + except RequestServiceError as e: + self.log.error(e) + raise HTTPError(e.code, reason=e.message) # Create directories for every assignment try: @@ -77,19 +76,19 @@ async def post(self, lecture_id: int): try: response = await self.request_service.request( method="POST", - endpoint=f"{self.service_base_url}/lectures/{lecture_id}/assignments", + endpoint=f"{self.service_base_url}api/lectures/{lecture_id}/assignments", body=data, header=self.grader_authentication_header, ) lecture = await self.request_service.request( "GET", - f"{self.service_base_url}/lectures/{lecture_id}", + f"{self.service_base_url}api/lectures/{lecture_id}", header=self.grader_authentication_header, ) - except HTTPClientError as e: - self.log.error(e.response) - raise HTTPError(e.code, reason=e.response.reason) + except RequestServiceError as e: + self.log.error(e) + raise HTTPError(e.code, reason=e.message) # if we did not get an error when creating the assignment (i.e. the user is authorized etc.) then we can # create the directory structure if it does not exist yet os.makedirs( @@ -108,7 +107,7 @@ async def post(self, lecture_id: int): @register_handler( - path=r"\/lectures\/(?P\d*)\/assignments\/(?P\d*)\/?" + path=r"api\/lectures\/(?P\d*)\/assignments\/(?P\d*)\/?" ) class AssignmentObjectHandler(ExtensionBaseHandler): """ @@ -128,16 +127,16 @@ async def put(self, lecture_id: int, assignment_id: int): try: response = await self.request_service.request( method="PUT", - endpoint=f"{self.service_base_url}/lectures/{lecture_id}/assignments/{assignment_id}", + endpoint=f"{self.service_base_url}api/lectures/{lecture_id}/assignments/{assignment_id}", body=data, header=self.grader_authentication_header, ) - except HTTPClientError as e: - self.log.error(e.response) - raise HTTPError(e.code, reason=e.response.reason) + except RequestServiceError as e: + self.log.error(e) + raise HTTPError(e.code, reason=e.message) self.write(json.dumps(response)) - @cache(max_age=30) + @authenticated async def get(self, lecture_id: int, assignment_id: int): """Sends a GET-request to the grader service to get a specific assignment @@ -147,27 +146,21 @@ async def get(self, lecture_id: int, assignment_id: int): :type assignment_id: int """ - query_params = RequestService.get_query_string( - { - "instructor-version": self.get_argument("instructor-version", None), - } - ) - try: response = await self.request_service.request( method="GET", - endpoint=f"{self.service_base_url}/lectures/{lecture_id}/assignments/{assignment_id}{query_params}", + endpoint=f"{self.service_base_url}api/lectures/{lecture_id}/assignments/{assignment_id}", header=self.grader_authentication_header, response_callback=self.set_service_headers ) lecture = await self.request_service.request( "GET", - f"{self.service_base_url}/lectures/{lecture_id}", + f"{self.service_base_url}api/lectures/{lecture_id}", header=self.grader_authentication_header, ) - except HTTPClientError as e: - self.log.error(e.response) - raise HTTPError(e.code, reason=e.response.reason) + except RequestServiceError as e: + self.log.error(e) + raise HTTPError(e.code, reason=e.message) os.makedirs( os.path.expanduser(f'{self.root_dir}/{lecture["code"]}/assignments/{response["id"]}'), @@ -187,24 +180,25 @@ async def delete(self, lecture_id: int, assignment_id: int): try: await self.request_service.request( method="DELETE", - endpoint=f"{self.service_base_url}/lectures/{lecture_id}/assignments/{assignment_id}", + endpoint=f"{self.service_base_url}api/lectures/{lecture_id}/assignments/{assignment_id}", header=self.grader_authentication_header, decode_response=False ) - except HTTPClientError as e: - raise HTTPError(e.code, reason=e.response.reason) + except RequestServiceError as e: + raise HTTPError(e.code, reason=e.message) - self.write("OK") + self.write({"status": "OK"}) @register_handler( - path=r"\/lectures\/(?P\d*)\/assignments\/(?P\d*)\/properties\/?" + path=r"api\/lectures\/(?P\d*)\/assignments\/(?P\d*)\/properties\/?" ) class AssignmentPropertiesHandler(ExtensionBaseHandler): """ Tornado Handler class for http requests to /lectures/{lecture_id}/assignments/{assignment_id}/properties. """ + @authenticated async def get(self, lecture_id: int, assignment_id: int): """Sends a GET-request to the grader service and returns the properties of an assignment @@ -217,12 +211,12 @@ async def get(self, lecture_id: int, assignment_id: int): try: response = await self.request_service.request( method="GET", - endpoint=f"{self.service_base_url}/lectures/{lecture_id}/assignments/{assignment_id}/properties", + endpoint=f"{self.service_base_url}api/lectures/{lecture_id}/assignments/{assignment_id}/properties", header=self.grader_authentication_header, response_callback=self.set_service_headers ) - except HTTPClientError as e: - self.log.error(e.response) - raise HTTPError(e.code, reason=e.response.reason) + except RequestServiceError as e: + self.log.error(e) + raise HTTPError(e.code, reason=e.message) self.write(json.dumps(response)) diff --git a/grader_labextension/handlers/base_handler.py b/grader_labextension/handlers/base_handler.py index a8535f7..befd602 100644 --- a/grader_labextension/handlers/base_handler.py +++ b/grader_labextension/handlers/base_handler.py @@ -13,10 +13,10 @@ from tornado.web import HTTPError from grader_labextension.api.models.error_message import ErrorMessage -from grader_labextension.services.request import RequestService +from grader_labextension.services.request import RequestService, RequestServiceError from jupyter_server.base.handlers import APIHandler import os -from tornado.httpclient import HTTPClientError, HTTPResponse +from tornado.httpclient import HTTPResponse from traitlets.config.configurable import SingletonConfigurable from traitlets.traitlets import Unicode @@ -41,8 +41,10 @@ class HandlerConfig(SingletonConfigurable): hub_api_token = Unicode(os.environ.get("JUPYTERHUB_API_TOKEN"), help="The authorization token to access the hub api").tag(config=True) hub_user = Unicode(os.environ.get("JUPYTERHUB_USER"), help="The user name in jupyter hub.").tag(config=True) + grader_api_token = Unicode(os.environ.get("GRADER_API_TOKEN"), + help="The authorization token to access the grader service api").tag(config=True) service_base_url = Unicode( - os.environ.get("GRADER_BASE_URL", "/services/grader"), + os.environ.get("GRADER_BASE_URL", "/services/grader/"), help="Base URL to use for each request to the grader service", ).tag(config=True) lectures_base_path = Unicode( @@ -83,7 +85,7 @@ def grader_authentication_header(self): :rtype: dict """ - return dict(Authorization="Token " + HandlerConfig.instance().hub_api_token) + return dict(Authorization="Token " + HandlerConfig.instance().grader_api_token) @property def user_name(self): @@ -93,42 +95,23 @@ async def get_lecture(self, lecture_id) -> dict: try: lecture = await self.request_service.request( "GET", - f"{self.service_base_url}/lectures/{lecture_id}", + f"{self.service_base_url}api/lectures/{lecture_id}", header=self.grader_authentication_header, ) return lecture - except HTTPClientError as e: - self.log.error(e.response) - raise HTTPError(e.code, reason=e.response.reason) + except RequestServiceError as e: + self.log.error(e) + raise HTTPError(e.code, reason=e.message) async def get_assignment(self, lecture_id, assignment_id): try: assignment = await self.request_service.request( "GET", - f"{self.service_base_url}/lectures/{lecture_id}/assignments/{assignment_id}", + f"{self.service_base_url}api/lectures/{lecture_id}/assignments/{assignment_id}", header=self.grader_authentication_header, ) return assignment - except HTTPClientError as e: - self.log.error(e.response) - raise HTTPError(e.code, reason=e.response.reason) - - def write_error(self, status_code, **kwargs): - """APIHandler errors are JSON, not human pages""" - self.set_header("Content-Type", "application/json") - message = responses.get(status_code, "Unknown HTTP Error") - reply: dict = { - "message": message, - } - exc_info = kwargs.get("exc_info") - if exc_info: - e = exc_info[1] - if isinstance(e, HTTPError): - reply["message"] = e.log_message or message - reply["reason"] = e.reason - else: - reply["message"] = "Unhandled error" - reply["reason"] = None - reply["traceback"] = "".join(traceback.format_exception(*exc_info)) - self.log.warning("wrote error: %r", reply["message"], exc_info=True) - self.finish(json.dumps(reply)) \ No newline at end of file + except RequestServiceError as e: + self.log.error(e) + raise HTTPError(e.code, reason=e.message) + diff --git a/grader_labextension/handlers/grading.py b/grader_labextension/handlers/grading.py index 9ec964d..7734f80 100644 --- a/grader_labextension/handlers/grading.py +++ b/grader_labextension/handlers/grading.py @@ -5,17 +5,17 @@ # LICENSE file in the root directory of this source tree. import shutil -from grader_labextension.services.request import RequestService +from grader_labextension.services.request import RequestService, RequestServiceError from grader_labextension.registry import register_handler from grader_labextension.handlers.base_handler import ExtensionBaseHandler -from tornado.httpclient import HTTPResponse, HTTPClientError -from tornado.web import HTTPError +from tornado.httpclient import HTTPResponse +from tornado.web import HTTPError, authenticated from grader_labextension.services.git import GitService import os @register_handler( - path=r"\/lectures\/(?P\d*)\/assignments\/(?P\d*)\/submissions\/save?" + path=r"api\/lectures\/(?P\d*)\/assignments\/(?P\d*)\/submissions\/save?" ) class ExportGradesHandler(ExtensionBaseHandler): """ @@ -39,13 +39,13 @@ async def put(self, lecture_id: int, assignment_id: int): try: response: HTTPResponse = await self.request_service.request( method="GET", - endpoint=f"{self.service_base_url}/lectures/{lecture_id}/assignments/{assignment_id}/submissions{query_params}", + endpoint=f"{self.service_base_url}api/lectures/{lecture_id}/assignments/{assignment_id}/submissions{query_params}", header=self.grader_authentication_header, decode_response=False ) - except HTTPClientError as e: - self.log.error(e.response) - raise HTTPError(e.code, reason=e.response.reason) + except RequestServiceError as e: + self.log.error(e) + raise HTTPError(e.code, reason=e.message) lecture = await self.get_lecture(lecture_id) dir_path = os.path.join(self.root_dir, lecture["code"]) @@ -55,19 +55,20 @@ async def put(self, lecture_id: int, assignment_id: int): with open(file_path, "w") as f: f.write(csv_content) - self.write("OK") + self.write({"status": "OK"}) @register_handler( - path=r"\/lectures\/(?P\d*)\/assignments\/(?P\d*)\/grading\/(?P\d*)\/auto\/?" + path=r"api\/lectures\/(?P\d*)\/assignments\/(?P\d*)\/grading\/(?P\d*)\/auto\/?" ) class GradingAutoHandler(ExtensionBaseHandler): """ Tornado Handler class for http requests to /lectures/{lecture_id}/assignments/{assignment_id}/submissions/{submission_id}/auto. """ + @authenticated async def get(self, lecture_id: int, assignment_id: int, sub_id: int): """Sends a GET-request to the grader service to autograde a submission @@ -81,23 +82,24 @@ async def get(self, lecture_id: int, assignment_id: int, sub_id: int): try: response = await self.request_service.request( method="GET", - endpoint=f"{self.service_base_url}/lectures/{lecture_id}/assignments/{assignment_id}/grading/{sub_id}/auto", + endpoint=f"{self.service_base_url}api/lectures/{lecture_id}/assignments/{assignment_id}/grading/{sub_id}/auto", header=self.grader_authentication_header, ) - except HTTPClientError as e: - self.log.error(e.response) - raise HTTPError(e.code, reason=e.response.reason) + except RequestServiceError as e: + self.log.error(e) + raise HTTPError(e.code, reason=e.message) self.write(response) @register_handler( - path=r"\/lectures\/(?P\d*)\/assignments\/(?P\d*)\/grading\/(?P\d*)\/manual\/?" + path=r"api\/lectures\/(?P\d*)\/assignments\/(?P\d*)\/grading\/(?P\d*)\/manual\/?" ) class GradingManualHandler(ExtensionBaseHandler): """ Tornado Handler class for http requests to /lectures/{lecture_id}/assignments/{assignment_id}/submissions/{submission_id}/manual. """ + @authenticated async def get(self, lecture_id: int, assignment_id: int, sub_id: int): """Generates a local git repository and pulls autograded files of a submission in the user directory @@ -112,24 +114,24 @@ async def get(self, lecture_id: int, assignment_id: int, sub_id: int): try: lecture = await self.request_service.request( "GET", - f"{self.service_base_url}/lectures/{lecture_id}", + f"{self.service_base_url}api/lectures/{lecture_id}", header=self.grader_authentication_header, ) assignment = await self.request_service.request( "GET", - f"{self.service_base_url}/lectures/{lecture_id}/assignments/{assignment_id}", + f"{self.service_base_url}api/lectures/{lecture_id}/assignments/{assignment_id}", header=self.grader_authentication_header, ) submission = await self.request_service.request( "GET", - f"{self.service_base_url}/lectures/{lecture_id}/assignments/{assignment_id}/submissions/{sub_id}", + f"{self.service_base_url}api/lectures/{lecture_id}/assignments/{assignment_id}/submissions/{sub_id}", header=self.grader_authentication_header, ) - except HTTPClientError as e: - self.log.error(e.response) - raise HTTPError(e.code, reason=e.response.reason) + except RequestServiceError as e: + self.log.error(e) + raise HTTPError(e.code, reason=e.message) git_service = GitService( server_root_dir=self.root_dir, @@ -159,13 +161,14 @@ async def get(self, lecture_id: int, assignment_id: int, sub_id: int): @register_handler( - path=r"\/lectures\/(?P\d*)\/assignments\/(?P\d*)\/grading\/(?P\d*)\/feedback\/?" + path=r"api\/lectures\/(?P\d*)\/assignments\/(?P\d*)\/grading\/(?P\d*)\/feedback\/?" ) class GenerateFeedbackHandler(ExtensionBaseHandler): """ Tornado Handler class for http requests to /lectures/{lecture_id}/assignments/{assignment_id}/submissions/{submission_id}/feedback. """ + @authenticated async def get(self, lecture_id: int, assignment_id: int, sub_id: int): """Sends a GET-request to the grader service to generate feedback for a graded submission @@ -180,23 +183,24 @@ async def get(self, lecture_id: int, assignment_id: int, sub_id: int): try: response = await self.request_service.request( method="GET", - endpoint=f"{self.service_base_url}/lectures/{lecture_id}/assignments/{assignment_id}/grading/{sub_id}/feedback", + endpoint=f"{self.service_base_url}api/lectures/{lecture_id}/assignments/{assignment_id}/grading/{sub_id}/feedback", header=self.grader_authentication_header, ) - except HTTPClientError as e: - self.log.error(e.response) - raise HTTPError(e.code, reason=e.response.reason) + except RequestServiceError as e: + self.log.error(e) + raise HTTPError(e.code, reason=e.message) self.write(response) @register_handler( - path=r"\/lectures\/(?P\d*)\/assignments\/(?P\d*)\/grading\/(?P\d*)\/pull\/feedback\/?" + path=r"api\/lectures\/(?P\d*)\/assignments\/(?P\d*)\/grading\/(?P\d*)\/pull\/feedback\/?" ) class PullFeedbackHandler(ExtensionBaseHandler): """ Tornado Handler class for http requests to /lectures/{lecture_id}/assignments/{assignment_id}/submissions/{submission_id}/pull/feedback. """ + @authenticated async def get(self, lecture_id: int, assignment_id: int, sub_id: int): """Generates a local git repository and pulls the feedback files of a submission in the user directory @@ -210,24 +214,24 @@ async def get(self, lecture_id: int, assignment_id: int, sub_id: int): try: lecture = await self.request_service.request( "GET", - f"{self.service_base_url}/lectures/{lecture_id}", + f"{self.service_base_url}api/lectures/{lecture_id}", header=self.grader_authentication_header, ) assignment = await self.request_service.request( "GET", - f"{self.service_base_url}/lectures/{lecture_id}/assignments/{assignment_id}", + f"{self.service_base_url}api/lectures/{lecture_id}/assignments/{assignment_id}", header=self.grader_authentication_header, ) submission = await self.request_service.request( "GET", - f"{self.service_base_url}/lectures/{lecture_id}/assignments/{assignment_id}/submissions/{sub_id}", + f"{self.service_base_url}api/lectures/{lecture_id}/assignments/{assignment_id}/submissions/{sub_id}", header=self.grader_authentication_header, ) - except HTTPClientError as e: - self.log.error(e.response) - raise HTTPError(e.code, reason=e.response.reason) + except RequestServiceError as e: + self.log.error(e) + raise HTTPError(e.code, reason=e.message) git_service = GitService( server_root_dir=self.root_dir, @@ -251,4 +255,4 @@ async def get(self, lecture_id: int, assignment_id: int, sub_id: int): git_service.init() git_service.set_remote("feedback", sub_id=sub_id) git_service.pull("feedback", branch=f"feedback_{submission['commit_hash']}", force=False) - self.write("Pulled Feedback") + self.write({"status": "Pulled Feedback"}) diff --git a/grader_labextension/handlers/lectures.py b/grader_labextension/handlers/lectures.py index 3f370db..3580cca 100644 --- a/grader_labextension/handlers/lectures.py +++ b/grader_labextension/handlers/lectures.py @@ -8,18 +8,16 @@ from grader_labextension.registry import register_handler from grader_labextension.handlers.base_handler import ExtensionBaseHandler, cache import tornado -from tornado import web -from grader_labextension.services.request import RequestService -from tornado.httpclient import HTTPClientError +from tornado.web import authenticated, HTTPError +from grader_labextension.services.request import RequestService, RequestServiceError -@register_handler(path=r"\/lectures\/?") +@register_handler(path=r"api\/lectures\/?") class LectureBaseHandler(ExtensionBaseHandler): """ Tornado Handler class for http requests to /lectures. """ - @web.authenticated - @cache(max_age=60) + @authenticated async def get(self): """Sends a GET-request to the grader service and returns the autorized lectures """ @@ -29,16 +27,16 @@ async def get(self): try: response = await self.request_service.request( "GET", - f"{self.service_base_url}/lectures{query_params}", + f"{self.service_base_url}api/lectures{query_params}", header=self.grader_authentication_header, response_callback=self.set_service_headers ) - except HTTPClientError as e: - self.log.error(e.response) - raise web.HTTPError(e.code, reason=e.response.reason) + except RequestServiceError as e: + self.log.error(e) + raise HTTPError(e.code, reason=e.message) self.write(json.dumps(response)) - @web.authenticated + @authenticated async def post(self): """Sends a POST-request to the grader service to create a lecture """ @@ -46,22 +44,22 @@ async def post(self): try: response = await self.request_service.request( "POST", - f"{self.service_base_url}/lectures", + f"{self.service_base_url}api/lectures", body=data, header=self.grader_authentication_header, ) - except HTTPClientError as e: - self.log.error(e.response) - raise web.HTTPError(e.code, reason=e.response.reason) + except RequestServiceError as e: + self.log.error(e) + raise HTTPError(e.code, reason=e.message) self.write(json.dumps(response)) -@register_handler(path=r"\/lectures\/(?P\d*)\/?") +@register_handler(path=r"api\/lectures\/(?P\d*)\/?") class LectureObjectHandler(ExtensionBaseHandler): """ Tornado Handler class for http requests to /lectures/{lecture_id}. """ - @web.authenticated + @authenticated async def put(self, lecture_id: int): """Sends a PUT-request to the grader service to update a lecture @@ -73,17 +71,16 @@ async def put(self, lecture_id: int): try: response_data: dict = await self.request_service.request( "PUT", - f"{self.service_base_url}/lectures/{lecture_id}", + f"{self.service_base_url}api/lectures/{lecture_id}", body=data, header=self.grader_authentication_header, ) - except HTTPClientError as e: - self.log.error(e.response) - raise web.HTTPError(e.code, reason=e.response.reason) + except RequestServiceError as e: + self.log.error(e) + raise HTTPError(e.code, reason=e.message) self.write(json.dumps(response_data)) - @web.authenticated - @cache(max_age=60) + @authenticated async def get(self, lecture_id: int): """Sends a GET-request to the grader service and returns the lecture @@ -93,16 +90,16 @@ async def get(self, lecture_id: int): try: response_data: dict = await self.request_service.request( "GET", - f"{self.service_base_url}/lectures/{lecture_id}", + f"{self.service_base_url}api/lectures/{lecture_id}", header=self.grader_authentication_header, response_callback=self.set_service_headers ) - except HTTPClientError as e: - self.log.error(e.response) - raise web.HTTPError(e.code, reason=e.response.reason) + except RequestServiceError as e: + self.log.error(e) + raise HTTPError(e.code, reason=e.message) self.write(json.dumps(response_data)) - @web.authenticated + @authenticated async def delete(self, lecture_id: int): """Sends a DELETE-request to the grader service to delete a lecture @@ -113,23 +110,23 @@ async def delete(self, lecture_id: int): try: await self.request_service.request( "DELETE", - f"{self.service_base_url}/lectures/{lecture_id}", + f"{self.service_base_url}api/lectures/{lecture_id}", header=self.grader_authentication_header, ) - except HTTPClientError as e: - self.log.error(e.response) - raise web.HTTPError(e.code, reason=e.response.reason) - self.write("OK") + except RequestServiceError as e: + self.log.error(e) + raise HTTPError(e.code, reason=e.message) + self.write({"status": "OK"}) @register_handler( - path=r"\/lectures\/(?P\d*)\/users\/?" + path=r"api\/lectures\/(?P\d*)\/users\/?" ) class LectureStudentsHandler(ExtensionBaseHandler): """ Tornado Handler class for http requests to /lectures/{lecture_id}/users. """ - @cache(max_age=60) + @authenticated async def get(self, lecture_id: int): """ Sends a GET request to the grader service and returns attendants of lecture @@ -139,12 +136,12 @@ async def get(self, lecture_id: int): try: response = await self.request_service.request( method="GET", - endpoint=f"{self.service_base_url}/lectures/{lecture_id}/users/", + endpoint=f"{self.service_base_url}api/lectures/{lecture_id}/users", header=self.grader_authentication_header, response_callback=self.set_service_headers ) - except HTTPClientError as e: - self.log.error(e.response) - raise web.HTTPError(e.code, reason=e.response.reason) + except RequestServiceError as e: + self.log.error(e) + raise HTTPError(e.code, reason=e.message) self.write(json.dumps(response)) diff --git a/grader_labextension/handlers/permission.py b/grader_labextension/handlers/permission.py index ae74b7a..6021c96 100644 --- a/grader_labextension/handlers/permission.py +++ b/grader_labextension/handlers/permission.py @@ -6,29 +6,31 @@ import json from grader_labextension.registry import register_handler -from grader_labextension.handlers.base_handler import ExtensionBaseHandler, cache -from tornado import web -from tornado.httpclient import HTTPClientError +from grader_labextension.handlers.base_handler import ExtensionBaseHandler +from tornado.web import HTTPError, authenticated +from grader_labextension.services.request import RequestServiceError -@register_handler(path=r"\/permissions\/?") +@register_handler(path=r"api\/permissions\/?") class PermissionBaseHandler(ExtensionBaseHandler): """ Tornado Handler class for http requests to /permissions. """ - @web.authenticated - @cache(max_age=10) + @authenticated async def get(self): """ Sends a GET-request to the grader service and returns the permissions of a user """ try: - response = await self.request_service.request( + response = await self.request_service.request_with_retries( "GET", - f"{self.service_base_url}/permissions", + f"{self.service_base_url}api/permissions", header=self.grader_authentication_header, response_callback=self.set_service_headers ) - except HTTPClientError as e: - self.log.error(e.response) - raise web.HTTPError(e.code, reason=e.response.reason) + except RequestServiceError as e: + self.log.error(e) + raise HTTPError(e.code, reason=e.message) + except Exception as e: + self.log.error(f'Unexpected Error: {e}') + raise HTTPError(e) self.write(json.dumps(response)) diff --git a/grader_labextension/handlers/submissions.py b/grader_labextension/handlers/submissions.py index 6876a03..bb00a81 100644 --- a/grader_labextension/handlers/submissions.py +++ b/grader_labextension/handlers/submissions.py @@ -5,28 +5,21 @@ # LICENSE file in the root directory of this source tree. import json -import datetime -from http import HTTPStatus - -import requests -from tornado.httpclient import HTTPClientError -from urllib.parse import urlparse, urlunparse - from grader_labextension.registry import register_handler -from grader_labextension.handlers.base_handler import ExtensionBaseHandler, cache, HandlerConfig -from grader_labextension.services.request import RequestService -from tornado.web import HTTPError +from grader_labextension.handlers.base_handler import ExtensionBaseHandler +from grader_labextension.services.request import RequestService, RequestServiceError +from tornado.web import HTTPError, authenticated @register_handler( - path=r"\/lectures\/(?P\d*)\/assignments\/(?P\d*)\/submissions\/?" + path=r"api\/lectures\/(?P\d*)\/assignments\/(?P\d*)\/submissions\/?" ) class SubmissionHandler(ExtensionBaseHandler): """ Tornado Handler class for http requests to /lectures/{lecture_id}/assignments/{assignment_id}/submissions. """ - @cache(max_age=15) + @authenticated async def get(self, lecture_id: int, assignment_id: int): """ Sends a GET-request to the grader service and returns submissions of a assignment @@ -44,21 +37,21 @@ async def get(self, lecture_id: int, assignment_id: int): try: response = await self.request_service.request( method="GET", - endpoint=f"{self.service_base_url}/lectures/{lecture_id}/assignments/{assignment_id}/submissions{query_params}", + endpoint=f"{self.service_base_url}api/lectures/{lecture_id}/assignments/{assignment_id}/submissions{query_params}", header=self.grader_authentication_header, response_callback=self.set_service_headers ) - except HTTPClientError as e: - self.log.error(e.response) - raise HTTPError(e.code, reason=e.response.reason) + except RequestServiceError as e: + self.log.error(e) + raise HTTPError(e.code, reason=e.message) self.write(json.dumps(response)) @register_handler( - path=r"\/lectures\/(?P\d*)\/assignments\/(?P\d*)\/submissions\/(" + path=r"api\/lectures\/(?P\d*)\/assignments\/(?P\d*)\/submissions\/(" r"?P\d*)\/logs\/?") class SubmissionLogsHandler(ExtensionBaseHandler): - @cache(max_age=15) + @authenticated async def get(self, lecture_id: int, assignment_id: int, submission_id: int): """Sends a GET-request to the grader service and returns the logs of a submission @@ -73,25 +66,26 @@ async def get(self, lecture_id: int, assignment_id: int, submission_id: int): try: response = await self.request_service.request( method="GET", - endpoint=f"{self.service_base_url}/lectures/{lecture_id}/assignments/{assignment_id}/submissions/{submission_id}/logs", + endpoint=f"{self.service_base_url}api/lectures/{lecture_id}/assignments/{assignment_id}/submissions/{submission_id}/logs", header=self.grader_authentication_header, response_callback=self.set_service_headers ) self.log.info(response) - except HTTPClientError as e: - self.log.error(e.response) - raise HTTPError(e.code, reason=e.response.reason) + except RequestServiceError as e: + self.log.error(e) + raise HTTPError(e.code, reason=e.message) self.write(response) @register_handler( - path=r"\/lectures\/(?P\d*)\/assignments\/(?P\d*)\/submissions\/(?P\d*)\/properties\/?" + path=r"api\/lectures\/(?P\d*)\/assignments\/(?P\d*)\/submissions\/(?P\d*)\/properties\/?" ) class SubmissionPropertiesHandler(ExtensionBaseHandler): """ Tornado Handler class for http requests to /lectures/{lecture_id}/assignments/{assignment_id}/submissions/properties. """ + @authenticated async def get(self, lecture_id: int, assignment_id: int, submission_id: int): """Sends a GET-request to the grader service and returns the properties of a submission @@ -106,13 +100,13 @@ async def get(self, lecture_id: int, assignment_id: int, submission_id: int): try: response = await self.request_service.request( method="GET", - endpoint=f"{self.service_base_url}/lectures/{lecture_id}/assignments/{assignment_id}/submissions/{submission_id}/properties", + endpoint=f"{self.service_base_url}api/lectures/{lecture_id}/assignments/{assignment_id}/submissions/{submission_id}/properties", header=self.grader_authentication_header, response_callback=self.set_service_headers ) - except HTTPClientError as e: - self.log.error(e.response) - raise HTTPError(e.code, reason=e.response.reason) + except RequestServiceError as e: + self.log.error(e) + raise HTTPError(e.code, reason=e.message) self.write(json.dumps(response)) async def put(self, lecture_id: int, assignment_id: int, submission_id: int): @@ -128,20 +122,20 @@ async def put(self, lecture_id: int, assignment_id: int, submission_id: int): try: await self.request_service.request( method="PUT", - endpoint=f"{self.service_base_url}/lectures/{lecture_id}/assignments/{assignment_id}/submissions/{submission_id}/properties", + endpoint=f"{self.service_base_url}api/lectures/{lecture_id}/assignments/{assignment_id}/submissions/{submission_id}/properties", header=self.grader_authentication_header, body=self.request.body.decode("utf-8"), decode_response=False, request_timeout=300.0 ) - except HTTPClientError as e: - self.log.error(e.response) - raise HTTPError(e.code, reason=e.response.reason) - self.write("OK") + except RequestServiceError as e: + self.log.error(e) + raise HTTPError(e.code, reason=e.message) + self.write({"status": "OK"}) @register_handler( - path=r"\/lectures\/(?P\d*)\/assignments\/(?P\d*)\/submissions\/(?P\d*)\/edit\/?" + path=r"api\/lectures\/(?P\d*)\/assignments\/(?P\d*)\/submissions\/(?P\d*)\/edit\/?" ) class SubmissionEditHandler(ExtensionBaseHandler): async def put(self, lecture_id: int, assignment_id: int, submission_id: int): @@ -157,27 +151,27 @@ async def put(self, lecture_id: int, assignment_id: int, submission_id: int): try: response = await self.request_service.request( method="PUT", - endpoint=f"{self.service_base_url}/lectures/{lecture_id}/assignments/{assignment_id}/submissions/{submission_id}/edit", + endpoint=f"{self.service_base_url}api/lectures/{lecture_id}/assignments/{assignment_id}/submissions/{submission_id}/edit", header=self.grader_authentication_header, body=self.request.body.decode("utf-8"), request_timeout=300.0, connect_timeout=300.0 ) - except HTTPClientError as e: - self.log.error(e.response) - raise HTTPError(e.code, reason=e.response.reason) + except RequestServiceError as e: + self.log.error(e) + raise HTTPError(e.code, reason=e.message) self.write(json.dumps(response)) @register_handler( - path=r"\/lectures\/(?P\d*)\/assignments\/(?P\d*)\/submissions\/(?P\d*)\/?" + path=r"api\/lectures\/(?P\d*)\/assignments\/(?P\d*)\/submissions\/(?P\d*)\/?" ) class SubmissionObjectHandler(ExtensionBaseHandler): """ Tornado Handler class for http requests to /lectures/{lecture_id}/assignments/{assignment_id}/submissions/{submission_id}. """ - @cache(max_age=15) + @authenticated async def get(self, lecture_id: int, assignment_id: int, submission_id: int): """Sends a GET-request to the grader service and returns a submission @@ -192,13 +186,13 @@ async def get(self, lecture_id: int, assignment_id: int, submission_id: int): try: response = await self.request_service.request( method="GET", - endpoint=f"{self.service_base_url}/lectures/{lecture_id}/assignments/{assignment_id}/submissions/{submission_id}", + endpoint=f"{self.service_base_url}api/lectures/{lecture_id}/assignments/{assignment_id}/submissions/{submission_id}", header=self.grader_authentication_header, response_callback=self.set_service_headers ) - except HTTPClientError as e: - self.log.error(e.response) - raise HTTPError(e.code, reason=e.response.reason) + except RequestServiceError as e: + self.log.error(e) + raise HTTPError(e.code, reason=e.message) self.write(json.dumps(response)) async def put(self, lecture_id: int, assignment_id: int, submission_id: int): @@ -214,19 +208,41 @@ async def put(self, lecture_id: int, assignment_id: int, submission_id: int): try: await self.request_service.request( method="PUT", - endpoint=f"{self.service_base_url}/lectures/{lecture_id}/assignments/{assignment_id}/submissions/{submission_id}", + endpoint=f"{self.service_base_url}api/lectures/{lecture_id}/assignments/{assignment_id}/submissions/{submission_id}", header=self.grader_authentication_header, body=self.request.body.decode("utf-8"), decode_response=False ) - except HTTPClientError as e: - self.log.error(e.response) - raise HTTPError(e.code, reason=e.response.reason) - self.write("OK") + except RequestServiceError as e: + self.log.error(e) + raise HTTPError(e.code, reason=e.message) + self.write({"status": "OK"}) + + async def delete(self, lecture_id: int, assignment_id: int, submission_id: int): + """Sends a DELETE-request to the grader service to "soft"-delete a assignment + + :param lecture_id: id of the lecture + :type lecture_id: int + :param assignment_id: id of the assignment + :type assignment_id: int + :param submission_id: id of the submission + :type submission_id: int + """ + try: + await self.request_service.request( + method="DELETE", + endpoint=f"{self.service_base_url}api/lectures/{lecture_id}/assignments/{assignment_id}/submissions/{submission_id}", + header=self.grader_authentication_header, + decode_response=False + ) + except RequestServiceError as e: + raise HTTPError(e.code, reason=e.message) + + self.write({"status": "OK"}) @register_handler( - path=r"\/lectures\/(?P\d*)\/assignments\/(?P\d*)\/submissions\/lti\/?" + path=r"api\/lectures\/(?P\d*)\/assignments\/(?P\d*)\/submissions\/lti\/?" ) class LtiSyncHandler(ExtensionBaseHandler): @@ -244,10 +260,41 @@ async def put(self, lecture_id: int, assignment_id: int): try: response = await self.request_service.request( method="GET", - endpoint=f"{self.service_base_url}/lectures/{lecture_id}/assignments/{assignment_id}/submissions/lti", + endpoint=f"{self.service_base_url}api/lectures/{lecture_id}/assignments/{assignment_id}/submissions/lti", header=self.grader_authentication_header) - except HTTPClientError as e: - self.log.error(e.response.body) - raise HTTPError(e.code, reason=json.loads(e.response.body).get("message", "Error while syncing grades")) + except RequestServiceError as e: + self.log.error(e) + raise HTTPError(e.code, reason=e.message) self.write(json.dumps(response)) + +@register_handler( + path=r"api\/lectures\/(?P\d*)\/assignments\/(?P\d*)\/submissions\/count\/?" +) +class SubmissionCountHandler(ExtensionBaseHandler): + """ + Tornado Handler class for http requests to /lectures/{lecture_id}/assignments/{assignment_id}/submissions/count. + """ + + @authenticated + async def get(self, lecture_id: int, assignment_id: int): + """ Returns the count of submissions made by the student for an assignment. + + :param lecture_id: id of the lecture + :type lecture_id: int + :param assignment_id: id of the assignment + :type assignment_id: int + """ + + try: + response = await self.request_service.request( + method="GET", + endpoint=f"{self.service_base_url}api/lectures/{lecture_id}/assignments/{assignment_id}/submissions/count", + header=self.grader_authentication_header, + response_callback=self.set_service_headers + ) + self.log.info(f"{response}") + except RequestServiceError as e: + self.log.error(e) + raise HTTPError(e.code, reason=e.message) + self.write(json.dumps(response)) \ No newline at end of file diff --git a/grader_labextension/handlers/version_control.py b/grader_labextension/handlers/version_control.py index 5ea1d51..b0682ab 100644 --- a/grader_labextension/handlers/version_control.py +++ b/grader_labextension/handlers/version_control.py @@ -4,24 +4,26 @@ # This source code is licensed under the BSD-style license found in the # LICENSE file in the root directory of this source tree. +from ast import List import json import os import shutil from http import HTTPStatus from urllib.parse import unquote, quote -from tornado.web import HTTPError +from tornado.web import HTTPError, authenticated +from grader_labextension.services.request import RequestServiceError from grader_service.convert.converters.base import GraderConvertException from grader_service.convert.converters.generate_assignment import GenerateAssignment from .base_handler import ExtensionBaseHandler, cache from ..api.models.submission import Submission from ..registry import register_handler from ..services.git import GitError, GitService -from tornado.httpclient import HTTPClientError, HTTPResponse +from tornado.httpclient import HTTPResponse @register_handler( - path=r"\/lectures\/(?P\d*)\/assignments\/(?P\d*)\/generate\/?" + path=r"api\/lectures\/(?P\d*)\/assignments\/(?P\d*)\/generate\/?" ) class GenerateHandler(ExtensionBaseHandler): """ @@ -39,17 +41,17 @@ async def put(self, lecture_id: int, assignment_id: int): try: lecture = await self.request_service.request( "GET", - f"{self.service_base_url}/lectures/{lecture_id}", + f"{self.service_base_url}api/lectures/{lecture_id}", header=self.grader_authentication_header, ) assignment = await self.request_service.request( "GET", - f"{self.service_base_url}/lectures/{lecture_id}/assignments/{assignment_id}", + f"{self.service_base_url}api/lectures/{lecture_id}/assignments/{assignment_id}", header=self.grader_authentication_header, ) - except HTTPClientError as e: - self.log.error(e.response) - raise HTTPError(e.code, reason=e.response.reason) + except RequestServiceError as e: + self.log.error(e) + raise HTTPError(e.code, reason=e.message) code = lecture["code"] a_id = assignment["id"] @@ -66,6 +68,7 @@ async def put(self, lecture_id: int, assignment_id: int): copy_files=True, # Always copy files from source to release ) generator.force = True + generator.log = self.log try: # delete contents of output directory since we might have chosen to disallow files @@ -89,18 +92,59 @@ async def put(self, lecture_id: int, assignment_id: int): except OSError as e: self.log.error(f"Could delete {gradebook_path}! Error: {e.strerror}") self.log.info("GenerateAssignment conversion done") - self.write("OK") + self.write({"status": "OK"}) + + +@register_handler( + path=r"api\/lectures\/(?P\d*)\/assignments\/(?P\d*)\/remote-file-status\/(?P\w*)\/?" +) +class GitRemoteFileStatusHandler(ExtensionBaseHandler): + """ + Tornado Handler class for http requests to /lectures/{lecture_id}/assignments/{assignment_id}/remote-file-status/{repo}. + """ + + @authenticated + async def get(self, lecture_id: int, assignment_id: int, repo: str): + if repo not in {"assignment", "source", "release"}: + self.log.error(HTTPStatus.NOT_FOUND) + raise HTTPError( + HTTPStatus.NOT_FOUND, reason=f"Repository {repo} does not exist" + ) + lecture = await self.get_lecture(lecture_id) + assignment = await self.get_assignment(lecture_id, assignment_id) + file_path = self.get_query_argument('file') # Retrieve the file path from the query parameters + git_service = GitService( + server_root_dir=self.root_dir, + lecture_code=lecture["code"], + assignment_id=assignment["id"], + repo_type=repo, + config=self.config, + force_user_repo=True if repo == "release" else False, + ) + try: + if not git_service.is_git(): + git_service.init() + git_service.set_author(author=self.user_name) + git_service.set_remote(f"grader_{repo}") + git_service.fetch_all() + status = git_service.check_remote_file_status(file_path) + self.log.info(f"File {file_path} status: {status}") + except GitError as e: + self.log.error(e) + raise HTTPError(e.code, reason=e.error) + response = json.dumps({"status": status.name}) + self.write(response) @register_handler( - path=r"\/lectures\/(?P\d*)\/assignments\/(?P\d*)\/remote-status\/(?P\w*)\/?" + path=r"api\/lectures\/(?P\d*)\/assignments\/(?P\d*)\/remote-status\/(?P\w*)\/?" ) class GitRemoteStatusHandler(ExtensionBaseHandler): """ Tornado Handler class for http requests to /lectures/{lecture_id}/assignments/{assignment_id}/remote_status/{repo}. """ - @cache(max_age=15) + @authenticated async def get(self, lecture_id: int, assignment_id: int, repo: str): if repo not in {"assignment", "source", "release"}: self.log.error(HTTPStatus.NOT_FOUND) @@ -126,19 +170,19 @@ async def get(self, lecture_id: int, assignment_id: int, repo: str): status = git_service.check_remote_status(f"grader_{repo}", "main") except GitError as e: self.log.error(e) - raise HTTPError(HTTPStatus.INTERNAL_SERVER_ERROR, reason=str(e)) - self.write(status.name) + raise HTTPError(e.code, reason=e.error) + response = json.dumps({"status": status.name}) + self.write(response) @register_handler( - path=r"\/lectures\/(?P\d*)\/assignments\/(?P\d*)\/log\/(?P\w*)\/?" + path=r"api\/lectures\/(?P\d*)\/assignments\/(?P\d*)\/log\/(?P\w*)\/?" ) class GitLogHandler(ExtensionBaseHandler): """ Tornado Handler class for http requests to /lectures/{lecture_id}/assignments/{assignment_id}/log/{repo}. """ - - @cache(max_age=15) + @authenticated async def get(self, lecture_id: int, assignment_id: int, repo: str): """ Sends a GET request to the grader service to get the logs of a given repo. @@ -157,17 +201,17 @@ async def get(self, lecture_id: int, assignment_id: int, repo: str): try: lecture = await self.request_service.request( "GET", - f"{self.service_base_url}/lectures/{lecture_id}", + f"{self.service_base_url}api/lectures/{lecture_id}", header=self.grader_authentication_header, ) assignment = await self.request_service.request( "GET", - f"{self.service_base_url}/lectures/{lecture_id}/assignments/{assignment_id}", + f"{self.service_base_url}api/lectures/{lecture_id}/assignments/{assignment_id}", header=self.grader_authentication_header, ) - except HTTPClientError as e: - self.log.error(e.response) - raise HTTPError(e.code, reason=e.response.reason) + except RequestServiceError as e: + self.log.error(e) + raise HTTPError(e.code, reason=e.message) git_service = GitService( server_root_dir=self.root_dir, @@ -189,19 +233,20 @@ async def get(self, lecture_id: int, assignment_id: int, repo: str): logs = [] except GitError as e: self.log.error(e) - raise HTTPError(HTTPStatus.INTERNAL_SERVER_ERROR, reason=str(e)) + raise HTTPError(e.code, reason=e.error) self.write(json.dumps(logs)) @register_handler( - path=r"\/lectures\/(?P\d*)\/assignments\/(?P\d*)\/pull\/(?P\w*)\/?" + path=r"api\/lectures\/(?P\d*)\/assignments\/(?P\d*)\/pull\/(?P\w*)\/?" ) class PullHandler(ExtensionBaseHandler): """ Tornado Handler class for http requests to /lectures/{lecture_id}/assignments/{assignment_id}/pull/{repo}. """ + @authenticated async def get(self, lecture_id: int, assignment_id: int, repo: str): """Creates a local repository and pulls the specified repo type @@ -224,17 +269,17 @@ async def get(self, lecture_id: int, assignment_id: int, repo: str): try: lecture = await self.request_service.request( "GET", - f"{self.service_base_url}/lectures/{lecture_id}", + f"{self.service_base_url}api/lectures/{lecture_id}", header=self.grader_authentication_header, ) assignment = await self.request_service.request( "GET", - f"{self.service_base_url}/lectures/{lecture_id}/assignments/{assignment_id}", + f"{self.service_base_url}api/lectures/{lecture_id}/assignments/{assignment_id}", header=self.grader_authentication_header, ) - except HTTPClientError as e: - self.log.error(e.response) - raise HTTPError(e.code, reason=e.response.reason) + except RequestServiceError as e: + self.log.error(e) + raise HTTPError(e.code, reason=e.message) git_service = GitService( server_root_dir=self.root_dir, @@ -244,6 +289,7 @@ async def get(self, lecture_id: int, assignment_id: int, repo: str): config=self.config, force_user_repo=repo == "release", sub_id=sub_id, + log=self.log ) try: if not git_service.is_git(): @@ -251,14 +297,14 @@ async def get(self, lecture_id: int, assignment_id: int, repo: str): git_service.set_author(author=self.user_name) git_service.set_remote(f"grader_{repo}", sub_id=sub_id) git_service.pull(f"grader_{repo}", force=True) - self.write("OK") + self.write({"status": "OK"}) except GitError as e: self.log.error("GitError:\n" + e.error) - raise HTTPError(HTTPStatus.INTERNAL_SERVER_ERROR, reason=e.error) + raise HTTPError(e.code, reason=e.error) @register_handler( - path=r"\/lectures\/(?P\d*)\/assignments\/(?P\d*)\/push\/(?P\w*)\/?" + path=r"api\/lectures\/(?P\d*)\/assignments\/(?P\d*)\/push\/(?P\w*)\/?" ) class PushHandler(ExtensionBaseHandler): """ @@ -280,6 +326,7 @@ async def put(self, lecture_id: int, assignment_id: int, repo: str): self.write_error(404) sub_id = self.get_argument("subid", None) commit_message = self.get_argument("commit-message", None) + selected_files = self.get_arguments("selected-files") submit = self.get_argument("submit", "false") == "true" # this username is used when an instructor creates a submission for a user (ignored otherwise) username = self.get_argument("for_user", None) @@ -291,17 +338,17 @@ async def put(self, lecture_id: int, assignment_id: int, repo: str): try: lecture = await self.request_service.request( "GET", - f"{self.service_base_url}/lectures/{lecture_id}", + f"{self.service_base_url}api/lectures/{lecture_id}", header=self.grader_authentication_header, ) assignment = await self.request_service.request( "GET", - f"{self.service_base_url}/lectures/{lecture_id}/assignments/{assignment_id}", + f"{self.service_base_url}api/lectures/{lecture_id}/assignments/{assignment_id}", header=self.grader_authentication_header, ) - except HTTPClientError as e: - self.log.error(e.response) - raise HTTPError(e.code, reason=e.response.reason) + except RequestServiceError as e: + self.log.error(e) + raise HTTPError(e.code, reason=e.message) # differentiate between "normal" edit and "create" edit by sub_id -> if it is None we know we are in # submission creation mode instead of edit mode @@ -309,7 +356,7 @@ async def put(self, lecture_id: int, assignment_id: int, repo: str): submission = Submission(commit_hash="0" * 40) response: dict = await self.request_service.request( "POST", - f"{self.service_base_url}/lectures/{lecture_id}/assignments/{assignment_id}/submissions", + f"{self.service_base_url}api/lectures/{lecture_id}/assignments/{assignment_id}/submissions", body=submission.to_dict(), header=self.grader_authentication_header, ) @@ -319,7 +366,7 @@ async def put(self, lecture_id: int, assignment_id: int, repo: str): submission.edited = True await self.request_service.request( "PUT", - f"{self.service_base_url}/lectures/{lecture_id}/assignments/{assignment_id}/submissions/{submission.id}", + f"{self.service_base_url}api/lectures/{lecture_id}/assignments/{assignment_id}/submissions/{submission.id}", body=submission.to_dict(), header=self.grader_authentication_header, ) @@ -345,7 +392,13 @@ async def put(self, lecture_id: int, assignment_id: int, repo: str): repo_type="source", config=self.config, ).path - git_service.copy_repo_contents(src=src_path) + + if(selected_files): + self.log.info(f"Selected files to push to {repo}: {selected_files}") + + git_service.copy_repo_contents(src=src_path, selected_files=selected_files) + + self.log.info(f"Files in {src_path} directory after copying selected files: {os.listdir(src_path)}") # call nbconvert before pushing generator = GenerateAssignment( @@ -355,6 +408,7 @@ async def put(self, lecture_id: int, assignment_id: int, repo: str): copy_files=True, # Always copy files from source to release ) generator.force = True + generator.log = self.log try: # delete contents of output directory since we might have chosen to disallow files @@ -373,8 +427,7 @@ async def put(self, lecture_id: int, assignment_id: int, repo: str): self.log.error( "Converting failed: Error converting notebook!", exc_info=True ) - - raise HTTPError(409, reason=str(e)) + raise HTTPError(HTTPStatus.CONFLICT, reason=str(e)) try: gradebook_path = os.path.join(git_service.path, "gradebook.json") self.log.info(f"Reading gradebook file: {gradebook_path}") @@ -383,14 +436,14 @@ async def put(self, lecture_id: int, assignment_id: int, repo: str): except FileNotFoundError: self.log.error(f"Cannot find gradebook file: {gradebook_path}") raise HTTPError( - HTTPStatus.INTERNAL_SERVER_ERROR, + HTTPStatus.NOT_FOUND, reason=f"Cannot find gradebook file: {gradebook_path}", ) self.log.info(f"Setting properties of assignment from {gradebook_path}") response: HTTPResponse = await self.request_service.request( "PUT", - f"{self.service_base_url}/lectures/{lecture_id}/assignments/{assignment_id}/properties", + f"{self.service_base_url}api/lectures/{lecture_id}/assignments/{assignment_id}/properties", header=self.grader_authentication_header, body=gradebook_json, decode_response=False, @@ -410,7 +463,7 @@ async def put(self, lecture_id: int, assignment_id: int, repo: str): f"Cannot delete {gradebook_path}! Error: {e.strerror}\nAborting push!" ) raise HTTPError( - HTTPStatus.INTERNAL_SERVER_ERROR, + HTTPStatus.CONFLICT, reason=f"Cannot delete {gradebook_path}! Error: {e.strerror}\nAborting push!", ) @@ -425,20 +478,20 @@ async def put(self, lecture_id: int, assignment_id: int, repo: str): git_service.set_remote(f"grader_{repo}", sub_id=sub_id) except GitError as e: self.log.error("GitError:\n" + e.error) - raise HTTPError(HTTPStatus.INTERNAL_SERVER_ERROR, reason=e.error) + raise HTTPError(e.code, reason=e.error) try: - git_service.commit(m=commit_message) + git_service.commit(message=commit_message, selected_files=selected_files) except GitError as e: self.log.error("GitError:\n" + e.error) - raise HTTPError(HTTPStatus.INTERNAL_SERVER_ERROR, reason=e.error) + raise HTTPError(e.code, reason=e.error) try: git_service.push(f"grader_{repo}", force=True) except GitError as e: self.log.error("GitError:\n" + e.error) git_service.undo_commit() - raise HTTPError(HTTPStatus.INTERNAL_SERVER_ERROR, reason=str(e.error)) + raise HTTPError(e.code, reason=str(e.error)) if submit and repo == "assignment": self.log.info(f"Submitting assignment {assignment_id}!") @@ -447,7 +500,7 @@ async def put(self, lecture_id: int, assignment_id: int, repo: str): submission = Submission(commit_hash=latest_commit_hash) response = await self.request_service.request( "POST", - f"{self.service_base_url}/lectures/{lecture_id}/assignments/{assignment_id}/submissions", + f"{self.service_base_url}api/lectures/{lecture_id}/assignments/{assignment_id}/submissions", body=submission.to_dict(), header=self.grader_authentication_header, ) @@ -456,21 +509,22 @@ async def put(self, lecture_id: int, assignment_id: int, repo: str): except (KeyError, IndexError) as e: self.log.error(e) raise HTTPError(HTTPStatus.INTERNAL_SERVER_ERROR, reason=str(e)) - except HTTPClientError as e: - self.log.error(e.response) - raise HTTPError(e.code, reason=e.response.reason) + except RequestServiceError as e: + self.log.error(e) + raise HTTPError(e.code, reason=e.message) - self.write("OK") + self.write({"status": "OK"}) @register_handler( - path=r"\/lectures\/(?P\d*)\/assignments\/(?P\d*)\/reset\/?" + path=r"api\/lectures\/(?P\d*)\/assignments\/(?P\d*)\/reset\/?" ) class ResetHandler(ExtensionBaseHandler): """ Tornado Handler class for http requests to /lectures/{lecture_id}/assignments/{assignment_id}/reset. """ + @authenticated async def get(self, lecture_id: int, assignment_id: int): """ Sends a GET request to the grader service that resets the user repo. @@ -482,13 +536,59 @@ async def get(self, lecture_id: int, assignment_id: int): try: await self.request_service.request( "GET", - f"{self.service_base_url}/lectures/{lecture_id}/assignments/{assignment_id}/reset", + f"{self.service_base_url}api/lectures/{lecture_id}/assignments/{assignment_id}/reset", + header=self.grader_authentication_header, + ) + except RequestServiceError as e: + self.log.error(e) + raise HTTPError(e.code, reason=e.message) + self.write({"status": "OK"}) + + +@register_handler( + path=r"api\/lectures\/(?P\d*)\/assignments\/(?P\d*)\/restore\/(?P\w*)\/?" +) +class RestoreHandler(ExtensionBaseHandler): + @authenticated + async def get(self, lecture_id: int, assignment_id: int, commit_hash: str): + + try: + lecture = await self.request_service.request( + "GET", + f"{self.service_base_url}api/lectures/{lecture_id}", header=self.grader_authentication_header, ) - except HTTPClientError as e: - self.log.error(e.response) - raise HTTPError(e.code, reason=e.response.reason) - self.write("OK") + assignment = await self.request_service.request( + "GET", + f"{self.service_base_url}api/lectures/{lecture_id}/assignments/{assignment_id}", + header=self.grader_authentication_header, + ) + except RequestServiceError as e: + self.log.error(e) + raise HTTPError(e.code, reason=e.message) + + git_service = GitService( + server_root_dir=self.root_dir, + lecture_code=lecture["code"], + assignment_id=assignment["id"], + repo_type="assignment", + config=self.config, + force_user_repo=False, + sub_id=None, + ) + try: + if not git_service.is_git(): + git_service.init() + git_service.set_author(author=self.user_name) + git_service.set_remote("grader_assignment") + # first reset by pull so there are no changes in the repository before reverting + git_service.pull("grader_assignment", force=True) + git_service.revert(commit_hash=commit_hash) + git_service.push("grader_assignment") + self.write({"status": "OK"}) + except GitError as e: + self.log.error("GitError:\n" + e.error) + raise HTTPError(e.code, reason=e.error) @register_handler( @@ -499,6 +599,7 @@ class NotebookAccessHandler(ExtensionBaseHandler): Tornado Handler class for http requests to /lectures/{lecture_id}/assignments/{assignment_id}/{notebook_name}. """ + @authenticated async def get(self, lecture_id: int, assignment_id: int, notebook_name: str): """ Sends a GET request to the grader service to access notebook and redirect to it. @@ -512,15 +613,15 @@ async def get(self, lecture_id: int, assignment_id: int, notebook_name: str): try: lecture = await self.request_service.request( "GET", - f"{self.service_base_url}/lectures/{lecture_id}", + f"{self.service_base_url}api/lectures/{lecture_id}", header=self.grader_authentication_header, ) assignment = await self.request_service.request( "GET", - f"{self.service_base_url}/lectures/{lecture_id}/assignments/{assignment_id}", + f"{self.service_base_url}api/lectures/{lecture_id}/assignments/{assignment_id}", header=self.grader_authentication_header, ) - except HTTPClientError as e: + except RequestServiceError as e: self.set_status(e.code) self.write_error(e.code) return @@ -540,7 +641,7 @@ async def get(self, lecture_id: int, assignment_id: int, notebook_name: str): git_service.set_author(author=self.user_name) git_service.set_remote(f"grader_release") git_service.pull(f"grader_release", force=True) - self.write("OK") + self.write({"status": "OK"}) except GitError as e: self.log.error("GitError:\n" + e.error) self.write_error(400) diff --git a/grader_labextension/services/git.py b/grader_labextension/services/git.py index c0b6475..2f9287e 100644 --- a/grader_labextension/services/git.py +++ b/grader_labextension/services/git.py @@ -1,18 +1,14 @@ # Copyright (c) 2022, TU Wien # All rights reserved. # -# This source code is licensed under the BSD-style license found in the -# LICENSE file in the root directory of this source tree. - import enum import logging import subprocess +from pathlib import Path from typing import List, Dict, Union, Tuple -from urllib.parse import urlparse, ParseResultBytes - +from urllib.parse import urlparse from traitlets.config.configurable import Configurable -from traitlets.config.loader import Config -from traitlets.traitlets import Int, TraitError, Unicode, validate +from traitlets.traitlets import Unicode import os import posixpath import shlex @@ -22,182 +18,173 @@ class GitError(Exception): - def __init__(self, error: str): + def __init__(self, code: int = 500, error: str = "Unknown Error"): + self.code = code self.error = error + super().__init__(error) - def __str__(self): - return self.error - - def __repr__(self) -> str: - return self.__str__() - - -class RemoteStatus(enum.Enum): - up_to_date = 1 - pull_needed = 2 - push_needed = 3 - divergent = 4 +class RemoteFileStatus(enum.Enum): + UP_TO_DATE = 1 + PULL_NEEDED = 2 + PUSH_NEEDED = 3 + DIVERGENT = 4 + NO_REMOTE_REPO = 5 class GitService(Configurable): - git_access_token = Unicode(os.environ.get("JUPYTERHUB_API_TOKEN"), allow_none=False).tag(config=True) - git_service_url = Unicode( - f'{os.environ.get("GRADER_HOST_URL", "http://127.0.0.1:4010")}{os.environ.get("GRADER_GIT_BASE_URL", "/services/grader/git")}', - allow_none=False).tag(config=True) + DEFAULT_HOST_URL = "http://127.0.0.1:4010" + DEFAULT_GIT_URL_PREFIX = "/services/grader/git" + _git_version = None + git_access_token = Unicode(os.environ.get("GRADER_API_TOKEN"), allow_none=False).tag(config=True) + git_service_url = Unicode(os.environ.get("GRADER_HOST_URL", DEFAULT_HOST_URL) + os.environ.get("GRADER_GIT_PREFIX", DEFAULT_GIT_URL_PREFIX), allow_none=False).tag(config=True) def __init__(self, server_root_dir: str, lecture_code: str, assignment_id: int, repo_type: str, - force_user_repo=False, sub_id=None, username=None, *args, **kwargs): + force_user_repo=False, sub_id=None, username=None, log=logging.getLogger('gitservice'), *args, **kwargs): super().__init__(*args, **kwargs) - self.log = logging.getLogger(str(self.__class__)) - self._git_version = None + self.log = log self.git_root_dir = server_root_dir self.lecture_code = lecture_code self.assignment_id = assignment_id self.repo_type = repo_type + + self.path = self._determine_repo_path(force_user_repo, sub_id, username) + os.makedirs(self.path, exist_ok=True) + + self._initialize_git_logging() + + def _determine_repo_path(self, force_user_repo: bool, sub_id: str, username: str) -> str: + """Determine the path for the git repository based on the type.""" if self.repo_type == "assignment" or force_user_repo: - self.path = os.path.join(self.git_root_dir, self.lecture_code, "assignments", str(self.assignment_id)) + return os.path.join(self.git_root_dir, self.lecture_code, "assignments", str(self.assignment_id)) elif self.repo_type == "edit": if username is not None: - self.path = os.path.join(self.git_root_dir, self.lecture_code, "create", str(self.assignment_id), username) + return os.path.join(self.git_root_dir, self.lecture_code, "create", str(self.assignment_id), username) else: - self.path = os.path.join(self.git_root_dir, self.lecture_code, self.repo_type, str(self.assignment_id), str(sub_id)) - else: - self.path = os.path.join(self.git_root_dir, self.lecture_code, self.repo_type, str(self.assignment_id)) - + return os.path.join(self.git_root_dir, self.lecture_code, self.repo_type, str(self.assignment_id), str(sub_id)) + return os.path.join(self.git_root_dir, self.lecture_code, self.repo_type, str(self.assignment_id)) + + def _initialize_git_logging(self): + """Initialize logging related to git configuration.""" self.log.info(f"New git service working in {self.path}") - os.makedirs(self.path, exist_ok=True) + self.git_http_scheme, self.git_remote_url = self._parse_git_service_url() + self.log.info(f"git_service_url: {self.git_service_url}") - self.log.info("git_access_token: " + self.git_access_token) + def _parse_git_service_url(self) -> Tuple[str, str]: + """Parse the git service URL into scheme and remote URL.""" url_parsed = urlparse(self.git_service_url) - self.log.info(f"git_service_url: " + self.git_service_url) - self.git_http_scheme: str = url_parsed.scheme - self.git_remote_url: str = url_parsed.netloc + url_parsed.path - self.log.info("git_http_scheme: " + self.git_http_scheme) - self.log.info("git_remote_url: " + self.git_remote_url) + return url_parsed.scheme, f"{url_parsed.netloc}{url_parsed.path}" - def push(self, origin: str, force=False): - """Pushes commits on the remote + def push(self, origin: str, force: bool = False): + """Push commits to the remote repository. Args: - origin (str): the remote - force (bool, optional): states if the operation should be forced. Defaults to False. + origin (str): The remote repository. + force (bool): Whether to force push. Defaults to False. """ - self.log.info(f"Pushing remote {origin} for {self.path}") + self.log.info(f"Pushing to remote {origin} at {self.path}") self._run_command(f"git push {origin} main" + (" --force" if force else ""), cwd=self.path) - def set_remote(self, origin: str, sub_id=None): - """Set a remote in the local repository + def set_remote(self, origin: str, sub_id: str = None): + """Set or update the remote repository. Args: - origin (str): the remote - sub_id ([type], optional): a query param for the feedback pull. Defaults to None. + origin (str): The remote name. + sub_id (str): Optional query parameter for feedback pull. """ self.log.info(f"Setting remote {origin} for {self.path}") url = posixpath.join(self.git_remote_url, self.lecture_code, str(self.assignment_id), self.repo_type) + try: - if sub_id is None: - self._run_command( - f"git remote add {origin} {self.git_http_scheme}://oauth:{self.git_access_token}@{url}", - cwd=self.path) - else: - self.log.info(f"Setting remote with sub_id {sub_id}") - self._run_command( - f"git remote add {origin} {self.git_http_scheme}://oauth:{self.git_access_token}@{posixpath.join(url, sub_id)}", - cwd=self.path) + self._run_command(f"git remote add {origin} {self._build_remote_url(url, sub_id)}", cwd=self.path) + except GitError: + self.log.warning(f"Remote {origin} already exists. Updating URL.") + self._run_command(f"git remote set-url {origin} {self._build_remote_url(url, sub_id)}", cwd=self.path) - except GitError as e: - self.log.error("GitError:\n" + e.error) - self.log.info(f"Remote set: Updating remote {origin} for {self.path}") - if sub_id is None: - self._run_command( - f"git remote set-url {origin} {self.git_http_scheme}://oauth:{self.git_access_token}@{url}", - cwd=self.path) - else: - self.log.info(f"Setting remote with sub_id {sub_id}") - self._run_command( - f"git remote set-url {origin} {self.git_http_scheme}://oauth:{self.git_access_token}@{posixpath.join(url, sub_id)}", - cwd=self.path) + def _build_remote_url(self, base_url: str, sub_id: str = None) -> str: + """Build the complete remote URL for the git repository. + + Args: + base_url (str): The base URL of the remote repository. + sub_id (str): Optional sub_id for the URL. - def delete_remote(self, origin: str): - raise NotImplementedError() + Returns: + str: The complete remote URL. + """ + return f"{self.git_http_scheme}://oauth:{self.git_access_token}@{posixpath.join(base_url, sub_id or '')}" def switch_branch(self, branch: str): - """Switches into another branch + """Switch to the specified branch. Args: - branch (str): the branch name + branch (str): The branch name. """ - self.log.info(f"Fetching all at path {self.path}") - self._run_command(f"git fetch --all", cwd=self.path) - self.log.info(f"Switching to branch {branch} at path {self.path}") + self.log.info(f"Fetching all branches at {self.path}") + self._run_command("git fetch --all", cwd=self.path) + self.log.info(f"Switching to branch {branch} at {self.path}") self._run_command(f"git checkout {branch}", cwd=self.path) def fetch_all(self): self.log.info(f"Fetching all at path {self.path}") self._run_command(f"git fetch --all", cwd=self.path) - - def go_to_commit(self, commit_hash): - self.log.info(f"Show commit with hash {commit_hash}") - self._run_command(f"git checkout {commit_hash}", cwd=self.path) - - def undo_commit(self, n: int = 1) -> None: - self.log.info(f"Undoing {n} commit(s)") - self._run_command(f"git reset --hard HEAD~{n}", cwd=self.path) - self._run_command(f"git gc", cwd=self.path) - - - def pull(self, origin: str, branch="main", force=False): - """Pulls a repository + + def pull(self, origin: str, branch: str = "main", force: bool = False): + """Pull changes from the remote repository. Args: - origin (str): the remote - branch (str, optional): the branch name. Defaults to "main". - force (bool, optional): states if the operation should be forced. Defaults to False. + origin (str): The remote repository. + branch (str): The branch to pull from. Defaults to "main". + force (bool): Whether to force the pull. Defaults to False. """ + self.log.info(f"Pulling from {origin}/{branch} at {self.path}") + if not self.remote_branch_exists(origin=origin, branch=branch): + raise GitError(404, "Remote repository not found. Please ensure your assignment is pushed to the repository before proceeding.") if force: - self.log.info(f"Pulling remote {origin}") - out = self._run_command( - f'sh -c "git clean -fd && git fetch {origin} && git reset --hard {origin}/{branch}"', cwd=self.path, - capture_output=True) - self.log.info(out) - # self._run_command(f'sh -c "git fetch --all && git reset --mixed {origin}/main"',cwd=self.path) + # clean local changes + command = "git clean -fd" + self._run_command(command, cwd=self.path) + # fetch info + command = f"git fetch {origin}" + self._run_command(command, cwd=self.path) + # reset to branch head + command = f"git reset --hard {origin}/{branch}" + self._run_command(command, cwd=self.path) else: - self._run_command(f"git pull {origin} {branch}", cwd=self.path) + # just pull the branch + command = f"git pull {origin} {branch}" + self._run_command(command, cwd=self.path) - def init(self, force=False): - """Initiates a local repository + def init(self, force: bool = False): + """Initialize a local repository. Args: - force (bool, optional): states if the operation should be forced. Defaults to False. + force (bool): Whether to force initialization. Defaults to False. """ if not self.is_git() or force: - self.log.info(f"Calling init for {self.path}") - if self.git_version < (2, 28): - self._run_command(f"git init", cwd=self.path) - self._run_command("git checkout -b main", cwd=self.path) - else: - self._run_command(f"git init -b main", cwd=self.path) + self.log.info(f"Initializing git repository at {self.path}") + command = "git init -b main" if self.git_version >= (2, 28) else "git init" + self._run_command(command, cwd=self.path) - def is_git(self): - """Checks if the directory is a local repository + def go_to_commit(self, commit_hash): + self.log.info(f"Show commit with hash {commit_hash}") + self._run_command(f"git checkout {commit_hash}", cwd=self.path) - Returns: - bool: states if the directory is a repository - """ - return os.path.exists(os.path.join(self.path, ".git")) + def undo_commit(self, n: int = 1) -> None: + self.log.info(f"Undoing {n} commit(s)") + self._run_command(f"git reset --hard HEAD~{n}", cwd=self.path) + self._run_command(f"git gc", cwd=self.path) - def commit(self, m=str(datetime.now())): - """Commits the staged changes + def revert(self, commit_hash: str): + self.log.info(f"Reverting to {commit_hash}") + self._run_command(f'git revert --no-commit {commit_hash}..HEAD', cwd=self.path) + self._run_command(f'git commit -m "reverting to {commit_hash}" --allow-empty', cwd=self.path) + + def is_git(self) -> bool: + """Check if the directory is a git repository. - Args: - m (str, optional): the commit message. Defaults to str(datetime.now()). + Returns: + bool: True if it's a git repository, False otherwise. """ - # self.log.info("Adding all files") - # self._run_command(f'git add -A', cwd=self.path) - # self.log.info("Committing repository") - # self._run_command(f'git commit -m "{m}"', cwd=self.path) - self.log.info(f"Adding all files and committing in {self.path}") - self._run_command(f'sh -c \'git add -A && git commit --allow-empty -m "{m}"\'', cwd=self.path) + return Path(self.path).joinpath(".git").exists() def set_author(self, author): # TODO: maybe ask user to specify their own choices @@ -215,6 +202,7 @@ def clone(self, origin: str, force=False): self.set_remote(origin=origin) self.pull(origin=origin, force=force) + def delete_repo_contents(self, include_git=False): """Deletes the contents of the git service @@ -231,60 +219,69 @@ def delete_repo_contents(self, include_git=False): self.log.info(f"Deleted {os.path.join(root, d)} from {self.git_root_dir}") # Note: dirs_exist_ok was only added in Python 3.8 - def copy_repo_contents(self, src: str): + def copy_repo_contents(self, src: str, selected_files: List[str] = None): """copies repo contents from src to the git path Args: src (str): path where the to be copied files reside """ - self.log.info(f"Copying repository contents from {src} to {self.path}") ignore = shutil.ignore_patterns(".git", "__pycache__") - if sys.version_info.major == 3 and sys.version_info.minor >= 8: - shutil.copytree(src, self.path, ignore=ignore, dirs_exist_ok=True) - else: + if selected_files: + self.log.info(f"Copying only selected files from {src} to {self.path}") for item in os.listdir(src): - s = os.path.join(src, item) - d = os.path.join(self.path, item) - if os.path.isdir(s): - shutil.copytree(s, d, ignore=ignore) - else: - shutil.copy2(s, d) - - def check_remote_status(self, origin: str, branch: str) -> RemoteStatus: + if item in selected_files: + s = os.path.join(src, item) + d = os.path.join(self.path, item) + if os.path.isdir(s): + shutil.copytree(s, d, ignore=ignore) + else: + shutil.copy2(s, d) + else: + self.log.info(f"Copying repository contents from {src} to {self.path}") + if sys.version_info.major == 3 and sys.version_info.minor >= 8: + shutil.copytree(src, self.path, ignore=ignore, dirs_exist_ok=True) + else: + for item in os.listdir(src): + s = os.path.join(src, item) + d = os.path.join(self.path, item) + if os.path.isdir(s): + shutil.copytree(s, d, ignore=ignore) + else: + shutil.copy2(s, d) + + def check_remote_status(self, origin: str, branch: str) -> RemoteFileStatus: untracked, added, modified, deleted = self.git_status(hidden_files=False) local_changes = len(untracked) > 0 or len(added) > 0 or len(modified) > 0 or len(deleted) > 0 if self.local_branch_exists(branch): - local = self._run_command(f"git rev-parse {branch}", cwd=self.path, capture_output=True).strip() + local = self._run_command(f"git rev-parse {branch}", cwd=self.path).strip() else: local = None if self.remote_branch_exists(origin, branch): - remote = self._run_command(f"git rev-parse {origin}/{branch}", cwd=self.path, capture_output=True).strip() + remote = self._run_command(f"git rev-parse {origin}/{branch}", cwd=self.path).strip() else: - if len(untracked) + len(added) + len(modified) == 0: - return RemoteStatus.up_to_date # if we don't have remote and no files we are up-to-date - return RemoteStatus.push_needed + return RemoteFileStatus.NO_REMOTE_REPO if local is None and remote: if local_changes: - return RemoteStatus.divergent - return RemoteStatus.pull_needed + return RemoteFileStatus.DIVERGENT + return RemoteFileStatus.PULL_NEEDED if local == remote: if local_changes: - return RemoteStatus.push_needed - return RemoteStatus.up_to_date + return RemoteFileStatus.PUSH_NEEDED + return RemoteFileStatus.UP_TO_DATE - base = self._run_command(f"git merge-base {branch} {origin}/{branch}", cwd=self.path, capture_output=True).strip() + base = self._run_command(f"git merge-base {branch} {origin}/{branch}", cwd=self.path).strip() if local == base: - return RemoteStatus.pull_needed + return RemoteFileStatus.PULL_NEEDED elif remote == base: - return RemoteStatus.push_needed + return RemoteFileStatus.PUSH_NEEDED else: - return RemoteStatus.divergent + return RemoteFileStatus.DIVERGENT def git_status(self, hidden_files: bool = False) -> Tuple[List[str], List[str], List[str], List[str]]: - files = self._run_command("git status --porcelain", cwd=self.path, capture_output=True) + files = self._run_command("git status --porcelain", cwd=self.path) untracked, added, modified, deleted = [], [], [], [] for line in files.splitlines(): k, v = line.split(maxsplit=1) @@ -299,28 +296,41 @@ def git_status(self, hidden_files: bool = False) -> Tuple[List[str], List[str], elif k == "D": deleted.append(v) return untracked, added, modified, deleted + + def check_remote_file_status(self, file_path: str) -> RemoteFileStatus: + file_status_list = self._run_command(f"git status --porcelain {file_path}", cwd=self.path).split(maxsplit=1) + # Extract the status character from the list + if file_status_list: + file_status = file_status_list[0] + else: + # If the list is empty, the file is up-to-date + return RemoteFileStatus.UP_TO_DATE + # Convert the file status to the corresponding enum value + if file_status in {"??", "M", "A", "D"}: + return RemoteFileStatus.PUSH_NEEDED + else: + return RemoteFileStatus.DIVERGENT def local_branch_exists(self, branch: str) -> bool: - ret_code = self._run_command(f"git rev-parse --quiet --verify {branch}", cwd=self.path, check=False).returncode - if ret_code == 0: - return True - else: + try: + self._run_command(f"git rev-parse --quiet --verify {branch}", cwd=self.path) + except GitError as e: return False + return True def remote_branch_exists(self, origin: str, branch: str) -> bool: - ret_code = self._run_command(f"git ls-remote --exit-code {origin} {branch}", cwd=self.path, - check=False).returncode - if ret_code == 0: - return True - else: + try: + self._run_command(f"git ls-remote --exit-code {origin} {branch}", cwd=self.path) + except GitError as e: return False + return True def get_log(self, history_count=10) -> List[Dict[str, str]]: """ Execute git log command & return the result. """ cmd = f'git log --pretty=format:%H%n%an%n%at%n%D%n%s -{history_count}' - my_output = self._run_command(cmd, cwd=self.path, capture_output=True) + my_output = self._run_command(cmd, cwd=self.path) result = [] line_array = my_output.splitlines() @@ -331,7 +341,7 @@ def get_log(self, history_count=10) -> List[Dict[str, str]]: commit = { "commit": line_array[i], "author": line_array[i + 1], - "date": datetime.utcfromtimestamp(int(line_array[i + 2])).isoformat("T", "milliseconds") + "Z", + "date": datetime.fromtimestamp(int(line_array[i + 2])).isoformat("T", "milliseconds") + "Z", # "date": line_array[i + 2], "ref": line_array[i + 3], "commit_msg": line_array[i + 4], @@ -354,37 +364,44 @@ def git_version(self): """ if self._git_version is None: try: - version = self._run_command("git --version", capture_output=True) + version = self._run_command("git --version", cwd=self.path) except GitError: return tuple() version = version.split(" ")[2] self._git_version = tuple([int(v) for v in version.split(".")]) return self._git_version - def _run_command(self, command, cwd=None, capture_output=False, check=True) -> Union[str, subprocess.CompletedProcess]: - """Starts a sub process and runs a cmd command + def commit(self, message: str = str(datetime.now()), selected_files: List[str] = None): + """Commit staged changes. Args: - command str: command that is getting run. - cwd (str, optional): states where the command is getting run. Defaults to None. - capture_output (bool, optional): states if output is getting saved. Defaults to False. - check (bool, optional): whether to raise a GitError if process fails. - Raises: - GitError: returns appropriate git error + message (str): The commit message. Defaults to the current datetime. + selected_files (List[str]): Specific files to commit. Defaults to None. + """ + if selected_files: + for file in selected_files: + self._run_command(f"git add {shlex.quote(file)}", cwd=self.path) + else: + self._run_command("git add .", cwd=self.path) - Returns: - str: command output + self.log.info(f"Committing changes with message: {message}") + self._run_command(f'git commit --allow-empty -m "{message}"', cwd=self.path) + + def _run_command(self, command: str, cwd: str) -> Union[str, None]: + """Run a shell command and return the output. + + Args: + command (str): The command to run. + cwd (str): The working directory for the command. + + Raises: + GitError: If the command fails. """ - ret = None try: - self.log.info(f"Running: {command}") - ret = subprocess.run(shlex.split(command), cwd=cwd, capture_output=True, text=True) - ret.check_returncode() - if capture_output: - return ret.stdout - else: - return ret + self.log.debug(f"Executing command: {command} in {cwd}") + result = subprocess.run(command, shell=True, check=True, cwd=cwd, text=True, capture_output=True) + return result.stdout except subprocess.CalledProcessError as e: - raise GitError(ret.stderr.replace("\n", "")) - except FileNotFoundError as e: - raise GitError(e.strerror) + error_message = f"Command '{command}' failed with error: {e.stderr}" + self.log.error(error_message) + raise GitError(500, error_message) diff --git a/grader_labextension/services/request.py b/grader_labextension/services/request.py index 0642202..f12bb61 100644 --- a/grader_labextension/services/request.py +++ b/grader_labextension/services/request.py @@ -1,28 +1,90 @@ -# Copyright (c) 2022, TU Wien -# All rights reserved. -# -# This source code is licensed under the BSD-style license found in the -# LICENSE file in the root directory of this source tree. - -import logging, json - -from tornado.httpclient import AsyncHTTPClient, HTTPResponse, HTTPRequest -from traitlets.config.configurable import LoggingConfigurable, SingletonConfigurable -from typing import Dict, Union, Callable, Optional -from tornado.escape import json_decode -from traitlets.traitlets import Int, TraitError, Unicode, validate -from urllib.parse import urlencode, quote_plus, urlparse, ParseResultBytes import os +import json +import asyncio +from typing import Union, Dict, Callable, Optional +from urllib.parse import urlparse, ParseResultBytes, urlencode, quote_plus +from tornado.httpclient import AsyncHTTPClient, HTTPRequest, HTTPResponse, HTTPError +from traitlets import Unicode, TraitError, validate +from traitlets.config import SingletonConfigurable + +class RequestServiceError(Exception): + def __init__(self, code: int, status_text: str, message: str): + self.code = code + self.status_text = status_text + self.message = message + super().__init__(self.message) + + def __str__(self): + return f"[{self.code} {self.status_text}] {self.message}" class RequestService(SingletonConfigurable): url = Unicode(os.environ.get("GRADER_HOST_URL", "http://127.0.0.1:4010")) - def __init__(self, **kwargs): + def __init__( + self, + default_request_timeout: float = 20.0, + default_connect_timeout: float = 20.0, + max_retries: int = 3, # Max retry attempts for transient errors + **kwargs + ): super().__init__(**kwargs) - self.http_client = AsyncHTTPClient() + self.http_client = AsyncHTTPClient(max_clients=10) # Limit concurrency self._service_cookie = None + self.default_request_timeout = default_request_timeout + self.default_connect_timeout = default_connect_timeout + self.max_retries = max_retries + + def get_authorization_header(self): + auth_token = os.environ.get("GRADER_API_TOKEN") + if auth_token is None: + raise RequestServiceError(401, "Unauthorized", "No Grader API token found.") + return {"Authorization": f"Token {auth_token}"} + + async def request_with_retries( + self, + method: str, + endpoint: str, + body: Union[dict, str] = None, + header: Dict[str, str] = None, + decode_response: bool = True, + request_timeout: float = None, + connect_timeout: float = None, + max_retries: int = None, + retry_delay: float = 1.0, # Initial retry delay in seconds + backoff_factor: float = 2.0, # Factor to increase delay between retries + response_callback: Optional[Callable[[HTTPResponse], None]] = None + ) -> Union[dict, list, HTTPResponse]: + """ + Make an HTTP request with retry logic for transient errors. + """ + attempt = 0 + retries = max_retries or self.max_retries + + while attempt < retries: + try: + return await self.request( + method=method, + endpoint=endpoint, + body=body, + header=self.get_authorization_header(), + decode_response=decode_response, + request_timeout=request_timeout, + connect_timeout=connect_timeout, + response_callback=response_callback + ) + except (HTTPError, ConnectionRefusedError) as e: + if isinstance(e, HTTPError) and e.code not in {502, 503, 504}: + raise # Re-raise if it's not a retryable HTTP error + attempt += 1 + if attempt < retries: + retry_delay_seconds = retry_delay * (backoff_factor ** (attempt - 1)) + self.log.warning(f"Retry {attempt}/{retries} after {retry_delay_seconds}s due to error: {e}") + await asyncio.sleep(retry_delay_seconds) + else: + raise RequestServiceError(503, "Service Unavailable", "Max retries reached. Upstream service unavailable.") + async def request( self, method: str, @@ -30,58 +92,86 @@ async def request( body: Union[dict, str] = None, header: Dict[str, str] = None, decode_response: bool = True, - request_timeout: float = 20.0, - connect_timeout: float = 20.0, + request_timeout: float = None, + connect_timeout: float = None, response_callback: Optional[Callable[[HTTPResponse], None]] = None ) -> Union[dict, list, HTTPResponse]: - self.log.info(self.url + endpoint) - if self._service_cookie: - header["Cookie"] = self._service_cookie + """ + Core request function that handles the HTTP call. + """ + if header is None: + header = self.get_authorization_header() + + self.log.info(f"Requesting {method} {self.url + endpoint}") + request_timeout = request_timeout or self.default_request_timeout + connect_timeout = connect_timeout or self.default_connect_timeout + + header = self.prepare_headers(header) if isinstance(body, dict): body = json.dumps(body) - # Build HTTPRequest - request = HTTPRequest(url=self.url + endpoint, - method=method, - headers=header, - request_timeout=request_timeout, - connect_timeout=connect_timeout - ) - # Add body if exists - if body: - request.body = body - - # Sent HTTPRequest - response: HTTPResponse = await self.http_client.fetch(request=request) - - for cookie in response.headers.get_list("Set-Cookie"): - token = header.get("Authorization", None) - if token and token.startswith("Token "): - token = token[len("Token "):] + request = HTTPRequest( + url=self.url + endpoint, + method=method, + headers=header, + body=body if body else None, + request_timeout=request_timeout, + connect_timeout=connect_timeout + ) + + try: + response: HTTPResponse = await self.http_client.fetch(request=request) + self.log.info(f"Received response with status {response.code} from {response.effective_url}") + if decode_response: + response_data = json.loads(response.body) else: - continue - if cookie.startswith(token): - self._service_cookie = cookie + response_data = response - if response_callback: - response_callback(response) + if response_callback: + response_callback(response) - if decode_response: - return json_decode(response.body) - else: - return response + return response_data + except HTTPError as http_error: + self.log.error(f"HTTP error occurred: {http_error.response.reason}") + raise RequestServiceError( + http_error.code, + "Service Error", + http_error.response.reason or "An error occurred in the upstream service." + ) + + except ConnectionRefusedError: + self.log.error(f"Connection refused for {self.url + endpoint}") + raise RequestServiceError(502, "Bad Gateway", "Unable to connect to the upstream service.") + except Exception as e: + self.log.error(f"Unexpected error: {e}") + raise RequestServiceError(500, "Internal Server Error", f"An unexpected error occurred: {str(e)}") + + def prepare_headers(self, header: Dict[str, str] = None) -> Dict[str, str]: + """ + Prepares headers by adding service cookie or authorization if available. + """ + if header is None: + header = {} + if self._service_cookie: + header["Cookie"] = self._service_cookie + if "Authorization" not in header and os.getenv("SERVICE_TOKEN"): + header["Authorization"] = f"Bearer {os.getenv('SERVICE_TOKEN')}" + return header @validate("url") def _validate_url(self, proposal): url = proposal["value"] result: ParseResultBytes = urlparse(url) if not all([result.scheme, result.hostname]): - raise TraitError("Invalid url: at least has to contain scheme and hostname") + raise TraitError("Invalid URL: must contain both scheme and hostname") return url @staticmethod def get_query_string(params: dict) -> str: + """ + Helper to build query strings from a dictionary of parameters. + """ d = {k: v for k, v in params.items() if v is not None} query_params: str = urlencode(d, quote_via=quote_plus) - return "?" + query_params if query_params != "" else "" + return "?" + query_params if query_params else "" diff --git a/package.json b/package.json index 41c97e5..8305edc 100644 --- a/package.json +++ b/package.json @@ -1,24 +1,25 @@ { "name": "grader-labextension", - "version": "0.4.0", + "version": "0.6.1", "description": "Grader Labextension is a JupyterLab extension to enable automatic grading of assignment notebooks.", "keywords": [ "jupyter", "jupyterlab", "jupyterlab-extension" ], - "homepage": "https://github.com/TU-Wien-dataLAB/Grader-Labextension", + "homepage": "https://github.com/TU-Wien-dataLAB/grader-labextension", "bugs": { - "url": "https://github.com/TU-Wien-dataLAB/Grader-Labextension/issues" + "url": "https://github.com/TU-Wien-dataLAB/grader-labextension/issues" }, "license": "BSD-3-Clause", "author": { - "name": "Florian Jaeger", + "name": "Florian Jaeger, Marijana Petojevic, Matthias Matt", "email": "datalab@tuwien.ac.at" }, "files": [ "lib/**/*.{d.ts,eot,gif,html,jpg,js,js.map,json,png,svg,woff2,ttf}", "style/**/*.{css,js,eot,gif,html,jpg,json,png,svg,woff2,ttf}", + "src/**/*.{ts,tsx}", "schema/*.json" ], "main": "lib/index.js", @@ -26,7 +27,7 @@ "style": "style/index.css", "repository": { "type": "git", - "url": "https://github.com/TU-Wien-dataLAB/Grader-Labextension.git" + "url": "https://github.com/TU-Wien-dataLAB/grader-labextension.git" }, "scripts": { "build": "jlpm build:lib && jlpm build:labextension:dev", @@ -73,6 +74,7 @@ "@mui/material": "^5.13.4", "@mui/system": "^5.13.2", "@mui/x-date-pickers": "^6.19.0", + "@tanstack/react-query": "^5.27.5", "@types/d3-shape": "^3.1.1", "date-fns": "^3.2.0", "formik": "^2.4.1", @@ -91,6 +93,7 @@ "devDependencies": { "@jupyterlab/builder": "^4.0.0", "@jupyterlab/testutils": "^4.0.0", + "@tanstack/react-query-devtools": "^5.49.2", "@types/d3-scale": "^4.0.3", "@types/jest": "^29.2.0", "@types/json-schema": "^7.0.11", diff --git a/pyproject.toml b/pyproject.toml index 6c3c452..1cdf0bd 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -26,7 +26,7 @@ dependencies = [ "urllib3>=1.26.6", "traitlets>=5.0.5", "tornado>=6.2", - "grader-service>=0.4.0", + "grader-service>=0.6.0", "hatch>=1.7", "hatch-jupyter-builder>=0.5", "hatch-nodejs-version", @@ -45,7 +45,7 @@ test = [ ] [tool.tbump.version] -current = "0.4.0" +current = "0.6.1" regex = ''' (?P\d+) @@ -73,7 +73,7 @@ search = "grader-labextension=={current_version}" source = "nodejs" [tool.hatch.metadata.hooks.nodejs] -fields = ["description", "authors", "urls"] +fields = ["description", "authors", "urls", "keywords"] [tool.hatch.build.targets.sdist] artifacts = ["grader_labextension/labextension"] diff --git a/src/components/assignment/assignment-status.tsx b/src/components/assignment/assignment-status.tsx index 9b75996..b0feaf1 100644 --- a/src/components/assignment/assignment-status.tsx +++ b/src/components/assignment/assignment-status.tsx @@ -23,7 +23,6 @@ import ChatRoundedIcon from '@mui/icons-material/ChatRounded'; * Props for AssignmentComponent. */ export interface IAssignmentStatusProps { - //assignment: Assignment; submissions: Submission[]; activeStep: number; } @@ -40,9 +39,9 @@ export const AssignmentStatus = (props: IAssignmentStatusProps) => { description: ( You pulled from the release repository and can now work on the - assignment. If you are happy with your solution you can submit it. - Before the deadline you can always resubmit until you are happy with - the solution. + assignment. If you are happy with your solution, you can submit it. + Before the deadline, you can always resubmit until you are satisfied + with the solution. ) }, @@ -51,8 +50,8 @@ export const AssignmentStatus = (props: IAssignmentStatusProps) => { description: ( You have submitted the assignment {props.submissions.length} time - {props.submissions.length == 1 ? '' : 's'}. The instructor can review - each submission, but will most likely prioritise the latest. + {props.submissions.length === 1 ? '' : 's'}. The instructor can review + each submission but will most likely prioritize the latest one. ) }, @@ -61,15 +60,14 @@ export const AssignmentStatus = (props: IAssignmentStatusProps) => { description: ( You received feedback for one or more of your submissions! You can - view the feedback in the list of submission when clicking on the{' '} - icon. Within the deadline you - can make more submissions, regardless of whether you already received + view the feedback in the list of submissions by clicking on the{' '} + icon. Before the deadline, you + can continue making submissions, even if you have already received feedback. ) } ]; - //getActiveStep().then(s => setActiveStep(s)); return ( diff --git a/src/components/assignment/assignment.tsx b/src/components/assignment/assignment.tsx index b2cc18a..6d33ef1 100644 --- a/src/components/assignment/assignment.tsx +++ b/src/components/assignment/assignment.tsx @@ -11,8 +11,10 @@ import { Submission } from '../../model/submission'; import { Box, Button, + Card, Chip, IconButton, + LinearProgress, Stack, Tooltip, Typography @@ -22,8 +24,9 @@ import { SubmissionList } from './submission-list'; import { AssignmentStatus } from './assignment-status'; import { Files } from './files/files'; import WarningIcon from '@mui/icons-material/Warning'; -import { Outlet, useNavigate, useRouteLoaderData } from 'react-router-dom'; +import { Outlet } from 'react-router-dom'; import { + getAssignment, getAssignmentProperties, pullAssignment, pushAssignment, @@ -32,7 +35,7 @@ import { import { getFiles, lectureBasePath } from '../../services/file.service'; import { getAllSubmissions, - getProperties, + getSubmissionCount, submitAssignment } from '../../services/submissions.service'; import { enqueueSnackbar } from 'notistack'; @@ -48,6 +51,9 @@ import { openBrowser } from '../coursemanage/overview/util'; import OpenInBrowserIcon from '@mui/icons-material/OpenInBrowser'; import { Scope, UserPermissions } from '../../services/permission.service'; import { GradeBook } from '../../services/gradebook'; +import { useQuery } from '@tanstack/react-query'; +import { getLecture } from '../../services/lectures.service'; +import { extractIdsFromBreadcrumbs } from '../util/breadcrumbs'; const calculateActiveStep = (submissions: Submission[]) => { const hasFeedback = submissions.reduce( @@ -69,6 +75,7 @@ const calculateActiveStep = (submissions: Submission[]) => { interface ISubmissionsLeft { subLeft: number; } + const SubmissionsLeftChip = (props: ISubmissionsLeft) => { const output = props.subLeft + ' submission' + (props.subLeft === 1 ? ' left' : 's left'); @@ -81,60 +88,91 @@ const SubmissionsLeftChip = (props: ISubmissionsLeft) => { * Renders the components available in the extended assignment modal view */ export const AssignmentComponent = () => { - const navigate = useNavigate(); - const reloadPage = () => navigate(0); - - const { lecture, assignment, submissions } = useRouteLoaderData( - 'assignment' - ) as { - lecture: Lecture; - assignment: Assignment; - submissions: Submission[]; - }; + const { lectureId, assignmentId } = extractIdsFromBreadcrumbs(); - const [fileList, setFileList] = React.useState([] as string[]); + const { data: lecture, isLoading: isLoadingLecture } = useQuery({ + queryKey: ['lecture', lectureId], + queryFn: () => getLecture(lectureId), + enabled: !!lectureId + }); - React.useEffect(() => { - getAssignmentProperties(lecture.id, assignment.id).then(properties => { - const gb = new GradeBook(properties); - setFileList([ - ...gb.getNotebooks().map(n => n + '.ipynb'), - ...gb.getExtraFiles() - ]); + const { data: assignment, isLoading: isLoadingAssignment } = + useQuery({ + queryKey: ['assignment', assignmentId], + queryFn: () => getAssignment(lectureId, assignmentId), + enabled: !!lectureId && !!assignmentId }); - }, []); - const path = `${lectureBasePath}${lecture.code}/assignments/${assignment.id}`; + const { data: submissions = [], refetch: refetchSubmissions } = useQuery< + Submission[] + >({ + queryKey: ['submissionsAssignmentStudent', lectureId, assignmentId], + queryFn: () => getAllSubmissions(lectureId, assignmentId, 'none', false), + enabled: !!lectureId && !!assignmentId + }); - /* Now we can divvy this into a useReducer */ - const [allSubmissions, setSubmissions] = React.useState(submissions); - const [files, setFiles] = React.useState([]); + const [fileList, setFileList] = React.useState([]); const [activeStatus, setActiveStatus] = React.useState(0); - const [subLeft, setSubLeft] = React.useState(0); + + const { + data: subLeft, + isLoading: isLoadingSubLeft, + refetch: refetchSubleft + } = useQuery({ + queryKey: ['subLeft'], + queryFn: async () => { + await refetchSubmissions(); + const response = await getSubmissionCount(lectureId, assignmentId); + const remainingSubmissions = + assignment.max_submissions - response.submission_count; + return remainingSubmissions <= 0 ? 0 : remainingSubmissions; + } + }); + + const { + data: files, + refetch: refetchFiles, + isLoading: isLoadingFiles + } = useQuery({ + queryKey: ['files', lectureId, assignmentId], + queryFn: () => + getFiles( + `${lectureBasePath}${lecture?.code}/assignments/${assignmentId}` + ), + enabled: !!lecture && !!assignment + }); React.useEffect(() => { - getAllSubmissions(lecture.id, assignment.id, 'none', false).then( - response => { - setSubmissions(response); - if (assignment.max_submissions - response.length < 0) { - setSubLeft(0); - } else { - setSubLeft(assignment.max_submissions - response.length); - } - } + if (lecture && assignment) { + getAssignmentProperties(lecture.id, assignment.id).then(properties => { + const gb = new GradeBook(properties); + setFileList([ + ...gb.getNotebooks().map(n => n + '.ipynb'), + ...gb.getExtraFiles() + ]); + const active_step = calculateActiveStep(submissions); + setActiveStatus(active_step); + refetchSubleft(); + }); + } + }, [lecture, assignment]); + + if ( + isLoadingAssignment || + isLoadingLecture || + isLoadingFiles || + isLoadingSubLeft + ) { + return ( +
+ + + +
); - getFiles(path).then(files => { - // TODO: make it really explicit where & who pulls the asssignment - // files! - //if (files.length === 0) { - // pullAssignment(lecture.id, assignment.id, 'assignment'); - //} - setFiles(files); - }); + } - const active_step = calculateActiveStep(submissions); - setActiveStatus(active_step); - }, []); + const path = `${lectureBasePath}${lecture.code}/assignments/${assignment.id}`; const resetAssignmentHandler = async () => { showDialog( @@ -153,7 +191,7 @@ export const AssignmentComponent = () => { enqueueSnackbar('Successfully Reset Assignment', { variant: 'success' }); - reloadPage(); + await refetchFiles(); } catch (e) { if (e instanceof Error) { enqueueSnackbar('Error Reset Assignment: ' + e.message, { @@ -176,14 +214,11 @@ export const AssignmentComponent = () => { 'This action will submit your current notebooks!', async () => { await submitAssignment(lecture, assignment, true).then( - response => { - console.log('Submitted'); - setSubmissions([response, ...allSubmissions]); - if (subLeft - 1 < 0) { - setSubLeft(0); - } else { - setSubLeft(subLeft - 1); - } + () => { + refetchSubleft().then(() => { + const active_step = calculateActiveStep(submissions); + setActiveStatus(active_step); + }); enqueueSnackbar('Successfully Submitted Assignment', { variant: 'success' }); @@ -210,6 +245,7 @@ export const AssignmentComponent = () => { }) ); }; + /** * Pulls from given repository by sending a request to the grader git service. * @param repo input which repository should be fetched @@ -220,11 +256,7 @@ export const AssignmentComponent = () => { enqueueSnackbar('Successfully Pulled Repo', { variant: 'success' }); - getFiles( - `${lectureBasePath}${lecture.code}/assignments/${assignment.id}` - ).then(files => { - setFiles(files); - }); + refetchFiles(); }, error => { enqueueSnackbar(error.message, { @@ -235,7 +267,7 @@ export const AssignmentComponent = () => { }; const isDeadlineOver = () => { - if (assignment.due_date === null) { + if (!assignment.due_date) { return false; } const time = new Date(assignment.due_date).getTime(); @@ -243,13 +275,17 @@ export const AssignmentComponent = () => { }; const isLateSubmissionOver = () => { - if (assignment.due_date === null) { + if (!assignment.due_date) { return false; } - let late_submission = assignment.settings.late_submission; - if (late_submission === null || late_submission.length === 0) { - late_submission = [{ period: 'P0D', scaling: undefined }]; + const late_submission = assignment.settings.late_submission || [ + { period: 'P0D', scaling: undefined } + ]; + // no late_submission entry found + if (late_submission.length === 0) { + return false; } + const late = moment(assignment.due_date) .add(moment.duration(late_submission[late_submission.length - 1].period)) .toDate() @@ -262,11 +298,10 @@ export const AssignmentComponent = () => { }; const isMaxSubmissionReached = () => { - if (assignment.max_submissions === null) { - return false; - } else { - return assignment.max_submissions <= submissions.length; - } + return ( + assignment.max_submissions !== null && + assignment.max_submissions <= submissions.length + ); }; const isAssignmentFetched = () => { @@ -278,11 +313,6 @@ export const AssignmentComponent = () => { const scope = permissions[lecture.code]; return scope >= Scope.tutor; }; - const [reloadFilesToggle, setReloadFiles] = React.useState(false); - - const reloadFiles = () => { - setReloadFiles(!reloadFilesToggle); - }; return ( @@ -314,7 +344,7 @@ export const AssignmentComponent = () => { Files - reloadFiles()}> + refetchFiles()}> @@ -371,7 +401,7 @@ export const AssignmentComponent = () => { : isLateSubmissionOver() || isMaxSubmissionReached() || isAssignmentCompleted() || - files.length == 0 + files.length === 0 } onClick={() => submitAssignmentHandler()} > @@ -425,7 +455,13 @@ export const AssignmentComponent = () => { ) ) : null} - + ); diff --git a/src/components/assignment/assignmentmanage.component.tsx b/src/components/assignment/assignmentmanage.component.tsx index 99bcf98..5686ad2 100644 --- a/src/components/assignment/assignmentmanage.component.tsx +++ b/src/components/assignment/assignmentmanage.component.tsx @@ -7,7 +7,7 @@ import * as React from 'react'; import { useState } from 'react'; import { Lecture } from '../../model/lecture'; -import { useNavigate, useRouteLoaderData } from 'react-router-dom'; +import { useNavigate } from 'react-router-dom'; import { FormControlLabel, FormGroup, @@ -19,6 +19,8 @@ import { } from '@mui/material'; import Box from '@mui/material/Box'; import { ButtonTr, GraderTable } from '../util/table'; +import { useQuery } from '@tanstack/react-query'; +import { getAllLectures } from '../../services/lectures.service'; interface ILectureTableProps { rows: Lecture[]; @@ -45,7 +47,11 @@ const LectureTable = (props: ILectureTableProps) => { {row.id} - {row.name} + + + {row.name} + + {row.code} ); @@ -59,14 +65,28 @@ const LectureTable = (props: ILectureTableProps) => { * @param props Props of the lecture file components */ export const AssignmentManageComponent = () => { - const allLectures = useRouteLoaderData('root') as { - lectures: Lecture[]; - completedLectures: Lecture[]; - }; + const { data: lectures, isLoading: isLoadingOngoingLectures } = useQuery({ + queryKey: ['lectures'], + queryFn: () => getAllLectures(false) + }); + + const { data: completedLectures, isLoading: isLoadingCompletedLectures } = useQuery({ + queryKey: ['completedLectures'], + queryFn: () => getAllLectures(true) + }); + const [showComplete, setShowComplete] = useState(false); + if (isLoadingCompletedLectures || isLoadingOngoingLectures) { + return
Loading...
+ } + + return ( + + Assignments + Lectures @@ -86,7 +106,7 @@ export const AssignmentManageComponent = () => { diff --git a/src/components/assignment/feedback.tsx b/src/components/assignment/feedback.tsx index 791d080..4387c10 100644 --- a/src/components/assignment/feedback.tsx +++ b/src/components/assignment/feedback.tsx @@ -11,7 +11,9 @@ import { Lecture } from '../../model/lecture'; import { Assignment } from '../../model/assignment'; import { Submission } from '../../model/submission'; import { + getAllSubmissions, getProperties, + getSubmission, pullFeedback } from '../../services/submissions.service'; import { GradeBook } from '../../services/gradebook'; @@ -19,38 +21,62 @@ import { FilesList } from '../util/file-list'; import { openBrowser } from '../coursemanage/overview/util'; import OpenInBrowserIcon from '@mui/icons-material/OpenInBrowser'; import { getFiles, lectureBasePath } from '../../services/file.service'; -import { Link, useParams, useRouteLoaderData } from 'react-router-dom'; +import { Link, useParams } from 'react-router-dom'; +import { useQuery } from '@tanstack/react-query'; +import { getLecture } from '../../services/lectures.service'; +import { getAssignment } from '../../services/assignments.service'; +import { extractIdsFromBreadcrumbs } from '../util/breadcrumbs'; export const Feedback = () => { - const { lecture, assignment, submissions } = useRouteLoaderData( - 'assignment' - ) as { - lecture: Lecture; - assignment: Assignment; - submissions: Submission[]; - }; - const assignmentLink = `/lecture/${lecture.id}/assignment/${assignment.id}`; - + const { lectureId, assignmentId } = extractIdsFromBreadcrumbs(); const params = useParams(); const submissionId = +params['sid']; - const submission = submissions.find(s => s.id === submissionId); - const [gradeBook, setGradeBook] = React.useState(null); - const [path, setPath] = React.useState(null); + const { data: lecture, isLoading: isLoadingLecture } = useQuery({ + queryKey: ['lecture', lectureId], + queryFn: () => getLecture(lectureId), + enabled: !!lectureId + }); + + const { data: assignment, isLoading: isLoadingAssignment } = useQuery({ + queryKey: ['assignment', assignmentId], + queryFn: () => getAssignment(lectureId, assignmentId), + enabled: !!lecture && !!assignmentId + }); + + const { data: submission, isLoading: isLoadingSubmission } = useQuery({ + queryKey: ['submission', lectureId, assignmentId, submissionId], + queryFn: () => getSubmission(lectureId, assignmentId, submissionId), + enabled: !!lecture && !!assignment + }); - const feedbackPath = `${lectureBasePath}${lecture.code}/feedback/${assignment.id}/${submission.id}`; - getFiles(feedbackPath).then(files => { - if (files.length > 0) { - setPath(feedbackPath); - } + const { data: gradeBook, refetch: refetchGradeBook } = useQuery({ + queryKey: ['gradeBook', submissionId], + queryFn: () => submission ? getProperties(lectureId, assignmentId, submissionId).then(properties => new GradeBook(properties)) : Promise.resolve(null), + enabled: !!submission }); + const feedbackPath = `${lectureBasePath}${lecture?.code}/feedback/${assignmentId}/${submissionId}`; + const { data: submissionFiles, refetch: refetchSubmissionFiles } = useQuery({ + queryKey: ['submissionFiles', feedbackPath], + queryFn: () => feedbackPath ? getFiles(feedbackPath) : Promise.resolve([]), + enabled: !!feedbackPath + }); + + + const reloadProperties = async () => { + await refetchGradeBook(); + }; + React.useEffect(() => { - getProperties(lecture.id, assignment.id, submission.id).then(properties => { - const gradeBook = new GradeBook(properties); - setGradeBook(gradeBook); - }); - }, [lecture, assignment, submission]); + reloadProperties(); + }, []); + + if (isLoadingAssignment || isLoadingLecture || isLoadingSubmission) { + return
Loading...
; + } + + const assignmentLink = `/lecture/${lecture.id}/assignment/${assignment.id}`; return ( @@ -134,7 +160,13 @@ export const Feedback = () => { Feedback Files - + - {path !== null && ( + {feedbackPath !== null && ( - ) : null - } - > + @@ -84,6 +85,109 @@ export const SubmissionList = (props: ISubmissionListProps) => { : null } /> + + { + + } + {value.feedback_status === 'not_generated' && ( + + )} + {value.feedback_status === 'generated' || + value.feedback_status === 'feedback_outdated' ? ( + + ) : null} + )); diff --git a/src/components/coursemanage/assignment-modal.tsx b/src/components/coursemanage/assignment-modal.tsx index 55048e0..c9170e1 100644 --- a/src/components/coursemanage/assignment-modal.tsx +++ b/src/components/coursemanage/assignment-modal.tsx @@ -11,16 +11,10 @@ import FolderIcon from '@mui/icons-material/Folder'; import FormatListNumberedIcon from '@mui/icons-material/FormatListNumbered'; import QueryStatsIcon from '@mui/icons-material/QueryStats'; import SettingsIcon from '@mui/icons-material/Settings'; -import { Assignment } from '../../model/assignment'; -import { Lecture } from '../../model/lecture'; -import { Submission } from '../../model/submission'; -import { - Link, - Outlet, - useMatch, - useParams, - useRouteLoaderData -} from 'react-router-dom'; +import { Link, Outlet, useMatch, useParams } from 'react-router-dom'; +import { useQuery } from '@tanstack/react-query'; +import { getAllSubmissions } from '../../services/submissions.service'; +import { extractIdsFromBreadcrumbs } from '../util/breadcrumbs'; function a11yProps(index: any) { return { @@ -30,13 +24,20 @@ function a11yProps(index: any) { } export const AssignmentModalComponent = () => { - const { assignment, allSubmissions, latestSubmissions } = useRouteLoaderData( - 'assignment' - ) as { - assignment: Assignment; - allSubmissions: Submission[]; - latestSubmissions: Submission[]; - }; + const { lectureId, assignmentId } = extractIdsFromBreadcrumbs(); + + const { data: latestSubmissionsNumber = 0 } = useQuery({ + queryKey: ['latestSubmissionsNumber', lectureId, assignmentId], + queryFn: async () => { + const submissions = await getAllSubmissions( + lectureId, + assignmentId, + 'latest' + ); + return submissions.length; + }, + enabled: !!lectureId && !!assignmentId + }); const params = useParams(); const match = useMatch(`/lecture/${params.lid}/assignment/${params.aid}/*`); @@ -101,8 +102,8 @@ export const AssignmentModalComponent = () => { icon={ diff --git a/src/components/coursemanage/coursemanage.component.tsx b/src/components/coursemanage/coursemanage.component.tsx index d4a3a1c..646a9bc 100644 --- a/src/components/coursemanage/coursemanage.component.tsx +++ b/src/components/coursemanage/coursemanage.component.tsx @@ -7,7 +7,7 @@ import * as React from 'react'; import { useState } from 'react'; import { Lecture } from '../../model/lecture'; -import { useNavigate, useRouteLoaderData } from 'react-router-dom'; +import { useNavigate } from 'react-router-dom'; import { FormControlLabel, FormGroup, @@ -17,9 +17,9 @@ import { TableRow, Typography } from '@mui/material'; -import Box from '@mui/material/Box'; import { ButtonTr, GraderTable } from '../util/table'; -import { SectionTitle } from '../util/section-title'; +import { getAllLectures } from '../../services/lectures.service'; +import { useQuery } from '@tanstack/react-query'; interface ILectureTableProps { rows: Lecture[]; @@ -60,12 +60,22 @@ const LectureTable = (props: ILectureTableProps) => { }; export const CourseManageComponent = () => { - const allLectures = useRouteLoaderData('root') as { - lectures: Lecture[]; - completedLectures: Lecture[]; - }; + const { data: lectures, isLoading: isLoadingOngoingLectures } = useQuery({ + queryKey: ['lectures'], + queryFn: () => getAllLectures(false) + }); + + const { data: completedLectures, isLoading: isLoadingCompletedLectures } = useQuery({ + queryKey: ['completedLectures'], + queryFn: () => getAllLectures(true) + }); + const [showComplete, setShowComplete] = useState(false); + if (isLoadingCompletedLectures || isLoadingOngoingLectures) { + return
Loading...
+ } + return ( @@ -90,7 +100,7 @@ export const CourseManageComponent = () => { diff --git a/src/components/coursemanage/files/file-view.tsx b/src/components/coursemanage/files/file-view.tsx index 68ad0d6..0a7e539 100644 --- a/src/components/coursemanage/files/file-view.tsx +++ b/src/components/coursemanage/files/file-view.tsx @@ -1,34 +1,46 @@ -import { Box } from '@mui/material'; import { Files } from './files'; import * as React from 'react'; -import { useRouteLoaderData } from 'react-router-dom'; import { Lecture } from '../../../model/lecture'; import { Assignment } from '../../../model/assignment'; -import { Submission } from '../../../model/submission'; +import { getAssignment } from '../../../services/assignments.service'; +import { useQuery } from '@tanstack/react-query'; +import { extractIdsFromBreadcrumbs } from '../../util/breadcrumbs'; +import { getLecture } from '../../../services/lectures.service'; export const FileView = () => { - const { lecture, assignments, users } = useRouteLoaderData('lecture') as { - lecture: Lecture; - assignments: Assignment[]; - users: { instructors: string[]; tutors: string[]; students: string[] }; - }; - const { assignment, allSubmissions, latestSubmissions } = useRouteLoaderData( - 'assignment' - ) as { - assignment: Assignment; - allSubmissions: Submission[]; - latestSubmissions: Submission[]; - }; + const { lectureId, assignmentId } = extractIdsFromBreadcrumbs(); + + const { data: lectureData, isLoading: isLoadingLecture } = useQuery({ + queryKey: ['lecture', lectureId], + queryFn: () => getLecture(lectureId), + enabled: !!lectureId + }); + + const { + data: assignmentData, + refetch: refetchAssignment, + isLoading: isLoadingAssignment + } = useQuery({ + queryKey: ['assignment', assignmentId], + queryFn: () => getAssignment(lectureId, assignmentId), + enabled: !!lectureId && !!assignmentId + }); + + if (isLoadingLecture || isLoadingAssignment) { + return
Loading...
; + } + + const lecture = lectureData; + const assignment = assignmentData; - const [assignmentState, setAssignmentState] = React.useState(assignment); - const onAssignmentChange = (assignment: Assignment) => { - setAssignmentState(assignment); + const onAssignmentChange = async () => { + await refetchAssignment(); }; return ( ); diff --git a/src/components/coursemanage/files/files.tsx b/src/components/coursemanage/files/files.tsx index e1fe94f..86b4155 100644 --- a/src/components/coursemanage/files/files.tsx +++ b/src/components/coursemanage/files/files.tsx @@ -5,15 +5,16 @@ // LICENSE file in the root directory of this source tree. import * as React from 'react'; -import { useEffect } from 'react'; import { Assignment } from '../../../model/assignment'; import { Lecture } from '../../../model/lecture'; import { generateAssignment, + getAssignment, pullAssignment, pushAssignment } from '../../../services/assignments.service'; import GetAppRoundedIcon from '@mui/icons-material/GetAppRounded'; +import OpenInBrowserIcon from '@mui/icons-material/OpenInBrowser'; import { CommitDialog } from '../../util/dialog'; import { Box, @@ -29,7 +30,6 @@ import { Tooltip } from '@mui/material'; import ReplayIcon from '@mui/icons-material/Replay'; -import OpenInBrowserIcon from '@mui/icons-material/OpenInBrowser'; import TerminalIcon from '@mui/icons-material/Terminal'; import AddIcon from '@mui/icons-material/Add'; import CheckIcon from '@mui/icons-material/Check'; @@ -37,136 +37,107 @@ import ErrorOutlineIcon from '@mui/icons-material/ErrorOutline'; import { FilesList } from '../../util/file-list'; import { GlobalObjects } from '../../../index'; import { Contents } from '@jupyterlab/services'; -import moment from 'moment'; import { openBrowser, openTerminal } from '../overview/util'; import { PageConfig } from '@jupyterlab/coreutils'; import PublishRoundedIcon from '@mui/icons-material/PublishRounded'; import { - IGitLogObject, - getGitLog, getRemoteStatus, lectureBasePath } from '../../../services/file.service'; import { RepoType } from '../../util/repo-type'; import { enqueueSnackbar } from 'notistack'; -import { GitLogModal } from './git-log'; -import { showDialog } from '../../util/dialog-provider'; import { useNavigate } from 'react-router-dom'; +import { useQuery } from '@tanstack/react-query'; +import { getLecture } from '../../../services/lectures.service'; +import { loadString, storeString } from '../../../services/storage.service'; +import { queryClient } from '../../../widgets/assignmentmanage'; +import { RemoteFileStatus } from '../../../model/remoteFileStatus'; +import { GitLogModal } from './git-log'; -/** - * Props for FilesComponent. - */ export interface IFilesProps { lecture: Lecture; assignment: Assignment; onAssignmentChange: (assignment: Assignment) => void; } -/** - * Renders in a file list the assignment files. - * @param props props of the file component - */ -export const Files = (props: IFilesProps) => { +export const Files = ({ + lecture, + assignment, + onAssignmentChange +}: IFilesProps) => { const navigate = useNavigate(); const reloadPage = () => navigate(0); + const serverRoot = PageConfig.getOption('serverRoot'); - const [assignment, setAssignment] = React.useState(props.assignment); - const [lecture, setLecture] = React.useState(props.lecture); - const [selectedDir, setSelectedDir] = React.useState('source'); - const [gitLogs, setGitLog] = React.useState([] as IGitLogObject[]); - const [assignmentState, setAssignmentState] = React.useState(assignment); + const { data: updatedLecture = lecture } = useQuery({ + queryKey: ['lecture', lecture.id], + queryFn: () => getLecture(lecture.id, true) + }); - const updateGitLog = () => { - getGitLog(lecture, assignment, RepoType.SOURCE, 10).then(logs => - setGitLog(logs) - ); - }; - const updateRemoteStatus = async () => { - const status = await getRemoteStatus( - props.lecture, - props.assignment, - RepoType.SOURCE, - true - ); - setRepoStatus( - status as 'up_to_date' | 'pull_needed' | 'push_needed' | 'divergent' - ); - }; - React.useEffect(() => { - updateGitLog(); - }, [assignmentState]); + const { data: updatedAssignment = assignment } = useQuery({ + queryKey: ['assignment', lecture.id, assignment.id], + queryFn: () => getAssignment(lecture.id, assignment.id, true) + }); + + const { data: selectedDir = 'source', refetch: refetchSelectedDir } = + useQuery({ + queryKey: ['selectedDir'], + queryFn: async () => { + const data = loadString('files-selected-dir'); + if (data) { + return data as 'source' | 'release'; + } else { + return 'source'; + } + } + }); + + const { data: repoStatus, refetch: refetchRepoStatus } = useQuery({ + queryKey: ['repoStatus', lecture.id, assignment.id], + queryFn: async () => { + const response = await getRemoteStatus( + lecture, + assignment, + RepoType.SOURCE, + true + ); + return response.status; + } + }); openBrowser( `${lectureBasePath}${lecture.code}/${selectedDir}/${assignment.id}` ); - const [repoStatus, setRepoStatus] = React.useState( - null as 'up_to_date' | 'pull_needed' | 'push_needed' | 'divergent' - ); - - const [srcChangedTimestamp, setSrcChangeTimestamp] = React.useState( - moment().valueOf() - ); // now - const [generateTimestamp, setGenerateTimestamp] = React.useState(null); - - const serverRoot = PageConfig.getOption('serverRoot'); - - const isCommitOverwrite = () => - repoStatus === 'pull_needed' || repoStatus === 'divergent'; - const isPullOverwrite = () => - repoStatus === 'push_needed' || repoStatus === 'divergent'; - - useEffect(() => { + React.useEffect(() => { const srcPath = `${lectureBasePath}${lecture.code}/source/${assignment.id}`; GlobalObjects.docManager.services.contents.fileChanged.connect( (sender: Contents.IManager, change: Contents.IChangedArgs) => { const { oldValue, newValue } = change; - if (newValue && !newValue.path.includes(srcPath)) { + if ( + (newValue && !newValue.path.includes(srcPath)) || + (oldValue && !oldValue.path.includes(srcPath)) + ) { return; } - - if (oldValue && !oldValue.path.includes(srcPath)) { - return; - } - - if (newValue) { - const modified = moment(newValue.last_modified).valueOf(); - if (srcChangedTimestamp === null || srcChangedTimestamp < modified) { - setSrcChangeTimestamp(modified); - } - } reloadPage(); + refetchRepoStatus(); }, this ); - - getRemoteStatus( - props.lecture, - props.assignment, - RepoType.SOURCE, - true - ).then(status => { - setRepoStatus( - status as 'up_to_date' | 'pull_needed' | 'push_needed' | 'divergent' - ); - }); - }, [props.assignment, props.lecture]); + }, [assignment, lecture]); /** * Switches between source and release directory. * @param dir dir which should be switched to */ const handleSwitchDir = async (dir: 'source' | 'release') => { - if ( - dir === 'release' && - (generateTimestamp === null || generateTimestamp < srcChangedTimestamp) - ) { + if (dir === 'release') { await generateAssignment(lecture.id, assignment) .then(() => { enqueueSnackbar('Generated Student Version Notebooks', { variant: 'success' }); - setGenerateTimestamp(moment().valueOf()); setSelectedDir(dir); }) .catch(error => { @@ -179,135 +150,72 @@ export const Files = (props: IFilesProps) => { ); }); } else { - setSelectedDir(dir); + await setSelectedDir(dir); } }; - /** - * Pushes files to the source und release repo. - * @param commitMessage the commit message - */ - const handlePushAssignment = async (commitMessage: string) => { - showDialog( - 'Push Assignment', - `Do you want to push ${assignment.name}? This updates the state of the assignment on the server with your local state.`, - async () => { - try { - // Note: has to be in this order (release -> source) - await pushAssignment(lecture.id, assignment.id, 'release'); - await pushAssignment( - lecture.id, - assignment.id, - 'source', - commitMessage - ); - - enqueueSnackbar('Successfully Pushed Assignment', { - variant: 'success' - }); - reloadPage(); - } catch (err) { - if (err instanceof Error) { - enqueueSnackbar('Error Pushing Assignment: ' + err.message, { - variant: 'error' - }); - } else { - console.error('Error cannot interpret unknown as error', err); - } - return; - } - } - ); - }; - /** - * Sets the repo status text. - * @param status repo status - */ - const getRemoteStatusText = ( - status: 'up_to_date' | 'pull_needed' | 'push_needed' | 'divergent' - ) => { - if (status === 'up_to_date') { - return 'The local files are up to date with the remote repository.'; - } else if (status === 'pull_needed') { - return 'The remote repository has new changes. Pull now to load them.'; - } else if (status === 'push_needed') { - return 'You have made changes to your local repository which you can push.'; - } else { - return 'The local and remote files are divergent.'; - } + const setSelectedDir = async (dir: 'source' | 'release') => { + storeString('files-selected-dir', dir); + refetchSelectedDir().then(() => { + openBrowser( + `${lectureBasePath}${lecture.code}/${selectedDir}/${assignment.id}` + ); + }); }; - const getStatusChip = ( - status: 'up_to_date' | 'pull_needed' | 'push_needed' | 'divergent' + const handlePushAssignment = async ( + commitMessage: string, + selectedFiles: string[] ) => { - if (status === 'up_to_date') { - return ( - } - /> - ); - } else if (status === 'pull_needed') { - return ( - } - /> + try { + // Note: has to be in this order (release -> source) + await pushAssignment( + lecture.id, + assignment.id, + 'release', + commitMessage, + selectedFiles ); - } else if (status === 'push_needed') { - return ( - } - /> - ); - } else { - return ( - } - /> + await pushAssignment( + lecture.id, + assignment.id, + 'source', + commitMessage, + selectedFiles ); + await queryClient.invalidateQueries({ queryKey: ['assignments'] }); + enqueueSnackbar('Successfully Pushed Assignment', { variant: 'success' }); + refetchRepoStatus(); + } catch (err) { + enqueueSnackbar(`Error Pushing Assignment: ${err}`, { variant: 'error' }); } }; - /** - * Pulls changes from source repository. - */ - const handlePullAssignment = () => { - showDialog( - 'Pull Assignment', - `Do you want to pull ${assignment.name}? This updates your assignment with the state of the server and overwrites all changes.`, - async () => { - try { - await pullAssignment(lecture.id, assignment.id, 'source'); - enqueueSnackbar('Successfully Pulled Assignment', { - variant: 'success' - }); - reloadPage(); - } catch (err) { - if (err instanceof Error) { - enqueueSnackbar('Error Pulling Assignment: ' + err.message, { - variant: 'error' - }); - } else { - console.error('Error cannot interpret unknown as error', err); - } - } - } - ); + const handlePullAssignment = async () => { + try { + await pullAssignment(lecture.id, assignment.id, 'source'); + enqueueSnackbar('Successfully Pulled Assignment', { variant: 'success' }); + await refetchRepoStatus(); + } catch (err) { + enqueueSnackbar(`Error Pulling Assignment: ${err}`, { variant: 'error' }); + } + }; + + const getRemoteStatusText = (status: RemoteFileStatus.StatusEnum) => { + switch (status) { + case RemoteFileStatus.StatusEnum.UpToDate: + return 'The local files are up to date with the remote repository.'; + case RemoteFileStatus.StatusEnum.PullNeeded: + return 'The remote repository has new changes. Pull now to update your local files.'; + case RemoteFileStatus.StatusEnum.PushNeeded: + return 'You have made changes to your local repository which you can push.'; + case RemoteFileStatus.StatusEnum.Divergent: + return 'The local and remote files are divergent.'; + case RemoteFileStatus.StatusEnum.NoRemoteRepo: + return 'There is no remote repository yet. Push your assignment to create it.'; + default: + return ''; + } }; const newUntitled = async () => { @@ -315,13 +223,70 @@ export const Files = (props: IFilesProps) => { type: 'notebook', path: `${lectureBasePath}${lecture.code}/source/${assignment.id}` }); - await updateRemoteStatus(); - await GlobalObjects.docManager.openOrReveal(res.path); + GlobalObjects.docManager.openOrReveal(res.path); + }; + + const getStatusChip = (status: RemoteFileStatus.StatusEnum) => { + // Define the statusMap with allowed `Chip` color values + const statusMap: Record< + RemoteFileStatus.StatusEnum, + { + label: string; + color: + | 'default' + | 'primary' + | 'secondary' + | 'error' + | 'warning' + | 'info' + | 'success'; + icon: JSX.Element; + } + > = { + UP_TO_DATE: { + label: 'Up To Date', + color: 'success', + icon: + }, + PULL_NEEDED: { + label: 'Pull Needed', + color: 'warning', + icon: + }, + PUSH_NEEDED: { + label: 'Push Needed', + color: 'warning', + icon: + }, + DIVERGENT: { + label: 'Divergent', + color: 'error', + icon: + }, + NO_REMOTE_REPO: { + label: 'No Remote Repository', + color: 'primary', + icon: + } + }; + + // Fallback if the status is not in the statusMap (it should be) + const { label, color, icon } = statusMap[status] || {}; + + // Return the Chip component with appropriate props or null if status is invalid + return label ? ( + + ) : null; }; return ( { titleTypographyProps={{ display: 'inline' }} action={ - reloadPage()}> + } subheader={ - repoStatus !== null && ( + repoStatus && ( {getStatusChip(repoStatus)} @@ -360,45 +325,43 @@ export const Files = (props: IFilesProps) => { - handlePushAssignment(msg)}> - + + - + - + - + { }; export const GitLogModal = (props: IGitLogProps) => { - const [gitLogs, setGitLogs] = React.useState(props.gitLogs); - React.useEffect(() => { - setGitLogs(props.gitLogs); - }, [props.gitLogs]); + const { data: gitLogs = [] as IGitLogObject[], refetch: refetchGitLogs } = + useQuery({ + queryKey: ['gitLogs', props.lecture, props.assignment], + queryFn: () => + getGitLog(props.lecture, props.assignment, RepoType.SOURCE, 10) + }); const [open, setOpen] = React.useState(false); - const handleOpen = () => { + + const handleOpen = async () => { setOpen(true); + await refetchGitLogs(); }; + const handleClose = () => { setOpen(false); }; diff --git a/src/components/coursemanage/grading/create-submission.tsx b/src/components/coursemanage/grading/create-submission.tsx index 9475ad0..cce4235 100644 --- a/src/components/coursemanage/grading/create-submission.tsx +++ b/src/components/coursemanage/grading/create-submission.tsx @@ -3,10 +3,10 @@ import { AlertTitle, Box, Button, - IconButton, + Card, + LinearProgress, Stack, TextField, - Tooltip, Typography } from '@mui/material'; import * as React from 'react'; @@ -14,61 +14,82 @@ import { Lecture } from '../../../model/lecture'; import { Assignment } from '../../../model/assignment'; import { Submission } from '../../../model/submission'; import { FilesList } from '../../util/file-list'; -import { - lectureBasePath, - makeDir, - makeDirs -} from '../../../services/file.service'; -import { Link, useOutletContext, useRouteLoaderData } from 'react-router-dom'; +import { lectureBasePath, makeDirs } from '../../../services/file.service'; +import { Link, useOutletContext } from 'react-router-dom'; import { showDialog } from '../../util/dialog-provider'; import Autocomplete from '@mui/material/Autocomplete'; import moment from 'moment'; import { Contents } from '@jupyterlab/services'; import { GlobalObjects } from '../../../index'; import { openBrowser } from '../overview/util'; -import ReplayIcon from '@mui/icons-material/Replay'; -import { - createSubmissionFiles, - pushSubmissionFiles -} from '../../../services/submissions.service'; +import { createSubmissionFiles } from '../../../services/submissions.service'; import { enqueueSnackbar } from 'notistack'; import { GraderLoadingButton } from '../../util/loading-button'; +import { useQuery, useMutation } from '@tanstack/react-query'; +import { getLecture, getUsers } from '../../../services/lectures.service'; +import { extractIdsFromBreadcrumbs } from '../../util/breadcrumbs'; export const CreateSubmission = () => { - const { assignment, rows, setRows } = useOutletContext() as { - lecture: Lecture; + const { assignment } = useOutletContext() as { assignment: Assignment; - rows: Submission[]; - setRows: React.Dispatch>; - manualGradeSubmission: Submission; - setManualGradeSubmission: React.Dispatch>; - }; - const { lecture, assignments, users } = useRouteLoaderData('lecture') as { - lecture: Lecture; - assignments: Assignment[]; - users: { instructors: string[]; tutors: string[]; students: string[] }; }; - const [path, setPath] = React.useState(null); - const submissionsLink = `/lecture/${lecture.id}/assignment/${assignment.id}/submissions`; - const [userDir, setUserDir] = React.useState(null); + const { lectureId } = extractIdsFromBreadcrumbs(); + + const { data: lecture, isLoading: isLoadingLecture } = useQuery({ + queryKey: ['lecture', lectureId], + queryFn: () => getLecture(lectureId, true), + enabled: !!lectureId + }); + const { data: students = [], isLoading: isLoadingStudents } = useQuery< + string[] + >({ + queryKey: ['students', lectureId], + queryFn: async () => { + const users = await getUsers(lectureId); + return users['students']; + }, + enabled: !!lectureId + }); + + const { data: path, refetch: reloadPath } = useQuery({ + queryKey: ['path', lectureBasePath, lecture.code, assignment.id], + queryFn: () => + makeDirs(`${lectureBasePath}${lecture.code}`, [ + 'create', + `${assignment.id}`, + userDir + ]) + }); + + const [userDir, setUserDir] = React.useState(null); + const submissionsLink = `/lecture/${lecture.id}/assignment/${assignment.id}/submissions`; const [srcChangedTimestamp, setSrcChangeTimestamp] = React.useState( moment().valueOf() ); // now + const createSubmissionMutation = useMutation({ + mutationFn: async () => { + return createSubmissionFiles(lecture, assignment, userDir); + }, + onError: (error: any) => { + enqueueSnackbar('Error: ' + error.message, { variant: 'error' }); + }, + onSuccess: () => { + enqueueSnackbar(`Successfully Created Submission for user: ${userDir}`, { + variant: 'success' + }); + } + }); + React.useEffect(() => { - makeDirs(`${lectureBasePath}${lecture.code}`, [ - 'create', - `${assignment.id}`, - userDir - ]).then(p => { - setPath(p); - openBrowser(p); + if (path) { + openBrowser(path); GlobalObjects.docManager.services.contents.fileChanged.connect( (sender: Contents.IManager, change: Contents.IChangedArgs) => { - const { oldValue, newValue } = change; - if (!newValue.path.includes(p)) { + const { newValue } = change; + if (!newValue.path.includes(path)) { return; } @@ -79,32 +100,21 @@ export const CreateSubmission = () => { }, this ); - }); - }); + } + }, [path]); - const createSubmission = async () => { - // TODO: call pus submission and the rest is handled in the labestension server - await createSubmissionFiles(lecture, assignment, userDir).then( - response => { - enqueueSnackbar( - `Successfully Created Submission for user: ${userDir}`, - { - variant: 'success' - } - ); - }, - err => { - enqueueSnackbar(err.message, { - variant: 'error' - }); - } + if (isLoadingLecture || isLoadingStudents) { + return ( +
+ + + +
); - }; + } - const [reloadFilesToggle, setReloadFiles] = React.useState(false); - - const reloadFiles = () => { - setReloadFiles(!reloadFilesToggle); + const createSubmission = async () => { + createSubmissionMutation.mutate(); }; return ( @@ -112,27 +122,26 @@ export const CreateSubmission = () => { Info - If you want to create a submission for a student manually, make sure + If you want to manually create a submission for a student, make sure to follow these steps:

- 1.   By selecting a student for whom you want to create - submission, directory 'create/{assignment.id}/student_id' is - automatically opened in File Browser on your left-hand side. + 1.   Select the student for whom you want to create a submission.
- 2.   Upload the desired files here. They will automatically - appear in the Submission Files below. + 2.   When you select the student for whom you want to create a + submission, the directory 'create/{assignment.id}/student_id' will + will automatically open in the File Browser on the left.
- 3.   Choose the student for whom you want to create the - submission. + 3.   Upload the desired files here. They will appear automatically in the Submission Files list below.
4.   Push the submission.
Select a student { setUserDir(newUserDir); + reloadPath(); }} sx={{ m: 2 }} renderInput={params => ( @@ -141,27 +150,18 @@ export const CreateSubmission = () => { label="Select Student" inputProps={{ ...params.inputProps - // autoComplete: 'new-password', }} /> )} /> - - Submission Files - - reloadFiles()}> - - - - - - + Submission Files + { const navigate = useNavigate(); - - const { - lecture, - assignment, - rows, - setRows, - manualGradeSubmission, - setManualGradeSubmission - } = useOutletContext() as { + + const { lecture, assignment, manualGradeSubmission } = useOutletContext() as { lecture: Lecture; assignment: Assignment; - rows: Submission[]; - setRows: React.Dispatch>; manualGradeSubmission: Submission; - setManualGradeSubmission: React.Dispatch>; }; + const path = `${lectureBasePath}${lecture.code}/edit/${assignment.id}/${manualGradeSubmission.id}`; - const [submission, setSubmission] = React.useState(manualGradeSubmission); - const [showLogs, setShowLogs] = React.useState(false); - const [logs, setLogs] = React.useState(undefined); + const { data: submission, refetch: refetchSubmission } = useQuery({ + queryKey: [ + 'submission', + lecture.id, + assignment.id, + manualGradeSubmission.id + ], + queryFn: () => + getSubmission(lecture.id, assignment.id, manualGradeSubmission.id, true) + }); - - const reload = () => { - getSubmission(lecture.id, assignment.id, submission.id, true).then(s => - setSubmission(s) - ); + const { data: logs, refetch: refetchLogs } = useQuery({ + queryKey: ['logs', lecture.id, assignment.id, manualGradeSubmission.id], + queryFn: () => getLogs(lecture.id, assignment.id, manualGradeSubmission.id) + }); + + const { data: submissionFiles, refetch: refetchSubmissionFiles } = useQuery({ + queryKey: ['submissionFiles'], + queryFn: () => getFiles(path) + }); + + const [showLogs, setShowLogs] = React.useState(false); + + const reloadSubmission = async () => { + await refetchSubmission(); }; - - const openLogs = (event: React.MouseEvent, submissionId: number) => { - getLogs(lecture.id, assignment.id, submissionId).then( - logs => { - setLogs(logs); - setShowLogs(true); - }, - error => { - enqueueSnackbar('No logs for submission', { - variant: 'error' - }); - } - ); - event.stopPropagation(); + const openLogs = async () => { + setShowLogs(true); + await refetchLogs(); }; const pushEditedFiles = async () => { @@ -98,7 +94,7 @@ export const EditSubmission = () => { enqueueSnackbar('Successfully Pulled Submission', { variant: 'success' }); - reload(); + refetchSubmissionFiles(); }, err => { enqueueSnackbar(err.message, { @@ -118,7 +114,7 @@ export const EditSubmission = () => { enqueueSnackbar('Successfully Created Edit Repository', { variant: 'success' }); - setSubmission(response); + reloadSubmission(); }, err => { enqueueSnackbar(err.message, { @@ -153,7 +149,7 @@ export const EditSubmission = () => { color="text.primary" sx={{ display: 'inline-block', fontSize: 16, height: 35 }} > - {submission.username} + {submission?.username} { sx={{ mr: 2 }} variant="outlined" size="small" - onClick={event => openLogs(event, manualGradeSubmission.id)} + onClick={openLogs} > Show Logs - + { await setEditRepository(); }} + onClick={async () => { + await setEditRepository(); + }} > - {submission.edited ? 'Reset ' : 'Create '} + {submission?.edited ? 'Reset ' : 'Create '} Edit Repository - + { await handlePullEditedSubmission(); }}> + disabled={!submission?.edited} + onClick={async () => { + await handlePullEditedSubmission(); + }} + > Pull Submission - - { - showDialog( - 'Edit Submission', - 'Do you want to push your submission changes?', - async () => { - await pushEditedFiles(); - } - ); - }} - > - Push Edited Submission - + + { + showDialog( + 'Edit Submission', + 'Do you want to push your submission changes?', + async () => { + await pushEditedFiles(); + } + ); + }} + > + Push Edited Submission + - @@ -234,7 +240,7 @@ export const EditSubmission = () => { id="alert-dialog-description" sx={{ fontSize: 10, fontFamily: "'Roboto Mono', monospace" }} > - {logs} + {logs || 'No logs available'} diff --git a/src/components/coursemanage/grading/grading.tsx b/src/components/coursemanage/grading/grading.tsx index fc92a46..967d49d 100644 --- a/src/components/coursemanage/grading/grading.tsx +++ b/src/components/coursemanage/grading/grading.tsx @@ -3,23 +3,16 @@ import Box from '@mui/material/Box'; import Table from '@mui/material/Table'; import TableBody from '@mui/material/TableBody'; import TableCell from '@mui/material/TableCell'; -import TableContainer from '@mui/material/TableContainer'; import TableHead from '@mui/material/TableHead'; import TablePagination from '@mui/material/TablePagination'; import TableRow from '@mui/material/TableRow'; import TableSortLabel from '@mui/material/TableSortLabel'; import Typography from '@mui/material/Typography'; -import Paper from '@mui/material/Paper'; import Checkbox from '@mui/material/Checkbox'; import { visuallyHidden } from '@mui/utils'; import { Lecture } from '../../../model/lecture'; import { Assignment } from '../../../model/assignment'; -import { - Outlet, - useNavigate, - useOutletContext, - useRouteLoaderData -} from 'react-router-dom'; +import { Outlet, useNavigate, useOutletContext } from 'react-router-dom'; import { Submission } from '../../../model/submission'; import { utcToLocalFormat } from '../../../services/datetime.service'; import { @@ -30,9 +23,7 @@ import { DialogContent, DialogTitle, IconButton, - Stack, - Toolbar, - Tooltip + Stack } from '@mui/material'; import { SectionTitle } from '../../util/section-title'; import { enqueueSnackbar } from 'notistack'; @@ -43,13 +34,16 @@ import { import { EnhancedTableToolbar } from './table-toolbar'; import EditNoteOutlinedIcon from '@mui/icons-material/EditNoteOutlined'; import { green } from '@mui/material/colors'; -import AddIcon from '@mui/icons-material/Add'; import { loadNumber, loadString, storeNumber, storeString } from '../../../services/storage.service'; +import { getAssignment } from '../../../services/assignments.service'; +import { useQuery } from '@tanstack/react-query'; +import { getLecture } from '../../../services/lectures.service'; +import { extractIdsFromBreadcrumbs } from '../../util/breadcrumbs'; /** * Calculates chip color based on submission status. @@ -586,23 +580,31 @@ export default function GradingTable() { } export const GradingComponent = () => { - const { lecture, assignments, users } = useRouteLoaderData('lecture') as { - lecture: Lecture; - assignments: Assignment[]; - users: { instructors: string[]; tutors: string[]; students: string[] }; - }; - const { assignment, allSubmissions, latestSubmissions } = useRouteLoaderData( - 'assignment' - ) as { - assignment: Assignment; - allSubmissions: Submission[]; - latestSubmissions: Submission[]; - }; + const { lectureId, assignmentId } = extractIdsFromBreadcrumbs(); + const [rows, setRows] = React.useState([]); + const [manualGradeSubmission, setManualGradeSubmission] = React.useState< + Submission | undefined + >(undefined); + + const { data: lectureData, isLoading: isLoadingLecture } = useQuery({ + queryKey: ['lecture', lectureId], + queryFn: () => getLecture(lectureId), + enabled: !!lectureId + }); - const [rows, setRows] = React.useState([] as Submission[]); - const [manualGradeSubmission, setManualGradeSubmission] = React.useState( - undefined as Submission - ); + const { data: assignmentData, isLoading: isLoadingAssignment } = + useQuery({ + queryKey: ['assignment', assignmentId], + queryFn: () => getAssignment(lectureId, assignmentId), + enabled: !!lectureId && !!assignmentId + }); + + if (isLoadingLecture || isLoadingAssignment) { + return
Loading...
; + } + + const lecture = lectureData; + const assignment = assignmentData; return ( diff --git a/src/components/coursemanage/grading/manual-grading.tsx b/src/components/coursemanage/grading/manual-grading.tsx index 2b19c58..637ab12 100644 --- a/src/components/coursemanage/grading/manual-grading.tsx +++ b/src/components/coursemanage/grading/manual-grading.tsx @@ -1,11 +1,8 @@ -import { SectionTitle } from '../../util/section-title'; import { Alert, AlertTitle, Box, Button, - Checkbox, - FormControlLabel, IconButton, Modal, Stack, @@ -32,7 +29,7 @@ import { FilesList } from '../../util/file-list'; import ReplayIcon from '@mui/icons-material/Replay'; import { enqueueSnackbar } from 'notistack'; import { openBrowser } from '../overview/util'; -import { lectureBasePath } from '../../../services/file.service'; +import { getFiles, lectureBasePath } from '../../../services/file.service'; import { Link, useOutletContext } from 'react-router-dom'; import { utcToLocalFormat } from '../../../services/datetime.service'; import Toolbar from '@mui/material/Toolbar'; @@ -46,6 +43,8 @@ import { import { showDialog } from '../../util/dialog-provider'; import InfoIcon from '@mui/icons-material/Info'; import { GraderLoadingButton } from '../../util/loading-button'; +import { useQuery } from '@tanstack/react-query'; +import { queryClient } from '../../../widgets/assignmentmanage'; const style = { position: 'absolute' as const, @@ -78,23 +77,24 @@ const InfoModal = () => {

Manual Grading Information

Info - If you want to manually grade an assignment, make sure to follow - these steps:
+ If you want to manually grade an assignment, please follow these + steps:

- 1.   In order to grade a submission manually, the submission - must first be auto-graded. This sets meta data for manual grading. - However, we're actively working towards enabling direct manual - grading without the necessity of auto-grading in the future. + 1.   To grade a submission manually, it must first be + auto-graded. This step sets the necessary metadata for manual + grading. We are working on enabling direct manual grading without + auto-grading in the future.
- 2.   Once the meta data was set for submission, you can pull - the submission. + 2.   Once the metadata has been set for the submission, you can + pull the submission.
- 3.   From file list access submission files and grade them - manually. + 3.   Access the submission files from the file list and grade + them manually.
- 4.   After you've completed the grading of the submission, - click "FINISH MANUAL GRADING." This action will save the grading and - determine the points that the student receives for their submission. + 4.   After you've completed the grading of the submission and + saved revised notebook, click button "FINISH MANUAL GRADING". This + action will save the grading and determine the points that the + student receives for their submission.
@@ -119,55 +119,63 @@ export const ManualGrading = () => { manualGradeSubmission: Submission; setManualGradeSubmission: React.Dispatch>; }; - const [submission, setSubmission] = React.useState(manualGradeSubmission); - const mPath = `${lectureBasePath}${lecture.code}/manualgrade/${assignment.id}/${submission.id}`; - const rowIdx = rows.findIndex(s => s.id === submission.id); + + const rowIdx = rows.findIndex(s => s.id === manualGradeSubmission.id); const submissionsLink = `/lecture/${lecture.id}/assignment/${assignment.id}/submissions`; + const { + data: submission = manualGradeSubmission, + refetch: refetchSubmission + } = useQuery({ + queryKey: [ + 'submission', + lecture.id, + assignment.id, + manualGradeSubmission.id + ], + queryFn: () => + getSubmission(lecture.id, assignment.id, manualGradeSubmission.id, true) + }); + const [submissionScaling, setSubmissionScaling] = React.useState( submission.score_scaling ); - const [manualPath, setManualPath] = React.useState(mPath); - const [gradeBook, setGradeBook] = React.useState(null); React.useEffect(() => { - reloadProperties(submission); - }, []); + refetchSubmission().then(response => { + setSubmissionScaling(response.data.score_scaling); + refetchGradeBook().then(async () => { + const manualPath = `${lectureBasePath}${lecture.code}/manualgrade/${assignment.id}/${manualGradeSubmission.id}`; + const files = await getFiles(manualPath); + if (files.length === 0) { + openBrowser( + `${lectureBasePath}${lecture.code}/source/${assignment.id}` + ); + } else { + openBrowser(manualPath); + } + }); + }); + }, [manualGradeSubmission.id]); - const reloadManualPath = (submission) => { - const mPath = `${lectureBasePath}${lecture.code}/manualgrade/${assignment.id}/${submission.id}`; - setManualPath(mPath); - }; - - const reloadProperties = (submission) => { - getProperties(lecture.id, assignment.id, submission.id, true).then( - properties => { - const gradeBook = new GradeBook(properties); - setGradeBook(gradeBook); - } - ); - }; - - const reloadSubmission = (submission) => { - getSubmission(lecture.id, assignment.id, submission.id, true).then(s => - setSubmission(s) - ); - }; - - const reload = (submission) => { - reloadSubmission(submission); - reloadProperties(submission); - reloadManualPath(submission); - }; + const { data: gradeBook, refetch: refetchGradeBook } = useQuery({ + queryKey: ['gradeBook', submission.id], + queryFn: () => + getProperties(lecture.id, assignment.id, submission.id, true).then( + properties => new GradeBook(properties) + ), + enabled: !!submission + }); const handleAutogradeSubmission = async () => { await autogradeSubmissionsDialog(async () => { try { - await autogradeSubmission(lecture, assignment, submission); + await autogradeSubmission(lecture, assignment, submission).then(() => { + refetchSubmission(); + }); enqueueSnackbar('Autograding submission!', { variant: 'success' }); - reload(submission); } catch (err) { console.error(err); enqueueSnackbar('Error Autograding Submission', { @@ -180,11 +188,15 @@ export const ManualGrading = () => { const handleGenerateFeedback = async () => { await generateFeedbackDialog(async () => { try { - await generateFeedback(lecture, assignment, submission); + await generateFeedback(lecture, assignment, submission).then(() => { + refetchSubmission().then(() => refetchGradeBook()); + }); enqueueSnackbar('Generating feedback for submission!', { variant: 'success' }); - reload(submission); + await queryClient.invalidateQueries({ + queryKey: ['submissionsAssignmentStudent'] + }); } catch (err) { console.error(err); enqueueSnackbar('Error Generating Feedback', { @@ -204,19 +216,20 @@ export const ManualGrading = () => { const finishGrading = () => { submission.manual_status = 'manually_graded'; - if(submission.feedback_status === 'generated') submission.feedback_status = 'feedback_outdated'; + if (submission.feedback_status === 'generated') { + submission.feedback_status = 'feedback_outdated'; + } updateSubmission(lecture.id, assignment.id, submission.id, submission).then( response => { + refetchSubmission().then(() => refetchGradeBook()); enqueueSnackbar('Successfully Graded Submission', { variant: 'success' }); - reload(submission); }, err => { enqueueSnackbar(err.message, { variant: 'error' }); - reload(submission); } ); }; @@ -224,11 +237,13 @@ export const ManualGrading = () => { const handlePullSubmission = async () => { createManualFeedback(lecture.id, assignment.id, submission.id).then( response => { - openBrowser(manualPath); + openBrowser( + `${lectureBasePath}${lecture.code}/manualgrade/${assignment.id}/${submission.id}` + ); + refetchGradeBook(); enqueueSnackbar('Successfully Pulled Submission', { variant: 'success' }); - reload(submission); }, err => { enqueueSnackbar(err.message, { @@ -238,14 +253,13 @@ export const ManualGrading = () => { ); }; - const handleNavigation = (direction) => { - const currentIndex = rows.findIndex(s => s.id === manualGradeSubmission.id); + const handleNavigation = direction => { + const currentIndex = rows.findIndex(s => s.id === submission.id); const newIndex = direction === 'next' ? currentIndex + 1 : currentIndex - 1; if (newIndex >= 0 && newIndex < rows.length) { const newSubmission = rows[newIndex]; setManualGradeSubmission(newSubmission); - reload(newSubmission); } }; @@ -392,11 +406,20 @@ export const ManualGrading = () => {
- + - reload(submission)}> + refetchSubmission().then(() => refetchGradeBook())} + > @@ -419,12 +442,12 @@ export const ManualGrading = () => { disabled={submission.auto_status !== 'automatically_graded'} color="primary" variant="outlined" - onClick={async () => { await handlePullSubmission(); }} + onClick={handlePullSubmission} sx={{ whiteSpace: 'nowrap', minWidth: 'auto' }} > Pull Submission - + - + + + {submission.auto_status === 'automatically_graded' ? ( - handleNavigation('previous')} > - - handleNavigation('next')} - > - - +
+ handleNavigation('next')} + > + +
diff --git a/src/components/coursemanage/grading/table-toolbar.tsx b/src/components/coursemanage/grading/table-toolbar.tsx index 6fe0936..7f67e65 100644 --- a/src/components/coursemanage/grading/table-toolbar.tsx +++ b/src/components/coursemanage/grading/table-toolbar.tsx @@ -34,6 +34,7 @@ import { Link } from 'react-router-dom'; import { openBrowser } from '../overview/util'; import SearchIcon from '@mui/icons-material/Search'; import ClearIcon from '@mui/icons-material/Clear'; +import { queryClient } from '../../../widgets/assignmentmanage'; export const autogradeSubmissionsDialog = async handleAgree => { showDialog( @@ -115,14 +116,14 @@ export function EnhancedTableToolbar(props: EnhancedTableToolbarProps) { .then(response => { enqueueSnackbar( 'Successfully matched ' + - response.syncable_users + - ' submissions with learning platform', + response.syncable_users + + ' submissions with learning platform', { variant: 'success' } ); enqueueSnackbar( 'Successfully synced latest submissions with feedback of ' + - response.synced_user + - ' users', + response.synced_user + + ' users', { variant: 'success' } ); }) @@ -186,6 +187,9 @@ export function EnhancedTableToolbar(props: EnhancedTableToolbarProps) { enqueueSnackbar(`Generating feedback for ${numSelected} submissions!`, { variant: 'success' }); + await queryClient.invalidateQueries({ + queryKey: ['submissionsAssignmentStudent'] + }); } catch (err) { console.error(err); enqueueSnackbar('Error Generating Feedback', { @@ -300,7 +304,8 @@ export function EnhancedTableToolbar(props: EnhancedTableToolbarProps) {
diff --git a/src/components/coursemanage/lecture.tsx b/src/components/coursemanage/lecture.tsx index 881aa2a..e1b2b80 100644 --- a/src/components/coursemanage/lecture.tsx +++ b/src/components/coursemanage/lecture.tsx @@ -18,27 +18,30 @@ import { import * as React from 'react'; import { Assignment } from '../../model/assignment'; import { Lecture } from '../../model/lecture'; -import { deleteAssignment } from '../../services/assignments.service'; -import { CreateDialog, EditLectureDialog, IEditLectureProps } from '../util/dialog'; -import { updateLecture } from '../../services/lectures.service'; +import { + deleteAssignment, + getAllAssignments +} from '../../services/assignments.service'; +import { CreateDialog, EditLectureDialog } from '../util/dialog'; +import { getLecture, updateLecture } from '../../services/lectures.service'; import { red, grey } from '@mui/material/colors'; import { enqueueSnackbar } from 'notistack'; -import { - useNavigate, - useNavigation, - useRouteLoaderData -} from 'react-router-dom'; +import { useNavigate } from 'react-router-dom'; import { ButtonTr, GraderTable } from '../util/table'; import { DeadlineComponent } from '../util/deadline'; import CloseIcon from '@mui/icons-material/Close'; import SearchIcon from '@mui/icons-material/Search'; import { showDialog } from '../util/dialog-provider'; import { updateMenus } from '../../menu'; +import { extractIdsFromBreadcrumbs } from '../util/breadcrumbs'; +import { useQuery } from '@tanstack/react-query'; +import { AssignmentDetail } from '../../model/assignmentDetail'; +import { queryClient } from '../../widgets/assignmentmanage'; interface IAssignmentTableProps { lecture: Lecture; rows: Assignment[]; - setAssignments: React.Dispatch>; + refreshAssignments: any; } const AssignmentTable = (props: IAssignmentTableProps) => { @@ -116,9 +119,7 @@ const AssignmentTable = (props: IAssignmentTableProps) => { variant: 'success' } ); - props.setAssignments( - props.rows.filter(a => a.id !== row.id) - ); + props.refreshAssignments(); } catch (error: any) { enqueueSnackbar(error.message, { variant: 'error' @@ -151,38 +152,44 @@ const AssignmentTable = (props: IAssignmentTableProps) => { }; export const LectureComponent = () => { - const { lecture, assignments } = useRouteLoaderData('lecture') as { - lecture: Lecture; - assignments: Assignment[]; - users: { instructors: string[]; tutors: string[]; students: string[] }; - }; - const navigation = useNavigation(); - - const [lectureState, setLecture] = React.useState(lecture); - const [assignmentsState, setAssignments] = React.useState(assignments); const [isEditDialogOpen, setEditDialogOpen] = React.useState(false); + const { lectureId } = extractIdsFromBreadcrumbs(); - const handleOpenEditDialog = () => { - setEditDialogOpen(true); - }; + const { data: lecture } = useQuery({ + queryKey: ['lecture', lectureId], + queryFn: () => getLecture(lectureId, true), + enabled: true + }); - - const handleUpdateLecture = (updatedLecture) => { + const { + data: assignments = [], + isPending: isPendingAssignments, + refetch: refreshAssignments + } = useQuery({ + queryKey: ['assignments', lectureId], + queryFn: () => getAllAssignments(lectureId), + enabled: true + }); + + const handleUpdateLecture = updatedLecture => { updateLecture(updatedLecture).then( - async (response) => { + async response => { await updateMenus(true); - setLecture(response); + // Invalidate query key "lectures" and "completedLectures", so that we trigger refetch on lectures table and correct lecture name is shown in the table! + await queryClient.invalidateQueries({ queryKey: ['lectures'] }); + await queryClient.invalidateQueries({ + queryKey: ['completedLectures'] + }); }, - (error) => { + error => { enqueueSnackbar(error.message, { - variant: 'error', + variant: 'error' }); } ); }; - - if (navigation.state === 'loading') { + if (isPendingAssignments) { return (
@@ -195,8 +202,8 @@ export const LectureComponent = () => { return ( - {lectureState.name} - {lectureState.complete ? ( + {lecture.name} + {lecture.complete ? ( { alignItems="center" sx={{ mt: 2, mb: 1 }} > - + {lecture.code === lecture.name ? ( - The name of the lecture is identical to the lecture code. You should give it a meaningful title that accurately reflects its content.{' '} - + The name of the lecture is identical to the lecture code. You + should give it a meaningful title that accurately reflects its + content.{' '} + setEditDialogOpen(true)} + > Rename Lecture. @@ -232,16 +244,13 @@ export const LectureComponent = () => { { - setAssignments((oldAssignments: Assignment[]) => [ - ...oldAssignments, - assigment - ]); + lecture={lecture} + handleSubmit={async () => { + await refreshAssignments(); }} /> setEditDialogOpen(false)} @@ -249,15 +258,14 @@ export const LectureComponent = () => { - Assignments ); -}; +}; \ No newline at end of file diff --git a/src/components/coursemanage/overview/assignment-status.tsx b/src/components/coursemanage/overview/assignment-status.tsx index 79541b6..ade326d 100644 --- a/src/components/coursemanage/overview/assignment-status.tsx +++ b/src/components/coursemanage/overview/assignment-status.tsx @@ -22,6 +22,7 @@ import UndoIcon from '@mui/icons-material/Undo'; import TerminalIcon from '@mui/icons-material/Terminal'; import { ReleaseDialog } from '../../util/dialog'; import { + getAssignment, pushAssignment, updateAssignment } from '../../../services/assignments.service'; @@ -29,6 +30,8 @@ import { Lecture } from '../../../model/lecture'; import { enqueueSnackbar } from 'notistack'; import { DeadlineComponent } from '../../util/deadline'; import { showDialog } from '../../util/dialog-provider'; +import { useMutation, useQuery } from '@tanstack/react-query'; +import { queryClient } from '../../../widgets/assignmentmanage'; /** * Props for AssignmentStatusComponent. @@ -60,7 +63,28 @@ const getActiveStep = (status: Assignment.StatusEnum) => { * @param props props of assignment status */ export const AssignmentStatus = (props: IAssignmentStatusProps) => { - const [assignment, setAssignment] = React.useState(props.assignment); + const { data: assignment = props.assignment, refetch: refetchAssignment } = + useQuery({ + queryKey: ['assignment'], + queryFn: () => getAssignment(props.lecture.id, props.assignment.id, true) + }); + + const updateStatusMutation = useMutation({ + mutationFn: async (status: 'pushed' | 'released' | 'complete') => { + const updatedAssignment = { ...props.assignment, status }; + return updateAssignment(props.lecture.id, updatedAssignment); + }, + onError: (error: any) => { + enqueueSnackbar('Error: ' + error.message, { variant: 'error' }); + }, + onSuccess: (data: Assignment) => { + props.onAssignmentChange(data); + enqueueSnackbar('Successfully updated assignment', { + variant: 'success' + }); + } + }); + /** * Updates assignment status. * @param status assignment status @@ -73,18 +97,12 @@ export const AssignmentStatus = (props: IAssignmentStatusProps) => { error: string ) => { try { - let a = assignment; - a.status = status; - a = await updateAssignment(props.lecture.id, a); - setAssignment(a); - props.onAssignmentChange(a); - enqueueSnackbar(success, { - variant: 'success' - }); + await updateStatusMutation.mutateAsync(status); + await refetchAssignment(); + await queryClient.invalidateQueries({ queryKey: ['assignments'] }); + enqueueSnackbar(success, { variant: 'success' }); } catch (err) { - enqueueSnackbar(error, { - variant: 'error' - }); + enqueueSnackbar(error, { variant: 'error' }); } }; /** @@ -131,14 +149,14 @@ export const AssignmentStatus = (props: IAssignmentStatusProps) => { description: ( - The assignment has been created and files can now be added to be - pushed. You can commit and pull changes from the remote file - repository through the file view or can work directly with the - underlying git repositories by opening the assignment in the - terminal ( - ). After you are done working on the files you can release the - assignment, which makes a final commit with the current state of the - assignment. + The assignment has been created, and files can now be added and + pushed. You can commit and pull changes from the remote repository + through the file view, or work directly with the underlying Git + repositories by opening the assignment in the terminal ( + + ). Once you’re done working on the files, you can release the + assignment, which will make a final commit with the current state of + the assignment. { description: ( - The assignment has been released to students and it is not advised - to push further changes to the repository. If the assignment is over - you can mark it as complete in the edit menu or right here. Undoing - the release of the assignment will hide the assignment from students - again but their local files are unaffected by this action. When - re-releasing the assignment after significant changes a new commit - will be made and you will have to instruct users to reset their - progress thus far or work with separate versions later on. + The assignment has been released to students, and further changes to + the repository are not advised. When the assignment period is over, + you can mark it as complete in the edit menu or directly here. + Undoing the release will hide the assignment from students, but + their local files will remain unaffected. If you re-release the + assignment after making significant changes, a new commit will be + made, and you may need to instruct users to reset their progress or + work with separate versions. + + + + ); +}; + + export interface ICommitDialogProps { - handleCommit: (msg: string) => void; + handleCommit: (msg: string, selectedFiles?: string[]) => void; children: React.ReactNode; + lecture?: Lecture; + assignment?: Assignment; } export const CommitDialog = (props: ICommitDialogProps) => { const [open, setOpen] = React.useState(false); const [message, setMessage] = React.useState(''); + const [selectedDir, setSelectedDir] = React.useState('source'); + const [filesListVisible, setFilesListVisible] = React.useState(false); + const [selectedFiles, setSelectedFiles] = React.useState(); + const path = `${lectureBasePath}${props.lecture.code}/${selectedDir}/${props.assignment.id}`; + + const fetchFilesForSelectedDir = async () => { + try { + const files = await getFiles(path); + const filePaths = files.flatMap(file => + extractRelativePaths(file, 'source') + ); + setSelectedFiles(filePaths); + } catch (error) { + console.error('Error fetching files:', error); + } + }; + + const toggleFilesList = () => { + setFilesListVisible(!filesListVisible); + fetchFilesForSelectedDir(); + }; + + const handleFileSelectChange = (filePath: string, isSelected: boolean) => { + // console.log(` ${filePath} - ${isSelected}`); + setSelectedFiles(prevSelectedFiles => { + if (isSelected) { + if (!prevSelectedFiles.includes(filePath)) { + return [...prevSelectedFiles, filePath]; + } + } else { + return prevSelectedFiles.filter(file => file !== filePath); + } + return prevSelectedFiles; + }); + }; return (
@@ -513,8 +601,24 @@ export const CommitDialog = (props: ICommitDialogProps) => { fullWidth={true} maxWidth={'sm'} > - Commit Files + + Commit Files + + + + {filesListVisible && ( + + )} { variant="outlined" onClick={() => { setOpen(false); + toggleFilesList(); }} > Cancel @@ -542,8 +647,10 @@ export const CommitDialog = (props: ICommitDialogProps) => { type="submit" disabled={message === ''} onClick={() => { - props.handleCommit(message); + // console.log("See selected files: " + selectedFiles); + props.handleCommit(message, selectedFiles); setOpen(false); + toggleFilesList(); }} > Commit @@ -555,7 +662,6 @@ export const CommitDialog = (props: ICommitDialogProps) => { }; export interface IReleaseDialogProps extends ICommitDialogProps { - assignment: Assignment; handleRelease: () => void; } diff --git a/src/components/util/error.tsx b/src/components/util/error.tsx index 8274205..2d39595 100644 --- a/src/components/util/error.tsx +++ b/src/components/util/error.tsx @@ -1,20 +1,115 @@ import * as React from 'react'; -import { useRouteError } from 'react-router-dom'; +import { + Typography, + Button, + Container, + Grid, + Box +} from '@mui/material'; +import { useNavigate, useRouteError } from 'react-router-dom'; import { storeString } from '../../services/storage.service'; export default function ErrorPage({ id }: { id: string }) { const error: any = useRouteError(); + const navigate = useNavigate(); console.error(error); - console.log('Storing path: /'); storeString(`${id}-react-router-path`, '/'); return ( -
-

Oops!

-

Sorry, an unexpected error has occurred.

-

- {error.statusText || error.message} -

-
+ + + + + Sorry! + + + An unexpected error has occurred. + + + Details + + + {error.statusText || error.message} + +

+ +

+
+ + + +
+
); } diff --git a/src/components/util/file-item.tsx b/src/components/util/file-item.tsx index 7acaa0d..342523d 100644 --- a/src/components/util/file-item.tsx +++ b/src/components/util/file-item.tsx @@ -6,32 +6,147 @@ import { ListItemText, Tooltip, Stack, - Typography + Typography, + Checkbox, + Chip } from '@mui/material'; import InsertDriveFileRoundedIcon from '@mui/icons-material/InsertDriveFileRounded'; import WarningIcon from '@mui/icons-material/Warning'; import KeyboardArrowRightIcon from '@mui/icons-material/KeyboardArrowRight'; -import { Contents } from '@jupyterlab/services'; import DangerousIcon from '@mui/icons-material/Dangerous'; -import { File, getRelativePathAssignment } from '../../services/file.service'; +import { + File, + getRelativePath, + getRemoteFileStatus +} from '../../services/file.service'; +import { Lecture } from '../../model/lecture'; +import { Assignment } from '../../model/assignment'; +import { RepoType } from './repo-type'; +import CompareArrowsIcon from '@mui/icons-material/CompareArrows'; +import CheckIcon from '@mui/icons-material/Check'; +import PublishRoundedIcon from '@mui/icons-material/PublishRounded'; +import { UseQueryOptions, useQuery } from '@tanstack/react-query'; +import { RemoteFileStatus } from '../../model/remoteFileStatus'; interface IFileItemProps { file: File; + lecture?: Lecture; + assignment?: Assignment; inContained: (file: string) => boolean; missingFiles?: File[]; openFile: (path: string) => void; allowFiles?: boolean; + checkboxes: boolean; + onFileSelectChange?: (filePath: string, isSelected: boolean) => void; + checkStatus?: boolean; // check if file is up to date with remote git repo } const FileItem = ({ file, + lecture, + assignment, inContained, openFile, allowFiles, - missingFiles + missingFiles, + checkboxes, + onFileSelectChange, + checkStatus = false // Default is false if not provided }: IFileItemProps) => { const inMissing = (filePath: string) => { - return missingFiles.some(missingFile => missingFile.path === filePath); + return missingFiles?.some(missingFile => missingFile.path === filePath); + }; + + const [isSelected, setIsSelected] = React.useState(true); + + const fileStatusQueryOptions: UseQueryOptions = { + queryKey: ['fileStatus', lecture?.id, assignment?.id, file.path], + queryFn: () => + getRemoteFileStatus( + lecture, + assignment, + RepoType.SOURCE, + getRelativePath(file.path, 'source'), + true + ) as Promise, + enabled: checkStatus && !!lecture && !!assignment, // Enable only if checkStatus is true + staleTime: 3000 + }; + + const fileRemoteStatusResponse = useQuery(fileStatusQueryOptions); + + if (fileRemoteStatusResponse.isError) { + console.error( + 'could not fetch remote status: ' + fileRemoteStatusResponse.error.message + ); + } + + const fileRemoteStatus: RemoteFileStatus.StatusEnum | undefined = + fileRemoteStatusResponse.data?.status; + + const getFileRemoteStatusText = (status: RemoteFileStatus.StatusEnum) => { + if (status === RemoteFileStatus.StatusEnum.UpToDate) { + return 'The local file is up to date with the file from remote repository.'; + } else if (status === RemoteFileStatus.StatusEnum.PushNeeded) { + return 'You have made changes to this file locally, a push is needed.'; + } else if (status === RemoteFileStatus.StatusEnum.NoRemoteRepo) { + return 'There is no remote repository yet. Push your assignment to create it.'; + } else { + return 'The local and remote file are divergent.'; + } + }; + + const getStatusChip = (status: RemoteFileStatus.StatusEnum) => { + if (status === RemoteFileStatus.StatusEnum.UpToDate) { + return ( + } + /> + ); + } else if (status === RemoteFileStatus.StatusEnum.PushNeeded) { + return ( + } + /> + ); + } else if (status === RemoteFileStatus.StatusEnum.NoRemoteRepo) { + return ( + } + /> + ); + } else { + return ( + } + /> + ); + } + }; + + const toggleSelection = () => { + setIsSelected(prevState => { + const nextState = !prevState; + // used only with checkboxes -> in source directory + onFileSelectChange?.(getRelativePath(file.path, 'source'), nextState); + return nextState; + }); }; const extraFileHelp = @@ -39,18 +154,29 @@ const FileItem = ({ const missingFileHelp = 'This file should be part of your assignment! Did you delete it?'; - //console.log("Missing files (file-item): " + missingFiles.map(f => f.path)); return ( + {checkboxes && ( + + + + )} openFile(file.path)} dense={true}> - + {!checkboxes && ( + + )} {file.name}} secondary={ + {checkboxes && checkStatus && fileRemoteStatus && ( + + {getStatusChip(fileRemoteStatus)} + + )} {inMissing(file.path) && ( @@ -63,7 +189,7 @@ const FileItem = ({ )} { - {!inContained(getRelativePathAssignment(file.path)) && + {!inContained(getRelativePath(file.path, 'assignments')) && !allowFiles && ( diff --git a/src/components/util/file-list.tsx b/src/components/util/file-list.tsx index a3e9afe..2f6b381 100644 --- a/src/components/util/file-list.tsx +++ b/src/components/util/file-list.tsx @@ -1,25 +1,13 @@ import React from 'react'; -import { - Box, - Card, - List, - ListItem, - ListItemIcon, - ListItemText, - Paper, - Tooltip, - Typography -} from '@mui/material'; -import { Contents } from '@jupyterlab/services'; -import IModel = Contents.IModel; -import { Stack, SxProps } from '@mui/system'; +import { Card, List, Paper, Typography } from '@mui/material'; +import { SxProps } from '@mui/system'; import { Theme } from '@mui/material/styles'; import { getFiles, openFile, File, - extractRelativePathsAssignment, - getRelativePathAssignment, + extractRelativePaths, + getRelativePath, lectureBasePath } from '../../services/file.service'; import { grey } from '@mui/material/colors'; @@ -27,6 +15,7 @@ import FileItem from './file-item'; import FolderItem from './folder-item'; import { Assignment } from '../../model/assignment'; import { Lecture } from '../../model/lecture'; +import { useQuery } from '@tanstack/react-query'; interface IFileListProps { path: string; @@ -35,13 +24,22 @@ interface IFileListProps { assignment?: Assignment; lecture?: Lecture; missingFiles?: File[]; + checkboxes: boolean; + onFileSelectChange?: (filePath: string, isSelected: boolean) => void; + checkStatus?: boolean; // check if files in list are up to date with remote git repo } export const FilesList = (props: IFileListProps) => { - const [files, setFiles] = React.useState([]); + const { data: files = [], refetch } = useQuery({ + queryKey: ['files', props.path], + queryFn: () => getFiles(props.path), + // Disable automatic refetching, since we want to subscribe directyly on property changes. + refetchOnMount: false, + refetchInterval: false + }); React.useEffect(() => { - getFiles(props.path).then(files => setFiles(files)); + refetch(); }, [props]); const inContained = (file: string) => { @@ -51,9 +49,13 @@ export const FilesList = (props: IFileListProps) => { return true; }; - const generateItems = (files: File[]) => { + const handleFileSelectChange = (filePath: string, isSelected: boolean) => { + props.onFileSelectChange(filePath, isSelected); + }; + + const generateItems = (files: File[], handleFileSelectChange) => { const filePaths = files.flatMap(file => - extractRelativePathsAssignment(file) + extractRelativePaths(file, 'assignments') ); const missingFiles: File[] = (props.shouldContain && @@ -72,7 +74,7 @@ export const FilesList = (props: IFileListProps) => { []; const missingFilesTopOrder = missingFiles.filter(missingFile => { - const relativePath = getRelativePathAssignment(missingFile.path); + const relativePath = getRelativePath(missingFile.path, 'assignments'); return !relativePath.includes('/'); }); @@ -82,10 +84,15 @@ export const FilesList = (props: IFileListProps) => { ); } else { @@ -93,10 +100,15 @@ export const FilesList = (props: IFileListProps) => { ); } @@ -113,7 +125,7 @@ export const FilesList = (props: IFileListProps) => { No Files Found ) : ( - {generateItems(files)} + {generateItems(files, props.onFileSelectChange)} )} diff --git a/src/components/util/folder-item.tsx b/src/components/util/folder-item.tsx index f5e75dd..e700fe3 100644 --- a/src/components/util/folder-item.tsx +++ b/src/components/util/folder-item.tsx @@ -5,33 +5,26 @@ import { ListItemIcon, ListItemText, Collapse, - Stack, - Tooltip, Typography, List } from '@mui/material'; -import { Contents } from '@jupyterlab/services'; -import IModel = Contents.IModel; import FolderIcon from '@mui/icons-material/Folder'; import FileItem from './file-item'; import KeyboardArrowRightIcon from '@mui/icons-material/KeyboardArrowRight'; import KeyboardArrowUpIcon from '@mui/icons-material/KeyboardArrowUp'; -import { File, getFiles } from '../../services/file.service'; - -interface IFolderItemProps { - folder: File; - inContained: (file: string) => boolean; - openFile: (path: string) => void; - allowFiles?: boolean; - missingFiles?: File[]; -} +import { getFiles } from '../../services/file.service'; const FolderItem = ({ folder, + lecture, + assigment, missingFiles, inContained, openFile, - allowFiles + allowFiles, + checkboxes, + onFileSelectChange, + checkStatus }) => { const [open, setOpen] = useState(false); @@ -65,8 +58,6 @@ const FolderItem = ({ setOpen(!open); }; - //console.log("Folder " + folder.name + " contents: " + folder.content.map(f => f.path)); - return ( <> @@ -86,19 +77,29 @@ const FolderItem = ({ ) : ( ) )} diff --git a/src/index.ts b/src/index.ts index 3a9ae91..d578636 100644 --- a/src/index.ts +++ b/src/index.ts @@ -59,11 +59,10 @@ import { HintWidget } from './components/notebook/student-plugin/hint-widget'; import { DeadlineWidget } from './components/notebook/student-plugin/deadline-widget'; import { lectureSubPaths } from './services/file.service'; import IModel = Contents.IModel; -import { Assignment } from './model/assignment'; -import { Lecture } from './model/lecture'; -import { getAllLectures } from './services/lectures.service'; -import { getLabel, updateMenus } from './menu'; +import { updateMenus } from './menu'; import { loadString } from './services/storage.service'; +import { HTTPError } from './services/request.service'; +import { ErrorRounded } from '@mui/icons-material'; export namespace AssignmentsCommandIDs { export const create = 'assignments:create'; @@ -89,34 +88,6 @@ namespace ShowHintIDs { export const show = 'notebookplugin:show-hint'; } -namespace GradingCommandIDs { - export const create = 'grading:create'; - - export const open = 'grading:open'; -} - -namespace ManualGradeCommandIDs { - export const create = 'manualgrade:create'; - - export const open = 'manualgrade:open'; -} - -namespace CreateSubmissionCommandsID { - export const create = 'create:create'; - - export const open = 'create:open'; -} - -namespace FeedbackCommandIDs { - export const create = 'feedback:create'; - - export const open = 'feedback:open'; -} - -namespace DeadlineCommandIDs { - export const open = 'deadline:open'; -} - export class GlobalObjects { static commands: CommandRegistry; static docRegistry: DocumentRegistry; @@ -129,6 +100,123 @@ export class GlobalObjects { static courseManageMenu: Menu; } +const createCourseManagementOpenCommand = (app: JupyterFrontEnd, launcher: ILauncher, courseManageTracker: WidgetTracker>) => { + const command = CourseManageCommandIDs.open; + app.commands.addCommand(command, { + label: args => + args['label'] ? (args['label'] as string) : 'Course Management', + execute: async args => { + let gradingWidget = courseManageTracker.currentWidget; + if (!gradingWidget) { + gradingWidget = await app.commands.execute( + CourseManageCommandIDs.create + ); + } + + let path = args?.path as string; + if (args?.path === undefined) { + const savedPath = loadString('course-manage-react-router-path'); + if (savedPath !== null && savedPath !== '') { + path = savedPath; + } else { + path = '/'; + } + } + await gradingWidget.content.router.navigate(path); + + if (!gradingWidget.isAttached) { + // Attach the widget to the main work area if it's not there + app.shell.add(gradingWidget, 'main'); + } + // Activate the widget + app.shell.activateById(gradingWidget.id); + }, + icon: args => (args['path'] ? undefined : checkIcon) + }); + // Add the command to the launcher + console.log('Add course management launcher'); + launcher.add({ + command: command, + category: 'Assignments', + rank: 0 + }); +} + +//Creation of in-cell widget for create assignment +const connectTrackerSignals = (tracker: INotebookTracker) => { + tracker.currentChanged.connect(async () => { + const notebookPanel = tracker.currentWidget; + //Notebook not yet loaded + if (notebookPanel === null) { + return; + } + const notebook: Notebook = tracker.currentWidget.content; + const mode = false; + + notebookPanel.context.ready.then(() => { + //Creation of widget switch + const switcher: NotebookModeSwitch = new NotebookModeSwitch( + mode, + notebookPanel, + notebook + ); + + tracker.currentWidget.toolbar.insertItem(10, 'Mode', switcher); + + //Creation of deadline widget + const deadlineWidget = new DeadlineWidget( + tracker.currentWidget.context.path + ); + tracker.currentWidget.toolbar.insertItem( + 11, + 'Deadline', + deadlineWidget + ); + }); + }, this); + + tracker.activeCellChanged.connect(() => { + const notebookPanel: NotebookPanel = tracker.currentWidget; + //Notebook not yet loaded + if (notebookPanel === null) { + return; + } + const notebook: Notebook = tracker.currentWidget.content; + const contentsModel: Omit = + notebookPanel.context.contentsModel; + if (contentsModel === null) { + return; + } + const notebookPaths: string[] = contentsModel.path.split('/'); + + if (notebookPaths[lectureSubPaths + 1] === 'manualgrade') { + return; + } + + let switcher: any = null; + (notebookPanel.toolbar.layout as PanelLayout).widgets.map(w => { + if (w instanceof NotebookModeSwitch) { + switcher = w; + } + }); + + const cell: Cell = notebook.activeCell; + + //check if in creationmode and new cell was inserted + if ( + switcher.mode && + (cell.layout as PanelLayout).widgets.every(w => { + return !(w instanceof CreationWidget); + }) + ) { + (cell.layout as PanelLayout).insertWidget( + 0, + new CreationWidget(cell) + ); + } + }, this); +}; + /** * Initialization data for the grading extension. */ @@ -204,81 +292,6 @@ const extension: JupyterFrontEndPlugin = { name: () => 'grader-coursemanage' }); - //Creation of in-cell widget for create assignment - const connectTrackerSignals = (tracker: INotebookTracker) => { - tracker.currentChanged.connect(async () => { - const notebookPanel = tracker.currentWidget; - //Notebook not yet loaded - if (notebookPanel === null) { - return; - } - const notebook: Notebook = tracker.currentWidget.content; - const mode = false; - - notebookPanel.context.ready.then(() => { - //Creation of widget switch - const switcher: NotebookModeSwitch = new NotebookModeSwitch( - mode, - notebookPanel, - notebook - ); - - tracker.currentWidget.toolbar.insertItem(10, 'Mode', switcher); - - //Creation of deadline widget - const deadlineWidget = new DeadlineWidget( - tracker.currentWidget.context.path - ); - tracker.currentWidget.toolbar.insertItem( - 11, - 'Deadline', - deadlineWidget - ); - }); - }, this); - - tracker.activeCellChanged.connect(() => { - const notebookPanel: NotebookPanel = tracker.currentWidget; - //Notebook not yet loaded - if (notebookPanel === null) { - return; - } - const notebook: Notebook = tracker.currentWidget.content; - const contentsModel: Omit = - notebookPanel.context.contentsModel; - if (contentsModel === null) { - return; - } - const notebookPaths: string[] = contentsModel.path.split('/'); - - if (notebookPaths[lectureSubPaths + 1] === 'manualgrade') { - return; - } - - let switcher: any = null; - (notebookPanel.toolbar.layout as PanelLayout).widgets.map(w => { - if (w instanceof NotebookModeSwitch) { - switcher = w; - } - }); - - const cell: Cell = notebook.activeCell; - - //check if in creationmode and new cell was inserted - if ( - switcher.mode && - (cell.layout as PanelLayout).widgets.every(w => { - return !(w instanceof CreationWidget); - }) - ) { - (cell.layout as PanelLayout).insertWidget( - 0, - new CreationWidget(cell) - ); - } - }, this); - }; - /* ##### Course Manage View Widget ##### */ let command: string = CourseManageCommandIDs.create; app.commands.addCommand(command, { @@ -339,47 +352,7 @@ const extension: JupyterFrontEndPlugin = { cmMenu.title.label = 'Course Management'; mainMenu.addMenu(cmMenu, false, { rank: 210 }); - command = CourseManageCommandIDs.open; - app.commands.addCommand(command, { - label: args => - args['label'] ? (args['label'] as string) : 'Course Management', - execute: async args => { - let gradingWidget = courseManageTracker.currentWidget; - if (!gradingWidget) { - gradingWidget = await app.commands.execute( - CourseManageCommandIDs.create - ); - } - - let path = args?.path as string; - if (args?.path === undefined) { - const savedPath = loadString('course-manage-react-router-path'); - if (savedPath !== null && savedPath !== '') { - console.log(`Restoring path: ${savedPath}`); - path = savedPath; - } else { - path = '/'; - } - } - await gradingWidget.content.router.navigate(path); - - if (!gradingWidget.isAttached) { - // Attach the widget to the main work area if it's not there - app.shell.add(gradingWidget, 'main'); - } - // Activate the widget - app.shell.activateById(gradingWidget.id); - }, - icon: args => (args['path'] ? undefined : checkIcon) - }); - - // Add the command to the launcher - console.log('Add course management launcher'); - launcher.add({ - command: command, - category: 'Assignments', - rank: 0 - }); + createCourseManagementOpenCommand(app, launcher, courseManageTracker) } // add Menu to JupyterLab main menu @@ -410,7 +383,6 @@ const extension: JupyterFrontEndPlugin = { 'assignment-manage-react-router-path' ); if (savedPath !== null && savedPath !== '') { - console.log(`Restoring path: ${savedPath}`); path = savedPath; } else { path = '/'; @@ -437,11 +409,12 @@ const extension: JupyterFrontEndPlugin = { rank: 0 }); }) - .catch(_ => + .catch((error: Error) => { showErrorMessage( - 'Grader Service Unavailable', - 'Could not connect to the grader service! Please contact your system administrator!' - ) + 'Grader Labextension Disabled', + 'Please restart your server: ' + error.message + ) + } ); command = NotebookExecuteIDs.run; diff --git a/src/menu.ts b/src/menu.ts index bc5a2d9..b143b34 100644 --- a/src/menu.ts +++ b/src/menu.ts @@ -59,7 +59,6 @@ export const updateMenus = async (reload: boolean = false) => { }); }); aMenu.update(); - console.log('Updated assignment menu'); if (cmMenu) { cmMenu.clearItems(); @@ -91,6 +90,5 @@ export const updateMenus = async (reload: boolean = false) => { }); }); cmMenu.update(); - console.log('Updated course manage menu'); } }; diff --git a/src/model/assignment.ts b/src/model/assignment.ts index ed24b47..da79f06 100644 --- a/src/model/assignment.ts +++ b/src/model/assignment.ts @@ -1,9 +1,7 @@ /** * Grader Extension API Schemas - * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) - * - * The version of the OpenAPI document: 0.1 * + * * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). * https://openapi-generator.tech @@ -11,35 +9,38 @@ */ import { AssignmentSettings } from './assignmentSettings'; -export interface Assignment { - id?: number; - name?: string; - type?: Assignment.TypeEnum; - due_date?: string; - status?: Assignment.StatusEnum; - points?: number; - automatic_grading?: Assignment.AutomaticGradingEnum; - max_submissions?: number; - allow_files?: boolean; - settings?: AssignmentSettings; + +export interface Assignment { + id?: number; + name?: string; + type?: Assignment.TypeEnum; + due_date?: string; + status?: Assignment.StatusEnum; + points?: number; + automatic_grading?: Assignment.AutomaticGradingEnum; + max_submissions?: number; + allow_files?: boolean; + settings?: AssignmentSettings; } export namespace Assignment { - export type TypeEnum = 'user' | 'group'; - export const TypeEnum = { - User: 'user' as TypeEnum, - Group: 'group' as TypeEnum - }; - export type StatusEnum = 'created' | 'pushed' | 'released' | 'complete'; - export const StatusEnum = { - Created: 'created' as StatusEnum, - Pushed: 'pushed' as StatusEnum, - Released: 'released' as StatusEnum, - Complete: 'complete' as StatusEnum - }; - export type AutomaticGradingEnum = 'unassisted' | 'auto' | 'full_auto'; - export const AutomaticGradingEnum = { - Unassisted: 'unassisted' as AutomaticGradingEnum, - Auto: 'auto' as AutomaticGradingEnum, - FullAuto: 'full_auto' as AutomaticGradingEnum - }; + export type TypeEnum = 'user' | 'group'; + export const TypeEnum = { + User: 'user' as TypeEnum, + Group: 'group' as TypeEnum + }; + export type StatusEnum = 'created' | 'pushed' | 'released' | 'complete'; + export const StatusEnum = { + Created: 'created' as StatusEnum, + Pushed: 'pushed' as StatusEnum, + Released: 'released' as StatusEnum, + Complete: 'complete' as StatusEnum + }; + export type AutomaticGradingEnum = 'unassisted' | 'auto' | 'full_auto'; + export const AutomaticGradingEnum = { + Unassisted: 'unassisted' as AutomaticGradingEnum, + Auto: 'auto' as AutomaticGradingEnum, + FullAuto: 'full_auto' as AutomaticGradingEnum + }; } + + diff --git a/src/model/assignmentDetail.ts b/src/model/assignmentDetail.ts index 05396ba..05f1822 100644 --- a/src/model/assignmentDetail.ts +++ b/src/model/assignmentDetail.ts @@ -1,9 +1,7 @@ /** * Grader Extension API Schemas - * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) - * - * The version of the OpenAPI document: 0.1 * + * * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). * https://openapi-generator.tech @@ -11,35 +9,38 @@ */ import { Submission } from './submission'; -export interface AssignmentDetail { - id?: number; - name?: string; - type?: AssignmentDetail.TypeEnum; - due_date?: string; - status?: AssignmentDetail.StatusEnum; - points?: number; - automatic_grading?: AssignmentDetail.AutomaticGradingEnum; - max_submissions?: number; - allow_files?: boolean; - submissions?: Array; + +export interface AssignmentDetail { + id?: number; + name?: string; + type?: AssignmentDetail.TypeEnum; + due_date?: string; + status?: AssignmentDetail.StatusEnum; + points?: number; + automatic_grading?: AssignmentDetail.AutomaticGradingEnum; + max_submissions?: number; + allow_files?: boolean; + submissions?: Array; } export namespace AssignmentDetail { - export type TypeEnum = 'user' | 'group'; - export const TypeEnum = { - User: 'user' as TypeEnum, - Group: 'group' as TypeEnum - }; - export type StatusEnum = 'created' | 'pushed' | 'released' | 'complete'; - export const StatusEnum = { - Created: 'created' as StatusEnum, - Pushed: 'pushed' as StatusEnum, - Released: 'released' as StatusEnum, - Complete: 'complete' as StatusEnum - }; - export type AutomaticGradingEnum = 'unassisted' | 'auto' | 'full_auto'; - export const AutomaticGradingEnum = { - Unassisted: 'unassisted' as AutomaticGradingEnum, - Auto: 'auto' as AutomaticGradingEnum, - FullAuto: 'full_auto' as AutomaticGradingEnum - }; + export type TypeEnum = 'user' | 'group'; + export const TypeEnum = { + User: 'user' as TypeEnum, + Group: 'group' as TypeEnum + }; + export type StatusEnum = 'created' | 'pushed' | 'released' | 'complete'; + export const StatusEnum = { + Created: 'created' as StatusEnum, + Pushed: 'pushed' as StatusEnum, + Released: 'released' as StatusEnum, + Complete: 'complete' as StatusEnum + }; + export type AutomaticGradingEnum = 'unassisted' | 'auto' | 'full_auto'; + export const AutomaticGradingEnum = { + Unassisted: 'unassisted' as AutomaticGradingEnum, + Auto: 'auto' as AutomaticGradingEnum, + FullAuto: 'full_auto' as AutomaticGradingEnum + }; } + + diff --git a/src/model/assignmentSettings.ts b/src/model/assignmentSettings.ts index f2d3cca..d572a28 100644 --- a/src/model/assignmentSettings.ts +++ b/src/model/assignmentSettings.ts @@ -1,9 +1,7 @@ /** * Grader Extension API Schemas - * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) - * - * The version of the OpenAPI document: 0.1 * + * * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). * https://openapi-generator.tech @@ -11,6 +9,8 @@ */ import { SubmissionPeriod } from './submissionPeriod'; -export interface AssignmentSettings { - late_submission?: Array; + +export interface AssignmentSettings { + late_submission?: Array; } + diff --git a/src/model/errorMessage.ts b/src/model/errorMessage.ts index abc9b10..f5fa18b 100644 --- a/src/model/errorMessage.ts +++ b/src/model/errorMessage.ts @@ -1,19 +1,19 @@ /** * Grader Extension API Schemas - * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) - * - * The version of the OpenAPI document: 0.1 * + * * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). * https://openapi-generator.tech * Do not edit the class manually. */ -export interface ErrorMessage { - code: number; - error: string; - path: string; - message?: string; - traceback?: string; + +export interface ErrorMessage { + code: number; + error: string; + path: string; + message?: string; + traceback?: string; } + diff --git a/src/model/lecture.ts b/src/model/lecture.ts index 10a7922..bbe7bf3 100644 --- a/src/model/lecture.ts +++ b/src/model/lecture.ts @@ -1,18 +1,18 @@ /** * Grader Extension API Schemas - * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) - * - * The version of the OpenAPI document: 0.1 * + * * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). * https://openapi-generator.tech * Do not edit the class manually. */ -export interface Lecture { - id?: number; - name?: string; - code?: string; - complete?: boolean; + +export interface Lecture { + id?: number; + name?: string; + code?: string; + complete?: boolean; } + diff --git a/src/model/remoteFileStatus.ts b/src/model/remoteFileStatus.ts new file mode 100644 index 0000000..6e7a450 --- /dev/null +++ b/src/model/remoteFileStatus.ts @@ -0,0 +1,26 @@ +/** + * Grader Extension API Schemas + * + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + + +export interface RemoteFileStatus { + status: RemoteFileStatus.StatusEnum; +} +export namespace RemoteFileStatus { + export type StatusEnum = 'UP_TO_DATE' | 'DIVERGENT' | 'PULL_NEEDED' | 'PUSH_NEEDED' | 'NO_REMOTE_REPO'; + export const StatusEnum = { + UpToDate: 'UP_TO_DATE' as StatusEnum, + Divergent: 'DIVERGENT' as StatusEnum, + PullNeeded: 'PULL_NEEDED' as StatusEnum, + PushNeeded: 'PUSH_NEEDED' as StatusEnum, + NoRemoteRepo: 'NO_REMOTE_REPO' as StatusEnum + }; +} + + diff --git a/src/model/submission.ts b/src/model/submission.ts index 1ca8bf6..bc40c06 100644 --- a/src/model/submission.ts +++ b/src/model/submission.ts @@ -1,63 +1,51 @@ /** * Grader Extension API Schemas - * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) - * - * The version of the OpenAPI document: 0.1 * + * * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). * https://openapi-generator.tech * Do not edit the class manually. */ -export interface Submission { - id?: number; - submitted_at?: string; - auto_status?: Submission.AutoStatusEnum; - manual_status?: Submission.ManualStatusEnum; - username?: string; - grading_score?: number; - score_scaling?: number; - score?: number; - assignid?: number; - commit_hash?: string; - feedback_status?: Submission.FeedBackStatusEnum; - edited?: boolean; + +export interface Submission { + id?: number; + submitted_at?: string; + auto_status?: Submission.AutoStatusEnum; + manual_status?: Submission.ManualStatusEnum; + username?: string; + grading_score?: number; + score_scaling?: number; + score?: number; + assignid?: number; + commit_hash?: string; + feedback_status?: Submission.FeedbackStatusEnum; + edited?: boolean; } export namespace Submission { - export type AutoStatusEnum = - | 'not_graded' - | 'pending' - | 'automatically_graded' - | 'grading_failed'; - export const AutoStatusEnum = { - NotGraded: 'not_graded' as AutoStatusEnum, - Pending: 'pending' as AutoStatusEnum, - AutomaticallyGraded: 'automatically_graded' as AutoStatusEnum, - GradingFailed: 'grading_failed' as AutoStatusEnum - }; - export type ManualStatusEnum = - | 'not_graded' - | 'manually_graded' - | 'being_edited' - | 'grading_failed'; - export const ManualStatusEnum = { - NotGraded: 'not_graded' as ManualStatusEnum, - ManuallyGraded: 'manually_graded' as ManualStatusEnum, - BeingEdited: 'being_edited' as ManualStatusEnum, - GradingFailed: 'grading_failed' as ManualStatusEnum - }; - export type FeedBackStatusEnum = - | 'not_generated' - | 'generating' - | 'generated' - | 'generation_failed' - | 'feedback_outdated'; - export const FeedBackStatusEnum = { - NotGenerated: 'not_generated' as FeedBackStatusEnum, - Generating: 'generating' as FeedBackStatusEnum, - Generated: 'generated' as FeedBackStatusEnum, - GenerationFailed: 'generation_failed' as FeedBackStatusEnum, - FeedbackOutdated: 'feedback_outdated' as FeedBackStatusEnum - }; + export type AutoStatusEnum = 'not_graded' | 'pending' | 'automatically_graded' | 'grading_failed'; + export const AutoStatusEnum = { + NotGraded: 'not_graded' as AutoStatusEnum, + Pending: 'pending' as AutoStatusEnum, + AutomaticallyGraded: 'automatically_graded' as AutoStatusEnum, + GradingFailed: 'grading_failed' as AutoStatusEnum + }; + export type ManualStatusEnum = 'not_graded' | 'manually_graded' | 'being_edited' | 'grading_failed'; + export const ManualStatusEnum = { + NotGraded: 'not_graded' as ManualStatusEnum, + ManuallyGraded: 'manually_graded' as ManualStatusEnum, + BeingEdited: 'being_edited' as ManualStatusEnum, + GradingFailed: 'grading_failed' as ManualStatusEnum + }; + export type FeedbackStatusEnum = 'not_generated' | 'generating' | 'generated' | 'generation_failed' | 'feedback_outdated'; + export const FeedbackStatusEnum = { + NotGenerated: 'not_generated' as FeedbackStatusEnum, + Generating: 'generating' as FeedbackStatusEnum, + Generated: 'generated' as FeedbackStatusEnum, + GenerationFailed: 'generation_failed' as FeedbackStatusEnum, + FeedbackOutdated: 'feedback_outdated' as FeedbackStatusEnum + }; } + + diff --git a/src/model/submissionPeriod.ts b/src/model/submissionPeriod.ts index 3ab4f11..765d1cc 100644 --- a/src/model/submissionPeriod.ts +++ b/src/model/submissionPeriod.ts @@ -1,16 +1,16 @@ /** * Grader Extension API Schemas - * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) - * - * The version of the OpenAPI document: 0.1 * + * * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). * https://openapi-generator.tech * Do not edit the class manually. */ -export interface SubmissionPeriod { - period?: string; - scaling?: number; + +export interface SubmissionPeriod { + period?: string; + scaling?: number; } + diff --git a/src/model/user.ts b/src/model/user.ts index 9a6d9a1..950b9fb 100644 --- a/src/model/user.ts +++ b/src/model/user.ts @@ -1,15 +1,15 @@ /** * Grader Extension API Schemas - * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) - * - * The version of the OpenAPI document: 0.1 * + * * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). * https://openapi-generator.tech * Do not edit the class manually. */ -export interface User { - name?: string; + +export interface User { + name?: string; } + diff --git a/src/model/userSubmissionsInner.ts b/src/model/userSubmissionsInner.ts index abcaa49..48e2f9e 100644 --- a/src/model/userSubmissionsInner.ts +++ b/src/model/userSubmissionsInner.ts @@ -1,9 +1,7 @@ /** * Grader Extension API Schemas - * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) - * - * The version of the OpenAPI document: 0.1 * + * * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). * https://openapi-generator.tech @@ -12,7 +10,9 @@ import { User } from './user'; import { Submission } from './submission'; -export interface UserSubmissionsInner { - user?: User; - submissions?: Array; + +export interface UserSubmissionsInner { + user?: User; + submissions?: Array; } + diff --git a/src/services/assignments.service.ts b/src/services/assignments.service.ts index 2995528..fedd83a 100644 --- a/src/services/assignments.service.ts +++ b/src/services/assignments.service.ts @@ -15,7 +15,7 @@ export function createAssignment( ): Promise { return request( HTTPMethod.POST, - `/lectures/${lectureId}/assignments`, + `/api/lectures/${lectureId}/assignments`, assignment ); } @@ -25,7 +25,8 @@ export function getAllAssignments( reload = false, includeSubmissions = false ): Promise { - let url = `/lectures/${lectureId}/assignments`; + + let url = `/api/lectures/${lectureId}/assignments`; if (includeSubmissions) { const searchParams = new URLSearchParams({ 'include-submissions': String(includeSubmissions) @@ -42,7 +43,7 @@ export function getAssignment( ): Promise { return request( HTTPMethod.GET, - `/lectures/${lectureId}/assignments/${assignmentId}`, + `/api/lectures/${lectureId}/assignments/${assignmentId}`, null, reload ); @@ -55,7 +56,7 @@ export function getAssignmentProperties( ): Promise { return request( HTTPMethod.GET, - `/lectures/${lectureId}/assignments/${assignmentId}/properties`, + `/api/lectures/${lectureId}/assignments/${assignmentId}/properties`, null, reload ); @@ -67,7 +68,7 @@ export function updateAssignment( ): Promise { return request( HTTPMethod.PUT, - `/lectures/${lectureId}/assignments/${assignment.id}`, + `/api/lectures/${lectureId}/assignments/${assignment.id}`, assignment ); } @@ -78,7 +79,7 @@ export function generateAssignment( ): Promise { return request( HTTPMethod.PUT, - `/lectures/${lectureId}/assignments/${assignment.id}/generate`, + `/api/lectures/${lectureId}/assignments/${assignment.id}/generate`, null ); } @@ -90,7 +91,7 @@ export function fetchAssignment( metadataOnly: boolean = false, reload: boolean = false ): Promise { - let url = `/lectures/${lectureId}/assignments/${assignmentId}`; + let url = `/api/lectures/${lectureId}/assignments/${assignmentId}`; if (instructor || metadataOnly) { const searchParams = new URLSearchParams({ 'instructor-version': String(instructor), @@ -108,7 +109,7 @@ export function deleteAssignment( ): Promise { return request( HTTPMethod.DELETE, - `/lectures/${lectureId}/assignments/${assignmentId}`, + `/api/lectures/${lectureId}/assignments/${assignmentId}`, null ); } @@ -117,18 +118,27 @@ export function pushAssignment( lectureId: number, assignmentId: number, repoType: string, - commitMessage?: string + commitMessage?: string, + selectedFiles?: string[] ): Promise { - let url = `/lectures/${lectureId}/assignments/${assignmentId}/push/${repoType}`; - if (commitMessage) { + let url = `/api/lectures/${lectureId}/assignments/${assignmentId}/push/${repoType}`; + if (commitMessage && commitMessage !== undefined) { const searchParams = new URLSearchParams({ 'commit-message': commitMessage }); url += '?' + searchParams; } + + if (selectedFiles && selectedFiles.length > 0) { + selectedFiles.forEach(file => { + url += `&selected-files=${encodeURIComponent(file)}`; + }); + } + return request(HTTPMethod.PUT, url, null); } + export function pullAssignment( lectureId: number, assignmentId: number, @@ -136,7 +146,7 @@ export function pullAssignment( ): Promise { return request( HTTPMethod.GET, - `/lectures/${lectureId}/assignments/${assignmentId}/pull/${repoType}`, + `/api/lectures/${lectureId}/assignments/${assignmentId}/pull/${repoType}`, null ); } @@ -147,7 +157,7 @@ export function resetAssignment( ): Promise { return request( HTTPMethod.GET, - `/lectures/${lecture.id}/assignments/${assignment.id}/reset`, + `/api/lectures/${lecture.id}/assignments/${assignment.id}/reset`, null ); } diff --git a/src/services/file.service.ts b/src/services/file.service.ts index 68a32a9..9c141d2 100644 --- a/src/services/file.service.ts +++ b/src/services/file.service.ts @@ -4,9 +4,8 @@ // This source code is licensed under the BSD-style license found in the // LICENSE file in the root directory of this source tree. -import { FilterFileBrowserModel } from '@jupyterlab/filebrowser/lib/model'; +import { FileBrowserModel } from '@jupyterlab/filebrowser/lib/model'; import { GlobalObjects } from '../index'; -import { renameFile } from '@jupyterlab/docmanager'; import { Contents } from '@jupyterlab/services'; import { Assignment } from '../model/assignment'; import { HTTPMethod, request } from './request.service'; @@ -15,6 +14,7 @@ import { RepoType } from '../components/util/repo-type'; import IModel = Contents.IModel; import { PageConfig, PathExt } from '@jupyterlab/coreutils'; import { enqueueSnackbar } from 'notistack'; +import { RemoteFileStatus } from '../model/remoteFileStatus'; // remove slashes at beginning and end of base path if they exist export let lectureBasePath = PageConfig.getOption('lectures_base_path').replace( @@ -39,19 +39,20 @@ export interface File { content: File[]; } -// TODO: getFiles should return Promise export const getFiles = async (path: string): Promise => { if (path === null) { return []; } - const model = new FilterFileBrowserModel({ - auto: true, - manager: GlobalObjects.docManager + const model = new FileBrowserModel({ + auto: false, + manager: GlobalObjects.docManager, + refreshInterval: 1000000 }); try { await model.cd(path); + await model.refresh(); } catch (_) { return []; } @@ -83,28 +84,29 @@ export const getFiles = async (path: string): Promise => { } f = items.next(); } - - console.log('getting files from path ' + path); return files; }; -export const getRelativePathAssignment = (path: string) => { - const regex = /assignments\/[^/]+\/(.+)/; +export const getRelativePath = (path: string, reg: 'assignments' | 'source') => { + const regexStr = `${reg}\/[^/]+\/(.+)`; + const regex = new RegExp(regexStr); const match = path.match(regex); return match ? match[1] : path; }; -export const extractRelativePathsAssignment = (file: File) => { +export const extractRelativePaths = (file: File, reg: 'assignments' | 'source' ) => { if (file.type === 'directory') { const nestedPaths = file.content.flatMap(nestedFile => - extractRelativePathsAssignment(nestedFile) + extractRelativePaths(nestedFile, reg) ); - return [getRelativePathAssignment(file.path), ...nestedPaths]; + return [getRelativePath(file.path, reg), ...nestedPaths]; } else { - return [getRelativePathAssignment(file.path)]; + return [getRelativePath(file.path, reg)]; } }; + + export const openFile = async (path: string) => { GlobalObjects.commands .execute('docmanager:open', { @@ -123,12 +125,14 @@ export const openFile = async (path: string) => { export const makeDir = async (path: string, name: string) => { const newPath = PathExt.join(path, name); let exists = false; - const model = new FilterFileBrowserModel({ - auto: true, - manager: GlobalObjects.docManager + const model = new FileBrowserModel({ + auto: false, + manager: GlobalObjects.docManager, + refreshInterval: 1000000 }); try { await model.cd(path); + await model.refresh(); } catch (_) { exists = false; } @@ -163,10 +167,8 @@ export const makeDir = async (path: string, name: string) => { export const makeDirs = async (path: string, names: string[]) => { let p = path; - console.log('path: ' + path); for (let i = 0; i < names.length; i++) { const n = names[i]; - console.log('try to create dir: ' + names[i]); p = await makeDir(p, n); } return p; @@ -187,7 +189,7 @@ export function getGitLog( repo: RepoType, nCommits: number ): Promise { - let url = `/lectures/${lecture.id}/assignments/${assignment.id}/log/${repo}/`; + let url = `/api/lectures/${lecture.id}/assignments/${assignment.id}/log/${repo}/`; const searchParams = new URLSearchParams({ n: String(nCommits) }); @@ -200,7 +202,18 @@ export function getRemoteStatus( assignment: Assignment, repo: RepoType, reload = false -): Promise { - const url = `/lectures/${lecture.id}/assignments/${assignment.id}/remote-status/${repo}/`; - return request(HTTPMethod.GET, url, null, reload); +): Promise { + const url = `/api/lectures/${lecture.id}/assignments/${assignment.id}/remote-status/${repo}/`; + return request(HTTPMethod.GET, url, null, reload); +} + +export function getRemoteFileStatus( + lecture: Lecture, + assignment: Assignment, + repo: RepoType, + filePath: string, + reload = false +): Promise { + const url = `/api/lectures/${lecture.id}/assignments/${assignment.id}/remote-file-status/${repo}/?file=${encodeURIComponent(filePath)}`; + return request(HTTPMethod.GET, url, null, reload); } diff --git a/src/services/grading.service.ts b/src/services/grading.service.ts index 50394e3..50db6a6 100644 --- a/src/services/grading.service.ts +++ b/src/services/grading.service.ts @@ -17,7 +17,7 @@ export function createManualFeedback( ): Promise { return request( HTTPMethod.GET, - `/lectures/${lectid}/assignments/${assignid}/grading/${subid}/manual`, + `/api/lectures/${lectid}/assignments/${assignid}/grading/${subid}/manual`, null ); } @@ -27,7 +27,7 @@ export function saveSubmissions( assignment: Assignment, filter: 'none' | 'latest' | 'best' = 'none' ): Promise { - let url = `/lectures/${lecture.id}/assignments/${assignment.id}/submissions/save`; + let url = `/api/lectures/${lecture.id}/assignments/${assignment.id}/submissions/save`; if (filter) { const searchParams = new URLSearchParams({ filter: filter @@ -44,7 +44,7 @@ export function autogradeSubmission( ): Promise { return request( HTTPMethod.GET, - `/lectures/${lecture.id}/assignments/${assignment.id}/grading/${submission.id}/auto`, + `/api/lectures/${lecture.id}/assignments/${assignment.id}/grading/${submission.id}/auto`, null ); } @@ -56,7 +56,7 @@ export function generateFeedback( ): Promise { return request( HTTPMethod.GET, - `/lectures/${lecture.id}/assignments/${assignment.id}/grading/${submission.id}/feedback`, + `/api/lectures/${lecture.id}/assignments/${assignment.id}/grading/${submission.id}/feedback`, null ); } @@ -70,7 +70,7 @@ export function getStudentSubmissions( ): Promise { return request( HTTPMethod.GET, - `/lectures/${lecture.id}/assignements/${assignment.id}/grading`, + `/api/lectures/${lecture.id}/assignements/${assignment.id}/grading`, null, reload ); @@ -83,7 +83,7 @@ export function getManualFeedback( ): Promise { return request( HTTPMethod.GET, - `/lectures/${lecture.id}/assignments/${assignment.id}/grading/${student.name}/manual`, + `/api/lectures/${lecture.id}/assignments/${assignment.id}/grading/${student.name}/manual`, null ); } @@ -96,7 +96,7 @@ export function updateManualFeedback( ): Promise { return request( HTTPMethod.PUT, - `/lectures/${lecture.id}/assignements/${assignment.id}/grading/${student.name}/manual`, + `/api/lectures/${lecture.id}/assignements/${assignment.id}/grading/${student.name}/manual`, manual ); } @@ -109,7 +109,7 @@ export function deleteManualFeedback( ): Promise { return request( HTTPMethod.DELETE, - `/lectures/${lecture.id}/assignments/${assignment.id}/grading/${student.name}/manual`, + `/api/lectures/${lecture.id}/assignments/${assignment.id}/grading/${student.name}/manual`, manual ); } @@ -121,7 +121,7 @@ export function getGrade( ): Promise { return request( HTTPMethod.GET, - `/lectures/${lecture.id}/assignments/${assignment.id}/grading/${student.name}/score`, + `/api/lectures/${lecture.id}/assignments/${assignment.id}/grading/${student.name}/score`, null ); } diff --git a/src/services/lectures.service.ts b/src/services/lectures.service.ts index 5f99f35..e97bb8c 100644 --- a/src/services/lectures.service.ts +++ b/src/services/lectures.service.ts @@ -11,7 +11,7 @@ export function getAllLectures( complete: boolean = false, reload = false ): Promise { - let url = '/lectures'; + let url = 'api/lectures'; if (complete) { const searchParams = new URLSearchParams({ complete: String(complete) @@ -24,7 +24,7 @@ export function getAllLectures( export function updateLecture(lecture: Lecture): Promise { return request( HTTPMethod.PUT, - `/lectures/${lecture.id}`, + `/api/lectures/${lecture.id}`, lecture ); } @@ -35,14 +35,14 @@ export function getLecture( ): Promise { return request( HTTPMethod.GET, - `/lectures/${lectureId}`, + `/api/lectures/${lectureId}`, null, reload ); } export function deleteLecture(lectureId: number): Promise { - return request(HTTPMethod.DELETE, `/lectures/${lectureId}`, null); + return request(HTTPMethod.DELETE, `/api/lectures/${lectureId}`, null); } export function getUsers( @@ -53,5 +53,5 @@ export function getUsers( instructors: string[]; tutors: string[]; students: string[]; - }>(HTTPMethod.GET, `/lectures/${lectureId}/users`, null, reload); + }>(HTTPMethod.GET, `/api/lectures/${lectureId}/users`, null, reload); } diff --git a/src/services/permission.service.ts b/src/services/permission.service.ts index 15731a4..67e0cc0 100644 --- a/src/services/permission.service.ts +++ b/src/services/permission.service.ts @@ -27,7 +27,7 @@ export namespace UserPermissions { permissions = {}; const response = await request<{ lecture_code: string; scope: number }[]>( HTTPMethod.GET, - '/permissions', + '/api/permissions', null ); response.forEach(role => { diff --git a/src/services/request.service.ts b/src/services/request.service.ts index f73e154..e22dd0b 100644 --- a/src/services/request.service.ts +++ b/src/services/request.service.ts @@ -6,8 +6,6 @@ import { URLExt } from '@jupyterlab/coreutils'; import { ServerConnection } from '@jupyterlab/services'; -import { from, lastValueFrom } from 'rxjs'; -import { switchMap } from 'rxjs/operators'; export enum HTTPMethod { GET = 'GET', @@ -16,6 +14,15 @@ export enum HTTPMethod { DELETE = 'DELETE' } +export class HTTPError extends Error { + statusCode: number; + constructor(statusCode: number, message: string) { + super(`${statusCode} - ${message}`); + this.statusCode = statusCode; + this.name = "HTTPError"; + } +} + export function request( method: HTTPMethod, endPoint: string, @@ -47,20 +54,36 @@ export function request( return ServerConnection.makeRequest(requestUrl, options, settings).then( async response => { + const method = options.method || 'GET'; // assuming `method` is part of options. + + // handle non-OK responses if (!response.ok) { - return response.text().then(text => { - throw new Error(JSON.parse(text)['reason']); - }); + const errorText = await response.text(); + // default error message + let errorMessage = 'Unknown error'; + + try { + const errorData = JSON.parse(errorText); + errorMessage = errorData['reason'] || errorMessage; + } catch (e) { + errorMessage = errorText; // fallback to raw error text if not JSON + } + + // throw custom HTTPError with status code and message + throw new HTTPError(response.status, errorMessage); } + let data: any = await response.text(); + // validate response body if (data.length > 0) { try { data = JSON.parse(data); } catch (error) { - console.log('Not a JSON response body.', response); + console.log('Not a JSON response body, handling as plain text.', response); } } - console.log('Request ' + method.toString() + ' URL: ' + requestUrl); + + console.log(`Request ${method} URL: ${requestUrl}`); console.log(data); return data; } diff --git a/src/services/submissions.service.ts b/src/services/submissions.service.ts index 1046e1f..71b412e 100644 --- a/src/services/submissions.service.ts +++ b/src/services/submissions.service.ts @@ -14,7 +14,7 @@ export function submitAssignment( assignment: Assignment, submit = false ) { - let url = `/lectures/${lecture.id}/assignments/${assignment.id}/push/assignment`; + let url = `/api/lectures/${lecture.id}/assignments/${assignment.id}/push/assignment`; if (submit) { const searchParams = new URLSearchParams({ submit: String(submit) @@ -31,7 +31,7 @@ export async function pullFeedback( ) { return request( HTTPMethod.GET, - `/lectures/${lecture.id}/assignments/${assignment.id}/grading/${submission.id}/pull/feedback`, + `/api/lectures/${lecture.id}/assignments/${assignment.id}/grading/${submission.id}/pull/feedback`, null ); } @@ -41,7 +41,7 @@ export async function pullSubmissionFiles( assignment: Assignment, submission: Submission ) { - let url = `/lectures/${lecture.id}/assignments/${assignment.id}/pull/edit`; + let url = `/api/lectures/${lecture.id}/assignments/${assignment.id}/pull/edit`; const searchParams = new URLSearchParams({ subid: String(submission.id) @@ -55,7 +55,7 @@ export async function createSubmissionFiles( assignment: Assignment, username: string ) { - let url = `/lectures/${lecture.id}/assignments/${assignment.id}/push/edit`; + let url = `/api/lectures/${lecture.id}/assignments/${assignment.id}/push/edit`; const searchParams = new URLSearchParams({ for_user: username }); @@ -68,7 +68,7 @@ export async function pushSubmissionFiles( assignment: Assignment, submission: Submission ) { - let url = `/lectures/${lecture.id}/assignments/${assignment.id}/push/edit`; + let url = `/api/lectures/${lecture.id}/assignments/${assignment.id}/push/edit`; const searchParams = new URLSearchParams({ subid: String(submission.id) }); @@ -82,7 +82,7 @@ export function getSubmissions( filter = 'none', reload = false ): Promise { - let url = `/lectures/${lecture.id}/assignments/${assignment.id}/submissions`; + let url = `/api/lectures/${lecture.id}/assignments/${assignment.id}/submissions`; if (filter) { const searchParams = new URLSearchParams({ filter: filter @@ -99,7 +99,7 @@ export function getAllSubmissions( instructor = true, reload = false ): Promise { - let url = `/lectures/${lectureId}/assignments/${assignmentId}/submissions`; + let url = `/api/lectures/${lectureId}/assignments/${assignmentId}/submissions`; if (filter || instructor) { const searchParams = new URLSearchParams({ @@ -111,13 +111,14 @@ export function getAllSubmissions( return request(HTTPMethod.GET, url, null, reload); } + export function getFeedback( lecture: Lecture, assignment: Assignment, latest = false, instructor = false ): Promise { - let url = `/lectures/${lecture.id}/assignments/${assignment.id}/feedback`; + let url = `/api/lectures/${lecture.id}/assignments/${assignment.id}/feedback`; if (latest || instructor) { const searchParams = new URLSearchParams({ 'instructor-version': String(instructor), @@ -134,7 +135,7 @@ export function getProperties( submissionId: number, reload = false ): Promise { - const url = `/lectures/${lectureId}/assignments/${assignmentId}/submissions/${submissionId}/properties`; + const url = `/api/lectures/${lectureId}/assignments/${assignmentId}/submissions/${submissionId}/properties`; return request(HTTPMethod.GET, url, null, reload); } @@ -144,7 +145,7 @@ export function getLogs( submissionId: number, reload = false ): Promise { - const url = `/lectures/${lectureId}/assignments/${assignmentId}/submissions/${submissionId}/logs`; + const url = `/api/lectures/${lectureId}/assignments/${assignmentId}/submissions/${submissionId}/logs`; return request(HTTPMethod.GET, url, null, reload); } @@ -153,7 +154,7 @@ export function createOrOverrideEditRepository( assignmentId: number, submissionId: number ): Promise { - const url = `/lectures/${lectureId}/assignments/${assignmentId}/submissions/${submissionId}/edit`; + const url = `/api/lectures/${lectureId}/assignments/${assignmentId}/submissions/${submissionId}/edit`; return request(HTTPMethod.PUT, url, {}); } @@ -163,7 +164,7 @@ export function updateProperties( submissionId: number, properties: any ): Promise { - const url = `/lectures/${lectureId}/assignments/${assignmentId}/submissions/${submissionId}/properties`; + const url = `/api/lectures/${lectureId}/assignments/${assignmentId}/submissions/${submissionId}/properties`; return request(HTTPMethod.PUT, url, properties); } @@ -173,7 +174,7 @@ export function getSubmission( submissionId: number, reload: boolean = false ): Promise { - const url = `/lectures/${lectureId}/assignments/${assignmentId}/submissions/${submissionId}`; + const url = `/api/lectures/${lectureId}/assignments/${assignmentId}/submissions/${submissionId}`; return request(HTTPMethod.GET, url, null, reload); } @@ -183,7 +184,7 @@ export function updateSubmission( submissionId: number, sub: Submission ): Promise { - const url = `/lectures/${lectureId}/assignments/${assignmentId}/submissions/${submissionId}`; + const url = `/api/lectures/${lectureId}/assignments/${assignmentId}/submissions/${submissionId}`; return request(HTTPMethod.PUT, url, sub); } @@ -191,10 +192,42 @@ export function ltiSyncSubmissions( lectureId: number, assignmentId: number ): Promise<{ syncable_users: number; synced_user: number }> { - const url = `/lectures/${lectureId}/assignments/${assignmentId}/submissions/lti`; + const url = `/api/lectures/${lectureId}/assignments/${assignmentId}/submissions/lti`; return request<{ syncable_users: number; synced_user: number }>( HTTPMethod.PUT, url, null ); } + +export function restoreSubmission( + lectureId: number, + assignmentId: number, + commitHash: string +): Promise { + return request( + HTTPMethod.GET, + `/api/lectures/${lectureId}/assignments/${assignmentId}/restore/${commitHash}`, + null + ); +} + +export function deleteSubmission( + lectureId: number, + assignmentId: number, + submissionId: number +): Promise { + return request( + HTTPMethod.DELETE, + `/api/lectures/${lectureId}/assignments/${assignmentId}/submissions/${submissionId}`, + null + ); +} + +export async function getSubmissionCount( + lectureId: number, + assignmentId: number +): Promise<{ submission_count: number }> { + const url = `/api/lectures/${lectureId}/assignments/${assignmentId}/submissions/count`; + return request<{ submission_count: number }>(HTTPMethod.GET, url, null, false); +} \ No newline at end of file diff --git a/src/widgets/assignmentmanage.tsx b/src/widgets/assignmentmanage.tsx index 59e6b45..7537181 100644 --- a/src/widgets/assignmentmanage.tsx +++ b/src/widgets/assignmentmanage.tsx @@ -9,13 +9,23 @@ import { ReactWidget } from '@jupyterlab/apputils'; import { closeSnackbar, SnackbarProvider } from 'notistack'; import { createMemoryRouter, RouterProvider } from 'react-router-dom'; import { getRoutes } from '../components/assignment/routes'; -import { loadString } from '../services/storage.service'; import { Router } from '@remix-run/router'; import { DialogProvider } from '../components/util/dialog-provider'; import { Button } from '@mui/material'; import { GlobalObjects } from '../index'; import { createTheme, ThemeProvider } from '@mui/material/styles'; import CssBaseline from '@mui/material/CssBaseline'; +import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; +import { ReactQueryDevtools } from '@tanstack/react-query-devtools' + +export const queryClient = new QueryClient({ + defaultOptions: { + queries: { + staleTime: 10 * 60 * 1000, // 10 mins + cacheTime: 15 * 60 * 1000, // 15 mins + } as any, + }, +}); export class AssignmentManageView extends ReactWidget { /** @@ -28,7 +38,7 @@ export class AssignmentManageView extends ReactWidget { super(); this.id = options.id || 'assignment-view'; this.addClass('GradingWidget'); - this.router = createMemoryRouter(getRoutes(), { initialEntries: ['/'] }); + this.router = createMemoryRouter(getRoutes(queryClient), { initialEntries: ['/'] }); const themeManager = GlobalObjects.themeManager; this.theme = themeManager.isLight(themeManager.theme) ? 'light' : 'dark'; @@ -40,28 +50,31 @@ export class AssignmentManageView extends ReactWidget { render() { return ( - - - ( - - )} - > - - - - - + + {/* */} + + + ( + + )} + > + + + + + + ); } } diff --git a/src/widgets/coursemanage.tsx b/src/widgets/coursemanage.tsx index 0c390b7..54df414 100644 --- a/src/widgets/coursemanage.tsx +++ b/src/widgets/coursemanage.tsx @@ -10,12 +10,15 @@ import { closeSnackbar, SnackbarProvider } from 'notistack'; import { createMemoryRouter, RouterProvider } from 'react-router-dom'; import { getRoutes } from '../components/coursemanage/routes'; import { Button } from '@mui/material'; -import { loadString } from '../services/storage.service'; import { Router } from '@remix-run/router'; import { DialogProvider } from '../components/util/dialog-provider'; import { GlobalObjects } from '../index'; import { createTheme, ThemeProvider } from '@mui/material/styles'; import CssBaseline from '@mui/material/CssBaseline'; +import { QueryClientProvider } from '@tanstack/react-query'; +import { queryClient } from './assignmentmanage'; +import { ReactQueryDevtools } from '@tanstack/react-query-devtools'; + export class CourseManageView extends ReactWidget { /** @@ -40,28 +43,31 @@ export class CourseManageView extends ReactWidget { render() { return ( - - - ( - - )} - > - - - - - + + {/* */} + + + ( + + )} + > + + + + + + ); } } diff --git a/ui-tests/README.md b/ui-tests/README.md index 8d377fc..9182514 100644 --- a/ui-tests/README.md +++ b/ui-tests/README.md @@ -12,7 +12,7 @@ in [jupyter_server_test_config.py](./jupyter_server_test_config.py). The default configuration will produce video for failing tests and an HTML report. -> There is a new experimental UI mode that you may fall in love with; see [that video](https://www.youtube.com/watch?v=jF0yA-JLQW0). +> There is a UI mode that you may like; see [that video](https://www.youtube.com/watch?v=jF0yA-JLQW0). ## Run the tests diff --git a/yarn.lock b/yarn.lock index 909dc96..16476cf 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5,141 +5,135 @@ __metadata: version: 6 cacheKey: 8 -"@aashutoshrathi/word-wrap@npm:^1.2.3": - version: 1.2.6 - resolution: "@aashutoshrathi/word-wrap@npm:1.2.6" - checksum: ada901b9e7c680d190f1d012c84217ce0063d8f5c5a7725bb91ec3c5ed99bb7572680eb2d2938a531ccbaec39a95422fcd8a6b4a13110c7d98dd75402f66a0cd - languageName: node - linkType: hard - "@ampproject/remapping@npm:^2.2.0": - version: 2.2.1 - resolution: "@ampproject/remapping@npm:2.2.1" + version: 2.3.0 + resolution: "@ampproject/remapping@npm:2.3.0" dependencies: - "@jridgewell/gen-mapping": ^0.3.0 - "@jridgewell/trace-mapping": ^0.3.9 - checksum: 03c04fd526acc64a1f4df22651186f3e5ef0a9d6d6530ce4482ec9841269cf7a11dbb8af79237c282d721c5312024ff17529cd72cc4768c11e999b58e2302079 + "@jridgewell/gen-mapping": ^0.3.5 + "@jridgewell/trace-mapping": ^0.3.24 + checksum: d3ad7b89d973df059c4e8e6d7c972cbeb1bb2f18f002a3bd04ae0707da214cb06cc06929b65aa2313b9347463df2914772298bae8b1d7973f246bb3f2ab3e8f0 languageName: node linkType: hard -"@babel/code-frame@npm:^7.0.0, @babel/code-frame@npm:^7.12.13, @babel/code-frame@npm:^7.22.13, @babel/code-frame@npm:^7.23.5": - version: 7.23.5 - resolution: "@babel/code-frame@npm:7.23.5" +"@babel/code-frame@npm:^7.0.0, @babel/code-frame@npm:^7.12.13, @babel/code-frame@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/code-frame@npm:7.24.7" dependencies: - "@babel/highlight": ^7.23.4 - chalk: ^2.4.2 - checksum: d90981fdf56a2824a9b14d19a4c0e8db93633fd488c772624b4e83e0ceac6039a27cd298a247c3214faa952bf803ba23696172ae7e7235f3b97f43ba278c569a + "@babel/highlight": ^7.24.7 + picocolors: ^1.0.0 + checksum: 830e62cd38775fdf84d612544251ce773d544a8e63df667728cc9e0126eeef14c6ebda79be0f0bc307e8318316b7f58c27ce86702e0a1f5c321d842eb38ffda4 languageName: node linkType: hard -"@babel/compat-data@npm:^7.22.6, @babel/compat-data@npm:^7.23.3, @babel/compat-data@npm:^7.23.5": - version: 7.23.5 - resolution: "@babel/compat-data@npm:7.23.5" - checksum: 06ce244cda5763295a0ea924728c09bae57d35713b675175227278896946f922a63edf803c322f855a3878323d48d0255a2a3023409d2a123483c8a69ebb4744 +"@babel/compat-data@npm:^7.22.6, @babel/compat-data@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/compat-data@npm:7.24.7" + checksum: 1fc276825dd434fe044877367dfac84171328e75a8483a6976aa28bf833b32367e90ee6df25bdd97c287d1aa8019757adcccac9153de70b1932c0d243a978ae9 languageName: node linkType: hard -"@babel/core@npm:^7.10.2, @babel/core@npm:^7.11.6, @babel/core@npm:^7.12.3": - version: 7.23.7 - resolution: "@babel/core@npm:7.23.7" +"@babel/core@npm:^7.10.2, @babel/core@npm:^7.11.6, @babel/core@npm:^7.12.3, @babel/core@npm:^7.23.9": + version: 7.24.7 + resolution: "@babel/core@npm:7.24.7" dependencies: "@ampproject/remapping": ^2.2.0 - "@babel/code-frame": ^7.23.5 - "@babel/generator": ^7.23.6 - "@babel/helper-compilation-targets": ^7.23.6 - "@babel/helper-module-transforms": ^7.23.3 - "@babel/helpers": ^7.23.7 - "@babel/parser": ^7.23.6 - "@babel/template": ^7.22.15 - "@babel/traverse": ^7.23.7 - "@babel/types": ^7.23.6 + "@babel/code-frame": ^7.24.7 + "@babel/generator": ^7.24.7 + "@babel/helper-compilation-targets": ^7.24.7 + "@babel/helper-module-transforms": ^7.24.7 + "@babel/helpers": ^7.24.7 + "@babel/parser": ^7.24.7 + "@babel/template": ^7.24.7 + "@babel/traverse": ^7.24.7 + "@babel/types": ^7.24.7 convert-source-map: ^2.0.0 debug: ^4.1.0 gensync: ^1.0.0-beta.2 json5: ^2.2.3 semver: ^6.3.1 - checksum: 32d5bf73372a47429afaae9adb0af39e47bcea6a831c4b5dcbb4791380cda6949cb8cb1a2fea8b60bb1ebe189209c80e333903df1fa8e9dcb04798c0ce5bf59e + checksum: 017497e2a1b4683a885219eef7d2aee83c1c0cf353506b2e180b73540ec28841d8ef1ea1837fa69f8c561574b24ddd72f04764b27b87afedfe0a07299ccef24d languageName: node linkType: hard -"@babel/generator@npm:^7.23.6, @babel/generator@npm:^7.7.2": - version: 7.23.6 - resolution: "@babel/generator@npm:7.23.6" +"@babel/generator@npm:^7.24.7, @babel/generator@npm:^7.7.2": + version: 7.24.7 + resolution: "@babel/generator@npm:7.24.7" dependencies: - "@babel/types": ^7.23.6 - "@jridgewell/gen-mapping": ^0.3.2 - "@jridgewell/trace-mapping": ^0.3.17 + "@babel/types": ^7.24.7 + "@jridgewell/gen-mapping": ^0.3.5 + "@jridgewell/trace-mapping": ^0.3.25 jsesc: ^2.5.1 - checksum: 1a1a1c4eac210f174cd108d479464d053930a812798e09fee069377de39a893422df5b5b146199ead7239ae6d3a04697b45fc9ac6e38e0f6b76374390f91fc6c + checksum: 0ff31a73b15429f1287e4d57b439bba4a266f8c673bb445fe313b82f6d110f586776997eb723a777cd7adad9d340edd162aea4973a90112c5d0cfcaf6686844b languageName: node linkType: hard -"@babel/helper-annotate-as-pure@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/helper-annotate-as-pure@npm:7.22.5" +"@babel/helper-annotate-as-pure@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/helper-annotate-as-pure@npm:7.24.7" dependencies: - "@babel/types": ^7.22.5 - checksum: 53da330f1835c46f26b7bf4da31f7a496dee9fd8696cca12366b94ba19d97421ce519a74a837f687749318f94d1a37f8d1abcbf35e8ed22c32d16373b2f6198d + "@babel/types": ^7.24.7 + checksum: 6178566099a6a0657db7a7fa601a54fb4731ca0b8614fbdccfd8e523c210c13963649bc8fdfd53ce7dd14d05e3dda2fb22dea5b30113c488b9eb1a906d60212e languageName: node linkType: hard -"@babel/helper-builder-binary-assignment-operator-visitor@npm:^7.22.15": - version: 7.22.15 - resolution: "@babel/helper-builder-binary-assignment-operator-visitor@npm:7.22.15" +"@babel/helper-builder-binary-assignment-operator-visitor@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/helper-builder-binary-assignment-operator-visitor@npm:7.24.7" dependencies: - "@babel/types": ^7.22.15 - checksum: 639c697a1c729f9fafa2dd4c9af2e18568190299b5907bd4c2d0bc818fcbd1e83ffeecc2af24327a7faa7ac4c34edd9d7940510a5e66296c19bad17001cf5c7a + "@babel/traverse": ^7.24.7 + "@babel/types": ^7.24.7 + checksum: 71a6158a9fdebffb82fdc400d5555ba8f2e370cea81a0d578155877bdc4db7d5252b75c43b2fdf3f72b3f68348891f99bd35ae315542daad1b7ace8322b1abcb languageName: node linkType: hard -"@babel/helper-compilation-targets@npm:^7.22.15, @babel/helper-compilation-targets@npm:^7.22.6, @babel/helper-compilation-targets@npm:^7.23.6": - version: 7.23.6 - resolution: "@babel/helper-compilation-targets@npm:7.23.6" +"@babel/helper-compilation-targets@npm:^7.22.6, @babel/helper-compilation-targets@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/helper-compilation-targets@npm:7.24.7" dependencies: - "@babel/compat-data": ^7.23.5 - "@babel/helper-validator-option": ^7.23.5 + "@babel/compat-data": ^7.24.7 + "@babel/helper-validator-option": ^7.24.7 browserslist: ^4.22.2 lru-cache: ^5.1.1 semver: ^6.3.1 - checksum: c630b98d4527ac8fe2c58d9a06e785dfb2b73ec71b7c4f2ddf90f814b5f75b547f3c015f110a010fd31f76e3864daaf09f3adcd2f6acdbfb18a8de3a48717590 + checksum: dfc88bc35e223ade796c7267901728217c665adc5bc2e158f7b0ae850de14f1b7941bec4fe5950ae46236023cfbdeddd9c747c276acf9b39ca31f8dd97dc6cc6 languageName: node linkType: hard -"@babel/helper-create-class-features-plugin@npm:^7.22.15": - version: 7.23.7 - resolution: "@babel/helper-create-class-features-plugin@npm:7.23.7" +"@babel/helper-create-class-features-plugin@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/helper-create-class-features-plugin@npm:7.24.7" dependencies: - "@babel/helper-annotate-as-pure": ^7.22.5 - "@babel/helper-environment-visitor": ^7.22.20 - "@babel/helper-function-name": ^7.23.0 - "@babel/helper-member-expression-to-functions": ^7.23.0 - "@babel/helper-optimise-call-expression": ^7.22.5 - "@babel/helper-replace-supers": ^7.22.20 - "@babel/helper-skip-transparent-expression-wrappers": ^7.22.5 - "@babel/helper-split-export-declaration": ^7.22.6 + "@babel/helper-annotate-as-pure": ^7.24.7 + "@babel/helper-environment-visitor": ^7.24.7 + "@babel/helper-function-name": ^7.24.7 + "@babel/helper-member-expression-to-functions": ^7.24.7 + "@babel/helper-optimise-call-expression": ^7.24.7 + "@babel/helper-replace-supers": ^7.24.7 + "@babel/helper-skip-transparent-expression-wrappers": ^7.24.7 + "@babel/helper-split-export-declaration": ^7.24.7 semver: ^6.3.1 peerDependencies: "@babel/core": ^7.0.0 - checksum: 33e60714b856c3816a7965d4c76278cc8f430644a2dfc4eeafad2f7167c4fbd2becdb74cbfeb04b02efd6bbd07176ef53c6683262b588e65d378438e9c55c26b + checksum: 371a181a1717a9b0cebc97727c8ea9ca6afa34029476a684b6030f9d1ad94dcdafd7de175da10b63ae3ba79e4e82404db8ed968ebf264b768f097e5d64faab71 languageName: node linkType: hard -"@babel/helper-create-regexp-features-plugin@npm:^7.18.6, @babel/helper-create-regexp-features-plugin@npm:^7.22.15, @babel/helper-create-regexp-features-plugin@npm:^7.22.5": - version: 7.22.15 - resolution: "@babel/helper-create-regexp-features-plugin@npm:7.22.15" +"@babel/helper-create-regexp-features-plugin@npm:^7.18.6, @babel/helper-create-regexp-features-plugin@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/helper-create-regexp-features-plugin@npm:7.24.7" dependencies: - "@babel/helper-annotate-as-pure": ^7.22.5 + "@babel/helper-annotate-as-pure": ^7.24.7 regexpu-core: ^5.3.1 semver: ^6.3.1 peerDependencies: "@babel/core": ^7.0.0 - checksum: 0243b8d4854f1dc8861b1029a46d3f6393ad72f366a5a08e36a4648aa682044f06da4c6e87a456260e1e1b33c999f898ba591a0760842c1387bcc93fbf2151a6 + checksum: 17c59fa222af50f643946eca940ce1d474ff2da1f4afed2312687ab9d708ebbb8c9372754ddbdf44b6e21ead88b8fc144644f3a7b63ccb886de002458cef3974 languageName: node linkType: hard -"@babel/helper-define-polyfill-provider@npm:^0.4.4": - version: 0.4.4 - resolution: "@babel/helper-define-polyfill-provider@npm:0.4.4" +"@babel/helper-define-polyfill-provider@npm:^0.6.1, @babel/helper-define-polyfill-provider@npm:^0.6.2": + version: 0.6.2 + resolution: "@babel/helper-define-polyfill-provider@npm:0.6.2" dependencies: "@babel/helper-compilation-targets": ^7.22.6 "@babel/helper-plugin-utils": ^7.22.5 @@ -148,234 +142,253 @@ __metadata: resolve: ^1.14.2 peerDependencies: "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 - checksum: 2453cdd79f18a4cb8653d8a7e06b2eb0d8e31bae0d35070fc5abadbddca246a36d82b758064b421cca49b48d0e696d331d54520ba8582c1d61fb706d6d831817 + checksum: 2bba965ea9a4887ddf9c11d51d740ab473bd7597b787d042c325f6a45912dfe908c2d6bb1d837bf82f7e9fa51e6ad5150563c58131d2bb85515e63d971414a9c languageName: node linkType: hard -"@babel/helper-environment-visitor@npm:^7.22.20": - version: 7.22.20 - resolution: "@babel/helper-environment-visitor@npm:7.22.20" - checksum: d80ee98ff66f41e233f36ca1921774c37e88a803b2f7dca3db7c057a5fea0473804db9fb6729e5dbfd07f4bed722d60f7852035c2c739382e84c335661590b69 +"@babel/helper-environment-visitor@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/helper-environment-visitor@npm:7.24.7" + dependencies: + "@babel/types": ^7.24.7 + checksum: 079d86e65701b29ebc10baf6ed548d17c19b808a07aa6885cc141b690a78581b180ee92b580d755361dc3b16adf975b2d2058b8ce6c86675fcaf43cf22f2f7c6 languageName: node linkType: hard -"@babel/helper-function-name@npm:^7.22.5, @babel/helper-function-name@npm:^7.23.0": - version: 7.23.0 - resolution: "@babel/helper-function-name@npm:7.23.0" +"@babel/helper-function-name@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/helper-function-name@npm:7.24.7" dependencies: - "@babel/template": ^7.22.15 - "@babel/types": ^7.23.0 - checksum: e44542257b2d4634a1f979244eb2a4ad8e6d75eb6761b4cfceb56b562f7db150d134bc538c8e6adca3783e3bc31be949071527aa8e3aab7867d1ad2d84a26e10 + "@babel/template": ^7.24.7 + "@babel/types": ^7.24.7 + checksum: 142ee08922074dfdc0ff358e09ef9f07adf3671ab6eef4fca74dcf7a551f1a43717e7efa358c9e28d7eea84c28d7f177b7a58c70452fc312ae3b1893c5dab2a4 languageName: node linkType: hard -"@babel/helper-hoist-variables@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/helper-hoist-variables@npm:7.22.5" +"@babel/helper-hoist-variables@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/helper-hoist-variables@npm:7.24.7" dependencies: - "@babel/types": ^7.22.5 - checksum: 394ca191b4ac908a76e7c50ab52102669efe3a1c277033e49467913c7ed6f7c64d7eacbeabf3bed39ea1f41731e22993f763b1edce0f74ff8563fd1f380d92cc + "@babel/types": ^7.24.7 + checksum: 6cfdcf2289cd12185dcdbdf2435fa8d3447b797ac75851166de9fc8503e2fd0021db6baf8dfbecad3753e582c08e6a3f805c8d00cbed756060a877d705bd8d8d languageName: node linkType: hard -"@babel/helper-member-expression-to-functions@npm:^7.22.15, @babel/helper-member-expression-to-functions@npm:^7.23.0": - version: 7.23.0 - resolution: "@babel/helper-member-expression-to-functions@npm:7.23.0" +"@babel/helper-member-expression-to-functions@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/helper-member-expression-to-functions@npm:7.24.7" dependencies: - "@babel/types": ^7.23.0 - checksum: 494659361370c979ada711ca685e2efe9460683c36db1b283b446122596602c901e291e09f2f980ecedfe6e0f2bd5386cb59768285446530df10c14df1024e75 + "@babel/traverse": ^7.24.7 + "@babel/types": ^7.24.7 + checksum: 9fecf412f85fa23b7cf55d19eb69de39f8240426a028b141c9df2aed8cfedf20b3ec3318d40312eb7a3dec9eea792828ce0d590e0ff62da3da532482f537192c languageName: node linkType: hard -"@babel/helper-module-imports@npm:^7.16.7, @babel/helper-module-imports@npm:^7.22.15": - version: 7.22.15 - resolution: "@babel/helper-module-imports@npm:7.22.15" +"@babel/helper-module-imports@npm:^7.16.7, @babel/helper-module-imports@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/helper-module-imports@npm:7.24.7" dependencies: - "@babel/types": ^7.22.15 - checksum: ecd7e457df0a46f889228f943ef9b4a47d485d82e030676767e6a2fdcbdaa63594d8124d4b55fd160b41c201025aec01fc27580352b1c87a37c9c6f33d116702 + "@babel/traverse": ^7.24.7 + "@babel/types": ^7.24.7 + checksum: 8ac15d96d262b8940bc469052a048e06430bba1296369be695fabdf6799f201dd0b00151762b56012a218464e706bc033f27c07f6cec20c6f8f5fd6543c67054 languageName: node linkType: hard -"@babel/helper-module-transforms@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/helper-module-transforms@npm:7.23.3" +"@babel/helper-module-transforms@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/helper-module-transforms@npm:7.24.7" dependencies: - "@babel/helper-environment-visitor": ^7.22.20 - "@babel/helper-module-imports": ^7.22.15 - "@babel/helper-simple-access": ^7.22.5 - "@babel/helper-split-export-declaration": ^7.22.6 - "@babel/helper-validator-identifier": ^7.22.20 + "@babel/helper-environment-visitor": ^7.24.7 + "@babel/helper-module-imports": ^7.24.7 + "@babel/helper-simple-access": ^7.24.7 + "@babel/helper-split-export-declaration": ^7.24.7 + "@babel/helper-validator-identifier": ^7.24.7 peerDependencies: "@babel/core": ^7.0.0 - checksum: 5d0895cfba0e16ae16f3aa92fee108517023ad89a855289c4eb1d46f7aef4519adf8e6f971e1d55ac20c5461610e17213f1144097a8f932e768a9132e2278d71 + checksum: ddff3b41c2667876b4e4e73d961168f48a5ec9560c95c8c2d109e6221f9ca36c6f90c6317eb7a47f2a3c99419c356e529a86b79174cad0d4f7a61960866b88ca languageName: node linkType: hard -"@babel/helper-optimise-call-expression@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/helper-optimise-call-expression@npm:7.22.5" +"@babel/helper-optimise-call-expression@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/helper-optimise-call-expression@npm:7.24.7" dependencies: - "@babel/types": ^7.22.5 - checksum: c70ef6cc6b6ed32eeeec4482127e8be5451d0e5282d5495d5d569d39eb04d7f1d66ec99b327f45d1d5842a9ad8c22d48567e93fc502003a47de78d122e355f7c + "@babel/types": ^7.24.7 + checksum: 280654eaf90e92bf383d7eed49019573fb35a98c9e992668f701ad099957246721044be2068cf6840cb2299e0ad393705a1981c88c23a1048096a8d59e5f79a3 languageName: node linkType: hard -"@babel/helper-plugin-utils@npm:^7.0.0, @babel/helper-plugin-utils@npm:^7.10.4, @babel/helper-plugin-utils@npm:^7.12.13, @babel/helper-plugin-utils@npm:^7.14.5, @babel/helper-plugin-utils@npm:^7.18.6, @babel/helper-plugin-utils@npm:^7.22.5, @babel/helper-plugin-utils@npm:^7.8.0, @babel/helper-plugin-utils@npm:^7.8.3": - version: 7.22.5 - resolution: "@babel/helper-plugin-utils@npm:7.22.5" - checksum: c0fc7227076b6041acd2f0e818145d2e8c41968cc52fb5ca70eed48e21b8fe6dd88a0a91cbddf4951e33647336eb5ae184747ca706817ca3bef5e9e905151ff5 +"@babel/helper-plugin-utils@npm:^7.0.0, @babel/helper-plugin-utils@npm:^7.10.4, @babel/helper-plugin-utils@npm:^7.12.13, @babel/helper-plugin-utils@npm:^7.14.5, @babel/helper-plugin-utils@npm:^7.18.6, @babel/helper-plugin-utils@npm:^7.22.5, @babel/helper-plugin-utils@npm:^7.24.7, @babel/helper-plugin-utils@npm:^7.8.0, @babel/helper-plugin-utils@npm:^7.8.3": + version: 7.24.7 + resolution: "@babel/helper-plugin-utils@npm:7.24.7" + checksum: 81f2a15751d892e4a8fce25390f973363a5b27596167861d2d6eab0f61856eb2ba389b031a9f19f669c0bd4dd601185828d3cebafd25431be7a1696f2ce3ef68 languageName: node linkType: hard -"@babel/helper-remap-async-to-generator@npm:^7.22.20": - version: 7.22.20 - resolution: "@babel/helper-remap-async-to-generator@npm:7.22.20" +"@babel/helper-remap-async-to-generator@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/helper-remap-async-to-generator@npm:7.24.7" dependencies: - "@babel/helper-annotate-as-pure": ^7.22.5 - "@babel/helper-environment-visitor": ^7.22.20 - "@babel/helper-wrap-function": ^7.22.20 + "@babel/helper-annotate-as-pure": ^7.24.7 + "@babel/helper-environment-visitor": ^7.24.7 + "@babel/helper-wrap-function": ^7.24.7 peerDependencies: "@babel/core": ^7.0.0 - checksum: 2fe6300a6f1b58211dffa0aed1b45d4958506d096543663dba83bd9251fe8d670fa909143a65b45e72acb49e7e20fbdb73eae315d9ddaced467948c3329986e7 + checksum: bab7be178f875350f22a2cb9248f67fe3a8a8128db77a25607096ca7599fd972bc7049fb11ed9e95b45a3f1dd1fac3846a3279f9cbac16f337ecb0e6ca76e1fc languageName: node linkType: hard -"@babel/helper-replace-supers@npm:^7.22.20": - version: 7.22.20 - resolution: "@babel/helper-replace-supers@npm:7.22.20" +"@babel/helper-replace-supers@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/helper-replace-supers@npm:7.24.7" dependencies: - "@babel/helper-environment-visitor": ^7.22.20 - "@babel/helper-member-expression-to-functions": ^7.22.15 - "@babel/helper-optimise-call-expression": ^7.22.5 + "@babel/helper-environment-visitor": ^7.24.7 + "@babel/helper-member-expression-to-functions": ^7.24.7 + "@babel/helper-optimise-call-expression": ^7.24.7 peerDependencies: "@babel/core": ^7.0.0 - checksum: a0008332e24daedea2e9498733e3c39b389d6d4512637e000f96f62b797e702ee24a407ccbcd7a236a551590a38f31282829a8ef35c50a3c0457d88218cae639 + checksum: 2bf0d113355c60d86a04e930812d36f5691f26c82d4ec1739e5ec0a4c982c9113dad3167f7c74f888a96328bd5e696372232406d8200e5979e6e0dc2af5e7c76 languageName: node linkType: hard -"@babel/helper-simple-access@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/helper-simple-access@npm:7.22.5" +"@babel/helper-simple-access@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/helper-simple-access@npm:7.24.7" dependencies: - "@babel/types": ^7.22.5 - checksum: fe9686714caf7d70aedb46c3cce090f8b915b206e09225f1e4dbc416786c2fdbbee40b38b23c268b7ccef749dd2db35f255338fb4f2444429874d900dede5ad2 + "@babel/traverse": ^7.24.7 + "@babel/types": ^7.24.7 + checksum: ddbf55f9dea1900213f2a1a8500fabfd21c5a20f44dcfa957e4b0d8638c730f88751c77f678644f754f1a1dc73f4eb8b766c300deb45a9daad000e4247957819 languageName: node linkType: hard -"@babel/helper-skip-transparent-expression-wrappers@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/helper-skip-transparent-expression-wrappers@npm:7.22.5" +"@babel/helper-skip-transparent-expression-wrappers@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/helper-skip-transparent-expression-wrappers@npm:7.24.7" dependencies: - "@babel/types": ^7.22.5 - checksum: 1012ef2295eb12dc073f2b9edf3425661e9b8432a3387e62a8bc27c42963f1f216ab3124228015c748770b2257b4f1fda882ca8fa34c0bf485e929ae5bc45244 + "@babel/traverse": ^7.24.7 + "@babel/types": ^7.24.7 + checksum: 11b28fe534ce2b1a67c4d8e51a7b5711a2a0a0cae802f74614eee54cca58c744d9a62f6f60103c41759e81c537d270bfd665bf368a6bea214c6052f2094f8407 languageName: node linkType: hard -"@babel/helper-split-export-declaration@npm:^7.22.6": - version: 7.22.6 - resolution: "@babel/helper-split-export-declaration@npm:7.22.6" +"@babel/helper-split-export-declaration@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/helper-split-export-declaration@npm:7.24.7" dependencies: - "@babel/types": ^7.22.5 - checksum: e141cace583b19d9195f9c2b8e17a3ae913b7ee9b8120246d0f9ca349ca6f03cb2c001fd5ec57488c544347c0bb584afec66c936511e447fd20a360e591ac921 + "@babel/types": ^7.24.7 + checksum: e3ddc91273e5da67c6953f4aa34154d005a00791dc7afa6f41894e768748540f6ebcac5d16e72541aea0c89bee4b89b4da6a3d65972a0ea8bfd2352eda5b7e22 languageName: node linkType: hard -"@babel/helper-string-parser@npm:^7.23.4": - version: 7.23.4 - resolution: "@babel/helper-string-parser@npm:7.23.4" - checksum: c0641144cf1a7e7dc93f3d5f16d5327465b6cf5d036b48be61ecba41e1eece161b48f46b7f960951b67f8c3533ce506b16dece576baef4d8b3b49f8c65410f90 +"@babel/helper-string-parser@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/helper-string-parser@npm:7.24.7" + checksum: 09568193044a578743dd44bf7397940c27ea693f9812d24acb700890636b376847a611cdd0393a928544e79d7ad5b8b916bd8e6e772bc8a10c48a647a96e7b1a languageName: node linkType: hard -"@babel/helper-validator-identifier@npm:^7.22.20": - version: 7.22.20 - resolution: "@babel/helper-validator-identifier@npm:7.22.20" - checksum: 136412784d9428266bcdd4d91c32bcf9ff0e8d25534a9d94b044f77fe76bc50f941a90319b05aafd1ec04f7d127cd57a179a3716009ff7f3412ef835ada95bdc +"@babel/helper-validator-identifier@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/helper-validator-identifier@npm:7.24.7" + checksum: 6799ab117cefc0ecd35cd0b40ead320c621a298ecac88686a14cffceaac89d80cdb3c178f969861bf5fa5e4f766648f9161ea0752ecfe080d8e89e3147270257 languageName: node linkType: hard -"@babel/helper-validator-option@npm:^7.23.5": - version: 7.23.5 - resolution: "@babel/helper-validator-option@npm:7.23.5" - checksum: 537cde2330a8aede223552510e8a13e9c1c8798afee3757995a7d4acae564124fe2bf7e7c3d90d62d3657434a74340a274b3b3b1c6f17e9a2be1f48af29cb09e +"@babel/helper-validator-option@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/helper-validator-option@npm:7.24.7" + checksum: 9689166bf3f777dd424c026841c8cd651e41b21242dbfd4569a53086179a3e744c8eddd56e9d10b54142270141c91581b53af0d7c00c82d552d2540e2a919f7e languageName: node linkType: hard -"@babel/helper-wrap-function@npm:^7.22.20": - version: 7.22.20 - resolution: "@babel/helper-wrap-function@npm:7.22.20" +"@babel/helper-wrap-function@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/helper-wrap-function@npm:7.24.7" dependencies: - "@babel/helper-function-name": ^7.22.5 - "@babel/template": ^7.22.15 - "@babel/types": ^7.22.19 - checksum: 221ed9b5572612aeb571e4ce6a256f2dee85b3c9536f1dd5e611b0255e5f59a3d0ec392d8d46d4152149156a8109f92f20379b1d6d36abb613176e0e33f05fca + "@babel/helper-function-name": ^7.24.7 + "@babel/template": ^7.24.7 + "@babel/traverse": ^7.24.7 + "@babel/types": ^7.24.7 + checksum: 085bf130ed08670336e3976f5841ae44e3e10001131632e22ef234659341978d2fd37e65785f59b6cb1745481347fc3bce84b33a685cacb0a297afbe1d2b03af languageName: node linkType: hard -"@babel/helpers@npm:^7.23.7": - version: 7.23.8 - resolution: "@babel/helpers@npm:7.23.8" +"@babel/helpers@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/helpers@npm:7.24.7" dependencies: - "@babel/template": ^7.22.15 - "@babel/traverse": ^7.23.7 - "@babel/types": ^7.23.6 - checksum: 8b522d527921f8df45a983dc7b8e790c021250addf81ba7900ba016e165442a527348f6f877aa55e1debb3eef9e860a334b4e8d834e6c9b438ed61a63d9a7ad4 + "@babel/template": ^7.24.7 + "@babel/types": ^7.24.7 + checksum: 934da58098a3670ca7f9f42425b9c44d0ca4f8fad815c0f51d89fc7b64c5e0b4c7d5fec038599de691229ada737edeaf72fad3eba8e16dd5842e8ea447f76b66 languageName: node linkType: hard -"@babel/highlight@npm:^7.23.4": - version: 7.23.4 - resolution: "@babel/highlight@npm:7.23.4" +"@babel/highlight@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/highlight@npm:7.24.7" dependencies: - "@babel/helper-validator-identifier": ^7.22.20 + "@babel/helper-validator-identifier": ^7.24.7 chalk: ^2.4.2 js-tokens: ^4.0.0 - checksum: 643acecdc235f87d925979a979b539a5d7d1f31ae7db8d89047269082694122d11aa85351304c9c978ceeb6d250591ccadb06c366f358ccee08bb9c122476b89 + picocolors: ^1.0.0 + checksum: 5cd3a89f143671c4ac129960024ba678b669e6fc673ce078030f5175002d1d3d52bc10b22c5b916a6faf644b5028e9a4bd2bb264d053d9b05b6a98690f1d46f1 languageName: node linkType: hard -"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.14.7, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.22.15, @babel/parser@npm:^7.23.6": - version: 7.23.6 - resolution: "@babel/parser@npm:7.23.6" +"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.14.7, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.23.9, @babel/parser@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/parser@npm:7.24.7" bin: parser: ./bin/babel-parser.js - checksum: 140801c43731a6c41fd193f5c02bc71fd647a0360ca616b23d2db8be4b9739b9f951a03fc7c2db4f9b9214f4b27c1074db0f18bc3fa653783082d5af7c8860d5 + checksum: fc9d2c4c8712f89672edc55c0dc5cf640dcec715b56480f111f85c2bc1d507e251596e4110d65796690a96ac37a4b60432af90b3e97bb47e69d4ef83872dbbd6 languageName: node linkType: hard -"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:7.23.3" +"@babel/plugin-bugfix-firefox-class-in-computed-class-key@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-bugfix-firefox-class-in-computed-class-key@npm:7.24.7" dependencies: - "@babel/helper-plugin-utils": ^7.22.5 + "@babel/helper-environment-visitor": ^7.24.7 + "@babel/helper-plugin-utils": ^7.24.7 peerDependencies: "@babel/core": ^7.0.0 - checksum: ddbaf2c396b7780f15e80ee01d6dd790db076985f3dfeb6527d1a8d4cacf370e49250396a3aa005b2c40233cac214a106232f83703d5e8491848bde273938232 + checksum: 68d315642b53af143aa17a71eb976cf431b51339aee584e29514a462b81c998636dd54219c2713b5f13e1df89eaf130dfab59683f9116825608708c81696b96c languageName: node linkType: hard -"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@npm:7.23.3" +"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:7.24.7" dependencies: - "@babel/helper-plugin-utils": ^7.22.5 - "@babel/helper-skip-transparent-expression-wrappers": ^7.22.5 - "@babel/plugin-transform-optional-chaining": ^7.23.3 + "@babel/helper-plugin-utils": ^7.24.7 + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 7eb4e7ce5e3d6db4b0fdbdfaaa301c2e58f38a7ee39d5a4259a1fda61a612e83d3e4bc90fc36fb0345baf57e1e1a071e0caffeb80218623ad163f2fdc2e53a54 + languageName: node + linkType: hard + +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@npm:7.24.7" + dependencies: + "@babel/helper-plugin-utils": ^7.24.7 + "@babel/helper-skip-transparent-expression-wrappers": ^7.24.7 + "@babel/plugin-transform-optional-chaining": ^7.24.7 peerDependencies: "@babel/core": ^7.13.0 - checksum: 434b9d710ae856fa1a456678cc304fbc93915af86d581ee316e077af746a709a741ea39d7e1d4f5b98861b629cc7e87f002d3138f5e836775632466d4c74aef2 + checksum: 07b92878ac58a98ea1fdf6a8b4ec3413ba4fa66924e28b694d63ec5b84463123fbf4d7153b56cf3cedfef4a3482c082fe3243c04f8fb2c041b32b0e29b4a9e21 languageName: node linkType: hard -"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@npm:^7.23.7": - version: 7.23.7 - resolution: "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@npm:7.23.7" +"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@npm:7.24.7" dependencies: - "@babel/helper-environment-visitor": ^7.22.20 - "@babel/helper-plugin-utils": ^7.22.5 + "@babel/helper-environment-visitor": ^7.24.7 + "@babel/helper-plugin-utils": ^7.24.7 peerDependencies: "@babel/core": ^7.0.0 - checksum: f88e400b548202a6f8c5dfd25bc4949a13ea1ccb64a170d7dea4deaa655a0fcb001d3fd61c35e1ad9c09a3d5f0d43f783400425471fe6d660ccaf33dabea9aba + checksum: 8324d458db57060590942c7c2e9603880d07718ccb6450ec935105b8bd3c4393c4b8ada88e178c232258d91f33ffdcf2b1043d54e07a86989e50667ee100a32e languageName: node linkType: hard @@ -454,25 +467,25 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-syntax-import-assertions@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-syntax-import-assertions@npm:7.23.3" +"@babel/plugin-syntax-import-assertions@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-syntax-import-assertions@npm:7.24.7" dependencies: - "@babel/helper-plugin-utils": ^7.22.5 + "@babel/helper-plugin-utils": ^7.24.7 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 883e6b35b2da205138caab832d54505271a3fee3fc1e8dc0894502434fc2b5d517cbe93bbfbfef8068a0fb6ec48ebc9eef3f605200a489065ba43d8cddc1c9a7 + checksum: c4d67be4eb1d4637e361477dbe01f5b392b037d17c1f861cfa0faa120030e137aab90a9237931b8040fd31d1e5d159e11866fa1165f78beef7a3be876a391a17 languageName: node linkType: hard -"@babel/plugin-syntax-import-attributes@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-syntax-import-attributes@npm:7.23.3" +"@babel/plugin-syntax-import-attributes@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-syntax-import-attributes@npm:7.24.7" dependencies: - "@babel/helper-plugin-utils": ^7.22.5 + "@babel/helper-plugin-utils": ^7.24.7 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 9aed7661ffb920ca75df9f494757466ca92744e43072e0848d87fa4aa61a3f2ee5a22198ac1959856c036434b5614a8f46f1fb70298835dbe28220cdd1d4c11e + checksum: 590dbb5d1a15264f74670b427b8d18527672c3d6c91d7bae7e65f80fd810edbc83d90e68065088644cbad3f2457ed265a54a9956fb789fcb9a5b521822b3a275 languageName: node linkType: hard @@ -499,13 +512,13 @@ __metadata: linkType: hard "@babel/plugin-syntax-jsx@npm:^7.7.2": - version: 7.23.3 - resolution: "@babel/plugin-syntax-jsx@npm:7.23.3" + version: 7.24.7 + resolution: "@babel/plugin-syntax-jsx@npm:7.24.7" dependencies: - "@babel/helper-plugin-utils": ^7.22.5 + "@babel/helper-plugin-utils": ^7.24.7 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 89037694314a74e7f0e7a9c8d3793af5bf6b23d80950c29b360db1c66859d67f60711ea437e70ad6b5b4b29affe17eababda841b6c01107c2b638e0493bafb4e + checksum: 7a5ca629d8ca1e1ee78705a78e58c12920d07ed8006d7e7232b31296a384ff5e41d7b649bde5561196041037bbb9f9715be1d1c20975df87ca204f34ad15b965 languageName: node linkType: hard @@ -598,13 +611,13 @@ __metadata: linkType: hard "@babel/plugin-syntax-typescript@npm:^7.7.2": - version: 7.23.3 - resolution: "@babel/plugin-syntax-typescript@npm:7.23.3" + version: 7.24.7 + resolution: "@babel/plugin-syntax-typescript@npm:7.24.7" dependencies: - "@babel/helper-plugin-utils": ^7.22.5 + "@babel/helper-plugin-utils": ^7.24.7 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: abfad3a19290d258b028e285a1f34c9b8a0cbe46ef79eafed4ed7ffce11b5d0720b5e536c82f91cbd8442cde35a3dd8e861fa70366d87ff06fdc0d4756e30876 + checksum: 56fe84f3044ecbf038977281648db6b63bd1301f2fff6595820dc10ee276c1d1586919d48d52a8d497ecae32c958be38f42c1c8d174dc58aad856c516dc5b35a languageName: node linkType: hard @@ -620,605 +633,605 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-arrow-functions@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-arrow-functions@npm:7.23.3" +"@babel/plugin-transform-arrow-functions@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-arrow-functions@npm:7.24.7" dependencies: - "@babel/helper-plugin-utils": ^7.22.5 + "@babel/helper-plugin-utils": ^7.24.7 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 1e99118176e5366c2636064d09477016ab5272b2a92e78b8edb571d20bc3eaa881789a905b20042942c3c2d04efc530726cf703f937226db5ebc495f5d067e66 + checksum: 707c209b5331c7dc79bd326128c6a6640dbd62a78da1653c844db20c4f36bf7b68454f1bc4d2d051b3fde9136fa291f276ec03a071bb00ee653069ff82f91010 languageName: node linkType: hard -"@babel/plugin-transform-async-generator-functions@npm:^7.23.7": - version: 7.23.7 - resolution: "@babel/plugin-transform-async-generator-functions@npm:7.23.7" +"@babel/plugin-transform-async-generator-functions@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-async-generator-functions@npm:7.24.7" dependencies: - "@babel/helper-environment-visitor": ^7.22.20 - "@babel/helper-plugin-utils": ^7.22.5 - "@babel/helper-remap-async-to-generator": ^7.22.20 + "@babel/helper-environment-visitor": ^7.24.7 + "@babel/helper-plugin-utils": ^7.24.7 + "@babel/helper-remap-async-to-generator": ^7.24.7 "@babel/plugin-syntax-async-generators": ^7.8.4 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: b1f66b23423933c27336b1161ac92efef46683321caea97e2255a666f992979376f47a5559f64188d3831fa66a4b24c2a7a40838cc0e9737e90eebe20e8e6372 + checksum: 112e3b18f9c496ebc01209fc27f0b41a3669c479c7bc44f7249383172b432ebaae1e523caa7c6ecbd2d0d7adcb7e5769fe2798f8cb01c08cd57232d1bb6d8ad4 languageName: node linkType: hard -"@babel/plugin-transform-async-to-generator@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-async-to-generator@npm:7.23.3" +"@babel/plugin-transform-async-to-generator@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-async-to-generator@npm:7.24.7" dependencies: - "@babel/helper-module-imports": ^7.22.15 - "@babel/helper-plugin-utils": ^7.22.5 - "@babel/helper-remap-async-to-generator": ^7.22.20 + "@babel/helper-module-imports": ^7.24.7 + "@babel/helper-plugin-utils": ^7.24.7 + "@babel/helper-remap-async-to-generator": ^7.24.7 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 2e9d9795d4b3b3d8090332104e37061c677f29a1ce65bcbda4099a32d243e5d9520270a44bbabf0fb1fb40d463bd937685b1a1042e646979086c546d55319c3c + checksum: 13704fb3b83effc868db2b71bfb2c77b895c56cb891954fc362e95e200afd523313b0e7cf04ce02f45b05e76017c5b5fa8070c92613727a35131bb542c253a36 languageName: node linkType: hard -"@babel/plugin-transform-block-scoped-functions@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-block-scoped-functions@npm:7.23.3" +"@babel/plugin-transform-block-scoped-functions@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-block-scoped-functions@npm:7.24.7" dependencies: - "@babel/helper-plugin-utils": ^7.22.5 + "@babel/helper-plugin-utils": ^7.24.7 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: e63b16d94ee5f4d917e669da3db5ea53d1e7e79141a2ec873c1e644678cdafe98daa556d0d359963c827863d6b3665d23d4938a94a4c5053a1619c4ebd01d020 + checksum: 249cdcbff4e778b177245f9652b014ea4f3cd245d83297f10a7bf6d97790074089aa62bcde8c08eb299c5e68f2faed346b587d3ebac44d625ba9a83a4ee27028 languageName: node linkType: hard -"@babel/plugin-transform-block-scoping@npm:^7.23.4": - version: 7.23.4 - resolution: "@babel/plugin-transform-block-scoping@npm:7.23.4" +"@babel/plugin-transform-block-scoping@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-block-scoping@npm:7.24.7" dependencies: - "@babel/helper-plugin-utils": ^7.22.5 + "@babel/helper-plugin-utils": ^7.24.7 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: fc4b2100dd9f2c47d694b4b35ae8153214ccb4e24ef545c259a9db17211b18b6a430f22799b56db8f6844deaeaa201af45a03331d0c80cc28b0c4e3c814570e4 + checksum: 039206155533600f079f3a455f85888dd7d4970ff7ffa85ef44760f4f5acb9f19c9d848cc1fec1b9bdbc0dfec9e8a080b90d0ab66ad2bdc7138b5ca4ba96e61c languageName: node linkType: hard -"@babel/plugin-transform-class-properties@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-class-properties@npm:7.23.3" +"@babel/plugin-transform-class-properties@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-class-properties@npm:7.24.7" dependencies: - "@babel/helper-create-class-features-plugin": ^7.22.15 - "@babel/helper-plugin-utils": ^7.22.5 + "@babel/helper-create-class-features-plugin": ^7.24.7 + "@babel/helper-plugin-utils": ^7.24.7 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 9c6f8366f667897541d360246de176dd29efc7a13d80a5b48361882f7173d9173be4646c3b7d9b003ccc0e01e25df122330308f33db921fa553aa17ad544b3fc + checksum: 1348d7ce74da38ba52ea85b3b4289a6a86913748569ef92ef0cff30702a9eb849e5eaf59f1c6f3517059aa68115fb3067e389735dccacca39add4e2b0c67e291 languageName: node linkType: hard -"@babel/plugin-transform-class-static-block@npm:^7.23.4": - version: 7.23.4 - resolution: "@babel/plugin-transform-class-static-block@npm:7.23.4" +"@babel/plugin-transform-class-static-block@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-class-static-block@npm:7.24.7" dependencies: - "@babel/helper-create-class-features-plugin": ^7.22.15 - "@babel/helper-plugin-utils": ^7.22.5 + "@babel/helper-create-class-features-plugin": ^7.24.7 + "@babel/helper-plugin-utils": ^7.24.7 "@babel/plugin-syntax-class-static-block": ^7.14.5 peerDependencies: "@babel/core": ^7.12.0 - checksum: c8bfaba19a674fc2eb54edad71e958647360474e3163e8226f1acd63e4e2dbec32a171a0af596c1dc5359aee402cc120fea7abd1fb0e0354b6527f0fc9e8aa1e + checksum: 324049263504f18416f1c3e24033baebfafd05480fdd885c8ebe6f2b415b0fc8e0b98d719360f9e30743cc78ac387fabc0b3c6606d2b54135756ffb92963b382 languageName: node linkType: hard -"@babel/plugin-transform-classes@npm:^7.23.8": - version: 7.23.8 - resolution: "@babel/plugin-transform-classes@npm:7.23.8" +"@babel/plugin-transform-classes@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-classes@npm:7.24.7" dependencies: - "@babel/helper-annotate-as-pure": ^7.22.5 - "@babel/helper-compilation-targets": ^7.23.6 - "@babel/helper-environment-visitor": ^7.22.20 - "@babel/helper-function-name": ^7.23.0 - "@babel/helper-plugin-utils": ^7.22.5 - "@babel/helper-replace-supers": ^7.22.20 - "@babel/helper-split-export-declaration": ^7.22.6 + "@babel/helper-annotate-as-pure": ^7.24.7 + "@babel/helper-compilation-targets": ^7.24.7 + "@babel/helper-environment-visitor": ^7.24.7 + "@babel/helper-function-name": ^7.24.7 + "@babel/helper-plugin-utils": ^7.24.7 + "@babel/helper-replace-supers": ^7.24.7 + "@babel/helper-split-export-declaration": ^7.24.7 globals: ^11.1.0 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 7dee6cebe52131d2d16944f36e1fdb9d4b24f44d0e7e450f93a44435d001f17cc0789a4cb6b15ec67c8e484581b8a730b5c3ec374470f29ff0133086955b8c58 + checksum: f01cb31143730d425681e9816020cbb519c7ddb3b6ca308dfaf2821eda5699a746637fc6bf19811e2fb42cfdf8b00a21b31c754da83771a5c280077925677354 languageName: node linkType: hard -"@babel/plugin-transform-computed-properties@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-computed-properties@npm:7.23.3" +"@babel/plugin-transform-computed-properties@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-computed-properties@npm:7.24.7" dependencies: - "@babel/helper-plugin-utils": ^7.22.5 - "@babel/template": ^7.22.15 + "@babel/helper-plugin-utils": ^7.24.7 + "@babel/template": ^7.24.7 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 80452661dc25a0956f89fe98cb562e8637a9556fb6c00d312c57653ce7df8798f58d138603c7e1aad96614ee9ccd10c47e50ab9ded6b6eded5adeb230d2a982e + checksum: 0cf8c1b1e4ea57dec8d4612460d84fd4cdbf71a7499bb61ee34632cf89018a59eee818ffca88a8d99ee7057c20a4257044d7d463fda6daef9bf1db9fa81563cb languageName: node linkType: hard -"@babel/plugin-transform-destructuring@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-destructuring@npm:7.23.3" +"@babel/plugin-transform-destructuring@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-destructuring@npm:7.24.7" dependencies: - "@babel/helper-plugin-utils": ^7.22.5 + "@babel/helper-plugin-utils": ^7.24.7 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 9e015099877272501162419bfe781689aec5c462cd2aec752ee22288f209eec65969ff11b8fdadca2eaddea71d705d3bba5b9c60752fcc1be67874fcec687105 + checksum: b9637b27faf9d24a8119bc5a1f98a2f47c69e6441bd8fc71163500be316253a72173308a93122bcf27d8d314ace43344c976f7291cf6376767f408350c8149d4 languageName: node linkType: hard -"@babel/plugin-transform-dotall-regex@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-dotall-regex@npm:7.23.3" +"@babel/plugin-transform-dotall-regex@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-dotall-regex@npm:7.24.7" dependencies: - "@babel/helper-create-regexp-features-plugin": ^7.22.15 - "@babel/helper-plugin-utils": ^7.22.5 + "@babel/helper-create-regexp-features-plugin": ^7.24.7 + "@babel/helper-plugin-utils": ^7.24.7 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: a2dbbf7f1ea16a97948c37df925cb364337668c41a3948b8d91453f140507bd8a3429030c7ce66d09c299987b27746c19a2dd18b6f17dcb474854b14fd9159a3 + checksum: 67b10fc6abb1f61f0e765288eb4c6d63d1d0f9fc0660e69f6f2170c56fa16bc74e49857afc644beda112b41771cd90cf52df0940d11e97e52617c77c7dcff171 languageName: node linkType: hard -"@babel/plugin-transform-duplicate-keys@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-duplicate-keys@npm:7.23.3" +"@babel/plugin-transform-duplicate-keys@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-duplicate-keys@npm:7.24.7" dependencies: - "@babel/helper-plugin-utils": ^7.22.5 + "@babel/helper-plugin-utils": ^7.24.7 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: c2a21c34dc0839590cd945192cbc46fde541a27e140c48fe1808315934664cdbf18db64889e23c4eeb6bad9d3e049482efdca91d29de5734ffc887c4fbabaa16 + checksum: d1da2ff85ecb56a63f4ccfd9dc9ae69400d85f0dadf44ecddd9e71c6e5c7a9178e74e3a9637555f415a2bb14551e563f09f98534ab54f53d25e8439fdde6ba2d languageName: node linkType: hard -"@babel/plugin-transform-dynamic-import@npm:^7.23.4": - version: 7.23.4 - resolution: "@babel/plugin-transform-dynamic-import@npm:7.23.4" +"@babel/plugin-transform-dynamic-import@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-dynamic-import@npm:7.24.7" dependencies: - "@babel/helper-plugin-utils": ^7.22.5 + "@babel/helper-plugin-utils": ^7.24.7 "@babel/plugin-syntax-dynamic-import": ^7.8.3 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 57a722604c430d9f3dacff22001a5f31250e34785d4969527a2ae9160fa86858d0892c5b9ff7a06a04076f8c76c9e6862e0541aadca9c057849961343aab0845 + checksum: 776509ff62ab40c12be814a342fc56a5cc09b91fb63032b2633414b635875fd7da03734657be0f6db2891fe6e3033b75d5ddb6f2baabd1a02e4443754a785002 languageName: node linkType: hard -"@babel/plugin-transform-exponentiation-operator@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-exponentiation-operator@npm:7.23.3" +"@babel/plugin-transform-exponentiation-operator@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-exponentiation-operator@npm:7.24.7" dependencies: - "@babel/helper-builder-binary-assignment-operator-visitor": ^7.22.15 - "@babel/helper-plugin-utils": ^7.22.5 + "@babel/helper-builder-binary-assignment-operator-visitor": ^7.24.7 + "@babel/helper-plugin-utils": ^7.24.7 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 00d05ab14ad0f299160fcf9d8f55a1cc1b740e012ab0b5ce30207d2365f091665115557af7d989cd6260d075a252d9e4283de5f2b247dfbbe0e42ae586e6bf66 + checksum: 23c84a23eb56589fdd35a3540f9a1190615be069110a2270865223c03aee3ba4e0fc68fe14850800cf36f0712b26e4964d3026235261f58f0405a29fe8dac9b1 languageName: node linkType: hard -"@babel/plugin-transform-export-namespace-from@npm:^7.23.4": - version: 7.23.4 - resolution: "@babel/plugin-transform-export-namespace-from@npm:7.23.4" +"@babel/plugin-transform-export-namespace-from@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-export-namespace-from@npm:7.24.7" dependencies: - "@babel/helper-plugin-utils": ^7.22.5 + "@babel/helper-plugin-utils": ^7.24.7 "@babel/plugin-syntax-export-namespace-from": ^7.8.3 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 9f770a81bfd03b48d6ba155d452946fd56d6ffe5b7d871e9ec2a0b15e0f424273b632f3ed61838b90015b25bbda988896b7a46c7d964fbf8f6feb5820b309f93 + checksum: 3bd3a10038f10ae0dea1ee42137f3edcf7036b5e9e570a0d1cbd0865f03658990c6c2d84fa2475f87a754e7dc5b46766c16f7ce5c9b32c3040150b6a21233a80 languageName: node linkType: hard -"@babel/plugin-transform-for-of@npm:^7.23.6": - version: 7.23.6 - resolution: "@babel/plugin-transform-for-of@npm:7.23.6" +"@babel/plugin-transform-for-of@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-for-of@npm:7.24.7" dependencies: - "@babel/helper-plugin-utils": ^7.22.5 - "@babel/helper-skip-transparent-expression-wrappers": ^7.22.5 + "@babel/helper-plugin-utils": ^7.24.7 + "@babel/helper-skip-transparent-expression-wrappers": ^7.24.7 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 228c060aa61f6aa89dc447170075f8214863b94f830624e74ade99c1a09316897c12d76e848460b0b506593e58dbc42739af6dc4cb0fe9b84dffe4a596050a36 + checksum: a53b42dc93ab4b7d1ebd3c695b52be22b3d592f6a3dbdb3dc2fea2c8e0a7e1508fe919864c455cde552aec44ce7518625fccbb70c7063373ca228d884f4f49ea languageName: node linkType: hard -"@babel/plugin-transform-function-name@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-function-name@npm:7.23.3" +"@babel/plugin-transform-function-name@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-function-name@npm:7.24.7" dependencies: - "@babel/helper-compilation-targets": ^7.22.15 - "@babel/helper-function-name": ^7.23.0 - "@babel/helper-plugin-utils": ^7.22.5 + "@babel/helper-compilation-targets": ^7.24.7 + "@babel/helper-function-name": ^7.24.7 + "@babel/helper-plugin-utils": ^7.24.7 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 355c6dbe07c919575ad42b2f7e020f320866d72f8b79181a16f8e0cd424a2c761d979f03f47d583d9471b55dcd68a8a9d829b58e1eebcd572145b934b48975a6 + checksum: 8eb1a67894a124910b5a67630bed4307757504381f39f0fb5cf82afc7ae8647dbc03b256d13865b73a749b9071b68e9fb8a28cef2369917b4299ebb93fd66146 languageName: node linkType: hard -"@babel/plugin-transform-json-strings@npm:^7.23.4": - version: 7.23.4 - resolution: "@babel/plugin-transform-json-strings@npm:7.23.4" +"@babel/plugin-transform-json-strings@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-json-strings@npm:7.24.7" dependencies: - "@babel/helper-plugin-utils": ^7.22.5 + "@babel/helper-plugin-utils": ^7.24.7 "@babel/plugin-syntax-json-strings": ^7.8.3 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: f9019820233cf8955d8ba346df709a0683c120fe86a24ed1c9f003f2db51197b979efc88f010d558a12e1491210fc195a43cd1c7fee5e23b92da38f793a875de + checksum: 88874d0b7a1ddea66c097fc0abb68801ffae194468aa44b828dde9a0e20ac5d8647943793de86092eabaa2911c96f67a6b373793d4bb9c932ef81b2711c06c2e languageName: node linkType: hard -"@babel/plugin-transform-literals@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-literals@npm:7.23.3" +"@babel/plugin-transform-literals@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-literals@npm:7.24.7" dependencies: - "@babel/helper-plugin-utils": ^7.22.5 + "@babel/helper-plugin-utils": ^7.24.7 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 519a544cd58586b9001c4c9b18da25a62f17d23c48600ff7a685d75ca9eb18d2c5e8f5476f067f0a8f1fea2a31107eff950b9864833061e6076dcc4bdc3e71ed + checksum: 3c075cc093a3dd9e294b8b7d6656e65f889e7ca2179ca27978dcd65b4dc4885ebbfb327408d7d8f483c55547deed00ba840956196f3ac8a3c3d2308a330a8c23 languageName: node linkType: hard -"@babel/plugin-transform-logical-assignment-operators@npm:^7.23.4": - version: 7.23.4 - resolution: "@babel/plugin-transform-logical-assignment-operators@npm:7.23.4" +"@babel/plugin-transform-logical-assignment-operators@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-logical-assignment-operators@npm:7.24.7" dependencies: - "@babel/helper-plugin-utils": ^7.22.5 + "@babel/helper-plugin-utils": ^7.24.7 "@babel/plugin-syntax-logical-assignment-operators": ^7.10.4 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 2ae1dc9b4ff3bf61a990ff3accdecb2afe3a0ca649b3e74c010078d1cdf29ea490f50ac0a905306a2bcf9ac177889a39ac79bdcc3a0fdf220b3b75fac18d39b5 + checksum: 3367ce0be243704dc6fce23e86a592c4380f01998ee5dd9f94c54b1ef7b971ac6f8a002901eb51599ac6cbdc0d067af8d1a720224fca1c40fde8bb8aab804aac languageName: node linkType: hard -"@babel/plugin-transform-member-expression-literals@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-member-expression-literals@npm:7.23.3" +"@babel/plugin-transform-member-expression-literals@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-member-expression-literals@npm:7.24.7" dependencies: - "@babel/helper-plugin-utils": ^7.22.5 + "@babel/helper-plugin-utils": ^7.24.7 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 95cec13c36d447c5aa6b8e4c778b897eeba66dcb675edef01e0d2afcec9e8cb9726baf4f81b4bbae7a782595aed72e6a0d44ffb773272c3ca180fada99bf92db + checksum: 2720c57aa3bf70576146ba7d6ea03227f4611852122d76d237924f7b008dafc952e6ae61a19e5024f26c665f44384bbd378466f01b6bd1305b3564a3b7fb1a5d languageName: node linkType: hard -"@babel/plugin-transform-modules-amd@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-modules-amd@npm:7.23.3" +"@babel/plugin-transform-modules-amd@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-modules-amd@npm:7.24.7" dependencies: - "@babel/helper-module-transforms": ^7.23.3 - "@babel/helper-plugin-utils": ^7.22.5 + "@babel/helper-module-transforms": ^7.24.7 + "@babel/helper-plugin-utils": ^7.24.7 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: d163737b6a3d67ea579c9aa3b83d4df4b5c34d9dcdf25f415f027c0aa8cded7bac2750d2de5464081f67a042ad9e1c03930c2fab42acd79f9e57c00cf969ddff + checksum: f1dd0fb2f46c0f8f21076b8c7ccd5b33a85ce6dcb31518ea4c648d9a5bb2474cd4bd87c9b1b752e68591e24b022e334ba0d07631fef2b6b4d8a4b85cf3d581f5 languageName: node linkType: hard -"@babel/plugin-transform-modules-commonjs@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-modules-commonjs@npm:7.23.3" +"@babel/plugin-transform-modules-commonjs@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-modules-commonjs@npm:7.24.7" dependencies: - "@babel/helper-module-transforms": ^7.23.3 - "@babel/helper-plugin-utils": ^7.22.5 - "@babel/helper-simple-access": ^7.22.5 + "@babel/helper-module-transforms": ^7.24.7 + "@babel/helper-plugin-utils": ^7.24.7 + "@babel/helper-simple-access": ^7.24.7 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 720a231ceade4ae4d2632478db4e7fecf21987d444942b72d523487ac8d715ca97de6c8f415c71e939595e1a4776403e7dc24ed68fe9125ad4acf57753c9bff7 + checksum: bfda2a0297197ed342e2a02e5f9847a489a3ae40a4a7d7f00f4aeb8544a85e9006e0c5271c8f61f39bc97975ef2717b5594cf9486694377a53433162909d64c1 languageName: node linkType: hard -"@babel/plugin-transform-modules-systemjs@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-modules-systemjs@npm:7.23.3" +"@babel/plugin-transform-modules-systemjs@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-modules-systemjs@npm:7.24.7" dependencies: - "@babel/helper-hoist-variables": ^7.22.5 - "@babel/helper-module-transforms": ^7.23.3 - "@babel/helper-plugin-utils": ^7.22.5 - "@babel/helper-validator-identifier": ^7.22.20 + "@babel/helper-hoist-variables": ^7.24.7 + "@babel/helper-module-transforms": ^7.24.7 + "@babel/helper-plugin-utils": ^7.24.7 + "@babel/helper-validator-identifier": ^7.24.7 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 0d2fdd993c785aecac9e0850cd5ed7f7d448f0fbb42992a950cc0590167144df25d82af5aac9a5c99ef913d2286782afa44e577af30c10901c5ee8984910fa1f + checksum: 8af7a9db2929991d82cfdf41fb175dee344274d39b39122f8c35f24b5d682f98368e3d8f5130401298bd21412df21d416a7d8b33b59c334fae3d3c762118b1d8 languageName: node linkType: hard -"@babel/plugin-transform-modules-umd@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-modules-umd@npm:7.23.3" +"@babel/plugin-transform-modules-umd@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-modules-umd@npm:7.24.7" dependencies: - "@babel/helper-module-transforms": ^7.23.3 - "@babel/helper-plugin-utils": ^7.22.5 + "@babel/helper-module-transforms": ^7.24.7 + "@babel/helper-plugin-utils": ^7.24.7 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 586a7a2241e8b4e753a37af9466a9ffa8a67b4ba9aa756ad7500712c05d8fa9a8c1ed4f7bd25fae2a8265e6cf8fe781ec85a8ee885dd34cf50d8955ee65f12dc + checksum: 9ff1c464892efe042952ba778468bda6131b196a2729615bdcc3f24cdc94014f016a4616ee5643c5845bade6ba698f386833e61056d7201314b13a7fd69fac88 languageName: node linkType: hard -"@babel/plugin-transform-named-capturing-groups-regex@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/plugin-transform-named-capturing-groups-regex@npm:7.22.5" +"@babel/plugin-transform-named-capturing-groups-regex@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-named-capturing-groups-regex@npm:7.24.7" dependencies: - "@babel/helper-create-regexp-features-plugin": ^7.22.5 - "@babel/helper-plugin-utils": ^7.22.5 + "@babel/helper-create-regexp-features-plugin": ^7.24.7 + "@babel/helper-plugin-utils": ^7.24.7 peerDependencies: "@babel/core": ^7.0.0 - checksum: 3ee564ddee620c035b928fdc942c5d17e9c4b98329b76f9cefac65c111135d925eb94ed324064cd7556d4f5123beec79abea1d4b97d1c8a2a5c748887a2eb623 + checksum: f1c6c7b5d60a86b6d7e4dd098798e1d393d55e993a0b57a73b53640c7a94985b601a96bdacee063f809a9a700bcea3a2ff18e98fa561554484ac56b761d774bd languageName: node linkType: hard -"@babel/plugin-transform-new-target@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-new-target@npm:7.23.3" +"@babel/plugin-transform-new-target@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-new-target@npm:7.24.7" dependencies: - "@babel/helper-plugin-utils": ^7.22.5 + "@babel/helper-plugin-utils": ^7.24.7 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: e5053389316fce73ad5201b7777437164f333e24787fbcda4ae489cd2580dbbbdfb5694a7237bad91fabb46b591d771975d69beb1c740b82cb4761625379f00b + checksum: 3cb94cd1076b270f768f91fdcf9dd2f6d487f8dbfff3df7ca8d07b915900b86d02769a35ba1407d16fe49499012c8f055e1741299e2c880798b953d942a8fa1b languageName: node linkType: hard -"@babel/plugin-transform-nullish-coalescing-operator@npm:^7.23.4": - version: 7.23.4 - resolution: "@babel/plugin-transform-nullish-coalescing-operator@npm:7.23.4" +"@babel/plugin-transform-nullish-coalescing-operator@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-nullish-coalescing-operator@npm:7.24.7" dependencies: - "@babel/helper-plugin-utils": ^7.22.5 + "@babel/helper-plugin-utils": ^7.24.7 "@babel/plugin-syntax-nullish-coalescing-operator": ^7.8.3 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: a27d73ea134d3d9560a6b2e26ab60012fba15f1db95865aa0153c18f5ec82cfef6a7b3d8df74e3c2fca81534fa5efeb6cacaf7b08bdb7d123e3dafdd079886a3 + checksum: 4a9221356401d87762afbc37a9e8e764afc2daf09c421117537820f8cfbed6876888372ad3a7bcfae2d45c95f026651f050ab4020b777be31d3ffb00908dbdd3 languageName: node linkType: hard -"@babel/plugin-transform-numeric-separator@npm:^7.23.4": - version: 7.23.4 - resolution: "@babel/plugin-transform-numeric-separator@npm:7.23.4" +"@babel/plugin-transform-numeric-separator@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-numeric-separator@npm:7.24.7" dependencies: - "@babel/helper-plugin-utils": ^7.22.5 + "@babel/helper-plugin-utils": ^7.24.7 "@babel/plugin-syntax-numeric-separator": ^7.10.4 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 6ba0e5db3c620a3ec81f9e94507c821f483c15f196868df13fa454cbac719a5449baf73840f5b6eb7d77311b24a2cf8e45db53700d41727f693d46f7caf3eec3 + checksum: 561b5f1d08b2c3f92ce849f092751558b5e6cfeb7eb55c79e7375c34dd9c3066dce5e630bb439affef6adcf202b6cbcaaa23870070276fa5bb429c8f5b8c7514 languageName: node linkType: hard -"@babel/plugin-transform-object-rest-spread@npm:^7.23.4": - version: 7.23.4 - resolution: "@babel/plugin-transform-object-rest-spread@npm:7.23.4" +"@babel/plugin-transform-object-rest-spread@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-object-rest-spread@npm:7.24.7" dependencies: - "@babel/compat-data": ^7.23.3 - "@babel/helper-compilation-targets": ^7.22.15 - "@babel/helper-plugin-utils": ^7.22.5 + "@babel/helper-compilation-targets": ^7.24.7 + "@babel/helper-plugin-utils": ^7.24.7 "@babel/plugin-syntax-object-rest-spread": ^7.8.3 - "@babel/plugin-transform-parameters": ^7.23.3 + "@babel/plugin-transform-parameters": ^7.24.7 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 73fec495e327ca3959c1c03d07a621be09df00036c69fff0455af9a008291677ee9d368eec48adacdc6feac703269a649747568b4af4c4e9f134aa71cc5b378d + checksum: 169d257b9800c13e1feb4c37fb05dae84f702e58b342bb76e19e82e6692b7b5337c9923ee89e3916a97c0dd04a3375bdeca14f5e126f110bbacbeb46d1886ca2 languageName: node linkType: hard -"@babel/plugin-transform-object-super@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-object-super@npm:7.23.3" +"@babel/plugin-transform-object-super@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-object-super@npm:7.24.7" dependencies: - "@babel/helper-plugin-utils": ^7.22.5 - "@babel/helper-replace-supers": ^7.22.20 + "@babel/helper-plugin-utils": ^7.24.7 + "@babel/helper-replace-supers": ^7.24.7 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: e495497186f621fa79026e183b4f1fbb172fd9df812cbd2d7f02c05b08adbe58012b1a6eb6dd58d11a30343f6ec80d0f4074f9b501d70aa1c94df76d59164c53 + checksum: f71e607a830ee50a22fa1a2686524d3339440cf9dea63032f6efbd865cfe4e35000e1e3f3492459e5c986f7c0c07dc36938bf3ce61fc9ba5f8ab732d0b64ab37 languageName: node linkType: hard -"@babel/plugin-transform-optional-catch-binding@npm:^7.23.4": - version: 7.23.4 - resolution: "@babel/plugin-transform-optional-catch-binding@npm:7.23.4" +"@babel/plugin-transform-optional-catch-binding@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-optional-catch-binding@npm:7.24.7" dependencies: - "@babel/helper-plugin-utils": ^7.22.5 + "@babel/helper-plugin-utils": ^7.24.7 "@babel/plugin-syntax-optional-catch-binding": ^7.8.3 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: d50b5ee142cdb088d8b5de1ccf7cea85b18b85d85b52f86618f6e45226372f01ad4cdb29abd4fd35ea99a71fefb37009e0107db7a787dcc21d4d402f97470faf + checksum: 7229f3a5a4facaab40f4fdfc7faabc157dc38a67d66bed7936599f4bc509e0bff636f847ac2aa45294881fce9cf8a0a460b85d2a465b7b977de9739fce9b18f6 languageName: node linkType: hard -"@babel/plugin-transform-optional-chaining@npm:^7.23.3, @babel/plugin-transform-optional-chaining@npm:^7.23.4": - version: 7.23.4 - resolution: "@babel/plugin-transform-optional-chaining@npm:7.23.4" +"@babel/plugin-transform-optional-chaining@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-optional-chaining@npm:7.24.7" dependencies: - "@babel/helper-plugin-utils": ^7.22.5 - "@babel/helper-skip-transparent-expression-wrappers": ^7.22.5 + "@babel/helper-plugin-utils": ^7.24.7 + "@babel/helper-skip-transparent-expression-wrappers": ^7.24.7 "@babel/plugin-syntax-optional-chaining": ^7.8.3 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: e7a4c08038288057b7a08d68c4d55396ada9278095509ca51ed8dfb72a7f13f26bdd7c5185de21079fe0a9d60d22c227cb32e300d266c1bda40f70eee9f4bc1e + checksum: 877e7ce9097d475132c7f4d1244de50bb2fd37993dc4580c735f18f8cbc49282f6e77752821bcad5ca9d3528412d2c8a7ee0aa7ca71bb680ff82648e7a5fed25 languageName: node linkType: hard -"@babel/plugin-transform-parameters@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-parameters@npm:7.23.3" +"@babel/plugin-transform-parameters@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-parameters@npm:7.24.7" dependencies: - "@babel/helper-plugin-utils": ^7.22.5 + "@babel/helper-plugin-utils": ^7.24.7 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: a735b3e85316d17ec102e3d3d1b6993b429bdb3b494651c9d754e3b7d270462ee1f1a126ccd5e3d871af5e683727e9ef98c9d34d4a42204fffaabff91052ed16 + checksum: ab534b03ac2eff94bc79342b8f39a4584666f5305a6c63c1964afda0b1b004e6b861e49d1683548030defe248e3590d3ff6338ee0552cb90c064f7e1479968c3 languageName: node linkType: hard -"@babel/plugin-transform-private-methods@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-private-methods@npm:7.23.3" +"@babel/plugin-transform-private-methods@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-private-methods@npm:7.24.7" dependencies: - "@babel/helper-create-class-features-plugin": ^7.22.15 - "@babel/helper-plugin-utils": ^7.22.5 + "@babel/helper-create-class-features-plugin": ^7.24.7 + "@babel/helper-plugin-utils": ^7.24.7 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: cedc1285c49b5a6d9a3d0e5e413b756ac40b3ac2f8f68bdfc3ae268bc8d27b00abd8bb0861c72756ff5dd8bf1eb77211b7feb5baf4fdae2ebbaabe49b9adc1d0 + checksum: c151548e34909be2adcceb224d8fdd70bafa393bc1559a600906f3f647317575bf40db670470934a360e90ee8084ef36dffa34ec25d387d414afd841e74cf3fe languageName: node linkType: hard -"@babel/plugin-transform-private-property-in-object@npm:^7.23.4": - version: 7.23.4 - resolution: "@babel/plugin-transform-private-property-in-object@npm:7.23.4" +"@babel/plugin-transform-private-property-in-object@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-private-property-in-object@npm:7.24.7" dependencies: - "@babel/helper-annotate-as-pure": ^7.22.5 - "@babel/helper-create-class-features-plugin": ^7.22.15 - "@babel/helper-plugin-utils": ^7.22.5 + "@babel/helper-annotate-as-pure": ^7.24.7 + "@babel/helper-create-class-features-plugin": ^7.24.7 + "@babel/helper-plugin-utils": ^7.24.7 "@babel/plugin-syntax-private-property-in-object": ^7.14.5 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: fb7adfe94ea97542f250a70de32bddbc3e0b802381c92be947fec83ebffda57e68533c4d0697152719a3496fdd3ebf3798d451c024cd4ac848fc15ac26b70aa7 + checksum: 8cee9473095305cc787bb653fd681719b49363281feabf677db8a552e8e41c94441408055d7e5fd5c7d41b315e634fa70b145ad0c7c54456216049df4ed57350 languageName: node linkType: hard -"@babel/plugin-transform-property-literals@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-property-literals@npm:7.23.3" +"@babel/plugin-transform-property-literals@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-property-literals@npm:7.24.7" dependencies: - "@babel/helper-plugin-utils": ^7.22.5 + "@babel/helper-plugin-utils": ^7.24.7 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 16b048c8e87f25095f6d53634ab7912992f78e6997a6ff549edc3cf519db4fca01c7b4e0798530d7f6a05228ceee479251245cdd850a5531c6e6f404104d6cc9 + checksum: 9aeefc3aab6c6bf9d1fae1cf3a2d38c7d886fd3c6c81b7c608c477f5758aee2e7abf52f32724310fe861da61af934ee2508b78a5b5f234b9740c9134e1c14437 languageName: node linkType: hard -"@babel/plugin-transform-regenerator@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-regenerator@npm:7.23.3" +"@babel/plugin-transform-regenerator@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-regenerator@npm:7.24.7" dependencies: - "@babel/helper-plugin-utils": ^7.22.5 + "@babel/helper-plugin-utils": ^7.24.7 regenerator-transform: ^0.15.2 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 7fdacc7b40008883871b519c9e5cdea493f75495118ccc56ac104b874983569a24edd024f0f5894ba1875c54ee2b442f295d6241c3280e61c725d0dd3317c8e6 + checksum: 20c6c3fb6fc9f407829087316653388d311e8c1816b007609bb09aeef254092a7157adace8b3aaa8f34be752503717cb85c88a5fe482180a9b11bcbd676063be languageName: node linkType: hard -"@babel/plugin-transform-reserved-words@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-reserved-words@npm:7.23.3" +"@babel/plugin-transform-reserved-words@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-reserved-words@npm:7.24.7" dependencies: - "@babel/helper-plugin-utils": ^7.22.5 + "@babel/helper-plugin-utils": ^7.24.7 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 298c4440ddc136784ff920127cea137168e068404e635dc946ddb5d7b2a27b66f1dd4c4acb01f7184478ff7d5c3e7177a127279479926519042948fb7fa0fa48 + checksum: 3d5876954d5914d7270819479504f30c4bf5452a65c677f44e2dab2db50b3c9d4b47793c45dfad7abf4f377035dd79e4b3f554ae350df9f422201d370ce9f8dd languageName: node linkType: hard -"@babel/plugin-transform-shorthand-properties@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-shorthand-properties@npm:7.23.3" +"@babel/plugin-transform-shorthand-properties@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-shorthand-properties@npm:7.24.7" dependencies: - "@babel/helper-plugin-utils": ^7.22.5 + "@babel/helper-plugin-utils": ^7.24.7 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 5d677a03676f9fff969b0246c423d64d77502e90a832665dc872a5a5e05e5708161ce1effd56bb3c0f2c20a1112fca874be57c8a759d8b08152755519281f326 + checksum: 7b524245814607188212b8eb86d8c850e5974203328455a30881b4a92c364b93353fae14bc2af5b614ef16300b75b8c1d3b8f3a08355985b4794a7feb240adc3 languageName: node linkType: hard -"@babel/plugin-transform-spread@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-spread@npm:7.23.3" +"@babel/plugin-transform-spread@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-spread@npm:7.24.7" dependencies: - "@babel/helper-plugin-utils": ^7.22.5 - "@babel/helper-skip-transparent-expression-wrappers": ^7.22.5 + "@babel/helper-plugin-utils": ^7.24.7 + "@babel/helper-skip-transparent-expression-wrappers": ^7.24.7 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 8fd5cac201e77a0b4825745f4e07a25f923842f282f006b3a79223c00f61075c8868d12eafec86b2642cd0b32077cdd32314e27bcb75ee5e6a68c0144140dcf2 + checksum: 4c4254c8b9cceb1a8f975fa9b92257ddb08380a35c0a3721b8f4b9e13a3d82e403af2e0fba577b9f2452dd8f06bc3dea71cc53b1e2c6af595af5db52a13429d6 languageName: node linkType: hard -"@babel/plugin-transform-sticky-regex@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-sticky-regex@npm:7.23.3" +"@babel/plugin-transform-sticky-regex@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-sticky-regex@npm:7.24.7" dependencies: - "@babel/helper-plugin-utils": ^7.22.5 + "@babel/helper-plugin-utils": ^7.24.7 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 53e55eb2575b7abfdb4af7e503a2bf7ef5faf8bf6b92d2cd2de0700bdd19e934e5517b23e6dfed94ba50ae516b62f3f916773ef7d9bc81f01503f585051e2949 + checksum: 118fc7a7ebf7c20411b670c8a030535fdfe4a88bc5643bb625a584dbc4c8a468da46430a20e6bf78914246962b0f18f1b9d6a62561a7762c4f34a038a5a77179 languageName: node linkType: hard -"@babel/plugin-transform-template-literals@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-template-literals@npm:7.23.3" +"@babel/plugin-transform-template-literals@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-template-literals@npm:7.24.7" dependencies: - "@babel/helper-plugin-utils": ^7.22.5 + "@babel/helper-plugin-utils": ^7.24.7 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: b16c5cb0b8796be0118e9c144d15bdc0d20a7f3f59009c6303a6e9a8b74c146eceb3f05186f5b97afcba7cfa87e34c1585a22186e3d5b22f2fd3d27d959d92b2 + checksum: ad44e5826f5a98c1575832dbdbd033adfe683cdff195e178528ead62507564bf02f479b282976cfd3caebad8b06d5fd7349c1cdb880dec3c56daea4f1f179619 languageName: node linkType: hard -"@babel/plugin-transform-typeof-symbol@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-typeof-symbol@npm:7.23.3" +"@babel/plugin-transform-typeof-symbol@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-typeof-symbol@npm:7.24.7" dependencies: - "@babel/helper-plugin-utils": ^7.22.5 + "@babel/helper-plugin-utils": ^7.24.7 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 0af7184379d43afac7614fc89b1bdecce4e174d52f4efaeee8ec1a4f2c764356c6dba3525c0685231f1cbf435b6dd4ee9e738d7417f3b10ce8bbe869c32f4384 + checksum: 6bd16b9347614d44187d8f8ee23ebd7be30dabf3632eed5ff0415f35a482e827de220527089eae9cdfb75e85aa72db0e141ebc2247c4b1187c1abcdacdc34895 languageName: node linkType: hard -"@babel/plugin-transform-unicode-escapes@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-unicode-escapes@npm:7.23.3" +"@babel/plugin-transform-unicode-escapes@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-unicode-escapes@npm:7.24.7" dependencies: - "@babel/helper-plugin-utils": ^7.22.5 + "@babel/helper-plugin-utils": ^7.24.7 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 561c429183a54b9e4751519a3dfba6014431e9cdc1484fad03bdaf96582dfc72c76a4f8661df2aeeae7c34efd0fa4d02d3b83a2f63763ecf71ecc925f9cc1f60 + checksum: 4af0a193e1ddea6ff82b2b15cc2501b872728050bd625740b813c8062fec917d32d530ff6b41de56c15e7296becdf3336a58db81f5ca8e7c445c1306c52f3e01 languageName: node linkType: hard -"@babel/plugin-transform-unicode-property-regex@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-unicode-property-regex@npm:7.23.3" +"@babel/plugin-transform-unicode-property-regex@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-unicode-property-regex@npm:7.24.7" dependencies: - "@babel/helper-create-regexp-features-plugin": ^7.22.15 - "@babel/helper-plugin-utils": ^7.22.5 + "@babel/helper-create-regexp-features-plugin": ^7.24.7 + "@babel/helper-plugin-utils": ^7.24.7 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 2298461a194758086d17c23c26c7de37aa533af910f9ebf31ebd0893d4aa317468043d23f73edc782ec21151d3c46cf0ff8098a83b725c49a59de28a1d4d6225 + checksum: aae13350c50973f5802ca7906d022a6a0cc0e3aebac9122d0450bbd51e78252d4c2032ad69385e2759fcbdd3aac5d571bd7e26258907f51f8e1a51b53be626c2 languageName: node linkType: hard -"@babel/plugin-transform-unicode-regex@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-unicode-regex@npm:7.23.3" +"@babel/plugin-transform-unicode-regex@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-unicode-regex@npm:7.24.7" dependencies: - "@babel/helper-create-regexp-features-plugin": ^7.22.15 - "@babel/helper-plugin-utils": ^7.22.5 + "@babel/helper-create-regexp-features-plugin": ^7.24.7 + "@babel/helper-plugin-utils": ^7.24.7 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: c5f835d17483ba899787f92e313dfa5b0055e3deab332f1d254078a2bba27ede47574b6599fcf34d3763f0c048ae0779dc21d2d8db09295edb4057478dc80a9a + checksum: 1cb4e70678906e431da0a05ac3f8350025fee290304ad7482d9cfaa1ca67b2e898654de537c9268efbdad5b80d3ebadf42b4a88ea84609bd8a4cce7b11b48afd languageName: node linkType: hard -"@babel/plugin-transform-unicode-sets-regex@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-unicode-sets-regex@npm:7.23.3" +"@babel/plugin-transform-unicode-sets-regex@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-unicode-sets-regex@npm:7.24.7" dependencies: - "@babel/helper-create-regexp-features-plugin": ^7.22.15 - "@babel/helper-plugin-utils": ^7.22.5 + "@babel/helper-create-regexp-features-plugin": ^7.24.7 + "@babel/helper-plugin-utils": ^7.24.7 peerDependencies: "@babel/core": ^7.0.0 - checksum: 79d0b4c951955ca68235c87b91ab2b393c96285f8aeaa34d6db416d2ddac90000c9bd6e8c4d82b60a2b484da69930507245035f28ba63c6cae341cf3ba68fdef + checksum: 08a2844914f33dacd2ce1ab021ce8c1cc35dc6568521a746d8bf29c21571ee5be78787b454231c4bb3526cbbe280f1893223c82726cec5df2be5dae0a3b51837 languageName: node linkType: hard "@babel/preset-env@npm:^7.10.2": - version: 7.23.8 - resolution: "@babel/preset-env@npm:7.23.8" - dependencies: - "@babel/compat-data": ^7.23.5 - "@babel/helper-compilation-targets": ^7.23.6 - "@babel/helper-plugin-utils": ^7.22.5 - "@babel/helper-validator-option": ^7.23.5 - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": ^7.23.3 - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": ^7.23.3 - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": ^7.23.7 + version: 7.24.7 + resolution: "@babel/preset-env@npm:7.24.7" + dependencies: + "@babel/compat-data": ^7.24.7 + "@babel/helper-compilation-targets": ^7.24.7 + "@babel/helper-plugin-utils": ^7.24.7 + "@babel/helper-validator-option": ^7.24.7 + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": ^7.24.7 + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": ^7.24.7 + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": ^7.24.7 + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": ^7.24.7 "@babel/plugin-proposal-private-property-in-object": 7.21.0-placeholder-for-preset-env.2 "@babel/plugin-syntax-async-generators": ^7.8.4 "@babel/plugin-syntax-class-properties": ^7.12.13 "@babel/plugin-syntax-class-static-block": ^7.14.5 "@babel/plugin-syntax-dynamic-import": ^7.8.3 "@babel/plugin-syntax-export-namespace-from": ^7.8.3 - "@babel/plugin-syntax-import-assertions": ^7.23.3 - "@babel/plugin-syntax-import-attributes": ^7.23.3 + "@babel/plugin-syntax-import-assertions": ^7.24.7 + "@babel/plugin-syntax-import-attributes": ^7.24.7 "@babel/plugin-syntax-import-meta": ^7.10.4 "@babel/plugin-syntax-json-strings": ^7.8.3 "@babel/plugin-syntax-logical-assignment-operators": ^7.10.4 @@ -1230,63 +1243,63 @@ __metadata: "@babel/plugin-syntax-private-property-in-object": ^7.14.5 "@babel/plugin-syntax-top-level-await": ^7.14.5 "@babel/plugin-syntax-unicode-sets-regex": ^7.18.6 - "@babel/plugin-transform-arrow-functions": ^7.23.3 - "@babel/plugin-transform-async-generator-functions": ^7.23.7 - "@babel/plugin-transform-async-to-generator": ^7.23.3 - "@babel/plugin-transform-block-scoped-functions": ^7.23.3 - "@babel/plugin-transform-block-scoping": ^7.23.4 - "@babel/plugin-transform-class-properties": ^7.23.3 - "@babel/plugin-transform-class-static-block": ^7.23.4 - "@babel/plugin-transform-classes": ^7.23.8 - "@babel/plugin-transform-computed-properties": ^7.23.3 - "@babel/plugin-transform-destructuring": ^7.23.3 - "@babel/plugin-transform-dotall-regex": ^7.23.3 - "@babel/plugin-transform-duplicate-keys": ^7.23.3 - "@babel/plugin-transform-dynamic-import": ^7.23.4 - "@babel/plugin-transform-exponentiation-operator": ^7.23.3 - "@babel/plugin-transform-export-namespace-from": ^7.23.4 - "@babel/plugin-transform-for-of": ^7.23.6 - "@babel/plugin-transform-function-name": ^7.23.3 - "@babel/plugin-transform-json-strings": ^7.23.4 - "@babel/plugin-transform-literals": ^7.23.3 - "@babel/plugin-transform-logical-assignment-operators": ^7.23.4 - "@babel/plugin-transform-member-expression-literals": ^7.23.3 - "@babel/plugin-transform-modules-amd": ^7.23.3 - "@babel/plugin-transform-modules-commonjs": ^7.23.3 - "@babel/plugin-transform-modules-systemjs": ^7.23.3 - "@babel/plugin-transform-modules-umd": ^7.23.3 - "@babel/plugin-transform-named-capturing-groups-regex": ^7.22.5 - "@babel/plugin-transform-new-target": ^7.23.3 - "@babel/plugin-transform-nullish-coalescing-operator": ^7.23.4 - "@babel/plugin-transform-numeric-separator": ^7.23.4 - "@babel/plugin-transform-object-rest-spread": ^7.23.4 - "@babel/plugin-transform-object-super": ^7.23.3 - "@babel/plugin-transform-optional-catch-binding": ^7.23.4 - "@babel/plugin-transform-optional-chaining": ^7.23.4 - "@babel/plugin-transform-parameters": ^7.23.3 - "@babel/plugin-transform-private-methods": ^7.23.3 - "@babel/plugin-transform-private-property-in-object": ^7.23.4 - "@babel/plugin-transform-property-literals": ^7.23.3 - "@babel/plugin-transform-regenerator": ^7.23.3 - "@babel/plugin-transform-reserved-words": ^7.23.3 - "@babel/plugin-transform-shorthand-properties": ^7.23.3 - "@babel/plugin-transform-spread": ^7.23.3 - "@babel/plugin-transform-sticky-regex": ^7.23.3 - "@babel/plugin-transform-template-literals": ^7.23.3 - "@babel/plugin-transform-typeof-symbol": ^7.23.3 - "@babel/plugin-transform-unicode-escapes": ^7.23.3 - "@babel/plugin-transform-unicode-property-regex": ^7.23.3 - "@babel/plugin-transform-unicode-regex": ^7.23.3 - "@babel/plugin-transform-unicode-sets-regex": ^7.23.3 + "@babel/plugin-transform-arrow-functions": ^7.24.7 + "@babel/plugin-transform-async-generator-functions": ^7.24.7 + "@babel/plugin-transform-async-to-generator": ^7.24.7 + "@babel/plugin-transform-block-scoped-functions": ^7.24.7 + "@babel/plugin-transform-block-scoping": ^7.24.7 + "@babel/plugin-transform-class-properties": ^7.24.7 + "@babel/plugin-transform-class-static-block": ^7.24.7 + "@babel/plugin-transform-classes": ^7.24.7 + "@babel/plugin-transform-computed-properties": ^7.24.7 + "@babel/plugin-transform-destructuring": ^7.24.7 + "@babel/plugin-transform-dotall-regex": ^7.24.7 + "@babel/plugin-transform-duplicate-keys": ^7.24.7 + "@babel/plugin-transform-dynamic-import": ^7.24.7 + "@babel/plugin-transform-exponentiation-operator": ^7.24.7 + "@babel/plugin-transform-export-namespace-from": ^7.24.7 + "@babel/plugin-transform-for-of": ^7.24.7 + "@babel/plugin-transform-function-name": ^7.24.7 + "@babel/plugin-transform-json-strings": ^7.24.7 + "@babel/plugin-transform-literals": ^7.24.7 + "@babel/plugin-transform-logical-assignment-operators": ^7.24.7 + "@babel/plugin-transform-member-expression-literals": ^7.24.7 + "@babel/plugin-transform-modules-amd": ^7.24.7 + "@babel/plugin-transform-modules-commonjs": ^7.24.7 + "@babel/plugin-transform-modules-systemjs": ^7.24.7 + "@babel/plugin-transform-modules-umd": ^7.24.7 + "@babel/plugin-transform-named-capturing-groups-regex": ^7.24.7 + "@babel/plugin-transform-new-target": ^7.24.7 + "@babel/plugin-transform-nullish-coalescing-operator": ^7.24.7 + "@babel/plugin-transform-numeric-separator": ^7.24.7 + "@babel/plugin-transform-object-rest-spread": ^7.24.7 + "@babel/plugin-transform-object-super": ^7.24.7 + "@babel/plugin-transform-optional-catch-binding": ^7.24.7 + "@babel/plugin-transform-optional-chaining": ^7.24.7 + "@babel/plugin-transform-parameters": ^7.24.7 + "@babel/plugin-transform-private-methods": ^7.24.7 + "@babel/plugin-transform-private-property-in-object": ^7.24.7 + "@babel/plugin-transform-property-literals": ^7.24.7 + "@babel/plugin-transform-regenerator": ^7.24.7 + "@babel/plugin-transform-reserved-words": ^7.24.7 + "@babel/plugin-transform-shorthand-properties": ^7.24.7 + "@babel/plugin-transform-spread": ^7.24.7 + "@babel/plugin-transform-sticky-regex": ^7.24.7 + "@babel/plugin-transform-template-literals": ^7.24.7 + "@babel/plugin-transform-typeof-symbol": ^7.24.7 + "@babel/plugin-transform-unicode-escapes": ^7.24.7 + "@babel/plugin-transform-unicode-property-regex": ^7.24.7 + "@babel/plugin-transform-unicode-regex": ^7.24.7 + "@babel/plugin-transform-unicode-sets-regex": ^7.24.7 "@babel/preset-modules": 0.1.6-no-external-plugins - babel-plugin-polyfill-corejs2: ^0.4.7 - babel-plugin-polyfill-corejs3: ^0.8.7 - babel-plugin-polyfill-regenerator: ^0.5.4 + babel-plugin-polyfill-corejs2: ^0.4.10 + babel-plugin-polyfill-corejs3: ^0.10.4 + babel-plugin-polyfill-regenerator: ^0.6.1 core-js-compat: ^3.31.0 semver: ^6.3.1 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: b850f99fc4aed4ba22c7d9207bd2bbc7a729b49ea6f2c2c36e819fe209e309b96fba336096e555b46f791b39f7cdd5ac41246b556283d435a99106eb825a209f + checksum: 1a82c883c7404359b19b7436d0aab05f8dd4e89e8b1f7de127cc65d0ff6a9b1c345211d9c038f5b6e8f93d26f091fa9c73812d82851026ab4ec93f5ed0f0d675 languageName: node linkType: hard @@ -1310,52 +1323,52 @@ __metadata: languageName: node linkType: hard -"@babel/runtime@npm:^7.1.2, @babel/runtime@npm:^7.12.5, @babel/runtime@npm:^7.18.3, @babel/runtime@npm:^7.23.2, @babel/runtime@npm:^7.23.8, @babel/runtime@npm:^7.5.5, @babel/runtime@npm:^7.8.4, @babel/runtime@npm:^7.8.7": - version: 7.23.8 - resolution: "@babel/runtime@npm:7.23.8" +"@babel/runtime@npm:^7.12.5, @babel/runtime@npm:^7.18.3, @babel/runtime@npm:^7.23.2, @babel/runtime@npm:^7.23.9, @babel/runtime@npm:^7.5.5, @babel/runtime@npm:^7.8.4, @babel/runtime@npm:^7.8.7": + version: 7.24.7 + resolution: "@babel/runtime@npm:7.24.7" dependencies: regenerator-runtime: ^0.14.0 - checksum: 0bd5543c26811153822a9f382fd39886f66825ff2a397a19008011376533747cd05c33a91f6248c0b8b0edf0448d7c167ebfba34786088f1b7eb11c65be7dfc3 + checksum: d17f29eed6f848ac15cdf4202a910b741facfb0419a9d79e5c7fa37df6362fc3227f1cc2e248cc6db5e53ddffb4caa6686c488e6e80ce3d29c36a4e74c8734ea languageName: node linkType: hard -"@babel/template@npm:^7.22.15, @babel/template@npm:^7.3.3": - version: 7.22.15 - resolution: "@babel/template@npm:7.22.15" +"@babel/template@npm:^7.24.7, @babel/template@npm:^7.3.3": + version: 7.24.7 + resolution: "@babel/template@npm:7.24.7" dependencies: - "@babel/code-frame": ^7.22.13 - "@babel/parser": ^7.22.15 - "@babel/types": ^7.22.15 - checksum: 1f3e7dcd6c44f5904c184b3f7fe280394b191f2fed819919ffa1e529c259d5b197da8981b6ca491c235aee8dbad4a50b7e31304aa531271cb823a4a24a0dd8fd + "@babel/code-frame": ^7.24.7 + "@babel/parser": ^7.24.7 + "@babel/types": ^7.24.7 + checksum: ea90792fae708ddf1632e54c25fe1a86643d8c0132311f81265d2bdbdd42f9f4fac65457056c1b6ca87f7aa0d6a795b549566774bba064bdcea2034ab3960ee9 languageName: node linkType: hard -"@babel/traverse@npm:^7.23.7": - version: 7.23.7 - resolution: "@babel/traverse@npm:7.23.7" +"@babel/traverse@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/traverse@npm:7.24.7" dependencies: - "@babel/code-frame": ^7.23.5 - "@babel/generator": ^7.23.6 - "@babel/helper-environment-visitor": ^7.22.20 - "@babel/helper-function-name": ^7.23.0 - "@babel/helper-hoist-variables": ^7.22.5 - "@babel/helper-split-export-declaration": ^7.22.6 - "@babel/parser": ^7.23.6 - "@babel/types": ^7.23.6 + "@babel/code-frame": ^7.24.7 + "@babel/generator": ^7.24.7 + "@babel/helper-environment-visitor": ^7.24.7 + "@babel/helper-function-name": ^7.24.7 + "@babel/helper-hoist-variables": ^7.24.7 + "@babel/helper-split-export-declaration": ^7.24.7 + "@babel/parser": ^7.24.7 + "@babel/types": ^7.24.7 debug: ^4.3.1 globals: ^11.1.0 - checksum: d4a7afb922361f710efc97b1e25ec343fab8b2a4ddc81ca84f9a153f22d4482112cba8f263774be8d297918b6c4767c7a98988ab4e53ac73686c986711dd002e + checksum: 7cd366afe9e7ee77e493779fdf24f67bf5595247289364f4689e29688572505eaeb886d7a8f20ebb9c29fc2de7d0895e4ff9e203e78e39ac67239724d45aa83b languageName: node linkType: hard -"@babel/types@npm:^7.0.0, @babel/types@npm:^7.20.7, @babel/types@npm:^7.22.15, @babel/types@npm:^7.22.19, @babel/types@npm:^7.22.5, @babel/types@npm:^7.23.0, @babel/types@npm:^7.23.6, @babel/types@npm:^7.3.3, @babel/types@npm:^7.4.4, @babel/types@npm:^7.8.3": - version: 7.23.6 - resolution: "@babel/types@npm:7.23.6" +"@babel/types@npm:^7.0.0, @babel/types@npm:^7.20.7, @babel/types@npm:^7.24.7, @babel/types@npm:^7.3.3, @babel/types@npm:^7.4.4, @babel/types@npm:^7.8.3": + version: 7.24.7 + resolution: "@babel/types@npm:7.24.7" dependencies: - "@babel/helper-string-parser": ^7.23.4 - "@babel/helper-validator-identifier": ^7.22.20 + "@babel/helper-string-parser": ^7.24.7 + "@babel/helper-validator-identifier": ^7.24.7 to-fast-properties: ^2.0.0 - checksum: 68187dbec0d637f79bc96263ac95ec8b06d424396678e7e225492be866414ce28ebc918a75354d4c28659be6efe30020b4f0f6df81cc418a2d30645b690a8de0 + checksum: 3e4437fced97e02982972ce5bebd318c47d42c9be2152c0fd28c6f786cc74086cc0a8fb83b602b846e41df37f22c36254338eada1a47ef9d8a1ec92332ca3ea8 languageName: node linkType: hard @@ -1366,9 +1379,9 @@ __metadata: languageName: node linkType: hard -"@codemirror/autocomplete@npm:^6.0.0, @codemirror/autocomplete@npm:^6.3.2, @codemirror/autocomplete@npm:^6.5.1, @codemirror/autocomplete@npm:^6.7.1": - version: 6.12.0 - resolution: "@codemirror/autocomplete@npm:6.12.0" +"@codemirror/autocomplete@npm:^6.0.0, @codemirror/autocomplete@npm:^6.15.0, @codemirror/autocomplete@npm:^6.3.2, @codemirror/autocomplete@npm:^6.7.1": + version: 6.16.3 + resolution: "@codemirror/autocomplete@npm:6.16.3" dependencies: "@codemirror/language": ^6.0.0 "@codemirror/state": ^6.0.0 @@ -1379,19 +1392,19 @@ __metadata: "@codemirror/state": ^6.0.0 "@codemirror/view": ^6.0.0 "@lezer/common": ^1.0.0 - checksum: 1d4da6ccc12f5a67053a76b361f2683b5af031dd405a0bd2a261a265eb8cb7dfb115343a3291260d1ba31ce7ccb5427208ebe50f50f6747fcf27a50b62c87f7e + checksum: bd38808c9c143c61f2d4a4f8532a376614a511000e31dea1c7ea38240b707bd8b94a95141b592aeb62ee9ed39050af58a218926834c28e6867ab32c482ecd374 languageName: node linkType: hard -"@codemirror/commands@npm:^6.2.3": - version: 6.3.3 - resolution: "@codemirror/commands@npm:6.3.3" +"@codemirror/commands@npm:^6.3.3": + version: 6.6.0 + resolution: "@codemirror/commands@npm:6.6.0" dependencies: "@codemirror/language": ^6.0.0 "@codemirror/state": ^6.4.0 - "@codemirror/view": ^6.0.0 + "@codemirror/view": ^6.27.0 "@lezer/common": ^1.1.0 - checksum: 7d23aecc973823969434b839aefa9a98bb47212d2ce0e6869ae903adbb5233aad22a760788fb7bb6eb45b00b01a4932fb93ad43bacdcbc0215e7500cf54b17bb + checksum: 53bb29f11f4453b7409836c41a9c13c0a8cb300e05ecc4928217330cf6e6735b1e5fb7fb831a2b1b8636593d6f3da42d016196ee1c8bb424f9cb73d55b8cb884 languageName: node linkType: hard @@ -1405,7 +1418,7 @@ __metadata: languageName: node linkType: hard -"@codemirror/lang-css@npm:^6.0.0, @codemirror/lang-css@npm:^6.1.1": +"@codemirror/lang-css@npm:^6.0.0, @codemirror/lang-css@npm:^6.2.1": version: 6.2.1 resolution: "@codemirror/lang-css@npm:6.2.1" dependencies: @@ -1418,9 +1431,9 @@ __metadata: languageName: node linkType: hard -"@codemirror/lang-html@npm:^6.0.0, @codemirror/lang-html@npm:^6.4.3": - version: 6.4.7 - resolution: "@codemirror/lang-html@npm:6.4.7" +"@codemirror/lang-html@npm:^6.0.0, @codemirror/lang-html@npm:^6.4.8": + version: 6.4.9 + resolution: "@codemirror/lang-html@npm:6.4.9" dependencies: "@codemirror/autocomplete": ^6.0.0 "@codemirror/lang-css": ^6.0.0 @@ -1431,7 +1444,7 @@ __metadata: "@lezer/common": ^1.0.0 "@lezer/css": ^1.1.0 "@lezer/html": ^1.3.0 - checksum: 26e3d9243bd8dea2c0f7769315f8ed4b77969497f52c545c84ff32f155489b3a29e476aa78ffc11e910a0f927bbebce4d28f4e17e1994f6c9d8df6bdd3c33ef1 + checksum: ac8c3ceb0396f2e032752c5079bd950124dca708bc64e96fc147dc5fe7133e5cee0814fe951abdb953ec1d11fa540e4b30a712b5149d9a36016a197a28de45d7 languageName: node linkType: hard @@ -1445,9 +1458,9 @@ __metadata: languageName: node linkType: hard -"@codemirror/lang-javascript@npm:^6.0.0, @codemirror/lang-javascript@npm:^6.1.7": - version: 6.2.1 - resolution: "@codemirror/lang-javascript@npm:6.2.1" +"@codemirror/lang-javascript@npm:^6.0.0, @codemirror/lang-javascript@npm:^6.2.2": + version: 6.2.2 + resolution: "@codemirror/lang-javascript@npm:6.2.2" dependencies: "@codemirror/autocomplete": ^6.0.0 "@codemirror/language": ^6.6.0 @@ -1456,7 +1469,7 @@ __metadata: "@codemirror/view": ^6.17.0 "@lezer/common": ^1.0.0 "@lezer/javascript": ^1.0.0 - checksum: 3df38c4cced06195283a9a2a9365aaa7c8c1b157852b331bc3a118403f774bbba57d2a392de52f5e28d2b344a323bc0146bcf7c8ef8be2473f167d815e4a37cd + checksum: 66379942a8347dff2bd76d10ed7cf313bca83872f8336fdd3e14accfef23e7b690cd913c9d11a3854fba2b32299da07fc3275995327642c9ee43c2a8e538c19d languageName: node linkType: hard @@ -1470,9 +1483,9 @@ __metadata: languageName: node linkType: hard -"@codemirror/lang-markdown@npm:^6.1.1": - version: 6.2.4 - resolution: "@codemirror/lang-markdown@npm:6.2.4" +"@codemirror/lang-markdown@npm:^6.2.4": + version: 6.2.5 + resolution: "@codemirror/lang-markdown@npm:6.2.5" dependencies: "@codemirror/autocomplete": ^6.7.1 "@codemirror/lang-html": ^6.0.0 @@ -1481,7 +1494,7 @@ __metadata: "@codemirror/view": ^6.0.0 "@lezer/common": ^1.2.1 "@lezer/markdown": ^1.0.0 - checksum: fbdf1388a9fd08b4e6fc9950ac57fc59ef02bb0bd3e76654158ce1494b101356ded049b65dcf6da457e7e302cb178bf30852fd152680f3a8679be3c3884c0bc2 + checksum: 3d9e0817f888eddcb6d05ec8f0d8dacbde7b9ef7650303bc4ab8b08a550a986c60c65b1565212e06af389c31590330f1f5ed65e619a9446dc2979ff3dac0e874 languageName: node linkType: hard @@ -1498,14 +1511,16 @@ __metadata: languageName: node linkType: hard -"@codemirror/lang-python@npm:^6.1.3": - version: 6.1.3 - resolution: "@codemirror/lang-python@npm:6.1.3" +"@codemirror/lang-python@npm:^6.1.4": + version: 6.1.6 + resolution: "@codemirror/lang-python@npm:6.1.6" dependencies: "@codemirror/autocomplete": ^6.3.2 "@codemirror/language": ^6.8.0 + "@codemirror/state": ^6.0.0 + "@lezer/common": ^1.2.1 "@lezer/python": ^1.1.4 - checksum: 65a0276a4503e4e3b70dd28d1c93ef472632b6d2c4bf3ae92d305d14ee8cf60b0bbbf62d5ceb51294de9598d9e2d42eafcde26f317ee7b90d0a11dfa863c1d1a + checksum: eb1faabd332bb95d0f3e227eb19ac5a31140cf238905bbe73e061040999f5680a012f9145fb3688bc2fcbb1908c957511edc8eeb8a9aa88d27d4fa55ad451e95 languageName: node linkType: hard @@ -1519,9 +1534,9 @@ __metadata: languageName: node linkType: hard -"@codemirror/lang-sql@npm:^6.4.1": - version: 6.5.5 - resolution: "@codemirror/lang-sql@npm:6.5.5" +"@codemirror/lang-sql@npm:^6.6.1": + version: 6.7.0 + resolution: "@codemirror/lang-sql@npm:6.7.0" dependencies: "@codemirror/autocomplete": ^6.0.0 "@codemirror/language": ^6.0.0 @@ -1529,11 +1544,11 @@ __metadata: "@lezer/common": ^1.2.0 "@lezer/highlight": ^1.0.0 "@lezer/lr": ^1.0.0 - checksum: 404003ae73b986bd7a00f6924db78b7ffb28fdc38d689fdc11416aaafe2d5c6dc37cc18972530f82e940acb61e18ac74a1cf7712beef448c145344ff93970dc3 + checksum: 54d39fa81deebb19501b5abd5d9da38edeafc607e890b9efb91cb4dd49324de3aa80ca1cc0c5c42a6de94662ac68135dcd976289598de48bef1baf0beb9ddab4 languageName: node linkType: hard -"@codemirror/lang-wast@npm:^6.0.1": +"@codemirror/lang-wast@npm:^6.0.2": version: 6.0.2 resolution: "@codemirror/lang-wast@npm:6.0.2" dependencies: @@ -1545,22 +1560,23 @@ __metadata: languageName: node linkType: hard -"@codemirror/lang-xml@npm:^6.0.2": - version: 6.0.2 - resolution: "@codemirror/lang-xml@npm:6.0.2" +"@codemirror/lang-xml@npm:^6.1.0": + version: 6.1.0 + resolution: "@codemirror/lang-xml@npm:6.1.0" dependencies: "@codemirror/autocomplete": ^6.0.0 "@codemirror/language": ^6.4.0 "@codemirror/state": ^6.0.0 + "@codemirror/view": ^6.0.0 "@lezer/common": ^1.0.0 "@lezer/xml": ^1.0.0 - checksum: e156ecafaa87e9b6ef4ab6812ccd00d8f3c6cb81f232837636b36336d80513b61936dfee6f4f6800574f236208b61e95a2abcb997cdcd7366585a6b796e0e13b + checksum: 3a1b7af07b29ad7e53b77bf584245580b613bc92256059f175f2b1d7c28c4e39b75654fe169b9a8a330a60164b53ff5254bdb5b8ee8c6e6766427ee115c4e229 languageName: node linkType: hard -"@codemirror/language@npm:^6.0.0, @codemirror/language@npm:^6.3.0, @codemirror/language@npm:^6.4.0, @codemirror/language@npm:^6.6.0, @codemirror/language@npm:^6.8.0": - version: 6.10.0 - resolution: "@codemirror/language@npm:6.10.0" +"@codemirror/language@npm:^6.0.0, @codemirror/language@npm:^6.10.1, @codemirror/language@npm:^6.3.0, @codemirror/language@npm:^6.4.0, @codemirror/language@npm:^6.6.0, @codemirror/language@npm:^6.8.0": + version: 6.10.2 + resolution: "@codemirror/language@npm:6.10.2" dependencies: "@codemirror/state": ^6.0.0 "@codemirror/view": ^6.23.0 @@ -1568,91 +1584,91 @@ __metadata: "@lezer/highlight": ^1.0.0 "@lezer/lr": ^1.0.0 style-mod: ^4.0.0 - checksum: 3bfd9968f5a34ce22434489a5b226db5f3bc454a1ae7c4381587ff4270ac6af61b10f93df560cb73e9a77cc13d4843722a7a7b94dbed02a3ab1971dd329b9e81 + checksum: 4e60afb75fb56519f59d9d85e0aa03f0c8d017e0da0f3f8f321baf35a776801fcec9787f3d0c029eba12aa766fba98b0fe86fc3111b43e0812b554184c0e8d67 languageName: node linkType: hard -"@codemirror/legacy-modes@npm:^6.3.2": - version: 6.3.3 - resolution: "@codemirror/legacy-modes@npm:6.3.3" +"@codemirror/legacy-modes@npm:^6.3.3": + version: 6.4.0 + resolution: "@codemirror/legacy-modes@npm:6.4.0" dependencies: "@codemirror/language": ^6.0.0 - checksum: 3cd32b0f011b0a193e0948e5901b625f38aa6d9a8b24344531d6e142eb6fbb3e6cb5969429102044f3d04fbe53c4deaebd9f659c05067a0b18d17766290c9e05 + checksum: d382aa6f640a67418bd209e1e4b395340f96aac1b0cf185927fc2c7f98b62cfd0c59ef0f7048148ce8771622003ca844c78c2d18548235ecc57d0bcbfbbfe091 languageName: node linkType: hard "@codemirror/lint@npm:^6.0.0": - version: 6.4.2 - resolution: "@codemirror/lint@npm:6.4.2" + version: 6.8.1 + resolution: "@codemirror/lint@npm:6.8.1" dependencies: "@codemirror/state": ^6.0.0 "@codemirror/view": ^6.0.0 crelt: ^1.0.5 - checksum: 5e699960c1b28dbaa584fe091a3201978907bf4b9e52810fb15d3ceaf310e38053435e0b594da0985266ae812039a5cd6c36023284a6f8568664bdca04db137f + checksum: faa222b679770baf094ea707251e27d6eef347157006223c22d7726fb5adc9d77257f36c366367ec729cb6286aca3276d30a470e0d0ea9a884ec948e798668e9 languageName: node linkType: hard -"@codemirror/search@npm:^6.3.0": - version: 6.5.5 - resolution: "@codemirror/search@npm:6.5.5" +"@codemirror/search@npm:^6.5.6": + version: 6.5.6 + resolution: "@codemirror/search@npm:6.5.6" dependencies: "@codemirror/state": ^6.0.0 "@codemirror/view": ^6.0.0 crelt: ^1.0.5 - checksum: 825196ef63273494ba9a6153b01eda385edb65e77a1e49980dd3a28d4a692af1e9575e03e4b6c84f6fa2afe72217113ff4c50f58b20d13fe0d277cda5dd7dc81 + checksum: 19dc88d09fc750563347001e83c6194bbb2a25c874bd919d2d81809e1f98d6330222ddbd284aa9758a09eeb41fd153ec7c2cf810b2ee51452c25963d7f5833d5 languageName: node linkType: hard -"@codemirror/state@npm:^6.0.0, @codemirror/state@npm:^6.2.0, @codemirror/state@npm:^6.4.0": - version: 6.4.0 - resolution: "@codemirror/state@npm:6.4.0" - checksum: c5236fe5786f1b85d17273a5c17fa8aeb063658c1404ab18caeb6e7591663ec96b65d453ab8162f75839c3801b04cd55ba4bc48f44cb61ebfeeee383f89553c7 +"@codemirror/state@npm:^6.0.0, @codemirror/state@npm:^6.4.0, @codemirror/state@npm:^6.4.1": + version: 6.4.1 + resolution: "@codemirror/state@npm:6.4.1" + checksum: b81b55574091349eed4d32fc0eadb0c9688f1f7c98b681318f59138ee0f527cb4c4a97831b70547c0640f02f3127647838ae6730782de4a3dd2cc58836125d01 languageName: node linkType: hard -"@codemirror/view@npm:^6.0.0, @codemirror/view@npm:^6.17.0, @codemirror/view@npm:^6.23.0, @codemirror/view@npm:^6.9.6": - version: 6.23.0 - resolution: "@codemirror/view@npm:6.23.0" +"@codemirror/view@npm:^6.0.0, @codemirror/view@npm:^6.17.0, @codemirror/view@npm:^6.23.0, @codemirror/view@npm:^6.26.0, @codemirror/view@npm:^6.27.0": + version: 6.28.3 + resolution: "@codemirror/view@npm:6.28.3" dependencies: "@codemirror/state": ^6.4.0 style-mod: ^4.1.0 w3c-keyname: ^2.2.4 - checksum: 6e5f2314a3da2c724dc6a525654d949d3f2fcf7009f4d85f980d52ddc885c8969717e903ca1d9132afbe7c524af5d19bff8285fd394106282a965ae83aa47db4 + checksum: 00aa8d1e3c18ae36dfedb1e86b21873f1f4694772274525ad91276a3b49185cbb5d113f0e36fb542e17c2727b7fbe322e9aedc99f23e358ee5b2e31cedca663b languageName: node linkType: hard "@csstools/css-parser-algorithms@npm:^2.3.1": - version: 2.5.0 - resolution: "@csstools/css-parser-algorithms@npm:2.5.0" + version: 2.7.0 + resolution: "@csstools/css-parser-algorithms@npm:2.7.0" peerDependencies: - "@csstools/css-tokenizer": ^2.2.3 - checksum: 6bfbdb4052acca48de9db0806a1b18458709103390656634ebe3cf0390048a6e9b304b78173fbcd524e03669dacb5cc3bedbe8008c354ff9511aed4935dcfc6f + "@csstools/css-tokenizer": ^2.3.2 + checksum: 25f27d0b647ee2a215f27b7b41e0e3337f6df93bf8b53e6e86f25b6089dd3d8597133919c1c107b5a8c737c83176305ab7818448348036cbacae30cf70c4433c languageName: node linkType: hard "@csstools/css-tokenizer@npm:^2.2.0": - version: 2.2.3 - resolution: "@csstools/css-tokenizer@npm:2.2.3" - checksum: a2a69f0de516046f85b8f47916879780f9712bdda8166ab01dd47613515ff5a0771555c78badd220686bc1dae3cb0eea5de6896e1e326247a276cc8965520aa6 + version: 2.3.2 + resolution: "@csstools/css-tokenizer@npm:2.3.2" + checksum: 40c0eaba3f46134c4b8952d25c3076a69463b55c82a5b4bf9be344b3db544c6fee2d1ddb2dd7dd0afb8a347a1903b050c29c83c981aa0f8c3f33fc795bf21e58 languageName: node linkType: hard "@csstools/media-query-list-parser@npm:^2.1.4": - version: 2.1.7 - resolution: "@csstools/media-query-list-parser@npm:2.1.7" + version: 2.1.12 + resolution: "@csstools/media-query-list-parser@npm:2.1.12" peerDependencies: - "@csstools/css-parser-algorithms": ^2.5.0 - "@csstools/css-tokenizer": ^2.2.3 - checksum: f910d9c29c84e828d121f451607fe9c275297041f317075ede935ffacdd7fd53fcbc0dd4993585e405b5337b7f991b864d101dff3cb8fc400e8c32a9aedbfe69 + "@csstools/css-parser-algorithms": ^2.7.0 + "@csstools/css-tokenizer": ^2.3.2 + checksum: 0c2655cf247fcae3ab5ea9a38264567c5d590d0b3f7d96d33cb92253e95acab25a60d66f70c15e7bf75365fa796bf19d5387991a110dd8b38ed5b1767573e113 languageName: node linkType: hard "@csstools/selector-specificity@npm:^3.0.0": - version: 3.0.1 - resolution: "@csstools/selector-specificity@npm:3.0.1" + version: 3.1.1 + resolution: "@csstools/selector-specificity@npm:3.1.1" peerDependencies: postcss-selector-parser: ^6.0.13 - checksum: e4b5aac3bd3ca1f824cb9578f52b16046a519aa8050ce291da37e611976a83cd3b2b2f908d2678dd4cbbe00bbde8ec28c34fffc40dbbf9a13608dfcaf382ee80 + checksum: 3786a6afea97b08ad739ee8f4004f7e0a9e25049cee13af809dbda6462090744012a54bd9275a44712791e8f103f85d21641f14e81799f9dab946b0459a5e1ef languageName: node linkType: hard @@ -1702,12 +1718,12 @@ __metadata: languageName: node linkType: hard -"@emotion/is-prop-valid@npm:^1.2.1": - version: 1.2.1 - resolution: "@emotion/is-prop-valid@npm:1.2.1" +"@emotion/is-prop-valid@npm:^1.2.2": + version: 1.2.2 + resolution: "@emotion/is-prop-valid@npm:1.2.2" dependencies: "@emotion/memoize": ^0.8.1 - checksum: 8f42dc573a3fad79b021479becb639b8fe3b60bdd1081a775d32388bca418ee53074c7602a4c845c5f75fa6831eb1cbdc4d208cc0299f57014ed3a02abcad16a + checksum: 61f6b128ea62b9f76b47955057d5d86fcbe2a6989d2cd1e583daac592901a950475a37d049b9f7a7c6aa8758a33b408735db759fdedfd1f629df0f85ab60ea25 languageName: node linkType: hard @@ -1719,8 +1735,8 @@ __metadata: linkType: hard "@emotion/react@npm:^11.11.1": - version: 11.11.3 - resolution: "@emotion/react@npm:11.11.3" + version: 11.11.4 + resolution: "@emotion/react@npm:11.11.4" dependencies: "@babel/runtime": ^7.18.3 "@emotion/babel-plugin": ^11.11.0 @@ -1735,20 +1751,20 @@ __metadata: peerDependenciesMeta: "@types/react": optional: true - checksum: 2e4b223591569f0a41686d5bd72dc8778629b7be33267e4a09582979e6faee4d7218de84e76294ed827058d4384d75557b5d71724756539c1f235e9a69e62b2e + checksum: 6abaa7a05c5e1db31bffca7ac79169f5456990022cbb3794e6903221536609a60420f2b4888dd3f84e9634a304e394130cb88dc32c243a1dedc263e50da329f8 languageName: node linkType: hard -"@emotion/serialize@npm:^1.1.2, @emotion/serialize@npm:^1.1.3": - version: 1.1.3 - resolution: "@emotion/serialize@npm:1.1.3" +"@emotion/serialize@npm:^1.1.2, @emotion/serialize@npm:^1.1.3, @emotion/serialize@npm:^1.1.4": + version: 1.1.4 + resolution: "@emotion/serialize@npm:1.1.4" dependencies: "@emotion/hash": ^0.9.1 "@emotion/memoize": ^0.8.1 "@emotion/unitless": ^0.8.1 "@emotion/utils": ^1.2.1 csstype: ^3.0.2 - checksum: 5a756ce7e2692322683978d8ed2e84eadd60bd6f629618a82c5018c84d98684b117e57fad0174f68ec2ec0ac089bb2e0bcc8ea8c2798eb904b6d3236aa046063 + checksum: 71b99f816a9c1d61a87c62cf4928da3894bb62213f3aff38b1ea9790b3368f084af98a3e5453b5055c2f36a7d70318d2fa9955b7b5676c2065b868062375df39 languageName: node linkType: hard @@ -1760,13 +1776,13 @@ __metadata: linkType: hard "@emotion/styled@npm:^11.11.0": - version: 11.11.0 - resolution: "@emotion/styled@npm:11.11.0" + version: 11.11.5 + resolution: "@emotion/styled@npm:11.11.5" dependencies: "@babel/runtime": ^7.18.3 "@emotion/babel-plugin": ^11.11.0 - "@emotion/is-prop-valid": ^1.2.1 - "@emotion/serialize": ^1.1.2 + "@emotion/is-prop-valid": ^1.2.2 + "@emotion/serialize": ^1.1.4 "@emotion/use-insertion-effect-with-fallbacks": ^1.0.1 "@emotion/utils": ^1.2.1 peerDependencies: @@ -1775,7 +1791,7 @@ __metadata: peerDependenciesMeta: "@types/react": optional: true - checksum: 904f641aad3892c65d7d6c0808b036dae1e6d6dad4861c1c7dc0baa59977047c6cad220691206eba7b4059f1a1c6e6c1ef4ebb8c829089e280fa0f2164a01e6b + checksum: ad5fc42d00e8aa9597f6d9665986036d5ebe0e8f8155af6d95831c5e8fb2319fb837724e6c5cd59e5346f14c3263711b7ce7271d34688e974d1f32ffeecb37ba languageName: node linkType: hard @@ -1821,9 +1837,9 @@ __metadata: linkType: hard "@eslint-community/regexpp@npm:^4.5.1, @eslint-community/regexpp@npm:^4.6.1": - version: 4.10.0 - resolution: "@eslint-community/regexpp@npm:4.10.0" - checksum: 2a6e345429ea8382aaaf3a61f865cae16ed44d31ca917910033c02dc00d505d939f10b81e079fa14d43b51499c640138e153b7e40743c4c094d9df97d4e56f7b + version: 4.11.0 + resolution: "@eslint-community/regexpp@npm:4.11.0" + checksum: 97d2fe46690b69417a551bd19a3dc53b6d9590d2295c43cc4c4e44e64131af541e2f4a44d5c12e87de990403654d3dae9d33600081f3a2f0386b368abc9111ec languageName: node linkType: hard @@ -1844,48 +1860,48 @@ __metadata: languageName: node linkType: hard -"@eslint/js@npm:8.56.0": - version: 8.56.0 - resolution: "@eslint/js@npm:8.56.0" - checksum: 5804130574ef810207bdf321c265437814e7a26f4e6fac9b496de3206afd52f533e09ec002a3be06cd9adcc9da63e727f1883938e663c4e4751c007d5b58e539 +"@eslint/js@npm:8.57.0": + version: 8.57.0 + resolution: "@eslint/js@npm:8.57.0" + checksum: 315dc65b0e9893e2bff139bddace7ea601ad77ed47b4550e73da8c9c2d2766c7a575c3cddf17ef85b8fd6a36ff34f91729d0dcca56e73ca887c10df91a41b0bb languageName: node linkType: hard -"@floating-ui/core@npm:^1.5.3": - version: 1.5.3 - resolution: "@floating-ui/core@npm:1.5.3" +"@floating-ui/core@npm:^1.6.0": + version: 1.6.4 + resolution: "@floating-ui/core@npm:1.6.4" dependencies: - "@floating-ui/utils": ^0.2.0 - checksum: 72af8563e1742791acee82e86f82a0fbca7445809988d31eea3fd5771909463aa7655a6cb001cc244f8fe3a9de600420257e4dfb887ca33e2a31ac47b52e39a2 + "@floating-ui/utils": ^0.2.4 + checksum: 6855472c00ceaa14e0f1cb4bd5de0de01d05cd46bdf12cb19bd6a89fa70bdfba0460a776dc50d28ab40e3bddc291e2211958497528fdd98653ea7260d61e0442 languageName: node linkType: hard -"@floating-ui/dom@npm:^1.5.4": - version: 1.5.4 - resolution: "@floating-ui/dom@npm:1.5.4" +"@floating-ui/dom@npm:^1.0.0": + version: 1.6.7 + resolution: "@floating-ui/dom@npm:1.6.7" dependencies: - "@floating-ui/core": ^1.5.3 - "@floating-ui/utils": ^0.2.0 - checksum: 5e6f05532ff4e6daf9f2d91534184d8f942ddb8fd260c2543a49bdf0c0ff69fd0867937ce1d023126008724ac238f8fc89b5e48f82cdf9f8355a1d04edd085bd + "@floating-ui/core": ^1.6.0 + "@floating-ui/utils": ^0.2.4 + checksum: 66605a2948bfe7532408197b4c522fecf04cf11e7839623d0dca0d22362b42d64a5db2f3be865053e9b0d44c89faf1befa9a4ce1b7fa595d1b3dc82f635d079c languageName: node linkType: hard -"@floating-ui/react-dom@npm:^2.0.5": - version: 2.0.6 - resolution: "@floating-ui/react-dom@npm:2.0.6" +"@floating-ui/react-dom@npm:^2.0.8": + version: 2.1.1 + resolution: "@floating-ui/react-dom@npm:2.1.1" dependencies: - "@floating-ui/dom": ^1.5.4 + "@floating-ui/dom": ^1.0.0 peerDependencies: react: ">=16.8.0" react-dom: ">=16.8.0" - checksum: 3608537be6cae5f0442d3f826379b8e4a9ce5c4bdecf1d2b34e6709842d80444be1a00eca3641d680e2e6405d833092f58005d1b120a9d39ffd341c60b0c017c + checksum: 6d1a023e6b0a3f298117223d8cdb0a4767f24469d193181da7002f692b756ccafb1e9756c242fa0c072f8ab8a5710ea7cf5cf2a6e92278d1fcd6f0fc0586c27c languageName: node linkType: hard -"@floating-ui/utils@npm:^0.2.0": - version: 0.2.1 - resolution: "@floating-ui/utils@npm:0.2.1" - checksum: 9ed4380653c7c217cd6f66ae51f20fdce433730dbc77f95b5abfb5a808f5fdb029c6ae249b4e0490a816f2453aa6e586d9a873cd157fdba4690f65628efc6e06 +"@floating-ui/utils@npm:^0.2.4": + version: 0.2.4 + resolution: "@floating-ui/utils@npm:0.2.4" + checksum: af44cdb3f394fbee6abc933fc3c25bf22f3f0bac58150eee8cc1dcc7e9be56a19b13e438820160614a90712e5a43f84b091afa6689318a10504042930ae9cf44 languageName: node linkType: hard @@ -1896,7 +1912,7 @@ __metadata: languageName: node linkType: hard -"@humanwhocodes/config-array@npm:^0.11.13": +"@humanwhocodes/config-array@npm:^0.11.14": version: 0.11.14 resolution: "@humanwhocodes/config-array@npm:0.11.14" dependencies: @@ -1915,9 +1931,9 @@ __metadata: linkType: hard "@humanwhocodes/object-schema@npm:^2.0.2": - version: 2.0.2 - resolution: "@humanwhocodes/object-schema@npm:2.0.2" - checksum: 2fc11503361b5fb4f14714c700c02a3f4c7c93e9acd6b87a29f62c522d90470f364d6161b03d1cc618b979f2ae02aed1106fd29d302695d8927e2fc8165ba8ee + version: 2.0.3 + resolution: "@humanwhocodes/object-schema@npm:2.0.3" + checksum: d3b78f6c5831888c6ecc899df0d03bcc25d46f3ad26a11d7ea52944dc36a35ef543fad965322174238d677a43d5c694434f6607532cff7077062513ad7022631 languageName: node linkType: hard @@ -1948,7 +1964,7 @@ __metadata: languageName: node linkType: hard -"@istanbuljs/schema@npm:^0.1.2": +"@istanbuljs/schema@npm:^0.1.2, @istanbuljs/schema@npm:^0.1.3": version: 0.1.3 resolution: "@istanbuljs/schema@npm:0.1.3" checksum: 5282759d961d61350f33d9118d16bcaed914ebf8061a52f4fa474b2cb08720c9c81d165e13b82f2e5a8a212cc5af482f0c6fc1ac27b9e067e5394c9a6ed186c9 @@ -2185,38 +2201,38 @@ __metadata: languageName: node linkType: hard -"@jridgewell/gen-mapping@npm:^0.3.0, @jridgewell/gen-mapping@npm:^0.3.2": - version: 0.3.3 - resolution: "@jridgewell/gen-mapping@npm:0.3.3" +"@jridgewell/gen-mapping@npm:^0.3.5": + version: 0.3.5 + resolution: "@jridgewell/gen-mapping@npm:0.3.5" dependencies: - "@jridgewell/set-array": ^1.0.1 + "@jridgewell/set-array": ^1.2.1 "@jridgewell/sourcemap-codec": ^1.4.10 - "@jridgewell/trace-mapping": ^0.3.9 - checksum: 4a74944bd31f22354fc01c3da32e83c19e519e3bbadafa114f6da4522ea77dd0c2842607e923a591d60a76699d819a2fbb6f3552e277efdb9b58b081390b60ab + "@jridgewell/trace-mapping": ^0.3.24 + checksum: ff7a1764ebd76a5e129c8890aa3e2f46045109dabde62b0b6c6a250152227647178ff2069ea234753a690d8f3c4ac8b5e7b267bbee272bffb7f3b0a370ab6e52 languageName: node linkType: hard "@jridgewell/resolve-uri@npm:^3.1.0": - version: 3.1.1 - resolution: "@jridgewell/resolve-uri@npm:3.1.1" - checksum: f5b441fe7900eab4f9155b3b93f9800a916257f4e8563afbcd3b5a5337b55e52bd8ae6735453b1b745457d9f6cdb16d74cd6220bbdd98cf153239e13f6cbb653 + version: 3.1.2 + resolution: "@jridgewell/resolve-uri@npm:3.1.2" + checksum: 83b85f72c59d1c080b4cbec0fef84528963a1b5db34e4370fa4bd1e3ff64a0d80e0cee7369d11d73c704e0286fb2865b530acac7a871088fbe92b5edf1000870 languageName: node linkType: hard -"@jridgewell/set-array@npm:^1.0.1": - version: 1.1.2 - resolution: "@jridgewell/set-array@npm:1.1.2" - checksum: 69a84d5980385f396ff60a175f7177af0b8da4ddb81824cb7016a9ef914eee9806c72b6b65942003c63f7983d4f39a5c6c27185bbca88eb4690b62075602e28e +"@jridgewell/set-array@npm:^1.2.1": + version: 1.2.1 + resolution: "@jridgewell/set-array@npm:1.2.1" + checksum: 832e513a85a588f8ed4f27d1279420d8547743cc37fcad5a5a76fc74bb895b013dfe614d0eed9cb860048e6546b798f8f2652020b4b2ba0561b05caa8c654b10 languageName: node linkType: hard "@jridgewell/source-map@npm:^0.3.3": - version: 0.3.5 - resolution: "@jridgewell/source-map@npm:0.3.5" + version: 0.3.6 + resolution: "@jridgewell/source-map@npm:0.3.6" dependencies: - "@jridgewell/gen-mapping": ^0.3.0 - "@jridgewell/trace-mapping": ^0.3.9 - checksum: 1ad4dec0bdafbade57920a50acec6634f88a0eb735851e0dda906fa9894e7f0549c492678aad1a10f8e144bfe87f238307bf2a914a1bc85b7781d345417e9f6f + "@jridgewell/gen-mapping": ^0.3.5 + "@jridgewell/trace-mapping": ^0.3.25 + checksum: c9dc7d899397df95e3c9ec287b93c0b56f8e4453cd20743e2b9c8e779b1949bc3cccf6c01bb302779e46560eb45f62ea38d19fedd25370d814734268450a9f30 languageName: node linkType: hard @@ -2227,19 +2243,42 @@ __metadata: languageName: node linkType: hard -"@jridgewell/trace-mapping@npm:^0.3.12, @jridgewell/trace-mapping@npm:^0.3.17, @jridgewell/trace-mapping@npm:^0.3.18, @jridgewell/trace-mapping@npm:^0.3.20, @jridgewell/trace-mapping@npm:^0.3.9": - version: 0.3.21 - resolution: "@jridgewell/trace-mapping@npm:0.3.21" +"@jridgewell/trace-mapping@npm:^0.3.12, @jridgewell/trace-mapping@npm:^0.3.18, @jridgewell/trace-mapping@npm:^0.3.20, @jridgewell/trace-mapping@npm:^0.3.24, @jridgewell/trace-mapping@npm:^0.3.25": + version: 0.3.25 + resolution: "@jridgewell/trace-mapping@npm:0.3.25" dependencies: "@jridgewell/resolve-uri": ^3.1.0 "@jridgewell/sourcemap-codec": ^1.4.14 - checksum: e91d3943c6d84687503ba033600d42b2a81d9eaf32758fee06449cd1415c59b944af08841e99f030b71f83bb5f814969e96fc8aa29e469eb3ea1b46597d13cff + checksum: 9d3c40d225e139987b50c48988f8717a54a8c994d8a948ee42e1412e08988761d0754d7d10b803061cc3aebf35f92a5dbbab493bd0e1a9ef9e89a2130e83ba34 languageName: node linkType: hard -"@jupyter/ydoc@npm:^1.1.1": - version: 1.1.1 - resolution: "@jupyter/ydoc@npm:1.1.1" +"@jupyter/react-components@npm:^0.15.3": + version: 0.15.3 + resolution: "@jupyter/react-components@npm:0.15.3" + dependencies: + "@jupyter/web-components": ^0.15.3 + "@microsoft/fast-react-wrapper": ^0.3.22 + react: ">=17.0.0 <19.0.0" + checksum: 1a6b256314259c6465c4b6d958575710536b82234a7bf0fba3e889a07e1f19ff8ab321450be354359876f92c45dbcc9d21a840237ff4a619806d9de696f55496 + languageName: node + linkType: hard + +"@jupyter/web-components@npm:^0.15.3": + version: 0.15.3 + resolution: "@jupyter/web-components@npm:0.15.3" + dependencies: + "@microsoft/fast-colors": ^5.3.1 + "@microsoft/fast-element": ^1.12.0 + "@microsoft/fast-foundation": ^2.49.4 + "@microsoft/fast-web-utilities": ^5.4.1 + checksum: a0980af934157bfdbdb6cc169c0816c1b2e57602d524c56bdcef746a4c25dfeb8f505150d83207c8695ed89b5486cf53d35a3382584d25ef64db666e4e16e45b + languageName: node + linkType: hard + +"@jupyter/ydoc@npm:^2.0.1": + version: 2.0.1 + resolution: "@jupyter/ydoc@npm:2.0.1" dependencies: "@jupyterlab/nbformat": ^3.0.0 || ^4.0.0-alpha.21 || ^4.0.0 "@lumino/coreutils": ^1.11.0 || ^2.0.0 @@ -2247,117 +2286,88 @@ __metadata: "@lumino/signaling": ^1.10.0 || ^2.0.0 y-protocols: ^1.0.5 yjs: ^13.5.40 - checksum: a239b1dd57cfc9ba36c06ac5032a1b6388849ae01a1d0db0d45094f71fdadf4d473b4bf8becbef0cfcdc85cae505361fbec0822b02da5aa48e06b66f742dd7a0 + checksum: f5f29e1ff3327ebc1cf326f53634e03c4c7bf7733d235087fe26975c16eebd404f23c2f3ba88b6e04b1927846be7162b09b8b8719a4b29e51d0299c745018cbb languageName: node linkType: hard -"@jupyterlab/application@npm:^4.0.0, @jupyterlab/application@npm:^4.0.10": - version: 4.0.10 - resolution: "@jupyterlab/application@npm:4.0.10" +"@jupyterlab/application@npm:^4.0.0, @jupyterlab/application@npm:^4.2.3": + version: 4.2.3 + resolution: "@jupyterlab/application@npm:4.2.3" dependencies: "@fortawesome/fontawesome-free": ^5.12.0 - "@jupyterlab/apputils": ^4.1.10 - "@jupyterlab/coreutils": ^6.0.10 - "@jupyterlab/docregistry": ^4.0.10 - "@jupyterlab/rendermime": ^4.0.10 - "@jupyterlab/rendermime-interfaces": ^3.8.10 - "@jupyterlab/services": ^7.0.10 - "@jupyterlab/statedb": ^4.0.10 - "@jupyterlab/translation": ^4.0.10 - "@jupyterlab/ui-components": ^4.0.10 + "@jupyterlab/apputils": ^4.3.3 + "@jupyterlab/coreutils": ^6.2.3 + "@jupyterlab/docregistry": ^4.2.3 + "@jupyterlab/rendermime": ^4.2.3 + "@jupyterlab/rendermime-interfaces": ^3.10.3 + "@jupyterlab/services": ^7.2.3 + "@jupyterlab/statedb": ^4.2.3 + "@jupyterlab/translation": ^4.2.3 + "@jupyterlab/ui-components": ^4.2.3 "@lumino/algorithm": ^2.0.1 - "@lumino/application": ^2.2.1 - "@lumino/commands": ^2.1.3 + "@lumino/application": ^2.3.1 + "@lumino/commands": ^2.3.0 "@lumino/coreutils": ^2.1.2 "@lumino/disposable": ^2.1.2 "@lumino/messaging": ^2.0.1 "@lumino/polling": ^2.1.2 "@lumino/properties": ^2.0.1 "@lumino/signaling": ^2.1.2 - "@lumino/widgets": ^2.3.0 - checksum: 30d826316c56580f3143470a1c296ee905d68c43f8e3ac550245bad64a7ec43674c70b5d8e30ded57d178b9a30cc6d234534b304374510ecfe0550f10d4bda6d - languageName: node - linkType: hard - -"@jupyterlab/apputils@npm:^4.1.10": - version: 4.1.10 - resolution: "@jupyterlab/apputils@npm:4.1.10" - dependencies: - "@jupyterlab/coreutils": ^6.0.10 - "@jupyterlab/observables": ^5.0.10 - "@jupyterlab/rendermime-interfaces": ^3.8.10 - "@jupyterlab/services": ^7.0.10 - "@jupyterlab/settingregistry": ^4.0.10 - "@jupyterlab/statedb": ^4.0.10 - "@jupyterlab/statusbar": ^4.0.10 - "@jupyterlab/translation": ^4.0.10 - "@jupyterlab/ui-components": ^4.0.10 - "@lumino/algorithm": ^2.0.1 - "@lumino/commands": ^2.1.3 - "@lumino/coreutils": ^2.1.2 - "@lumino/disposable": ^2.1.2 - "@lumino/domutils": ^2.0.1 - "@lumino/messaging": ^2.0.1 - "@lumino/signaling": ^2.1.2 - "@lumino/virtualdom": ^2.0.1 - "@lumino/widgets": ^2.3.0 - "@types/react": ^18.0.26 - react: ^18.2.0 - sanitize-html: ~2.7.3 - checksum: e1bc8884a2bcd5426dfe1dbc4336b8acda6be56964dd76ecda363e31ab6c5feca081199612ab79a590a9b5954630349df96a6803feee7ea08a29f688034853fe + "@lumino/widgets": ^2.3.2 + checksum: a9dd2b818467f44ffefeab13ed2ca89a2688ff0b0a1a6becd33fc5cca9b70fb0745297812bab56249615f45b125e8129c68939312bb3371b3f50da0e63eef23c languageName: node linkType: hard -"@jupyterlab/apputils@npm:^4.1.11": - version: 4.1.11 - resolution: "@jupyterlab/apputils@npm:4.1.11" +"@jupyterlab/apputils@npm:^4.3.3": + version: 4.3.3 + resolution: "@jupyterlab/apputils@npm:4.3.3" dependencies: - "@jupyterlab/coreutils": ^6.0.11 - "@jupyterlab/observables": ^5.0.11 - "@jupyterlab/rendermime-interfaces": ^3.8.11 - "@jupyterlab/services": ^7.0.11 - "@jupyterlab/settingregistry": ^4.0.11 - "@jupyterlab/statedb": ^4.0.11 - "@jupyterlab/statusbar": ^4.0.11 - "@jupyterlab/translation": ^4.0.11 - "@jupyterlab/ui-components": ^4.0.11 + "@jupyterlab/coreutils": ^6.2.3 + "@jupyterlab/observables": ^5.2.3 + "@jupyterlab/rendermime-interfaces": ^3.10.3 + "@jupyterlab/services": ^7.2.3 + "@jupyterlab/settingregistry": ^4.2.3 + "@jupyterlab/statedb": ^4.2.3 + "@jupyterlab/statusbar": ^4.2.3 + "@jupyterlab/translation": ^4.2.3 + "@jupyterlab/ui-components": ^4.2.3 "@lumino/algorithm": ^2.0.1 - "@lumino/commands": ^2.1.3 + "@lumino/commands": ^2.3.0 "@lumino/coreutils": ^2.1.2 "@lumino/disposable": ^2.1.2 "@lumino/domutils": ^2.0.1 "@lumino/messaging": ^2.0.1 "@lumino/signaling": ^2.1.2 "@lumino/virtualdom": ^2.0.1 - "@lumino/widgets": ^2.3.0 + "@lumino/widgets": ^2.3.2 "@types/react": ^18.0.26 react: ^18.2.0 - sanitize-html: ~2.7.3 - checksum: ab1bfa8e95de86464c35a2460e9cc4f89594a2cb69b38c19fd6d17a1c3d89e5c9fb368a1ac5425b5190c407e64c305c428e076a701117fc9007d0176bfe98501 + sanitize-html: ~2.12.1 + checksum: c906e899e2598a145789ea27ebd3048ef0877aea90aa5fd1261115b5af002afc6aa5157ccc061fb2de15184922f66eadbb2e23c9187433396a28ec9c42f455dc languageName: node linkType: hard -"@jupyterlab/attachments@npm:^4.0.10": - version: 4.0.10 - resolution: "@jupyterlab/attachments@npm:4.0.10" +"@jupyterlab/attachments@npm:^4.2.3": + version: 4.2.3 + resolution: "@jupyterlab/attachments@npm:4.2.3" dependencies: - "@jupyterlab/nbformat": ^4.0.10 - "@jupyterlab/observables": ^5.0.10 - "@jupyterlab/rendermime": ^4.0.10 - "@jupyterlab/rendermime-interfaces": ^3.8.10 + "@jupyterlab/nbformat": ^4.2.3 + "@jupyterlab/observables": ^5.2.3 + "@jupyterlab/rendermime": ^4.2.3 + "@jupyterlab/rendermime-interfaces": ^3.10.3 "@lumino/disposable": ^2.1.2 "@lumino/signaling": ^2.1.2 - checksum: 1d23a0e7176fd98aefc175e9f57cf7b729930504492ef79124ede84b39d7e810cedb90b4a974bbde7abf3e249b173079ba94e868c76ffaa4ed141e0cd480b4fd + checksum: 21325cd4cf108f21c997696d9b71efa3a77ce218d28777676dda0519dd92e76e43234c08a433e9473024dcfeb92e3a53ecb6284ef2aff870c0bd21f7d384ec3a languageName: node linkType: hard "@jupyterlab/builder@npm:^4.0.0": - version: 4.0.10 - resolution: "@jupyterlab/builder@npm:4.0.10" + version: 4.2.3 + resolution: "@jupyterlab/builder@npm:4.2.3" dependencies: "@lumino/algorithm": ^2.0.1 - "@lumino/application": ^2.2.1 - "@lumino/commands": ^2.1.3 + "@lumino/application": ^2.3.1 + "@lumino/commands": ^2.3.0 "@lumino/coreutils": ^2.1.2 "@lumino/disposable": ^2.1.2 "@lumino/domutils": ^2.0.1 @@ -2366,7 +2376,7 @@ __metadata: "@lumino/properties": ^2.0.1 "@lumino/signaling": ^2.1.2 "@lumino/virtualdom": ^2.0.1 - "@lumino/widgets": ^2.3.0 + "@lumino/widgets": ^2.3.2 ajv: ^8.12.0 commander: ^9.4.1 css-loader: ^6.7.1 @@ -2388,32 +2398,32 @@ __metadata: worker-loader: ^3.0.2 bin: build-labextension: lib/build-labextension.js - checksum: 6c69fc85716183656e06606ec7a12cd48066fb54928b75d2b62ab4e1952bfe4b97a64e500dbd7148e1514fc6fe595c7e76bb9ff230513ed8e5bd1ac88ee1cd61 - languageName: node - linkType: hard - -"@jupyterlab/cells@npm:^4.0.10": - version: 4.0.10 - resolution: "@jupyterlab/cells@npm:4.0.10" - dependencies: - "@codemirror/state": ^6.2.0 - "@codemirror/view": ^6.9.6 - "@jupyter/ydoc": ^1.1.1 - "@jupyterlab/apputils": ^4.1.10 - "@jupyterlab/attachments": ^4.0.10 - "@jupyterlab/codeeditor": ^4.0.10 - "@jupyterlab/codemirror": ^4.0.10 - "@jupyterlab/coreutils": ^6.0.10 - "@jupyterlab/documentsearch": ^4.0.10 - "@jupyterlab/filebrowser": ^4.0.10 - "@jupyterlab/nbformat": ^4.0.10 - "@jupyterlab/observables": ^5.0.10 - "@jupyterlab/outputarea": ^4.0.10 - "@jupyterlab/rendermime": ^4.0.10 - "@jupyterlab/services": ^7.0.10 - "@jupyterlab/toc": ^6.0.10 - "@jupyterlab/translation": ^4.0.10 - "@jupyterlab/ui-components": ^4.0.10 + checksum: 6bc0d3a7404cecf53c4378a051e96e51b777e2017c2890ae9331f51e9433ad643c6627bf61d4a0710c1b2cb0d4839bef79a02656b9cef04bf0ec1e913bf3a890 + languageName: node + linkType: hard + +"@jupyterlab/cells@npm:^4.2.3": + version: 4.2.3 + resolution: "@jupyterlab/cells@npm:4.2.3" + dependencies: + "@codemirror/state": ^6.4.1 + "@codemirror/view": ^6.26.0 + "@jupyter/ydoc": ^2.0.1 + "@jupyterlab/apputils": ^4.3.3 + "@jupyterlab/attachments": ^4.2.3 + "@jupyterlab/codeeditor": ^4.2.3 + "@jupyterlab/codemirror": ^4.2.3 + "@jupyterlab/coreutils": ^6.2.3 + "@jupyterlab/documentsearch": ^4.2.3 + "@jupyterlab/filebrowser": ^4.2.3 + "@jupyterlab/nbformat": ^4.2.3 + "@jupyterlab/observables": ^5.2.3 + "@jupyterlab/outputarea": ^4.2.3 + "@jupyterlab/rendermime": ^4.2.3 + "@jupyterlab/services": ^7.2.3 + "@jupyterlab/toc": ^6.2.3 + "@jupyterlab/translation": ^4.2.3 + "@jupyterlab/ui-components": ^4.2.3 "@lumino/algorithm": ^2.0.1 "@lumino/coreutils": ^2.1.2 "@lumino/domutils": ^2.0.1 @@ -2422,94 +2432,81 @@ __metadata: "@lumino/polling": ^2.1.2 "@lumino/signaling": ^2.1.2 "@lumino/virtualdom": ^2.0.1 - "@lumino/widgets": ^2.3.0 + "@lumino/widgets": ^2.3.2 react: ^18.2.0 - checksum: 3cd6ee63e7a9fa2afa0d3e6213550f296ba27960826648c744e40ed29774c6d45aba31d44b39e2c5c7a1b17f4a7e96914955b0c49b95b302a096c428685ece6b + checksum: faaaf969d908d6d0f5713ca23d83bf7f69a8afb9ea72b37722a047afc832e4f3ea97299921ff92575a77d5b4856c2862a7b97823b97fe707a16f435d77e1ed1d languageName: node linkType: hard -"@jupyterlab/codeeditor@npm:^4.0.10": - version: 4.0.10 - resolution: "@jupyterlab/codeeditor@npm:4.0.10" - dependencies: - "@codemirror/state": ^6.2.0 - "@jupyter/ydoc": ^1.1.1 - "@jupyterlab/coreutils": ^6.0.10 - "@jupyterlab/nbformat": ^4.0.10 - "@jupyterlab/observables": ^5.0.10 - "@jupyterlab/statusbar": ^4.0.10 - "@jupyterlab/translation": ^4.0.10 - "@jupyterlab/ui-components": ^4.0.10 +"@jupyterlab/codeeditor@npm:^4.2.3": + version: 4.2.3 + resolution: "@jupyterlab/codeeditor@npm:4.2.3" + dependencies: + "@codemirror/state": ^6.4.1 + "@jupyter/ydoc": ^2.0.1 + "@jupyterlab/apputils": ^4.3.3 + "@jupyterlab/coreutils": ^6.2.3 + "@jupyterlab/nbformat": ^4.2.3 + "@jupyterlab/observables": ^5.2.3 + "@jupyterlab/statusbar": ^4.2.3 + "@jupyterlab/translation": ^4.2.3 + "@jupyterlab/ui-components": ^4.2.3 "@lumino/coreutils": ^2.1.2 "@lumino/disposable": ^2.1.2 "@lumino/dragdrop": ^2.1.4 "@lumino/messaging": ^2.0.1 "@lumino/signaling": ^2.1.2 - "@lumino/widgets": ^2.3.0 + "@lumino/widgets": ^2.3.2 react: ^18.2.0 - checksum: 14d547c30d3b850511d459a56e01fd40c9bbc9403f234f1b0061d48a493f16c7ac7314e6111628a9023584ee9b112f7459b11ce54d58b7f670a9391efa20550d + checksum: 36e402e35043deb4e40879760eb2e68bd4f6802751e64761cd7d46fc11dbbadfd43481d1fbda91a205cb8a269b9ac1fe3130e0597eb10c63231b2b5087341cad languageName: node linkType: hard -"@jupyterlab/codemirror@npm:^4.0.10": - version: 4.0.10 - resolution: "@jupyterlab/codemirror@npm:4.0.10" +"@jupyterlab/codemirror@npm:^4.2.3": + version: 4.2.3 + resolution: "@jupyterlab/codemirror@npm:4.2.3" dependencies: - "@codemirror/autocomplete": ^6.5.1 - "@codemirror/commands": ^6.2.3 + "@codemirror/autocomplete": ^6.15.0 + "@codemirror/commands": ^6.3.3 "@codemirror/lang-cpp": ^6.0.2 - "@codemirror/lang-css": ^6.1.1 - "@codemirror/lang-html": ^6.4.3 + "@codemirror/lang-css": ^6.2.1 + "@codemirror/lang-html": ^6.4.8 "@codemirror/lang-java": ^6.0.1 - "@codemirror/lang-javascript": ^6.1.7 + "@codemirror/lang-javascript": ^6.2.2 "@codemirror/lang-json": ^6.0.1 - "@codemirror/lang-markdown": ^6.1.1 + "@codemirror/lang-markdown": ^6.2.4 "@codemirror/lang-php": ^6.0.1 - "@codemirror/lang-python": ^6.1.3 + "@codemirror/lang-python": ^6.1.4 "@codemirror/lang-rust": ^6.0.1 - "@codemirror/lang-sql": ^6.4.1 - "@codemirror/lang-wast": ^6.0.1 - "@codemirror/lang-xml": ^6.0.2 - "@codemirror/language": ^6.6.0 - "@codemirror/legacy-modes": ^6.3.2 - "@codemirror/search": ^6.3.0 - "@codemirror/state": ^6.2.0 - "@codemirror/view": ^6.9.6 - "@jupyter/ydoc": ^1.1.1 - "@jupyterlab/codeeditor": ^4.0.10 - "@jupyterlab/coreutils": ^6.0.10 - "@jupyterlab/documentsearch": ^4.0.10 - "@jupyterlab/nbformat": ^4.0.10 - "@jupyterlab/translation": ^4.0.10 - "@lezer/common": ^1.0.2 - "@lezer/generator": ^1.2.2 - "@lezer/highlight": ^1.1.4 - "@lezer/markdown": ^1.0.2 + "@codemirror/lang-sql": ^6.6.1 + "@codemirror/lang-wast": ^6.0.2 + "@codemirror/lang-xml": ^6.1.0 + "@codemirror/language": ^6.10.1 + "@codemirror/legacy-modes": ^6.3.3 + "@codemirror/search": ^6.5.6 + "@codemirror/state": ^6.4.1 + "@codemirror/view": ^6.26.0 + "@jupyter/ydoc": ^2.0.1 + "@jupyterlab/codeeditor": ^4.2.3 + "@jupyterlab/coreutils": ^6.2.3 + "@jupyterlab/documentsearch": ^4.2.3 + "@jupyterlab/nbformat": ^4.2.3 + "@jupyterlab/translation": ^4.2.3 + "@lezer/common": ^1.2.1 + "@lezer/generator": ^1.7.0 + "@lezer/highlight": ^1.2.0 + "@lezer/markdown": ^1.2.0 "@lumino/coreutils": ^2.1.2 "@lumino/disposable": ^2.1.2 "@lumino/signaling": ^2.1.2 yjs: ^13.5.40 - checksum: 127bdca8e8b6bebb19df5e61bbc1715295633905961bee3516ac65c158c1ed776e549a5f1e0a3615a45aff2614022d0dd1fc170f595498af4e3fc693a6acfc30 - languageName: node - linkType: hard - -"@jupyterlab/coreutils@npm:^6.0.0, @jupyterlab/coreutils@npm:^6.0.10": - version: 6.0.10 - resolution: "@jupyterlab/coreutils@npm:6.0.10" - dependencies: - "@lumino/coreutils": ^2.1.2 - "@lumino/disposable": ^2.1.2 - "@lumino/signaling": ^2.1.2 - minimist: ~1.2.0 - path-browserify: ^1.0.0 - url-parse: ~1.5.4 - checksum: d01645468268465841447a977927097d68b7f6fac771a3d48e358508a1c792dc433aaebcca7755331dce043e1cc002da7fa1ad070dfd7e689dda66c9f25626ee + checksum: 0464ca3ddd6df260bbcf0edc5b66a23b76d648e3e4497678cecadfab2286f4e8de8e9bb87b1c1cc9d1bec72a89e1c26770c6af94127e88cbc1ac216b79f32ffe languageName: node linkType: hard -"@jupyterlab/coreutils@npm:^6.0.11": - version: 6.0.11 - resolution: "@jupyterlab/coreutils@npm:6.0.11" +"@jupyterlab/coreutils@npm:^6.0.0, @jupyterlab/coreutils@npm:^6.2.3": + version: 6.2.3 + resolution: "@jupyterlab/coreutils@npm:6.2.3" dependencies: "@lumino/coreutils": ^2.1.2 "@lumino/disposable": ^2.1.2 @@ -2517,89 +2514,93 @@ __metadata: minimist: ~1.2.0 path-browserify: ^1.0.0 url-parse: ~1.5.4 - checksum: 2a3ab30865439d486ad180c0779bf086992d5999727e1fb4cbadad6ecd4c53fbcfcde4fc611d9819dc28aedc6b36e7b48d267ff2bcdd8f35de5b4f3d7145f2cc + checksum: 3c3ac6297c92c811839f932c5ba7b71ad9507b16591e90827b8c8b7986cc597cecc0a3c5f80652b6ae2a2b75f194f8944a8b99f5f1108cac89daa201b2bfc881 languageName: node linkType: hard -"@jupyterlab/docmanager@npm:^4.0.10": - version: 4.0.10 - resolution: "@jupyterlab/docmanager@npm:4.0.10" - dependencies: - "@jupyterlab/apputils": ^4.1.10 - "@jupyterlab/coreutils": ^6.0.10 - "@jupyterlab/docregistry": ^4.0.10 - "@jupyterlab/services": ^7.0.10 - "@jupyterlab/statusbar": ^4.0.10 - "@jupyterlab/translation": ^4.0.10 - "@jupyterlab/ui-components": ^4.0.10 +"@jupyterlab/docmanager@npm:^4.2.3": + version: 4.2.3 + resolution: "@jupyterlab/docmanager@npm:4.2.3" + dependencies: + "@jupyterlab/apputils": ^4.3.3 + "@jupyterlab/coreutils": ^6.2.3 + "@jupyterlab/docregistry": ^4.2.3 + "@jupyterlab/services": ^7.2.3 + "@jupyterlab/statedb": ^4.2.3 + "@jupyterlab/statusbar": ^4.2.3 + "@jupyterlab/translation": ^4.2.3 + "@jupyterlab/ui-components": ^4.2.3 "@lumino/algorithm": ^2.0.1 "@lumino/coreutils": ^2.1.2 "@lumino/disposable": ^2.1.2 "@lumino/messaging": ^2.0.1 + "@lumino/polling": ^2.1.2 "@lumino/properties": ^2.0.1 "@lumino/signaling": ^2.1.2 - "@lumino/widgets": ^2.3.0 + "@lumino/widgets": ^2.3.2 react: ^18.2.0 - checksum: 8be669130f29f9245c75e6b03f2bf788da17e1026b1117e0bbd8fe84afca5a9fddfa27fa879231979db1a2bf62c3e9b50eb38586cc155a3e64e1c1dd2e528c9b + checksum: cb17332ecbb030378e6b2d14c612313c0ba63b15fed12d3f9c3aae1d14783bc2cde52bbf0e441faee34d1addf653f45a7c0b8f937a2c5acaee964c443044e669 languageName: node linkType: hard -"@jupyterlab/docregistry@npm:^4.0.10": - version: 4.0.10 - resolution: "@jupyterlab/docregistry@npm:4.0.10" - dependencies: - "@jupyter/ydoc": ^1.1.1 - "@jupyterlab/apputils": ^4.1.10 - "@jupyterlab/codeeditor": ^4.0.10 - "@jupyterlab/coreutils": ^6.0.10 - "@jupyterlab/observables": ^5.0.10 - "@jupyterlab/rendermime": ^4.0.10 - "@jupyterlab/rendermime-interfaces": ^3.8.10 - "@jupyterlab/services": ^7.0.10 - "@jupyterlab/translation": ^4.0.10 - "@jupyterlab/ui-components": ^4.0.10 +"@jupyterlab/docregistry@npm:^4.2.3": + version: 4.2.3 + resolution: "@jupyterlab/docregistry@npm:4.2.3" + dependencies: + "@jupyter/ydoc": ^2.0.1 + "@jupyterlab/apputils": ^4.3.3 + "@jupyterlab/codeeditor": ^4.2.3 + "@jupyterlab/coreutils": ^6.2.3 + "@jupyterlab/observables": ^5.2.3 + "@jupyterlab/rendermime": ^4.2.3 + "@jupyterlab/rendermime-interfaces": ^3.10.3 + "@jupyterlab/services": ^7.2.3 + "@jupyterlab/translation": ^4.2.3 + "@jupyterlab/ui-components": ^4.2.3 "@lumino/algorithm": ^2.0.1 "@lumino/coreutils": ^2.1.2 "@lumino/disposable": ^2.1.2 "@lumino/messaging": ^2.0.1 "@lumino/properties": ^2.0.1 "@lumino/signaling": ^2.1.2 - "@lumino/widgets": ^2.3.0 - checksum: 0863d8b3c97b8790280805cb781f7448e6a26f6f7e5e75d597d1add480be988bbaa72a6792d2417bc648800d4af30d96af8437ef5c6d9906819e36010d523a3c + "@lumino/widgets": ^2.3.2 + react: ^18.2.0 + checksum: da4634294f8e09e7ae8c0a930450291e5b865bfdec107f4d7ea2353cffec12405ca58f57eef50e0ab853db46f5e8a386f03e32e2f96673d7d906f114af823510 languageName: node linkType: hard -"@jupyterlab/documentsearch@npm:^4.0.10": - version: 4.0.10 - resolution: "@jupyterlab/documentsearch@npm:4.0.10" +"@jupyterlab/documentsearch@npm:^4.2.3": + version: 4.2.3 + resolution: "@jupyterlab/documentsearch@npm:4.2.3" dependencies: - "@jupyterlab/apputils": ^4.1.10 - "@jupyterlab/translation": ^4.0.10 - "@jupyterlab/ui-components": ^4.0.10 + "@jupyterlab/apputils": ^4.3.3 + "@jupyterlab/translation": ^4.2.3 + "@jupyterlab/ui-components": ^4.2.3 + "@lumino/commands": ^2.3.0 "@lumino/coreutils": ^2.1.2 "@lumino/disposable": ^2.1.2 "@lumino/messaging": ^2.0.1 "@lumino/polling": ^2.1.2 "@lumino/signaling": ^2.1.2 - "@lumino/widgets": ^2.3.0 + "@lumino/widgets": ^2.3.2 react: ^18.2.0 - checksum: 8ff2c96c9460abf0f6245842637c698ae04b32e5ab64d9f868975158be929d1762b59a0bf85782631cddf3ea0e87b1d446b991ab534dab263000826b0c66f070 + checksum: af3c9bd88e132b0d9e2a829244196e603720ff92404f05475d1b36f837d10a07579201669d91d9a2b1d8391ec17e46ab965c7b0fa608c753a176af69a117ab0b languageName: node linkType: hard -"@jupyterlab/filebrowser@npm:^4.0.10, @jupyterlab/filebrowser@npm:^4.0.2": - version: 4.0.10 - resolution: "@jupyterlab/filebrowser@npm:4.0.10" - dependencies: - "@jupyterlab/apputils": ^4.1.10 - "@jupyterlab/coreutils": ^6.0.10 - "@jupyterlab/docmanager": ^4.0.10 - "@jupyterlab/docregistry": ^4.0.10 - "@jupyterlab/services": ^7.0.10 - "@jupyterlab/statedb": ^4.0.10 - "@jupyterlab/statusbar": ^4.0.10 - "@jupyterlab/translation": ^4.0.10 - "@jupyterlab/ui-components": ^4.0.10 +"@jupyterlab/filebrowser@npm:^4.0.2, @jupyterlab/filebrowser@npm:^4.2.3": + version: 4.2.3 + resolution: "@jupyterlab/filebrowser@npm:4.2.3" + dependencies: + "@jupyterlab/apputils": ^4.3.3 + "@jupyterlab/coreutils": ^6.2.3 + "@jupyterlab/docmanager": ^4.2.3 + "@jupyterlab/docregistry": ^4.2.3 + "@jupyterlab/services": ^7.2.3 + "@jupyterlab/statedb": ^4.2.3 + "@jupyterlab/statusbar": ^4.2.3 + "@jupyterlab/translation": ^4.2.3 + "@jupyterlab/ui-components": ^4.2.3 "@lumino/algorithm": ^2.0.1 "@lumino/coreutils": ^2.1.2 "@lumino/disposable": ^2.1.2 @@ -2609,486 +2610,350 @@ __metadata: "@lumino/polling": ^2.1.2 "@lumino/signaling": ^2.1.2 "@lumino/virtualdom": ^2.0.1 - "@lumino/widgets": ^2.3.0 + "@lumino/widgets": ^2.3.2 react: ^18.2.0 - checksum: f19884d40b0b1761e023c939cae1f11112b3b021f75df4806d97d0434e8b25c651bb054a66f563faa99e46c4b2b820b54e6a0e48bffa49d0a0e7bce145c34852 + checksum: d0a4027d7fe277449f54b07e7778903eb1ba99fd983289fb6fb186e9e8237ba393ad377d06dcaa73a3e0b40826ba0e61403bc932df70923fa78ef7f93e3f9e1c languageName: node linkType: hard "@jupyterlab/launcher@npm:^4.0.2": - version: 4.0.10 - resolution: "@jupyterlab/launcher@npm:4.0.10" + version: 4.2.3 + resolution: "@jupyterlab/launcher@npm:4.2.3" dependencies: - "@jupyterlab/apputils": ^4.1.10 - "@jupyterlab/translation": ^4.0.10 - "@jupyterlab/ui-components": ^4.0.10 + "@jupyterlab/apputils": ^4.3.3 + "@jupyterlab/translation": ^4.2.3 + "@jupyterlab/ui-components": ^4.2.3 "@lumino/algorithm": ^2.0.1 - "@lumino/commands": ^2.1.3 + "@lumino/commands": ^2.3.0 "@lumino/coreutils": ^2.1.2 "@lumino/disposable": ^2.1.2 "@lumino/properties": ^2.0.1 - "@lumino/widgets": ^2.3.0 + "@lumino/widgets": ^2.3.2 react: ^18.2.0 - checksum: 68939d4b40d239df2ff4a631ac49d4826f2a7abf77f7f97016f26c3dc1f395cfe33d24e7ce1b5be1b2a35574d8d390ac57e065b7cdfd56157d8d1d68d51f6121 + checksum: f28e092acd5abb33f66af8c8cb935a2ad8e916e305cb0c396901ce1eaa754d30a08000121373b5c15eda6925cecd7c733e92f6a2cc57a27d7dcaafa78440d4cc languageName: node linkType: hard -"@jupyterlab/lsp@npm:^4.0.10": - version: 4.0.10 - resolution: "@jupyterlab/lsp@npm:4.0.10" - dependencies: - "@jupyterlab/apputils": ^4.1.10 - "@jupyterlab/codeeditor": ^4.0.10 - "@jupyterlab/coreutils": ^6.0.10 - "@jupyterlab/docregistry": ^4.0.10 - "@jupyterlab/services": ^7.0.10 - "@jupyterlab/translation": ^4.0.10 +"@jupyterlab/lsp@npm:^4.2.3": + version: 4.2.3 + resolution: "@jupyterlab/lsp@npm:4.2.3" + dependencies: + "@jupyterlab/apputils": ^4.3.3 + "@jupyterlab/codeeditor": ^4.2.3 + "@jupyterlab/codemirror": ^4.2.3 + "@jupyterlab/coreutils": ^6.2.3 + "@jupyterlab/docregistry": ^4.2.3 + "@jupyterlab/services": ^7.2.3 + "@jupyterlab/translation": ^4.2.3 "@lumino/coreutils": ^2.1.2 "@lumino/disposable": ^2.1.2 "@lumino/signaling": ^2.1.2 + "@lumino/widgets": ^2.3.2 lodash.mergewith: ^4.6.1 vscode-jsonrpc: ^6.0.0 vscode-languageserver-protocol: ^3.17.0 vscode-ws-jsonrpc: ~1.0.2 - checksum: e7085bb885a04b9ccf63f6c90acd8ea5dd9e6acee7a1da3860942972dd643773780f28d895a7c11a6b0f024aa00c16c4896b19c567be5a011888467d1f45ef8a + checksum: 06a75a3b29770f1cd3e3b16d01fe9b2a3fd30a1b567fe13f89548ab10f4b7f8e075c49107362c16d10bcb98c7de8592496a90f4169502a8ec568394a6081744c languageName: node linkType: hard "@jupyterlab/mainmenu@npm:^4.0.11": - version: 4.0.11 - resolution: "@jupyterlab/mainmenu@npm:4.0.11" + version: 4.2.3 + resolution: "@jupyterlab/mainmenu@npm:4.2.3" dependencies: - "@jupyterlab/apputils": ^4.1.11 - "@jupyterlab/translation": ^4.0.11 - "@jupyterlab/ui-components": ^4.0.11 + "@jupyterlab/apputils": ^4.3.3 + "@jupyterlab/translation": ^4.2.3 + "@jupyterlab/ui-components": ^4.2.3 "@lumino/algorithm": ^2.0.1 - "@lumino/commands": ^2.1.3 + "@lumino/commands": ^2.3.0 "@lumino/coreutils": ^2.1.2 - "@lumino/widgets": ^2.3.0 - checksum: be57acbe8679d430d5b1962bbafb7749fea2a35ebf33afc9d28d93a383a8e544a1939e2ed5718fb16826f4dcfe5d92c5e60372f6899d308ab7e3602658965b1e + "@lumino/widgets": ^2.3.2 + checksum: 13868244318c3a82d63f9b7d7d4acdd6c58e822644f242de97b7abc0fa26d735ccbf830b0a338c177ea07fd28163ef6f87d34fbad76814a03b54492a1a8a3b76 languageName: node linkType: hard -"@jupyterlab/nbformat@npm:^3.0.0 || ^4.0.0-alpha.21 || ^4.0.0, @jupyterlab/nbformat@npm:^4.0.10": - version: 4.0.10 - resolution: "@jupyterlab/nbformat@npm:4.0.10" +"@jupyterlab/nbformat@npm:^3.0.0 || ^4.0.0-alpha.21 || ^4.0.0, @jupyterlab/nbformat@npm:^4.2.3": + version: 4.2.3 + resolution: "@jupyterlab/nbformat@npm:4.2.3" dependencies: "@lumino/coreutils": ^2.1.2 - checksum: fb2eca9389df4a48b1fa7e552200e218a2e9901f21e2735769522c0cc5824b98934b90a7b75e415dc5a9cb5c9a9ff205b6e8316c6f6eccf5716cfa7086b511cf + checksum: 890844bfe8966023d8b32ba286be159712509005e7c88eb71ba87f9ab6454cc8cbb2e5922e14ba524a147bb2adff2c82563f9c5e7e2331c6dcdef0fbe18e4f97 languageName: node linkType: hard -"@jupyterlab/nbformat@npm:^4.0.11": - version: 4.0.11 - resolution: "@jupyterlab/nbformat@npm:4.0.11" - dependencies: - "@lumino/coreutils": ^2.1.2 - checksum: 7bb488e94f09d66d858ce2a001e208beca9f1e87fc674332c4630cfb5039a6bd1579d9071019782aba546a9b43e2a7de5b125f7a0a7a7caa0b190a2b8d1266b6 - languageName: node - linkType: hard - -"@jupyterlab/notebook@npm:^4.0.10, @jupyterlab/notebook@npm:^4.0.2": - version: 4.0.10 - resolution: "@jupyterlab/notebook@npm:4.0.10" - dependencies: - "@jupyter/ydoc": ^1.1.1 - "@jupyterlab/apputils": ^4.1.10 - "@jupyterlab/cells": ^4.0.10 - "@jupyterlab/codeeditor": ^4.0.10 - "@jupyterlab/codemirror": ^4.0.10 - "@jupyterlab/coreutils": ^6.0.10 - "@jupyterlab/docregistry": ^4.0.10 - "@jupyterlab/documentsearch": ^4.0.10 - "@jupyterlab/lsp": ^4.0.10 - "@jupyterlab/nbformat": ^4.0.10 - "@jupyterlab/observables": ^5.0.10 - "@jupyterlab/rendermime": ^4.0.10 - "@jupyterlab/services": ^7.0.10 - "@jupyterlab/settingregistry": ^4.0.10 - "@jupyterlab/statusbar": ^4.0.10 - "@jupyterlab/toc": ^6.0.10 - "@jupyterlab/translation": ^4.0.10 - "@jupyterlab/ui-components": ^4.0.10 +"@jupyterlab/notebook@npm:^4.0.2, @jupyterlab/notebook@npm:^4.2.3": + version: 4.2.3 + resolution: "@jupyterlab/notebook@npm:4.2.3" + dependencies: + "@jupyter/ydoc": ^2.0.1 + "@jupyterlab/apputils": ^4.3.3 + "@jupyterlab/cells": ^4.2.3 + "@jupyterlab/codeeditor": ^4.2.3 + "@jupyterlab/codemirror": ^4.2.3 + "@jupyterlab/coreutils": ^6.2.3 + "@jupyterlab/docregistry": ^4.2.3 + "@jupyterlab/documentsearch": ^4.2.3 + "@jupyterlab/lsp": ^4.2.3 + "@jupyterlab/nbformat": ^4.2.3 + "@jupyterlab/observables": ^5.2.3 + "@jupyterlab/rendermime": ^4.2.3 + "@jupyterlab/services": ^7.2.3 + "@jupyterlab/settingregistry": ^4.2.3 + "@jupyterlab/statusbar": ^4.2.3 + "@jupyterlab/toc": ^6.2.3 + "@jupyterlab/translation": ^4.2.3 + "@jupyterlab/ui-components": ^4.2.3 "@lumino/algorithm": ^2.0.1 "@lumino/coreutils": ^2.1.2 + "@lumino/disposable": ^2.1.2 "@lumino/domutils": ^2.0.1 "@lumino/dragdrop": ^2.1.4 "@lumino/messaging": ^2.0.1 + "@lumino/polling": ^2.1.2 "@lumino/properties": ^2.0.1 "@lumino/signaling": ^2.1.2 "@lumino/virtualdom": ^2.0.1 - "@lumino/widgets": ^2.3.0 + "@lumino/widgets": ^2.3.2 react: ^18.2.0 - checksum: 19e18594167455cd145662fb4631834ad9d9bc997242d9140a9c9d5332e7a58f1af94d19ac90e5d640e2b798546c8fe6381d6cf56868523a07ea83044b26f3d3 - languageName: node - linkType: hard - -"@jupyterlab/observables@npm:^5.0.10": - version: 5.0.10 - resolution: "@jupyterlab/observables@npm:5.0.10" - dependencies: - "@lumino/algorithm": ^2.0.1 - "@lumino/coreutils": ^2.1.2 - "@lumino/disposable": ^2.1.2 - "@lumino/messaging": ^2.0.1 - "@lumino/signaling": ^2.1.2 - checksum: b554bc5d72ecb8780fa92f40369fd94e2a8261a85a5eeb4a5251dc5ec4aa9b6ae5aa9d66eae1c4bc4cfad0e5f144abfa007eec9b49a5ccd6a6c8722615c3d90d + checksum: 148d24c32118478c878e09f77b2a3b211ab52a80feddeca671fadc6505d241188979cce091089ff2807e567b104a2a8b95739cf81caaf5a60240951b627fdbc7 languageName: node linkType: hard -"@jupyterlab/observables@npm:^5.0.11": - version: 5.0.11 - resolution: "@jupyterlab/observables@npm:5.0.11" +"@jupyterlab/observables@npm:^5.2.3": + version: 5.2.3 + resolution: "@jupyterlab/observables@npm:5.2.3" dependencies: "@lumino/algorithm": ^2.0.1 "@lumino/coreutils": ^2.1.2 "@lumino/disposable": ^2.1.2 "@lumino/messaging": ^2.0.1 "@lumino/signaling": ^2.1.2 - checksum: b47cc8e73db9cc856454c0db530b774a4d11f6ade066b52fe521b0cec2b7a8f5eebfe2c0f0f7ada976474698dab9a77bdef3feea2960ea75bcf7052404ebec16 + checksum: 4e3a0ee95bb37f3148d9b36804ffdccb960f48e001394facb3c964035d61c7ba46572eb033dbd3422822377e408bb00fa28ab1386a48390f66b09d52aefda483 languageName: node linkType: hard -"@jupyterlab/outputarea@npm:^4.0.10": - version: 4.0.10 - resolution: "@jupyterlab/outputarea@npm:4.0.10" - dependencies: - "@jupyterlab/apputils": ^4.1.10 - "@jupyterlab/nbformat": ^4.0.10 - "@jupyterlab/observables": ^5.0.10 - "@jupyterlab/rendermime": ^4.0.10 - "@jupyterlab/rendermime-interfaces": ^3.8.10 - "@jupyterlab/services": ^7.0.10 - "@jupyterlab/translation": ^4.0.10 +"@jupyterlab/outputarea@npm:^4.2.3": + version: 4.2.3 + resolution: "@jupyterlab/outputarea@npm:4.2.3" + dependencies: + "@jupyterlab/apputils": ^4.3.3 + "@jupyterlab/nbformat": ^4.2.3 + "@jupyterlab/observables": ^5.2.3 + "@jupyterlab/rendermime": ^4.2.3 + "@jupyterlab/rendermime-interfaces": ^3.10.3 + "@jupyterlab/services": ^7.2.3 + "@jupyterlab/translation": ^4.2.3 "@lumino/algorithm": ^2.0.1 "@lumino/coreutils": ^2.1.2 "@lumino/disposable": ^2.1.2 "@lumino/messaging": ^2.0.1 "@lumino/properties": ^2.0.1 "@lumino/signaling": ^2.1.2 - "@lumino/widgets": ^2.3.0 - checksum: ee110f600d03d394b403ed58ff51b866cc541dffca8253e39bbcdb8938331fb94082136e5d9c8e183744c7bb716b4e80d4ab36c4790879b568b1bc6fa7fe7e9b + "@lumino/widgets": ^2.3.2 + checksum: 5bcd65c224b944c6e27b7c59136e7548b650bb9ae193873b73d95972fb2894221372f99ab6e98615d8d9f0936f6963a7462e91f24f1483a5aa6cc3d2cf9d33f4 languageName: node linkType: hard -"@jupyterlab/rendermime-interfaces@npm:^3.8.10": - version: 3.8.10 - resolution: "@jupyterlab/rendermime-interfaces@npm:3.8.10" +"@jupyterlab/rendermime-interfaces@npm:^3.10.3": + version: 3.10.3 + resolution: "@jupyterlab/rendermime-interfaces@npm:3.10.3" dependencies: "@lumino/coreutils": ^1.11.0 || ^2.1.2 - "@lumino/widgets": ^1.37.2 || ^2.3.0 - checksum: 46775a03440ac26c661f9b050153a445c8fc3490a39ad776e74dffbbb75e6227ad257f3d4452f4bd435f9cb6db2572ebd8f9794cc12669b17479195c0e709f96 + "@lumino/widgets": ^1.37.2 || ^2.3.2 + checksum: c30f0674e2bafa6a2d4479f36b467a72cce16cf00052d6e0cf718262b9687b9254783295c00f3a45e0331c129ba9cf6abfb638b6ba64131678a8153a55a7ce2a languageName: node linkType: hard -"@jupyterlab/rendermime-interfaces@npm:^3.8.11": - version: 3.8.11 - resolution: "@jupyterlab/rendermime-interfaces@npm:3.8.11" - dependencies: - "@lumino/coreutils": ^1.11.0 || ^2.1.2 - "@lumino/widgets": ^1.37.2 || ^2.3.0 - checksum: 277373ca5e05bfbcd6e88c38cdf5c1bdfc052beaf1cac120cb3a458d96cce949b17c9b47cfd16cfcf2e2241530fa9f3062343512084b79a549f6bde84a846c84 - languageName: node - linkType: hard - -"@jupyterlab/rendermime@npm:^4.0.10": - version: 4.0.10 - resolution: "@jupyterlab/rendermime@npm:4.0.10" - dependencies: - "@jupyterlab/apputils": ^4.1.10 - "@jupyterlab/coreutils": ^6.0.10 - "@jupyterlab/nbformat": ^4.0.10 - "@jupyterlab/observables": ^5.0.10 - "@jupyterlab/rendermime-interfaces": ^3.8.10 - "@jupyterlab/services": ^7.0.10 - "@jupyterlab/translation": ^4.0.10 +"@jupyterlab/rendermime@npm:^4.2.3": + version: 4.2.3 + resolution: "@jupyterlab/rendermime@npm:4.2.3" + dependencies: + "@jupyterlab/apputils": ^4.3.3 + "@jupyterlab/coreutils": ^6.2.3 + "@jupyterlab/nbformat": ^4.2.3 + "@jupyterlab/observables": ^5.2.3 + "@jupyterlab/rendermime-interfaces": ^3.10.3 + "@jupyterlab/services": ^7.2.3 + "@jupyterlab/translation": ^4.2.3 "@lumino/coreutils": ^2.1.2 "@lumino/messaging": ^2.0.1 "@lumino/signaling": ^2.1.2 - "@lumino/widgets": ^2.3.0 + "@lumino/widgets": ^2.3.2 lodash.escape: ^4.0.1 - checksum: 2e298e7f64a1eca8a8e0742112a251de21c73bc167ddffbd2d15e38c4e70ccd4b98d6e636c7cce8191aeb51c4a00338f18729b23a7917a4b58e721db13ad8110 - languageName: node - linkType: hard - -"@jupyterlab/services@npm:^7.0.0, @jupyterlab/services@npm:^7.0.10": - version: 7.0.10 - resolution: "@jupyterlab/services@npm:7.0.10" - dependencies: - "@jupyter/ydoc": ^1.1.1 - "@jupyterlab/coreutils": ^6.0.10 - "@jupyterlab/nbformat": ^4.0.10 - "@jupyterlab/settingregistry": ^4.0.10 - "@jupyterlab/statedb": ^4.0.10 - "@lumino/coreutils": ^2.1.2 - "@lumino/disposable": ^2.1.2 - "@lumino/polling": ^2.1.2 - "@lumino/properties": ^2.0.1 - "@lumino/signaling": ^2.1.2 - ws: ^8.11.0 - checksum: 702f2c9e010ab737bb39bb04c1fc0eab32ef5bc86056aebdb9a64002e04dba123bd8fd0400913ddaef470d23e44ea9f741aa0467a068e2be2a279123e3d1e2a5 + checksum: c8ed06714364d45aff72fee58ddb53cd483272bf2d52e5d0aa5bf71ac5013f316c67b7d5b744e38729a4b4f8415f7d4fbe2901e300e21d7b05a2677e04fb44e2 languageName: node linkType: hard -"@jupyterlab/services@npm:^7.0.11": - version: 7.0.11 - resolution: "@jupyterlab/services@npm:7.0.11" +"@jupyterlab/services@npm:^7.0.0, @jupyterlab/services@npm:^7.2.3": + version: 7.2.3 + resolution: "@jupyterlab/services@npm:7.2.3" dependencies: - "@jupyter/ydoc": ^1.1.1 - "@jupyterlab/coreutils": ^6.0.11 - "@jupyterlab/nbformat": ^4.0.11 - "@jupyterlab/settingregistry": ^4.0.11 - "@jupyterlab/statedb": ^4.0.11 + "@jupyter/ydoc": ^2.0.1 + "@jupyterlab/coreutils": ^6.2.3 + "@jupyterlab/nbformat": ^4.2.3 + "@jupyterlab/settingregistry": ^4.2.3 + "@jupyterlab/statedb": ^4.2.3 "@lumino/coreutils": ^2.1.2 "@lumino/disposable": ^2.1.2 "@lumino/polling": ^2.1.2 "@lumino/properties": ^2.0.1 "@lumino/signaling": ^2.1.2 ws: ^8.11.0 - checksum: 6539cc1b34f29feaab094a570576890984fe9cc3f0140dc3b17cca1ead878197bd3d2ca01b4f6fe6808ee5dca8f720769e0db10a27f1fcad1759b6ead9631b24 - languageName: node - linkType: hard - -"@jupyterlab/settingregistry@npm:^4.0.0, @jupyterlab/settingregistry@npm:^4.0.10": - version: 4.0.10 - resolution: "@jupyterlab/settingregistry@npm:4.0.10" - dependencies: - "@jupyterlab/nbformat": ^4.0.10 - "@jupyterlab/statedb": ^4.0.10 - "@lumino/commands": ^2.1.3 - "@lumino/coreutils": ^2.1.2 - "@lumino/disposable": ^2.1.2 - "@lumino/signaling": ^2.1.2 - "@rjsf/utils": ^5.1.0 - ajv: ^8.12.0 - json5: ^2.2.3 - peerDependencies: - react: ">=16" - checksum: 6521f1d01f258eb0d9c735bc00c9680e5caf3276c4e7a0fcf12006ef7aa155409e75ceda333695b7301699e00cd29a4a4d72ffced062147315144e0c59fd5971 + checksum: 61d7eb84807ddeeaa5105bd127fb69ebc3ff939436938c1c34fdae616c3dbb5254c09d0a3fa825c76348c43de5834d14de438d4548f122e97522c4bb5172ce8e languageName: node linkType: hard -"@jupyterlab/settingregistry@npm:^4.0.11": - version: 4.0.11 - resolution: "@jupyterlab/settingregistry@npm:4.0.11" +"@jupyterlab/settingregistry@npm:^4.0.0, @jupyterlab/settingregistry@npm:^4.2.3": + version: 4.2.3 + resolution: "@jupyterlab/settingregistry@npm:4.2.3" dependencies: - "@jupyterlab/nbformat": ^4.0.11 - "@jupyterlab/statedb": ^4.0.11 - "@lumino/commands": ^2.1.3 + "@jupyterlab/nbformat": ^4.2.3 + "@jupyterlab/statedb": ^4.2.3 + "@lumino/commands": ^2.3.0 "@lumino/coreutils": ^2.1.2 "@lumino/disposable": ^2.1.2 "@lumino/signaling": ^2.1.2 - "@rjsf/utils": ^5.1.0 + "@rjsf/utils": ^5.13.4 ajv: ^8.12.0 json5: ^2.2.3 peerDependencies: react: ">=16" - checksum: 97d06a08eff0589e83c40611f50e765dc8c75b33f821bee86defdb856c7747276174cc3370374159a37ae1393779cf18634fbca69072db447c053ccb872f3117 - languageName: node - linkType: hard - -"@jupyterlab/statedb@npm:^4.0.10": - version: 4.0.10 - resolution: "@jupyterlab/statedb@npm:4.0.10" - dependencies: - "@lumino/commands": ^2.1.3 - "@lumino/coreutils": ^2.1.2 - "@lumino/disposable": ^2.1.2 - "@lumino/properties": ^2.0.1 - "@lumino/signaling": ^2.1.2 - checksum: 4032966b981c775f53b28137cde3b7c215444e898e9570b2f814c2fb1ee1d8f023702287a61d7d4267fffb71e9d8bdc2e79d165f0238a59ec0fea717540f0324 + checksum: 72eff0c5af9b6e9c3be36aea7e6b435f4bc52e770284f1c2d49061577d37bbec697afc7fe7673a22ab15e35ce4e88e3a4da485f432f42b1b4ec35bd8dfba4b3c languageName: node linkType: hard -"@jupyterlab/statedb@npm:^4.0.11": - version: 4.0.11 - resolution: "@jupyterlab/statedb@npm:4.0.11" +"@jupyterlab/statedb@npm:^4.2.3": + version: 4.2.3 + resolution: "@jupyterlab/statedb@npm:4.2.3" dependencies: - "@lumino/commands": ^2.1.3 + "@lumino/commands": ^2.3.0 "@lumino/coreutils": ^2.1.2 "@lumino/disposable": ^2.1.2 "@lumino/properties": ^2.0.1 "@lumino/signaling": ^2.1.2 - checksum: b0637af63185b71db698ce572d2fcdaee94e6fe93659ead1e2301cb6ee1ec2b16164a61275cb44af3cac679d40b1a2c3492f20b44d9eb07a75440706627cd733 - languageName: node - linkType: hard - -"@jupyterlab/statusbar@npm:^4.0.10": - version: 4.0.10 - resolution: "@jupyterlab/statusbar@npm:4.0.10" - dependencies: - "@jupyterlab/ui-components": ^4.0.10 - "@lumino/algorithm": ^2.0.1 - "@lumino/coreutils": ^2.1.2 - "@lumino/disposable": ^2.1.2 - "@lumino/messaging": ^2.0.1 - "@lumino/signaling": ^2.1.2 - "@lumino/widgets": ^2.3.0 - react: ^18.2.0 - checksum: 7c1a352bbe1142967014f24149a7ee161c18a7023852a74d5a959aa99e1bee8dc1540f9cfd5f225f7d4bafce91fd6f7577facc4ad891a2b25d2f8aa9285fa692 + checksum: 6969e54fa8370a918a4d78391116b83bd3c5afb25e1f66d7369ac2d24659b89a32bbb23500d81b50744698c504a47bd8bc355b16e4ec6ea877b74ec512aab3f8 languageName: node linkType: hard -"@jupyterlab/statusbar@npm:^4.0.11": - version: 4.0.11 - resolution: "@jupyterlab/statusbar@npm:4.0.11" +"@jupyterlab/statusbar@npm:^4.2.3": + version: 4.2.3 + resolution: "@jupyterlab/statusbar@npm:4.2.3" dependencies: - "@jupyterlab/ui-components": ^4.0.11 + "@jupyterlab/ui-components": ^4.2.3 "@lumino/algorithm": ^2.0.1 "@lumino/coreutils": ^2.1.2 "@lumino/disposable": ^2.1.2 "@lumino/messaging": ^2.0.1 "@lumino/signaling": ^2.1.2 - "@lumino/widgets": ^2.3.0 + "@lumino/widgets": ^2.3.2 react: ^18.2.0 - checksum: cb9d8e51533d1b0dd13f0459b3f33bab23c23dffdfb58467e58d47d0cb09f61fce320b67c50e3e5a2328fba9f7a815d4f483f460b6bea8b34cf7fcd02144fe10 + checksum: f5da446064b564e6fddd4f77b63548cfb593204adabe68e0c494b999639c6779298fbd75d30b94768e73be6d59b68baf137a1bc5d75de95f962b1c1eb4eca1c1 languageName: node linkType: hard "@jupyterlab/terminal@npm:^4.0.2": - version: 4.0.10 - resolution: "@jupyterlab/terminal@npm:4.0.10" + version: 4.2.3 + resolution: "@jupyterlab/terminal@npm:4.2.3" dependencies: - "@jupyterlab/apputils": ^4.1.10 - "@jupyterlab/services": ^7.0.10 - "@jupyterlab/translation": ^4.0.10 + "@jupyterlab/apputils": ^4.3.3 + "@jupyterlab/services": ^7.2.3 + "@jupyterlab/translation": ^4.2.3 "@lumino/coreutils": ^2.1.2 "@lumino/domutils": ^2.0.1 "@lumino/messaging": ^2.0.1 - "@lumino/widgets": ^2.3.0 - xterm: ~5.1.0 - xterm-addon-canvas: ~0.3.0 - xterm-addon-fit: ~0.7.0 - xterm-addon-web-links: ~0.8.0 - xterm-addon-webgl: ~0.14.0 - checksum: a91ad591f43a8c8a285a86b504bc578dbfad9a322dd62994149b2fc6d1e223af61b194d435216c32009a4f0e77ae5a01c227ba10b0d465faeb06bbd7a52172f3 + "@lumino/widgets": ^2.3.2 + "@xterm/addon-canvas": ~0.7.0 + "@xterm/addon-fit": ~0.10.0 + "@xterm/addon-web-links": ~0.11.0 + "@xterm/addon-webgl": ~0.18.0 + "@xterm/xterm": ~5.5.0 + checksum: 9f680ac5fce2c335fce3757db67d244f925e1c10370f8cbf647085bea3540ab7506a904de3521e74e3399ddfe48e18c0fabe05233b6562f6c5f7caff96fba22d languageName: node linkType: hard -"@jupyterlab/testing@npm:^4.0.10": - version: 4.0.10 - resolution: "@jupyterlab/testing@npm:4.0.10" +"@jupyterlab/testing@npm:^4.2.3": + version: 4.2.3 + resolution: "@jupyterlab/testing@npm:4.2.3" dependencies: "@babel/core": ^7.10.2 "@babel/preset-env": ^7.10.2 - "@jupyterlab/coreutils": ^6.0.10 + "@jupyterlab/coreutils": ^6.2.3 "@lumino/coreutils": ^2.1.2 "@lumino/signaling": ^2.1.2 - child_process: ~1.0.2 deepmerge: ^4.2.2 fs-extra: ^10.1.0 identity-obj-proxy: ^3.0.0 jest: ^29.2.0 jest-environment-jsdom: ^29.3.0 jest-junit: ^15.0.0 - node-fetch: ^2.6.0 simulate-event: ~1.4.0 ts-jest: ^29.1.0 peerDependencies: typescript: ">=4.3" - checksum: 8825a8826502ac1b6127162dbec43d877f8ec2df1a2101a39db6359ed737f988ae713ef62fb9a9e155bc2decb44022146e430569f404933e3087cf9c85e3fab6 + checksum: 06e2a6b2c81c6eee6fc8808ab05a7200089f388fd43d29407be1bb48493d93722331eaf03cb3f875c58df65d6d81f05cf0a8c4b89f2bd34683da8a10e1ebcf56 languageName: node linkType: hard "@jupyterlab/testutils@npm:^4.0.0": - version: 4.0.10 - resolution: "@jupyterlab/testutils@npm:4.0.10" + version: 4.2.3 + resolution: "@jupyterlab/testutils@npm:4.2.3" dependencies: - "@jupyterlab/application": ^4.0.10 - "@jupyterlab/apputils": ^4.1.10 - "@jupyterlab/notebook": ^4.0.10 - "@jupyterlab/rendermime": ^4.0.10 - "@jupyterlab/testing": ^4.0.10 - checksum: 6343547d170536bca9c595c0f5a9c4a608f4ad2354a72ca39d17cc1e0cc7a8c4e93809cdda9934c630c12bdb760e5a0d2d01819ea33103d1ca4be0363e62b399 + "@jupyterlab/application": ^4.2.3 + "@jupyterlab/apputils": ^4.3.3 + "@jupyterlab/notebook": ^4.2.3 + "@jupyterlab/rendermime": ^4.2.3 + "@jupyterlab/testing": ^4.2.3 + checksum: bada58b53e21c965a81b83105c1a1335688ca8d47118ba197b170de79c7b9f82c2c680ef6c17b01e0a307d5cfa3f10ef365f4c4b4025d99d139b1cc7d7a6997b languageName: node linkType: hard -"@jupyterlab/toc@npm:^6.0.10": - version: 6.0.10 - resolution: "@jupyterlab/toc@npm:6.0.10" +"@jupyterlab/toc@npm:^6.2.3": + version: 6.2.3 + resolution: "@jupyterlab/toc@npm:6.2.3" dependencies: - "@jupyterlab/apputils": ^4.1.10 - "@jupyterlab/coreutils": ^6.0.10 - "@jupyterlab/docregistry": ^4.0.10 - "@jupyterlab/observables": ^5.0.10 - "@jupyterlab/rendermime": ^4.0.10 - "@jupyterlab/translation": ^4.0.10 - "@jupyterlab/ui-components": ^4.0.10 + "@jupyterlab/apputils": ^4.3.3 + "@jupyterlab/coreutils": ^6.2.3 + "@jupyterlab/docregistry": ^4.2.3 + "@jupyterlab/observables": ^5.2.3 + "@jupyterlab/rendermime": ^4.2.3 + "@jupyterlab/rendermime-interfaces": ^3.10.3 + "@jupyterlab/translation": ^4.2.3 + "@jupyterlab/ui-components": ^4.2.3 "@lumino/coreutils": ^2.1.2 "@lumino/disposable": ^2.1.2 "@lumino/messaging": ^2.0.1 "@lumino/signaling": ^2.1.2 - "@lumino/widgets": ^2.3.0 + "@lumino/widgets": ^2.3.2 react: ^18.2.0 - checksum: 7079610e69a916f6e579a5936f56835ebc824f276f33df17a709c3fde4edbdfc3e7e4abd9ba0b74e169764500053ccbeb2a5cfd8b008e470baa8d25e751aaaa1 - languageName: node - linkType: hard - -"@jupyterlab/translation@npm:^4.0.10": - version: 4.0.10 - resolution: "@jupyterlab/translation@npm:4.0.10" - dependencies: - "@jupyterlab/coreutils": ^6.0.10 - "@jupyterlab/rendermime-interfaces": ^3.8.10 - "@jupyterlab/services": ^7.0.10 - "@jupyterlab/statedb": ^4.0.10 - "@lumino/coreutils": ^2.1.2 - checksum: bc959546627d58523fad02944697a5464481794f533fd5a8b1968d2fcdac64f3dbe82ea380017245ea3b65dc4c24136c39823b2a8627bcea1397c2e6a1343368 - languageName: node - linkType: hard - -"@jupyterlab/translation@npm:^4.0.11": - version: 4.0.11 - resolution: "@jupyterlab/translation@npm:4.0.11" - dependencies: - "@jupyterlab/coreutils": ^6.0.11 - "@jupyterlab/rendermime-interfaces": ^3.8.11 - "@jupyterlab/services": ^7.0.11 - "@jupyterlab/statedb": ^4.0.11 - "@lumino/coreutils": ^2.1.2 - checksum: 1e65d0a162d56724a99dcb7eec874b80e78f8113e14d9cc1461f56cebef9a21604baf1fffd43cd62f186942b63fd49effec2b1960e4e3aca0a6cbe03df46bd51 + checksum: e855adc3e2d825cbe07cda38c9fe03bfda2b8bbf36c320b30a1a70ab57d8c42cfe11a29ccc8bc7598c769443ed5baec54327830b3a7038b7285db2a3d47b7adb languageName: node linkType: hard -"@jupyterlab/ui-components@npm:^4.0.10": - version: 4.0.10 - resolution: "@jupyterlab/ui-components@npm:4.0.10" +"@jupyterlab/translation@npm:^4.2.3": + version: 4.2.3 + resolution: "@jupyterlab/translation@npm:4.2.3" dependencies: - "@jupyterlab/coreutils": ^6.0.10 - "@jupyterlab/observables": ^5.0.10 - "@jupyterlab/rendermime-interfaces": ^3.8.10 - "@jupyterlab/translation": ^4.0.10 - "@lumino/algorithm": ^2.0.1 - "@lumino/commands": ^2.1.3 + "@jupyterlab/coreutils": ^6.2.3 + "@jupyterlab/rendermime-interfaces": ^3.10.3 + "@jupyterlab/services": ^7.2.3 + "@jupyterlab/statedb": ^4.2.3 "@lumino/coreutils": ^2.1.2 - "@lumino/disposable": ^2.1.2 - "@lumino/messaging": ^2.0.1 - "@lumino/polling": ^2.1.2 - "@lumino/properties": ^2.0.1 - "@lumino/signaling": ^2.1.2 - "@lumino/virtualdom": ^2.0.1 - "@lumino/widgets": ^2.3.0 - "@rjsf/core": ^5.1.0 - "@rjsf/utils": ^5.1.0 - react: ^18.2.0 - react-dom: ^18.2.0 - typestyle: ^2.0.4 - peerDependencies: - react: ^18.2.0 - checksum: 4cff8e7f5fc6ad0c7e2041ced85dcd38d32f1570c4b4c613e25a0804f430e905a207b9d0c91f9e5674bb9bd9fb9ea7271855e82be5f523dabef01e0d63c1a499 + checksum: 0ca7334bcb09a9738ef3c4a16476f388996e6524d4e4b18c39b7ebec5aad3b6292eb17e3bc3dec73620689f5509f493455eee09d5704addaea78c2a872d6716d languageName: node linkType: hard -"@jupyterlab/ui-components@npm:^4.0.11": - version: 4.0.11 - resolution: "@jupyterlab/ui-components@npm:4.0.11" - dependencies: - "@jupyterlab/coreutils": ^6.0.11 - "@jupyterlab/observables": ^5.0.11 - "@jupyterlab/rendermime-interfaces": ^3.8.11 - "@jupyterlab/translation": ^4.0.11 +"@jupyterlab/ui-components@npm:^4.2.3": + version: 4.2.3 + resolution: "@jupyterlab/ui-components@npm:4.2.3" + dependencies: + "@jupyter/react-components": ^0.15.3 + "@jupyter/web-components": ^0.15.3 + "@jupyterlab/coreutils": ^6.2.3 + "@jupyterlab/observables": ^5.2.3 + "@jupyterlab/rendermime-interfaces": ^3.10.3 + "@jupyterlab/translation": ^4.2.3 "@lumino/algorithm": ^2.0.1 - "@lumino/commands": ^2.1.3 + "@lumino/commands": ^2.3.0 "@lumino/coreutils": ^2.1.2 "@lumino/disposable": ^2.1.2 "@lumino/messaging": ^2.0.1 @@ -3096,15 +2961,15 @@ __metadata: "@lumino/properties": ^2.0.1 "@lumino/signaling": ^2.1.2 "@lumino/virtualdom": ^2.0.1 - "@lumino/widgets": ^2.3.0 - "@rjsf/core": ^5.1.0 - "@rjsf/utils": ^5.1.0 + "@lumino/widgets": ^2.3.2 + "@rjsf/core": ^5.13.4 + "@rjsf/utils": ^5.13.4 react: ^18.2.0 react-dom: ^18.2.0 typestyle: ^2.0.4 peerDependencies: react: ^18.2.0 - checksum: 0ad2fcdcb531ffc4da4f475c24520007d65190c70bfe07888f4284256754e15ffb77d23f02a6ce44688bad0103484cba22327db49796abb13f8dfc335ea2373d + checksum: 5fc819d633fc8c9774ccd10dc68e3636b06a59089254b2290cfb15b5a04a57133ba43f6e284274c4fbf0e625f688cf49bf7e2a89758e1d98535c51a7efe53216 languageName: node linkType: hard @@ -3127,29 +2992,29 @@ __metadata: linkType: hard "@lezer/css@npm:^1.0.0, @lezer/css@npm:^1.1.0": - version: 1.1.7 - resolution: "@lezer/css@npm:1.1.7" + version: 1.1.8 + resolution: "@lezer/css@npm:1.1.8" dependencies: "@lezer/common": ^1.2.0 "@lezer/highlight": ^1.0.0 "@lezer/lr": ^1.0.0 - checksum: 7760d294fd0b1ac6db319c4990517c1ed9027d6757de537553624238056df6e1ef1b6a571a023a4bce3d7a2b891036d9f85f76f2109f503bea94837f90c64bc2 + checksum: 1f5968360dbac7ba27f0c2a194143769f7b01824715274dd8507dacf13cc790bb8c48ce95de355e9c58be93bb3e271bf98b9fc51213f79e4ce918e7c7ebbef04 languageName: node linkType: hard -"@lezer/generator@npm:^1.2.2": - version: 1.6.0 - resolution: "@lezer/generator@npm:1.6.0" +"@lezer/generator@npm:^1.7.0": + version: 1.7.1 + resolution: "@lezer/generator@npm:1.7.1" dependencies: "@lezer/common": ^1.1.0 "@lezer/lr": ^1.3.0 bin: lezer-generator: src/lezer-generator.cjs - checksum: dfbf19d0533922272ac00c4b7884e1df88e2a35dd758e4544ceb5d784aa38d5751add03ca87f35d14cc39416e0dbc06ccaf2a211a6ae982e00daaaffe9c9320c + checksum: e46df5a31252fb036ea17fce820acdf47672bb5405b2a38e26a430182b9a50b8513fde37d9a43d8334cde3bb2f2106ce7a5ab1a01e244876ce3217c4db59e627 languageName: node linkType: hard -"@lezer/highlight@npm:^1.0.0, @lezer/highlight@npm:^1.1.3, @lezer/highlight@npm:^1.1.4": +"@lezer/highlight@npm:^1.0.0, @lezer/highlight@npm:^1.1.3, @lezer/highlight@npm:^1.2.0": version: 1.2.0 resolution: "@lezer/highlight@npm:1.2.0" dependencies: @@ -3159,35 +3024,35 @@ __metadata: linkType: hard "@lezer/html@npm:^1.3.0": - version: 1.3.8 - resolution: "@lezer/html@npm:1.3.8" + version: 1.3.10 + resolution: "@lezer/html@npm:1.3.10" dependencies: "@lezer/common": ^1.2.0 "@lezer/highlight": ^1.0.0 "@lezer/lr": ^1.0.0 - checksum: 06bce804487435ea6ccb39595176bb65d68691f082b0b68fb7d22d90d4de9798a8202f16e9aefe22865db15257a37f6fca93275d660715eea98f7578579e7135 + checksum: cce391aab9259704ae3079b3209f74b2f248594dd8b851c28aaff26765e00ebb890a5ff1fe600f2d03aaf4ade0e36de8048d9632b12bfbccd47b3e649c3b0ecd languageName: node linkType: hard "@lezer/java@npm:^1.0.0": - version: 1.1.1 - resolution: "@lezer/java@npm:1.1.1" + version: 1.1.2 + resolution: "@lezer/java@npm:1.1.2" dependencies: "@lezer/common": ^1.2.0 "@lezer/highlight": ^1.0.0 "@lezer/lr": ^1.0.0 - checksum: 8a071aca6b5e1ed1d22bffed22bbd29f21b102b7337a7ea5c956eb259e6ff20eee2d6e85b7dadff69859cb6615d6b1a3f0ba109673e87ce5a1f6cabdeee626fd + checksum: 752e8c9b99cccf022669a702016e0c3a793d8326e043b1d053159f5de4d222cd188e8e31e1427cbe6a8ed8e53de3977ab551c64cbd5a76a12eb3a1da5e18b6a5 languageName: node linkType: hard "@lezer/javascript@npm:^1.0.0": - version: 1.4.13 - resolution: "@lezer/javascript@npm:1.4.13" + version: 1.4.17 + resolution: "@lezer/javascript@npm:1.4.17" dependencies: "@lezer/common": ^1.2.0 "@lezer/highlight": ^1.1.3 "@lezer/lr": ^1.3.0 - checksum: a5e4607fec7671dff66d1f3bfee5a5da7395982f1867e17ac4d8f2d8f223451fb18516ef2699340b148af112176a07e1fcba9e63c5f8397c12895dd0509113d6 + checksum: dfcc4130af0bc681cd1ff6ec655a58e747fd877d8aadad2deba5f84512fa539177ece602c5389f4354c93555d3064737dedbe3384ca48b03c4968126bfd1b9a9 languageName: node linkType: hard @@ -3203,21 +3068,21 @@ __metadata: linkType: hard "@lezer/lr@npm:^1.0.0, @lezer/lr@npm:^1.1.0, @lezer/lr@npm:^1.3.0": - version: 1.3.14 - resolution: "@lezer/lr@npm:1.3.14" + version: 1.4.1 + resolution: "@lezer/lr@npm:1.4.1" dependencies: "@lezer/common": ^1.0.0 - checksum: 07be41edcb6c332a3567436d2c626131544181c4d680811baf23f6157db3dce4ebfef325cbd0b88dc8b128b83fbe6363c5dcf3e0a4ff369ddfae05d9f207daee + checksum: 65ae107a14619b1c514040eec2c48470e921895bb10a80d0b90e7735e121138c50e8207e2e0d9339e7cc42a716cdb367ae08f282c452934c89860093b26c40c2 languageName: node linkType: hard -"@lezer/markdown@npm:^1.0.0, @lezer/markdown@npm:^1.0.2": - version: 1.2.0 - resolution: "@lezer/markdown@npm:1.2.0" +"@lezer/markdown@npm:^1.0.0, @lezer/markdown@npm:^1.2.0": + version: 1.3.0 + resolution: "@lezer/markdown@npm:1.3.0" dependencies: "@lezer/common": ^1.0.0 "@lezer/highlight": ^1.0.0 - checksum: e6355272ad98c97b339dd42d8d9b78fa4f48fdcc5c9c408720936cacb7d2bcd47b0cedf8e0997ef93539c2b03a65326fc59372e54f0b24acd98630e06869a350 + checksum: 13eb2720e4cb84278349bad8af116f748813094f99fad02680010c3a8c5985e0358c344487990f87a31ef0d6c1a2be582301f914c0e4a6e9cfa22647b6cd6545 languageName: node linkType: hard @@ -3233,13 +3098,13 @@ __metadata: linkType: hard "@lezer/python@npm:^1.1.4": - version: 1.1.11 - resolution: "@lezer/python@npm:1.1.11" + version: 1.1.14 + resolution: "@lezer/python@npm:1.1.14" dependencies: "@lezer/common": ^1.2.0 "@lezer/highlight": ^1.0.0 "@lezer/lr": ^1.0.0 - checksum: ed0e58317716967644f57bf29eb902c0c205b909bc035c0960520222a79bd6525468c8adfb7d824787a8a29ec7a1c7d2da5fd59f912cdeff2830c71958b9576d + checksum: 1608187f698e972d11b340dfdfd79e15b1359641e386e386befd37d5e5839620b45a5a39c5616792a24da29ef1d99d11ea0dad52b9617f1767e7ea6a11c2fed3 languageName: node linkType: hard @@ -3255,172 +3120,221 @@ __metadata: linkType: hard "@lezer/xml@npm:^1.0.0": - version: 1.0.4 - resolution: "@lezer/xml@npm:1.0.4" + version: 1.0.5 + resolution: "@lezer/xml@npm:1.0.5" dependencies: "@lezer/common": ^1.2.0 "@lezer/highlight": ^1.0.0 "@lezer/lr": ^1.0.0 - checksum: 68a82085bff6c1525f4ef03cd9f9dac0132b3e03fe574e0289700dd4475056e40e8744cde15cf5ad6d3760d0d584ff85ce707e26a7c938d0c5fe2e325c1c336e + checksum: a0a077b9e455b03593b93a7fdff2a4eab2cb7b230c8e1b878a8bebe80184632b9cc75ca018f1f9e2acb3a26e1386f4777385ab6e87aea70ccf479cde5ca268ee + languageName: node + linkType: hard + +"@lumino/algorithm@npm:^2.0.1, @lumino/algorithm@npm:^2.0.2": + version: 2.0.2 + resolution: "@lumino/algorithm@npm:2.0.2" + checksum: 34b25684b845f1bdbf78ca45ebd99a97b67b2992440c9643aafe5fc5a99fae1ddafa9e5890b246b233dc3a12d9f66aa84afe4a2aac44cf31071348ed217740db + languageName: node + linkType: hard + +"@lumino/application@npm:^2.3.1": + version: 2.4.0 + resolution: "@lumino/application@npm:2.4.0" + dependencies: + "@lumino/commands": ^2.3.1 + "@lumino/coreutils": ^2.2.0 + "@lumino/widgets": ^2.4.0 + checksum: cac5233f94a07412fd3f2fe8e6f9b446f96bf076c4a63c3c05098103d88da68ab55480d0c10cda0b3e9ea8f9cd1d6c8acc817eb3348f3dc275be7271450da976 + languageName: node + linkType: hard + +"@lumino/collections@npm:^2.0.2": + version: 2.0.2 + resolution: "@lumino/collections@npm:2.0.2" + dependencies: + "@lumino/algorithm": ^2.0.2 + checksum: e8bb2068a3741940e0dd396fa729c3c9d12458b41b7c2a9d171c5c034e69fb5834116a824094a8aa4182397e13abace06025ed5032a755ea85b976eae74ee9a9 + languageName: node + linkType: hard + +"@lumino/commands@npm:^2.3.0, @lumino/commands@npm:^2.3.1": + version: 2.3.1 + resolution: "@lumino/commands@npm:2.3.1" + dependencies: + "@lumino/algorithm": ^2.0.2 + "@lumino/coreutils": ^2.2.0 + "@lumino/disposable": ^2.1.3 + "@lumino/domutils": ^2.0.2 + "@lumino/keyboard": ^2.0.2 + "@lumino/signaling": ^2.1.3 + "@lumino/virtualdom": ^2.0.2 + checksum: 83bc6d66de37e58582b00f70ce66e797c9fcf84e36041c6881631ed0d281305e2a49927f5b2fe6c5c965733f3cd6fb4a233c7b7967fc050497024a941659bd65 languageName: node linkType: hard -"@lumino/algorithm@npm:^2.0.1": - version: 2.0.1 - resolution: "@lumino/algorithm@npm:2.0.1" - checksum: cbf7fcf6ee6b785ea502cdfddc53d61f9d353dcb9659343511d5cd4b4030be2ff2ca4c08daec42f84417ab0318a3d9972a17319fa5231693e109ab112dcf8000 +"@lumino/coreutils@npm:^1.11.0 || ^2.0.0, @lumino/coreutils@npm:^1.11.0 || ^2.1.2, @lumino/coreutils@npm:^2.1.2, @lumino/coreutils@npm:^2.2.0": + version: 2.2.0 + resolution: "@lumino/coreutils@npm:2.2.0" + dependencies: + "@lumino/algorithm": ^2.0.2 + checksum: 345fcd5d7493d745831dd944edfbd8eda06cc59a117e71023fc97ce53badd697be2bd51671f071f5ff0064f75f104575d9695f116a07517bafbedd38e5c7a785 languageName: node linkType: hard -"@lumino/application@npm:^2.2.1": - version: 2.3.0 - resolution: "@lumino/application@npm:2.3.0" +"@lumino/disposable@npm:^1.10.0 || ^2.0.0, @lumino/disposable@npm:^2.1.2, @lumino/disposable@npm:^2.1.3": + version: 2.1.3 + resolution: "@lumino/disposable@npm:2.1.3" dependencies: - "@lumino/commands": ^2.2.0 - "@lumino/coreutils": ^2.1.2 - "@lumino/widgets": ^2.3.1 - checksum: 9d1eb5bc972ed158bf219604a53bbac1262059bc5b0123d3e041974486b9cbb8288abeeec916f3b62f62d7c32e716cccf8b73e4832ae927e4f9dd4e4b0cd37ed + "@lumino/signaling": ^2.1.3 + checksum: b9a346fa2752b3cd1b053cb637ee173501d33082a73423429070e8acc508b034ea0babdae0549b923cbdd287ee1fc7f6159f0539c9fff7574393a214eef07c57 languageName: node linkType: hard -"@lumino/collections@npm:^2.0.1": - version: 2.0.1 - resolution: "@lumino/collections@npm:2.0.1" - dependencies: - "@lumino/algorithm": ^2.0.1 - checksum: 8a29b7973a388a33c5beda0819dcd2dc2aad51a8406dcfd4581b055a9f77a39dc5800f7a8b4ae3c0bb97ae7b56a7a869e2560ffb7a920a28e93b477ba05907d6 +"@lumino/domutils@npm:^2.0.1, @lumino/domutils@npm:^2.0.2": + version: 2.0.2 + resolution: "@lumino/domutils@npm:2.0.2" + checksum: 037b8d0b62af43887fd7edd506fa551e2af104a4b46d62e6fef256e16754dba40d351513beb5083834d468b2c7806aae0fe205fd6aac8ef24759451ee998bbd9 languageName: node linkType: hard -"@lumino/commands@npm:^2.1.3, @lumino/commands@npm:^2.2.0": - version: 2.2.0 - resolution: "@lumino/commands@npm:2.2.0" +"@lumino/dragdrop@npm:^2.1.4, @lumino/dragdrop@npm:^2.1.5": + version: 2.1.5 + resolution: "@lumino/dragdrop@npm:2.1.5" dependencies: - "@lumino/algorithm": ^2.0.1 - "@lumino/coreutils": ^2.1.2 - "@lumino/disposable": ^2.1.2 - "@lumino/domutils": ^2.0.1 - "@lumino/keyboard": ^2.0.1 - "@lumino/signaling": ^2.1.2 - "@lumino/virtualdom": ^2.0.1 - checksum: 093e9715491e5cef24bc80665d64841417b400f2fa595f9b60832a3b6340c405c94a6aa276911944a2c46d79a6229f3cc087b73f50852bba25ece805abd0fae9 + "@lumino/coreutils": ^2.2.0 + "@lumino/disposable": ^2.1.3 + checksum: 48e34bea73186dcde4565fa68cd25067b7f5fe910813d28da9ab3c5392bfaa0b26aab1290635dc953d85bbb139da7ac1ffc040a5d5777d58fd087975dd4b5ef7 languageName: node linkType: hard -"@lumino/coreutils@npm:^1.11.0 || ^2.0.0, @lumino/coreutils@npm:^1.11.0 || ^2.1.2, @lumino/coreutils@npm:^2.1.2": - version: 2.1.2 - resolution: "@lumino/coreutils@npm:2.1.2" - checksum: 7865317ac0676b448d108eb57ab5d8b2a17c101995c0f7a7106662d9fe6c859570104525f83ee3cda12ae2e326803372206d6f4c1f415a5b59e4158a7b81066f +"@lumino/keyboard@npm:^2.0.2": + version: 2.0.2 + resolution: "@lumino/keyboard@npm:2.0.2" + checksum: 198e8c17825c9a831fa0770f58a71574b936acb0f0bbbe7f8feb73d89686dda7ff41fcb02d12b401f5d462b45fe0bba24f7f38befb7cefe0826576559f0bee6d languageName: node linkType: hard -"@lumino/disposable@npm:^1.10.0 || ^2.0.0, @lumino/disposable@npm:^2.1.2": - version: 2.1.2 - resolution: "@lumino/disposable@npm:2.1.2" +"@lumino/messaging@npm:^2.0.1, @lumino/messaging@npm:^2.0.2": + version: 2.0.2 + resolution: "@lumino/messaging@npm:2.0.2" dependencies: - "@lumino/signaling": ^2.1.2 - checksum: ac2fb2bf18d0b2939fda454f3db248a0ff6e8a77b401e586d1caa9293b3318f808b93a117c9c3ac27cd17aab545aea83b49108d099b9b2f5503ae2a012fbc6e2 + "@lumino/algorithm": ^2.0.2 + "@lumino/collections": ^2.0.2 + checksum: 66abd8c473026123589dc22f2ce8f85da10e0b1a05c05ed9b2011035721da5f751cc7ef63b628877f446a78a4287e26ad1450efbeaf0c2e03b1d08be9abaca4d languageName: node linkType: hard -"@lumino/domutils@npm:^2.0.1": - version: 2.0.1 - resolution: "@lumino/domutils@npm:2.0.1" - checksum: 61fa0ab226869dfbb763fc426790cf5a43b7d6f4cea1364c6dd56d61c44bff05eea188d33ff847449608ef58ed343161bee15c19b96f35410e4ee35815dc611a +"@lumino/polling@npm:^2.1.2": + version: 2.1.3 + resolution: "@lumino/polling@npm:2.1.3" + dependencies: + "@lumino/coreutils": ^2.2.0 + "@lumino/disposable": ^2.1.3 + "@lumino/signaling": ^2.1.3 + checksum: 2c94dbc2339dd06b3b89a3a690d23576ce095f92bf1f614557dcaeb1c1a8a707b2a18d78c03e5fd7376a43e3f393cc4fec42a65580ae4b67c6630ea86cecbac6 languageName: node linkType: hard -"@lumino/dragdrop@npm:^2.1.4": - version: 2.1.4 - resolution: "@lumino/dragdrop@npm:2.1.4" - dependencies: - "@lumino/coreutils": ^2.1.2 - "@lumino/disposable": ^2.1.2 - checksum: 43d82484b13b38b612e7dfb424a840ed6a38d0db778af10655c4ba235c67b5b12db1683929b35a36ab2845f77466066dfd1ee25c1c273e8e175677eba9dc560d +"@lumino/properties@npm:^2.0.1, @lumino/properties@npm:^2.0.2": + version: 2.0.2 + resolution: "@lumino/properties@npm:2.0.2" + checksum: cbe802bd49ced7e13e50b1d89b82e0f03fb44a590c704e6b9343226498b21d8abfe119b024209e79876b4fc0938dbf85e964c6c4cd5bbdd4d7ba41ce0fb69f3f languageName: node linkType: hard -"@lumino/keyboard@npm:^2.0.1": - version: 2.0.1 - resolution: "@lumino/keyboard@npm:2.0.1" - checksum: cf33f13427a418efd7cc91061233321e860d5404f3d86397781028309bef86c8ad2d88276ffe335c1db0fe619bd9d1e60641c81f881696957a58703ee4652c3e +"@lumino/signaling@npm:^1.10.0 || ^2.0.0, @lumino/signaling@npm:^2.1.2, @lumino/signaling@npm:^2.1.3": + version: 2.1.3 + resolution: "@lumino/signaling@npm:2.1.3" + dependencies: + "@lumino/algorithm": ^2.0.2 + "@lumino/coreutils": ^2.2.0 + checksum: ce59383bd75fe30df5800e0442dbc4193cc6778e2530b9be0f484d159f1d8668be5c6ee92cee9df36d5a0c3dbd9126d0479a82581dee1df889d5c9f922d3328d languageName: node linkType: hard -"@lumino/messaging@npm:^2.0.1": - version: 2.0.1 - resolution: "@lumino/messaging@npm:2.0.1" +"@lumino/virtualdom@npm:^2.0.1, @lumino/virtualdom@npm:^2.0.2": + version: 2.0.2 + resolution: "@lumino/virtualdom@npm:2.0.2" dependencies: - "@lumino/algorithm": ^2.0.1 - "@lumino/collections": ^2.0.1 - checksum: 964c4651c374b17452b4252b7d71500b32d2ecd87c192fc5bcf5d3bd1070661d78d07edcac8eca7d1d6fd50aa25992505485e1296d6dd995691b8e349b652045 + "@lumino/algorithm": ^2.0.2 + checksum: 0e1220d5b3b2441e7668f3542a6341e015bdbea0c8bd6d4be962009386c034336540732596d5dedcd54ca57fbde61c2942549129a3e1b0fccb1aa143685fcd15 languageName: node linkType: hard -"@lumino/polling@npm:^2.1.2": - version: 2.1.2 - resolution: "@lumino/polling@npm:2.1.2" +"@lumino/widgets@npm:^1.37.2 || ^2.3.2, @lumino/widgets@npm:^2.1.1, @lumino/widgets@npm:^2.3.2, @lumino/widgets@npm:^2.4.0": + version: 2.4.0 + resolution: "@lumino/widgets@npm:2.4.0" dependencies: - "@lumino/coreutils": ^2.1.2 - "@lumino/disposable": ^2.1.2 - "@lumino/signaling": ^2.1.2 - checksum: fa9b401e6dbeb8f31d7e3ba485e8ef1e0c92b3f2da086239c0ed49931026f5d3528709193c93e031e35ac624fb4bbbfcdcbaa0e25eb797f36e2952e5cd91e9e3 + "@lumino/algorithm": ^2.0.2 + "@lumino/commands": ^2.3.1 + "@lumino/coreutils": ^2.2.0 + "@lumino/disposable": ^2.1.3 + "@lumino/domutils": ^2.0.2 + "@lumino/dragdrop": ^2.1.5 + "@lumino/keyboard": ^2.0.2 + "@lumino/messaging": ^2.0.2 + "@lumino/properties": ^2.0.2 + "@lumino/signaling": ^2.1.3 + "@lumino/virtualdom": ^2.0.2 + checksum: 0a57ce4228b143c52ae97c7057ab66e1b4cbe902075c6356924fcc589d3f1aae7611bb028d476ce8d72ef7546fd303e9ec898ebb2c3d34fe1e94ca27a7ab7e00 languageName: node linkType: hard -"@lumino/properties@npm:^2.0.1": - version: 2.0.1 - resolution: "@lumino/properties@npm:2.0.1" - checksum: c50173a935148cc4148fdaea119df1d323ee004ae16ab666800388d27e9730345629662d85f25591683329b39f0cdae60ee8c94e8943b4d0ef7d7370a38128d6 +"@microsoft/fast-colors@npm:^5.3.1": + version: 5.3.1 + resolution: "@microsoft/fast-colors@npm:5.3.1" + checksum: ff87f402faadb4b5aeee3d27762566c11807f927cd4012b8bbc7f073ca68de0e2197f95330ff5dfd7038f4b4f0e2f51b11feb64c5d570f5c598d37850a5daf60 languageName: node linkType: hard -"@lumino/signaling@npm:^1.10.0 || ^2.0.0, @lumino/signaling@npm:^2.1.2": - version: 2.1.2 - resolution: "@lumino/signaling@npm:2.1.2" +"@microsoft/fast-element@npm:^1.12.0, @microsoft/fast-element@npm:^1.13.0": + version: 1.13.0 + resolution: "@microsoft/fast-element@npm:1.13.0" + checksum: 1cb7b4cfb7531116a3542d3f59bf1dd35106194f5764205403590250aaff744de79e35a5a1f36b4941c4eda9edc088148d4d629fb80be15fdf25f6be01770f3a + languageName: node + linkType: hard + +"@microsoft/fast-foundation@npm:^2.49.4, @microsoft/fast-foundation@npm:^2.49.6": + version: 2.49.6 + resolution: "@microsoft/fast-foundation@npm:2.49.6" dependencies: - "@lumino/algorithm": ^2.0.1 - "@lumino/coreutils": ^2.1.2 - checksum: ad7d7153db57980da899c43e412e6130316ef30b231a70250e7af49058db16cadb018c1417a2ea8083d83c48623cfe6b705fa82bf10216b1a8949aed9f4aca4e + "@microsoft/fast-element": ^1.13.0 + "@microsoft/fast-web-utilities": ^5.4.1 + tabbable: ^5.2.0 + tslib: ^1.13.0 + checksum: 15fdf9dd0b910a72a9cff140f765d522304df11f8a78d5a97a815e2bbae25027c2b336e94f89ca31e650d6aabe17b590b7453acc0d2cb7340c219eb76350a942 languageName: node linkType: hard -"@lumino/virtualdom@npm:^2.0.1": - version: 2.0.1 - resolution: "@lumino/virtualdom@npm:2.0.1" +"@microsoft/fast-react-wrapper@npm:^0.3.22": + version: 0.3.24 + resolution: "@microsoft/fast-react-wrapper@npm:0.3.24" dependencies: - "@lumino/algorithm": ^2.0.1 - checksum: cf59b6f15b430e13e9e657b7a0619b9056cd9ea7b2a87f407391d071c501b77403c302b6a66dca510382045e75b2e3fe551630bb391f1c6b33678057d4bec164 + "@microsoft/fast-element": ^1.13.0 + "@microsoft/fast-foundation": ^2.49.6 + peerDependencies: + react: ">=16.9.0" + checksum: 1d7a87509c22872bafc9b5c64f66659e52ba0cfdff484d7204125e503dafdea143f5e1bd2a643e2f3fbba6cc7567d916393369433f19dab9f0adcbe7a88b7d98 languageName: node linkType: hard -"@lumino/widgets@npm:^1.37.2 || ^2.3.0, @lumino/widgets@npm:^2.1.1, @lumino/widgets@npm:^2.3.0, @lumino/widgets@npm:^2.3.1": - version: 2.3.1 - resolution: "@lumino/widgets@npm:2.3.1" +"@microsoft/fast-web-utilities@npm:^5.4.1": + version: 5.4.1 + resolution: "@microsoft/fast-web-utilities@npm:5.4.1" dependencies: - "@lumino/algorithm": ^2.0.1 - "@lumino/commands": ^2.2.0 - "@lumino/coreutils": ^2.1.2 - "@lumino/disposable": ^2.1.2 - "@lumino/domutils": ^2.0.1 - "@lumino/dragdrop": ^2.1.4 - "@lumino/keyboard": ^2.0.1 - "@lumino/messaging": ^2.0.1 - "@lumino/properties": ^2.0.1 - "@lumino/signaling": ^2.1.2 - "@lumino/virtualdom": ^2.0.1 - checksum: ba7b8f8839c1cd2a41dbda13281094eb6981a270cccf4f25a0cf83686dcc526a2d8044a20204317630bb7dd4a04d65361408c7623a921549c781afca84b91c67 + exenv-es6: ^1.1.1 + checksum: 303e87847f962944f474e3716c3eb305668243916ca9e0719e26bb9a32346144bc958d915c103776b3e552cea0f0f6233f839fad66adfdf96a8436b947288ca7 languageName: node linkType: hard -"@mui/base@npm:5.0.0-beta.32, @mui/base@npm:^5.0.0-beta.22": - version: 5.0.0-beta.32 - resolution: "@mui/base@npm:5.0.0-beta.32" +"@mui/base@npm:5.0.0-beta.40, @mui/base@npm:^5.0.0-beta.22": + version: 5.0.0-beta.40 + resolution: "@mui/base@npm:5.0.0-beta.40" dependencies: - "@babel/runtime": ^7.23.8 - "@floating-ui/react-dom": ^2.0.5 - "@mui/types": ^7.2.13 - "@mui/utils": ^5.15.5 + "@babel/runtime": ^7.23.9 + "@floating-ui/react-dom": ^2.0.8 + "@mui/types": ^7.2.14 + "@mui/utils": ^5.15.14 "@popperjs/core": ^2.11.8 clsx: ^2.1.0 prop-types: ^15.8.1 @@ -3431,22 +3345,22 @@ __metadata: peerDependenciesMeta: "@types/react": optional: true - checksum: 5f27be8914c072ffcbe6720de9aa6129180e68927657e8bcbc03a6f322d1ee6c6740a199d72ed0b490a7b29b79cc0c59d1e05a427089b17f4cbc9cc756e67506 + checksum: 9c084ee67de372411a71af5eca9a5367db9f5bce57bb43973629c522760fe64fa2a43d2934dccd24d6dcbcd0ed399c5fc5c461226c86104f5767de1c9b8deba2 languageName: node linkType: hard -"@mui/core-downloads-tracker@npm:^5.15.5": - version: 5.15.5 - resolution: "@mui/core-downloads-tracker@npm:5.15.5" - checksum: 4c9b1281ebe8d17d402e22f7f50c347c0b3918b1ed17af721f4de5ce282d90bc6d90fe9730595998b2bbb2f7ebe57fc55d4c858f31754fccdb606af472a59dc8 +"@mui/core-downloads-tracker@npm:^5.15.21": + version: 5.15.21 + resolution: "@mui/core-downloads-tracker@npm:5.15.21" + checksum: c6f8e2350597833a96593f65e5081930a1006b645be6a34750e93e15e111eeca6973562b42688f5d6393a050401b7196d58c2aa2de96a112ac27fb998411742a languageName: node linkType: hard "@mui/icons-material@npm:^5.11.16": - version: 5.14.5 - resolution: "@mui/icons-material@npm:5.14.5" + version: 5.15.21 + resolution: "@mui/icons-material@npm:5.15.21" dependencies: - "@babel/runtime": ^7.23.8 + "@babel/runtime": ^7.23.9 peerDependencies: "@mui/material": ^5.0.0 "@types/react": ^17.0.0 || ^18.0.0 @@ -3454,19 +3368,19 @@ __metadata: peerDependenciesMeta: "@types/react": optional: true - checksum: 0e36af94e0bae360d1235a7521e57bd43b0a8f492460429a1bebb29fba3e1824371bb158d2d02c9f5c226d19b03e55e41c2bf036890dc3ec7f119a1023142d80 + checksum: b082fd4ae2372c8ca167a5e365e7e5bca6b78123be50b4cb001665533d0b3fe5590715dbce54ad4088668e5429a56bdbf11d78c4ff7d571b87018965617a9e6d languageName: node linkType: hard "@mui/lab@npm:^5.0.0-alpha.133": - version: 5.0.0-alpha.161 - resolution: "@mui/lab@npm:5.0.0-alpha.161" - dependencies: - "@babel/runtime": ^7.23.8 - "@mui/base": 5.0.0-beta.32 - "@mui/system": ^5.15.5 - "@mui/types": ^7.2.13 - "@mui/utils": ^5.15.5 + version: 5.0.0-alpha.170 + resolution: "@mui/lab@npm:5.0.0-alpha.170" + dependencies: + "@babel/runtime": ^7.23.9 + "@mui/base": 5.0.0-beta.40 + "@mui/system": ^5.15.15 + "@mui/types": ^7.2.14 + "@mui/utils": ^5.15.14 clsx: ^2.1.0 prop-types: ^15.8.1 peerDependencies: @@ -3483,23 +3397,23 @@ __metadata: optional: true "@types/react": optional: true - checksum: 73aab08dc43599cfeb65cbd20af7b9b4311b72a6d785722eef6dd59bdb08aacc76e5f5659a29c75724ae79c0e440cb2283908a0d43f1093a3fd298e1c53118de + checksum: feecaa4691a0efde4d4a7c60fa646c94947bf4124099cfc496829c289515ff77ceaf7dc19bdcbf296eadcfd687a57fade6c4da7df872ed0b0df6df4cada55a92 languageName: node linkType: hard "@mui/material@npm:^5.13.4": - version: 5.15.5 - resolution: "@mui/material@npm:5.15.5" - dependencies: - "@babel/runtime": ^7.23.8 - "@mui/base": 5.0.0-beta.32 - "@mui/core-downloads-tracker": ^5.15.5 - "@mui/system": ^5.15.5 - "@mui/types": ^7.2.13 - "@mui/utils": ^5.15.5 + version: 5.15.21 + resolution: "@mui/material@npm:5.15.21" + dependencies: + "@babel/runtime": ^7.23.9 + "@mui/base": 5.0.0-beta.40 + "@mui/core-downloads-tracker": ^5.15.21 + "@mui/system": ^5.15.20 + "@mui/types": ^7.2.14 + "@mui/utils": ^5.15.20 "@types/react-transition-group": ^4.4.10 clsx: ^2.1.0 - csstype: ^3.1.2 + csstype: ^3.1.3 prop-types: ^15.8.1 react-is: ^18.2.0 react-transition-group: ^4.4.5 @@ -3516,16 +3430,16 @@ __metadata: optional: true "@types/react": optional: true - checksum: dbfcb31810c674d9ab3b9145752433de3917d9c0d1b491bdff84c44b8f1124e8fe8ab04fa09b974b497983b7bd3011b86fb441ad365f979f971d3ddb46712060 + checksum: fd903dcc6f63296bf7754cd87210fce4a35b79ae8e1e91c2b8e2a5ac5f7ff06ac0fcddae65c6a51d06ae6b1d9a1391b6292a4b167948f97e2d4b1f62dd6a5dd3 languageName: node linkType: hard -"@mui/private-theming@npm:^5.15.5": - version: 5.15.5 - resolution: "@mui/private-theming@npm:5.15.5" +"@mui/private-theming@npm:^5.15.20": + version: 5.15.20 + resolution: "@mui/private-theming@npm:5.15.20" dependencies: - "@babel/runtime": ^7.23.8 - "@mui/utils": ^5.15.5 + "@babel/runtime": ^7.23.9 + "@mui/utils": ^5.15.20 prop-types: ^15.8.1 peerDependencies: "@types/react": ^17.0.0 || ^18.0.0 @@ -3533,17 +3447,17 @@ __metadata: peerDependenciesMeta: "@types/react": optional: true - checksum: 3a5f7f190aa69a0ad69a34f77e54ee2fdcb088d21a61d4720b76d098d178e1c3f6a470fc5e7a30d351db10efbc062cb11af75b8789e2f38eaa2ca612bcb0f851 + checksum: 5c70a9ebca3827cea11d67b3f8ed24d18a10c44f30f14d8d1c37b3f1e74d7a5e91cec5ffb7f24e8b2d974b38e4d046a93473c20a0cd7c7a880580e5df3d1afb7 languageName: node linkType: hard -"@mui/styled-engine@npm:^5.15.5": - version: 5.15.5 - resolution: "@mui/styled-engine@npm:5.15.5" +"@mui/styled-engine@npm:^5.15.14": + version: 5.15.14 + resolution: "@mui/styled-engine@npm:5.15.14" dependencies: - "@babel/runtime": ^7.23.8 + "@babel/runtime": ^7.23.9 "@emotion/cache": ^11.11.0 - csstype: ^3.1.2 + csstype: ^3.1.3 prop-types: ^15.8.1 peerDependencies: "@emotion/react": ^11.4.1 @@ -3554,21 +3468,21 @@ __metadata: optional: true "@emotion/styled": optional: true - checksum: 42bb7f50ed33ec88f799bd90a00337689837ee0b2d603681fe69c9a14850e5ae1d037505365ce78cd564307cc2c0654c46cece8d9250adb21c77b1de316e3c45 + checksum: 23b45c859a4f0d2b10933d06a6082c0ff093f7b6d8d32a2bfe3a6e515fe46d7a38ca9e7150d45c025a2e98d963bae9a5991d131cf4748b62670075ef0fa321ed languageName: node linkType: hard -"@mui/system@npm:^5.13.2, @mui/system@npm:^5.15.5": - version: 5.15.5 - resolution: "@mui/system@npm:5.15.5" +"@mui/system@npm:^5.13.2, @mui/system@npm:^5.15.15, @mui/system@npm:^5.15.20": + version: 5.15.20 + resolution: "@mui/system@npm:5.15.20" dependencies: - "@babel/runtime": ^7.23.8 - "@mui/private-theming": ^5.15.5 - "@mui/styled-engine": ^5.15.5 - "@mui/types": ^7.2.13 - "@mui/utils": ^5.15.5 + "@babel/runtime": ^7.23.9 + "@mui/private-theming": ^5.15.20 + "@mui/styled-engine": ^5.15.14 + "@mui/types": ^7.2.14 + "@mui/utils": ^5.15.20 clsx: ^2.1.0 - csstype: ^3.1.2 + csstype: ^3.1.3 prop-types: ^15.8.1 peerDependencies: "@emotion/react": ^11.5.0 @@ -3582,27 +3496,27 @@ __metadata: optional: true "@types/react": optional: true - checksum: 3f736f120d65fa14588cd7554a9ef63c9d4480716807d7ee5543b9f25d936b5ac0396a51a565c53b2905114fed5f94880c896f091e8d269260bfc53e8a8e2fb5 + checksum: e9e79b6a905845aef87939de8ac7990d73a2f92bba02e41905dcb9f44e53727bdfa52a978cf59a2a2cfa73d2512df78c4351eb130d7c25af1880bb8b7ebfc686 languageName: node linkType: hard -"@mui/types@npm:^7.2.13": - version: 7.2.13 - resolution: "@mui/types@npm:7.2.13" +"@mui/types@npm:^7.2.14": + version: 7.2.14 + resolution: "@mui/types@npm:7.2.14" peerDependencies: "@types/react": ^17.0.0 || ^18.0.0 peerDependenciesMeta: "@types/react": optional: true - checksum: 58dfc96f9654288519ff01d6b54e6a242f05cadad51210deb85710a81be4fa1501a116c8968e2614b16c748fc1f407dc23beeeeae70fa37fceb6c6de876ff70d + checksum: 615c9f9110933157f5d3c4fee69d6e70b98fc0d9ebc3b63079b6a1e23e6b389748687a25ab4ac15b56166fc228885da87c3929503b41fa322cfdee0f6d411206 languageName: node linkType: hard -"@mui/utils@npm:^5.14.16, @mui/utils@npm:^5.15.5": - version: 5.15.5 - resolution: "@mui/utils@npm:5.15.5" +"@mui/utils@npm:^5.14.16, @mui/utils@npm:^5.15.14, @mui/utils@npm:^5.15.20": + version: 5.15.20 + resolution: "@mui/utils@npm:5.15.20" dependencies: - "@babel/runtime": ^7.23.8 + "@babel/runtime": ^7.23.9 "@types/prop-types": ^15.7.11 prop-types: ^15.8.1 react-is: ^18.2.0 @@ -3612,13 +3526,13 @@ __metadata: peerDependenciesMeta: "@types/react": optional: true - checksum: fe71ce69e23cb4c00886138da1422e4baa66959cd10f97b2aa00f7324a038b13084ea4a0da123774c0018f48ddb6ce4f3cb20a915ec3c5c1ff5495bf337f665f + checksum: 8f8c7f9129e0eb1bf55c1d675c647da1fa4acf1c7f50e0ce2ce750cc0603e62fdc21b76e8ef8ff9bf06bce054e9cf97210ed737f55887b0ef939bd6605b4e537 languageName: node linkType: hard "@mui/x-date-pickers@npm:^6.19.0": - version: 6.19.0 - resolution: "@mui/x-date-pickers@npm:6.19.0" + version: 6.20.2 + resolution: "@mui/x-date-pickers@npm:6.20.2" dependencies: "@babel/runtime": ^7.23.2 "@mui/base": ^5.0.0-beta.22 @@ -3660,7 +3574,7 @@ __metadata: optional: true moment-jalaali: optional: true - checksum: 65da961de3012c1453ce7589c836fac0808fdfe00aa90311d5e11b2a2197c2aa61930200fded61598e5ec86f6fef1c683951078a623e18ee5f4c129b5a760545 + checksum: 0447b911ea0d78d4ee2080827bc075d8c1ed4764bd289d6bf65ee2ff870ac8ef72daef8a1858ccf27aad6c296cfece5455f6834a2d18a2c8e719518cd5464a0b languageName: node linkType: hard @@ -3692,24 +3606,24 @@ __metadata: linkType: hard "@npmcli/agent@npm:^2.0.0": - version: 2.2.0 - resolution: "@npmcli/agent@npm:2.2.0" + version: 2.2.2 + resolution: "@npmcli/agent@npm:2.2.2" dependencies: agent-base: ^7.1.0 http-proxy-agent: ^7.0.0 https-proxy-agent: ^7.0.1 lru-cache: ^10.0.1 - socks-proxy-agent: ^8.0.1 - checksum: 3b25312edbdfaa4089af28e2d423b6f19838b945e47765b0c8174c1395c79d43c3ad6d23cb364b43f59fd3acb02c93e3b493f72ddbe3dfea04c86843a7311fc4 + socks-proxy-agent: ^8.0.3 + checksum: 67de7b88cc627a79743c88bab35e023e23daf13831a8aa4e15f998b92f5507b644d8ffc3788afc8e64423c612e0785a6a92b74782ce368f49a6746084b50d874 languageName: node linkType: hard "@npmcli/fs@npm:^3.1.0": - version: 3.1.0 - resolution: "@npmcli/fs@npm:3.1.0" + version: 3.1.1 + resolution: "@npmcli/fs@npm:3.1.1" dependencies: semver: ^7.3.5 - checksum: a50a6818de5fc557d0b0e6f50ec780a7a02ab8ad07e5ac8b16bf519e0ad60a144ac64f97d05c443c3367235d337182e1d012bbac0eb8dbae8dc7b40b193efd0e + checksum: d960cab4b93adcb31ce223bfb75c5714edbd55747342efb67dcc2f25e023d930a7af6ece3e75f2f459b6f38fc14d031c766f116cd124fdc937fd33112579e820 languageName: node linkType: hard @@ -3734,32 +3648,32 @@ __metadata: languageName: node linkType: hard -"@remix-run/router@npm:1.14.2": - version: 1.14.2 - resolution: "@remix-run/router@npm:1.14.2" - checksum: 8be55596f64563de95dea04c147ab67c4e6c9b72277c92d4de257dbb326e2aa16ad2adbdec32eb2c985808c642933ac895220654b8c899e4f4bd38f9fd97ff6e +"@remix-run/router@npm:1.17.0": + version: 1.17.0 + resolution: "@remix-run/router@npm:1.17.0" + checksum: a801f605d6ff9fdc53676403cd9441f713251fbc23dcaf65c9337b3846e86db9c1b1fc9eee3c0f7142e3e1f7ed44efd427278138c3be9eeb7dd7e693347c35ab languageName: node linkType: hard -"@rjsf/core@npm:^5.1.0": - version: 5.16.1 - resolution: "@rjsf/core@npm:5.16.1" +"@rjsf/core@npm:^5.13.4": + version: 5.18.5 + resolution: "@rjsf/core@npm:5.18.5" dependencies: lodash: ^4.17.21 lodash-es: ^4.17.21 - markdown-to-jsx: ^7.4.0 + markdown-to-jsx: ^7.4.1 nanoid: ^3.3.7 prop-types: ^15.8.1 peerDependencies: - "@rjsf/utils": ^5.16.x + "@rjsf/utils": ^5.18.x react: ^16.14.0 || >=17 - checksum: 2f88dc6af9dda8ec5c8cbac63f3f9e776a11fe363ce938aa7b5c7a3baaa84a7a2f3796ebf55b361a8cb65267a1715ab880a4743636fb88e06b0240d07f0e4c7b + checksum: 7b986ec075d5b2de503d01172abdb3e3d33d04e5298fbf80842400e682f0aecdabfe4bb8482dde8a6aed90a35f4f5574cb7b24a11d689566c0cc0599485b334a languageName: node linkType: hard -"@rjsf/utils@npm:^5.1.0": - version: 5.16.1 - resolution: "@rjsf/utils@npm:5.16.1" +"@rjsf/utils@npm:^5.13.4": + version: 5.18.5 + resolution: "@rjsf/utils@npm:5.18.5" dependencies: json-schema-merge-allof: ^0.8.1 jsonpointer: ^5.0.1 @@ -3768,7 +3682,7 @@ __metadata: react-is: ^18.2.0 peerDependencies: react: ^16.14.0 || >=17 - checksum: 0c69527de4ab6f9d6ec4d1a5e05a31a0a38062d40abe2a2da7bc2324b20b08b0e90c188977ac4408f3b004c758c28097444746f3215e21e184c11cad7e9278c1 + checksum: 8da3ce82a0ec83e78806461db7226fd20489f6e8c41906ccde9d55c554aec3f50b8b8bac8c35e3cdf12d788c18fdad71c992f0d8b44f6161a1bf9e13598ded99 languageName: node linkType: hard @@ -3780,11 +3694,11 @@ __metadata: linkType: hard "@sinonjs/commons@npm:^3.0.0": - version: 3.0.0 - resolution: "@sinonjs/commons@npm:3.0.0" + version: 3.0.1 + resolution: "@sinonjs/commons@npm:3.0.1" dependencies: type-detect: 4.0.8 - checksum: b4b5b73d4df4560fb8c0c7b38c7ad4aeabedd362f3373859d804c988c725889cde33550e4bcc7cd316a30f5152a2d1d43db71b6d0c38f5feef71fd8d016763f8 + checksum: a7c3e7cc612352f4004873747d9d8b2d4d90b13a6d483f685598c945a70e734e255f1ca5dc49702515533c403b32725defff148177453b3f3915bcb60e9d4601 languageName: node linkType: hard @@ -3797,6 +3711,43 @@ __metadata: languageName: node linkType: hard +"@tanstack/query-core@npm:5.49.1": + version: 5.49.1 + resolution: "@tanstack/query-core@npm:5.49.1" + checksum: 244ce65d0e47388073adaebac72feba6032b51458f35469941bddfe5cc5eb9d354a89c43e1e37c655d16c869effbd5edf05952810b64e39deede18560d4bac55 + languageName: node + linkType: hard + +"@tanstack/query-devtools@npm:5.49.1": + version: 5.49.1 + resolution: "@tanstack/query-devtools@npm:5.49.1" + checksum: ceeaa9fb27845308ead9ce5d15b2c39b01df2964b74b893003b149f3d5041a2f27737a5413eba34324c6afb994c9f63be2ddc25904286fffc7ac554118d563b8 + languageName: node + linkType: hard + +"@tanstack/react-query-devtools@npm:^5.49.2": + version: 5.49.2 + resolution: "@tanstack/react-query-devtools@npm:5.49.2" + dependencies: + "@tanstack/query-devtools": 5.49.1 + peerDependencies: + "@tanstack/react-query": ^5.49.2 + react: ^18 || ^19 + checksum: e01efaee30759248bc4a8abbf1147a34377f9a88edf0b040e9e9c7c093d3f0a96a8df9d8a10a560b5eb98fa578b23a65cba3def4781cb20eefbf358fca09a63b + languageName: node + linkType: hard + +"@tanstack/react-query@npm:^5.27.5": + version: 5.49.2 + resolution: "@tanstack/react-query@npm:5.49.2" + dependencies: + "@tanstack/query-core": 5.49.1 + peerDependencies: + react: ^18.0.0 + checksum: 8f96a1292a3ec1fb249a2606acb0a7dbbeb6c4f4c9f424b69997df8b7bcf506b62ce1b93bc57ca9154534f98e538166cc8822e3eaaccac4bb2393c9f17839fdd + languageName: node + linkType: hard + "@tootallnate/once@npm:2": version: 2.0.0 resolution: "@tootallnate/once@npm:2.0.0" @@ -3837,20 +3788,21 @@ __metadata: linkType: hard "@types/babel__traverse@npm:*, @types/babel__traverse@npm:^7.0.6": - version: 7.20.5 - resolution: "@types/babel__traverse@npm:7.20.5" + version: 7.20.6 + resolution: "@types/babel__traverse@npm:7.20.6" dependencies: "@babel/types": ^7.20.7 - checksum: 608e0ab4fc31cd47011d98942e6241b34d461608c0c0e153377c5fd822c436c475f1ded76a56bfa76a1adf8d9266b727bbf9bfac90c4cb152c97f30dadc5b7e8 + checksum: 2bdc65eb62232c2d5c1086adeb0c31e7980e6fd7e50a3483b4a724a1a1029c84d9cb59749cf8de612f9afa2bc14c85b8f50e64e21f8a4398fa77eb9059a4283c languageName: node linkType: hard "@types/create-react-class@npm:*": - version: 15.6.7 - resolution: "@types/create-react-class@npm:15.6.7" + version: 15.6.8 + resolution: "@types/create-react-class@npm:15.6.8" dependencies: + "@types/prop-types": "*" "@types/react": "*" - checksum: 072c1fe0472217fe80b94965a8c23dd2f53b701c56bcf1e16da4d422aeb3fcba65972768f4b8ac90a5ca1ef8721730fb78fb8da080b9a8b004b6df667acc7ec7 + checksum: a4237559499c77205c7e73269e53db6ada257e21a638f7222f20ffcd66d1a9c2ed1819ceca067a3edbdb47960d8a60ecd2c6de5a0cb9ed8e9de03e4ced144397 languageName: node linkType: hard @@ -3885,9 +3837,9 @@ __metadata: linkType: hard "@types/d3-path@npm:*": - version: 3.0.2 - resolution: "@types/d3-path@npm:3.0.2" - checksum: 0107d89510e19e478c168e0e5df0c901f57e12f42f90f961a52b0b1e5b58182dde14a5b27ef66a0a769f09119f305d484dd8dc5adca17f6dd74baab87ad36a98 + version: 3.1.0 + resolution: "@types/d3-path@npm:3.1.0" + checksum: 1e81b56ed33ba1ac954a8c42c78c3fcf2716927fe5d01b2003591193ad3b639572a3dfcedd9bf78b6b73215a5cfb01cede8f25c936e95ac18fbe3858f9b62f5c languageName: node linkType: hard @@ -3934,16 +3886,16 @@ __metadata: linkType: hard "@types/eslint@npm:*": - version: 8.56.2 - resolution: "@types/eslint@npm:8.56.2" + version: 8.56.10 + resolution: "@types/eslint@npm:8.56.10" dependencies: "@types/estree": "*" "@types/json-schema": "*" - checksum: 38e054971596f5c0413f66a62dc26b10e0a21ac46ceacb06fbf8cfb838d20820787209b17218b3916e4c23d990ff77cfdb482d655cac0e0d2b837d430fcc5db8 + checksum: fb7137dd263ce1130b42d14452bdd0266ef81f52cb55ba1a5e9750e65da1f0596dc598c88bffc7e415458b6cb611a876dcc132bcf40ea48701c6d05b40c57be5 languageName: node linkType: hard -"@types/estree@npm:*, @types/estree@npm:^1.0.0": +"@types/estree@npm:*, @types/estree@npm:^1.0.5": version: 1.0.5 resolution: "@types/estree@npm:1.0.5" checksum: dd8b5bed28e6213b7acd0fb665a84e693554d850b0df423ac8076cc3ad5823a6bc26b0251d080bdc545af83179ede51dd3f6fa78cad2c46ed1f29624ddf3e41a @@ -3995,12 +3947,12 @@ __metadata: linkType: hard "@types/jest@npm:^29.2.0": - version: 29.5.11 - resolution: "@types/jest@npm:29.5.11" + version: 29.5.12 + resolution: "@types/jest@npm:29.5.12" dependencies: expect: ^29.0.0 pretty-format: ^29.0.0 - checksum: f892a06ec9f0afa9a61cd7fa316ec614e21d4df1ad301b5a837787e046fcb40dfdf7f264a55e813ac6b9b633cb9d366bd5b8d1cea725e84102477b366df23fdd + checksum: 19b1efdeed9d9a60a81edc8226cdeae5af7479e493eaed273e01243891c9651f7b8b4c08fc633a7d0d1d379b091c4179bbaa0807af62542325fd72f2dd17ce1c languageName: node linkType: hard @@ -4030,11 +3982,11 @@ __metadata: linkType: hard "@types/node@npm:*, @types/node@npm:^20.2.5": - version: 20.11.5 - resolution: "@types/node@npm:20.11.5" + version: 20.14.9 + resolution: "@types/node@npm:20.14.9" dependencies: undici-types: ~5.26.4 - checksum: a542727de1334ae20a3ca034b0ecf4b464a57ca01efc4f9cf43bd9ab93896125ab3c2de060ecd8f6ae23b86c6bf3463f681b643e69c032c6a662d376c98a6092 + checksum: 5e9eda1ac8c6cc6bcd1063903ae195eaede9aad1bdad00408a919409cfbcdd2d6535aa3d50346f0d385528f9e03dafc7d1b3bad25aedb1dcd79a6ad39d06c35d languageName: node linkType: hard @@ -4053,9 +4005,9 @@ __metadata: linkType: hard "@types/prop-types@npm:*, @types/prop-types@npm:^15.7.11": - version: 15.7.11 - resolution: "@types/prop-types@npm:15.7.11" - checksum: 7519ff11d06fbf6b275029fe03fff9ec377b4cb6e864cac34d87d7146c7f5a7560fd164bdc1d2dbe00b60c43713631251af1fd3d34d46c69cd354602bc0c7c54 + version: 15.7.12 + resolution: "@types/prop-types@npm:15.7.12" + checksum: ac16cc3d0a84431ffa5cfdf89579ad1e2269549f32ce0c769321fdd078f84db4fbe1b461ed5a1a496caf09e637c0e367d600c541435716a55b1d9713f5035dfe languageName: node linkType: hard @@ -4070,11 +4022,11 @@ __metadata: linkType: hard "@types/react-dom@npm:^18.2.4": - version: 18.2.18 - resolution: "@types/react-dom@npm:18.2.18" + version: 18.3.0 + resolution: "@types/react-dom@npm:18.3.0" dependencies: "@types/react": "*" - checksum: 8e3da404c980e2b2a76da3852f812ea6d8b9d0e7f5923fbaf3bfbbbfa1d59116ff91c129de8f68e9b7668a67ae34484fe9df74d5a7518cf8591ec07a0c4dad57 + checksum: a0cd9b1b815a6abd2a367a9eabdd8df8dd8f13f95897b2f9e1359ea3ac6619f957c1432ece004af7d95e2a7caddbba19faa045f831f32d6263483fc5404a7596 languageName: node linkType: hard @@ -4088,27 +4040,19 @@ __metadata: linkType: hard "@types/react@npm:*, @types/react@npm:^18.0.26": - version: 18.2.48 - resolution: "@types/react@npm:18.2.48" + version: 18.3.3 + resolution: "@types/react@npm:18.3.3" dependencies: "@types/prop-types": "*" - "@types/scheduler": "*" csstype: ^3.0.2 - checksum: c9ca43ed2995389b7e09492c24e6f911a8439bb8276dd17cc66a2fbebbf0b42daf7b2ad177043256533607c2ca644d7d928fdfce37a67af1f8646d2bac988900 - languageName: node - linkType: hard - -"@types/scheduler@npm:*": - version: 0.16.8 - resolution: "@types/scheduler@npm:0.16.8" - checksum: 6c091b096daa490093bf30dd7947cd28e5b2cd612ec93448432b33f724b162587fed9309a0acc104d97b69b1d49a0f3fc755a62282054d62975d53d7fd13472d + checksum: c63d6a78163244e2022b01ef79b0baec4fe4da3475dc4a90bb8accefad35ef0c43560fd0312e5974f92a0f1108aa4d669ac72d73d66396aa060ea03b5d2e3873 languageName: node linkType: hard "@types/semver@npm:^7.5.0": - version: 7.5.6 - resolution: "@types/semver@npm:7.5.6" - checksum: 563a0120ec0efcc326567db2ed920d5d98346f3638b6324ea6b50222b96f02a8add3c51a916b6897b51523aad8ac227d21d3dcf8913559f1bfc6c15b14d23037 + version: 7.5.8 + resolution: "@types/semver@npm:7.5.8" + checksum: ea6f5276f5b84c55921785a3a27a3cd37afee0111dfe2bcb3e03c31819c197c782598f17f0b150a69d453c9584cd14c4c4d7b9a55d2c5e6cacd4d66fdb3b3663 languageName: node linkType: hard @@ -4161,14 +4105,14 @@ __metadata: linkType: hard "@typescript-eslint/eslint-plugin@npm:^6.1.0": - version: 6.19.0 - resolution: "@typescript-eslint/eslint-plugin@npm:6.19.0" + version: 6.21.0 + resolution: "@typescript-eslint/eslint-plugin@npm:6.21.0" dependencies: "@eslint-community/regexpp": ^4.5.1 - "@typescript-eslint/scope-manager": 6.19.0 - "@typescript-eslint/type-utils": 6.19.0 - "@typescript-eslint/utils": 6.19.0 - "@typescript-eslint/visitor-keys": 6.19.0 + "@typescript-eslint/scope-manager": 6.21.0 + "@typescript-eslint/type-utils": 6.21.0 + "@typescript-eslint/utils": 6.21.0 + "@typescript-eslint/visitor-keys": 6.21.0 debug: ^4.3.4 graphemer: ^1.4.0 ignore: ^5.2.4 @@ -4181,44 +4125,44 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: 9880567d52d4e6559e2343caeed68f856d593b42816b8f705cd98d5a5b46cc620e3bebaaf08bbc982061bba18e5be94d6c539c0c816e8772ddabba0ad4e9363e + checksum: 5ef2c502255e643e98051e87eb682c2a257e87afd8ec3b9f6274277615e1c2caf3131b352244cfb1987b8b2c415645eeacb9113fa841fc4c9b2ac46e8aed6efd languageName: node linkType: hard "@typescript-eslint/parser@npm:^6.1.0": - version: 6.19.0 - resolution: "@typescript-eslint/parser@npm:6.19.0" + version: 6.21.0 + resolution: "@typescript-eslint/parser@npm:6.21.0" dependencies: - "@typescript-eslint/scope-manager": 6.19.0 - "@typescript-eslint/types": 6.19.0 - "@typescript-eslint/typescript-estree": 6.19.0 - "@typescript-eslint/visitor-keys": 6.19.0 + "@typescript-eslint/scope-manager": 6.21.0 + "@typescript-eslint/types": 6.21.0 + "@typescript-eslint/typescript-estree": 6.21.0 + "@typescript-eslint/visitor-keys": 6.21.0 debug: ^4.3.4 peerDependencies: eslint: ^7.0.0 || ^8.0.0 peerDependenciesMeta: typescript: optional: true - checksum: 0ac91ff83fdf693de4494b45be79f25803ea6ca3ee717e4f96785b7ffc1da0180adb0426b61bc6eff5666c8ef9ea58c50efbd4351ef9018c0050116cbd74a62b + checksum: 162fe3a867eeeffda7328bce32dae45b52283c68c8cb23258fb9f44971f761991af61f71b8c9fe1aa389e93dfe6386f8509c1273d870736c507d76dd40647b68 languageName: node linkType: hard -"@typescript-eslint/scope-manager@npm:6.19.0": - version: 6.19.0 - resolution: "@typescript-eslint/scope-manager@npm:6.19.0" +"@typescript-eslint/scope-manager@npm:6.21.0": + version: 6.21.0 + resolution: "@typescript-eslint/scope-manager@npm:6.21.0" dependencies: - "@typescript-eslint/types": 6.19.0 - "@typescript-eslint/visitor-keys": 6.19.0 - checksum: 47d9d1b70cd64f9d1bb717090850e0ff1a34e453c28b43fd0cecaea4db05cacebd60f5da55b35c4b3cc01491f02e9de358f82a0822b27c00e80e3d1a27de32d1 + "@typescript-eslint/types": 6.21.0 + "@typescript-eslint/visitor-keys": 6.21.0 + checksum: 71028b757da9694528c4c3294a96cc80bc7d396e383a405eab3bc224cda7341b88e0fc292120b35d3f31f47beac69f7083196c70616434072fbcd3d3e62d3376 languageName: node linkType: hard -"@typescript-eslint/type-utils@npm:6.19.0": - version: 6.19.0 - resolution: "@typescript-eslint/type-utils@npm:6.19.0" +"@typescript-eslint/type-utils@npm:6.21.0": + version: 6.21.0 + resolution: "@typescript-eslint/type-utils@npm:6.21.0" dependencies: - "@typescript-eslint/typescript-estree": 6.19.0 - "@typescript-eslint/utils": 6.19.0 + "@typescript-eslint/typescript-estree": 6.21.0 + "@typescript-eslint/utils": 6.21.0 debug: ^4.3.4 ts-api-utils: ^1.0.1 peerDependencies: @@ -4226,23 +4170,23 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: a88f022617be636f43429a7c7c5cd2e0e29955e96d4a9fed7d03467dc4a432b1240a71009d62213604ddb3522be9694e6b78882ee805687cda107021d1ddb203 + checksum: 77025473f4d80acf1fafcce99c5c283e557686a61861febeba9c9913331f8a41e930bf5cd8b7a54db502a57b6eb8ea6d155cbd4f41349ed00e3d7aeb1f477ddc languageName: node linkType: hard -"@typescript-eslint/types@npm:6.19.0": - version: 6.19.0 - resolution: "@typescript-eslint/types@npm:6.19.0" - checksum: 1371b5ba41c1d2879b3c2823ab01a30cf034e476ef53ff2a7f9e9a4a0056dfbbfecd3143031b05430aa6c749233cacbd01b72cea38a9ece1c6cf95a5cd43da6a +"@typescript-eslint/types@npm:6.21.0": + version: 6.21.0 + resolution: "@typescript-eslint/types@npm:6.21.0" + checksum: 9501b47d7403417af95fc1fb72b2038c5ac46feac0e1598a46bcb43e56a606c387e9dcd8a2a0abe174c91b509f2d2a8078b093786219eb9a01ab2fbf9ee7b684 languageName: node linkType: hard -"@typescript-eslint/typescript-estree@npm:6.19.0": - version: 6.19.0 - resolution: "@typescript-eslint/typescript-estree@npm:6.19.0" +"@typescript-eslint/typescript-estree@npm:6.21.0": + version: 6.21.0 + resolution: "@typescript-eslint/typescript-estree@npm:6.21.0" dependencies: - "@typescript-eslint/types": 6.19.0 - "@typescript-eslint/visitor-keys": 6.19.0 + "@typescript-eslint/types": 6.21.0 + "@typescript-eslint/visitor-keys": 6.21.0 debug: ^4.3.4 globby: ^11.1.0 is-glob: ^4.0.3 @@ -4252,34 +4196,34 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: 919f9588840cdab7e0ef6471f4c35d602523b142b2cffeabe9171d6ce65eb7f41614d0cb17e008e0d8e796374821ab053ced35b84642c3b1d491987362f2fdb5 + checksum: dec02dc107c4a541e14fb0c96148f3764b92117c3b635db3a577b5a56fc48df7a556fa853fb82b07c0663b4bf2c484c9f245c28ba3e17e5cb0918ea4cab2ea21 languageName: node linkType: hard -"@typescript-eslint/utils@npm:6.19.0": - version: 6.19.0 - resolution: "@typescript-eslint/utils@npm:6.19.0" +"@typescript-eslint/utils@npm:6.21.0": + version: 6.21.0 + resolution: "@typescript-eslint/utils@npm:6.21.0" dependencies: "@eslint-community/eslint-utils": ^4.4.0 "@types/json-schema": ^7.0.12 "@types/semver": ^7.5.0 - "@typescript-eslint/scope-manager": 6.19.0 - "@typescript-eslint/types": 6.19.0 - "@typescript-eslint/typescript-estree": 6.19.0 + "@typescript-eslint/scope-manager": 6.21.0 + "@typescript-eslint/types": 6.21.0 + "@typescript-eslint/typescript-estree": 6.21.0 semver: ^7.5.4 peerDependencies: eslint: ^7.0.0 || ^8.0.0 - checksum: 05a26251a526232b08850b6c3327637213ef989453e353f3a8255433b74893a70d5c38369c528b762e853b7586d7830d728b372494e65f37770ecb05a88112d4 + checksum: b129b3a4aebec8468259f4589985cb59ea808afbfdb9c54f02fad11e17d185e2bf72bb332f7c36ec3c09b31f18fc41368678b076323e6e019d06f74ee93f7bf2 languageName: node linkType: hard -"@typescript-eslint/visitor-keys@npm:6.19.0": - version: 6.19.0 - resolution: "@typescript-eslint/visitor-keys@npm:6.19.0" +"@typescript-eslint/visitor-keys@npm:6.21.0": + version: 6.21.0 + resolution: "@typescript-eslint/visitor-keys@npm:6.21.0" dependencies: - "@typescript-eslint/types": 6.19.0 + "@typescript-eslint/types": 6.21.0 eslint-visitor-keys: ^3.4.1 - checksum: 35b11143e1b55ecf01e0f513085df2cc83d0781f4a8354dc10f6ec3356f66b91a1ed8abadb6fb66af1c1746f9c874eabc8b5636882466e229cda5d6a39aada08 + checksum: 67c7e6003d5af042d8703d11538fca9d76899f0119130b373402819ae43f0bc90d18656aa7add25a24427ccf1a0efd0804157ba83b0d4e145f06107d7d1b7433 languageName: node linkType: hard @@ -4290,13 +4234,13 @@ __metadata: languageName: node linkType: hard -"@webassemblyjs/ast@npm:1.11.6, @webassemblyjs/ast@npm:^1.11.5": - version: 1.11.6 - resolution: "@webassemblyjs/ast@npm:1.11.6" +"@webassemblyjs/ast@npm:1.12.1, @webassemblyjs/ast@npm:^1.12.1": + version: 1.12.1 + resolution: "@webassemblyjs/ast@npm:1.12.1" dependencies: "@webassemblyjs/helper-numbers": 1.11.6 "@webassemblyjs/helper-wasm-bytecode": 1.11.6 - checksum: 38ef1b526ca47c210f30975b06df2faf1a8170b1636ce239fc5738fc231ce28389dd61ecedd1bacfc03cbe95b16d1af848c805652080cb60982836eb4ed2c6cf + checksum: 31bcc64147236bd7b1b6d29d1f419c1f5845c785e1e42dc9e3f8ca2e05a029e9393a271b84f3a5bff2a32d35f51ff59e2181a6e5f953fe88576acd6750506202 languageName: node linkType: hard @@ -4314,10 +4258,10 @@ __metadata: languageName: node linkType: hard -"@webassemblyjs/helper-buffer@npm:1.11.6": - version: 1.11.6 - resolution: "@webassemblyjs/helper-buffer@npm:1.11.6" - checksum: b14d0573bf680d22b2522e8a341ec451fddd645d1f9c6bd9012ccb7e587a2973b86ab7b89fe91e1c79939ba96095f503af04369a3b356c8023c13a5893221644 +"@webassemblyjs/helper-buffer@npm:1.12.1": + version: 1.12.1 + resolution: "@webassemblyjs/helper-buffer@npm:1.12.1" + checksum: c3ffb723024130308db608e86e2bdccd4868bbb62dffb0a9a1530606496f79c87f8565bd8e02805ce64912b71f1a70ee5fb00307258b0c082c3abf961d097eca languageName: node linkType: hard @@ -4339,15 +4283,15 @@ __metadata: languageName: node linkType: hard -"@webassemblyjs/helper-wasm-section@npm:1.11.6": - version: 1.11.6 - resolution: "@webassemblyjs/helper-wasm-section@npm:1.11.6" +"@webassemblyjs/helper-wasm-section@npm:1.12.1": + version: 1.12.1 + resolution: "@webassemblyjs/helper-wasm-section@npm:1.12.1" dependencies: - "@webassemblyjs/ast": 1.11.6 - "@webassemblyjs/helper-buffer": 1.11.6 + "@webassemblyjs/ast": 1.12.1 + "@webassemblyjs/helper-buffer": 1.12.1 "@webassemblyjs/helper-wasm-bytecode": 1.11.6 - "@webassemblyjs/wasm-gen": 1.11.6 - checksum: b2cf751bf4552b5b9999d27bbb7692d0aca75260140195cb58ea6374d7b9c2dc69b61e10b211a0e773f66209c3ddd612137ed66097e3684d7816f854997682e9 + "@webassemblyjs/wasm-gen": 1.12.1 + checksum: c19810cdd2c90ff574139b6d8c0dda254d42d168a9e5b3d353d1bc085f1d7164ccd1b3c05592a45a939c47f7e403dc8d03572bb686642f06a3d02932f6f0bc8f languageName: node linkType: hard @@ -4376,68 +4320,68 @@ __metadata: languageName: node linkType: hard -"@webassemblyjs/wasm-edit@npm:^1.11.5": - version: 1.11.6 - resolution: "@webassemblyjs/wasm-edit@npm:1.11.6" +"@webassemblyjs/wasm-edit@npm:^1.12.1": + version: 1.12.1 + resolution: "@webassemblyjs/wasm-edit@npm:1.12.1" dependencies: - "@webassemblyjs/ast": 1.11.6 - "@webassemblyjs/helper-buffer": 1.11.6 + "@webassemblyjs/ast": 1.12.1 + "@webassemblyjs/helper-buffer": 1.12.1 "@webassemblyjs/helper-wasm-bytecode": 1.11.6 - "@webassemblyjs/helper-wasm-section": 1.11.6 - "@webassemblyjs/wasm-gen": 1.11.6 - "@webassemblyjs/wasm-opt": 1.11.6 - "@webassemblyjs/wasm-parser": 1.11.6 - "@webassemblyjs/wast-printer": 1.11.6 - checksum: 29ce75870496d6fad864d815ebb072395a8a3a04dc9c3f4e1ffdc63fc5fa58b1f34304a1117296d8240054cfdbc38aca88e71fb51483cf29ffab0a61ef27b481 + "@webassemblyjs/helper-wasm-section": 1.12.1 + "@webassemblyjs/wasm-gen": 1.12.1 + "@webassemblyjs/wasm-opt": 1.12.1 + "@webassemblyjs/wasm-parser": 1.12.1 + "@webassemblyjs/wast-printer": 1.12.1 + checksum: ae23642303f030af888d30c4ef37b08dfec7eab6851a9575a616e65d1219f880d9223913a39056dd654e49049d76e97555b285d1f7e56935047abf578cce0692 languageName: node linkType: hard -"@webassemblyjs/wasm-gen@npm:1.11.6": - version: 1.11.6 - resolution: "@webassemblyjs/wasm-gen@npm:1.11.6" +"@webassemblyjs/wasm-gen@npm:1.12.1": + version: 1.12.1 + resolution: "@webassemblyjs/wasm-gen@npm:1.12.1" dependencies: - "@webassemblyjs/ast": 1.11.6 + "@webassemblyjs/ast": 1.12.1 "@webassemblyjs/helper-wasm-bytecode": 1.11.6 "@webassemblyjs/ieee754": 1.11.6 "@webassemblyjs/leb128": 1.11.6 "@webassemblyjs/utf8": 1.11.6 - checksum: a645a2eecbea24833c3260a249704a7f554ef4a94c6000984728e94bb2bc9140a68dfd6fd21d5e0bbb09f6dfc98e083a45760a83ae0417b41a0196ff6d45a23a + checksum: 5787626bb7f0b033044471ddd00ce0c9fe1ee4584e8b73e232051e3a4c99ba1a102700d75337151c8b6055bae77eefa4548960c610a5e4a504e356bd872138ff languageName: node linkType: hard -"@webassemblyjs/wasm-opt@npm:1.11.6": - version: 1.11.6 - resolution: "@webassemblyjs/wasm-opt@npm:1.11.6" +"@webassemblyjs/wasm-opt@npm:1.12.1": + version: 1.12.1 + resolution: "@webassemblyjs/wasm-opt@npm:1.12.1" dependencies: - "@webassemblyjs/ast": 1.11.6 - "@webassemblyjs/helper-buffer": 1.11.6 - "@webassemblyjs/wasm-gen": 1.11.6 - "@webassemblyjs/wasm-parser": 1.11.6 - checksum: b4557f195487f8e97336ddf79f7bef40d788239169aac707f6eaa2fa5fe243557c2d74e550a8e57f2788e70c7ae4e7d32f7be16101afe183d597b747a3bdd528 + "@webassemblyjs/ast": 1.12.1 + "@webassemblyjs/helper-buffer": 1.12.1 + "@webassemblyjs/wasm-gen": 1.12.1 + "@webassemblyjs/wasm-parser": 1.12.1 + checksum: 0e8fa8a0645304a1e18ff40d3db5a2e9233ebaa169b19fcc651d6fc9fe2cac0ce092ddee927318015ae735d9cd9c5d97c0cafb6a51dcd2932ac73587b62df991 languageName: node linkType: hard -"@webassemblyjs/wasm-parser@npm:1.11.6, @webassemblyjs/wasm-parser@npm:^1.11.5": - version: 1.11.6 - resolution: "@webassemblyjs/wasm-parser@npm:1.11.6" +"@webassemblyjs/wasm-parser@npm:1.12.1, @webassemblyjs/wasm-parser@npm:^1.12.1": + version: 1.12.1 + resolution: "@webassemblyjs/wasm-parser@npm:1.12.1" dependencies: - "@webassemblyjs/ast": 1.11.6 + "@webassemblyjs/ast": 1.12.1 "@webassemblyjs/helper-api-error": 1.11.6 "@webassemblyjs/helper-wasm-bytecode": 1.11.6 "@webassemblyjs/ieee754": 1.11.6 "@webassemblyjs/leb128": 1.11.6 "@webassemblyjs/utf8": 1.11.6 - checksum: 8200a8d77c15621724a23fdabe58d5571415cda98a7058f542e670ea965dd75499f5e34a48675184947c66f3df23adf55df060312e6d72d57908e3f049620d8a + checksum: 176015de3551ac068cd4505d837414f258d9ade7442bd71efb1232fa26c9f6d7d4e11a5c816caeed389943f409af7ebff6899289a992d7a70343cb47009d21a8 languageName: node linkType: hard -"@webassemblyjs/wast-printer@npm:1.11.6": - version: 1.11.6 - resolution: "@webassemblyjs/wast-printer@npm:1.11.6" +"@webassemblyjs/wast-printer@npm:1.12.1": + version: 1.12.1 + resolution: "@webassemblyjs/wast-printer@npm:1.12.1" dependencies: - "@webassemblyjs/ast": 1.11.6 + "@webassemblyjs/ast": 1.12.1 "@xtuc/long": 4.2.2 - checksum: d2fa6a4c427325ec81463e9c809aa6572af6d47f619f3091bf4c4a6fc34f1da3df7caddaac50b8e7a457f8784c62cd58c6311b6cb69b0162ccd8d4c072f79cf8 + checksum: 2974b5dda8d769145ba0efd886ea94a601e61fb37114c14f9a9a7606afc23456799af652ac3052f284909bd42edc3665a76bc9b50f95f0794c053a8a1757b713 languageName: node linkType: hard @@ -4474,6 +4418,49 @@ __metadata: languageName: node linkType: hard +"@xterm/addon-canvas@npm:~0.7.0": + version: 0.7.0 + resolution: "@xterm/addon-canvas@npm:0.7.0" + peerDependencies: + "@xterm/xterm": ^5.0.0 + checksum: 28b9965f34e01a9bbcc31651dee2d4a9380aad528039484cce372b856be820705b293c4b5091cee65208c3dfbf6f944f27ecc6c3b794df5a96036cbf6dba0d74 + languageName: node + linkType: hard + +"@xterm/addon-fit@npm:~0.10.0": + version: 0.10.0 + resolution: "@xterm/addon-fit@npm:0.10.0" + peerDependencies: + "@xterm/xterm": ^5.0.0 + checksum: 8edfad561c0d0316c5883cbe2ce56109f105a2b2bf53b71d5f8c788e656a3205c1093a659dddcf4025a459e4b7ff8e07b6c6a19815c8711deeded560de5f1893 + languageName: node + linkType: hard + +"@xterm/addon-web-links@npm:~0.11.0": + version: 0.11.0 + resolution: "@xterm/addon-web-links@npm:0.11.0" + peerDependencies: + "@xterm/xterm": ^5.0.0 + checksum: c1b36b649b8cddc613213eb9e835daf3106a8be359a19ccacca1f1d9ff883b59d478f166109ee017fa3994d224dcdd82976ad5d5a1221271ab8d3d5684eb141d + languageName: node + linkType: hard + +"@xterm/addon-webgl@npm:~0.18.0": + version: 0.18.0 + resolution: "@xterm/addon-webgl@npm:0.18.0" + peerDependencies: + "@xterm/xterm": ^5.0.0 + checksum: 942ecaa4e08423563a795a1a63fa79637e60d4e3aba1b5fa2f426e1d7b19c553e8c8f1cfad1258461f22e05362e791f642dc6aab7e8766e26d4d3876617d8320 + languageName: node + linkType: hard + +"@xterm/xterm@npm:~5.5.0": + version: 5.5.0 + resolution: "@xterm/xterm@npm:5.5.0" + checksum: 393c1891b95fdd50d05e7a063abdc95a6643d2c45a4231637c23db90511426a95b1b56a5c4c91831121d2710aee9de97cf5e426016c589ca87dea8fff9a41b33 + languageName: node + linkType: hard + "@xtuc/ieee754@npm:^1.2.0": version: 1.2.0 resolution: "@xtuc/ieee754@npm:1.2.0" @@ -4512,12 +4499,12 @@ __metadata: languageName: node linkType: hard -"acorn-import-assertions@npm:^1.9.0": - version: 1.9.0 - resolution: "acorn-import-assertions@npm:1.9.0" +"acorn-import-attributes@npm:^1.9.5": + version: 1.9.5 + resolution: "acorn-import-attributes@npm:1.9.5" peerDependencies: acorn: ^8 - checksum: 944fb2659d0845c467066bdcda2e20c05abe3aaf11972116df457ce2627628a81764d800dd55031ba19de513ee0d43bb771bc679cc0eda66dc8b4fade143bc0c + checksum: 1c0c49b6a244503964ae46ae850baccf306e84caf99bc2010ed6103c69a423987b07b520a6c619f075d215388bd4923eccac995886a54309eda049ab78a4be95 languageName: node linkType: hard @@ -4531,18 +4518,20 @@ __metadata: linkType: hard "acorn-walk@npm:^8.0.2": - version: 8.3.2 - resolution: "acorn-walk@npm:8.3.2" - checksum: 3626b9d26a37b1b427796feaa5261faf712307a8920392c8dce9a5739fb31077667f4ad2ec71c7ac6aaf9f61f04a9d3d67ff56f459587206fc04aa31c27ef392 + version: 8.3.3 + resolution: "acorn-walk@npm:8.3.3" + dependencies: + acorn: ^8.11.0 + checksum: 0f09d351fc30b69b2b9982bf33dc30f3d35a34e030e5f1ed3c49fc4e3814a192bf3101e4c30912a0595410f5e91bb70ddba011ea73398b3ecbfe41c7334c6dd0 languageName: node linkType: hard -"acorn@npm:^8.1.0, acorn@npm:^8.7.1, acorn@npm:^8.8.1, acorn@npm:^8.8.2, acorn@npm:^8.9.0": - version: 8.11.3 - resolution: "acorn@npm:8.11.3" +"acorn@npm:^8.1.0, acorn@npm:^8.11.0, acorn@npm:^8.7.1, acorn@npm:^8.8.1, acorn@npm:^8.8.2, acorn@npm:^8.9.0": + version: 8.12.0 + resolution: "acorn@npm:8.12.0" bin: acorn: bin/acorn - checksum: 76d8e7d559512566b43ab4aadc374f11f563f0a9e21626dd59cb2888444e9445923ae9f3699972767f18af61df89cd89f5eaaf772d1327b055b45cb829b4a88c + checksum: ae142de8739ef15a5d936c550c1d267fc4dedcdbe62ad1aa2c0009afed1de84dd0a584684a5d200bb55d8db14f3e09a95c6e92a5303973c04b9a7413c36d1df0 languageName: node linkType: hard @@ -4555,12 +4544,12 @@ __metadata: languageName: node linkType: hard -"agent-base@npm:^7.0.2, agent-base@npm:^7.1.0": - version: 7.1.0 - resolution: "agent-base@npm:7.1.0" +"agent-base@npm:^7.0.2, agent-base@npm:^7.1.0, agent-base@npm:^7.1.1": + version: 7.1.1 + resolution: "agent-base@npm:7.1.1" dependencies: debug: ^4.3.4 - checksum: f7828f991470a0cc22cb579c86a18cbae83d8a3cbed39992ab34fc7217c4d126017f1c74d0ab66be87f71455318a8ea3e757d6a37881b8d0f2a2c6aa55e5418f + checksum: 51c158769c5c051482f9ca2e6e1ec085ac72b5a418a9b31b4e82fe6c0a6699adb94c1c42d246699a587b3335215037091c79e0de512c516f73b6ea844202f037 languageName: node linkType: hard @@ -4621,14 +4610,14 @@ __metadata: linkType: hard "ajv@npm:^8.0.0, ajv@npm:^8.0.1, ajv@npm:^8.12.0, ajv@npm:^8.9.0": - version: 8.12.0 - resolution: "ajv@npm:8.12.0" + version: 8.16.0 + resolution: "ajv@npm:8.16.0" dependencies: - fast-deep-equal: ^3.1.1 + fast-deep-equal: ^3.1.3 json-schema-traverse: ^1.0.0 require-from-string: ^2.0.2 - uri-js: ^4.2.2 - checksum: 4dc13714e316e67537c8b31bc063f99a1d9d9a497eb4bbd55191ac0dcd5e4985bbb71570352ad6f1e76684fb6d790928f96ba3b2d4fd6e10024be9612fe3f001 + uri-js: ^4.4.1 + checksum: bdf3d4c9f1d11e220850051ef4cd89346e951cfb933d6d41be36d45053c1092af1523ee6c62525cce567355caf0a4f4c19a08a93851649c1fa32b4a39b7c4858 languageName: node linkType: hard @@ -4713,13 +4702,13 @@ __metadata: languageName: node linkType: hard -"array-buffer-byte-length@npm:^1.0.0": - version: 1.0.0 - resolution: "array-buffer-byte-length@npm:1.0.0" +"array-buffer-byte-length@npm:^1.0.1": + version: 1.0.1 + resolution: "array-buffer-byte-length@npm:1.0.1" dependencies: - call-bind: ^1.0.2 - is-array-buffer: ^3.0.1 - checksum: 044e101ce150f4804ad19c51d6c4d4cfa505c5b2577bd179256e4aa3f3f6a0a5e9874c78cd428ee566ac574c8a04d7ce21af9fe52e844abfdccb82b33035a7c3 + call-bind: ^1.0.5 + is-array-buffer: ^3.0.4 + checksum: 53524e08f40867f6a9f35318fafe467c32e45e9c682ba67b11943e167344d2febc0f6977a17e699b05699e805c3e8f073d876f8bbf1b559ed494ad2cd0fae09e languageName: node linkType: hard @@ -4730,18 +4719,19 @@ __metadata: languageName: node linkType: hard -"arraybuffer.prototype.slice@npm:^1.0.2": - version: 1.0.2 - resolution: "arraybuffer.prototype.slice@npm:1.0.2" +"arraybuffer.prototype.slice@npm:^1.0.3": + version: 1.0.3 + resolution: "arraybuffer.prototype.slice@npm:1.0.3" dependencies: - array-buffer-byte-length: ^1.0.0 - call-bind: ^1.0.2 - define-properties: ^1.2.0 - es-abstract: ^1.22.1 - get-intrinsic: ^1.2.1 - is-array-buffer: ^3.0.2 + array-buffer-byte-length: ^1.0.1 + call-bind: ^1.0.5 + define-properties: ^1.2.1 + es-abstract: ^1.22.3 + es-errors: ^1.2.1 + get-intrinsic: ^1.2.3 + is-array-buffer: ^3.0.4 is-shared-array-buffer: ^1.0.2 - checksum: c200faf437786f5b2c80d4564ff5481c886a16dee642ef02abdc7306c7edd523d1f01d1dd12b769c7eb42ac9bc53874510db19a92a2c035c0f6696172aafa5d3 + checksum: 352259cba534dcdd969c92ab002efd2ba5025b2e3b9bead3973150edbdf0696c629d7f4b3f061c5931511e8207bdc2306da614703c820b45dabce39e3daf7e3e languageName: node linkType: hard @@ -4766,10 +4756,12 @@ __metadata: languageName: node linkType: hard -"available-typed-arrays@npm:^1.0.5": - version: 1.0.5 - resolution: "available-typed-arrays@npm:1.0.5" - checksum: 20eb47b3cefd7db027b9bbb993c658abd36d4edd3fe1060e83699a03ee275b0c9b216cc076ff3f2db29073225fb70e7613987af14269ac1fe2a19803ccc97f1a +"available-typed-arrays@npm:^1.0.7": + version: 1.0.7 + resolution: "available-typed-arrays@npm:1.0.7" + dependencies: + possible-typed-array-names: ^1.0.0 + checksum: 1aa3ffbfe6578276996de660848b6e95669d9a95ad149e3dd0c0cda77db6ee1dbd9d1dd723b65b6d277b882dd0c4b91a654ae9d3cf9e1254b7e93e4908d78fd3 languageName: node linkType: hard @@ -4826,39 +4818,39 @@ __metadata: languageName: node linkType: hard -"babel-plugin-polyfill-corejs2@npm:^0.4.7": - version: 0.4.7 - resolution: "babel-plugin-polyfill-corejs2@npm:0.4.7" +"babel-plugin-polyfill-corejs2@npm:^0.4.10": + version: 0.4.11 + resolution: "babel-plugin-polyfill-corejs2@npm:0.4.11" dependencies: "@babel/compat-data": ^7.22.6 - "@babel/helper-define-polyfill-provider": ^0.4.4 + "@babel/helper-define-polyfill-provider": ^0.6.2 semver: ^6.3.1 peerDependencies: "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 - checksum: b3c84ce44d00211c919a94f76453fb2065861612f3e44862eb7acf854e325c738a7441ad82690deba2b6fddfa2ad2cf2c46960f46fab2e3b17c6ed4fd2d73b38 + checksum: f098353ce7c7dde1a1d2710858e01b471e85689110c9e37813e009072347eb8c55d5f84d20d3bf1cab31755f20078ba90f8855fdc4686a9daa826a95ff280bd7 languageName: node linkType: hard -"babel-plugin-polyfill-corejs3@npm:^0.8.7": - version: 0.8.7 - resolution: "babel-plugin-polyfill-corejs3@npm:0.8.7" +"babel-plugin-polyfill-corejs3@npm:^0.10.4": + version: 0.10.4 + resolution: "babel-plugin-polyfill-corejs3@npm:0.10.4" dependencies: - "@babel/helper-define-polyfill-provider": ^0.4.4 - core-js-compat: ^3.33.1 + "@babel/helper-define-polyfill-provider": ^0.6.1 + core-js-compat: ^3.36.1 peerDependencies: "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 - checksum: 51bc215ab0c062bbb2225d912f69f8a6705d1837c8e01f9651307b5b937804287c1d73ebd8015689efcc02c3c21f37688b9ee6f5997635619b7a9cc4b7d9908d + checksum: b96a54495f7cc8b3797251c8c15f5ed015edddc3110fc122f6b32c94bec33af1e8bc56fa99091808f500bde0cccaaa266889cdc5935d9e6e9cf09898214f02dd languageName: node linkType: hard -"babel-plugin-polyfill-regenerator@npm:^0.5.4": - version: 0.5.4 - resolution: "babel-plugin-polyfill-regenerator@npm:0.5.4" +"babel-plugin-polyfill-regenerator@npm:^0.6.1": + version: 0.6.2 + resolution: "babel-plugin-polyfill-regenerator@npm:0.6.2" dependencies: - "@babel/helper-define-polyfill-provider": ^0.4.4 + "@babel/helper-define-polyfill-provider": ^0.6.2 peerDependencies: "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 - checksum: 461b735c6c0eca3c7b4434d14bfa98c2ab80f00e2bdc1c69eb46d1d300092a9786d76bbd3ee55e26d2d1a2380c14592d8d638e271dfd2a2b78a9eacffa3645d1 + checksum: 150233571072b6b3dfe946242da39cba8587b7f908d1c006f7545fc88b0e3c3018d445739beb61e7a75835f0c2751dbe884a94ff9b245ec42369d9267e0e1b3f languageName: node linkType: hard @@ -4936,26 +4928,26 @@ __metadata: languageName: node linkType: hard -"braces@npm:^3.0.2": - version: 3.0.2 - resolution: "braces@npm:3.0.2" +"braces@npm:^3.0.3": + version: 3.0.3 + resolution: "braces@npm:3.0.3" dependencies: - fill-range: ^7.0.1 - checksum: e2a8e769a863f3d4ee887b5fe21f63193a891c68b612ddb4b68d82d1b5f3ff9073af066c343e9867a393fe4c2555dcb33e89b937195feb9c1613d259edfcd459 + fill-range: ^7.1.1 + checksum: b95aa0b3bd909f6cd1720ffcf031aeaf46154dd88b4da01f9a1d3f7ea866a79eba76a6d01cbc3c422b2ee5cdc39a4f02491058d5df0d7bf6e6a162a832df1f69 languageName: node linkType: hard -"browserslist@npm:^4.14.5, browserslist@npm:^4.22.2": - version: 4.22.2 - resolution: "browserslist@npm:4.22.2" +"browserslist@npm:^4.21.10, browserslist@npm:^4.22.2, browserslist@npm:^4.23.0": + version: 4.23.1 + resolution: "browserslist@npm:4.23.1" dependencies: - caniuse-lite: ^1.0.30001565 - electron-to-chromium: ^1.4.601 + caniuse-lite: ^1.0.30001629 + electron-to-chromium: ^1.4.796 node-releases: ^2.0.14 - update-browserslist-db: ^1.0.13 + update-browserslist-db: ^1.0.16 bin: browserslist: cli.js - checksum: 33ddfcd9145220099a7a1ac533cecfe5b7548ffeb29b313e1b57be6459000a1f8fa67e781cf4abee97268ac594d44134fcc4a6b2b4750ceddc9796e3a22076d9 + checksum: 06189e2d6666a203ce097cc0e713a40477d08420927b79af139211e5712f3cf676fdc4dd6af3aa493d47c09206a344b3420a8315577dbe88c58903132de9b0f5 languageName: node linkType: hard @@ -4985,8 +4977,8 @@ __metadata: linkType: hard "cacache@npm:^18.0.0": - version: 18.0.2 - resolution: "cacache@npm:18.0.2" + version: 18.0.3 + resolution: "cacache@npm:18.0.3" dependencies: "@npmcli/fs": ^3.1.0 fs-minipass: ^3.0.0 @@ -5000,18 +4992,20 @@ __metadata: ssri: ^10.0.0 tar: ^6.1.11 unique-filename: ^3.0.0 - checksum: 0250df80e1ad0c828c956744850c5f742c24244e9deb5b7dc81bca90f8c10e011e132ecc58b64497cc1cad9a98968676147fb6575f4f94722f7619757b17a11b + checksum: b717fd9b36e9c3279bfde4545c3a8f6d5a539b084ee26a9504d48f83694beb724057d26e090b97540f9cc62bea18b9f6cf671c50e18fb7dac60eda9db691714f languageName: node linkType: hard -"call-bind@npm:^1.0.0, call-bind@npm:^1.0.2, call-bind@npm:^1.0.4, call-bind@npm:^1.0.5": - version: 1.0.5 - resolution: "call-bind@npm:1.0.5" +"call-bind@npm:^1.0.2, call-bind@npm:^1.0.5, call-bind@npm:^1.0.6, call-bind@npm:^1.0.7": + version: 1.0.7 + resolution: "call-bind@npm:1.0.7" dependencies: + es-define-property: ^1.0.0 + es-errors: ^1.3.0 function-bind: ^1.1.2 - get-intrinsic: ^1.2.1 - set-function-length: ^1.1.1 - checksum: 449e83ecbd4ba48e7eaac5af26fea3b50f8f6072202c2dd7c5a6e7a6308f2421abe5e13a3bbd55221087f76320c5e09f25a8fdad1bab2b77c68ae74d92234ea5 + get-intrinsic: ^1.2.4 + set-function-length: ^1.2.1 + checksum: 295c0c62b90dd6522e6db3b0ab1ce26bdf9e7404215bda13cfee25b626b5ff1a7761324d58d38b1ef1607fc65aca2d06e44d2e18d0dfc6c14b465b00d8660029 languageName: node linkType: hard @@ -5048,10 +5042,10 @@ __metadata: languageName: node linkType: hard -"caniuse-lite@npm:^1.0.30001565": - version: 1.0.30001578 - resolution: "caniuse-lite@npm:1.0.30001578" - checksum: b0cd4fed07ae1224f564baaed5e096c9c479b3063d023fc629df52caa14e59b7436b33498729161e253a5b8974d644374ff1ce47ccf1885ef3d1541f4067705f +"caniuse-lite@npm:^1.0.30001629": + version: 1.0.30001639 + resolution: "caniuse-lite@npm:1.0.30001639" + checksum: 0d9291cc47ffaad5806716bff6fef41eec21f86a448370bc30a72823fcaf24ba5ccb4704841e6a60f078ddf2e9987e3d23f4d3ca0fffc51f6cb0400b7411ad28 languageName: node linkType: hard @@ -5083,13 +5077,6 @@ __metadata: languageName: node linkType: hard -"child_process@npm:~1.0.2": - version: 1.0.2 - resolution: "child_process@npm:1.0.2" - checksum: bd814d82bc8c6e85ed6fb157878978121cd03b5296c09f6135fa3d081fd9a6a617a6d509c50397711df713af403331241a9c0397a7fad30672051485e156c2a1 - languageName: node - linkType: hard - "chownr@npm:^2.0.0": version: 2.0.0 resolution: "chownr@npm:2.0.0" @@ -5098,9 +5085,9 @@ __metadata: linkType: hard "chrome-trace-event@npm:^1.0.2": - version: 1.0.3 - resolution: "chrome-trace-event@npm:1.0.3" - checksum: cb8b1fc7e881aaef973bd0c4a43cd353c2ad8323fb471a041e64f7c2dd849cde4aad15f8b753331a32dda45c973f032c8a03b8177fc85d60eaa75e91e08bfb97 + version: 1.0.4 + resolution: "chrome-trace-event@npm:1.0.4" + checksum: fcbbd9dd0cd5b48444319007cc0c15870fd8612cc0df320908aa9d5e8a244084d48571eb28bf3c58c19327d2c5838f354c2d89fac3956d8e992273437401ac19 languageName: node linkType: hard @@ -5112,9 +5099,9 @@ __metadata: linkType: hard "cjs-module-lexer@npm:^1.0.0": - version: 1.2.3 - resolution: "cjs-module-lexer@npm:1.2.3" - checksum: 5ea3cb867a9bb609b6d476cd86590d105f3cfd6514db38ff71f63992ab40939c2feb68967faa15a6d2b1f90daa6416b79ea2de486e9e2485a6f8b66a21b4fb0a + version: 1.3.1 + resolution: "cjs-module-lexer@npm:1.3.1" + checksum: 75f20ac264a397ea5c63f9c2343a51ab878043666468f275e94862f7180ec1d764a400ec0c09085dcf0db3193c74a8b571519abd2bf4be0d2be510d1377c8d4b languageName: node linkType: hard @@ -5155,9 +5142,9 @@ __metadata: linkType: hard "clsx@npm:^2.0.0, clsx@npm:^2.1.0": - version: 2.1.0 - resolution: "clsx@npm:2.1.0" - checksum: 43fefc29b6b49c9476fbce4f8b1cc75c27b67747738e598e6651dd40d63692135dc60b18fa1c5b78a2a9ba8ae6fd2055a068924b94e20b42039bd53b78b98e1d + version: 2.1.1 + resolution: "clsx@npm:2.1.1" + checksum: acd3e1ab9d8a433ecb3cc2f6a05ab95fe50b4a3cfc5ba47abb6cbf3754585fcb87b84e90c822a1f256c4198e3b41c7f6c391577ffc8678ad587fc0976b24fd57 languageName: node linkType: hard @@ -5295,12 +5282,12 @@ __metadata: languageName: node linkType: hard -"core-js-compat@npm:^3.31.0, core-js-compat@npm:^3.33.1": - version: 3.35.0 - resolution: "core-js-compat@npm:3.35.0" +"core-js-compat@npm:^3.31.0, core-js-compat@npm:^3.36.1": + version: 3.37.1 + resolution: "core-js-compat@npm:3.37.1" dependencies: - browserslist: ^4.22.2 - checksum: 64c41ce6870aa9130b9d0cb8f00c05204094f46db7e345d520ec2e38f8b6e1d51e921d4974ceb880948f19c0a79e5639e55be0e56f88ea20e32e9a6274da7f82 + browserslist: ^4.23.0 + checksum: 5e7430329358bced08c30950512d2081aea0a5652b4c5892cbb3c4a6db05b0d3893a191a955162a07fdb5f4fe74e61b6429fdb503f54e062336d76e43c9555d9 languageName: node linkType: hard @@ -5383,27 +5370,33 @@ __metadata: linkType: hard "css-functions-list@npm:^3.2.1": - version: 3.2.1 - resolution: "css-functions-list@npm:3.2.1" - checksum: 57d7deb3b05e84d95b88ba9b3244cf60d33b40652b3357f084c805b24a9febda5987ade44ef25a56be41e73249a7dcc157abd704d8a0e998b2c1c2e2d5de6461 + version: 3.2.2 + resolution: "css-functions-list@npm:3.2.2" + checksum: b8a564118b93b87b63236a57132a3ef581416896a70c1d0df73360a9ec43dc582f7c2a586b578feb8476179518e557c6657570a8b6185b16300c7232a84d43e3 languageName: node linkType: hard "css-loader@npm:^6.7.1": - version: 6.9.0 - resolution: "css-loader@npm:6.9.0" + version: 6.11.0 + resolution: "css-loader@npm:6.11.0" dependencies: icss-utils: ^5.1.0 - postcss: ^8.4.31 - postcss-modules-extract-imports: ^3.0.0 - postcss-modules-local-by-default: ^4.0.3 - postcss-modules-scope: ^3.1.0 + postcss: ^8.4.33 + postcss-modules-extract-imports: ^3.1.0 + postcss-modules-local-by-default: ^4.0.5 + postcss-modules-scope: ^3.2.0 postcss-modules-values: ^4.0.0 postcss-value-parser: ^4.2.0 semver: ^7.5.4 peerDependencies: + "@rspack/core": 0.x || 1.x webpack: ^5.0.0 - checksum: 71f20ee5eb5a4a9373ab41a5c17df411cb4f6f2de037297a2b0c2150681578f4979f319f4307a61e23c231dd6546e657ae95cba5a0698ad13ca43f91d4d2a0bc + peerDependenciesMeta: + "@rspack/core": + optional: true + webpack: + optional: true + checksum: 5c8d35975a7121334905394e88e28f05df72f037dbed2fb8fec4be5f0b313ae73a13894ba791867d4a4190c35896da84a7fd0c54fb426db55d85ba5e714edbe3 languageName: node linkType: hard @@ -5456,7 +5449,7 @@ __metadata: languageName: node linkType: hard -"csstype@npm:^3.0.2, csstype@npm:^3.1.2": +"csstype@npm:^3.0.2, csstype@npm:^3.1.3": version: 3.1.3 resolution: "csstype@npm:3.1.3" checksum: 8db785cc92d259102725b3c694ec0c823f5619a84741b5c7991b8ad135dfaa66093038a1cc63e03361a6cd28d122be48f2106ae72334e067dd619a51f49eddf7 @@ -5578,22 +5571,55 @@ __metadata: languageName: node linkType: hard +"data-view-buffer@npm:^1.0.1": + version: 1.0.1 + resolution: "data-view-buffer@npm:1.0.1" + dependencies: + call-bind: ^1.0.6 + es-errors: ^1.3.0 + is-data-view: ^1.0.1 + checksum: ce24348f3c6231223b216da92e7e6a57a12b4af81a23f27eff8feabdf06acfb16c00639c8b705ca4d167f761cfc756e27e5f065d0a1f840c10b907fdaf8b988c + languageName: node + linkType: hard + +"data-view-byte-length@npm:^1.0.1": + version: 1.0.1 + resolution: "data-view-byte-length@npm:1.0.1" + dependencies: + call-bind: ^1.0.7 + es-errors: ^1.3.0 + is-data-view: ^1.0.1 + checksum: dbb3200edcb7c1ef0d68979834f81d64fd8cab2f7691b3a4c6b97e67f22182f3ec2c8602efd7b76997b55af6ff8bce485829c1feda4fa2165a6b71fb7baa4269 + languageName: node + linkType: hard + +"data-view-byte-offset@npm:^1.0.0": + version: 1.0.0 + resolution: "data-view-byte-offset@npm:1.0.0" + dependencies: + call-bind: ^1.0.6 + es-errors: ^1.3.0 + is-data-view: ^1.0.1 + checksum: 7f0bf8720b7414ca719eedf1846aeec392f2054d7af707c5dc9a753cc77eb8625f067fa901e0b5127e831f9da9056138d894b9c2be79c27a21f6db5824f009c2 + languageName: node + linkType: hard + "date-fns@npm:^3.2.0": - version: 3.2.0 - resolution: "date-fns@npm:3.2.0" - checksum: ff5dab139f40170c4ba5472bab9bc887dd3940f7661bd8322f074faadbd422513c7195296541b5237fc450a0333a4b1c5659f887c7c14b1bfa2902998ac7582e + version: 3.6.0 + resolution: "date-fns@npm:3.6.0" + checksum: 0daa1e9a436cf99f9f2ae9232b55e11f3dd46132bee10987164f3eebd29f245b2e066d7d7db40782627411ecf18551d8f4c9fcdf2226e48bb66545407d448ab7 languageName: node linkType: hard "debug@npm:4, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.1, debug@npm:^4.3.2, debug@npm:^4.3.4": - version: 4.3.4 - resolution: "debug@npm:4.3.4" + version: 4.3.5 + resolution: "debug@npm:4.3.5" dependencies: ms: 2.1.2 peerDependenciesMeta: supports-color: optional: true - checksum: 3dbad3f94ea64f34431a9cbf0bafb61853eda57bff2880036153438f50fb5a84f27683ba0d8e5426bf41a8c6ff03879488120cf5b3a761e77953169c0600a708 + checksum: 7c002b51e256257f936dda09eb37167df952758c57badf6bf44bdc40b89a4bcb8e5a0a2e4c7b53f97c69e2970dd5272d33a757378a12c8f8e64ea7bf99e8e86e languageName: node linkType: hard @@ -5636,14 +5662,14 @@ __metadata: linkType: hard "dedent@npm:^1.0.0": - version: 1.5.1 - resolution: "dedent@npm:1.5.1" + version: 1.5.3 + resolution: "dedent@npm:1.5.3" peerDependencies: babel-plugin-macros: ^3.1.0 peerDependenciesMeta: babel-plugin-macros: optional: true - checksum: c3c300a14edf1bdf5a873f9e4b22e839d62490bc5c8d6169c1f15858a1a76733d06a9a56930e963d677a2ceeca4b6b0894cc5ea2f501aa382ca5b92af3413c2a + checksum: 045b595557b2a8ea2eb9b0b4623d764e9a87326486fe2b61191b4342ed93dc01245644d8a09f3108a50c0ee7965f1eedd92e4a3a503ed89ea8e810566ea27f9a languageName: node linkType: hard @@ -5668,18 +5694,18 @@ __metadata: languageName: node linkType: hard -"define-data-property@npm:^1.0.1, define-data-property@npm:^1.1.1": - version: 1.1.1 - resolution: "define-data-property@npm:1.1.1" +"define-data-property@npm:^1.0.1, define-data-property@npm:^1.1.4": + version: 1.1.4 + resolution: "define-data-property@npm:1.1.4" dependencies: - get-intrinsic: ^1.2.1 + es-define-property: ^1.0.0 + es-errors: ^1.3.0 gopd: ^1.0.1 - has-property-descriptors: ^1.0.0 - checksum: a29855ad3f0630ea82e3c5012c812efa6ca3078d5c2aa8df06b5f597c1cde6f7254692df41945851d903e05a1668607b6d34e778f402b9ff9ffb38111f1a3f0d + checksum: 8068ee6cab694d409ac25936eb861eea704b7763f7f342adbdfe337fc27c78d7ae0eff2364b2917b58c508d723c7a074326d068eef2e45c4edcd85cf94d0313b languageName: node linkType: hard -"define-properties@npm:^1.1.3, define-properties@npm:^1.2.0, define-properties@npm:^1.2.1": +"define-properties@npm:^1.2.0, define-properties@npm:^1.2.1": version: 1.2.1 resolution: "define-properties@npm:1.2.1" dependencies: @@ -5729,15 +5755,6 @@ __metadata: languageName: node linkType: hard -"dom-helpers@npm:^3.4.0": - version: 3.4.0 - resolution: "dom-helpers@npm:3.4.0" - dependencies: - "@babel/runtime": ^7.1.2 - checksum: 58d9f1c4a96daf77eddc63ae1236b826e1cddd6db66bbf39b18d7e21896d99365b376593352d52a60969d67fa4a8dbef26adc1439fa2c1b355efa37cacbaf637 - languageName: node - linkType: hard - "dom-helpers@npm:^5.0.1": version: 5.2.1 resolution: "dom-helpers@npm:5.2.1" @@ -5748,18 +5765,18 @@ __metadata: languageName: node linkType: hard -"dom-serializer@npm:^1.0.1": - version: 1.4.1 - resolution: "dom-serializer@npm:1.4.1" +"dom-serializer@npm:^2.0.0": + version: 2.0.0 + resolution: "dom-serializer@npm:2.0.0" dependencies: - domelementtype: ^2.0.1 - domhandler: ^4.2.0 - entities: ^2.0.0 - checksum: fbb0b01f87a8a2d18e6e5a388ad0f7ec4a5c05c06d219377da1abc7bb0f674d804f4a8a94e3f71ff15f6cb7dcfc75704a54b261db672b9b3ab03da6b758b0b22 + domelementtype: ^2.3.0 + domhandler: ^5.0.2 + entities: ^4.2.0 + checksum: cd1810544fd8cdfbd51fa2c0c1128ec3a13ba92f14e61b7650b5de421b88205fd2e3f0cc6ace82f13334114addb90ed1c2f23074a51770a8e9c1273acbc7f3e6 languageName: node linkType: hard -"domelementtype@npm:^2.0.1, domelementtype@npm:^2.2.0": +"domelementtype@npm:^2.3.0": version: 2.3.0 resolution: "domelementtype@npm:2.3.0" checksum: ee837a318ff702622f383409d1f5b25dd1024b692ef64d3096ff702e26339f8e345820f29a68bcdcea8cfee3531776b3382651232fbeae95612d6f0a75efb4f6 @@ -5775,23 +5792,23 @@ __metadata: languageName: node linkType: hard -"domhandler@npm:^4.0.0, domhandler@npm:^4.2.0": - version: 4.3.1 - resolution: "domhandler@npm:4.3.1" +"domhandler@npm:^5.0.2, domhandler@npm:^5.0.3": + version: 5.0.3 + resolution: "domhandler@npm:5.0.3" dependencies: - domelementtype: ^2.2.0 - checksum: 4c665ceed016e1911bf7d1dadc09dc888090b64dee7851cccd2fcf5442747ec39c647bb1cb8c8919f8bbdd0f0c625a6bafeeed4b2d656bbecdbae893f43ffaaa + domelementtype: ^2.3.0 + checksum: 0f58f4a6af63e6f3a4320aa446d28b5790a009018707bce2859dcb1d21144c7876482b5188395a188dfa974238c019e0a1e610d2fc269a12b2c192ea2b0b131c languageName: node linkType: hard -"domutils@npm:^2.5.2": - version: 2.8.0 - resolution: "domutils@npm:2.8.0" +"domutils@npm:^3.0.1": + version: 3.1.0 + resolution: "domutils@npm:3.1.0" dependencies: - dom-serializer: ^1.0.1 - domelementtype: ^2.2.0 - domhandler: ^4.2.0 - checksum: abf7434315283e9aadc2a24bac0e00eab07ae4313b40cc239f89d84d7315ebdfd2fb1b5bf750a96bc1b4403d7237c7b2ebf60459be394d625ead4ca89b934391 + dom-serializer: ^2.0.0 + domelementtype: ^2.3.0 + domhandler: ^5.0.3 + checksum: e5757456ddd173caa411cfc02c2bb64133c65546d2c4081381a3bafc8a57411a41eed70494551aa58030be9e58574fcc489828bebd673863d39924fb4878f416 languageName: node linkType: hard @@ -5814,10 +5831,10 @@ __metadata: languageName: node linkType: hard -"electron-to-chromium@npm:^1.4.601": - version: 1.4.635 - resolution: "electron-to-chromium@npm:1.4.635" - checksum: 91668c7f425d67b085ce4620d373498c66502032ec655dbdc3b734551a6aefb094a66d71e9dcbde4ec86e146923c02f73159e03c3f9a5ad5e39ac90644f06f3f +"electron-to-chromium@npm:^1.4.796": + version: 1.4.816 + resolution: "electron-to-chromium@npm:1.4.816" + checksum: 5abaa04cee77af4889e68d7fd7305c50b98eaa9b4016b228c85de5713a933767e423e2e6bcd71007fff1c405c5bea79d6e9e9d18efddaa966040fe9e97f43e2e languageName: node linkType: hard @@ -5858,24 +5875,17 @@ __metadata: languageName: node linkType: hard -"enhanced-resolve@npm:^5.15.0": - version: 5.15.0 - resolution: "enhanced-resolve@npm:5.15.0" +"enhanced-resolve@npm:^5.17.0": + version: 5.17.0 + resolution: "enhanced-resolve@npm:5.17.0" dependencies: graceful-fs: ^4.2.4 tapable: ^2.2.0 - checksum: fbd8cdc9263be71cc737aa8a7d6c57b43d6aa38f6cc75dde6fcd3598a130cc465f979d2f4d01bb3bf475acb43817749c79f8eef9be048683602ca91ab52e4f11 - languageName: node - linkType: hard - -"entities@npm:^2.0.0": - version: 2.2.0 - resolution: "entities@npm:2.2.0" - checksum: 19010dacaf0912c895ea262b4f6128574f9ccf8d4b3b65c7e8334ad0079b3706376360e28d8843ff50a78aabcb8f08f0a32dbfacdc77e47ed77ca08b713669b3 + checksum: 1066000454da6a7aeabdbe1f433d912d1e39e6892142a78a37b6577aab27e0436091fa1399d857ad87085b1c3b73a0f811c8874da3dbdc40fbd5ebe89a5568e6 languageName: node linkType: hard -"entities@npm:^4.4.0": +"entities@npm:^4.2.0, entities@npm:^4.4.0": version: 4.5.0 resolution: "entities@npm:4.5.0" checksum: 853f8ebd5b425d350bffa97dd6958143179a5938352ccae092c62d1267c4e392a039be1bae7d51b6e4ffad25f51f9617531fedf5237f15df302ccfb452cbf2d7 @@ -5890,11 +5900,11 @@ __metadata: linkType: hard "envinfo@npm:^7.7.3": - version: 7.11.0 - resolution: "envinfo@npm:7.11.0" + version: 7.13.0 + resolution: "envinfo@npm:7.13.0" bin: envinfo: dist/cli.js - checksum: c45a7d20409d5f4cda72483b150d3816b15b434f2944d72c1495d8838bd7c4e7b2f32c12128ffb9b92b5f66f436237b8a525eb3a9a5da2d20013bc4effa28aef + checksum: 822fc30f53bd0be67f0e25be96eb6a2562b8062f3058846bbd7ec471bd4b7835fca6436ee72c4029c8ae4a3d8f8cddbe2ee725b22291f015232d20a682bee732 languageName: node linkType: hard @@ -5914,68 +5924,100 @@ __metadata: languageName: node linkType: hard -"es-abstract@npm:^1.22.1": - version: 1.22.3 - resolution: "es-abstract@npm:1.22.3" +"es-abstract@npm:^1.22.1, es-abstract@npm:^1.22.3, es-abstract@npm:^1.23.0, es-abstract@npm:^1.23.2": + version: 1.23.3 + resolution: "es-abstract@npm:1.23.3" dependencies: - array-buffer-byte-length: ^1.0.0 - arraybuffer.prototype.slice: ^1.0.2 - available-typed-arrays: ^1.0.5 - call-bind: ^1.0.5 - es-set-tostringtag: ^2.0.1 + array-buffer-byte-length: ^1.0.1 + arraybuffer.prototype.slice: ^1.0.3 + available-typed-arrays: ^1.0.7 + call-bind: ^1.0.7 + data-view-buffer: ^1.0.1 + data-view-byte-length: ^1.0.1 + data-view-byte-offset: ^1.0.0 + es-define-property: ^1.0.0 + es-errors: ^1.3.0 + es-object-atoms: ^1.0.0 + es-set-tostringtag: ^2.0.3 es-to-primitive: ^1.2.1 function.prototype.name: ^1.1.6 - get-intrinsic: ^1.2.2 - get-symbol-description: ^1.0.0 + get-intrinsic: ^1.2.4 + get-symbol-description: ^1.0.2 globalthis: ^1.0.3 gopd: ^1.0.1 - has-property-descriptors: ^1.0.0 - has-proto: ^1.0.1 + has-property-descriptors: ^1.0.2 + has-proto: ^1.0.3 has-symbols: ^1.0.3 - hasown: ^2.0.0 - internal-slot: ^1.0.5 - is-array-buffer: ^3.0.2 + hasown: ^2.0.2 + internal-slot: ^1.0.7 + is-array-buffer: ^3.0.4 is-callable: ^1.2.7 - is-negative-zero: ^2.0.2 + is-data-view: ^1.0.1 + is-negative-zero: ^2.0.3 is-regex: ^1.1.4 - is-shared-array-buffer: ^1.0.2 + is-shared-array-buffer: ^1.0.3 is-string: ^1.0.7 - is-typed-array: ^1.1.12 + is-typed-array: ^1.1.13 is-weakref: ^1.0.2 object-inspect: ^1.13.1 object-keys: ^1.1.1 - object.assign: ^4.1.4 - regexp.prototype.flags: ^1.5.1 - safe-array-concat: ^1.0.1 - safe-regex-test: ^1.0.0 - string.prototype.trim: ^1.2.8 - string.prototype.trimend: ^1.0.7 - string.prototype.trimstart: ^1.0.7 - typed-array-buffer: ^1.0.0 - typed-array-byte-length: ^1.0.0 - typed-array-byte-offset: ^1.0.0 - typed-array-length: ^1.0.4 + object.assign: ^4.1.5 + regexp.prototype.flags: ^1.5.2 + safe-array-concat: ^1.1.2 + safe-regex-test: ^1.0.3 + string.prototype.trim: ^1.2.9 + string.prototype.trimend: ^1.0.8 + string.prototype.trimstart: ^1.0.8 + typed-array-buffer: ^1.0.2 + typed-array-byte-length: ^1.0.1 + typed-array-byte-offset: ^1.0.2 + typed-array-length: ^1.0.6 unbox-primitive: ^1.0.2 - which-typed-array: ^1.1.13 - checksum: b1bdc962856836f6e72be10b58dc128282bdf33771c7a38ae90419d920fc3b36cc5d2b70a222ad8016e3fc322c367bf4e9e89fc2bc79b7e933c05b218e83d79a + which-typed-array: ^1.1.15 + checksum: f840cf161224252512f9527306b57117192696571e07920f777cb893454e32999206198b4f075516112af6459daca282826d1735c450528470356d09eff3a9ae + languageName: node + linkType: hard + +"es-define-property@npm:^1.0.0": + version: 1.0.0 + resolution: "es-define-property@npm:1.0.0" + dependencies: + get-intrinsic: ^1.2.4 + checksum: f66ece0a887b6dca71848fa71f70461357c0e4e7249696f81bad0a1f347eed7b31262af4a29f5d726dc026426f085483b6b90301855e647aa8e21936f07293c6 + languageName: node + linkType: hard + +"es-errors@npm:^1.2.1, es-errors@npm:^1.3.0": + version: 1.3.0 + resolution: "es-errors@npm:1.3.0" + checksum: ec1414527a0ccacd7f15f4a3bc66e215f04f595ba23ca75cdae0927af099b5ec865f9f4d33e9d7e86f512f252876ac77d4281a7871531a50678132429b1271b5 languageName: node linkType: hard "es-module-lexer@npm:^1.2.1": - version: 1.4.1 - resolution: "es-module-lexer@npm:1.4.1" - checksum: a11b5a256d4e8e9c7d94c2fd87415ccd1591617b6edd847e064503f8eaece2d25e2e9078a02c5ce3ed5e83bb748f5b4820efbe78072c8beb07ac619c2edec35d + version: 1.5.4 + resolution: "es-module-lexer@npm:1.5.4" + checksum: a0cf04fb92d052647ac7d818d1913b98d3d3d0f5b9d88f0eafb993436e4c3e2c958599db68839d57f2dfa281fdf0f60e18d448eb78fc292c33c0f25635b6854f languageName: node linkType: hard -"es-set-tostringtag@npm:^2.0.1": - version: 2.0.2 - resolution: "es-set-tostringtag@npm:2.0.2" +"es-object-atoms@npm:^1.0.0": + version: 1.0.0 + resolution: "es-object-atoms@npm:1.0.0" dependencies: - get-intrinsic: ^1.2.2 - has-tostringtag: ^1.0.0 - hasown: ^2.0.0 - checksum: afcec3a4c9890ae14d7ec606204858441c801ff84f312538e1d1ccf1e5493c8b17bd672235df785f803756472cb4f2d49b87bde5237aef33411e74c22f194e07 + es-errors: ^1.3.0 + checksum: 26f0ff78ab93b63394e8403c353842b2272836968de4eafe97656adfb8a7c84b9099bf0fe96ed58f4a4cddc860f6e34c77f91649a58a5daa4a9c40b902744e3c + languageName: node + linkType: hard + +"es-set-tostringtag@npm:^2.0.3": + version: 2.0.3 + resolution: "es-set-tostringtag@npm:2.0.3" + dependencies: + get-intrinsic: ^1.2.4 + has-tostringtag: ^1.0.2 + hasown: ^2.0.1 + checksum: 7227fa48a41c0ce83e0377b11130d324ac797390688135b8da5c28994c0165be8b252e15cd1de41e1325e5a5412511586960213e88f9ab4a5e7d028895db5129 languageName: node linkType: hard @@ -5990,10 +6032,10 @@ __metadata: languageName: node linkType: hard -"escalade@npm:^3.1.1": - version: 3.1.1 - resolution: "escalade@npm:3.1.1" - checksum: a3e2a99f07acb74b3ad4989c48ca0c3140f69f923e56d0cba0526240ee470b91010f9d39001f2a4a313841d237ede70a729e92125191ba5d21e74b106800b133 +"escalade@npm:^3.1.1, escalade@npm:^3.1.2": + version: 3.1.2 + resolution: "escalade@npm:3.1.2" + checksum: 1ec0977aa2772075493002bdbd549d595ff6e9393b1cb0d7d6fcaf78c750da0c158f180938365486f75cb69fba20294351caddfce1b46552a7b6c3cde52eaa02 languageName: node linkType: hard @@ -6095,14 +6137,14 @@ __metadata: linkType: hard "eslint@npm:^8.36.0": - version: 8.56.0 - resolution: "eslint@npm:8.56.0" + version: 8.57.0 + resolution: "eslint@npm:8.57.0" dependencies: "@eslint-community/eslint-utils": ^4.2.0 "@eslint-community/regexpp": ^4.6.1 "@eslint/eslintrc": ^2.1.4 - "@eslint/js": 8.56.0 - "@humanwhocodes/config-array": ^0.11.13 + "@eslint/js": 8.57.0 + "@humanwhocodes/config-array": ^0.11.14 "@humanwhocodes/module-importer": ^1.0.1 "@nodelib/fs.walk": ^1.2.8 "@ungap/structured-clone": ^1.2.0 @@ -6138,7 +6180,7 @@ __metadata: text-table: ^0.2.0 bin: eslint: bin/eslint.js - checksum: 883436d1e809b4a25d9eb03d42f584b84c408dbac28b0019f6ea07b5177940bf3cca86208f749a6a1e0039b63e085ee47aca1236c30721e91f0deef5cc5a5136 + checksum: 3a48d7ff85ab420a8447e9810d8087aea5b1df9ef68c9151732b478de698389ee656fd895635b5f2871c89ee5a2652b3f343d11e9db6f8486880374ebc74a2d9 languageName: node linkType: hard @@ -6233,6 +6275,13 @@ __metadata: languageName: node linkType: hard +"exenv-es6@npm:^1.1.1": + version: 1.1.1 + resolution: "exenv-es6@npm:1.1.1" + checksum: 7f2aa12025e6f06c48dc286f380cf3183bb19c6017b36d91695034a3e5124a7235c4f8ff24ca2eb88ae801322f0f99605cedfcfd996a5fcbba7669320e2a448e + languageName: node + linkType: hard + "exit@npm:^0.1.2": version: 0.1.2 resolution: "exit@npm:0.1.2" @@ -6274,7 +6323,7 @@ __metadata: languageName: node linkType: hard -"fast-equals@npm:^5.0.0": +"fast-equals@npm:^5.0.1": version: 5.0.1 resolution: "fast-equals@npm:5.0.1" checksum: fbb3b6a74f3a0fa930afac151ff7d01639159b4fddd2678b5d50708e0ba38e9ec14602222d10dadb8398187342692c04fbef5a62b1cfcc7942fe03e754e064bc @@ -6316,11 +6365,11 @@ __metadata: linkType: hard "fastq@npm:^1.6.0": - version: 1.16.0 - resolution: "fastq@npm:1.16.0" + version: 1.17.1 + resolution: "fastq@npm:1.17.1" dependencies: reusify: ^1.0.4 - checksum: 1d40ed1f100ae625e5720484e8602b7ad07649370f1cbc3e34a6b9630a0bfed6946bab0322d8a368a1e3cde87bb9bbb8d3bc2ae01a0c1f022fac1d07c04e4feb + checksum: a8c5b26788d5a1763f88bae56a8ddeee579f935a831c5fe7a8268cea5b0a91fbfe705f612209e02d639b881d7b48e461a50da4a10cfaa40da5ca7cc9da098d88 languageName: node linkType: hard @@ -6351,12 +6400,12 @@ __metadata: languageName: node linkType: hard -"fill-range@npm:^7.0.1": - version: 7.0.1 - resolution: "fill-range@npm:7.0.1" +"fill-range@npm:^7.1.1": + version: 7.1.1 + resolution: "fill-range@npm:7.1.1" dependencies: to-regex-range: ^5.0.1 - checksum: cc283f4e65b504259e64fd969bcf4def4eb08d85565e906b7d36516e87819db52029a76b6363d0f02d0d532f0033c9603b9e2d943d56ee3b0d4f7ad3328ff917 + checksum: b4abfbca3839a3d55e4ae5ec62e131e2e356bf4859ce8480c64c4876100f4df292a63e5bb1618e1d7460282ca2b305653064f01654474aa35c68000980f17798 languageName: node linkType: hard @@ -6408,9 +6457,9 @@ __metadata: linkType: hard "flatted@npm:^3.2.9": - version: 3.2.9 - resolution: "flatted@npm:3.2.9" - checksum: f14167fbe26a9d20f6fca8d998e8f1f41df72c8e81f9f2c9d61ed2bea058248f5e1cbd05e7f88c0e5087a6a0b822a1e5e2b446e879f3cfbe0b07ba2d7f80b026 + version: 3.3.1 + resolution: "flatted@npm:3.3.1" + checksum: 85ae7181650bb728c221e7644cbc9f4bf28bc556f2fc89bb21266962bdf0ce1029cc7acc44bb646cd469d9baac7c317f64e841c4c4c00516afa97320cdac7f94 languageName: node linkType: hard @@ -6424,12 +6473,12 @@ __metadata: linkType: hard "foreground-child@npm:^3.1.0": - version: 3.1.1 - resolution: "foreground-child@npm:3.1.1" + version: 3.2.1 + resolution: "foreground-child@npm:3.2.1" dependencies: cross-spawn: ^7.0.0 signal-exit: ^4.0.1 - checksum: 139d270bc82dc9e6f8bc045fe2aae4001dc2472157044fdfad376d0a3457f77857fa883c1c8b21b491c6caade9a926a4bed3d3d2e8d3c9202b151a4cbbd0bcd5 + checksum: 3e2e844d6003c96d70affe8ae98d7eaaba269a868c14d997620c088340a8775cd5d2d9043e6ceebae1928d8d9a874911c4d664b9a267e8995945df20337aebc0 languageName: node linkType: hard @@ -6445,8 +6494,8 @@ __metadata: linkType: hard "formik@npm:^2.4.1": - version: 2.4.5 - resolution: "formik@npm:2.4.5" + version: 2.4.6 + resolution: "formik@npm:2.4.6" dependencies: "@types/hoist-non-react-statics": ^3.3.1 deepmerge: ^2.1.1 @@ -6458,7 +6507,7 @@ __metadata: tslib: ^2.0.0 peerDependencies: react: ">=16.8.0" - checksum: 316c91fc4e440094655c0d0ba47277a0f84f6082f77ae2ae959e97e2eebb8eab5b866a9e43d93a28efdae07c3f23e779da67922e2f2a1fb47d135b7346e0b5f3 + checksum: ed0ff8eca11b3c4b5564a6ae5650cb124820d239ece9a7cb3d526ff8ce3d8f9fb992e2f78ef0666e65b7c05c944a91cc98a736e806e424019d6aac8bee313a42 languageName: node linkType: hard @@ -6564,15 +6613,16 @@ __metadata: languageName: node linkType: hard -"get-intrinsic@npm:^1.0.2, get-intrinsic@npm:^1.1.1, get-intrinsic@npm:^1.1.3, get-intrinsic@npm:^1.2.0, get-intrinsic@npm:^1.2.1, get-intrinsic@npm:^1.2.2": - version: 1.2.2 - resolution: "get-intrinsic@npm:1.2.2" +"get-intrinsic@npm:^1.1.3, get-intrinsic@npm:^1.2.1, get-intrinsic@npm:^1.2.3, get-intrinsic@npm:^1.2.4": + version: 1.2.4 + resolution: "get-intrinsic@npm:1.2.4" dependencies: + es-errors: ^1.3.0 function-bind: ^1.1.2 has-proto: ^1.0.1 has-symbols: ^1.0.3 hasown: ^2.0.0 - checksum: 447ff0724df26829908dc033b62732359596fcf66027bc131ab37984afb33842d9cd458fd6cecadfe7eac22fd8a54b349799ed334cf2726025c921c7250e7417 + checksum: 414e3cdf2c203d1b9d7d33111df746a4512a1aa622770b361dadddf8ed0b5aeb26c560f49ca077e24bfafb0acb55ca908d1f709216ccba33ffc548ec8a79a951 languageName: node linkType: hard @@ -6590,13 +6640,14 @@ __metadata: languageName: node linkType: hard -"get-symbol-description@npm:^1.0.0": - version: 1.0.0 - resolution: "get-symbol-description@npm:1.0.0" +"get-symbol-description@npm:^1.0.2": + version: 1.0.2 + resolution: "get-symbol-description@npm:1.0.2" dependencies: - call-bind: ^1.0.2 - get-intrinsic: ^1.1.1 - checksum: 9ceff8fe968f9270a37a1f73bf3f1f7bda69ca80f4f80850670e0e7b9444ff99323f7ac52f96567f8b5f5fbe7ac717a0d81d3407c7313e82810c6199446a5247 + call-bind: ^1.0.5 + es-errors: ^1.3.0 + get-intrinsic: ^1.2.4 + checksum: e1cb53bc211f9dbe9691a4f97a46837a553c4e7caadd0488dc24ac694db8a390b93edd412b48dcdd0b4bbb4c595de1709effc75fc87c0839deedc6968f5bd973 languageName: node linkType: hard @@ -6626,17 +6677,18 @@ __metadata: linkType: hard "glob@npm:^10.2.2, glob@npm:^10.3.10, glob@npm:^10.3.7": - version: 10.3.10 - resolution: "glob@npm:10.3.10" + version: 10.4.2 + resolution: "glob@npm:10.4.2" dependencies: foreground-child: ^3.1.0 - jackspeak: ^2.3.5 - minimatch: ^9.0.1 - minipass: ^5.0.0 || ^6.0.2 || ^7.0.0 - path-scurry: ^1.10.1 + jackspeak: ^3.1.2 + minimatch: ^9.0.4 + minipass: ^7.1.2 + package-json-from-dist: ^1.0.0 + path-scurry: ^1.11.1 bin: glob: dist/esm/bin.mjs - checksum: 4f2fe2511e157b5a3f525a54092169a5f92405f24d2aed3142f4411df328baca13059f4182f1db1bf933e2c69c0bd89e57ae87edd8950cba8c7ccbe84f721cf3 + checksum: bd7c0e30701136e936f414e5f6f82c7f04503f01df77408f177aa584927412f0bde0338e6ec541618cd21eacc57dde33e7b3c6c0a779cc1c6e6a0e14f3d15d9b languageName: node linkType: hard @@ -6705,11 +6757,12 @@ __metadata: linkType: hard "globalthis@npm:^1.0.3": - version: 1.0.3 - resolution: "globalthis@npm:1.0.3" + version: 1.0.4 + resolution: "globalthis@npm:1.0.4" dependencies: - define-properties: ^1.1.3 - checksum: fbd7d760dc464c886d0196166d92e5ffb4c84d0730846d6621a39fbbc068aeeb9c8d1421ad330e94b7bca4bb4ea092f5f21f3d36077812af5d098b4dc006c998 + define-properties: ^1.2.1 + gopd: ^1.0.1 + checksum: 39ad667ad9f01476474633a1834a70842041f70a55571e8dcef5fb957980a92da5022db5430fca8aecc5d47704ae30618c0bc877a579c70710c904e9ef06108a languageName: node linkType: hard @@ -6752,7 +6805,7 @@ __metadata: languageName: node linkType: hard -"graceful-fs@npm:^4.1.2, graceful-fs@npm:^4.1.6, graceful-fs@npm:^4.2.0, graceful-fs@npm:^4.2.4, graceful-fs@npm:^4.2.6, graceful-fs@npm:^4.2.9": +"graceful-fs@npm:^4.1.2, graceful-fs@npm:^4.1.6, graceful-fs@npm:^4.2.0, graceful-fs@npm:^4.2.11, graceful-fs@npm:^4.2.4, graceful-fs@npm:^4.2.6, graceful-fs@npm:^4.2.9": version: 4.2.11 resolution: "graceful-fs@npm:4.2.11" checksum: ac85f94da92d8eb6b7f5a8b20ce65e43d66761c55ce85ac96df6865308390da45a8d3f0296dd3a663de65d30ba497bd46c696cc1e248c72b13d6d567138a4fc7 @@ -6782,6 +6835,8 @@ __metadata: "@mui/material": ^5.13.4 "@mui/system": ^5.13.2 "@mui/x-date-pickers": ^6.19.0 + "@tanstack/react-query": ^5.27.5 + "@tanstack/react-query-devtools": ^5.49.2 "@types/d3-scale": ^4.0.3 "@types/d3-shape": ^3.1.1 "@types/jest": ^29.2.0 @@ -6868,19 +6923,19 @@ __metadata: languageName: node linkType: hard -"has-property-descriptors@npm:^1.0.0, has-property-descriptors@npm:^1.0.1": - version: 1.0.1 - resolution: "has-property-descriptors@npm:1.0.1" +"has-property-descriptors@npm:^1.0.0, has-property-descriptors@npm:^1.0.2": + version: 1.0.2 + resolution: "has-property-descriptors@npm:1.0.2" dependencies: - get-intrinsic: ^1.2.2 - checksum: 2bcc6bf6ec6af375add4e4b4ef586e43674850a91ad4d46666d0b28ba8e1fd69e424c7677d24d60f69470ad0afaa2f3197f508b20b0bb7dd99a8ab77ffc4b7c4 + es-define-property: ^1.0.0 + checksum: fcbb246ea2838058be39887935231c6d5788babed499d0e9d0cc5737494c48aba4fe17ba1449e0d0fbbb1e36175442faa37f9c427ae357d6ccb1d895fbcd3de3 languageName: node linkType: hard -"has-proto@npm:^1.0.1": - version: 1.0.1 - resolution: "has-proto@npm:1.0.1" - checksum: febc5b5b531de8022806ad7407935e2135f1cc9e64636c3916c6842bd7995994ca3b29871ecd7954bd35f9e2986c17b3b227880484d22259e2f8e6ce63fd383e +"has-proto@npm:^1.0.1, has-proto@npm:^1.0.3": + version: 1.0.3 + resolution: "has-proto@npm:1.0.3" + checksum: fe7c3d50b33f50f3933a04413ed1f69441d21d2d2944f81036276d30635cad9279f6b43bc8f32036c31ebdfcf6e731150f46c1907ad90c669ffe9b066c3ba5c4 languageName: node linkType: hard @@ -6891,21 +6946,21 @@ __metadata: languageName: node linkType: hard -"has-tostringtag@npm:^1.0.0": - version: 1.0.0 - resolution: "has-tostringtag@npm:1.0.0" +"has-tostringtag@npm:^1.0.0, has-tostringtag@npm:^1.0.2": + version: 1.0.2 + resolution: "has-tostringtag@npm:1.0.2" dependencies: - has-symbols: ^1.0.2 - checksum: cc12eb28cb6ae22369ebaad3a8ab0799ed61270991be88f208d508076a1e99abe4198c965935ce85ea90b60c94ddda73693b0920b58e7ead048b4a391b502c1c + has-symbols: ^1.0.3 + checksum: 999d60bb753ad714356b2c6c87b7fb74f32463b8426e159397da4bde5bca7e598ab1073f4d8d4deafac297f2eb311484cd177af242776bf05f0d11565680468d languageName: node linkType: hard -"hasown@npm:^2.0.0": - version: 2.0.0 - resolution: "hasown@npm:2.0.0" +"hasown@npm:^2.0.0, hasown@npm:^2.0.1, hasown@npm:^2.0.2": + version: 2.0.2 + resolution: "hasown@npm:2.0.2" dependencies: function-bind: ^1.1.2 - checksum: 6151c75ca12554565098641c98a40f4cc86b85b0fd5b6fe92360967e4605a4f9610f7757260b4e8098dd1c2ce7f4b095f2006fe72a570e3b6d2d28de0298c176 + checksum: e8516f776a15149ca6c6ed2ae3110c417a00b62260e222590e54aa367cbcd6ed99122020b37b7fbdf05748df57b265e70095d7bf35a47660587619b15ffb93db languageName: node linkType: hard @@ -6957,15 +7012,15 @@ __metadata: languageName: node linkType: hard -"htmlparser2@npm:^6.0.0": - version: 6.1.0 - resolution: "htmlparser2@npm:6.1.0" +"htmlparser2@npm:^8.0.0": + version: 8.0.2 + resolution: "htmlparser2@npm:8.0.2" dependencies: - domelementtype: ^2.0.1 - domhandler: ^4.0.0 - domutils: ^2.5.2 - entities: ^2.0.0 - checksum: 81a7b3d9c3bb9acb568a02fc9b1b81ffbfa55eae7f1c41ae0bf840006d1dbf54cb3aa245b2553e2c94db674840a9f0fdad7027c9a9d01a062065314039058c4e + domelementtype: ^2.3.0 + domhandler: ^5.0.3 + domutils: ^3.0.1 + entities: ^4.4.0 + checksum: 29167a0f9282f181da8a6d0311b76820c8a59bc9e3c87009e21968264c2987d2723d6fde5a964d4b7b6cba663fca96ffb373c06d8223a85f52a6089ced942700 languageName: node linkType: hard @@ -6988,12 +7043,12 @@ __metadata: linkType: hard "http-proxy-agent@npm:^7.0.0": - version: 7.0.0 - resolution: "http-proxy-agent@npm:7.0.0" + version: 7.0.2 + resolution: "http-proxy-agent@npm:7.0.2" dependencies: agent-base: ^7.1.0 debug: ^4.3.4 - checksum: 48d4fac997917e15f45094852b63b62a46d0c8a4f0b9c6c23ca26d27b8df8d178bed88389e604745e748bd9a01f5023e25093722777f0593c3f052009ff438b6 + checksum: 670858c8f8f3146db5889e1fa117630910101db601fff7d5a8aa637da0abedf68c899f03d3451cac2f83bcc4c3d2dabf339b3aa00ff8080571cceb02c3ce02f3 languageName: node linkType: hard @@ -7008,12 +7063,12 @@ __metadata: linkType: hard "https-proxy-agent@npm:^7.0.1": - version: 7.0.2 - resolution: "https-proxy-agent@npm:7.0.2" + version: 7.0.5 + resolution: "https-proxy-agent@npm:7.0.5" dependencies: agent-base: ^7.0.2 debug: 4 - checksum: 088969a0dd476ea7a0ed0a2cf1283013682b08f874c3bc6696c83fa061d2c157d29ef0ad3eb70a2046010bb7665573b2388d10fdcb3e410a66995e5248444292 + checksum: 2e1a28960f13b041a50702ee74f240add8e75146a5c37fc98f1960f0496710f6918b3a9fe1e5aba41e50f58e6df48d107edd9c405c5f0d73ac260dabf2210857 languageName: node linkType: hard @@ -7052,9 +7107,9 @@ __metadata: linkType: hard "ignore@npm:^5.2.0, ignore@npm:^5.2.4": - version: 5.3.0 - resolution: "ignore@npm:5.3.0" - checksum: 2736da6621f14ced652785cb05d86301a66d70248597537176612bd0c8630893564bd5f6421f8806b09e8472e75c591ef01672ab8059c07c6eb2c09cefe04bf9 + version: 5.3.1 + resolution: "ignore@npm:5.3.1" + checksum: 71d7bb4c1dbe020f915fd881108cbe85a0db3d636a0ea3ba911393c53946711d13a9b1143c7e70db06d571a5822c0a324a6bcde5c9904e7ca5047f01f1bf8cd3 languageName: node linkType: hard @@ -7132,14 +7187,14 @@ __metadata: languageName: node linkType: hard -"internal-slot@npm:^1.0.5": - version: 1.0.6 - resolution: "internal-slot@npm:1.0.6" +"internal-slot@npm:^1.0.7": + version: 1.0.7 + resolution: "internal-slot@npm:1.0.7" dependencies: - get-intrinsic: ^1.2.2 + es-errors: ^1.3.0 hasown: ^2.0.0 side-channel: ^1.0.4 - checksum: 7872454888047553ce97a3fa1da7cc054a28ec5400a9c2e9f4dbe4fe7c1d041cb8e8301467614b80d4246d50377aad2fb58860b294ed74d6700cc346b6f89549 + checksum: cadc5eea5d7d9bc2342e93aae9f31f04c196afebb11bde97448327049f492cd7081e18623ae71388aac9cd237b692ca3a105be9c68ac39c1dec679d7409e33eb languageName: node linkType: hard @@ -7157,21 +7212,23 @@ __metadata: languageName: node linkType: hard -"ip@npm:^2.0.0": - version: 2.0.0 - resolution: "ip@npm:2.0.0" - checksum: cfcfac6b873b701996d71ec82a7dd27ba92450afdb421e356f44044ed688df04567344c36cbacea7d01b1c39a4c732dc012570ebe9bebfb06f27314bca625349 +"ip-address@npm:^9.0.5": + version: 9.0.5 + resolution: "ip-address@npm:9.0.5" + dependencies: + jsbn: 1.1.0 + sprintf-js: ^1.1.3 + checksum: aa15f12cfd0ef5e38349744e3654bae649a34c3b10c77a674a167e99925d1549486c5b14730eebce9fea26f6db9d5e42097b00aa4f9f612e68c79121c71652dc languageName: node linkType: hard -"is-array-buffer@npm:^3.0.1, is-array-buffer@npm:^3.0.2": - version: 3.0.2 - resolution: "is-array-buffer@npm:3.0.2" +"is-array-buffer@npm:^3.0.4": + version: 3.0.4 + resolution: "is-array-buffer@npm:3.0.4" dependencies: call-bind: ^1.0.2 - get-intrinsic: ^1.2.0 - is-typed-array: ^1.1.10 - checksum: dcac9dda66ff17df9cabdc58214172bf41082f956eab30bb0d86bc0fab1e44b690fc8e1f855cf2481245caf4e8a5a006a982a71ddccec84032ed41f9d8da8c14 + get-intrinsic: ^1.2.1 + checksum: e4e3e6ef0ff2239e75371d221f74bc3c26a03564a22efb39f6bb02609b598917ddeecef4e8c877df2a25888f247a98198959842a5e73236bc7f22cabdf6351a7 languageName: node linkType: hard @@ -7209,11 +7266,20 @@ __metadata: linkType: hard "is-core-module@npm:^2.13.0, is-core-module@npm:^2.5.0": - version: 2.13.1 - resolution: "is-core-module@npm:2.13.1" + version: 2.14.0 + resolution: "is-core-module@npm:2.14.0" dependencies: - hasown: ^2.0.0 - checksum: 256559ee8a9488af90e4bad16f5583c6d59e92f0742e9e8bb4331e758521ee86b810b93bae44f390766ffbc518a0488b18d9dab7da9a5ff997d499efc9403f7c + hasown: ^2.0.2 + checksum: 6bba6c8dc99d88d6f3b2746709d82caddcd9565cafd5870e28ab320720e27e6d9d2bb953ba0839ed4d2ee264bfdd14a9fa1bbc242a916f7dacc8aa95f0322256 + languageName: node + linkType: hard + +"is-data-view@npm:^1.0.1": + version: 1.0.1 + resolution: "is-data-view@npm:1.0.1" + dependencies: + is-typed-array: ^1.1.13 + checksum: 4ba4562ac2b2ec005fefe48269d6bd0152785458cd253c746154ffb8a8ab506a29d0cfb3b74af87513843776a88e4981ae25c89457bf640a33748eab1a7216b5 languageName: node linkType: hard @@ -7263,10 +7329,10 @@ __metadata: languageName: node linkType: hard -"is-negative-zero@npm:^2.0.2": - version: 2.0.2 - resolution: "is-negative-zero@npm:2.0.2" - checksum: f3232194c47a549da60c3d509c9a09be442507616b69454716692e37ae9f37c4dea264fb208ad0c9f3efd15a796a46b79df07c7e53c6227c32170608b809149a +"is-negative-zero@npm:^2.0.3": + version: 2.0.3 + resolution: "is-negative-zero@npm:2.0.3" + checksum: c1e6b23d2070c0539d7b36022d5a94407132411d01aba39ec549af824231f3804b1aea90b5e4e58e807a65d23ceb538ed6e355ce76b267bdd86edb757ffcbdcd languageName: node linkType: hard @@ -7333,12 +7399,12 @@ __metadata: languageName: node linkType: hard -"is-shared-array-buffer@npm:^1.0.2": - version: 1.0.2 - resolution: "is-shared-array-buffer@npm:1.0.2" +"is-shared-array-buffer@npm:^1.0.2, is-shared-array-buffer@npm:^1.0.3": + version: 1.0.3 + resolution: "is-shared-array-buffer@npm:1.0.3" dependencies: - call-bind: ^1.0.2 - checksum: 9508929cf14fdc1afc9d61d723c6e8d34f5e117f0bffda4d97e7a5d88c3a8681f633a74f8e3ad1fe92d5113f9b921dc5ca44356492079612f9a247efbce7032a + call-bind: ^1.0.7 + checksum: a4fff602c309e64ccaa83b859255a43bb011145a42d3f56f67d9268b55bc7e6d98a5981a1d834186ad3105d6739d21547083fe7259c76c0468483fc538e716d8 languageName: node linkType: hard @@ -7367,12 +7433,12 @@ __metadata: languageName: node linkType: hard -"is-typed-array@npm:^1.1.10, is-typed-array@npm:^1.1.12, is-typed-array@npm:^1.1.9": - version: 1.1.12 - resolution: "is-typed-array@npm:1.1.12" +"is-typed-array@npm:^1.1.13": + version: 1.1.13 + resolution: "is-typed-array@npm:1.1.13" dependencies: - which-typed-array: ^1.1.11 - checksum: 4c89c4a3be07186caddadf92197b17fda663a9d259ea0d44a85f171558270d36059d1c386d34a12cba22dfade5aba497ce22778e866adc9406098c8fc4771796 + which-typed-array: ^1.1.14 + checksum: 150f9ada183a61554c91e1c4290086d2c100b0dff45f60b028519be72a8db964da403c48760723bf5253979b8dffe7b544246e0e5351dcd05c5fdb1dcc1dc0f0 languageName: node linkType: hard @@ -7441,15 +7507,15 @@ __metadata: linkType: hard "istanbul-lib-instrument@npm:^6.0.0": - version: 6.0.1 - resolution: "istanbul-lib-instrument@npm:6.0.1" + version: 6.0.3 + resolution: "istanbul-lib-instrument@npm:6.0.3" dependencies: - "@babel/core": ^7.12.3 - "@babel/parser": ^7.14.7 - "@istanbuljs/schema": ^0.1.2 + "@babel/core": ^7.23.9 + "@babel/parser": ^7.23.9 + "@istanbuljs/schema": ^0.1.3 istanbul-lib-coverage: ^3.2.0 semver: ^7.5.4 - checksum: fb23472e739cfc9b027cefcd7d551d5e7ca7ff2817ae5150fab99fe42786a7f7b56a29a2aa8309c37092e18297b8003f9c274f50ca4360949094d17fbac81472 + checksum: 74104c60c65c4fa0e97cc76f039226c356123893929f067bfad5f86fe839e08f5d680354a68fead3bc9c1e2f3fa6f3f53cded70778e821d911e851d349f3545a languageName: node linkType: hard @@ -7476,25 +7542,25 @@ __metadata: linkType: hard "istanbul-reports@npm:^3.1.3": - version: 3.1.6 - resolution: "istanbul-reports@npm:3.1.6" + version: 3.1.7 + resolution: "istanbul-reports@npm:3.1.7" dependencies: html-escaper: ^2.0.0 istanbul-lib-report: ^3.0.0 - checksum: 44c4c0582f287f02341e9720997f9e82c071627e1e862895745d5f52ec72c9b9f38e1d12370015d2a71dcead794f34c7732aaef3fab80a24bc617a21c3d911d6 + checksum: 2072db6e07bfbb4d0eb30e2700250636182398c1af811aea5032acb219d2080f7586923c09fa194029efd6b92361afb3dcbe1ebcc3ee6651d13340f7c6c4ed95 languageName: node linkType: hard -"jackspeak@npm:^2.3.5": - version: 2.3.6 - resolution: "jackspeak@npm:2.3.6" +"jackspeak@npm:^3.1.2": + version: 3.4.0 + resolution: "jackspeak@npm:3.4.0" dependencies: "@isaacs/cliui": ^8.0.2 "@pkgjs/parseargs": ^0.11.0 dependenciesMeta: "@pkgjs/parseargs": optional: true - checksum: 57d43ad11eadc98cdfe7496612f6bbb5255ea69fe51ea431162db302c2a11011642f50cfad57288bd0aea78384a0612b16e131944ad8ecd09d619041c8531b54 + checksum: 350f6f311018bb175ffbe736b19c26ac0b134bb5a17a638169e89594eb0c24ab1c658ab3a2fda24ff63b3b19292e1a5ec19d2255bc526df704e8168d392bef85 languageName: node linkType: hard @@ -8011,6 +8077,13 @@ __metadata: languageName: node linkType: hard +"jsbn@npm:1.1.0": + version: 1.1.0 + resolution: "jsbn@npm:1.1.0" + checksum: 944f924f2bd67ad533b3850eee47603eed0f6ae425fd1ee8c760f477e8c34a05f144c1bd4f5a5dd1963141dc79a2c55f89ccc5ab77d039e7077f3ad196b64965 + languageName: node + linkType: hard + "jsdom@npm:^20.0.0": version: 20.0.3 resolution: "jsdom@npm:20.0.3" @@ -8207,14 +8280,15 @@ __metadata: linkType: hard "lib0@npm:^0.2.85, lib0@npm:^0.2.86": - version: 0.2.88 - resolution: "lib0@npm:0.2.88" + version: 0.2.94 + resolution: "lib0@npm:0.2.94" dependencies: isomorphic.js: ^0.2.4 bin: + 0ecdsa-generate-keypair: bin/0ecdsa-generate-keypair.js 0gentesthtml: bin/gentesthtml.js 0serve: bin/0serve.js - checksum: 1ac13d6781f4d29aa317ad9fb9b6c41e8bed52b096a369f54d10d9b8651ceb4a0a63b06c01c2e1c7319d3bb74668afb6cac3735161b32031f185cec024bbba37 + checksum: b091c7b39875a58d92ae6dcb014a42b56caf1336e03d310403c47a2fcea079eba92ffb43da90eaff9d010f08bcd20de35fffed7c655c83312ff4e3477f5dc261 languageName: node linkType: hard @@ -8335,7 +8409,7 @@ __metadata: languageName: node linkType: hard -"lodash@npm:^4.17.19, lodash@npm:^4.17.20, lodash@npm:^4.17.21, lodash@npm:^4.17.4, lodash@npm:^4.7.0": +"lodash@npm:^4.17.20, lodash@npm:^4.17.21, lodash@npm:^4.17.4, lodash@npm:^4.7.0": version: 4.17.21 resolution: "lodash@npm:4.17.21" checksum: eb835a2e51d381e561e508ce932ea50a8e5a68f4ebdd771ea240d3048244a8d13658acbd502cd4829768c56f2e16bdd4340b9ea141297d472517b83868e677f7 @@ -8353,10 +8427,10 @@ __metadata: languageName: node linkType: hard -"lru-cache@npm:^10.0.1, lru-cache@npm:^9.1.1 || ^10.0.0": - version: 10.1.0 - resolution: "lru-cache@npm:10.1.0" - checksum: 58056d33e2500fbedce92f8c542e7c11b50d7d086578f14b7074d8c241422004af0718e08a6eaae8705cee09c77e39a61c1c79e9370ba689b7010c152e6a76ab +"lru-cache@npm:^10.0.1, lru-cache@npm:^10.2.0": + version: 10.3.0 + resolution: "lru-cache@npm:10.3.0" + checksum: f2289639bd94cf3c87bfd8a77ac991f9afe3af004ddca3548c3dae63ead1c73bba449a60a4e270992e16cf3261b3d4130943234d52ca3a4d4de2fc074a3cc7b5 languageName: node linkType: hard @@ -8395,8 +8469,8 @@ __metadata: linkType: hard "make-fetch-happen@npm:^13.0.0": - version: 13.0.0 - resolution: "make-fetch-happen@npm:13.0.0" + version: 13.0.1 + resolution: "make-fetch-happen@npm:13.0.1" dependencies: "@npmcli/agent": ^2.0.0 cacache: ^18.0.0 @@ -8407,9 +8481,10 @@ __metadata: minipass-flush: ^1.0.5 minipass-pipeline: ^1.2.4 negotiator: ^0.6.3 + proc-log: ^4.2.0 promise-retry: ^2.0.1 ssri: ^10.0.0 - checksum: 7c7a6d381ce919dd83af398b66459a10e2fe8f4504f340d1d090d3fa3d1b0c93750220e1d898114c64467223504bd258612ba83efbc16f31b075cd56de24b4af + checksum: 5c9fad695579b79488fa100da05777213dd9365222f85e4757630f8dd2a21a79ddd3206c78cfd6f9b37346819681782b67900ac847a57cf04190f52dda5343fd languageName: node linkType: hard @@ -8436,12 +8511,12 @@ __metadata: languageName: node linkType: hard -"markdown-to-jsx@npm:^7.4.0": - version: 7.4.0 - resolution: "markdown-to-jsx@npm:7.4.0" +"markdown-to-jsx@npm:^7.4.1": + version: 7.4.7 + resolution: "markdown-to-jsx@npm:7.4.7" peerDependencies: react: ">= 0.14.0" - checksum: 59959d14d7927ed8a97e42d39771e2b445b90fa098477fb6ab040f044d230517dc4a95ba38a4f924cfc965a96b32211d93def150a6184f0e51d2cefdc8cb415d + checksum: bb8a696c8a95dd67ac1eb44255f31cf17e60b6c2ff03bfcd51b5e28da17856c57d7a16da59fda7f3a4eedb01d7e92eeef57a10ff3abd5431e5c80059d4565016 languageName: node linkType: hard @@ -8501,12 +8576,12 @@ __metadata: linkType: hard "micromatch@npm:^4.0.4, micromatch@npm:^4.0.5": - version: 4.0.5 - resolution: "micromatch@npm:4.0.5" + version: 4.0.7 + resolution: "micromatch@npm:4.0.7" dependencies: - braces: ^3.0.2 + braces: ^3.0.3 picomatch: ^2.3.1 - checksum: 02a17b671c06e8fefeeb6ef996119c1e597c942e632a21ef589154f23898c9c6a9858526246abb14f8bca6e77734aa9dcf65476fca47cedfb80d9577d52843fc + checksum: 3cde047d70ad80cf60c787b77198d680db3b8c25b23feb01de5e2652205d9c19f43bd81882f69a0fd1f0cde6a7a122d774998aad3271ddb1b8accf8a0f480cf7 languageName: node linkType: hard @@ -8541,13 +8616,14 @@ __metadata: linkType: hard "mini-css-extract-plugin@npm:^2.7.0": - version: 2.7.7 - resolution: "mini-css-extract-plugin@npm:2.7.7" + version: 2.9.0 + resolution: "mini-css-extract-plugin@npm:2.9.0" dependencies: schema-utils: ^4.0.0 + tapable: ^2.2.1 peerDependencies: webpack: ^5.0.0 - checksum: 04af0e7d8c1a4ff31c70ac2d0895837dae3d51cce3bfd90e3c1d90d50eef7de21778361a3064531df046d775d80b3bf056324dddea93831c7def2047c5aa8718 + checksum: ae192c67ba85ac8bffeab66774635bf90181f00d5dd6cf95412426192599ddf5506fb4b1550acbd7a5476476e39db53c770dd40f8378f7baf5de96e3fec4e6e9 languageName: node linkType: hard @@ -8560,7 +8636,7 @@ __metadata: languageName: node linkType: hard -"minimatch@npm:9.0.3, minimatch@npm:^9.0.1": +"minimatch@npm:9.0.3": version: 9.0.3 resolution: "minimatch@npm:9.0.3" dependencies: @@ -8578,6 +8654,15 @@ __metadata: languageName: node linkType: hard +"minimatch@npm:^9.0.4": + version: 9.0.5 + resolution: "minimatch@npm:9.0.5" + dependencies: + brace-expansion: ^2.0.1 + checksum: 2c035575eda1e50623c731ec6c14f65a85296268f749b9337005210bb2b34e2705f8ef1a358b188f69892286ab99dc42c8fb98a57bde55c8d81b3023c19cea28 + languageName: node + linkType: hard + "minimist-options@npm:4.1.0": version: 4.1.0 resolution: "minimist-options@npm:4.1.0" @@ -8606,8 +8691,8 @@ __metadata: linkType: hard "minipass-fetch@npm:^3.0.0": - version: 3.0.4 - resolution: "minipass-fetch@npm:3.0.4" + version: 3.0.5 + resolution: "minipass-fetch@npm:3.0.5" dependencies: encoding: ^0.1.13 minipass: ^7.0.3 @@ -8616,7 +8701,7 @@ __metadata: dependenciesMeta: encoding: optional: true - checksum: af7aad15d5c128ab1ebe52e043bdf7d62c3c6f0cecb9285b40d7b395e1375b45dcdfd40e63e93d26a0e8249c9efd5c325c65575aceee192883970ff8cb11364a + checksum: 8047d273236157aab27ab7cd8eab7ea79e6ecd63e8f80c3366ec076cb9a0fed550a6935bab51764369027c414647fd8256c2a20c5445fb250c483de43350de83 languageName: node linkType: hard @@ -8663,10 +8748,10 @@ __metadata: languageName: node linkType: hard -"minipass@npm:^5.0.0 || ^6.0.2 || ^7.0.0, minipass@npm:^7.0.2, minipass@npm:^7.0.3": - version: 7.0.4 - resolution: "minipass@npm:7.0.4" - checksum: 87585e258b9488caf2e7acea242fd7856bbe9a2c84a7807643513a338d66f368c7d518200ad7b70a508664d408aa000517647b2930c259a8b1f9f0984f344a21 +"minipass@npm:^5.0.0 || ^6.0.2 || ^7.0.0, minipass@npm:^7.0.2, minipass@npm:^7.0.3, minipass@npm:^7.1.2": + version: 7.1.2 + resolution: "minipass@npm:7.1.2" + checksum: 2bfd325b95c555f2b4d2814d49325691c7bee937d753814861b0b49d5edcda55cbbf22b6b6a60bb91eddac8668771f03c5ff647dcd9d0f798e9548b9cdc46ee3 languageName: node linkType: hard @@ -8713,8 +8798,8 @@ __metadata: linkType: hard "mui-file-input@npm:^4.0.3": - version: 4.0.3 - resolution: "mui-file-input@npm:4.0.3" + version: 4.0.4 + resolution: "mui-file-input@npm:4.0.4" dependencies: pretty-bytes: ^6.1.1 peerDependencies: @@ -8727,7 +8812,7 @@ __metadata: peerDependenciesMeta: "@types/react": optional: true - checksum: fa62296e777a3ce0dd9b6242943c52440657808afd24d2683be4c0b9233d56fdbb7b1f873fab6e2a9ce85c3296eca1af380958623a5e3973109a5ef2f1de16c3 + checksum: dad9c98e240c83eb20f85291219f9ecb42f332b5365049805d915fe667041183d2d49106e63a20418daf9a37d95576db4d06bb4a03921e6cab2f0c2e9b513b7f languageName: node linkType: hard @@ -8768,23 +8853,9 @@ __metadata: languageName: node linkType: hard -"node-fetch@npm:^2.6.0": - version: 2.7.0 - resolution: "node-fetch@npm:2.7.0" - dependencies: - whatwg-url: ^5.0.0 - peerDependencies: - encoding: ^0.1.0 - peerDependenciesMeta: - encoding: - optional: true - checksum: d76d2f5edb451a3f05b15115ec89fc6be39de37c6089f1b6368df03b91e1633fd379a7e01b7ab05089a25034b2023d959b47e59759cb38d88341b2459e89d6e5 - languageName: node - linkType: hard - "node-gyp@npm:latest": - version: 10.0.1 - resolution: "node-gyp@npm:10.0.1" + version: 10.1.0 + resolution: "node-gyp@npm:10.1.0" dependencies: env-paths: ^2.2.0 exponential-backoff: ^3.1.1 @@ -8798,7 +8869,7 @@ __metadata: which: ^4.0.0 bin: node-gyp: bin/node-gyp.js - checksum: 60a74e66d364903ce02049966303a57f898521d139860ac82744a5fdd9f7b7b3b61f75f284f3bfe6e6add3b8f1871ce305a1d41f775c7482de837b50c792223f + checksum: 72e2ab4b23fc32007a763da94018f58069fc0694bf36115d49a2b195c8831e12cf5dd1e7a3718fa85c06969aedf8fc126722d3b672ec1cb27e06ed33caee3c60 languageName: node linkType: hard @@ -8817,13 +8888,13 @@ __metadata: linkType: hard "nopt@npm:^7.0.0": - version: 7.2.0 - resolution: "nopt@npm:7.2.0" + version: 7.2.1 + resolution: "nopt@npm:7.2.1" dependencies: abbrev: ^2.0.0 bin: nopt: bin/nopt.js - checksum: a9c0f57fb8cb9cc82ae47192ca2b7ef00e199b9480eed202482c962d61b59a7fbe7541920b2a5839a97b42ee39e288c0aed770e38057a608d7f579389dfde410 + checksum: 6fa729cc77ce4162cfad8abbc9ba31d4a0ff6850c3af61d59b505653bef4781ec059f8890ecfe93ee8aa0c511093369cca88bfc998101616a2904e715bbbb7c9 languageName: node linkType: hard @@ -8902,9 +8973,9 @@ __metadata: linkType: hard "nwsapi@npm:^2.2.2": - version: 2.2.7 - resolution: "nwsapi@npm:2.2.7" - checksum: cab25f7983acec7e23490fec3ef7be608041b460504229770e3bfcf9977c41d6fe58f518994d3bd9aa3a101f501089a3d4a63536f4ff8ae4b8c4ca23bdbfda4e + version: 2.2.10 + resolution: "nwsapi@npm:2.2.10" + checksum: 5f1d361b38c47ab49727d5ea8bbfeb5867ae6de0e538eec9a8b77c88005ddde36d8b930e0730b50ee5e5dda949112c0f9ffed1bf15e7e1b3cd9cfa319f5a9b6f languageName: node linkType: hard @@ -8915,10 +8986,10 @@ __metadata: languageName: node linkType: hard -"object-inspect@npm:^1.13.1, object-inspect@npm:^1.9.0": - version: 1.13.1 - resolution: "object-inspect@npm:1.13.1" - checksum: 7d9fa9221de3311dcb5c7c307ee5dc011cdd31dc43624b7c184b3840514e118e05ef0002be5388304c416c0eb592feb46e983db12577fc47e47d5752fbbfb61f +"object-inspect@npm:^1.13.1": + version: 1.13.2 + resolution: "object-inspect@npm:1.13.2" + checksum: 9f850b3c045db60e0e97746e809ee4090d6ce62195af17dd1e9438ac761394a7d8ec4f7906559aea5424eaf61e35d3e53feded2ccd5f62fcc7d9670d3c8eb353 languageName: node linkType: hard @@ -8929,7 +9000,7 @@ __metadata: languageName: node linkType: hard -"object.assign@npm:^4.1.4": +"object.assign@npm:^4.1.5": version: 4.1.5 resolution: "object.assign@npm:4.1.5" dependencies: @@ -8960,16 +9031,16 @@ __metadata: linkType: hard "optionator@npm:^0.9.3": - version: 0.9.3 - resolution: "optionator@npm:0.9.3" + version: 0.9.4 + resolution: "optionator@npm:0.9.4" dependencies: - "@aashutoshrathi/word-wrap": ^1.2.3 deep-is: ^0.1.3 fast-levenshtein: ^2.0.6 levn: ^0.4.1 prelude-ls: ^1.2.1 type-check: ^0.4.0 - checksum: 09281999441f2fe9c33a5eeab76700795365a061563d66b098923eb719251a42bdbe432790d35064d0816ead9296dbeb1ad51a733edf4167c96bd5d0882e428a + word-wrap: ^1.2.5 + checksum: ecbd010e3dc73e05d239976422d9ef54a82a13f37c11ca5911dff41c98a6c7f0f163b27f922c37e7f8340af9d36febd3b6e9cef508f3339d4c393d7276d716bb languageName: node linkType: hard @@ -9025,6 +9096,13 @@ __metadata: languageName: node linkType: hard +"package-json-from-dist@npm:^1.0.0": + version: 1.0.0 + resolution: "package-json-from-dist@npm:1.0.0" + checksum: ac706ec856a5a03f5261e4e48fa974f24feb044d51f84f8332e2af0af04fbdbdd5bbbfb9cbbe354190409bc8307c83a9e38c6672c3c8855f709afb0006a009ea + languageName: node + linkType: hard + "parent-module@npm:^1.0.0": version: 1.0.1 resolution: "parent-module@npm:1.0.1" @@ -9114,13 +9192,13 @@ __metadata: languageName: node linkType: hard -"path-scurry@npm:^1.10.1": - version: 1.10.1 - resolution: "path-scurry@npm:1.10.1" +"path-scurry@npm:^1.11.1": + version: 1.11.1 + resolution: "path-scurry@npm:1.11.1" dependencies: - lru-cache: ^9.1.1 || ^10.0.0 + lru-cache: ^10.2.0 minipass: ^5.0.0 || ^6.0.2 || ^7.0.0 - checksum: e2557cff3a8fb8bc07afdd6ab163a92587884f9969b05bbbaf6fe7379348bfb09af9ed292af12ed32398b15fb443e81692047b786d1eeb6d898a51eb17ed7d90 + checksum: 890d5abcd593a7912dcce7cf7c6bf7a0b5648e3dee6caf0712c126ca0a65c7f3d7b9d769072a4d1baf370f61ce493ab5b038d59988688e0c5f3f646ee3c69023 languageName: node linkType: hard @@ -9140,10 +9218,10 @@ __metadata: languageName: node linkType: hard -"picocolors@npm:^1.0.0": - version: 1.0.0 - resolution: "picocolors@npm:1.0.0" - checksum: a2e8092dd86c8396bdba9f2b5481032848525b3dc295ce9b57896f931e63fc16f79805144321f72976383fc249584672a75cc18d6777c6b757603f372f745981 +"picocolors@npm:^1.0.0, picocolors@npm:^1.0.1": + version: 1.0.1 + resolution: "picocolors@npm:1.0.1" + checksum: fa68166d1f56009fc02a34cdfd112b0dd3cf1ef57667ac57281f714065558c01828cdf4f18600ad6851cbe0093952ed0660b1e0156bddf2184b6aaf5817553a5 languageName: node linkType: hard @@ -9186,36 +9264,43 @@ __metadata: languageName: node linkType: hard -"postcss-modules-extract-imports@npm:^3.0.0": - version: 3.0.0 - resolution: "postcss-modules-extract-imports@npm:3.0.0" +"possible-typed-array-names@npm:^1.0.0": + version: 1.0.0 + resolution: "possible-typed-array-names@npm:1.0.0" + checksum: b32d403ece71e042385cc7856385cecf1cd8e144fa74d2f1de40d1e16035dba097bc189715925e79b67bdd1472796ff168d3a90d296356c9c94d272d5b95f3ae + languageName: node + linkType: hard + +"postcss-modules-extract-imports@npm:^3.1.0": + version: 3.1.0 + resolution: "postcss-modules-extract-imports@npm:3.1.0" peerDependencies: postcss: ^8.1.0 - checksum: 4b65f2f1382d89c4bc3c0a1bdc5942f52f3cb19c110c57bd591ffab3a5fee03fcf831604168205b0c1b631a3dce2255c70b61aaae3ef39d69cd7eb450c2552d2 + checksum: b9192e0f4fb3d19431558be6f8af7ca45fc92baaad9b2778d1732a5880cd25c3df2074ce5484ae491e224f0d21345ffc2d419bd51c25b019af76d7a7af88c17f languageName: node linkType: hard -"postcss-modules-local-by-default@npm:^4.0.3": - version: 4.0.3 - resolution: "postcss-modules-local-by-default@npm:4.0.3" +"postcss-modules-local-by-default@npm:^4.0.5": + version: 4.0.5 + resolution: "postcss-modules-local-by-default@npm:4.0.5" dependencies: icss-utils: ^5.0.0 postcss-selector-parser: ^6.0.2 postcss-value-parser: ^4.1.0 peerDependencies: postcss: ^8.1.0 - checksum: 2f8083687f3d6067885f8863dd32dbbb4f779cfcc7e52c17abede9311d84faf6d3ed8760e7c54c6380281732ae1f78e5e56a28baf3c271b33f450a11c9e30485 + checksum: ca9b01f4a0a3dfb33e016299e2dfb7e85c3123292f7aec2efc0c6771b9955648598bfb4c1561f7ee9732fb27fb073681233661b32eef98baab43743f96735452 languageName: node linkType: hard -"postcss-modules-scope@npm:^3.1.0": - version: 3.1.0 - resolution: "postcss-modules-scope@npm:3.1.0" +"postcss-modules-scope@npm:^3.2.0": + version: 3.2.0 + resolution: "postcss-modules-scope@npm:3.2.0" dependencies: postcss-selector-parser: ^6.0.4 peerDependencies: postcss: ^8.1.0 - checksum: 919d02e2e31956fa3dae2036d4f3259c9b8c5361bd58ee55867edededbee03507df88e98f418b5e553e47f3888daba9ea9ef0b18a82c41cf96cdb74df15322c7 + checksum: 2ffe7e98c1fa993192a39c8dd8ade93fc4f59fbd1336ce34fcedaee0ee3bafb29e2e23fb49189256895b30e4f21af661c6a6a16ef7b17ae2c859301e4a4459ae languageName: node linkType: hard @@ -9247,12 +9332,12 @@ __metadata: linkType: hard "postcss-selector-parser@npm:^6.0.13, postcss-selector-parser@npm:^6.0.2, postcss-selector-parser@npm:^6.0.4": - version: 6.0.15 - resolution: "postcss-selector-parser@npm:6.0.15" + version: 6.1.0 + resolution: "postcss-selector-parser@npm:6.1.0" dependencies: cssesc: ^3.0.0 util-deprecate: ^1.0.2 - checksum: 57decb94152111004f15e27b9c61131eb50ee10a3288e7fcf424cebbb4aba82c2817517ae718f8b5d704ee9e02a638d4a2acff8f47685c295a33ecee4fd31055 + checksum: 449f614e6706421be307d8638183c61ba45bc3b460fe3815df8971dbb4d59c4087181940d879daee4a7a2daf3d86e915db1cce0c006dd68ca75b4087079273bd languageName: node linkType: hard @@ -9263,14 +9348,14 @@ __metadata: languageName: node linkType: hard -"postcss@npm:^8.3.11, postcss@npm:^8.4.28, postcss@npm:^8.4.31": - version: 8.4.33 - resolution: "postcss@npm:8.4.33" +"postcss@npm:^8.3.11, postcss@npm:^8.4.28, postcss@npm:^8.4.33": + version: 8.4.39 + resolution: "postcss@npm:8.4.39" dependencies: nanoid: ^3.3.7 - picocolors: ^1.0.0 - source-map-js: ^1.0.2 - checksum: 6f98b2af4b76632a3de20c4f47bf0e984a1ce1a531cf11adcb0b1d63a6cbda0aae4165e578b66c32ca4879038e3eaad386a6be725a8fb4429c78e3c1ab858fe9 + picocolors: ^1.0.1 + source-map-js: ^1.2.0 + checksum: 14b130c90f165961772bdaf99c67f907f3d16494adf0868e57ef68baa67e0d1f6762db9d41ab0f4d09bab6fb7888588dba3596afd1a235fd5c2d43fba7006ac6 languageName: node linkType: hard @@ -9291,11 +9376,11 @@ __metadata: linkType: hard "prettier@npm:^3.0.0": - version: 3.2.4 - resolution: "prettier@npm:3.2.4" + version: 3.3.2 + resolution: "prettier@npm:3.3.2" bin: prettier: bin/prettier.cjs - checksum: 6ec9385a836e0b9bac549e585101c086d1521c31d7b882d5c8bb7d7646da0693da5f31f4fff6dc080710e5e2d34c85e6fb2f8766876b3645c8be2f33b9c3d1a3 + checksum: 5557d8caed0b182f68123c2e1e370ef105251d1dd75800fadaece3d061daf96b1389141634febf776050f9d732c7ae8fd444ff0b4a61b20535e7610552f32c69 languageName: node linkType: hard @@ -9324,6 +9409,13 @@ __metadata: languageName: node linkType: hard +"proc-log@npm:^4.2.0": + version: 4.2.0 + resolution: "proc-log@npm:4.2.0" + checksum: 98f6cd012d54b5334144c5255ecb941ee171744f45fca8b43b58ae5a0c1af07352475f481cadd9848e7f0250376ee584f6aa0951a856ff8f021bdfbff4eb33fc + languageName: node + linkType: hard + "process@npm:^0.11.10": version: 0.11.10 resolution: "process@npm:0.11.10" @@ -9384,9 +9476,9 @@ __metadata: linkType: hard "pure-rand@npm:^6.0.0": - version: 6.0.4 - resolution: "pure-rand@npm:6.0.4" - checksum: e1c4e69f8bf7303e5252756d67c3c7551385cd34d94a1f511fe099727ccbab74c898c03a06d4c4a24a89b51858781057b83ebbfe740d984240cdc04fead36068 + version: 6.1.0 + resolution: "pure-rand@npm:6.1.0" + checksum: 8d53bc02bed99eca0b65b505090152ee7e9bd67dd74f8ff32ba1c883b87234067c5bf68d2614759fb217d82594d7a92919e6df80f97885e7b12b42af4bd3316a languageName: node linkType: hard @@ -9421,14 +9513,14 @@ __metadata: linkType: hard "react-dom@npm:^18.2.0": - version: 18.2.0 - resolution: "react-dom@npm:18.2.0" + version: 18.3.1 + resolution: "react-dom@npm:18.3.1" dependencies: loose-envify: ^1.1.0 - scheduler: ^0.23.0 + scheduler: ^0.23.2 peerDependencies: - react: ^18.2.0 - checksum: 7d323310bea3a91be2965f9468d552f201b1c27891e45ddc2d6b8f717680c95a75ae0bc1e3f5cf41472446a2589a75aed4483aee8169287909fcd59ad149e8cc + react: ^18.3.1 + checksum: 298954ecd8f78288dcaece05e88b570014d8f6dce5db6f66e6ee91448debeb59dcd31561dddb354eee47e6c1bb234669459060deb238ed0213497146e555a0b9 languageName: node linkType: hard @@ -9447,69 +9539,47 @@ __metadata: linkType: hard "react-is@npm:^18.0.0, react-is@npm:^18.2.0": - version: 18.2.0 - resolution: "react-is@npm:18.2.0" - checksum: e72d0ba81b5922759e4aff17e0252bd29988f9642ed817f56b25a3e217e13eea8a7f2322af99a06edb779da12d5d636e9fda473d620df9a3da0df2a74141d53e - languageName: node - linkType: hard - -"react-lifecycles-compat@npm:^3.0.4": - version: 3.0.4 - resolution: "react-lifecycles-compat@npm:3.0.4" - checksum: a904b0fc0a8eeb15a148c9feb7bc17cec7ef96e71188280061fc340043fd6d8ee3ff233381f0e8f95c1cf926210b2c4a31f38182c8f35ac55057e453d6df204f + version: 18.3.1 + resolution: "react-is@npm:18.3.1" + checksum: e20fe84c86ff172fc8d898251b7cc2c43645d108bf96d0b8edf39b98f9a2cae97b40520ee7ed8ee0085ccc94736c4886294456033304151c3f94978cec03df21 languageName: node linkType: hard "react-router-dom@npm:^6.14.1": - version: 6.21.2 - resolution: "react-router-dom@npm:6.21.2" + version: 6.24.0 + resolution: "react-router-dom@npm:6.24.0" dependencies: - "@remix-run/router": 1.14.2 - react-router: 6.21.2 + "@remix-run/router": 1.17.0 + react-router: 6.24.0 peerDependencies: react: ">=16.8" react-dom: ">=16.8" - checksum: 3fc17fd6693ba8fd710937a5d694172eac4b14dddfe3df61f5339718fa36caaa894135807e0d704bddd5f277db6950117bb312d76da90921dd014e225b2cf575 + checksum: 6b40474070661d60b7a237756db7d27e7925546981a2325673519dab7cb15184ad490f092f1f9e947aa414b54be8c1f50f2ecb175e2b57e4c0d7d012a170d48d languageName: node linkType: hard -"react-router@npm:6.21.2": - version: 6.21.2 - resolution: "react-router@npm:6.21.2" +"react-router@npm:6.24.0": + version: 6.24.0 + resolution: "react-router@npm:6.24.0" dependencies: - "@remix-run/router": 1.14.2 + "@remix-run/router": 1.17.0 peerDependencies: react: ">=16.8" - checksum: 8c38a4914892d5b8052bc5c244af95109affd8b74bffa16f9ea7856dc0e992dd8539b19d2618721cd7ef091a585f394fac9d05ab7a98cf3ca6aeb7519b7bce0e - languageName: node - linkType: hard - -"react-smooth@npm:^2.0.5": - version: 2.0.5 - resolution: "react-smooth@npm:2.0.5" - dependencies: - fast-equals: ^5.0.0 - react-transition-group: 2.9.0 - peerDependencies: - prop-types: ^15.6.0 - react: ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 - react-dom: ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 - checksum: 914c17f741e8b533ff6e3d5e3285aea0625cdd0f98e04202d01351f9516dbdc0a0e297dc22cc2377d6916fb819da8d4ed999c0314a4c186592ca51870012e6f7 + checksum: c58073711357500f7b2adb8968f6d160e3f2fbe2f9d9482648e70ea96910438886d4e713d420c548c4a7d1ad30db15bc9a4b952bb1cbc14dd75a209cf286f49b languageName: node linkType: hard -"react-transition-group@npm:2.9.0": - version: 2.9.0 - resolution: "react-transition-group@npm:2.9.0" +"react-smooth@npm:^4.0.0": + version: 4.0.1 + resolution: "react-smooth@npm:4.0.1" dependencies: - dom-helpers: ^3.4.0 - loose-envify: ^1.4.0 - prop-types: ^15.6.2 - react-lifecycles-compat: ^3.0.4 + fast-equals: ^5.0.1 + prop-types: ^15.8.1 + react-transition-group: ^4.4.5 peerDependencies: - react: ">=15.0.0" - react-dom: ">=15.0.0" - checksum: d8c9e50aabdc2cfc324e5cdb0ad1c6eecb02e1c0cd007b26d5b30ccf49015e900683dd489348c71fba4055858308d9ba7019e0d37d0e8d37bd46ed098788f670 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + checksum: 42c17803dcb3892a284bbb692d745d438e3bb204ecfc3c9f4f3ff808253ab783f6c64de85a0e84a20c2ea20cf0af39e78b947417ced328164d8dd4eca2918e01 languageName: node linkType: hard @@ -9528,12 +9598,12 @@ __metadata: languageName: node linkType: hard -"react@npm:^18.2.0": - version: 18.2.0 - resolution: "react@npm:18.2.0" +"react@npm:>=17.0.0 <19.0.0, react@npm:^18.2.0": + version: 18.3.1 + resolution: "react@npm:18.3.1" dependencies: loose-envify: ^1.1.0 - checksum: 88e38092da8839b830cda6feef2e8505dec8ace60579e46aa5490fc3dc9bba0bd50336507dc166f43e3afc1c42939c09fe33b25fae889d6f402721dcd78fca1b + checksum: a27bcfa8ff7c15a1e50244ad0d0c1cb2ad4375eeffefd266a64889beea6f6b64c4966c9b37d14ee32d6c9fcd5aa6ba183b6988167ab4d127d13e7cb5b386a376 languageName: node linkType: hard @@ -9581,22 +9651,21 @@ __metadata: linkType: hard "recharts@npm:^2.6.2": - version: 2.10.4 - resolution: "recharts@npm:2.10.4" + version: 2.12.7 + resolution: "recharts@npm:2.12.7" dependencies: clsx: ^2.0.0 eventemitter3: ^4.0.1 - lodash: ^4.17.19 + lodash: ^4.17.21 react-is: ^16.10.2 - react-smooth: ^2.0.5 + react-smooth: ^4.0.0 recharts-scale: ^0.4.4 tiny-invariant: ^1.3.1 victory-vendor: ^36.6.8 peerDependencies: - prop-types: ^15.6.0 react: ^16.0.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.0.0 || ^17.0.0 || ^18.0.0 - checksum: f283a21367aa675af83ada6d92ebd7bfa8931ba805bba34ee6247f74cba1b5d37c5fd48d20baa3533bbd3f0a98a1566e5d3733d23825caee8b256dd66ae5ff2c + checksum: c6f6b6d7de51dde17827f77f5dadfa0548422b1aa55c79d7104606dc47f8f4aabd7c6a226d9a8f6edf863788f33c99aafead784c842d2852b2bd9dac176460ea languageName: node linkType: hard @@ -9651,14 +9720,15 @@ __metadata: languageName: node linkType: hard -"regexp.prototype.flags@npm:^1.5.1": - version: 1.5.1 - resolution: "regexp.prototype.flags@npm:1.5.1" +"regexp.prototype.flags@npm:^1.5.2": + version: 1.5.2 + resolution: "regexp.prototype.flags@npm:1.5.2" dependencies: - call-bind: ^1.0.2 - define-properties: ^1.2.0 - set-function-name: ^2.0.0 - checksum: 869edff00288442f8d7fa4c9327f91d85f3b3acf8cbbef9ea7a220345cf23e9241b6def9263d2c1ebcf3a316b0aa52ad26a43a84aa02baca3381717b3e307f47 + call-bind: ^1.0.6 + define-properties: ^1.2.1 + es-errors: ^1.3.0 + set-function-name: ^2.0.1 + checksum: d7f333667d5c564e2d7a97c56c3075d64c722c9bb51b2b4df6822b2e8096d623a5e63088fb4c83df919b6951ef8113841de8b47de7224872fa6838bc5d8a7d64 languageName: node linkType: hard @@ -9790,13 +9860,13 @@ __metadata: linkType: hard "rimraf@npm:^5.0.1": - version: 5.0.5 - resolution: "rimraf@npm:5.0.5" + version: 5.0.7 + resolution: "rimraf@npm:5.0.7" dependencies: glob: ^10.3.7 bin: rimraf: dist/esm/bin.mjs - checksum: d66eef829b2e23b16445f34e73d75c7b7cf4cbc8834b04720def1c8f298eb0753c3d76df77325fad79d0a2c60470525d95f89c2475283ad985fd7441c32732d1 + checksum: 884852abf8aefd4667448d87bdab04120a8641266c828cf382ac811713547eda18f81799d2146ffec3178f357d83d44ec01c10095949c82e23551660732bf14f languageName: node linkType: hard @@ -9818,15 +9888,15 @@ __metadata: languageName: node linkType: hard -"safe-array-concat@npm:^1.0.1": - version: 1.1.0 - resolution: "safe-array-concat@npm:1.1.0" +"safe-array-concat@npm:^1.1.2": + version: 1.1.2 + resolution: "safe-array-concat@npm:1.1.2" dependencies: - call-bind: ^1.0.5 - get-intrinsic: ^1.2.2 + call-bind: ^1.0.7 + get-intrinsic: ^1.2.4 has-symbols: ^1.0.3 isarray: ^2.0.5 - checksum: 5c71eaa999168ee7474929f1cd3aae80f486353a651a094d9968936692cf90aa065224929a6486dcda66334a27dce4250a83612f9e0fef6dced1a925d3ac7296 + checksum: a3b259694754ddfb73ae0663829e396977b99ff21cbe8607f35a469655656da8e271753497e59da8a7575baa94d2e684bea3e10ddd74ba046c0c9b4418ffa0c4 languageName: node linkType: hard @@ -9837,14 +9907,14 @@ __metadata: languageName: node linkType: hard -"safe-regex-test@npm:^1.0.0": - version: 1.0.2 - resolution: "safe-regex-test@npm:1.0.2" +"safe-regex-test@npm:^1.0.3": + version: 1.0.3 + resolution: "safe-regex-test@npm:1.0.3" dependencies: - call-bind: ^1.0.5 - get-intrinsic: ^1.2.2 + call-bind: ^1.0.6 + es-errors: ^1.3.0 is-regex: ^1.1.4 - checksum: 4af5ce05a2daa4f6d4bfd5a3c64fc33d6b886f6592122e93c0efad52f7147b9b605e5ffc03c269a1e3d1f8db2a23bc636628a961c9fd65bafdc09503330673fd + checksum: 6c7d392ff1ae7a3ae85273450ed02d1d131f1d2c76e177d6b03eb88e6df8fa062639070e7d311802c1615f351f18dc58f9454501c58e28d5ffd9b8f502ba6489 languageName: node linkType: hard @@ -9855,17 +9925,17 @@ __metadata: languageName: node linkType: hard -"sanitize-html@npm:~2.7.3": - version: 2.7.3 - resolution: "sanitize-html@npm:2.7.3" +"sanitize-html@npm:~2.12.1": + version: 2.12.1 + resolution: "sanitize-html@npm:2.12.1" dependencies: deepmerge: ^4.2.2 escape-string-regexp: ^4.0.0 - htmlparser2: ^6.0.0 + htmlparser2: ^8.0.0 is-plain-object: ^5.0.0 parse-srcset: ^1.0.2 postcss: ^8.3.11 - checksum: 2399d1fdbbc3a263fb413c1fe1971b3dc2b51abc6cc5cb49490624539d1c57a8fe31e2b21408c118e2a957f4e673e3169b1f9a5807654408f17b130a9d78aed7 + checksum: fb96ea7170d51b5af2607f5cfd84464c78fc6f47e339407f55783e781c6a0288a8d40bbf97ea6a8758924ba9b2d33dcc4846bb94caacacd90d7f2de10ed8541a languageName: node linkType: hard @@ -9878,12 +9948,12 @@ __metadata: languageName: node linkType: hard -"scheduler@npm:^0.23.0": - version: 0.23.0 - resolution: "scheduler@npm:0.23.0" +"scheduler@npm:^0.23.2": + version: 0.23.2 + resolution: "scheduler@npm:0.23.2" dependencies: loose-envify: ^1.1.0 - checksum: d79192eeaa12abef860c195ea45d37cbf2bbf5f66e3c4dcd16f54a7da53b17788a70d109ee3d3dde1a0fd50e6a8fc171f4300356c5aee4fc0171de526bf35f8a + checksum: 3e82d1f419e240ef6219d794ff29c7ee415fbdc19e038f680a10c067108e06284f1847450a210b29bbaf97b9d8a97ced5f624c31c681248ac84c80d56ad5a2c4 languageName: node linkType: hard @@ -9940,13 +10010,11 @@ __metadata: linkType: hard "semver@npm:^7.3.4, semver@npm:^7.3.5, semver@npm:^7.5.3, semver@npm:^7.5.4": - version: 7.5.4 - resolution: "semver@npm:7.5.4" - dependencies: - lru-cache: ^6.0.0 + version: 7.6.2 + resolution: "semver@npm:7.6.2" bin: semver: bin/semver.js - checksum: 12d8ad952fa353b0995bf180cdac205a4068b759a140e5d3c608317098b3575ac2f1e09182206bf2eb26120e1c0ed8fb92c48c592f6099680de56bb071423ca3 + checksum: 40f6a95101e8d854357a644da1b8dd9d93ce786d5c6a77227bc69dbb17bea83d0d1d1d7c4cd5920a6df909f48e8bd8a5909869535007f90278289f2451d0292d languageName: node linkType: hard @@ -9959,27 +10027,29 @@ __metadata: languageName: node linkType: hard -"set-function-length@npm:^1.1.1": - version: 1.2.0 - resolution: "set-function-length@npm:1.2.0" +"set-function-length@npm:^1.2.1": + version: 1.2.2 + resolution: "set-function-length@npm:1.2.2" dependencies: - define-data-property: ^1.1.1 + define-data-property: ^1.1.4 + es-errors: ^1.3.0 function-bind: ^1.1.2 - get-intrinsic: ^1.2.2 + get-intrinsic: ^1.2.4 gopd: ^1.0.1 - has-property-descriptors: ^1.0.1 - checksum: 63e34b45a2ff9abb419f52583481bf8ba597d33c0c85e56999085eb6078a0f7fbb4222051981c287feceeb358aa7789e7803cea2c82ac94c0ab37059596aff79 + has-property-descriptors: ^1.0.2 + checksum: a8248bdacdf84cb0fab4637774d9fb3c7a8e6089866d04c817583ff48e14149c87044ce683d7f50759a8c50fb87c7a7e173535b06169c87ef76f5fb276dfff72 languageName: node linkType: hard -"set-function-name@npm:^2.0.0": - version: 2.0.1 - resolution: "set-function-name@npm:2.0.1" +"set-function-name@npm:^2.0.1": + version: 2.0.2 + resolution: "set-function-name@npm:2.0.2" dependencies: - define-data-property: ^1.0.1 + define-data-property: ^1.1.4 + es-errors: ^1.3.0 functions-have-names: ^1.2.3 - has-property-descriptors: ^1.0.0 - checksum: 4975d17d90c40168eee2c7c9c59d023429f0a1690a89d75656306481ece0c3c1fb1ebcc0150ea546d1913e35fbd037bace91372c69e543e51fc5d1f31a9fa126 + has-property-descriptors: ^1.0.2 + checksum: d6229a71527fd0404399fc6227e0ff0652800362510822a291925c9d7b48a1ca1a468b11b281471c34cd5a2da0db4f5d7ff315a61d26655e77f6e971e6d0c80f languageName: node linkType: hard @@ -10032,13 +10102,14 @@ __metadata: linkType: hard "side-channel@npm:^1.0.4": - version: 1.0.4 - resolution: "side-channel@npm:1.0.4" + version: 1.0.6 + resolution: "side-channel@npm:1.0.6" dependencies: - call-bind: ^1.0.0 - get-intrinsic: ^1.0.2 - object-inspect: ^1.9.0 - checksum: 351e41b947079c10bd0858364f32bb3a7379514c399edb64ab3dce683933483fc63fb5e4efe0a15a2e8a7e3c436b6a91736ddb8d8c6591b0460a24bb4a1ee245 + call-bind: ^1.0.7 + es-errors: ^1.3.0 + get-intrinsic: ^1.2.4 + object-inspect: ^1.13.1 + checksum: bfc1afc1827d712271453e91b7cd3878ac0efd767495fd4e594c4c2afaa7963b7b510e249572bfd54b0527e66e4a12b61b80c061389e129755f34c493aad9b97 languageName: node linkType: hard @@ -10097,24 +10168,24 @@ __metadata: languageName: node linkType: hard -"socks-proxy-agent@npm:^8.0.1": - version: 8.0.2 - resolution: "socks-proxy-agent@npm:8.0.2" +"socks-proxy-agent@npm:^8.0.3": + version: 8.0.4 + resolution: "socks-proxy-agent@npm:8.0.4" dependencies: - agent-base: ^7.0.2 + agent-base: ^7.1.1 debug: ^4.3.4 - socks: ^2.7.1 - checksum: 4fb165df08f1f380881dcd887b3cdfdc1aba3797c76c1e9f51d29048be6e494c5b06d68e7aea2e23df4572428f27a3ec22b3d7c75c570c5346507433899a4b6d + socks: ^2.8.3 + checksum: b2ec5051d85fe49072f9a250c427e0e9571fd09d5db133819192d078fd291276e1f0f50f6dbc04329b207738b1071314cee8bdbb4b12e27de42dbcf1d4233c67 languageName: node linkType: hard -"socks@npm:^2.7.1": - version: 2.7.1 - resolution: "socks@npm:2.7.1" +"socks@npm:^2.8.3": + version: 2.8.3 + resolution: "socks@npm:2.8.3" dependencies: - ip: ^2.0.0 + ip-address: ^9.0.5 smart-buffer: ^4.2.0 - checksum: 259d9e3e8e1c9809a7f5c32238c3d4d2a36b39b83851d0f573bfde5f21c4b1288417ce1af06af1452569cd1eb0841169afd4998f0e04ba04656f6b7f0e46d748 + checksum: 7a6b7f6eedf7482b9e4597d9a20e09505824208006ea8f2c49b71657427f3c137ca2ae662089baa73e1971c62322d535d9d0cf1c9235cf6f55e315c18203eadd languageName: node linkType: hard @@ -10125,10 +10196,10 @@ __metadata: languageName: node linkType: hard -"source-map-js@npm:^1.0.1, source-map-js@npm:^1.0.2": - version: 1.0.2 - resolution: "source-map-js@npm:1.0.2" - checksum: c049a7fc4deb9a7e9b481ae3d424cc793cb4845daa690bc5a05d428bf41bf231ced49b4cf0c9e77f9d42fdb3d20d6187619fc586605f5eabe995a316da8d377c +"source-map-js@npm:^1.0.1, source-map-js@npm:^1.0.2, source-map-js@npm:^1.2.0": + version: 1.2.0 + resolution: "source-map-js@npm:1.2.0" + checksum: 791a43306d9223792e84293b00458bf102a8946e7188f3db0e4e22d8d530b5f80a4ce468eb5ec0bf585443ad55ebbd630bf379c98db0b1f317fd902500217f97 languageName: node linkType: hard @@ -10204,9 +10275,9 @@ __metadata: linkType: hard "spdx-exceptions@npm:^2.1.0": - version: 2.3.0 - resolution: "spdx-exceptions@npm:2.3.0" - checksum: cb69a26fa3b46305637123cd37c85f75610e8c477b6476fa7354eb67c08128d159f1d36715f19be6f9daf4b680337deb8c65acdcae7f2608ba51931540687ac0 + version: 2.5.0 + resolution: "spdx-exceptions@npm:2.5.0" + checksum: bb127d6e2532de65b912f7c99fc66097cdea7d64c10d3ec9b5e96524dbbd7d20e01cba818a6ddb2ae75e62bb0c63d5e277a7e555a85cbc8ab40044984fa4ae15 languageName: node linkType: hard @@ -10221,9 +10292,16 @@ __metadata: linkType: hard "spdx-license-ids@npm:^3.0.0": - version: 3.0.16 - resolution: "spdx-license-ids@npm:3.0.16" - checksum: 5cdaa85aaa24bd02f9353a2e357b4df0a4f205cb35655f3fd0a5674a4fb77081f28ffd425379214bc3be2c2b7593ce1215df6bcc75884aeee0a9811207feabe2 + version: 3.0.18 + resolution: "spdx-license-ids@npm:3.0.18" + checksum: 457825df5dd1fc0135b0bb848c896143f70945cc2da148afc71c73ed0837d1d651f809006e406d82109c9dd71a8cb39785a3604815fe46bc0548e9d3976f6b69 + languageName: node + linkType: hard + +"sprintf-js@npm:^1.1.3": + version: 1.1.3 + resolution: "sprintf-js@npm:1.1.3" + checksum: a3fdac7b49643875b70864a9d9b469d87a40dfeaf5d34d9d0c5b1cda5fd7d065531fcb43c76357d62254c57184a7b151954156563a4d6a747015cfb41021cad0 languageName: node linkType: hard @@ -10235,11 +10313,11 @@ __metadata: linkType: hard "ssri@npm:^10.0.0": - version: 10.0.5 - resolution: "ssri@npm:10.0.5" + version: 10.0.6 + resolution: "ssri@npm:10.0.6" dependencies: minipass: ^7.0.3 - checksum: 0a31b65f21872dea1ed3f7c200d7bc1c1b91c15e419deca14f282508ba917cbb342c08a6814c7f68ca4ca4116dd1a85da2bbf39227480e50125a1ceffeecb750 + checksum: 4603d53a05bcd44188747d38f1cc43833b9951b5a1ee43ba50535bdfc5fe4a0897472dbe69837570a5417c3c073377ef4f8c1a272683b401857f72738ee57299 languageName: node linkType: hard @@ -10285,46 +10363,48 @@ __metadata: linkType: hard "string.prototype.padend@npm:^3.0.0": - version: 3.1.5 - resolution: "string.prototype.padend@npm:3.1.5" + version: 3.1.6 + resolution: "string.prototype.padend@npm:3.1.6" dependencies: - call-bind: ^1.0.2 - define-properties: ^1.2.0 - es-abstract: ^1.22.1 - checksum: fc915e0b6ae1dce07a9f5088429d84fda2c1c0ac9a05bc14a602f173cc2fdef32e4893dfba5656f8f955450c9c16deebdb8d303d27613a367bc6d8508a94cd5e + call-bind: ^1.0.7 + define-properties: ^1.2.1 + es-abstract: ^1.23.2 + es-object-atoms: ^1.0.0 + checksum: d9fc23c21bdfb6850756002ef09cebc420882003f29eafbd8322df77a90726bc2a64892d01f94f1fc9fc6f809414fbcbd8615610bb3cddd33512c12b6b3643a2 languageName: node linkType: hard -"string.prototype.trim@npm:^1.2.8": - version: 1.2.8 - resolution: "string.prototype.trim@npm:1.2.8" +"string.prototype.trim@npm:^1.2.9": + version: 1.2.9 + resolution: "string.prototype.trim@npm:1.2.9" dependencies: - call-bind: ^1.0.2 - define-properties: ^1.2.0 - es-abstract: ^1.22.1 - checksum: 49eb1a862a53aba73c3fb6c2a53f5463173cb1f4512374b623bcd6b43ad49dd559a06fb5789bdec771a40fc4d2a564411c0a75d35fb27e76bbe738c211ecff07 + call-bind: ^1.0.7 + define-properties: ^1.2.1 + es-abstract: ^1.23.0 + es-object-atoms: ^1.0.0 + checksum: ea2df6ec1e914c9d4e2dc856fa08228e8b1be59b59e50b17578c94a66a176888f417264bb763d4aac638ad3b3dad56e7a03d9317086a178078d131aa293ba193 languageName: node linkType: hard -"string.prototype.trimend@npm:^1.0.7": - version: 1.0.7 - resolution: "string.prototype.trimend@npm:1.0.7" +"string.prototype.trimend@npm:^1.0.8": + version: 1.0.8 + resolution: "string.prototype.trimend@npm:1.0.8" dependencies: - call-bind: ^1.0.2 - define-properties: ^1.2.0 - es-abstract: ^1.22.1 - checksum: 2375516272fd1ba75992f4c4aa88a7b5f3c7a9ca308d963bcd5645adf689eba6f8a04ebab80c33e30ec0aefc6554181a3a8416015c38da0aa118e60ec896310c + call-bind: ^1.0.7 + define-properties: ^1.2.1 + es-object-atoms: ^1.0.0 + checksum: cc3bd2de08d8968a28787deba9a3cb3f17ca5f9f770c91e7e8fa3e7d47f079bad70fadce16f05dda9f261788be2c6e84a942f618c3bed31e42abc5c1084f8dfd languageName: node linkType: hard -"string.prototype.trimstart@npm:^1.0.7": - version: 1.0.7 - resolution: "string.prototype.trimstart@npm:1.0.7" +"string.prototype.trimstart@npm:^1.0.8": + version: 1.0.8 + resolution: "string.prototype.trimstart@npm:1.0.8" dependencies: - call-bind: ^1.0.2 - define-properties: ^1.2.0 - es-abstract: ^1.22.1 - checksum: 13d0c2cb0d5ff9e926fa0bec559158b062eed2b68cd5be777ffba782c96b2b492944e47057274e064549b94dd27cf81f48b27a31fee8af5b574cff253e7eb613 + call-bind: ^1.0.7 + define-properties: ^1.2.1 + es-object-atoms: ^1.0.0 + checksum: df1007a7f580a49d692375d996521dc14fd103acda7f3034b3c558a60b82beeed3a64fa91e494e164581793a8ab0ae2f59578a49896a7af6583c1f20472bce96 languageName: node linkType: hard @@ -10393,9 +10473,9 @@ __metadata: linkType: hard "style-mod@npm:^4.0.0, style-mod@npm:^4.1.0": - version: 4.1.0 - resolution: "style-mod@npm:4.1.0" - checksum: 8402b14ca11113a3640d46b3cf7ba49f05452df7846bc5185a3535d9b6a64a3019e7fb636b59ccbb7816aeb0725b24723e77a85b05612a9360e419958e13b4e6 + version: 4.1.2 + resolution: "style-mod@npm:4.1.2" + checksum: 7c5c3e82747f9bcf5f288d8d07f50848e4630fe5ff7bfe4d94cc87d6b6a2588227cbf21b4c792ac6406e5852293300a75e710714479a5c59a06af677f0825ef8 languageName: node linkType: hard @@ -10574,20 +10654,27 @@ __metadata: languageName: node linkType: hard +"tabbable@npm:^5.2.0": + version: 5.3.3 + resolution: "tabbable@npm:5.3.3" + checksum: 1aa56e1bb617cc10616c407f4e756f0607f3e2d30f9803664d70b85db037ca27e75918ed1c71443f3dc902e21dc9f991ce4b52d63a538c9b69b3218d3babcd70 + languageName: node + linkType: hard + "table@npm:^6.8.1": - version: 6.8.1 - resolution: "table@npm:6.8.1" + version: 6.8.2 + resolution: "table@npm:6.8.2" dependencies: ajv: ^8.0.1 lodash.truncate: ^4.4.2 slice-ansi: ^4.0.0 string-width: ^4.2.3 strip-ansi: ^6.0.1 - checksum: 08249c7046125d9d0a944a6e96cfe9ec66908d6b8a9db125531be6eb05fa0de047fd5542e9d43b4f987057f00a093b276b8d3e19af162a9c40db2681058fd306 + checksum: 61188652f53a980d1759ca460ca8dea5c5322aece3210457e7084882f053c2b6a870041295e08a82cb1d676e31b056406845d94b0abf3c79a4b104777bec413b languageName: node linkType: hard -"tapable@npm:^2.1.1, tapable@npm:^2.2.0": +"tapable@npm:^2.1.1, tapable@npm:^2.2.0, tapable@npm:^2.2.1": version: 2.2.1 resolution: "tapable@npm:2.2.1" checksum: 3b7a1b4d86fa940aad46d9e73d1e8739335efd4c48322cb37d073eb6f80f5281889bf0320c6d8ffcfa1a0dd5bfdbd0f9d037e252ef972aca595330538aac4d51 @@ -10595,8 +10682,8 @@ __metadata: linkType: hard "tar@npm:^6.1.11, tar@npm:^6.1.2": - version: 6.2.0 - resolution: "tar@npm:6.2.0" + version: 6.2.1 + resolution: "tar@npm:6.2.1" dependencies: chownr: ^2.0.0 fs-minipass: ^2.0.0 @@ -10604,11 +10691,11 @@ __metadata: minizlib: ^2.1.1 mkdirp: ^1.0.3 yallist: ^4.0.0 - checksum: db4d9fe74a2082c3a5016630092c54c8375ff3b280186938cfd104f2e089c4fd9bad58688ef6be9cf186a889671bf355c7cda38f09bbf60604b281715ca57f5c + checksum: f1322768c9741a25356c11373bce918483f40fa9a25c69c59410c8a1247632487edef5fe76c5f12ac51a6356d2f1829e96d2bc34098668a2fc34d76050ac2b6c languageName: node linkType: hard -"terser-webpack-plugin@npm:^5.3.7": +"terser-webpack-plugin@npm:^5.3.10, terser-webpack-plugin@npm:^5.3.7": version: 5.3.10 resolution: "terser-webpack-plugin@npm:5.3.10" dependencies: @@ -10631,8 +10718,8 @@ __metadata: linkType: hard "terser@npm:^5.26.0": - version: 5.26.0 - resolution: "terser@npm:5.26.0" + version: 5.31.1 + resolution: "terser@npm:5.31.1" dependencies: "@jridgewell/source-map": ^0.3.3 acorn: ^8.8.2 @@ -10640,7 +10727,7 @@ __metadata: source-map-support: ~0.5.20 bin: terser: bin/terser - checksum: 02a9bb896f04df828025af8f0eced36c315d25d310b6c2418e7dad2bed19ddeb34a9cea9b34e7c24789830fa51e1b6a9be26679980987a9c817a7e6d9cd4154b + checksum: 6ab57e62e9cd690dc99b3d0ee2e07289cd3408109a950c7118bf39e32851a5bf08b67fe19e0ac43a5a98813792ac78101bf25e5aa524f05ae8bb4e0131d0feef languageName: node linkType: hard @@ -10670,9 +10757,9 @@ __metadata: linkType: hard "tiny-invariant@npm:^1.3.1": - version: 1.3.1 - resolution: "tiny-invariant@npm:1.3.1" - checksum: 872dbd1ff20a21303a2fd20ce3a15602cfa7fcf9b228bd694a52e2938224313b5385a1078cb667ed7375d1612194feaca81c4ecbe93121ca1baebe344de4f84c + version: 1.3.3 + resolution: "tiny-invariant@npm:1.3.3" + checksum: 5e185c8cc2266967984ce3b352a4e57cb89dad5a8abb0dea21468a6ecaa67cd5bb47a3b7a85d08041008644af4f667fb8b6575ba38ba5fb00b3b5068306e59fe languageName: node linkType: hard @@ -10714,14 +10801,14 @@ __metadata: linkType: hard "tough-cookie@npm:^4.1.2": - version: 4.1.3 - resolution: "tough-cookie@npm:4.1.3" + version: 4.1.4 + resolution: "tough-cookie@npm:4.1.4" dependencies: psl: ^1.1.33 punycode: ^2.1.1 universalify: ^0.2.0 url-parse: ^1.5.3 - checksum: c9226afff36492a52118432611af083d1d8493a53ff41ec4ea48e5b583aec744b989e4280bcf476c910ec1525a89a4a0f1cae81c08b18fb2ec3a9b3a72b91dcc + checksum: 5815059f014c31179a303c673f753f7899a6fce94ac93712c88ea5f3c26e0c042b5f0c7a599a00f8e0feeca4615dba75c3dffc54f3c1a489978aa8205e09307c languageName: node linkType: hard @@ -10743,13 +10830,6 @@ __metadata: languageName: node linkType: hard -"tr46@npm:~0.0.3": - version: 0.0.3 - resolution: "tr46@npm:0.0.3" - checksum: 726321c5eaf41b5002e17ffbd1fb7245999a073e8979085dacd47c4b4e8068ff5777142fc6726d6ca1fd2ff16921b48788b87225cbc57c72636f6efa8efbffe3 - languageName: node - linkType: hard - "trim-newlines@npm:^4.0.2": version: 4.1.1 resolution: "trim-newlines@npm:4.1.1" @@ -10758,17 +10838,17 @@ __metadata: linkType: hard "ts-api-utils@npm:^1.0.1": - version: 1.0.3 - resolution: "ts-api-utils@npm:1.0.3" + version: 1.3.0 + resolution: "ts-api-utils@npm:1.3.0" peerDependencies: typescript: ">=4.2.0" - checksum: 441cc4489d65fd515ae6b0f4eb8690057add6f3b6a63a36073753547fb6ce0c9ea0e0530220a0b282b0eec535f52c4dfc315d35f8a4c9a91c0def0707a714ca6 + checksum: c746ddabfdffbf16cb0b0db32bb287236a19e583057f8649ee7c49995bb776e1d3ef384685181c11a1a480369e022ca97512cb08c517b2d2bd82c83754c97012 languageName: node linkType: hard "ts-jest@npm:^29.1.0": - version: 29.1.1 - resolution: "ts-jest@npm:29.1.1" + version: 29.1.5 + resolution: "ts-jest@npm:29.1.5" dependencies: bs-logger: 0.x fast-json-stable-stringify: 2.x @@ -10780,6 +10860,7 @@ __metadata: yargs-parser: ^21.0.1 peerDependencies: "@babel/core": ">=7.0.0-beta.0 <8" + "@jest/transform": ^29.0.0 "@jest/types": ^29.0.0 babel-jest: ^29.0.0 jest: ^29.0.0 @@ -10787,6 +10868,8 @@ __metadata: peerDependenciesMeta: "@babel/core": optional: true + "@jest/transform": + optional: true "@jest/types": optional: true babel-jest: @@ -10795,14 +10878,21 @@ __metadata: optional: true bin: ts-jest: cli.js - checksum: a8c9e284ed4f819526749f6e4dc6421ec666f20ab44d31b0f02b4ed979975f7580b18aea4813172d43e39b29464a71899f8893dd29b06b4a351a3af8ba47b402 + checksum: 96bfdea46d7faa83457c2647806a31a86f28656f703515fee9f6d2ff1ccfc58ccfbbe3ae9283f40141a85af0def30afe887843be5b002c08ed5d5189c941eab1 + languageName: node + linkType: hard + +"tslib@npm:^1.13.0": + version: 1.14.1 + resolution: "tslib@npm:1.14.1" + checksum: dbe628ef87f66691d5d2959b3e41b9ca0045c3ee3c7c7b906cc1e328b39f199bb1ad9e671c39025bd56122ac57dfbf7385a94843b1cc07c60a4db74795829acd languageName: node linkType: hard "tslib@npm:^2.0.0, tslib@npm:^2.1.0, tslib@npm:^2.6.2": - version: 2.6.2 - resolution: "tslib@npm:2.6.2" - checksum: 329ea56123005922f39642318e3d1f0f8265d1e7fcb92c633e0809521da75eeaca28d2cf96d7248229deb40e5c19adf408259f4b9640afd20d13aecc1430f3ad + version: 2.6.3 + resolution: "tslib@npm:2.6.3" + checksum: 74fce0e100f1ebd95b8995fbbd0e6c91bdd8f4c35c00d4da62e285a3363aaa534de40a80db30ecfd388ed7c313c42d930ee0eaf108e8114214b180eec3dbe6f5 languageName: node linkType: hard @@ -10850,50 +10940,55 @@ __metadata: languageName: node linkType: hard -"typed-array-buffer@npm:^1.0.0": - version: 1.0.0 - resolution: "typed-array-buffer@npm:1.0.0" +"typed-array-buffer@npm:^1.0.2": + version: 1.0.2 + resolution: "typed-array-buffer@npm:1.0.2" dependencies: - call-bind: ^1.0.2 - get-intrinsic: ^1.2.1 - is-typed-array: ^1.1.10 - checksum: 3e0281c79b2a40cd97fe715db803884301993f4e8c18e8d79d75fd18f796e8cd203310fec8c7fdb5e6c09bedf0af4f6ab8b75eb3d3a85da69328f28a80456bd3 + call-bind: ^1.0.7 + es-errors: ^1.3.0 + is-typed-array: ^1.1.13 + checksum: 02ffc185d29c6df07968272b15d5319a1610817916ec8d4cd670ded5d1efe72901541ff2202fcc622730d8a549c76e198a2f74e312eabbfb712ed907d45cbb0b languageName: node linkType: hard -"typed-array-byte-length@npm:^1.0.0": - version: 1.0.0 - resolution: "typed-array-byte-length@npm:1.0.0" +"typed-array-byte-length@npm:^1.0.1": + version: 1.0.1 + resolution: "typed-array-byte-length@npm:1.0.1" dependencies: - call-bind: ^1.0.2 + call-bind: ^1.0.7 for-each: ^0.3.3 - has-proto: ^1.0.1 - is-typed-array: ^1.1.10 - checksum: b03db16458322b263d87a702ff25388293f1356326c8a678d7515767ef563ef80e1e67ce648b821ec13178dd628eb2afdc19f97001ceae7a31acf674c849af94 + gopd: ^1.0.1 + has-proto: ^1.0.3 + is-typed-array: ^1.1.13 + checksum: f65e5ecd1cf76b1a2d0d6f631f3ea3cdb5e08da106c6703ffe687d583e49954d570cc80434816d3746e18be889ffe53c58bf3e538081ea4077c26a41055b216d languageName: node linkType: hard -"typed-array-byte-offset@npm:^1.0.0": - version: 1.0.0 - resolution: "typed-array-byte-offset@npm:1.0.0" +"typed-array-byte-offset@npm:^1.0.2": + version: 1.0.2 + resolution: "typed-array-byte-offset@npm:1.0.2" dependencies: - available-typed-arrays: ^1.0.5 - call-bind: ^1.0.2 + available-typed-arrays: ^1.0.7 + call-bind: ^1.0.7 for-each: ^0.3.3 - has-proto: ^1.0.1 - is-typed-array: ^1.1.10 - checksum: 04f6f02d0e9a948a95fbfe0d5a70b002191fae0b8fe0fe3130a9b2336f043daf7a3dda56a31333c35a067a97e13f539949ab261ca0f3692c41603a46a94e960b + gopd: ^1.0.1 + has-proto: ^1.0.3 + is-typed-array: ^1.1.13 + checksum: c8645c8794a621a0adcc142e0e2c57b1823bbfa4d590ad2c76b266aa3823895cf7afb9a893bf6685e18454ab1b0241e1a8d885a2d1340948efa4b56add4b5f67 languageName: node linkType: hard -"typed-array-length@npm:^1.0.4": - version: 1.0.4 - resolution: "typed-array-length@npm:1.0.4" +"typed-array-length@npm:^1.0.6": + version: 1.0.6 + resolution: "typed-array-length@npm:1.0.6" dependencies: - call-bind: ^1.0.2 + call-bind: ^1.0.7 for-each: ^0.3.3 - is-typed-array: ^1.1.9 - checksum: 2228febc93c7feff142b8c96a58d4a0d7623ecde6c7a24b2b98eb3170e99f7c7eff8c114f9b283085cd59dcd2bd43aadf20e25bba4b034a53c5bb292f71f8956 + gopd: ^1.0.1 + has-proto: ^1.0.3 + is-typed-array: ^1.1.13 + possible-typed-array-names: ^1.0.0 + checksum: f0315e5b8f0168c29d390ff410ad13e4d511c78e6006df4a104576844812ee447fcc32daab1f3a76c9ef4f64eff808e134528b5b2439de335586b392e9750e5c languageName: node linkType: hard @@ -11009,21 +11104,21 @@ __metadata: languageName: node linkType: hard -"update-browserslist-db@npm:^1.0.13": - version: 1.0.13 - resolution: "update-browserslist-db@npm:1.0.13" +"update-browserslist-db@npm:^1.0.16": + version: 1.0.16 + resolution: "update-browserslist-db@npm:1.0.16" dependencies: - escalade: ^3.1.1 - picocolors: ^1.0.0 + escalade: ^3.1.2 + picocolors: ^1.0.1 peerDependencies: browserslist: ">= 4.21.0" bin: update-browserslist-db: cli.js - checksum: 1e47d80182ab6e4ad35396ad8b61008ae2a1330221175d0abd37689658bdb61af9b705bfc41057fd16682474d79944fb2d86767c5ed5ae34b6276b9bed353322 + checksum: 51b1f7189c9ea5925c80154b0a6fd3ec36106d07858d8f69826427d8edb4735d1801512c69eade38ba0814d7407d11f400d74440bbf3da0309f3d788017f35b2 languageName: node linkType: hard -"uri-js@npm:^4.2.2": +"uri-js@npm:^4.2.2, uri-js@npm:^4.4.1": version: 4.4.1 resolution: "uri-js@npm:4.4.1" dependencies: @@ -11059,13 +11154,13 @@ __metadata: linkType: hard "v8-to-istanbul@npm:^9.0.1": - version: 9.2.0 - resolution: "v8-to-istanbul@npm:9.2.0" + version: 9.3.0 + resolution: "v8-to-istanbul@npm:9.3.0" dependencies: "@jridgewell/trace-mapping": ^0.3.12 "@types/istanbul-lib-coverage": ^2.0.1 convert-source-map: ^2.0.0 - checksum: 31ef98c6a31b1dab6be024cf914f235408cd4c0dc56a5c744a5eea1a9e019ba279e1b6f90d695b78c3186feed391ed492380ccf095009e2eb91f3d058f0b4491 + checksum: ded42cd535d92b7fd09a71c4c67fb067487ef5551cc227bfbf2a1f159a842e4e4acddaef20b955789b8d3b455b9779d036853f4a27ce15007f6364a4d30317ae languageName: node linkType: hard @@ -11120,8 +11215,8 @@ __metadata: linkType: hard "victory-vendor@npm:^36.6.8": - version: 36.8.2 - resolution: "victory-vendor@npm:36.8.2" + version: 36.9.2 + resolution: "victory-vendor@npm:36.9.2" dependencies: "@types/d3-array": ^3.0.3 "@types/d3-ease": ^3.0.0 @@ -11137,11 +11232,11 @@ __metadata: d3-shape: ^3.1.0 d3-time: ^3.0.0 d3-timer: ^3.0.1 - checksum: 9939dd249cd52d1b774bf30726dd51b53704de0b155ca5722fa889698ecba0323e230e2d776d640bf840ea0dc20cb517d26b62a4f154910c6074cd7819778e80 + checksum: a755110e287b700202d08ac81982093ab100edaa9d61beef1476d59e9705605bd8299a3aa41fa04b933a12bd66737f4c8f7d18448dd6488c69d4f72480023a2e languageName: node linkType: hard -"vscode-jsonrpc@npm:8.2.0, vscode-jsonrpc@npm:^8.0.2": +"vscode-jsonrpc@npm:8.2.0": version: 8.2.0 resolution: "vscode-jsonrpc@npm:8.2.0" checksum: f302a01e59272adc1ae6494581fa31c15499f9278df76366e3b97b2236c7c53ebfc71efbace9041cfd2caa7f91675b9e56f2407871a1b3c7f760a2e2ee61484a @@ -11155,6 +11250,13 @@ __metadata: languageName: node linkType: hard +"vscode-jsonrpc@npm:^8.0.2": + version: 8.2.1 + resolution: "vscode-jsonrpc@npm:8.2.1" + checksum: 2af2c333d73f6587896a7077978b8d4b430e55c674d5dbb90597a84a6647057c1655a3bff398a9b08f1f8ba57dbd2deabf05164315829c297b0debba3b8bc19e + languageName: node + linkType: hard + "vscode-languageserver-protocol@npm:^3.17.0": version: 3.17.5 resolution: "vscode-languageserver-protocol@npm:3.17.5" @@ -11206,20 +11308,13 @@ __metadata: languageName: node linkType: hard -"watchpack@npm:^2.4.0": - version: 2.4.0 - resolution: "watchpack@npm:2.4.0" +"watchpack@npm:^2.4.1": + version: 2.4.1 + resolution: "watchpack@npm:2.4.1" dependencies: glob-to-regexp: ^0.4.1 graceful-fs: ^4.1.2 - checksum: 23d4bc58634dbe13b86093e01c6a68d8096028b664ab7139d58f0c37d962d549a940e98f2f201cecdabd6f9c340338dc73ef8bf094a2249ef582f35183d1a131 - languageName: node - linkType: hard - -"webidl-conversions@npm:^3.0.0": - version: 3.0.1 - resolution: "webidl-conversions@npm:3.0.1" - checksum: c92a0a6ab95314bde9c32e1d0a6dfac83b578f8fa5f21e675bc2706ed6981bc26b7eb7e6a1fab158e5ce4adf9caa4a0aee49a52505d4d13c7be545f15021b17c + checksum: 5b0179348655dcdf19cac7cb4ff923fdc024d630650c0bf6bec8899cf47c60e19d4f810a88dba692ed0e7f684cf0fcffea86efdbf6c35d81f031e328043b7fab languageName: node linkType: hard @@ -11298,39 +11393,39 @@ __metadata: linkType: hard "webpack@npm:^5.76.1": - version: 5.89.0 - resolution: "webpack@npm:5.89.0" + version: 5.92.1 + resolution: "webpack@npm:5.92.1" dependencies: "@types/eslint-scope": ^3.7.3 - "@types/estree": ^1.0.0 - "@webassemblyjs/ast": ^1.11.5 - "@webassemblyjs/wasm-edit": ^1.11.5 - "@webassemblyjs/wasm-parser": ^1.11.5 + "@types/estree": ^1.0.5 + "@webassemblyjs/ast": ^1.12.1 + "@webassemblyjs/wasm-edit": ^1.12.1 + "@webassemblyjs/wasm-parser": ^1.12.1 acorn: ^8.7.1 - acorn-import-assertions: ^1.9.0 - browserslist: ^4.14.5 + acorn-import-attributes: ^1.9.5 + browserslist: ^4.21.10 chrome-trace-event: ^1.0.2 - enhanced-resolve: ^5.15.0 + enhanced-resolve: ^5.17.0 es-module-lexer: ^1.2.1 eslint-scope: 5.1.1 events: ^3.2.0 glob-to-regexp: ^0.4.1 - graceful-fs: ^4.2.9 + graceful-fs: ^4.2.11 json-parse-even-better-errors: ^2.3.1 loader-runner: ^4.2.0 mime-types: ^2.1.27 neo-async: ^2.6.2 schema-utils: ^3.2.0 tapable: ^2.1.1 - terser-webpack-plugin: ^5.3.7 - watchpack: ^2.4.0 + terser-webpack-plugin: ^5.3.10 + watchpack: ^2.4.1 webpack-sources: ^3.2.3 peerDependenciesMeta: webpack-cli: optional: true bin: webpack: bin/webpack.js - checksum: 43fe0dbc30e168a685ef5a86759d5016a705f6563b39a240aa00826a80637d4a3deeb8062e709d6a4b05c63e796278244c84b04174704dc4a37bedb0f565c5ed + checksum: 11bec781260c4180883e98a4a15a08df297aca654ded45e70598f688881dd722f992d680addafe6f6342debede345cddcce2b781c50f5cde29d6c0bc33a82452 languageName: node linkType: hard @@ -11367,16 +11462,6 @@ __metadata: languageName: node linkType: hard -"whatwg-url@npm:^5.0.0": - version: 5.0.0 - resolution: "whatwg-url@npm:5.0.0" - dependencies: - tr46: ~0.0.3 - webidl-conversions: ^3.0.0 - checksum: b8daed4ad3356cc4899048a15b2c143a9aed0dfae1f611ebd55073310c7b910f522ad75d727346ad64203d7e6c79ef25eafd465f4d12775ca44b90fa82ed9e2c - languageName: node - linkType: hard - "whatwg-url@npm:^8.0.0": version: 8.7.0 resolution: "whatwg-url@npm:8.7.0" @@ -11401,16 +11486,16 @@ __metadata: languageName: node linkType: hard -"which-typed-array@npm:^1.1.11, which-typed-array@npm:^1.1.13": - version: 1.1.13 - resolution: "which-typed-array@npm:1.1.13" +"which-typed-array@npm:^1.1.14, which-typed-array@npm:^1.1.15": + version: 1.1.15 + resolution: "which-typed-array@npm:1.1.15" dependencies: - available-typed-arrays: ^1.0.5 - call-bind: ^1.0.4 + available-typed-arrays: ^1.0.7 + call-bind: ^1.0.7 for-each: ^0.3.3 gopd: ^1.0.1 - has-tostringtag: ^1.0.0 - checksum: 3828a0d5d72c800e369d447e54c7620742a4cc0c9baf1b5e8c17e9b6ff90d8d861a3a6dd4800f1953dbf80e5e5cec954a289e5b4a223e3bee4aeb1f8c5f33309 + has-tostringtag: ^1.0.2 + checksum: 65227dcbfadf5677aacc43ec84356d17b5500cb8b8753059bb4397de5cd0c2de681d24e1a7bd575633f976a95f88233abfd6549c2105ef4ebd58af8aa1807c75 languageName: node linkType: hard @@ -11454,6 +11539,13 @@ __metadata: languageName: node linkType: hard +"word-wrap@npm:^1.2.5": + version: 1.2.5 + resolution: "word-wrap@npm:1.2.5" + checksum: f93ba3586fc181f94afdaff3a6fef27920b4b6d9eaefed0f428f8e07adea2a7f54a5f2830ce59406c8416f033f86902b91eb824072354645eea687dff3691ccb + languageName: node + linkType: hard + "worker-loader@npm:^3.0.2": version: 3.0.8 resolution: "worker-loader@npm:3.0.8" @@ -11516,8 +11608,8 @@ __metadata: linkType: hard "ws@npm:^8.11.0": - version: 8.16.0 - resolution: "ws@npm:8.16.0" + version: 8.17.1 + resolution: "ws@npm:8.17.1" peerDependencies: bufferutil: ^4.0.1 utf-8-validate: ">=5.0.2" @@ -11526,7 +11618,7 @@ __metadata: optional: true utf-8-validate: optional: true - checksum: feb3eecd2bae82fa8a8beef800290ce437d8b8063bdc69712725f21aef77c49cb2ff45c6e5e7fce622248f9c7abaee506bae0a9064067ffd6935460c7357321b + checksum: 442badcce1f1178ec87a0b5372ae2e9771e07c4929a3180321901f226127f252441e8689d765aa5cfba5f50ac60dd830954afc5aeae81609aefa11d3ddf5cecf languageName: node linkType: hard @@ -11558,49 +11650,6 @@ __metadata: languageName: node linkType: hard -"xterm-addon-canvas@npm:~0.3.0": - version: 0.3.0 - resolution: "xterm-addon-canvas@npm:0.3.0" - peerDependencies: - xterm: ^5.0.0 - checksum: 21eabd28a2718e775399f27e21922ec4e22528576ae88278ef39c68239119e4576eecd59cf0f1c76dfcbea0f82b779f8dbaf4ce38e04e648844c33ac7632d333 - languageName: node - linkType: hard - -"xterm-addon-fit@npm:~0.7.0": - version: 0.7.0 - resolution: "xterm-addon-fit@npm:0.7.0" - peerDependencies: - xterm: ^5.0.0 - checksum: 512d41f80d6f9427ba02dab4e6fd642e94775a9cf7ef72ae4b55eab2a36856b5c67069bfc66b4af412fdce29a0842f9c6382af3672f0b514c4352dfd47defe8f - languageName: node - linkType: hard - -"xterm-addon-web-links@npm:~0.8.0": - version: 0.8.0 - resolution: "xterm-addon-web-links@npm:0.8.0" - peerDependencies: - xterm: ^5.0.0 - checksum: fe07572adfaa84ceeb961db3ae577aeb2342ea5dcd4948170d1b733ae8045693fab8808f9c63cc43a532b033ae95e63e62ac14bc2e34def764e68f6362ccae2b - languageName: node - linkType: hard - -"xterm-addon-webgl@npm:~0.14.0": - version: 0.14.0 - resolution: "xterm-addon-webgl@npm:0.14.0" - peerDependencies: - xterm: ^5.0.0 - checksum: 05f144c920660ad8122aa13564612b1ce71b92ba8f74b3387db3e39b616437659da36b7edf3aefe5900c59956cd6ca1272a0892248df751c8899a202befe019c - languageName: node - linkType: hard - -"xterm@npm:~5.1.0": - version: 5.1.0 - resolution: "xterm@npm:5.1.0" - checksum: cbacbc9dc1bbcf21dabecff46856b43f2d5854b42c1bec4ea03a5720000f2a88d79b0da45b6c38213d6607474a1fbe66d5ff25fa120b7e9e60eeed964dd840a1 - languageName: node - linkType: hard - "y-protocols@npm:^1.0.5": version: 1.0.6 resolution: "y-protocols@npm:1.0.6" @@ -11670,11 +11719,11 @@ __metadata: linkType: hard "yjs@npm:^13.5.0, yjs@npm:^13.5.40": - version: 13.6.10 - resolution: "yjs@npm:13.6.10" + version: 13.6.18 + resolution: "yjs@npm:13.6.18" dependencies: lib0: ^0.2.86 - checksum: 027adf7fb6739debc44fa1a74f5e87248e026c582b65872c0a1b26aca0110f7a04605f77a38643ea562b9165d6c84e7a9311407e01a07870ebdafce008fc7ba4 + checksum: 5c9f8f31f5f9f30f17680a765b015e4274820fe10fb6bf6a7d39dee2ff0493a81ace02d11bff6f18c6799cade2bcfc9fc2d7b6ca8bc1eb167c4ac2f3789c0f01 languageName: node linkType: hard @@ -11686,13 +11735,13 @@ __metadata: linkType: hard "yup@npm:^1.2.0": - version: 1.3.3 - resolution: "yup@npm:1.3.3" + version: 1.4.0 + resolution: "yup@npm:1.4.0" dependencies: property-expr: ^2.0.5 tiny-case: ^1.0.3 toposort: ^2.0.2 type-fest: ^2.19.0 - checksum: 7b9e19fedc85deb8cffd6b24617f79542c904f11a9c4ca8bb72fb003e61bd6c5278cc799fa9421c6a1a96ff04e7117bf0c000c9f10b543d6cd32a1e35e8f5f65 + checksum: 20a2ee0c1e891979ca16b34805b3a3be9ab4bea6ea3d2f9005b998b4dc992d0e4d7b53e5f4d8d9423420046630fb44fdf0ecf7e83bc34dd83392bca046c5229d languageName: node linkType: hard