diff --git a/.idea/runConfigurations/Artemis__Server__Aeolus_.xml b/.idea/runConfigurations/Artemis__Server__Aeolus_.xml deleted file mode 100644 index 13c00126a34e..000000000000 --- a/.idea/runConfigurations/Artemis__Server__Aeolus_.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - diff --git a/.idea/runConfigurations/Artemis__Server__GitLabCI___Gitlab_.xml b/.idea/runConfigurations/Artemis__Server__GitLabCI___Gitlab_.xml deleted file mode 100644 index 9c36e532820f..000000000000 --- a/.idea/runConfigurations/Artemis__Server__GitLabCI___Gitlab_.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - diff --git a/.idea/runConfigurations/Artemis__Server__Jenkins___Gitlab_.xml b/.idea/runConfigurations/Artemis__Server__Jenkins___Gitlab_.xml deleted file mode 100644 index 7ffecef4daef..000000000000 --- a/.idea/runConfigurations/Artemis__Server__Jenkins___Gitlab_.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - diff --git a/.idea/runConfigurations/Artemis__Server__Jenkins___LocalVC_.xml b/.idea/runConfigurations/Artemis__Server__LocalVC___Jenkins_.xml similarity index 80% rename from .idea/runConfigurations/Artemis__Server__Jenkins___LocalVC_.xml rename to .idea/runConfigurations/Artemis__Server__LocalVC___Jenkins_.xml index 47dd1c05a2fa..217477ace79d 100644 --- a/.idea/runConfigurations/Artemis__Server__Jenkins___LocalVC_.xml +++ b/.idea/runConfigurations/Artemis__Server__LocalVC___Jenkins_.xml @@ -1,13 +1,12 @@ - + - + \ No newline at end of file diff --git a/.idea/runConfigurations/Artemis__Server__LocalVC___LocalCI__IRIS_.xml b/.idea/runConfigurations/Artemis__Server__LocalVC___LocalCI__IRIS_.xml deleted file mode 100644 index 1e5bda2c16f7..000000000000 --- a/.idea/runConfigurations/Artemis__Server__LocalVC___LocalCI__IRIS_.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - diff --git a/README.md b/README.md index 556d5b40ac88..fe75623b422f 100644 --- a/README.md +++ b/README.md @@ -9,6 +9,17 @@ Artemis brings interactive learning to life with instant, individual feedback on programming exercises, quizzes, modeling tasks, and more. Offering customization for instructors and real-time collaboration for students, this platform bridges creativity and education. Embrace a new era of engaging, adaptive learning and artificial intelligence support with Artemis, where innovation meets inclusivity. Find out more on https://artemisapp.github.io +## Main goals + +1. **User experience**: Provide an intuitive and engaging interface that enhances the learning experience for both students and instructors. Ensure ease of use across diverse learning scenarios, fostering seamless interaction and accessibility. + +2. **Scalable infrastructure**: Build a robust platform capable of supporting large-scale courses with thousands of participants simultaneously. Ensure high availability, performance, and adaptability as the platform grows in functionality and user base. + +3. **Constructive alignment**: Align learning goals, activities, and assessments through well-integrated features such as the exam mode that support instructional design principles. Enable the seamless implementation of interactive learning methodologies, ensuring that every feature contributes meaningfully to learning goals. + +4. **Learning analytics**: Leverage data to provide actionable insights into student performance and engagement. Offer detailed feedback to both learners and instructors, enhancing personalized learning experiences and supporting data-driven decisions for educational improvement while ensuring data privacy and security. + + ## Main features and modules 1. **[Exercises](https://docs.artemis.cit.tum.de/user/exercises)** with automatic and manual assessment. Instructors have many configuration options. @@ -83,7 +94,7 @@ The Artemis development team prioritizes the following areas in the future. We w * **Long term**: Allow students to take notes on lecture slides and support the automatic updates of lecture slides * **Long term**: Develop an exchange platform for exercises -## Contributing to This Project +## Contributing We welcome contributions from both members of our organization and external contributors. To maintain transparency and trust: @@ -96,28 +107,38 @@ We follow a pull request contribution model. For detailed guidelines, please ref #### Maintainers + The following members of the project management team are responsible for specific feature areas in Artemis. Contact them if you have questions or if you want to develop new features in this area. -| # | Feature / Module | Responsible maintainer | -|----|-----------------------|------------------------------------------------------------------------------------| -| 0 | Core | Stephan Krusche ([@krusche](https://github.com/krusche)) | -| 1 | Exercises | Stephan Krusche ([@krusche](https://github.com/krusche)) | -| 2 | Programming exercises | Stephan Krusche ([@krusche](https://github.com/krusche)) | -| 3 | Build agents | Stephan Krusche ([@krusche](https://github.com/krusche)) | -| 4 | Quiz exercises | Felix Dietrich ([@FelixTJDietrich](https://github.com/FelixTJDietrich)) | -| 5 | Modeling exercises | Stephan Krusche ([@krusche](https://github.com/krusche)) | -| 6 | Text exercises | Maximilian Sölch ([@maximiliansoelch](https://github.com/maximiliansoelch)) | -| 7 | File upload exercises | Maximilian Sölch ([@maximiliansoelch](https://github.com/maximiliansoelch)) | -| 8 | Exam mode | Stephan Krusche ([@krusche](https://github.com/krusche)) | -| 9 | Assessment | Maximilian Sölch ([@maximiliansoelch](https://github.com/maximiliansoelch)) | -| 10 | Communication | Stephan Krusche ([@krusche](https://github.com/krusche)) | -| 11 | Lectures | Maximilian Anzinger ([@maximiliananzinger](https://github.com/maximiliananzinger)) | -| 12 | Atlas | Maximilian Anzinger ([@maximiliananzinger](https://github.com/maximiliananzinger)) | -| 13 | Iris | Patrick Bassner ([@bassner](https://github.com/bassner)) | -| 13 | Athena | Maximilian Sölch ([@maximiliansoelch](https://github.com/maximiliansoelch)) | -| 15 | Tutorial Groups | Felix Dietrich ([@FelixTJDietrich](https://github.com/FelixTJDietrich)) | -| 16 | Plagiarism checks | Markus Paulsen ([@MarkusPaulsen](https://github.com/MarkusPaulsen)) | -| 17 | LTI | Matthias Linhuber ([@mtze](https://github.com/mtze)) | + +| Goal | Responsible maintainer | +|-------------------------|------------------------------------------------------------------------------------| +| User experience | Ramona Beinstingel ([@rabeatwork](https://github.com/rabeatwork)) | +| Scalable infrastructure | Matthias Linhuber ([@mtze](https://github.com/mtze)) | +| Constructive alignment | Stephan Krusche ([@krusche](https://github.com/krusche)) | +| Learning analytics | Maximilian Anzinger ([@maximiliananzinger](https://github.com/maximiliananzinger)) | + +| Feature / Module | Responsible maintainer | +|-----------------------|------------------------------------------------------------------------------------| +| Exercises | Stephan Krusche ([@krusche](https://github.com/krusche)) | +| Programming exercises | Stephan Krusche ([@krusche](https://github.com/krusche)) | +| Build agents | Robert Jandow ([@robertjndw](https://github.com/robertjndw)) | +| Quiz exercises | Felix Dietrich ([@FelixTJDietrich](https://github.com/FelixTJDietrich)) | +| Modeling exercises | Felix Dietrich ([@FelixTJDietrich](https://github.com/FelixTJDietrich)) | +| Text exercises | Maximilian Sölch ([@maximiliansoelch](https://github.com/maximiliansoelch)) | +| File upload exercises | Elisabeth Friesinger ([@easy-lisi](https://github.com/easy-lisi)) | +| Exam mode | Stephan Krusche ([@krusche](https://github.com/krusche)) | +| Assessment | Maximilian Sölch ([@maximiliansoelch](https://github.com/maximiliansoelch)) | +| Communication | Stephan Krusche ([@krusche](https://github.com/krusche)) | +| Lectures | Patrick Bassner ([@bassner](https://github.com/bassner)) | +| Atlas | Maximilian Anzinger ([@maximiliananzinger](https://github.com/maximiliananzinger)) | +| Iris | Patrick Bassner ([@bassner](https://github.com/bassner)) | +| Athena | Maximilian Sölch ([@maximiliansoelch](https://github.com/maximiliansoelch)) | +| Tutorial Groups | Ramona Beinstingel ([@rabeatwork](https://github.com/rabeatwork)) | +| Plagiarism checks | Markus Paulsen ([@MarkusPaulsen](https://github.com/MarkusPaulsen)) | +| LTI | Maximilian Anzinger ([@maximiliananzinger](https://github.com/maximiliananzinger)) | + + ## Setup and guidelines @@ -172,7 +193,7 @@ Refer to [Using JHipster in production](http://www.jhipster.tech/production) for The following command can automate the deployment to a server. The example shows the deployment to the main Artemis test server (which runs a virtual machine): ```shell -./artemis-server-cli deploy username@artemistest.ase.in.tum.de -w build/libs/Artemis-7.5.4.war +./artemis-server-cli deploy username@artemistest.ase.in.tum.de -w build/libs/Artemis-7.5.5.war ``` ## Architecture diff --git a/build.gradle b/build.gradle index dff55628b0fc..862cec7b8403 100644 --- a/build.gradle +++ b/build.gradle @@ -25,7 +25,7 @@ plugins { } group = "de.tum.cit.aet.artemis" -version = "7.5.4" +version = "7.5.5" description = "Interactive Learning with Individual Feedback" java { @@ -290,7 +290,7 @@ dependencies { implementation "org.apache.sshd:sshd-sftp:${sshd_version}" // https://mvnrepository.com/artifact/net.sourceforge.plantuml/plantuml - implementation "net.sourceforge.plantuml:plantuml:1.2024.5" + implementation "net.sourceforge.plantuml:plantuml:1.2024.7" implementation "org.jasypt:jasypt:1.9.3" implementation "me.xdrop:fuzzywuzzy:1.4.0" implementation("org.yaml:snakeyaml") { @@ -368,7 +368,7 @@ dependencies { implementation "javax.cache:cache-api:1.1.1" implementation "org.hibernate.orm:hibernate-core:${hibernate_version}" - implementation "com.zaxxer:HikariCP:5.1.0" + implementation "com.zaxxer:HikariCP:6.0.0" implementation "org.apache.commons:commons-text:1.12.0" implementation "org.apache.commons:commons-math3:3.6.1" @@ -447,7 +447,7 @@ dependencies { implementation "org.apache.maven:maven-model:3.9.9" // NOTE: 3.0.2 is broken for splitting lecture specific PDFs implementation "org.apache.pdfbox:pdfbox:3.0.1" - implementation "org.apache.commons:commons-csv:1.11.0" + implementation "org.apache.commons:commons-csv:1.12.0" implementation "org.commonmark:commonmark:0.23.0" implementation "commons-fileupload:commons-fileupload:1.5" implementation "net.lingala.zip4j:zip4j:2.11.5" @@ -457,7 +457,7 @@ dependencies { implementation "org.apfloat:apfloat:1.14.0" // use newest version of guava to avoid security issues through outdated dependencies - implementation "com.google.guava:guava:33.3.0-jre" + implementation "com.google.guava:guava:33.3.1-jre" implementation "com.sun.activation:jakarta.activation:2.0.1" // use newest version of gson to avoid security issues through outdated dependencies @@ -531,7 +531,7 @@ dependencies { testImplementation "io.github.classgraph:classgraph:4.8.176" testImplementation "org.awaitility:awaitility:4.2.2" testImplementation "org.apache.maven.shared:maven-invoker:3.3.0" - testImplementation "org.gradle:gradle-tooling-api:8.10.1" + testImplementation "org.gradle:gradle-tooling-api:8.10.2" testImplementation "org.apache.maven.surefire:surefire-report-parser:3.5.0" testImplementation "com.opencsv:opencsv:5.9" testImplementation("io.zonky.test:embedded-database-spring-test:2.5.1") { @@ -613,7 +613,7 @@ tasks.withType(Test).configureEach { } wrapper { - gradleVersion = "8.10.1" + gradleVersion = "8.10.2" } tasks.register("stage") { diff --git a/docs/admin/setup/pyris.rst b/docs/admin/setup/pyris.rst index 9c8ef4fde244..6bb349a3da46 100644 --- a/docs/admin/setup/pyris.rst +++ b/docs/admin/setup/pyris.rst @@ -1,100 +1,386 @@ .. _pyris-setup: Pyris Setup Guide ------------------ +================= .. contents:: Prerequisites -^^^^^^^^^^^^^ +------------- - A server/VM or local machine -- Docker installed on the machine +- **Python 3.12**: Ensure that Python 3.12 is installed. -Installation Steps -^^^^^^^^^^^^^^^^^^ + .. code-block:: bash -Create a Directory for Pyris Deployment -""""""""""""""""""""""""""""""""""""""" + python --version -Create a directory where you will deploy Pyris. For example, you can create a directory at ``/opt/pyris`` on the machine. -For local development, you can create a directory at ``~/pyris``. + (Should be 3.12) -Clone the Pyris Repository -"""""""""""""""""""""""""" +- **Docker and Docker Compose**: Required for containerized deployment. -To get started with Pyris, you need to clone the Pyris repository (``https://github.com/ls1intum/Pyris``) into a -directory on your machine. For example, you can clone the repository into a folder called ``Pyris`` in the directory -you created in the previous step. -E.g.: ``git clone https://github.com/ls1intum/Pyris.git Pyris`` +Local Environment Setup +----------------------- -Create an Application Configuration File -"""""""""""""""""""""""""""""""""""""""" +1. **Clone the Pyris Repository** -Create an ``application.yml`` file using the provided ``application.example.yml`` in the Pyris repository as a base. -E.g.: ``cp Pyris/application.example.yml application.yml`` + To get started with Pyris development, you need to clone the Pyris repository (`https://github.com/ls1intum/Pyris`) into a directory on your machine. For example, you can clone the repository into a folder called ``Pyris``. -Now you need to configure the ``application.yml`` file. Here is an example configuration: + Example command: -.. code-block:: yaml + .. code-block:: bash - pyris: + git clone https://github.com/ls1intum/Pyris.git Pyris + +2. **Install Dependencies** + + Navigate to the Pyris directory: + + .. code-block:: bash + + cd Pyris + + Install the required Python packages: + + .. code-block:: bash + + pip install -r requirements.txt + +3. **Create Configuration Files** + + - **Create an Application Configuration File** + + Create an ``application.local.yml`` file in the root directory. This file includes configurations used by the application. + + Example command: + + .. code-block:: bash + + cp Pyris/application.example.yml application.local.yml + + Example ``application.local.yml``: + + .. code-block:: yaml + + # Token that Artemis will use to access Pyris api_keys: - - comment: Artemis - llm_access: [AZURE_GPT35_TURBO_16K_0613, OPENAI_GPT35_TURBO_16K_0613] - token: super-secret - cache: - hazelcast: - host: cache - port: 5701 - llms: - AZURE_GPT35_TURBO_16K_0613: - description: GPT-3.5 on Azure model from 2023-06-13 with 16k context length - name: GPT-3.5 (16k, Azure) - llm_credentials: - api_type: azure - api_base: 'https://.azure.com/' - api_version: 2023-03-15-preview - deployment_id: gpt-35-16k - model: gpt-3.5-turbo - token: - OPENAI_GPT35_TURBO_16K_0613: - description: GPT-3.5 on OpenAI from 2023-06-13 with 16k context length - name: GPT-3.5 Turbo (16k, OpenAI) - llm_credentials: - chat_mode: 'True' - model: gpt-3.5-turbo-16k-0613 - token: - -Create Environment Variables File -""""""""""""""""""""""""""""""""" - -Create a ``.env`` file containing the following variables: - -- ``PYRIS_DOCKER_TAG``: The Docker tag to use. Ideally use ``latest`` here. -- ``PYRIS_APPLICATION_YML_FILE``: The absolute path to the ``application.yml`` file that you created. E.g.: ``/opt/pyris/application.yml`` -- ``NGINX_PROXY_SSL_CERTIFICATE_PATH``: The absolute path to the SSL certificate to use. Defaults to self-signed certificates. For production, you should use a valid SSL certificate. For local development, you an ignore this variable. -- ``NGINX_PROXY_SSL_CERTIFICATE_KEY_PATH``: The absolute path to the SSL certificate key to use. Defaults to self-signed certificates. For production, you should use a valid SSL certificate. For local development, you an ignore this variable. - -Start Pyris -""""""""""" - -You can now start Pyris using the following command: - -.. code-block:: bash - - docker compose --project-directory "$PROJECT_DIR" -f "$COMPOSE_FILE" --env-file "$ENV_FILE" up -d --pull always --no-build - -- ``$PROJECT_DIR`` should point to the Pyris directory you created. -- ``$COMPOSE_FILE`` should point to the ``docker/pyris-production.yml`` file in the Pyris repository. -- ``$ENV_FILE`` should point to the ``.env`` file you just created. - -E.g.: - -.. code-block:: bash - - docker compose --project-directory "/opt/pyris" -f "/opt/pyris/Pyris/docker/pyris-production.yml" --env-file "/opt/pyris/.env" up -d --pull always --no-build - -This will start the Pyris application on your server/VM. + - token: "your-secret-token" + + # Weviate Connection + weaviate: + host: "localhost" + port: "8001" + grpc_port: "50051" + + env_vars: {} + + The `env_vars` section allows you to define custom environment variables that can be accessed within the Pyris application. These can be used for various purposes, such as setting feature flags or defining environment-specific configurations. Currently, the `env_vars` section is not used by Pyris, but it can be utilized in future versions. + + - **Create LLM Config File** + + Create an ``llm_config.local.yml`` file in the root directory. This file includes a list of models with their configurations. + + Example command: + + .. code-block:: bash + + cp Pyris/llm_config.example.yml llm_config.local.yml + + **Example OpenAI Configuration** + + .. code-block:: yaml + + - id: "oai-gpt-35-turbo" + name: "GPT 3.5 Turbo" + description: "GPT 3.5 16k" + type: "openai_chat" + model: "gpt-3.5-turbo" + api_key: "" + tools: [] + capabilities: + input_cost: 0.5 + output_cost: 1.5 + gpt_version_equivalent: 3.5 + context_length: 16385 + vendor: "OpenAI" + privacy_compliance: false + self_hosted: false + image_recognition: false + json_mode: true + + **Example Azure OpenAI Configuration** + + .. code-block:: yaml + + - id: "azure-gpt-4-omni" + name: "GPT 4 Omni" + description: "GPT 4 Omni on Azure" + type: "azure_chat" + endpoint: "" + api_version: "2024-02-15-preview" + azure_deployment: "gpt4o" + model: "gpt4o" + api_key: "" + tools: [] + capabilities: + input_cost: 5 + output_cost: 15 + gpt_version_equivalent: 4.5 # Equivalent GPT version of the model + context_length: 128000 + vendor: "OpenAI" + privacy_compliance: false + self_hosted: false + image_recognition: true + json_mode: true + + **Explanation of Configuration Parameters** + + The configuration parameters are utilized through the capability system by pipelines in Pyris to select the appropriate model for a task. The parameter values under capabilities are mostly subjective and do not have any standard values. + In the example configuration above, we orient the values based on the official documentation of the models. + + One can adjust the capabilities as the following example workflow: + + On their official website, OpenAI provides the following information about the `GPT-4o model `_: + + - The model can process 128,000 tokens in a single request. So, we set the context_length to 128000. + - The models is supposed to be better than GPT-4 in terms of its capabilities. So, we set the gpt_version_equivalent to 4.5. + - The model is developed by OpenAI. So, we set the vendor to OpenAI. + - We can not assume the if the service that provides the model, e.g. official OpenAI API or Azure, is compatible with the privacy regulations of the organisation. So, we set the privacy_compliance to false. + - The model is not self-hosted. So, we set the self_hosted to false. + - The model supports image recognition. So, we set the image_recognition to true. + - The model supports structured JSON output mode. So, we set the json_mode to true. + - The cost of input tokens for the model is 5$/1M tokens. So, we set the input_cost to 5. + - The cost of output tokens for the model is 15$/1M tokens. So, we set the output_cost to 15. + + One thing to keep in mind regarding the parameter values under capabilities is that the values are used to compare and rank models based on the required capabilities specified by a pipeline to select an appropriate model for the task, the pipeline is performing. + + Next section provides a more detailed explanation of the parameters used in the configuration file. + + **Parameter Descriptions:** + + - ``api_key``: The API key for the model. + - ``capabilities``: The capabilities of the model. + + - ``context_length``: The maximum number of tokens the model can process in a single request. + - ``gpt_version_equivalent``: The equivalent GPT version of the model in terms of overall capabilities. + - ``image_recognition``: Whether the model supports image recognition. + - ``input_cost``: The cost of input tokens for the model. The capability system will prioritize models with lower or equal input costs. The value can be determined by the admin according to model's pricing. A more expensive model can have a higher input cost. + - ``output_cost``: The cost of output tokens for the model. The capability system will prioritize models with lower or equal output costs.The value can be determined by the admin according to model's pricing. A more expensive model can have a higher output cost. + - ``json_mode``: Whether the model supports structured JSON output mode. + - ``privacy_compliance``: Whether the model complies with privacy regulations. If true, capability system will prioritize privacy-compliant models. Privacy compliant models can be determined by the system admins according to organizational and legal requirements. + - ``self_hosted``: Whether the model is self-hosted. If true, capability system will prioritize self-hosted models + - ``vendor``: The provider of the model (e.g., OpenAI). This option is used by the capability system to filter models by vendor. + - ``speed``: The model's processing speed. + + - ``description``: Additional information about the model. + - ``id``: Unique identifier for the model across all models. + - ``model``: The official name of the model as used by the vendor. + - ``name``: A custom, human-readable name for the model. + - ``type``: The model type, used to select the appropriate client (Currently available types are: ``openai_chat``, ``azure_chat``, ``ollama``). + - ``endpoint``: The URL to connect to the model. + - ``api_version``: The API version to use with the model. + - ``azure_deployment``: The deployment name of the model on Azure. + - ``tools``: The tools supported by the model. For now, we do not provide any predefined tools, but the field is necessary for the models with tool calling capabilities. + + **Notes on ``gpt_version_equivalent``:** + + The ``gpt_version_equivalent`` field is subjective and used to compare capabilities of different models using GPT models as a reference. For example: + + - GPT-4 Omni equivalent: 4.5 + - GPT-4 Omni Mini equivalent: 4.25 + - GPT-4 equivalent: 4.0 + - GPT-3.5 equivalent: 3.5 + + .. warning:: + + Most existing pipelines in Pyris require a model with a ``gpt_version_equivalent`` of 4.5 or higher. It is advised to define models in the ``llm_config.local.yml`` file with a ``gpt_version_equivalent`` of 4.5 or higher. + + **Required Pipeline Capabilities:** + + Below are the capabilities required by different pipelines in Pyris. + + 1. **Exercise Chat Pipeline** + - ``gpt_version_equivalent``: 4.5, + - ``context_length``: 128000, + 2. **Course Chat Pipeline** + - ``gpt_version_equivalent``: 4.5, + - ``context_length``: 128000, + - ``json_mode``: true, + 3. **Lecture Chat Pipeline** - Used by exercise and course chat pipelines + - ``gpt_version_equivalent``: 3.5, + - ``context_length``: 16385, + - ``json_mode``: true, + 4. **Interaction Suggestions Pipeline** - Used by exercise and course chat pipelines + - ``gpt_version_equivalent``: 4.5, + - ``context_length``: 128000, + - ``json_mode``: true + + + .. warning:: + When defining models in the ``llm_config.local.yml`` file, ensure that there are models with capabilities defined above in order to meet the requirements of the pipelines. Otherwise pipelines may not be able to perform as well as expected, i.e. the quality of responses generated by the pipelines may be suboptimal. + +4. **Run the Server** + + Start the Pyris server: + + .. code-block:: bash + + APPLICATION_YML_PATH=./application.local.yml \ + LLM_CONFIG_PATH=./llm_config.local.yml \ + uvicorn app.main:app --reload + +5. **Access API Documentation** + + Open your browser and navigate to `http://localhost:8000/docs` to access the interactive API documentation. + +This setup should help you run the Pyris application on your local machine. Ensure you modify the configuration files as per your specific requirements before deploying. + +Using Docker +------------ + +**Prerequisites** + +- Ensure Docker and Docker Compose are installed on your machine. +- Clone the Pyris repository to your local machine. +- Create the necessary configuration files as described in the previous section. + +**Docker Compose Files** + +- **Development**: ``docker/pyris-dev.yml`` +- **Production with Nginx**: ``docker/pyris-production.yml`` +- **Production without Nginx**: ``docker/pyris-production-internal.yml`` + +**Setup Instructions** + +1. **Running the Containers** + + You can run Pyris in different environments: development or production. + + **Development Environment** + + - **Start the Containers** + + .. code-block:: bash + + docker compose -f docker/pyris-dev.yml up --build + + - Builds the Pyris application. + - Starts Pyris and Weaviate in development mode. + - Mounts local configuration files for easy modification. + + - **Access the Application** + + - Application URL: `http://localhost:8000` + - API Docs: `http://localhost:8000/docs` + + **Production Environment** + + **Option 1: With Nginx** + + 1. **Prepare SSL Certificates** + + - Place your SSL certificate (`fullchain.pem`) and private key (`priv_key.pem`) in the specified paths or update the paths in the Docker Compose file. + + 2. **Start the Containers** + + .. code-block:: bash + + docker compose -f docker/pyris-production.yml up -d + + - Pulls the latest Pyris image. + - Starts Pyris, Weaviate, and Nginx. + - Nginx handles SSL termination and reverse proxying. + + 3. **Access the Application** + + - Application URL: `https://your-domain.com` + + **Option 2: Without Nginx** + + 1. **Start the Containers** + + .. code-block:: bash + + docker compose -f docker/pyris-production-internal.yml up -d + + - Pulls the latest Pyris image. + - Starts Pyris and Weaviate. + + 2. **Access the Application** + + - Application URL: `http://localhost:8000` + +2. **Managing the Containers** + + - **Stop the Containers** + + .. code-block:: bash + + docker compose -f down + + Replace ```` with the appropriate Docker Compose file. + + - **View Logs** + + .. code-block:: bash + + docker compose -f logs -f + + Example: + + .. code-block:: bash + + docker compose -f docker/pyris-dev.yml logs -f pyris-app + + - **Rebuild Containers** + + If you've made changes to the code or configurations: + + .. code-block:: bash + + docker compose -f up --build + +3. **Customizing Configuration** + + - **Environment Variables** + + You can customize settings using environment variables: + + - ``PYRIS_DOCKER_TAG``: Specifies the Pyris Docker image tag. + - ``PYRIS_APPLICATION_YML_FILE``: Path to your ``application.yml`` file. + - ``PYRIS_LLM_CONFIG_YML_FILE``: Path to your ``llm-config.yml`` file. + - ``PYRIS_PORT``: Host port for Pyris application (default is ``8000``). + - ``WEAVIATE_PORT``: Host port for Weaviate REST API (default is ``8001``). + - ``WEAVIATE_GRPC_PORT``: Host port for Weaviate gRPC interface (default is ``50051``). + + - **Configuration Files** + + Modify configuration files as needed: + + - **Pyris Configuration**: Update ``application.yml`` and ``llm-config.yml``. + - **Weaviate Configuration**: Adjust settings in ``weaviate.yml``. + - **Nginx Configuration**: Modify Nginx settings in ``nginx.yml`` and related config files. + +Troubleshooting +--------------- + +- **Port Conflicts** + + If you encounter port conflicts, change the host ports using environment variables: + + .. code-block:: bash + + export PYRIS_PORT=8080 + +- **Permission Issues** + + Ensure you have the necessary permissions for files and directories, especially for SSL certificates. + +- **Docker Resources** + + If services fail to start, ensure Docker has sufficient resources allocated. + +Conclusion +---------- That's it! You've successfully installed and configured Pyris. diff --git a/docs/dev/guidelines/client.rst b/docs/dev/guidelines/client.rst index 35bbb6d3db42..cbff0464682c 100644 --- a/docs/dev/guidelines/client.rst +++ b/docs/dev/guidelines/client.rst @@ -9,11 +9,14 @@ The Artemis client is an Angular project. Keep https://angular.io/guide/stylegui Some general aspects: -* The Artemis client uses lazy loading to keep the initial bundle size below 2 MB. +* The Artemis client uses lazy loading to keep the initial bundle size as small as possible. * Code quality and test coverage are important. Try to reuse code and avoid code duplication. Write meaningful tests! + +**Angular Migration** + * Use **standalone components** instead of Angular modules: https://angular.dev/reference/migrations/standalone -* Use the new ``signals`` to granularly track how and where state is used throughout an application, allowing Angular to optimize rendering updates: https://angular.dev/guide/signals -* Find out more in the following guide: https://blog.angular-university.io/angular-signal-components/ +* Use the new ``signals`` to granular track how and where state is used throughout an application, allowing Angular to optimize rendering updates: https://angular.dev/guide/signals +* Find out more in the following guide: https://blog.angular-university.io/angular-signal-components * Use the new ``input()`` and ``output()`` decorators instead of ``@Input()`` and ``@Output()``. .. code-block:: ts @@ -27,8 +30,9 @@ Some general aspects: myOutput = output(); * Use the new ``inject`` function, because it offers more accurate types and better compatibility with standard decorators, compared to constructor-based injection: https://angular.dev/reference/migrations/inject-function -* Use the new way of defining queries for ``viewChild()``, ``contentChild()``, ``viewChildren()``, ``contentChildren()``: https://ngxtension.netlify.app/utilities/migrations/queries-migration/ -* Use ``OnPush`` change detection strategy for components whenever possible: https://blog.angular-university.io/onpush-change-detection-how-it-works/ +* Use the new way of defining queries for ``viewChild()``, ``contentChild()``, ``viewChildren()``, ``contentChildren()``: https://ngxtension.netlify.app/utilities/migrations/queries-migration +* You can find an example for a migration in the pull request `9299 `_. +* Use ``OnPush`` change detection strategy for components whenever possible: https://blog.angular-university.io/onpush-change-detection-how-it-works .. WARNING:: **Never invoke methods from the html template. The automatic change tracking in Angular will kill the application performance!** diff --git a/gradle.properties b/gradle.properties index 0ddd8b8f3fdc..fc54fad2849b 100644 --- a/gradle.properties +++ b/gradle.properties @@ -6,7 +6,7 @@ node_version=20.16.0 npm_version=10.8.0 # Dependency versions -jhipster_dependencies_version=8.7.0 +jhipster_dependencies_version=8.7.1 spring_boot_version=3.3.4 spring_security_version=6.3.3 # TODO: upgrading to 6.6.0 currently leads to issues due to internal changes in Hibernate and potentially wrong use in Artemis server code @@ -16,26 +16,26 @@ opensaml_version=4.3.2 jwt_version=0.12.6 jaxb_runtime_version=4.0.5 hazelcast_version=5.5.0 -fasterxml_version=2.17.2 +fasterxml_version=2.18.0 jgit_version=7.0.0.202409031743-r sshd_version=2.13.2 checkstyle_version=10.18.1 jplag_version=5.1.0 # not really used in Artemis, nor Jplag, nor the used version of Stanford CoreNLP, but we use the latest to avoid security vulnerabilities # NOTE: we do not need to use the latest version 9.x here as long as Stanford CoreNLP does not reference it -lucene_version=8.11.3 +lucene_version=8.11.4 slf4j_version=2.0.16 sentry_version=7.14.0 liquibase_version=4.29.2 docker_java_version=3.4.0 logback_version=1.5.8 java_parser_version=3.26.2 -byte_buddy_version=1.15.1 +byte_buddy_version=1.15.3 # testing # make sure both versions are compatible junit_version=5.11.0 -junit_platform_version=1.11.0 +junit_platform_version=1.11.1 mockito_version=5.13.0 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 0aaefbcaf0f1..df97d72b8b91 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/jest.config.js b/jest.config.js index b4e2303f5e92..41354957ab0d 100644 --- a/jest.config.js +++ b/jest.config.js @@ -14,7 +14,7 @@ const esModules = [ '@angular/service-worker', '@ctrl/ngx-emoji-mart', '@danielmoncada/angular-datetime-picker', - '@flaviosantoro92/ngx-datatable', + '@siemens/ngx-datatable', '@fortawesome/angular-fontawesome', '@ls1intum/apollon', '@ng-bootstrap/ng-bootstrap', @@ -102,10 +102,10 @@ module.exports = { coverageThreshold: { global: { // TODO: in the future, the following values should increase to at least 90% - statements: 87.36, - branches: 73.56, - functions: 81.90, - lines: 87.42, + statements: 87.35, + branches: 73.57, + functions: 81.91, + lines: 87.41, }, }, coverageReporters: ['clover', 'json', 'lcov', 'text-summary'], @@ -125,7 +125,7 @@ module.exports = { }, ], }, - modulePathIgnorePatterns: [], + modulePathIgnorePatterns: ['/src/main/resources/templates/'], testTimeout: 3000, testMatch: [ '/src/test/javascript/spec/component/**/*.spec.ts', diff --git a/package-lock.json b/package-lock.json index 1ace05464f69..3cc579e1ab93 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,31 +1,30 @@ { "name": "artemis", - "version": "7.5.4", + "version": "7.5.5", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "artemis", - "version": "7.5.4", + "version": "7.5.5", "hasInstallScript": true, "license": "MIT", "dependencies": { - "@angular/animations": "18.2.5", - "@angular/cdk": "18.2.5", - "@angular/common": "18.2.5", - "@angular/compiler": "18.2.5", - "@angular/core": "18.2.5", - "@angular/forms": "18.2.5", - "@angular/localize": "18.2.5", - "@angular/material": "18.2.5", - "@angular/platform-browser": "18.2.5", - "@angular/platform-browser-dynamic": "18.2.5", - "@angular/router": "18.2.5", - "@angular/service-worker": "18.2.5", + "@angular/animations": "18.2.6", + "@angular/cdk": "18.2.6", + "@angular/common": "18.2.6", + "@angular/compiler": "18.2.6", + "@angular/core": "18.2.6", + "@angular/forms": "18.2.6", + "@angular/localize": "18.2.6", + "@angular/material": "18.2.6", + "@angular/platform-browser": "18.2.6", + "@angular/platform-browser-dynamic": "18.2.6", + "@angular/router": "18.2.6", + "@angular/service-worker": "18.2.6", "@ctrl/ngx-emoji-mart": "9.2.0", "@danielmoncada/angular-datetime-picker": "18.1.0", "@fingerprintjs/fingerprintjs": "4.5.0", - "@flaviosantoro92/ngx-datatable": "1.0.2", "@fortawesome/angular-fontawesome": "0.15.0", "@fortawesome/fontawesome-svg-core": "6.6.0", "@fortawesome/free-regular-svg-icons": "6.6.0", @@ -34,7 +33,8 @@ "@ng-bootstrap/ng-bootstrap": "17.0.1", "@ngx-translate/core": "15.0.0", "@ngx-translate/http-loader": "8.0.0", - "@sentry/angular": "8.30.0", + "@sentry/angular": "8.32.0", + "@siemens/ngx-datatable": "22.4.1", "@swimlane/ngx-charts": "20.5.0", "@swimlane/ngx-graph": "8.4.0", "@vscode/codicons": "0.0.36", @@ -44,7 +44,7 @@ "crypto-js": "4.2.0", "dayjs": "1.11.13", "diff-match-patch-typescript": "1.1.0", - "dompurify": "3.1.6", + "dompurify": "3.1.7", "export-to-csv": "1.4.0", "fast-json-patch": "3.1.1", "franc-min": "6.2.0", @@ -55,12 +55,12 @@ "jszip": "3.10.1", "lodash-es": "4.17.21", "mobile-drag-drop": "3.0.0-rc.0", - "monaco-editor": "0.52.0", + "monaco-editor": "0.51.0", "ngx-infinite-scroll": "18.0.0", "ngx-webstorage": "18.0.0", "papaparse": "5.4.1", "pdfjs-dist": "4.6.82", - "posthog-js": "1.163.0", + "posthog-js": "1.165.0", "rxjs": "7.8.1", "showdown": "2.1.0", "showdown-highlight": "3.1.0", @@ -78,30 +78,30 @@ }, "devDependencies": { "@angular-builders/jest": "18.0.0", - "@angular-devkit/build-angular": "18.2.5", + "@angular-devkit/build-angular": "18.2.6", "@angular-eslint/builder": "18.3.1", "@angular-eslint/eslint-plugin": "18.3.1", "@angular-eslint/eslint-plugin-template": "18.3.1", "@angular-eslint/schematics": "18.3.1", "@angular-eslint/template-parser": "18.3.1", - "@angular/cli": "18.2.5", - "@angular/compiler-cli": "18.2.5", - "@angular/language-service": "18.2.5", - "@sentry/types": "8.30.0", + "@angular/cli": "18.2.6", + "@angular/compiler-cli": "18.2.6", + "@angular/language-service": "18.2.6", + "@sentry/types": "8.32.0", "@types/crypto-js": "4.2.2", "@types/d3-shape": "3.1.6", "@types/dompurify": "3.0.5", "@types/jest": "29.5.13", "@types/lodash-es": "4.17.12", - "@types/node": "22.5.5", + "@types/node": "22.7.3", "@types/papaparse": "5.3.14", "@types/showdown": "2.0.6", "@types/smoothscroll-polyfill": "0.3.4", "@types/sockjs-client": "1.5.4", "@types/uuid": "10.0.0", - "@typescript-eslint/eslint-plugin": "8.6.0", - "@typescript-eslint/parser": "8.6.0", - "eslint": "9.11.0", + "@typescript-eslint/eslint-plugin": "8.7.0", + "@typescript-eslint/parser": "8.7.0", + "eslint": "9.11.1", "eslint-config-prettier": "9.1.0", "eslint-plugin-deprecation": "3.0.0", "eslint-plugin-jest": "28.8.3", @@ -118,6 +118,7 @@ "jest-preset-angular": "14.2.4", "lint-staged": "15.2.10", "ng-mocks": "14.13.1", + "ngxtension": "4.0.0", "prettier": "3.3.3", "rimraf": "6.0.1", "sass": "1.79.3", @@ -211,13 +212,13 @@ } }, "node_modules/@angular-devkit/architect": { - "version": "0.1802.5", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1802.5.tgz", - "integrity": "sha512-c7sVoW85Yqj7IYvNKxtNSGS5I7gWpORorg/xxLZX3OkHWXDrwYbb5LN/2p5/Aytxyb0aXl4o5fFOu6CUwcaLUw==", + "version": "0.1802.6", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1802.6.tgz", + "integrity": "sha512-oF7cPFdTLxeuvXkK/opSdIxZ1E4LrBbmuytQ/nCoAGOaKBWdqvwagRZ6jVhaI0Gwu48rkcV7Zhesg/ESNnROdw==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/core": "18.2.5", + "@angular-devkit/core": "18.2.6", "rxjs": "7.8.1" }, "engines": { @@ -227,17 +228,17 @@ } }, "node_modules/@angular-devkit/build-angular": { - "version": "18.2.5", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-18.2.5.tgz", - "integrity": "sha512-dIvb0AHoRIMM6tLuG4t6lDDslSAYP77wqytodsN317UzFOuuCPernXbO8NJs+QHxj09nPsem1T5vnvpO2E/PVQ==", + "version": "18.2.6", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-18.2.6.tgz", + "integrity": "sha512-u12cJZttgs5j7gICHWSmcaTCu0EFXEzKqI8nkYCwq2MtuJlAXiMQSXYuEP9OU3Go4vMAPtQh2kShyOWCX5b4EQ==", "dev": true, "license": "MIT", "dependencies": { "@ampproject/remapping": "2.3.0", - "@angular-devkit/architect": "0.1802.5", - "@angular-devkit/build-webpack": "0.1802.5", - "@angular-devkit/core": "18.2.5", - "@angular/build": "18.2.5", + "@angular-devkit/architect": "0.1802.6", + "@angular-devkit/build-webpack": "0.1802.6", + "@angular-devkit/core": "18.2.6", + "@angular/build": "18.2.6", "@babel/core": "7.25.2", "@babel/generator": "7.25.0", "@babel/helper-annotate-as-pure": "7.24.7", @@ -248,7 +249,7 @@ "@babel/preset-env": "7.25.3", "@babel/runtime": "7.25.0", "@discoveryjs/json-ext": "0.6.1", - "@ngtools/webpack": "18.2.5", + "@ngtools/webpack": "18.2.6", "@vitejs/plugin-basic-ssl": "1.1.0", "ansi-colors": "4.1.3", "autoprefixer": "10.4.20", @@ -381,13 +382,13 @@ "license": "0BSD" }, "node_modules/@angular-devkit/build-webpack": { - "version": "0.1802.5", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1802.5.tgz", - "integrity": "sha512-6qkcrWBdkxojCVHGWcdJaz4G+7QTjFvmc+3g8xvLc9sYvJq1I059gfXhDnC0FxiA0MT4cY/26ECYWUHTD5CJLQ==", + "version": "0.1802.6", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1802.6.tgz", + "integrity": "sha512-JMLcXFaitJplwZMKkqhbYirINCRD6eOPZuIGaIOVynXYGWgvJkLT9t5C2wm9HqSLtp1K7NcYG2Y7PtTVR4krnQ==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/architect": "0.1802.5", + "@angular-devkit/architect": "0.1802.6", "rxjs": "7.8.1" }, "engines": { @@ -401,9 +402,9 @@ } }, "node_modules/@angular-devkit/core": { - "version": "18.2.5", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-18.2.5.tgz", - "integrity": "sha512-r9TumPlJ8PvA2+yz4sp+bUHgtznaVKzhvXTN5qL1k4YP8LJ7iZWMR2FOP+HjukHZOTsenzmV9pszbogabqwoZQ==", + "version": "18.2.6", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-18.2.6.tgz", + "integrity": "sha512-la4CFvs5PcRWSkQ/H7TB5cPZirFVA9GoWk5LzIk8si6VjWBJRm8b3keKJoC9LlNeABRUIR5z0ocYkyQQUhdMfg==", "dev": true, "license": "MIT", "dependencies": { @@ -429,13 +430,13 @@ } }, "node_modules/@angular-devkit/schematics": { - "version": "18.2.5", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-18.2.5.tgz", - "integrity": "sha512-NUmz2UQ1Xl4cf4j1AgkwIfsCjBzAPgfeC3IBrD29hSOBE1Y3j6auqjBkvw50v6mbSPxESND995Xy13HpK1Xflw==", + "version": "18.2.6", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-18.2.6.tgz", + "integrity": "sha512-uIttrQ2cQ2PWAFFVPeCoNR8xvs7tPJ2i8gzqsIwYdge107xDC6u9CqfgmBqPDSFpWj+IiC2Jwcm8Z4HYKU4+7A==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/core": "18.2.5", + "@angular-devkit/core": "18.2.6", "jsonc-parser": "3.3.1", "magic-string": "0.30.11", "ora": "5.4.1", @@ -548,9 +549,9 @@ } }, "node_modules/@angular/animations": { - "version": "18.2.5", - "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-18.2.5.tgz", - "integrity": "sha512-IlXtW/Nj48ZzjHUzH1TykZcSR64ScJx39T3IHnjV2z/bVATzZ36JGoadQHdqpJNKBodYJNgtJCGLCbgAvGWY2g==", + "version": "18.2.6", + "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-18.2.6.tgz", + "integrity": "sha512-vy9wy+Q9beiRxkEO8wNxFQ63AqAujGvk8AUHepxxIT7QNNc512TNKz8uH+feWDPO38Dm2obwYQHMGzs3WO7pUA==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -559,18 +560,18 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/core": "18.2.5" + "@angular/core": "18.2.6" } }, "node_modules/@angular/build": { - "version": "18.2.5", - "resolved": "https://registry.npmjs.org/@angular/build/-/build-18.2.5.tgz", - "integrity": "sha512-XWkmjzgeUga0SJ0lYSYcTuYOWTyqcln2mNfBp7Ae/GZ+/7+APbedsIZEiZGZwveOIyOpTM5wguNSoe9khDl5Ig==", + "version": "18.2.6", + "resolved": "https://registry.npmjs.org/@angular/build/-/build-18.2.6.tgz", + "integrity": "sha512-TQzX6Mi7uXFvmz7+OVl4Za7WawYPcx+B5Ewm6IY/DdMyB9P/Z4tbKb1LO+ynWUXYwm7avXo6XQQ4m5ArDY5F/A==", "dev": true, "license": "MIT", "dependencies": { "@ampproject/remapping": "2.3.0", - "@angular-devkit/architect": "0.1802.5", + "@angular-devkit/architect": "0.1802.6", "@babel/core": "7.25.2", "@babel/helper-annotate-as-pure": "7.24.7", "@babel/helper-split-export-declaration": "7.24.7", @@ -589,7 +590,7 @@ "parse5-html-rewriting-stream": "7.0.0", "picomatch": "4.0.2", "piscina": "4.6.1", - "rollup": "4.20.0", + "rollup": "4.22.4", "sass": "1.77.6", "semver": "7.6.3", "vite": "5.4.6", @@ -650,9 +651,9 @@ } }, "node_modules/@angular/cdk": { - "version": "18.2.5", - "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-18.2.5.tgz", - "integrity": "sha512-HLg5cfrIrgNIJJ+0v3kLieHeLPJLFNOBO359holXOrKUPRG+XQ3CT8EzSvREFm1XkaSEsDC0+dnG0ouNhOPFpQ==", + "version": "18.2.6", + "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-18.2.6.tgz", + "integrity": "sha512-Gfq/iv4zhlKYpdQkDaBRwxI71NHNUHM1Cs1XhnZ0/oFct5HXvSv1RHRGTKqBJLLACaAPzZKXJ/UglLoyO5CNiQ==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -667,18 +668,18 @@ } }, "node_modules/@angular/cli": { - "version": "18.2.5", - "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-18.2.5.tgz", - "integrity": "sha512-97uNs0HsOdnMaTlNJKFjIBUXw0wz43uYvSSKmIpBt7eq1LaPLju1G/qpDIHx2YwhMClPrXXrW2H/xdvqZiIw+w==", + "version": "18.2.6", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-18.2.6.tgz", + "integrity": "sha512-tdXsnV/w+Rgu8q0zFsLU5L9ImTVqrTol1vppHaQkJ/vuoHy+s8ZEbBqhVrO/ffosNb2xseUybGYvqMS4zkNQjg==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/architect": "0.1802.5", - "@angular-devkit/core": "18.2.5", - "@angular-devkit/schematics": "18.2.5", + "@angular-devkit/architect": "0.1802.6", + "@angular-devkit/core": "18.2.6", + "@angular-devkit/schematics": "18.2.6", "@inquirer/prompts": "5.3.8", "@listr2/prompt-adapter-inquirer": "2.0.15", - "@schematics/angular": "18.2.5", + "@schematics/angular": "18.2.6", "@yarnpkg/lockfile": "1.1.0", "ini": "4.1.3", "jsonc-parser": "3.3.1", @@ -701,9 +702,9 @@ } }, "node_modules/@angular/common": { - "version": "18.2.5", - "resolved": "https://registry.npmjs.org/@angular/common/-/common-18.2.5.tgz", - "integrity": "sha512-m+KJrtbFXTE36jP/po6UAMeUR/enQxRHpVGLCRcIcE7VWVH1ZcOvoW1yqh2A6k+KxWXeajlq/Z04nnMhcoxMRw==", + "version": "18.2.6", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-18.2.6.tgz", + "integrity": "sha512-89793ow+wrI1c7C6kyMbnweLNIZHzXthosxAEjipRZGBrqBYjvTtkE45Fl+5yBa3JO7bAhyGkUnEoyvWtZIAEA==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -712,14 +713,14 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/core": "18.2.5", + "@angular/core": "18.2.6", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/compiler": { - "version": "18.2.5", - "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-18.2.5.tgz", - "integrity": "sha512-vcqe9x4dGGAnMfPhEpcZyiSVgAiqJeK80LqP1vWoAmBR+HeOqAilSv6SflcLAtuTzwgzMMAvD2T+SMCgUvaqww==", + "version": "18.2.6", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-18.2.6.tgz", + "integrity": "sha512-3tX2/Qw+bZ8XzKitviH8jzNGyY0uohhehhBB57OJOCc+yr4ojy/7SYFnun1lSsRnDztdCE461641X4iQLCQ94w==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -728,7 +729,7 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/core": "18.2.5" + "@angular/core": "18.2.6" }, "peerDependenciesMeta": { "@angular/core": { @@ -737,9 +738,9 @@ } }, "node_modules/@angular/compiler-cli": { - "version": "18.2.5", - "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-18.2.5.tgz", - "integrity": "sha512-CCCtZobUTUfId/RTYtuDCw5R1oK0w65hdAUMRP1MdGmd8bb8DKJA86u1QCWwozL3rbXlIIX4ognQ6urQ43k/Gw==", + "version": "18.2.6", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-18.2.6.tgz", + "integrity": "sha512-b5x9STfjNiNM/S0D+CnqRP9UOxPtSz1+RlCH5WdOMiW/p8j5p6dBix8YYgTe6Wg3OD7eItD2pnFQKgF/dWiopA==", "license": "MIT", "dependencies": { "@babel/core": "7.25.2", @@ -760,14 +761,14 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/compiler": "18.2.5", + "@angular/compiler": "18.2.6", "typescript": ">=5.4 <5.6" } }, "node_modules/@angular/core": { - "version": "18.2.5", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-18.2.5.tgz", - "integrity": "sha512-5BLVc5gXxzanQkADNS9WPsor3vNF5nQcyIHBi5VScErwM5vVZ7ATH1iZwaOg1ykDEVTFVhKDwD0X1aaqGDbhmQ==", + "version": "18.2.6", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-18.2.6.tgz", + "integrity": "sha512-PjFad2j4YBwLVTw+0Te8CJCa/tV0W8caTHG8aOjj3ObdL6ihGI+FKnwerLc9RVzDFd14BOO4C6/+LbOQAh3Ltw==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -781,9 +782,9 @@ } }, "node_modules/@angular/forms": { - "version": "18.2.5", - "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-18.2.5.tgz", - "integrity": "sha512-ohKeH+EZCCIyGSiFYlraWLzssGAZc13P92cuYpXB62322PkcA5u0IT72mML9JWGKRqF2zteVsw4koWHVxXM5mA==", + "version": "18.2.6", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-18.2.6.tgz", + "integrity": "sha512-quGkUqTxlBaLB8C/RnpfFG57fdmNF5RQ+368N89Ma++2lpIsVAHaGZZn4yOyo3wNYaM2jBxNqaYxOzZNUl5Tig==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -792,16 +793,16 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/common": "18.2.5", - "@angular/core": "18.2.5", - "@angular/platform-browser": "18.2.5", + "@angular/common": "18.2.6", + "@angular/core": "18.2.6", + "@angular/platform-browser": "18.2.6", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/language-service": { - "version": "18.2.5", - "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-18.2.5.tgz", - "integrity": "sha512-JE6ck4UWXayiG8ptJJtkrKCjy+5Ftktgsoj4QGdQzMhbpia7Wge5XDj28o+bwEFndRnP6ihRtud63IvOz9aKFQ==", + "version": "18.2.6", + "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-18.2.6.tgz", + "integrity": "sha512-GBvBvS2llh+/l2YhO7UO5o3GftlvQQoXnw3v0hcNoHKwcnvqXV4CCi+T2WOaZyK0iB8Is4QRbMrpJUC66HokZg==", "dev": true, "license": "MIT", "engines": { @@ -809,9 +810,9 @@ } }, "node_modules/@angular/localize": { - "version": "18.2.5", - "resolved": "https://registry.npmjs.org/@angular/localize/-/localize-18.2.5.tgz", - "integrity": "sha512-kteBBkSmmmpMrHAIlxFK/PB9HemJ8OBo/qAGOqCGbvPHLMHdR7cxaMGL+Lkya/QhwhqlhoxUcE5zFWXl7UslNg==", + "version": "18.2.6", + "resolved": "https://registry.npmjs.org/@angular/localize/-/localize-18.2.6.tgz", + "integrity": "sha512-4NZwh5EAyXItmwv6hqilV+JyN8DT+d+S1rW+M1IwJqC9asCDfpFqipKpuQF81LQKeLH0mn/phNfVbnJCLP0Tkw==", "license": "MIT", "dependencies": { "@babel/core": "7.25.2", @@ -828,21 +829,21 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/compiler": "18.2.5", - "@angular/compiler-cli": "18.2.5" + "@angular/compiler": "18.2.6", + "@angular/compiler-cli": "18.2.6" } }, "node_modules/@angular/material": { - "version": "18.2.5", - "resolved": "https://registry.npmjs.org/@angular/material/-/material-18.2.5.tgz", - "integrity": "sha512-+Yz8ayKz1ALz2UvPrM33FHSUmrE0GKHn+Gg79l6NdC4eSrzAAYBVdLfQvCBWCgtdvs7IiegbCnnAJiqXVC1DDg==", + "version": "18.2.6", + "resolved": "https://registry.npmjs.org/@angular/material/-/material-18.2.6.tgz", + "integrity": "sha512-ObxC/vomSb9QF3vIztuiInQzws+D6u09Dhfx6uNFjtyICqxEFpF7+Qx7QVDWrsuXOgxZTKgacK8f46iV8hWUfg==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" }, "peerDependencies": { "@angular/animations": "^18.0.0 || ^19.0.0", - "@angular/cdk": "18.2.5", + "@angular/cdk": "18.2.6", "@angular/common": "^18.0.0 || ^19.0.0", "@angular/core": "^18.0.0 || ^19.0.0", "@angular/forms": "^18.0.0 || ^19.0.0", @@ -851,9 +852,9 @@ } }, "node_modules/@angular/platform-browser": { - "version": "18.2.5", - "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-18.2.5.tgz", - "integrity": "sha512-PoX9idwnOpTJBlujzZ2nFGOsmCnZzOH7uNSWIR7trdoq0b1AFXfrxlCQ36qWamk7bbhJI4H28L8YTmKew/nXDA==", + "version": "18.2.6", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-18.2.6.tgz", + "integrity": "sha512-RA8UMiYNLga+QMwpKcDw1357gYPfPyY/rmLeezMak//BbsENFYQOJ4Z6DBOBNiPlHxmBsUJMGaKdlpQhfCROyQ==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -862,9 +863,9 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/animations": "18.2.5", - "@angular/common": "18.2.5", - "@angular/core": "18.2.5" + "@angular/animations": "18.2.6", + "@angular/common": "18.2.6", + "@angular/core": "18.2.6" }, "peerDependenciesMeta": { "@angular/animations": { @@ -873,9 +874,9 @@ } }, "node_modules/@angular/platform-browser-dynamic": { - "version": "18.2.5", - "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-18.2.5.tgz", - "integrity": "sha512-5u0IuAt1r5e2u2vSKhp3phnaf6hH89B/q7GErfPse1sdDfNI6wHVppxai28PAfAj9gwooJun6MjFWhJFLzS44A==", + "version": "18.2.6", + "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-18.2.6.tgz", + "integrity": "sha512-kGBU3FNc+DF9r33hwHZqiWoZgQbCDdEIucU0NCLCIg0Hw6/Q9Hr2ndjxQI+WynCPg0JeBn34jpouvpeJer3YDQ==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -884,16 +885,16 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/common": "18.2.5", - "@angular/compiler": "18.2.5", - "@angular/core": "18.2.5", - "@angular/platform-browser": "18.2.5" + "@angular/common": "18.2.6", + "@angular/compiler": "18.2.6", + "@angular/core": "18.2.6", + "@angular/platform-browser": "18.2.6" } }, "node_modules/@angular/router": { - "version": "18.2.5", - "resolved": "https://registry.npmjs.org/@angular/router/-/router-18.2.5.tgz", - "integrity": "sha512-OjZV1PTiSwT0ytmR0ykveLYzs4uQWf0EuIclZmWqM/bb8Q4P+gJl7/sya05nGnZsj6nHGOL0e/LhSZ3N+5p6qg==", + "version": "18.2.6", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-18.2.6.tgz", + "integrity": "sha512-t57Sqja8unHhZlPr+4CWnQacuox2M4p2pMHps+31wt337qH6mKf4jqDmK0dE/MFdRyKjT2a2E/2NwtxXxcWNuw==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -902,16 +903,16 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/common": "18.2.5", - "@angular/core": "18.2.5", - "@angular/platform-browser": "18.2.5", + "@angular/common": "18.2.6", + "@angular/core": "18.2.6", + "@angular/platform-browser": "18.2.6", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/service-worker": { - "version": "18.2.5", - "resolved": "https://registry.npmjs.org/@angular/service-worker/-/service-worker-18.2.5.tgz", - "integrity": "sha512-MoF2n7z/X+yqK89mIRHQutVHIBTyEUo/fDEL8LcuBP4KOZmX9cRoCEt+vqH49BkArsgOM0jNFMYCM8yt0jg7pw==", + "version": "18.2.6", + "resolved": "https://registry.npmjs.org/@angular/service-worker/-/service-worker-18.2.6.tgz", + "integrity": "sha512-KNqRAunG0yj3jVA/YYKH9wbAe261gAIwKeQsJyeMHGR48H88tSKdcstttNZZ3S6wdhp7tcyUC526Fc4phXnSJw==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -923,8 +924,8 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/common": "18.2.5", - "@angular/core": "18.2.5" + "@angular/common": "18.2.6", + "@angular/core": "18.2.6" } }, "node_modules/@babel/code-frame": { @@ -2836,10 +2837,41 @@ "node": ">=14.17.0" } }, + "node_modules/@emnapi/core": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.2.0.tgz", + "integrity": "sha512-E7Vgw78I93we4ZWdYCb4DGAwRROGkMIXk7/y87UmANR+J6qsWusmC3gLt0H+O0KOt5e6O38U8oJamgbudrES/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@emnapi/wasi-threads": "1.0.1", + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.2.0.tgz", + "integrity": "sha512-bV21/9LQmcQeCPEg3BDFtvwL6cwiTMksYNWQQ4KOxCZikEGalWtenoZ0wCiukJINlGCIi2KXx01g4FoH/LxpzQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/wasi-threads": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.0.1.tgz", + "integrity": "sha512-iIBu7mwkq4UQGeMEM8bLwNK962nXdhodeScX4slfQnRhEMMzvYivHhutCIk8uojvmASXXPC2WNEjwxFWk72Oqw==", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.4.0" + } + }, "node_modules/@emotion/is-prop-valid": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.3.0.tgz", - "integrity": "sha512-SHetuSLvJDzuNbOdtPVbq6yMMMlLoW5Q94uDqJZqy50gcmAjxFkVqmzqSGEFq9gT2iMuIeKV1PXVWmvUhuZLlQ==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.3.1.tgz", + "integrity": "sha512-/ACwoqx7XQi9knQs/G0qKvv5teDMhD7bXYns9N/wM8ah8iNb8jZ2uNO0YOgiq2o2poIvVtJS2YALasQuMSQ7Kw==", "license": "MIT", "dependencies": { "@emotion/memoize": "^0.9.0" @@ -3336,6 +3368,16 @@ "node": "*" } }, + "node_modules/@eslint/core": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.6.0.tgz", + "integrity": "sha512-8I2Q8ykA4J0x0o7cg67FPVnehcqWTBehu/lmY+bolPFHGjh49YzGBMXTvpqVgEbBdvNCSxj6iFgiIyHzf03lzg==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, "node_modules/@eslint/eslintrc": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.1.0.tgz", @@ -3422,9 +3464,9 @@ } }, "node_modules/@eslint/js": { - "version": "9.11.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.11.0.tgz", - "integrity": "sha512-LPkkenkDqyzTFauZLLAPhIb48fj6drrfMvRGSL9tS3AcZBSVTllemLSNyCvHNNL2t797S/6DJNSIwRwXgMO/eQ==", + "version": "9.11.1", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.11.1.tgz", + "integrity": "sha512-/qu+TWz8WwPWc7/HcIJKi+c+MOm46GdVaSlTTQcaqaL53+GsoA6MxWp5PtTx48qbSP7ylM1Kn7nhvkugfJvRSA==", "dev": true, "license": "MIT", "engines": { @@ -3463,21 +3505,6 @@ "tslib": "^2.4.1" } }, - "node_modules/@flaviosantoro92/ngx-datatable": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@flaviosantoro92/ngx-datatable/-/ngx-datatable-1.0.2.tgz", - "integrity": "sha512-AMlfkRtufd95bcVP+UBBBNUTRkksd+uyT3Fv3qTRY/6K20xSD8euwih+iIUfwE4JbAhQHqkfty7jVQctFAF2lA==", - "license": "MIT", - "dependencies": { - "tslib": "^2.0.0" - }, - "peerDependencies": { - "@angular/common": ">=11.0.2", - "@angular/core": ">=11.0.2", - "@angular/platform-browser": ">=11.0.2", - "rxjs": "^7.4.0" - } - }, "node_modules/@fortawesome/angular-fontawesome": { "version": "0.15.0", "resolved": "https://registry.npmjs.org/@fortawesome/angular-fontawesome/-/angular-fontawesome-0.15.0.tgz", @@ -5208,6 +5235,18 @@ "win32" ] }, + "node_modules/@napi-rs/wasm-runtime": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.4.tgz", + "integrity": "sha512-9zESzOO5aDByvhIAsOy9TbpZ0Ur2AJbUI7UT73kcUTS2mxAMHOBaa1st/jAymNoCtvrit99kkzT1FZuXVcgfIQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@emnapi/core": "^1.1.0", + "@emnapi/runtime": "^1.1.0", + "@tybys/wasm-util": "^0.9.0" + } + }, "node_modules/@ng-bootstrap/ng-bootstrap": { "version": "17.0.1", "resolved": "https://registry.npmjs.org/@ng-bootstrap/ng-bootstrap/-/ng-bootstrap-17.0.1.tgz", @@ -5226,9 +5265,9 @@ } }, "node_modules/@ngtools/webpack": { - "version": "18.2.5", - "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-18.2.5.tgz", - "integrity": "sha512-L0n4eHObeqEOYRfSP+e4SeF/dmwxOIFy9xYvYCOUwOLrW4b3+a1+kkT30pqyfL72LFtpf0cmUwaWEFIcWl5PCg==", + "version": "18.2.6", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-18.2.6.tgz", + "integrity": "sha512-7HwOPE1EOgcHnpt4brSiT8G2CcXB50G0+CbCBaKGy4LYCG3Y3mrlzF5Fup9HvMJ6Tzqd62RqzpKKYBiGUT7hxg==", "dev": true, "license": "MIT", "engines": { @@ -5557,6 +5596,247 @@ "node": "^16.13.0 || >=18.0.0" } }, + "node_modules/@nrwl/devkit": { + "version": "19.6.5", + "resolved": "https://registry.npmjs.org/@nrwl/devkit/-/devkit-19.6.5.tgz", + "integrity": "sha512-KaQeVyYaWBQwQSITtumPvx+P7IpKFReETx4gLTcOpQ/a3QD/AZFGbNjiG+xDLbgo1FDh9dRt9k7eWhGk6oPWKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nx/devkit": "19.6.5" + } + }, + "node_modules/@nrwl/tao": { + "version": "19.6.5", + "resolved": "https://registry.npmjs.org/@nrwl/tao/-/tao-19.6.5.tgz", + "integrity": "sha512-EoUN/kE6CMWJ4ZZgcXAyiOzn8BSshG2DhC5PNwzLTAxRBus8FgXR/9c0XOzchaP46Kq3hoBGFgeyW434tfuv5w==", + "dev": true, + "license": "MIT", + "dependencies": { + "nx": "19.6.5", + "tslib": "^2.3.0" + }, + "bin": { + "tao": "index.js" + } + }, + "node_modules/@nx/devkit": { + "version": "19.6.5", + "resolved": "https://registry.npmjs.org/@nx/devkit/-/devkit-19.6.5.tgz", + "integrity": "sha512-AEaMSr55Ar48QHU8TBi/gzLtjeT100zdyfLmk0RoiLzjjC8pWmm3Xfvqxyt1WsUUf4oQhlHlolJuoM41qKsdZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nrwl/devkit": "19.6.5", + "ejs": "^3.1.7", + "enquirer": "~2.3.6", + "ignore": "^5.0.4", + "minimatch": "9.0.3", + "semver": "^7.5.3", + "tmp": "~0.2.1", + "tslib": "^2.3.0", + "yargs-parser": "21.1.1" + }, + "peerDependencies": { + "nx": ">= 17 <= 20" + } + }, + "node_modules/@nx/devkit/node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@nx/devkit/node_modules/tmp": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.3.tgz", + "integrity": "sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.14" + } + }, + "node_modules/@nx/nx-darwin-arm64": { + "version": "19.6.5", + "resolved": "https://registry.npmjs.org/@nx/nx-darwin-arm64/-/nx-darwin-arm64-19.6.5.tgz", + "integrity": "sha512-sFU2k0BaklM17206F2E5C3866y0SICb0xyuPeD6D07a6hB4IstjIUkldUJJN70wEsJ5I3VP4yZ2oJcwnb1TTRQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nx/nx-darwin-x64": { + "version": "19.6.5", + "resolved": "https://registry.npmjs.org/@nx/nx-darwin-x64/-/nx-darwin-x64-19.6.5.tgz", + "integrity": "sha512-EJmTbUPmlksgOap6xkQl89+zXwHpaAnZLsyLHUd7i00eVRa21FRhdKFnVsRxtwPDZp/YCG84IzMUye/IrwDFTQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nx/nx-freebsd-x64": { + "version": "19.6.5", + "resolved": "https://registry.npmjs.org/@nx/nx-freebsd-x64/-/nx-freebsd-x64-19.6.5.tgz", + "integrity": "sha512-rR8NJCskoEmIbK96uxaevHm146WDTA0V3jId+X1joITqjj3E2DMm0U4r5v/OgI5+iqbhFV4S83LrMxP6gBLTsQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nx/nx-linux-arm-gnueabihf": { + "version": "19.6.5", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm-gnueabihf/-/nx-linux-arm-gnueabihf-19.6.5.tgz", + "integrity": "sha512-OUHFV6iLlJN7b7qFnqLfa0Yj/aoylEiRXcEhV1bhPm0Ryt1bOeGDmLYScVN8n5t+AVmrwwYHk+ajXMzCOLLeZw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nx/nx-linux-arm64-gnu": { + "version": "19.6.5", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-gnu/-/nx-linux-arm64-gnu-19.6.5.tgz", + "integrity": "sha512-CzbJfb24poaJgBHt4aKLaL8a7bO9KXCLls+TX0SZfmzA9AWX6YuiX9lhxwBv6cqsViXTDB4KnXndMDB/H0Gk4g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nx/nx-linux-arm64-musl": { + "version": "19.6.5", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-musl/-/nx-linux-arm64-musl-19.6.5.tgz", + "integrity": "sha512-MgidKilQ0KWxQbTnaqXGjASu7wtAC9q6zAwFNKFENkwJq3nThaQH6jQVlnINE4lL9NSgyyg0AS/ix31hiqAgvA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nx/nx-linux-x64-gnu": { + "version": "19.6.5", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-gnu/-/nx-linux-x64-gnu-19.6.5.tgz", + "integrity": "sha512-rGDylAoslIlk5TDbEJ6YoQOYxxYP9gCpi6FLke2mFgXVzOmVlLKHfVsegIHYVMYYF26h3NJh0NLGGzGdoBjWgQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nx/nx-linux-x64-musl": { + "version": "19.6.5", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-musl/-/nx-linux-x64-musl-19.6.5.tgz", + "integrity": "sha512-C/pNjDL/bDEcrDypgBo4r1AOiPTk8gWJwBsFE1QHIvg7//5WFSreqRj34rJu/GZ95eLYJH5tje1VW6z+atEGkQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nx/nx-win32-arm64-msvc": { + "version": "19.6.5", + "resolved": "https://registry.npmjs.org/@nx/nx-win32-arm64-msvc/-/nx-win32-arm64-msvc-19.6.5.tgz", + "integrity": "sha512-mMi8i16OFux17xed2iLPWwUdCbS1mYA9Ny/gnoNUCosmihmXX9wrzaGBkNAMsHA28huYQtPhGormsEs+zuiVFg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nx/nx-win32-x64-msvc": { + "version": "19.6.5", + "resolved": "https://registry.npmjs.org/@nx/nx-win32-x64-msvc/-/nx-win32-x64-msvc-19.6.5.tgz", + "integrity": "sha512-jjhbDYNBkyz9Fg1jf0KZTrgdf/yx4v+k0ifukDIHZjva+jko0Ve5WzdkQ2K07M9ZxxYibDtTDqX9uX6+eFZtoA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, "node_modules/@pkgjs/parseargs": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", @@ -5649,9 +5929,9 @@ "license": "MIT" }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.20.0.tgz", - "integrity": "sha512-TSpWzflCc4VGAUJZlPpgAJE1+V60MePDQnBd7PPkpuEmOy8i87aL6tinFGKBFKuEDikYpig72QzdT3QPYIi+oA==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.22.4.tgz", + "integrity": "sha512-Fxamp4aEZnfPOcGA8KSNEohV8hX7zVHOemC8jVBoBUHu5zpJK/Eu3uJwt6BMgy9fkvzxDaurgj96F/NiLukF2w==", "cpu": [ "arm" ], @@ -5663,9 +5943,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.20.0.tgz", - "integrity": "sha512-u00Ro/nok7oGzVuh/FMYfNoGqxU5CPWz1mxV85S2w9LxHR8OoMQBuSk+3BKVIDYgkpeOET5yXkx90OYFc+ytpQ==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.22.4.tgz", + "integrity": "sha512-VXoK5UMrgECLYaMuGuVTOx5kcuap1Jm8g/M83RnCHBKOqvPPmROFJGQaZhGccnsFtfXQ3XYa4/jMCJvZnbJBdA==", "cpu": [ "arm64" ], @@ -5677,9 +5957,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.20.0.tgz", - "integrity": "sha512-uFVfvzvsdGtlSLuL0ZlvPJvl6ZmrH4CBwLGEFPe7hUmf7htGAN+aXo43R/V6LATyxlKVC/m6UsLb7jbG+LG39Q==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.22.4.tgz", + "integrity": "sha512-xMM9ORBqu81jyMKCDP+SZDhnX2QEVQzTcC6G18KlTQEzWK8r/oNZtKuZaCcHhnsa6fEeOBionoyl5JsAbE/36Q==", "cpu": [ "arm64" ], @@ -5691,9 +5971,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.20.0.tgz", - "integrity": "sha512-xbrMDdlev53vNXexEa6l0LffojxhqDTBeL+VUxuuIXys4x6xyvbKq5XqTXBCEUA8ty8iEJblHvFaWRJTk/icAQ==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.22.4.tgz", + "integrity": "sha512-aJJyYKQwbHuhTUrjWjxEvGnNNBCnmpHDvrb8JFDbeSH3m2XdHcxDd3jthAzvmoI8w/kSjd2y0udT+4okADsZIw==", "cpu": [ "x64" ], @@ -5705,9 +5985,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.20.0.tgz", - "integrity": "sha512-jMYvxZwGmoHFBTbr12Xc6wOdc2xA5tF5F2q6t7Rcfab68TT0n+r7dgawD4qhPEvasDsVpQi+MgDzj2faOLsZjA==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.22.4.tgz", + "integrity": "sha512-j63YtCIRAzbO+gC2L9dWXRh5BFetsv0j0va0Wi9epXDgU/XUi5dJKo4USTttVyK7fGw2nPWK0PbAvyliz50SCQ==", "cpu": [ "arm" ], @@ -5719,9 +5999,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.20.0.tgz", - "integrity": "sha512-1asSTl4HKuIHIB1GcdFHNNZhxAYEdqML/MW4QmPS4G0ivbEcBr1JKlFLKsIRqjSwOBkdItn3/ZDlyvZ/N6KPlw==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.22.4.tgz", + "integrity": "sha512-dJnWUgwWBX1YBRsuKKMOlXCzh2Wu1mlHzv20TpqEsfdZLb3WoJW2kIEsGwLkroYf24IrPAvOT/ZQ2OYMV6vlrg==", "cpu": [ "arm" ], @@ -5733,9 +6013,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.20.0.tgz", - "integrity": "sha512-COBb8Bkx56KldOYJfMf6wKeYJrtJ9vEgBRAOkfw6Ens0tnmzPqvlpjZiLgkhg6cA3DGzCmLmmd319pmHvKWWlQ==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.22.4.tgz", + "integrity": "sha512-AdPRoNi3NKVLolCN/Sp4F4N1d98c4SBnHMKoLuiG6RXgoZ4sllseuGioszumnPGmPM2O7qaAX/IJdeDU8f26Aw==", "cpu": [ "arm64" ], @@ -5747,9 +6027,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.20.0.tgz", - "integrity": "sha512-+it+mBSyMslVQa8wSPvBx53fYuZK/oLTu5RJoXogjk6x7Q7sz1GNRsXWjn6SwyJm8E/oMjNVwPhmNdIjwP135Q==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.22.4.tgz", + "integrity": "sha512-Gl0AxBtDg8uoAn5CCqQDMqAx22Wx22pjDOjBdmG0VIWX3qUBHzYmOKh8KXHL4UpogfJ14G4wk16EQogF+v8hmA==", "cpu": [ "arm64" ], @@ -5761,9 +6041,9 @@ ] }, "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.20.0.tgz", - "integrity": "sha512-yAMvqhPfGKsAxHN8I4+jE0CpLWD8cv4z7CK7BMmhjDuz606Q2tFKkWRY8bHR9JQXYcoLfopo5TTqzxgPUjUMfw==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.22.4.tgz", + "integrity": "sha512-3aVCK9xfWW1oGQpTsYJJPF6bfpWfhbRnhdlyhak2ZiyFLDaayz0EP5j9V1RVLAAxlmWKTDfS9wyRyY3hvhPoOg==", "cpu": [ "ppc64" ], @@ -5775,9 +6055,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.20.0.tgz", - "integrity": "sha512-qmuxFpfmi/2SUkAw95TtNq/w/I7Gpjurx609OOOV7U4vhvUhBcftcmXwl3rqAek+ADBwSjIC4IVNLiszoj3dPA==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.22.4.tgz", + "integrity": "sha512-ePYIir6VYnhgv2C5Xe9u+ico4t8sZWXschR6fMgoPUK31yQu7hTEJb7bCqivHECwIClJfKgE7zYsh1qTP3WHUA==", "cpu": [ "riscv64" ], @@ -5789,9 +6069,9 @@ ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.20.0.tgz", - "integrity": "sha512-I0BtGXddHSHjV1mqTNkgUZLnS3WtsqebAXv11D5BZE/gfw5KoyXSAXVqyJximQXNvNzUo4GKlCK/dIwXlz+jlg==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.22.4.tgz", + "integrity": "sha512-GqFJ9wLlbB9daxhVlrTe61vJtEY99/xB3C8e4ULVsVfflcpmR6c8UZXjtkMA6FhNONhj2eA5Tk9uAVw5orEs4Q==", "cpu": [ "s390x" ], @@ -5803,9 +6083,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.20.0.tgz", - "integrity": "sha512-y+eoL2I3iphUg9tN9GB6ku1FA8kOfmF4oUEWhztDJ4KXJy1agk/9+pejOuZkNFhRwHAOxMsBPLbXPd6mJiCwew==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.22.4.tgz", + "integrity": "sha512-87v0ol2sH9GE3cLQLNEy0K/R0pz1nvg76o8M5nhMR0+Q+BBGLnb35P0fVz4CQxHYXaAOhE8HhlkaZfsdUOlHwg==", "cpu": [ "x64" ], @@ -5817,9 +6097,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.20.0.tgz", - "integrity": "sha512-hM3nhW40kBNYUkZb/r9k2FKK+/MnKglX7UYd4ZUy5DJs8/sMsIbqWK2piZtVGE3kcXVNj3B2IrUYROJMMCikNg==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.22.4.tgz", + "integrity": "sha512-UV6FZMUgePDZrFjrNGIWzDo/vABebuXBhJEqrHxrGiU6HikPy0Z3LfdtciIttEUQfuDdCn8fqh7wiFJjCNwO+g==", "cpu": [ "x64" ], @@ -5831,9 +6111,9 @@ ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.20.0.tgz", - "integrity": "sha512-psegMvP+Ik/Bg7QRJbv8w8PAytPA7Uo8fpFjXyCRHWm6Nt42L+JtoqH8eDQ5hRP7/XW2UiIriy1Z46jf0Oa1kA==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.22.4.tgz", + "integrity": "sha512-BjI+NVVEGAXjGWYHz/vv0pBqfGoUH0IGZ0cICTn7kB9PyjrATSkX+8WkguNjWoj2qSr1im/+tTGRaY+4/PdcQw==", "cpu": [ "arm64" ], @@ -5845,9 +6125,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.20.0.tgz", - "integrity": "sha512-GabekH3w4lgAJpVxkk7hUzUf2hICSQO0a/BLFA11/RMxQT92MabKAqyubzDZmMOC/hcJNlc+rrypzNzYl4Dx7A==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.22.4.tgz", + "integrity": "sha512-SiWG/1TuUdPvYmzmYnmd3IEifzR61Tragkbx9D3+R8mzQqDBz8v+BvZNDlkiTtI9T15KYZhP0ehn3Dld4n9J5g==", "cpu": [ "ia32" ], @@ -5859,9 +6139,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.20.0.tgz", - "integrity": "sha512-aJ1EJSuTdGnM6qbVC4B5DSmozPTqIag9fSzXRNNo+humQLG89XpPgdt16Ia56ORD7s+H8Pmyx44uczDQ0yDzpg==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.22.4.tgz", + "integrity": "sha512-j8pPKp53/lq9lMXN57S8cFz0MynJk8OWNuUnXct/9KCpKU7DgU3bYMJhwWmcqC0UU29p8Lr0/7KEVcaM6bf47Q==", "cpu": [ "x64" ], @@ -5873,14 +6153,14 @@ ] }, "node_modules/@schematics/angular": { - "version": "18.2.5", - "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-18.2.5.tgz", - "integrity": "sha512-tBXhk9OGT4U6VsBNbuCNl2ITDOF3NYdGrEieIHU+lHSkpJNGZUIGxCgXCETXkmXDq1pe4wFZSKelWjeqYDfX0g==", + "version": "18.2.6", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-18.2.6.tgz", + "integrity": "sha512-Y988EoOEQDLEyHu3414T6AeVUyx21AexBHQNbUNQkK8cxlxyB6m1eH1cx6vFgLRFUTsLVv+C6Ln/ICNTfLcG4A==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/core": "18.2.5", - "@angular-devkit/schematics": "18.2.5", + "@angular-devkit/core": "18.2.6", + "@angular-devkit/schematics": "18.2.6", "jsonc-parser": "3.3.1" }, "engines": { @@ -5890,73 +6170,73 @@ } }, "node_modules/@sentry-internal/browser-utils": { - "version": "8.30.0", - "resolved": "https://registry.npmjs.org/@sentry-internal/browser-utils/-/browser-utils-8.30.0.tgz", - "integrity": "sha512-pwX+awNWaxSOAsBLVLqc1+Hw+Fm1Nci9mbKFA6Ed5YzCG049PnBVQwugpmx2dcyyCqJpORhcIqb9jHdCkYmCiA==", + "version": "8.32.0", + "resolved": "https://registry.npmjs.org/@sentry-internal/browser-utils/-/browser-utils-8.32.0.tgz", + "integrity": "sha512-DpUGhk5O1OVjT0fo9wsbEdO1R/S9gGBRDtn9+FFVeRtieJHwXpeZiLK+tZhTOvaILmtSoTPUEY3L5sK4j5Xq9g==", "license": "MIT", "dependencies": { - "@sentry/core": "8.30.0", - "@sentry/types": "8.30.0", - "@sentry/utils": "8.30.0" + "@sentry/core": "8.32.0", + "@sentry/types": "8.32.0", + "@sentry/utils": "8.32.0" }, "engines": { "node": ">=14.18" } }, "node_modules/@sentry-internal/feedback": { - "version": "8.30.0", - "resolved": "https://registry.npmjs.org/@sentry-internal/feedback/-/feedback-8.30.0.tgz", - "integrity": "sha512-ParFRxQY6helxkwUDmro77Wc5uSIC6rZos88jYMrYwFmoTJaNWf4lDzPyECfdSiSYyzSMZk4dorSUN85Ul7DCg==", + "version": "8.32.0", + "resolved": "https://registry.npmjs.org/@sentry-internal/feedback/-/feedback-8.32.0.tgz", + "integrity": "sha512-XB7hiVJQW1tNzpoXIHbvm3rjipIt7PZiJJtFg2vxaqu/FzdgOcYqQiwIKivJVAKuRZ9rIeJtK1jdXQFOc/TRJA==", "license": "MIT", "dependencies": { - "@sentry/core": "8.30.0", - "@sentry/types": "8.30.0", - "@sentry/utils": "8.30.0" + "@sentry/core": "8.32.0", + "@sentry/types": "8.32.0", + "@sentry/utils": "8.32.0" }, "engines": { "node": ">=14.18" } }, "node_modules/@sentry-internal/replay": { - "version": "8.30.0", - "resolved": "https://registry.npmjs.org/@sentry-internal/replay/-/replay-8.30.0.tgz", - "integrity": "sha512-/KFre+BrovPCiovgAu5N1ErJtkDVzkJA5hV3Jw011AlxRWxrmPwu6+9sV9/rn3tqYAGyq6IggYqeIOHhLh1Ihg==", + "version": "8.32.0", + "resolved": "https://registry.npmjs.org/@sentry-internal/replay/-/replay-8.32.0.tgz", + "integrity": "sha512-yiEUnn2yyo1AIQIFNeRX3tdK8fmyKIkxdFS1WiVQmeYI/hFwYBTZPly0FcO/g3xnRMSA2tvrS+hZEaaXfK4WhA==", "license": "MIT", "dependencies": { - "@sentry-internal/browser-utils": "8.30.0", - "@sentry/core": "8.30.0", - "@sentry/types": "8.30.0", - "@sentry/utils": "8.30.0" + "@sentry-internal/browser-utils": "8.32.0", + "@sentry/core": "8.32.0", + "@sentry/types": "8.32.0", + "@sentry/utils": "8.32.0" }, "engines": { "node": ">=14.18" } }, "node_modules/@sentry-internal/replay-canvas": { - "version": "8.30.0", - "resolved": "https://registry.npmjs.org/@sentry-internal/replay-canvas/-/replay-canvas-8.30.0.tgz", - "integrity": "sha512-y/QqcvchhtMlVA6eOZicIfTxtZarazQZJuFW0018ynPxBTiuuWSxMCLqduulXUYsFejfD8/eKHb3BpCIFdDYjg==", + "version": "8.32.0", + "resolved": "https://registry.npmjs.org/@sentry-internal/replay-canvas/-/replay-canvas-8.32.0.tgz", + "integrity": "sha512-oBbhtDBkD+5z/T0NVJ5VenBWAid/S9QdVrod/UqxVqU7F8N+E9/INFQI48zCWr4iVlUMcszJPDElvJEsMDvvBQ==", "license": "MIT", "dependencies": { - "@sentry-internal/replay": "8.30.0", - "@sentry/core": "8.30.0", - "@sentry/types": "8.30.0", - "@sentry/utils": "8.30.0" + "@sentry-internal/replay": "8.32.0", + "@sentry/core": "8.32.0", + "@sentry/types": "8.32.0", + "@sentry/utils": "8.32.0" }, "engines": { "node": ">=14.18" } }, "node_modules/@sentry/angular": { - "version": "8.30.0", - "resolved": "https://registry.npmjs.org/@sentry/angular/-/angular-8.30.0.tgz", - "integrity": "sha512-JTHJJLRlR4UyizZxIA0ZkiQGSH7By/kOSJii4ePqM192+pOwKSN06HxxQGAjWTt5rkbRDNowZN8bt/KyLLMKyg==", + "version": "8.32.0", + "resolved": "https://registry.npmjs.org/@sentry/angular/-/angular-8.32.0.tgz", + "integrity": "sha512-HgdpLFTdAMgTG4yz6mb9umg+yGlCkuRDqC4Wv1zNW7ARoSioavyz4kMRkKqJR6hxgGh2vPoXCz6E+w8L4k9oPg==", "license": "MIT", "dependencies": { - "@sentry/browser": "8.30.0", - "@sentry/core": "8.30.0", - "@sentry/types": "8.30.0", - "@sentry/utils": "8.30.0", + "@sentry/browser": "8.32.0", + "@sentry/core": "8.32.0", + "@sentry/types": "8.32.0", + "@sentry/utils": "8.32.0", "tslib": "^2.4.1" }, "engines": { @@ -5970,57 +6250,72 @@ } }, "node_modules/@sentry/browser": { - "version": "8.30.0", - "resolved": "https://registry.npmjs.org/@sentry/browser/-/browser-8.30.0.tgz", - "integrity": "sha512-M+tKqawH9S3CqlAIcqdZcHbcsNQkEa9MrPqPCYvXco3C4LRpNizJP2XwBiGQY2yK+fOSvbaWpPtlI938/wuRZQ==", + "version": "8.32.0", + "resolved": "https://registry.npmjs.org/@sentry/browser/-/browser-8.32.0.tgz", + "integrity": "sha512-AEKFj64g4iYwEMRvVcxiY0FswmClRXCP1IEvCqujn8OBS8AjMOr1z/RwYieEs0D90yNNB3YEqF8adrKENblJmw==", "license": "MIT", "dependencies": { - "@sentry-internal/browser-utils": "8.30.0", - "@sentry-internal/feedback": "8.30.0", - "@sentry-internal/replay": "8.30.0", - "@sentry-internal/replay-canvas": "8.30.0", - "@sentry/core": "8.30.0", - "@sentry/types": "8.30.0", - "@sentry/utils": "8.30.0" + "@sentry-internal/browser-utils": "8.32.0", + "@sentry-internal/feedback": "8.32.0", + "@sentry-internal/replay": "8.32.0", + "@sentry-internal/replay-canvas": "8.32.0", + "@sentry/core": "8.32.0", + "@sentry/types": "8.32.0", + "@sentry/utils": "8.32.0" }, "engines": { "node": ">=14.18" } }, "node_modules/@sentry/core": { - "version": "8.30.0", - "resolved": "https://registry.npmjs.org/@sentry/core/-/core-8.30.0.tgz", - "integrity": "sha512-CJ/FuWLw0QEKGKXGL/nm9eaOdajEcmPekLuHAuOCxID7N07R9l9laz3vFbAkUZ97GGDv3sYrJZgywfY3Moropg==", + "version": "8.32.0", + "resolved": "https://registry.npmjs.org/@sentry/core/-/core-8.32.0.tgz", + "integrity": "sha512-+xidTr0lZ0c755tq4k75dXPEb8PA+qvIefW3U9+dQMORLokBrYoKYMf5zZTG2k/OfSJS6OSxatUj36NFuCs3aA==", "license": "MIT", "dependencies": { - "@sentry/types": "8.30.0", - "@sentry/utils": "8.30.0" + "@sentry/types": "8.32.0", + "@sentry/utils": "8.32.0" }, "engines": { "node": ">=14.18" } }, "node_modules/@sentry/types": { - "version": "8.30.0", - "resolved": "https://registry.npmjs.org/@sentry/types/-/types-8.30.0.tgz", - "integrity": "sha512-kgWW2BCjBmVlSQRG32GonHEVyeDbys74xf9mLPvynwHTgw3+NUlNAlEdu05xnb2ow4bCTHfbkS5G1zRgyv5k4Q==", + "version": "8.32.0", + "resolved": "https://registry.npmjs.org/@sentry/types/-/types-8.32.0.tgz", + "integrity": "sha512-hxckvN2MzS5SgGDgVQ0/QpZXk13Vrq4BtZLwXhPhyeTmZtUiUfWvcL5TFQqLinfKdTKPe9q2MxeAJ0D4LalhMg==", "license": "MIT", "engines": { "node": ">=14.18" } }, "node_modules/@sentry/utils": { - "version": "8.30.0", - "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-8.30.0.tgz", - "integrity": "sha512-wZxU2HWlzsnu8214Xy7S7cRIuD6h8Z5DnnkojJfX0i0NLooepZQk2824el1Q13AakLb7/S8CHSHXOMnCtoSduw==", + "version": "8.32.0", + "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-8.32.0.tgz", + "integrity": "sha512-t1WVERhgmYURxbBj9J4/H2P2X+VKqm7B3ce9iQyrZbdf5NekhcU4jHIecPUWCPHjQkFIqkVTorqeBmDTlg/UmQ==", "license": "MIT", "dependencies": { - "@sentry/types": "8.30.0" + "@sentry/types": "8.32.0" }, "engines": { "node": ">=14.18" } }, + "node_modules/@siemens/ngx-datatable": { + "version": "22.4.1", + "resolved": "https://registry.npmjs.org/@siemens/ngx-datatable/-/ngx-datatable-22.4.1.tgz", + "integrity": "sha512-Z19zaxu7tpwMHWc1h5Om9/sZJ39MWTQypju6T6WH7QIkelKgZE7DbYk3siD41vkR/62vT+q0Z1voC2OyxgRX9g==", + "license": "MIT", + "dependencies": { + "tslib": "^2.3.0" + }, + "peerDependencies": { + "@angular/common": ">=17.0.0", + "@angular/core": ">=17.0.0", + "@angular/platform-browser": ">=17.0.0", + "rxjs": "^7.8.0" + } + }, "node_modules/@sigstore/bundle": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/@sigstore/bundle/-/bundle-2.3.2.tgz", @@ -6265,6 +6560,35 @@ "integrity": "sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==", "license": "ISC" }, + "node_modules/@ts-morph/common": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@ts-morph/common/-/common-0.23.0.tgz", + "integrity": "sha512-m7Lllj9n/S6sOkCkRftpM7L24uvmfXQFedlW/4hENcuJH1HHm9u5EgxZb9uVjQSCGrbBWBkOGgcTxNg36r6ywA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-glob": "^3.3.2", + "minimatch": "^9.0.3", + "mkdirp": "^3.0.1", + "path-browserify": "^1.0.1" + } + }, + "node_modules/@ts-morph/common/node_modules/mkdirp": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz", + "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==", + "dev": true, + "license": "MIT", + "bin": { + "mkdirp": "dist/cjs/src/bin.js" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/@tsconfig/node10": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", @@ -6317,6 +6641,16 @@ "node": "^16.14.0 || >=18.0.0" } }, + "node_modules/@tybys/wasm-util": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.9.0.tgz", + "integrity": "sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.4.0" + } + }, "node_modules/@types/babel__core": { "version": "7.20.5", "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", @@ -6435,9 +6769,9 @@ } }, "node_modules/@types/estree": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", - "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", + "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", "dev": true, "license": "MIT" }, @@ -6455,9 +6789,22 @@ } }, "node_modules/@types/express-serve-static-core": { - "version": "4.19.5", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.5.tgz", - "integrity": "sha512-y6W03tvrACO72aijJ5uF02FRq5cgDR9lUxddQ8vyF+GvmjJQqbzDcJngEjURc+ZsG31VI3hODNZJ2URj86pzmg==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.0.0.tgz", + "integrity": "sha512-AbXMTZGt40T+KON9/Fdxx0B2WK5hsgxcfXJLr5bFpZ7b4JCex2WyQPTEKdXqfHiY5nKKBScZ7yCoO6Pvgxfvnw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/express/node_modules/@types/express-serve-static-core": { + "version": "4.19.6", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.6.tgz", + "integrity": "sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A==", "dev": true, "license": "MIT", "dependencies": { @@ -6562,9 +6909,9 @@ "license": "MIT" }, "node_modules/@types/lodash": { - "version": "4.17.7", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.7.tgz", - "integrity": "sha512-8wTvZawATi/lsmNu10/j2hk1KEP0IvjubqPE3cu1Xz7xfXXt5oCq3SNUz4fMIP4XGF9Ky+Ue2tBA3hcS7LSBlA==", + "version": "4.17.9", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.9.tgz", + "integrity": "sha512-w9iWudx1XWOHW5lQRS9iKpK/XuRhnN+0T7HvdCCd802FYkT1AMTnxndJHGrNJwRoRHkslGr4S29tjm1cT7x/7w==", "dev": true, "license": "MIT" }, @@ -6596,9 +6943,9 @@ } }, "node_modules/@types/node": { - "version": "22.5.5", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.5.5.tgz", - "integrity": "sha512-Xjs4y5UPO/CLdzpgR6GirZJx36yScjh73+2NlLlkFRSoQN8B0DpfXPdZGnvVmLRLOsqDpOfTNv7D9trgGhmOIA==", + "version": "22.7.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.7.3.tgz", + "integrity": "sha512-qXKfhXXqGTyBskvWEzJZPUxSslAiLaB6JGP1ic/XTH9ctGgzdgYguuLP1C601aRTSDNlLb0jbKqXjZ48GNraSA==", "dev": true, "license": "MIT", "dependencies": { @@ -6646,9 +6993,9 @@ "license": "MIT" }, "node_modules/@types/react": { - "version": "18.3.7", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.7.tgz", - "integrity": "sha512-KUnDCJF5+AiZd8owLIeVHqmW9yM4sqmDVf2JRJiBMFkGvkoZ4/WyV2lL4zVsoinmRS/W3FeEdZLEWFRofnT2FQ==", + "version": "18.3.9", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.9.tgz", + "integrity": "sha512-+BpAVyTpJkNWWSSnaLBk6ePpHLOGJKnEQNbINNovPWzvEUyAe3e+/d494QdEh71RekM/qV7lw6jzf1HGrJyAtQ==", "license": "MIT", "dependencies": { "@types/prop-types": "*", @@ -6802,17 +7149,17 @@ "license": "MIT" }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.6.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.6.0.tgz", - "integrity": "sha512-UOaz/wFowmoh2G6Mr9gw60B1mm0MzUtm6Ic8G2yM1Le6gyj5Loi/N+O5mocugRGY+8OeeKmkMmbxNqUCq3B4Sg==", + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.7.0.tgz", + "integrity": "sha512-RIHOoznhA3CCfSTFiB6kBGLQtB/sox+pJ6jeFu6FxJvqL8qRxq/FfGO/UhsGgQM9oGdXkV4xUgli+dt26biB6A==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.6.0", - "@typescript-eslint/type-utils": "8.6.0", - "@typescript-eslint/utils": "8.6.0", - "@typescript-eslint/visitor-keys": "8.6.0", + "@typescript-eslint/scope-manager": "8.7.0", + "@typescript-eslint/type-utils": "8.7.0", + "@typescript-eslint/utils": "8.7.0", + "@typescript-eslint/visitor-keys": "8.7.0", "graphemer": "^1.4.0", "ignore": "^5.3.1", "natural-compare": "^1.4.0", @@ -6836,16 +7183,16 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "8.6.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.6.0.tgz", - "integrity": "sha512-eQcbCuA2Vmw45iGfcyG4y6rS7BhWfz9MQuk409WD47qMM+bKCGQWXxvoOs1DUp+T7UBMTtRTVT+kXr7Sh4O9Ow==", + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.7.0.tgz", + "integrity": "sha512-lN0btVpj2unxHlNYLI//BQ7nzbMJYBVQX5+pbNXvGYazdlgYonMn4AhhHifQ+J4fGRYA/m1DjaQjx+fDetqBOQ==", "dev": true, "license": "BSD-2-Clause", "dependencies": { - "@typescript-eslint/scope-manager": "8.6.0", - "@typescript-eslint/types": "8.6.0", - "@typescript-eslint/typescript-estree": "8.6.0", - "@typescript-eslint/visitor-keys": "8.6.0", + "@typescript-eslint/scope-manager": "8.7.0", + "@typescript-eslint/types": "8.7.0", + "@typescript-eslint/typescript-estree": "8.7.0", + "@typescript-eslint/visitor-keys": "8.7.0", "debug": "^4.3.4" }, "engines": { @@ -6865,14 +7212,14 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.6.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.6.0.tgz", - "integrity": "sha512-ZuoutoS5y9UOxKvpc/GkvF4cuEmpokda4wRg64JEia27wX+PysIE9q+lzDtlHHgblwUWwo5/Qn+/WyTUvDwBHw==", + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.7.0.tgz", + "integrity": "sha512-87rC0k3ZlDOuz82zzXRtQ7Akv3GKhHs0ti4YcbAJtaomllXoSO8hi7Ix3ccEvCd824dy9aIX+j3d2UMAfCtVpg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.6.0", - "@typescript-eslint/visitor-keys": "8.6.0" + "@typescript-eslint/types": "8.7.0", + "@typescript-eslint/visitor-keys": "8.7.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -6883,14 +7230,14 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "8.6.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.6.0.tgz", - "integrity": "sha512-dtePl4gsuenXVwC7dVNlb4mGDcKjDT/Ropsk4za/ouMBPplCLyznIaR+W65mvCvsyS97dymoBRrioEXI7k0XIg==", + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.7.0.tgz", + "integrity": "sha512-tl0N0Mj3hMSkEYhLkjREp54OSb/FI6qyCzfiiclvJvOqre6hsZTGSnHtmFLDU8TIM62G7ygEa1bI08lcuRwEnQ==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/typescript-estree": "8.6.0", - "@typescript-eslint/utils": "8.6.0", + "@typescript-eslint/typescript-estree": "8.7.0", + "@typescript-eslint/utils": "8.7.0", "debug": "^4.3.4", "ts-api-utils": "^1.3.0" }, @@ -6908,9 +7255,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "8.6.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.6.0.tgz", - "integrity": "sha512-rojqFZGd4MQxw33SrOy09qIDS8WEldM8JWtKQLAjf/X5mGSeEFh5ixQlxssMNyPslVIk9yzWqXCsV2eFhYrYUw==", + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.7.0.tgz", + "integrity": "sha512-LLt4BLHFwSfASHSF2K29SZ+ZCsbQOM+LuarPjRUuHm+Qd09hSe3GCeaQbcCr+Mik+0QFRmep/FyZBO6fJ64U3w==", "dev": true, "license": "MIT", "engines": { @@ -6922,14 +7269,14 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.6.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.6.0.tgz", - "integrity": "sha512-MOVAzsKJIPIlLK239l5s06YXjNqpKTVhBVDnqUumQJja5+Y94V3+4VUFRA0G60y2jNnTVwRCkhyGQpavfsbq/g==", + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.7.0.tgz", + "integrity": "sha512-MC8nmcGHsmfAKxwnluTQpNqceniT8SteVwd2voYlmiSWGOtjvGXdPl17dYu2797GVscK30Z04WRM28CrKS9WOg==", "dev": true, "license": "BSD-2-Clause", "dependencies": { - "@typescript-eslint/types": "8.6.0", - "@typescript-eslint/visitor-keys": "8.6.0", + "@typescript-eslint/types": "8.7.0", + "@typescript-eslint/visitor-keys": "8.7.0", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", @@ -6951,16 +7298,16 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "8.6.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.6.0.tgz", - "integrity": "sha512-eNp9cWnYf36NaOVjkEUznf6fEgVy1TWpE0o52e4wtojjBx7D1UV2WAWGzR+8Y5lVFtpMLPwNbC67T83DWSph4A==", + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.7.0.tgz", + "integrity": "sha512-ZbdUdwsl2X/s3CiyAu3gOlfQzpbuG3nTWKPoIvAu1pu5r8viiJvv2NPN2AqArL35NCYtw/lrPPfM4gxrMLNLPw==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "8.6.0", - "@typescript-eslint/types": "8.6.0", - "@typescript-eslint/typescript-estree": "8.6.0" + "@typescript-eslint/scope-manager": "8.7.0", + "@typescript-eslint/types": "8.7.0", + "@typescript-eslint/typescript-estree": "8.7.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -6974,13 +7321,13 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.6.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.6.0.tgz", - "integrity": "sha512-wapVFfZg9H0qOYh4grNVQiMklJGluQrOUiOhYRrQWhx7BY/+I1IYb8BczWNbbUpO+pqy0rDciv3lQH5E1bCLrg==", + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.7.0.tgz", + "integrity": "sha512-b1tx0orFCCh/THWPQa2ZwWzvOeyzzp36vkJYOpVg0u8UVOIsfVrnuC9FqAw9gRKn+rG2VmWQ/zDJZzkxUnj/XQ==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.6.0", + "@typescript-eslint/types": "8.7.0", "eslint-visitor-keys": "^3.4.3" }, "engines": { @@ -7192,6 +7539,64 @@ "dev": true, "license": "BSD-2-Clause" }, + "node_modules/@yarnpkg/parsers": { + "version": "3.0.0-rc.46", + "resolved": "https://registry.npmjs.org/@yarnpkg/parsers/-/parsers-3.0.0-rc.46.tgz", + "integrity": "sha512-aiATs7pSutzda/rq8fnuPwTglyVwjM22bNnK2ZgjrpAjQHSSl3lztd2f9evst1W/qnC58DRz7T7QndUDumAR4Q==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "js-yaml": "^3.10.0", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=14.15.0" + } + }, + "node_modules/@yarnpkg/parsers/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/@yarnpkg/parsers/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@yarnpkg/parsers/node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@zkochan/js-yaml": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/@zkochan/js-yaml/-/js-yaml-0.0.7.tgz", + "integrity": "sha512-nrUSn7hzt7J6JWgWGz78ZYI8wj+gdIJdk0Ynjpp8l+trkn58Uqsf6RYrYkEK+3X18EX+TNdtJI0WxAtc+L84SQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, "node_modules/abbrev": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-2.0.0.tgz", @@ -7581,6 +7986,18 @@ "postcss": "^8.1.0" } }, + "node_modules/axios": { + "version": "1.7.7", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.7.tgz", + "integrity": "sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, "node_modules/axobject-query": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", @@ -8060,9 +8477,9 @@ } }, "node_modules/browserslist": { - "version": "4.23.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.3.tgz", - "integrity": "sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==", + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.0.tgz", + "integrity": "sha512-Rmb62sR1Zpjql25eSanFGEhAxcFwfA1K0GuQcLoaJBAcENegrQut3hYdhXFF1obQfiDyqIW/cLM5HSJ/9k884A==", "funding": [ { "type": "opencollective", @@ -8079,8 +8496,8 @@ ], "license": "MIT", "dependencies": { - "caniuse-lite": "^1.0.30001646", - "electron-to-chromium": "^1.5.4", + "caniuse-lite": "^1.0.30001663", + "electron-to-chromium": "^1.5.28", "node-releases": "^2.0.18", "update-browserslist-db": "^1.1.0" }, @@ -8274,9 +8691,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001660", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001660.tgz", - "integrity": "sha512-GacvNTTuATm26qC74pt+ad1fW15mlQ/zuTzzY1ZoIzECTP8HURDfF43kNxPgf7H1jmelCBQTTbBNxdSXOA7Bqg==", + "version": "1.0.30001664", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001664.tgz", + "integrity": "sha512-AmE7k4dXiNKQipgn7a2xg558IRqPN3jMQY/rOsbxDhrd0tyChwbITBfiwtnqz8bi2M5mIWbxAYBvk7W7QBUS2g==", "funding": [ { "type": "opencollective", @@ -8602,6 +9019,13 @@ "node": ">= 0.12.0" } }, + "node_modules/code-block-writer": { + "version": "13.0.2", + "resolved": "https://registry.npmjs.org/code-block-writer/-/code-block-writer-13.0.2.tgz", + "integrity": "sha512-XfXzAGiStXSmCIwrkdfvc7FS5Dtj8yelCtyOf2p2skCAfvLd6zu0rGzuS9NSCO3bq1JKpFZ7tbKdKlcd5occQA==", + "dev": true, + "license": "MIT" + }, "node_modules/collapse-white-space": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-2.1.0.tgz", @@ -9905,9 +10329,9 @@ } }, "node_modules/dompurify": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.1.6.tgz", - "integrity": "sha512-cTOAhc36AalkjtBpfG6O8JimdTMWNXjiePT2xQH/ppBGi/4uIpmj8eKyIkMJErXWARyINV/sB38yf8JCLF5pbQ==", + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.1.7.tgz", + "integrity": "sha512-VaTstWtsneJY8xzy7DekmYWEOZcmzIe3Qb3zPd4STve1OBTa+e+WmS1ITQec1fZYXI3HCsOZZiSMpG6oxoWMWQ==", "license": "(MPL-2.0 OR Apache-2.0)" }, "node_modules/domutils": { @@ -9925,6 +10349,42 @@ "url": "https://github.com/fb55/domutils?sponsor=1" } }, + "node_modules/dotenv": { + "version": "16.4.5", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz", + "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/dotenv-expand": { + "version": "11.0.6", + "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-11.0.6.tgz", + "integrity": "sha512-8NHi73otpWsZGBSZwwknTXS5pqMOrk9+Ssrna8xCaxkzEpU9OTf9R5ArQGVw03//Zmk9MOwLPng9WwndvpAJ5g==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "dotenv": "^16.4.4" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/duplexer": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", + "dev": true, + "license": "MIT" + }, "node_modules/eastasianwidth": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", @@ -9956,9 +10416,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.5.25", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.25.tgz", - "integrity": "sha512-kMb204zvK3PsSlgvvwzI3wBIcAw15tRkYk+NQdsjdDtcQWTp2RABbMQ9rUBy8KNEOM+/E6ep+XC3AykiWZld4g==", + "version": "1.5.29", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.29.tgz", + "integrity": "sha512-PF8n2AlIhCKXQ+gTpiJi0VhcHDb69kYX4MtCiivctc2QD3XuNZ/XIOlbGzt7WAjjEev0TtaH6Cu3arZExm5DOw==", "license": "ISC" }, "node_modules/emittery": { @@ -10026,6 +10486,16 @@ "node": ">=0.10.0" } }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "once": "^1.4.0" + } + }, "node_modules/enhanced-resolve": { "version": "5.17.1", "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz", @@ -10040,6 +10510,19 @@ "node": ">=10.13.0" } }, + "node_modules/enquirer": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", + "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-colors": "^4.1.1" + }, + "engines": { + "node": ">=8.6" + } + }, "node_modules/entities": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", @@ -10216,21 +10699,24 @@ } }, "node_modules/eslint": { - "version": "9.11.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.11.0.tgz", - "integrity": "sha512-yVS6XODx+tMFMDFcG4+Hlh+qG7RM6cCJXtQhCKLSsr3XkLvWggHjCqjfh0XsPPnt1c56oaT6PMgW9XWQQjdHXA==", + "version": "9.11.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.11.1.tgz", + "integrity": "sha512-MobhYKIoAO1s1e4VUrgx1l1Sk2JBR/Gqjjgw8+mfgoLE2xwsHur4gdfTxyTgShrhvdVFTaJSgMiQBl1jv/AWxg==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.11.0", "@eslint/config-array": "^0.18.0", + "@eslint/core": "^0.6.0", "@eslint/eslintrc": "^3.1.0", - "@eslint/js": "9.11.0", + "@eslint/js": "9.11.1", "@eslint/plugin-kit": "^0.2.0", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.3.0", "@nodelib/fs.walk": "^1.2.8", + "@types/estree": "^1.0.6", + "@types/json-schema": "^7.0.15", "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", @@ -11193,9 +11679,9 @@ "license": "MIT" }, "node_modules/fast-uri": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.1.tgz", - "integrity": "sha512-MWipKbbYiYI0UC7cl8m/i/IWTqfC8YXsqjzybjddLsFjStroQzsHXkc73JutMvBiXmOvapk+axIl79ig5t55Bw==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.2.tgz", + "integrity": "sha512-GR6f0hD7XXyNJa25Tb9BuIdN0tdr+0BMi6/CJPH3wJO1JjNG3n/VsSw38AwRdKZABm8lGbPfakLRkYzx2V9row==", "dev": true, "license": "MIT" }, @@ -11236,6 +11722,22 @@ "integrity": "sha512-FJqqoDBR00Mdj9ppamLa/Y7vxm+PRmNWA67N846RvsoYVMKB4q3y/de5PA7gUmRMYK/8CMz2GDZQmCRN1wBcWA==", "license": "MIT" }, + "node_modules/figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "dev": true, + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^1.0.5" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/file-entry-cache": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", @@ -11498,6 +12000,79 @@ "node": ">= 0.6" } }, + "node_modules/front-matter": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/front-matter/-/front-matter-4.0.2.tgz", + "integrity": "sha512-I8ZuJ/qG92NWX8i5x1Y8qyj3vizhXS31OxjKDu3LKP+7/qBgfIKValiZIEwoVoJKUHlhWtYrktkxV1XsX+pPlg==", + "dev": true, + "license": "MIT", + "dependencies": { + "js-yaml": "^3.13.1" + } + }, + "node_modules/front-matter/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/front-matter/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/front-matter/node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "dev": true, + "license": "MIT" + }, + "node_modules/fs-extra": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", + "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/fs-extra/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, "node_modules/fs-minipass": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.3.tgz", @@ -15008,6 +15583,29 @@ "dev": true, "license": "MIT" }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jsonfile/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, "node_modules/jsonparse": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", @@ -16336,9 +16934,9 @@ "license": "MIT" }, "node_modules/monaco-editor": { - "version": "0.52.0", - "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.52.0.tgz", - "integrity": "sha512-OeWhNpABLCeTqubfqLMXGsqf6OmPU6pHM85kF3dhy6kq5hnhuVS1p3VrEW/XhWHc71P2tHyS5JFySD8mgs1crw==", + "version": "0.51.0", + "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.51.0.tgz", + "integrity": "sha512-xaGwVV1fq343cM7aOYB6lVE4Ugf0UyimdD/x5PWcWBMKENwectaEu77FAN7c5sFiyumqeJdX1RPTh1ocioyDjw==", "license": "MIT" }, "node_modules/moo-color": { @@ -16565,6 +17163,34 @@ "@angular/core": "^18.0.0" } }, + "node_modules/ngxtension": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/ngxtension/-/ngxtension-4.0.0.tgz", + "integrity": "sha512-67hzWhQHqUWui9bOwmXast08zDGMlWR38TUhP7FAooFPETGHUCm/134dIo8BdKFTgHpy9Eux8EOkZH31NX6qnw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@angular-eslint/bundled-angular-compiler": "^18.0.1", + "@nx/devkit": "^19.0.0", + "nx": "^19.0.0", + "ts-morph": "^22.0.0", + "tslib": "^2.3.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@angular/common": ">=16.0.0", + "@angular/core": ">=16.0.0", + "@use-gesture/vanilla": "^10.0.0", + "rxjs": "^6.0.0 || ^7.0.0" + }, + "peerDependenciesMeta": { + "@use-gesture/vanilla": { + "optional": true + } + } + }, "node_modules/nice-napi": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/nice-napi/-/nice-napi-1.0.2.tgz", @@ -16758,6 +17384,13 @@ "dev": true, "license": "MIT" }, + "node_modules/node-machine-id": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/node-machine-id/-/node-machine-id-1.1.12.tgz", + "integrity": "sha512-QNABxbrPa3qEIfrE6GOJ7BYIuignnJw7iQ2YPbc3Nla1HzRJjXzZOiikfF8m7eAMfichLt3M4VgLOetqgDmgGQ==", + "dev": true, + "license": "MIT" + }, "node_modules/node-releases": { "version": "2.0.18", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", @@ -16962,6 +17595,357 @@ "dev": true, "license": "MIT" }, + "node_modules/nx": { + "version": "19.6.5", + "resolved": "https://registry.npmjs.org/nx/-/nx-19.6.5.tgz", + "integrity": "sha512-igPYPsBF1BM1YxEiGDvaLOz0CWWoEvxzR7yQg3iULjGG9zKgDFNHHIHJwkyHsCBTtMhhkgeUl16PsTVgDuil3A==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "@napi-rs/wasm-runtime": "0.2.4", + "@nrwl/tao": "19.6.5", + "@yarnpkg/lockfile": "^1.1.0", + "@yarnpkg/parsers": "3.0.0-rc.46", + "@zkochan/js-yaml": "0.0.7", + "axios": "^1.7.4", + "chalk": "^4.1.0", + "cli-cursor": "3.1.0", + "cli-spinners": "2.6.1", + "cliui": "^8.0.1", + "dotenv": "~16.4.5", + "dotenv-expand": "~11.0.6", + "enquirer": "~2.3.6", + "figures": "3.2.0", + "flat": "^5.0.2", + "front-matter": "^4.0.2", + "fs-extra": "^11.1.0", + "ignore": "^5.0.4", + "jest-diff": "^29.4.1", + "jsonc-parser": "3.2.0", + "lines-and-columns": "~2.0.3", + "minimatch": "9.0.3", + "node-machine-id": "1.1.12", + "npm-run-path": "^4.0.1", + "open": "^8.4.0", + "ora": "5.3.0", + "semver": "^7.5.3", + "string-width": "^4.2.3", + "strong-log-transformer": "^2.1.0", + "tar-stream": "~2.2.0", + "tmp": "~0.2.1", + "tsconfig-paths": "^4.1.2", + "tslib": "^2.3.0", + "yargs": "^17.6.2", + "yargs-parser": "21.1.1" + }, + "bin": { + "nx": "bin/nx.js", + "nx-cloud": "bin/nx-cloud.js" + }, + "optionalDependencies": { + "@nx/nx-darwin-arm64": "19.6.5", + "@nx/nx-darwin-x64": "19.6.5", + "@nx/nx-freebsd-x64": "19.6.5", + "@nx/nx-linux-arm-gnueabihf": "19.6.5", + "@nx/nx-linux-arm64-gnu": "19.6.5", + "@nx/nx-linux-arm64-musl": "19.6.5", + "@nx/nx-linux-x64-gnu": "19.6.5", + "@nx/nx-linux-x64-musl": "19.6.5", + "@nx/nx-win32-arm64-msvc": "19.6.5", + "@nx/nx-win32-x64-msvc": "19.6.5" + }, + "peerDependencies": { + "@swc-node/register": "^1.8.0", + "@swc/core": "^1.3.85" + }, + "peerDependenciesMeta": { + "@swc-node/register": { + "optional": true + }, + "@swc/core": { + "optional": true + } + } + }, + "node_modules/nx/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/nx/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/nx/node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nx/node_modules/cli-spinners": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.6.1.tgz", + "integrity": "sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/nx/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/nx/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/nx/node_modules/define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/nx/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/nx/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/nx/node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "dev": true, + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/nx/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/nx/node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nx/node_modules/jsonc-parser": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", + "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", + "dev": true, + "license": "MIT" + }, + "node_modules/nx/node_modules/lines-and-columns": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-2.0.4.tgz", + "integrity": "sha512-wM1+Z03eypVAVUCE7QdSqpVIvelbOakn1M0bPDoA4SGWPx3sNDVUiMo3L6To6WWGClB7VyXnhQ4Sn7gxiJbE6A==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/nx/node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/nx/node_modules/open": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", + "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/nx/node_modules/ora": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.3.0.tgz", + "integrity": "sha512-zAKMgGXUim0Jyd6CXK9lraBnD3H5yPGBPPOkC23a2BG6hsm4Zu6OQSjQuEtV0BHDf4aKHcUFvJiGRrFuW3MG8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "bl": "^4.0.3", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "log-symbols": "^4.0.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/nx/node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nx/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/nx/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nx/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nx/node_modules/tmp": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.3.tgz", + "integrity": "sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.14" + } + }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -17212,9 +18196,9 @@ } }, "node_modules/ordered-binary": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/ordered-binary/-/ordered-binary-1.5.1.tgz", - "integrity": "sha512-5VyHfHY3cd0iza71JepYG50My+YUbrFtGoUz2ooEydPyPM7Aai/JW098juLr+RG6+rDJuzNNTsEQu2DZa1A41A==", + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/ordered-binary/-/ordered-binary-1.5.2.tgz", + "integrity": "sha512-JTo+4+4Fw7FreyAvlSLjb1BBVaxEQAacmjD3jjuyPZclpbEghTvQZbXBb2qPd2LeIMxiHwXBZUcpmG2Gl/mDEA==", "dev": true, "license": "MIT" }, @@ -17315,9 +18299,9 @@ } }, "node_modules/package-json-from-dist": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz", - "integrity": "sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", "devOptional": true, "license": "BlueOak-1.0.0" }, @@ -17465,6 +18449,13 @@ "node": ">= 0.8" } }, + "node_modules/path-browserify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", + "dev": true, + "license": "MIT" + }, "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -17894,9 +18885,9 @@ "license": "MIT" }, "node_modules/posthog-js": { - "version": "1.163.0", - "resolved": "https://registry.npmjs.org/posthog-js/-/posthog-js-1.163.0.tgz", - "integrity": "sha512-gpLbxZkOm06oOWg0uvCxBIVIHrhX3A5hxf9eAi/Z+aFP9DvWxwHQdGUkIWjnYUyxXilIbLxBPvWmiM98dYsAHA==", + "version": "1.165.0", + "resolved": "https://registry.npmjs.org/posthog-js/-/posthog-js-1.165.0.tgz", + "integrity": "sha512-rUfRJobvOz3Q9Er+zwb32Eq2qs+ToBe/B4k4IoKzmyszI7240Rf4xVWRB0ky8LvmdZfCeYX5knS2Uv3pnn/d5A==", "license": "MIT", "dependencies": { "fflate": "^0.4.8", @@ -17905,9 +18896,9 @@ } }, "node_modules/preact": { - "version": "10.24.0", - "resolved": "https://registry.npmjs.org/preact/-/preact-10.24.0.tgz", - "integrity": "sha512-aK8Cf+jkfyuZ0ZZRG9FbYqwmEiGQ4y/PUO4SuTWoyWL244nZZh7bd5h2APd4rSNDYTBNghg1L+5iJN3Skxtbsw==", + "version": "10.24.1", + "resolved": "https://registry.npmjs.org/preact/-/preact-10.24.1.tgz", + "integrity": "sha512-PnBAwFI3Yjxxcxw75n6VId/5TFxNW/81zexzWD9jn1+eSrOP84NdsS38H5IkF/UH3frqRPT+MvuCoVHjTDTnDw==", "license": "MIT", "funding": { "type": "opencollective", @@ -18073,6 +19064,13 @@ "node": ">= 0.10" } }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "dev": true, + "license": "MIT" + }, "node_modules/prr": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", @@ -18712,9 +19710,9 @@ } }, "node_modules/rimraf/node_modules/jackspeak": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.0.1.tgz", - "integrity": "sha512-cub8rahkh0Q/bw1+GxP7aeSe29hHHn2V4m29nnDlvCdlgU+3UGxkZp7Z53jLUdpX3jdTO0nJZUDl3xvbWc2Xog==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.0.2.tgz", + "integrity": "sha512-bZsjR/iRjl1Nk1UkjGpAzLNfQtzuijhn2g+pbZb98HQ1Gk8vM9hfbxeMBP+M2/UUdwj0RqGG3mlvk2MsAqwvEw==", "devOptional": true, "license": "BlueOak-1.0.0", "dependencies": { @@ -18725,9 +19723,6 @@ }, "funding": { "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" } }, "node_modules/rimraf/node_modules/lru-cache": { @@ -18774,9 +19769,9 @@ } }, "node_modules/rollup": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.20.0.tgz", - "integrity": "sha512-6rbWBChcnSGzIlXeIdNIZTopKYad8ZG8ajhl78lGRLsI2rX8IkaotQhVas2Ma+GPxJav19wrSzvRvuiv0YKzWw==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.22.4.tgz", + "integrity": "sha512-vD8HJ5raRcWOyymsR6Z3o6+RzfEPCnVLMFJ6vRslO1jt4LO6dUo5Qnpg7y4RkZFM2DMe3WUirkI5c16onjrc6A==", "dev": true, "license": "MIT", "dependencies": { @@ -18790,25 +19785,32 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.20.0", - "@rollup/rollup-android-arm64": "4.20.0", - "@rollup/rollup-darwin-arm64": "4.20.0", - "@rollup/rollup-darwin-x64": "4.20.0", - "@rollup/rollup-linux-arm-gnueabihf": "4.20.0", - "@rollup/rollup-linux-arm-musleabihf": "4.20.0", - "@rollup/rollup-linux-arm64-gnu": "4.20.0", - "@rollup/rollup-linux-arm64-musl": "4.20.0", - "@rollup/rollup-linux-powerpc64le-gnu": "4.20.0", - "@rollup/rollup-linux-riscv64-gnu": "4.20.0", - "@rollup/rollup-linux-s390x-gnu": "4.20.0", - "@rollup/rollup-linux-x64-gnu": "4.20.0", - "@rollup/rollup-linux-x64-musl": "4.20.0", - "@rollup/rollup-win32-arm64-msvc": "4.20.0", - "@rollup/rollup-win32-ia32-msvc": "4.20.0", - "@rollup/rollup-win32-x64-msvc": "4.20.0", + "@rollup/rollup-android-arm-eabi": "4.22.4", + "@rollup/rollup-android-arm64": "4.22.4", + "@rollup/rollup-darwin-arm64": "4.22.4", + "@rollup/rollup-darwin-x64": "4.22.4", + "@rollup/rollup-linux-arm-gnueabihf": "4.22.4", + "@rollup/rollup-linux-arm-musleabihf": "4.22.4", + "@rollup/rollup-linux-arm64-gnu": "4.22.4", + "@rollup/rollup-linux-arm64-musl": "4.22.4", + "@rollup/rollup-linux-powerpc64le-gnu": "4.22.4", + "@rollup/rollup-linux-riscv64-gnu": "4.22.4", + "@rollup/rollup-linux-s390x-gnu": "4.22.4", + "@rollup/rollup-linux-x64-gnu": "4.22.4", + "@rollup/rollup-linux-x64-musl": "4.22.4", + "@rollup/rollup-win32-arm64-msvc": "4.22.4", + "@rollup/rollup-win32-ia32-msvc": "4.22.4", + "@rollup/rollup-win32-x64-msvc": "4.22.4", "fsevents": "~2.3.2" } }, + "node_modules/rollup/node_modules/@types/estree": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", + "dev": true, + "license": "MIT" + }, "node_modules/rrweb-cssom": { "version": "0.7.1", "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.7.1.tgz", @@ -18934,9 +19936,9 @@ } }, "node_modules/sass/node_modules/chokidar": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.0.tgz", - "integrity": "sha512-mxIojEAQcuEvT/lyXq+jf/3cO/KoA6z4CeNDGGevTybECPOMFCnQy3OPahluUkbqgPNGw5Bi78UC7Po6Lhy+NA==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.1.tgz", + "integrity": "sha512-n8enUVCED/KVRQlab1hr3MVpcVMvxtZjmEa956u+4YijlmQED223XMSYj2tLuKvr4jcCTzNNMpQDUer72MMmzA==", "dev": true, "license": "MIT", "dependencies": { @@ -19965,6 +20967,24 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/strong-log-transformer": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/strong-log-transformer/-/strong-log-transformer-2.1.0.tgz", + "integrity": "sha512-B3Hgul+z0L9a236FAUC9iZsL+nVHgoCJnqCbN588DjYxvGXaXaaFbfmQ/JhvKjZwsOukuR72XbHv71Qkug0HxA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "duplexer": "^0.1.1", + "minimist": "^1.2.0", + "through": "^2.3.4" + }, + "bin": { + "sl-log-transformer": "bin/sl-log-transformer.js" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/styled-components": { "version": "5.3.11", "resolved": "https://registry.npmjs.org/styled-components/-/styled-components-5.3.11.tgz", @@ -20082,6 +21102,38 @@ "node": ">=10" } }, + "node_modules/tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tar-stream/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/tar/node_modules/fs-minipass": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", @@ -20339,6 +21391,13 @@ "tslib": "^2" } }, + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", + "dev": true, + "license": "MIT" + }, "node_modules/thunky": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", @@ -20353,22 +21412,22 @@ "license": "MIT" }, "node_modules/tldts": { - "version": "6.1.46", - "resolved": "https://registry.npmjs.org/tldts/-/tldts-6.1.46.tgz", - "integrity": "sha512-fw81lXV2CijkNrZAZvee7wegs+EOlTyIuVl/z4q6OUzZHQ1jGL2xQzKXq9geYf/1tzo9LZQLrkcko2m8HLh+rg==", + "version": "6.1.47", + "resolved": "https://registry.npmjs.org/tldts/-/tldts-6.1.47.tgz", + "integrity": "sha512-R/K2tZ5MiY+mVrnSkNJkwqYT2vUv1lcT6wJvd2emGaMJ7PHUGRY4e3tUsdFCXgqxi2QgbHjL3yJgXCo40v9Hxw==", "dev": true, "license": "MIT", "dependencies": { - "tldts-core": "^6.1.46" + "tldts-core": "^6.1.47" }, "bin": { "tldts": "bin/cli.js" } }, "node_modules/tldts-core": { - "version": "6.1.46", - "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-6.1.46.tgz", - "integrity": "sha512-zA3ai/j4aFcmbqTvTONkSBuWs0Q4X4tJxa0gV9sp6kDbq5dAhQDSg0WUkReEm0fBAKAGNj+wPKCCsR8MYOYmwA==", + "version": "6.1.47", + "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-6.1.47.tgz", + "integrity": "sha512-6SWyFMnlst1fEt7GQVAAu16EGgFK0cLouH/2Mk6Ftlwhv3Ol40L0dlpGMcnnNiiOMyD2EV/aF3S+U2nKvvLvrA==", "dev": true, "license": "MIT" }, @@ -20567,6 +21626,17 @@ } } }, + "node_modules/ts-morph": { + "version": "22.0.0", + "resolved": "https://registry.npmjs.org/ts-morph/-/ts-morph-22.0.0.tgz", + "integrity": "sha512-M9MqFGZREyeb5fTl6gNHKZLqBQA0TjA1lea+CR48R8EBTDuWrNqW6ccC5QvjNR4s6wDumD3LTCjOFSp9iwlzaw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@ts-morph/common": "~0.23.0", + "code-block-writer": "^13.0.1" + } + }, "node_modules/ts-node": { "version": "10.9.2", "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", @@ -21023,9 +22093,9 @@ } }, "node_modules/vite": { - "version": "5.4.6", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.6.tgz", - "integrity": "sha512-IeL5f8OO5nylsgzd9tq4qD2QqI0k2CQLGrWD0rCN0EQJZpBK5vJAx0I+GDkMOXxQX/OfFHMuLIx6ddAxGX/k+Q==", + "version": "5.4.8", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.8.tgz", + "integrity": "sha512-FqrItQ4DT1NC4zCUqMB4c4AZORMKIa0m8/URVCZ77OZ/QSNeJ54bU1vrFADbDsuwfIPcgknRkmqakQcgnL4GiQ==", "dev": true, "license": "MIT", "dependencies": { diff --git a/package.json b/package.json index 056c7b962033..c7308492a9e4 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "artemis", - "version": "7.5.4", + "version": "7.5.5", "description": "Interactive Learning with Individual Feedback", "private": true, "license": "MIT", @@ -13,22 +13,21 @@ "node_modules" ], "dependencies": { - "@angular/animations": "18.2.5", - "@angular/cdk": "18.2.5", - "@angular/common": "18.2.5", - "@angular/compiler": "18.2.5", - "@angular/core": "18.2.5", - "@angular/forms": "18.2.5", - "@angular/localize": "18.2.5", - "@angular/material": "18.2.5", - "@angular/platform-browser": "18.2.5", - "@angular/platform-browser-dynamic": "18.2.5", - "@angular/router": "18.2.5", - "@angular/service-worker": "18.2.5", + "@angular/animations": "18.2.6", + "@angular/cdk": "18.2.6", + "@angular/common": "18.2.6", + "@angular/compiler": "18.2.6", + "@angular/core": "18.2.6", + "@angular/forms": "18.2.6", + "@angular/localize": "18.2.6", + "@angular/material": "18.2.6", + "@angular/platform-browser": "18.2.6", + "@angular/platform-browser-dynamic": "18.2.6", + "@angular/router": "18.2.6", + "@angular/service-worker": "18.2.6", "@ctrl/ngx-emoji-mart": "9.2.0", "@danielmoncada/angular-datetime-picker": "18.1.0", "@fingerprintjs/fingerprintjs": "4.5.0", - "@flaviosantoro92/ngx-datatable": "1.0.2", "@fortawesome/angular-fontawesome": "0.15.0", "@fortawesome/fontawesome-svg-core": "6.6.0", "@fortawesome/free-regular-svg-icons": "6.6.0", @@ -37,7 +36,8 @@ "@ng-bootstrap/ng-bootstrap": "17.0.1", "@ngx-translate/core": "15.0.0", "@ngx-translate/http-loader": "8.0.0", - "@sentry/angular": "8.30.0", + "@sentry/angular": "8.32.0", + "@siemens/ngx-datatable": "22.4.1", "@swimlane/ngx-charts": "20.5.0", "@swimlane/ngx-graph": "8.4.0", "@vscode/codicons": "0.0.36", @@ -47,7 +47,7 @@ "crypto-js": "4.2.0", "dayjs": "1.11.13", "diff-match-patch-typescript": "1.1.0", - "dompurify": "3.1.6", + "dompurify": "3.1.7", "export-to-csv": "1.4.0", "fast-json-patch": "3.1.1", "franc-min": "6.2.0", @@ -58,12 +58,12 @@ "jszip": "3.10.1", "lodash-es": "4.17.21", "mobile-drag-drop": "3.0.0-rc.0", - "monaco-editor": "0.52.0", + "monaco-editor": "0.51.0", "ngx-infinite-scroll": "18.0.0", "ngx-webstorage": "18.0.0", "papaparse": "5.4.1", "pdfjs-dist": "4.6.82", - "posthog-js": "1.163.0", + "posthog-js": "1.165.0", "rxjs": "7.8.1", "showdown": "2.1.0", "showdown-highlight": "3.1.0", @@ -108,7 +108,7 @@ "showdown": "2.1.0" }, "tough-cookie": "5.0.0", - "vite": "5.4.6", + "vite": "5.4.8", "webpack-dev-middleware": "7.4.2", "word-wrap": "1.2.5", "ws": "8.18.0", @@ -116,30 +116,30 @@ }, "devDependencies": { "@angular-builders/jest": "18.0.0", - "@angular-devkit/build-angular": "18.2.5", + "@angular-devkit/build-angular": "18.2.6", "@angular-eslint/builder": "18.3.1", "@angular-eslint/eslint-plugin": "18.3.1", "@angular-eslint/eslint-plugin-template": "18.3.1", "@angular-eslint/schematics": "18.3.1", "@angular-eslint/template-parser": "18.3.1", - "@angular/cli": "18.2.5", - "@angular/compiler-cli": "18.2.5", - "@angular/language-service": "18.2.5", - "@sentry/types": "8.30.0", + "@angular/cli": "18.2.6", + "@angular/compiler-cli": "18.2.6", + "@angular/language-service": "18.2.6", + "@sentry/types": "8.32.0", "@types/crypto-js": "4.2.2", "@types/d3-shape": "3.1.6", "@types/dompurify": "3.0.5", "@types/jest": "29.5.13", "@types/lodash-es": "4.17.12", - "@types/node": "22.5.5", + "@types/node": "22.7.3", "@types/papaparse": "5.3.14", "@types/showdown": "2.0.6", "@types/smoothscroll-polyfill": "0.3.4", "@types/sockjs-client": "1.5.4", "@types/uuid": "10.0.0", - "@typescript-eslint/eslint-plugin": "8.6.0", - "@typescript-eslint/parser": "8.6.0", - "eslint": "9.11.0", + "@typescript-eslint/eslint-plugin": "8.7.0", + "@typescript-eslint/parser": "8.7.0", + "eslint": "9.11.1", "eslint-config-prettier": "9.1.0", "eslint-plugin-deprecation": "3.0.0", "eslint-plugin-jest": "28.8.3", @@ -155,6 +155,7 @@ "jest-junit": "16.0.0", "jest-preset-angular": "14.2.4", "lint-staged": "15.2.10", + "ngxtension": "4.0.0", "ng-mocks": "14.13.1", "prettier": "3.3.3", "rimraf": "6.0.1", diff --git a/src/main/java/de/tum/cit/aet/artemis/atlas/service/learningpath/LearningPathNgxService.java b/src/main/java/de/tum/cit/aet/artemis/atlas/service/learningpath/LearningPathNgxService.java index 4bad211efcc5..8a3b228a27e5 100644 --- a/src/main/java/de/tum/cit/aet/artemis/atlas/service/learningpath/LearningPathNgxService.java +++ b/src/main/java/de/tum/cit/aet/artemis/atlas/service/learningpath/LearningPathNgxService.java @@ -13,7 +13,6 @@ import jakarta.validation.constraints.NotNull; -import org.jgrapht.alg.util.UnionFind; import org.springframework.context.annotation.Profile; import org.springframework.stereotype.Service; @@ -24,6 +23,7 @@ import de.tum.cit.aet.artemis.atlas.domain.competency.RelationType; import de.tum.cit.aet.artemis.atlas.dto.NgxLearningPathDTO; import de.tum.cit.aet.artemis.atlas.repository.CompetencyRelationRepository; +import de.tum.cit.aet.artemis.atlas.service.util.UnionFind; import de.tum.cit.aet.artemis.core.domain.User; import de.tum.cit.aet.artemis.exercise.domain.Exercise; import de.tum.cit.aet.artemis.lecture.domain.LectureUnit; diff --git a/src/main/java/de/tum/cit/aet/artemis/atlas/service/util/UnionFind.java b/src/main/java/de/tum/cit/aet/artemis/atlas/service/util/UnionFind.java new file mode 100644 index 000000000000..a2643b4c486f --- /dev/null +++ b/src/main/java/de/tum/cit/aet/artemis/atlas/service/util/UnionFind.java @@ -0,0 +1,131 @@ +package de.tum.cit.aet.artemis.atlas.service.util; + +import java.util.Collection; +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.Map; + +public class UnionFind { + + private final Map parentMap = new LinkedHashMap(); + + private final Map rankMap = new HashMap(); + + private int count; + + public UnionFind(Collection elements) { + for (var element : elements) { + parentMap.put(element, element); + rankMap.put(element, 0); + } + count = elements.size(); + } + + /** + * Adds an element to the UnionFind data structure. + * + * @param element the element + */ + public void addElement(T element) { + if (parentMap.containsKey(element)) { + return; + } + parentMap.put(element, element); + rankMap.put(element, 0); + count++; + } + + /** + * Finds the representative element of the set that the given element is in. + * + * @param element the element + * @return the representative element of the set + */ + public T find(T element) { + if (!this.parentMap.containsKey(element)) { + throw new IllegalArgumentException("element is not contained in this UnionFind data structure: " + element); + } + else { + T current = element; + + while (true) { + T root = this.parentMap.get(current); + if (root.equals(current)) { + root = current; + + T parent; + for (current = element; !current.equals(root); current = parent) { + parent = this.parentMap.get(current); + this.parentMap.put(current, root); + } + + return root; + } + + current = root; + } + } + } + + /** + * Unions two sets that are represented by the given elements. + * + * @param element1 the first element + * @param element2 the second element + */ + public void union(T element1, T element2) { + if (!this.parentMap.containsKey(element1)) { + throw new IllegalArgumentException("element1 is not contained in this UnionFind data structure: " + element1); + } + else if (!this.parentMap.containsKey(element2)) { + throw new IllegalArgumentException("element2 is not contained in this UnionFind data structure: " + element2); + } + T parent1 = this.find(element1); + T parent2 = this.find(element2); + if (!parent1.equals(parent2)) { + int rank1 = this.rankMap.get(parent1); + int rank2 = this.rankMap.get(parent2); + if (rank1 > rank2) { + this.parentMap.put(parent2, parent1); + } + else if (rank1 < rank2) { + this.parentMap.put(parent1, parent2); + } + else { + this.parentMap.put(parent2, parent1); + this.rankMap.put(parent1, rank1 + 1); + } + + this.count--; + } + } + + /** + * Checks if two elements are in the same set. + * + * @param element1 the first element + * @param element2 the second element + * @return true if the elements are in the same set, false otherwise + */ + public boolean inSameSet(T element1, T element2) { + return this.find(element1).equals(this.find(element2)); + } + + /** + * Returns the number of sets. + * + * @return the number of sets + */ + public int numberOfSets() { + return this.count; + } + + /** + * Returns the number of elements in the union find data structure. + * + * @return the number of elements + */ + public int size() { + return this.parentMap.size(); + } +} diff --git a/src/main/java/de/tum/cit/aet/artemis/exercise/domain/Exercise.java b/src/main/java/de/tum/cit/aet/artemis/exercise/domain/Exercise.java index 2c7ae1b53009..7503427a81fc 100644 --- a/src/main/java/de/tum/cit/aet/artemis/exercise/domain/Exercise.java +++ b/src/main/java/de/tum/cit/aet/artemis/exercise/domain/Exercise.java @@ -613,7 +613,7 @@ public Set findResultsFilteredForStudents(Participation participation) { boolean isAssessmentOver = getAssessmentDueDate() == null || getAssessmentDueDate().isBefore(ZonedDateTime.now()); if (!isAssessmentOver) { // This allows the showing of preliminary feedback in case the assessment due date is set before its over. - if (this instanceof TextExercise) { + if (this instanceof TextExercise || this instanceof ModelingExercise) { return participation.getResults().stream().filter(result -> result.getAssessmentType() == AssessmentType.AUTOMATIC_ATHENA).collect(Collectors.toSet()); } return Set.of(); diff --git a/src/main/java/de/tum/cit/aet/artemis/exercise/domain/Submission.java b/src/main/java/de/tum/cit/aet/artemis/exercise/domain/Submission.java index 8c7d55930eaa..326507d47dd4 100644 --- a/src/main/java/de/tum/cit/aet/artemis/exercise/domain/Submission.java +++ b/src/main/java/de/tum/cit/aet/artemis/exercise/domain/Submission.java @@ -220,11 +220,11 @@ public List getManualResults() { /** * This method is necessary to ignore Athena results in the assessment view * - * @return non athena automatic results including null results + * @return non athena automatic results excluding null results */ @JsonIgnore public List getNonAthenaResults() { - return results.stream().filter(result -> result == null || !result.isAthenaAutomatic()).collect(Collectors.toCollection(ArrayList::new)); + return results.stream().filter(result -> result != null && !result.isAthenaAutomatic()).collect(Collectors.toCollection(ArrayList::new)); } /** diff --git a/src/main/java/de/tum/cit/aet/artemis/exercise/service/ParticipationService.java b/src/main/java/de/tum/cit/aet/artemis/exercise/service/ParticipationService.java index 5590e5c810f4..9074ad8ec1f8 100644 --- a/src/main/java/de/tum/cit/aet/artemis/exercise/service/ParticipationService.java +++ b/src/main/java/de/tum/cit/aet/artemis/exercise/service/ParticipationService.java @@ -715,16 +715,16 @@ public List findByExerciseAndStudentIdWithEagerSubmissions } /** - * Get the text exercise participation with the Latest Submissions and its results + * Retrieves a StudentParticipation with its latest Submission and associated Result. * - * @param participationId the id of the participation - * @return the participation with latest submission and result - * @throws EntityNotFoundException + * @param participationId The unique identifier of the participation to retrieve. + * @return A StudentParticipation object containing the latest submission and result. + * @throws EntityNotFoundException If no StudentParticipation is found with the given ID. */ - public StudentParticipation findTextExerciseParticipationWithLatestSubmissionAndResultElseThrow(Long participationId) throws EntityNotFoundException { + public StudentParticipation findExerciseParticipationWithLatestSubmissionAndResultElseThrow(Long participationId) throws EntityNotFoundException { Optional participation = participationRepository.findByIdWithLatestSubmissionAndResult(participationId); if (participation.isEmpty() || !(participation.get() instanceof StudentParticipation studentParticipation)) { - throw new EntityNotFoundException("No text exercise participation found with id " + participationId); + throw new EntityNotFoundException("No exercise participation found with id " + participationId); } return studentParticipation; } diff --git a/src/main/java/de/tum/cit/aet/artemis/exercise/service/SubmissionService.java b/src/main/java/de/tum/cit/aet/artemis/exercise/service/SubmissionService.java index fc72035f5f70..2669e856337f 100644 --- a/src/main/java/de/tum/cit/aet/artemis/exercise/service/SubmissionService.java +++ b/src/main/java/de/tum/cit/aet/artemis/exercise/service/SubmissionService.java @@ -787,6 +787,7 @@ private List getSubmissionsWithComplaintsFromComplai // add each submission with its complaint to the DTO submissions.stream().filter(submission -> submission.getResultWithComplaint() != null).forEach(submission -> { // get the complaint which belongs to the submission + submission.setResults(submission.getNonAthenaResults()); Complaint complaintOfSubmission = complaintMap.get(submission.getResultWithComplaint().getId()); prepareComplaintAndSubmission(complaintOfSubmission, submission); submissionWithComplaintDTOs.add(new SubmissionWithComplaintDTO(submission, complaintOfSubmission)); diff --git a/src/main/java/de/tum/cit/aet/artemis/exercise/web/AbstractSubmissionResource.java b/src/main/java/de/tum/cit/aet/artemis/exercise/web/AbstractSubmissionResource.java index 337f58213e7b..3dc507d37b64 100644 --- a/src/main/java/de/tum/cit/aet/artemis/exercise/web/AbstractSubmissionResource.java +++ b/src/main/java/de/tum/cit/aet/artemis/exercise/web/AbstractSubmissionResource.java @@ -82,7 +82,7 @@ protected ResponseEntity> getAllSubmissions(Long exerciseId, bo submission.getParticipation().setExercise(null); } // Important for exercises with Athena results - if (assessedByTutor) { + if (assessedByTutor && !examMode) { submission.setResults(submission.getNonAthenaResults()); } }); diff --git a/src/main/java/de/tum/cit/aet/artemis/exercise/web/ParticipationResource.java b/src/main/java/de/tum/cit/aet/artemis/exercise/web/ParticipationResource.java index a9f3d94ae2d2..6559c28b9d93 100644 --- a/src/main/java/de/tum/cit/aet/artemis/exercise/web/ParticipationResource.java +++ b/src/main/java/de/tum/cit/aet/artemis/exercise/web/ParticipationResource.java @@ -81,7 +81,9 @@ import de.tum.cit.aet.artemis.exercise.service.ExerciseDateService; import de.tum.cit.aet.artemis.exercise.service.ParticipationAuthorizationCheckService; import de.tum.cit.aet.artemis.exercise.service.ParticipationService; +import de.tum.cit.aet.artemis.fileupload.domain.FileUploadExercise; import de.tum.cit.aet.artemis.modeling.domain.ModelingExercise; +import de.tum.cit.aet.artemis.modeling.service.ModelingExerciseFeedbackService; import de.tum.cit.aet.artemis.programming.domain.ProgrammingExercise; import de.tum.cit.aet.artemis.programming.domain.ProgrammingExerciseParticipation; import de.tum.cit.aet.artemis.programming.domain.ProgrammingExerciseStudentParticipation; @@ -167,6 +169,8 @@ public class ParticipationResource { private final TextExerciseFeedbackService textExerciseFeedbackService; + private final ModelingExerciseFeedbackService modelingExerciseFeedbackService; + public ParticipationResource(ParticipationService participationService, ProgrammingExerciseParticipationService programmingExerciseParticipationService, CourseRepository courseRepository, QuizExerciseRepository quizExerciseRepository, ExerciseRepository exerciseRepository, ProgrammingExerciseRepository programmingExerciseRepository, AuthorizationCheckService authCheckService, @@ -176,7 +180,8 @@ public ParticipationResource(ParticipationService participationService, Programm ProgrammingExerciseStudentParticipationRepository programmingExerciseStudentParticipationRepository, SubmissionRepository submissionRepository, ResultRepository resultRepository, ExerciseDateService exerciseDateService, InstanceMessageSendService instanceMessageSendService, QuizBatchService quizBatchService, SubmittedAnswerRepository submittedAnswerRepository, QuizSubmissionService quizSubmissionService, GradingScaleService gradingScaleService, - ProgrammingExerciseCodeReviewFeedbackService programmingExerciseCodeReviewFeedbackService, TextExerciseFeedbackService textExerciseFeedbackService) { + ProgrammingExerciseCodeReviewFeedbackService programmingExerciseCodeReviewFeedbackService, TextExerciseFeedbackService textExerciseFeedbackService, + ModelingExerciseFeedbackService modelingExerciseFeedbackService) { this.participationService = participationService; this.programmingExerciseParticipationService = programmingExerciseParticipationService; this.quizExerciseRepository = quizExerciseRepository; @@ -203,6 +208,7 @@ public ParticipationResource(ParticipationService participationService, Programm this.gradingScaleService = gradingScaleService; this.programmingExerciseCodeReviewFeedbackService = programmingExerciseCodeReviewFeedbackService; this.textExerciseFeedbackService = textExerciseFeedbackService; + this.modelingExerciseFeedbackService = modelingExerciseFeedbackService; } /** @@ -363,7 +369,7 @@ public ResponseEntity requestFeedback(@PathVariable Long e Exercise exercise = exerciseRepository.findByIdElseThrow(exerciseId); - if (!(exercise instanceof TextExercise) && !(exercise instanceof ProgrammingExercise)) { + if (exercise instanceof QuizExercise || exercise instanceof FileUploadExercise) { throw new BadRequestAlertException("Unsupported exercise type", "participation", "unsupported type"); } @@ -393,7 +399,7 @@ private ResponseEntity handleExerciseFeedbackRequest(Exerc participation = studentParticipationRepository.findByIdWithResultsElseThrow(participation.getId()); // Check submission requirements - if (exercise instanceof TextExercise) { + if (exercise instanceof TextExercise || exercise instanceof ModelingExercise) { if (submissionRepository.findAllByParticipationId(participation.getId()).isEmpty()) { throw new BadRequestAlertException("You need to submit at least once", "participation", "preconditions not met"); } @@ -416,6 +422,9 @@ else if (exercise instanceof ProgrammingExercise) { if (exercise instanceof TextExercise) { updatedParticipation = textExerciseFeedbackService.handleNonGradedFeedbackRequest(exercise.getId(), participation, (TextExercise) exercise); } + else if (exercise instanceof ModelingExercise) { + updatedParticipation = modelingExerciseFeedbackService.handleNonGradedFeedbackRequest(participation, (ModelingExercise) exercise); + } else { updatedParticipation = programmingExerciseCodeReviewFeedbackService.handleNonGradedFeedbackRequest(exercise.getId(), (ProgrammingExerciseStudentParticipation) participation, (ProgrammingExercise) exercise); diff --git a/src/main/java/de/tum/cit/aet/artemis/modeling/service/ModelingExerciseFeedbackService.java b/src/main/java/de/tum/cit/aet/artemis/modeling/service/ModelingExerciseFeedbackService.java new file mode 100644 index 000000000000..e6e229e79f6a --- /dev/null +++ b/src/main/java/de/tum/cit/aet/artemis/modeling/service/ModelingExerciseFeedbackService.java @@ -0,0 +1,196 @@ +package de.tum.cit.aet.artemis.modeling.service; + +import static de.tum.cit.aet.artemis.core.config.Constants.PROFILE_CORE; + +import java.time.ZonedDateTime; +import java.util.List; +import java.util.Optional; +import java.util.concurrent.CompletableFuture; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.context.annotation.Profile; +import org.springframework.stereotype.Service; + +import de.tum.cit.aet.artemis.assessment.domain.AssessmentType; +import de.tum.cit.aet.artemis.assessment.domain.Feedback; +import de.tum.cit.aet.artemis.assessment.domain.FeedbackType; +import de.tum.cit.aet.artemis.assessment.domain.Result; +import de.tum.cit.aet.artemis.assessment.repository.ResultRepository; +import de.tum.cit.aet.artemis.assessment.service.ResultService; +import de.tum.cit.aet.artemis.assessment.web.ResultWebsocketService; +import de.tum.cit.aet.artemis.athena.dto.ModelingFeedbackDTO; +import de.tum.cit.aet.artemis.athena.service.AthenaFeedbackSuggestionsService; +import de.tum.cit.aet.artemis.core.exception.BadRequestAlertException; +import de.tum.cit.aet.artemis.core.exception.InternalServerErrorException; +import de.tum.cit.aet.artemis.core.exception.NetworkingException; +import de.tum.cit.aet.artemis.exercise.domain.Submission; +import de.tum.cit.aet.artemis.exercise.domain.participation.StudentParticipation; +import de.tum.cit.aet.artemis.exercise.service.ParticipationService; +import de.tum.cit.aet.artemis.exercise.service.SubmissionService; +import de.tum.cit.aet.artemis.modeling.domain.ModelingExercise; +import de.tum.cit.aet.artemis.modeling.domain.ModelingSubmission; + +@Profile(PROFILE_CORE) +@Service +public class ModelingExerciseFeedbackService { + + private static final Logger log = LoggerFactory.getLogger(ModelingExerciseFeedbackService.class); + + private final Optional athenaFeedbackSuggestionsService; + + private final ResultWebsocketService resultWebsocketService; + + private final SubmissionService submissionService; + + private final ParticipationService participationService; + + private final ResultService resultService; + + private final ResultRepository resultRepository; + + public ModelingExerciseFeedbackService(Optional athenaFeedbackSuggestionsService, SubmissionService submissionService, + ResultService resultService, ResultRepository resultRepository, ResultWebsocketService resultWebsocketService, ParticipationService participationService) { + this.athenaFeedbackSuggestionsService = athenaFeedbackSuggestionsService; + this.submissionService = submissionService; + this.resultService = resultService; + this.resultRepository = resultRepository; + this.resultWebsocketService = resultWebsocketService; + this.participationService = participationService; + } + + private void checkRateLimitOrThrow(StudentParticipation participation) { + + List athenaResults = participation.getResults().stream().filter(result -> result.getAssessmentType() == AssessmentType.AUTOMATIC_ATHENA).toList(); + + if (athenaResults.size() >= 10) { + throw new BadRequestAlertException("Maximum number of AI feedback requests reached.", "participation", "preconditions not met"); + } + } + + /** + * Handles the request for generating feedback for a modeling exercise. + * Unlike programming exercises a tutor is not notified if Athena is not available. + * + * @param participation the student participation associated with the exercise. + * @param modelingExercise the modeling exercise object. + * @return StudentParticipation updated modeling exercise for an AI assessment + */ + public StudentParticipation handleNonGradedFeedbackRequest(StudentParticipation participation, ModelingExercise modelingExercise) { + if (this.athenaFeedbackSuggestionsService.isPresent()) { + this.checkRateLimitOrThrow(participation); + CompletableFuture.runAsync(() -> this.generateAutomaticNonGradedFeedback(participation, modelingExercise)); + } + return participation; + } + + /** + * Generates automatic non-graded feedback for a modeling exercise submission. + * This method leverages the Athena service to generate feedback based on the latest submission. + * + * @param participation the student participation associated with the exercise. + * @param modelingExercise the modeling exercise object. + */ + public void generateAutomaticNonGradedFeedback(StudentParticipation participation, ModelingExercise modelingExercise) { + log.debug("Using athena to generate (modeling exercise) feedback request: {}", modelingExercise.getId()); + + Optional submissionOptional = participationService.findExerciseParticipationWithLatestSubmissionAndResultElseThrow(participation.getId()) + .findLatestSubmission(); + + if (submissionOptional.isEmpty()) { + throw new BadRequestAlertException("No legal submissions found", "submission", "noSubmission"); + } + + Submission submission = submissionOptional.get(); + + Result automaticResult = createInitialResult(participation, submission); + + try { + this.resultWebsocketService.broadcastNewResult(participation, automaticResult); + + log.debug("Submission id: {}", submission.getId()); + + List feedbacks = getAthenaFeedback(modelingExercise, (ModelingSubmission) submission); + + double totalFeedbackScore = calculateTotalFeedbackScore(feedbacks, modelingExercise); + + automaticResult.setCompletionDate(ZonedDateTime.now()); + automaticResult.setScore(Math.max(0, Math.min(totalFeedbackScore, 100))); + automaticResult.setSuccessful(true); + + automaticResult = this.resultRepository.save(automaticResult); + resultService.storeFeedbackInResult(automaticResult, feedbacks, true); + submissionService.saveNewResult(submission, automaticResult); + this.resultWebsocketService.broadcastNewResult(participation, automaticResult); + } + catch (Exception e) { + log.error("Could not generate feedback for exercise ID: {} and participation ID: {}", modelingExercise.getId(), participation.getId(), e); + throw new InternalServerErrorException("Something went wrong... AI Feedback could not be generated"); + } + } + + /** + * Creates an initial Result object for the automatic feedback. + * + * @param participation the student participation + * @param submission the submission to which the result is associated + * @return the initial Result object + */ + private Result createInitialResult(StudentParticipation participation, Submission submission) { + Result result = new Result(); + result.setAssessmentType(AssessmentType.AUTOMATIC_ATHENA); + result.setRated(true); + result.setScore(0.0); + result.setSuccessful(null); + result.setSubmission(submission); + result.setParticipation(participation); + return result; + } + + /** + * Retrieves feedback from the Athena service. + * + * @param modelingExercise the modeling exercise + * @param submission the modeling submission + * @return a list of Feedback objects + * @throws NetworkingException if there's a problem communicating with Athena + */ + private List getAthenaFeedback(ModelingExercise modelingExercise, ModelingSubmission submission) throws NetworkingException { + return this.athenaFeedbackSuggestionsService.orElseThrow().getModelingFeedbackSuggestions(modelingExercise, submission, false).stream() + .filter(feedbackItem -> feedbackItem.description() != null).map(this::convertToFeedback).toList(); + } + + /** + * Converts an Athena feedback suggestion to a Feedback object. + * + * @param feedbackItem the Athena feedback suggestion + * @return the Feedback object + */ + private Feedback convertToFeedback(ModelingFeedbackDTO feedbackItem) { + Feedback feedback = new Feedback(); + feedback.setText(feedbackItem.title()); + feedback.setDetailText(feedbackItem.description()); + feedback.setHasLongFeedbackText(false); + feedback.setType(FeedbackType.AUTOMATIC); + feedback.setCredits(feedbackItem.credits()); + return feedback; + } + + /** + * Calculates the total feedback score based on the list of feedbacks and the exercise's max points. + * + * @param feedbacks the list of feedbacks + * @param modelingExercise the modeling exercise + * @return the total feedback score + */ + private double calculateTotalFeedbackScore(List feedbacks, ModelingExercise modelingExercise) { + double totalCredits = feedbacks.stream().mapToDouble(Feedback::getCredits).sum(); + Double maxPoints = modelingExercise.getMaxPoints(); + + if (maxPoints == null || maxPoints == 0) { + throw new IllegalArgumentException("Maximum points must be greater than zero."); + } + + return (totalCredits / maxPoints) * 100; + } +} diff --git a/src/main/java/de/tum/cit/aet/artemis/modeling/service/ModelingSubmissionService.java b/src/main/java/de/tum/cit/aet/artemis/modeling/service/ModelingSubmissionService.java index cfba2463185b..320d041325e9 100644 --- a/src/main/java/de/tum/cit/aet/artemis/modeling/service/ModelingSubmissionService.java +++ b/src/main/java/de/tum/cit/aet/artemis/modeling/service/ModelingSubmissionService.java @@ -124,14 +124,19 @@ public ModelingSubmission handleModelingSubmission(ModelingSubmission modelingSu throw new AccessForbiddenException(); } - // remove result from submission (in the unlikely case it is passed here), so that students cannot inject a result - modelingSubmission.setResults(new ArrayList<>()); - // update submission properties // NOTE: from now on we always set submitted to true to prevent problems here! Except for late submissions of course exercises to prevent issues in auto-save if (exercise.isExamExercise() || exerciseDateService.isBeforeDueDate(participation)) { modelingSubmission.setSubmitted(true); } + + // if athena results are present, then create a new submission on submit + if (modelingSubmission.getParticipation() != null && modelingSubmission.getParticipation().getResults() != null + && !modelingSubmission.getParticipation().getResults().isEmpty()) { + log.debug("Creating a new submission due to Athena results for user: {}", user.getLogin()); + modelingSubmission.setId(null); + } + modelingSubmission = save(modelingSubmission, exercise, user, participation); return modelingSubmission; } diff --git a/src/main/java/de/tum/cit/aet/artemis/modeling/web/ModelingSubmissionResource.java b/src/main/java/de/tum/cit/aet/artemis/modeling/web/ModelingSubmissionResource.java index 95a41a0f695a..e48f94b8e955 100644 --- a/src/main/java/de/tum/cit/aet/artemis/modeling/web/ModelingSubmissionResource.java +++ b/src/main/java/de/tum/cit/aet/artemis/modeling/web/ModelingSubmissionResource.java @@ -3,6 +3,7 @@ import static de.tum.cit.aet.artemis.core.config.Constants.PROFILE_CORE; import java.util.ArrayList; +import java.util.HashSet; import java.util.List; import java.util.Optional; import java.util.Set; @@ -26,6 +27,7 @@ import org.springframework.web.bind.annotation.ResponseStatus; import org.springframework.web.bind.annotation.RestController; +import de.tum.cit.aet.artemis.assessment.domain.AssessmentType; import de.tum.cit.aet.artemis.assessment.domain.GradingCriterion; import de.tum.cit.aet.artemis.assessment.domain.Result; import de.tum.cit.aet.artemis.assessment.repository.GradingCriterionRepository; @@ -44,6 +46,7 @@ import de.tum.cit.aet.artemis.exercise.repository.ExerciseRepository; import de.tum.cit.aet.artemis.exercise.repository.StudentParticipationRepository; import de.tum.cit.aet.artemis.exercise.repository.SubmissionRepository; +import de.tum.cit.aet.artemis.exercise.service.ExerciseDateService; import de.tum.cit.aet.artemis.exercise.web.AbstractSubmissionResource; import de.tum.cit.aet.artemis.modeling.domain.ModelingExercise; import de.tum.cit.aet.artemis.modeling.domain.ModelingSubmission; @@ -332,7 +335,9 @@ public ResponseEntity getLatestSubmissionForModelingEditor(@ // make sure only the latest submission and latest result is sent to the client participation.setSubmissions(null); - participation.setResults(null); + if (ExerciseDateService.isAfterAssessmentDueDate(modelingExercise)) { + participation.setResults(null); + } // do not send the result to the client if the assessment is not finished if (modelingSubmission.getLatestResult() != null @@ -340,6 +345,17 @@ public ResponseEntity getLatestSubmissionForModelingEditor(@ modelingSubmission.setResults(new ArrayList<>()); } + if (!ExerciseDateService.isAfterAssessmentDueDate(modelingExercise)) { + // We want to have the preliminary feedback before the assessment due date too + Set participationResults = participation.getResults(); + if (participationResults != null) { + List athenaResults = participationResults.stream().filter(result -> result.getAssessmentType() == AssessmentType.AUTOMATIC_ATHENA).toList(); + modelingSubmission.setResults(athenaResults); + Set athenaResultsSet = new HashSet<>(athenaResults); + participation.setResults(athenaResultsSet); + } + } + if (modelingSubmission.getLatestResult() != null && !authCheckService.isAtLeastTeachingAssistantForExercise(modelingExercise)) { modelingSubmission.getLatestResult().filterSensitiveInformation(); } diff --git a/src/main/java/de/tum/cit/aet/artemis/programming/service/localci/scaparser/ReportParser.java b/src/main/java/de/tum/cit/aet/artemis/programming/service/localci/scaparser/ReportParser.java index 74f53cb16f64..9b8f59766ac2 100644 --- a/src/main/java/de/tum/cit/aet/artemis/programming/service/localci/scaparser/ReportParser.java +++ b/src/main/java/de/tum/cit/aet/artemis/programming/service/localci/scaparser/ReportParser.java @@ -21,6 +21,8 @@ */ public class ReportParser { + private final ObjectMapper mapper = new ObjectMapper(); + // Reports that are bigger then the threshold will not be parsed // and an issue will be generated. The unit is in megabytes. private static final int STATIC_CODE_ANALYSIS_REPORT_FILESIZE_LIMIT_IN_MB = 1; @@ -36,7 +38,6 @@ public class ReportParser { public String transformToJSONReport(File file) throws ParserException { try { StaticCodeAnalysisReportDTO report = transformToReport(file); - ObjectMapper mapper = new ObjectMapper(); return mapper.writeValueAsString(report); } catch (Exception e) { diff --git a/src/main/java/de/tum/cit/aet/artemis/programming/service/localci/scaparser/strategy/PMDParser.java b/src/main/java/de/tum/cit/aet/artemis/programming/service/localci/scaparser/strategy/PMDParser.java index 4c19428da9c9..ee7ce091b37b 100644 --- a/src/main/java/de/tum/cit/aet/artemis/programming/service/localci/scaparser/strategy/PMDParser.java +++ b/src/main/java/de/tum/cit/aet/artemis/programming/service/localci/scaparser/strategy/PMDParser.java @@ -4,6 +4,7 @@ import java.util.ArrayList; import java.util.List; +import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.dataformat.xml.XmlMapper; import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper; @@ -25,22 +26,18 @@ record FileViolation(@JacksonXmlProperty(isAttribute = true, localName = "name") } @JsonIgnoreProperties(ignoreUnknown = true) -record Violation(@JacksonXmlProperty(isAttribute = true, localName = "rule") String rule, - - @JacksonXmlProperty(isAttribute = true, localName = "ruleset") String ruleset, - - @JacksonXmlProperty(isAttribute = true, localName = "priority") String priority, - - @JacksonXmlProperty(isAttribute = true, localName = "beginline") int beginLine, - - @JacksonXmlProperty(isAttribute = true, localName = "endline") int endLine, - - @JacksonXmlProperty(isAttribute = true, localName = "begincolumn") int beginColumn, - - @JacksonXmlProperty(isAttribute = true, localName = "endcolumn") int endColumn, - - @JacksonXmlProperty(localName = "") @JacksonXmlText String message // inner text -) { +record Violation(String rule, String ruleset, String priority, int beginLine, int endLine, int beginColumn, int endColumn, String message) { + + // NOTE: we need the json creator here, otherwise parsing does not work with the newest version of Jackson (2.18.0) + @JsonCreator + public static Violation createViolation(@JacksonXmlProperty(isAttribute = true, localName = "rule") String rule, + @JacksonXmlProperty(isAttribute = true, localName = "ruleset") String ruleset, @JacksonXmlProperty(isAttribute = true, localName = "priority") String priority, + @JacksonXmlProperty(isAttribute = true, localName = "beginline") int beginLine, @JacksonXmlProperty(isAttribute = true, localName = "endline") int endLine, + @JacksonXmlProperty(isAttribute = true, localName = "begincolumn") int beginColumn, @JacksonXmlProperty(isAttribute = true, localName = "endcolumn") int endColumn, + @JacksonXmlProperty(localName = "") @JacksonXmlText String message // inner text + ) { + return new Violation(rule, ruleset, priority, beginLine, endLine, beginColumn, endColumn, message); + } } class PMDParser implements ParserStrategy { @@ -54,7 +51,7 @@ public StaticCodeAnalysisReportDTO parse(String xmlContent) { return createReportFromPMDReport(pmdReport); } catch (IOException e) { - throw new RuntimeException("Failed to parse XML", e); + throw new RuntimeException("Failed to parse XML: " + e.getMessage(), e); } } diff --git a/src/main/java/de/tum/cit/aet/artemis/text/service/TextExerciseFeedbackService.java b/src/main/java/de/tum/cit/aet/artemis/text/service/TextExerciseFeedbackService.java index 69f345c535cd..14a2558f6c9d 100644 --- a/src/main/java/de/tum/cit/aet/artemis/text/service/TextExerciseFeedbackService.java +++ b/src/main/java/de/tum/cit/aet/artemis/text/service/TextExerciseFeedbackService.java @@ -35,8 +35,6 @@ public class TextExerciseFeedbackService { private static final Logger log = LoggerFactory.getLogger(TextExerciseFeedbackService.class); - public static final String NON_GRADED_FEEDBACK_SUGGESTION = "NonGradedFeedbackSuggestion:"; - private final Optional athenaFeedbackSuggestionsService; private final ResultWebsocketService resultWebsocketService; @@ -98,7 +96,7 @@ public void generateAutomaticNonGradedFeedback(StudentParticipation participatio log.debug("Using athena to generate (text exercise) feedback request: {}", textExercise.getId()); // athena takes over the control here - var submissionOptional = participationService.findTextExerciseParticipationWithLatestSubmissionAndResultElseThrow(participation.getId()).findLatestSubmission(); + var submissionOptional = participationService.findExerciseParticipationWithLatestSubmissionAndResultElseThrow(participation.getId()).findLatestSubmission(); if (submissionOptional.isEmpty()) { throw new BadRequestAlertException("No legal submissions found", "submission", "noSubmission"); diff --git a/src/main/webapp/app/admin/admin.module.ts b/src/main/webapp/app/admin/admin.module.ts index 9cce08ce5498..92118d36ea07 100644 --- a/src/main/webapp/app/admin/admin.module.ts +++ b/src/main/webapp/app/admin/admin.module.ts @@ -4,7 +4,7 @@ import { adminState } from './admin.route'; import { ArtemisSharedModule } from 'app/shared/shared.module'; import { FormDateTimePickerModule } from 'app/shared/date-time-picker/date-time-picker.module'; import { AdminFeatureToggleComponent } from 'app/admin/features/admin-feature-toggle.component'; -import { NgxDatatableModule } from '@flaviosantoro92/ngx-datatable'; +import { NgxDatatableModule } from '@siemens/ngx-datatable'; import { UserManagementDetailComponent } from 'app/admin/user-management/user-management-detail.component'; import { LogsComponent } from 'app/admin/logs/logs.component'; import { HealthComponent } from 'app/admin/health/health.component'; @@ -23,7 +23,6 @@ import { OrganizationManagementComponent } from './organization-management/organ import { OrganizationManagementDetailComponent } from './organization-management/organization-management-detail.component'; import { OrganizationManagementUpdateComponent } from './organization-management/organization-management-update.component'; import { ArtemisDataTableModule } from 'app/shared/data-table/data-table.module'; -import { MetricsModule } from 'app/admin/metrics/metrics.module'; import { ArtemisChartsModule } from 'app/shared/chart/artemis-charts.module'; import { MatChipsModule } from '@angular/material/chips'; import { MatAutocompleteModule } from '@angular/material/autocomplete'; @@ -58,7 +57,6 @@ const ENTITY_STATES = [...adminState]; FormDateTimePickerModule, NgxDatatableModule, ArtemisDataTableModule, - MetricsModule, ArtemisChartsModule, MatChipsModule, MatAutocompleteModule, diff --git a/src/main/webapp/app/admin/metrics/blocks/jvm-memory/jvm-memory.component.html b/src/main/webapp/app/admin/metrics/blocks/jvm-memory/jvm-memory.component.html index c84f885a977c..cdf280746242 100644 --- a/src/main/webapp/app/admin/metrics/blocks/jvm-memory/jvm-memory.component.html +++ b/src/main/webapp/app/admin/metrics/blocks/jvm-memory/jvm-memory.component.html @@ -1,7 +1,7 @@

-@if (!updating && jvmMemoryMetrics) { +@if (!updating() && jvmMemoryMetrics()) {
- @for (entry of jvmMemoryMetrics | keyvalue; track entry) { + @for (entry of jvmMemoryMetrics() | keyvalue; track entry) {
@if (entry.value.max !== -1) { diff --git a/src/main/webapp/app/admin/metrics/blocks/jvm-memory/jvm-memory.component.ts b/src/main/webapp/app/admin/metrics/blocks/jvm-memory/jvm-memory.component.ts index 74cfc81592d6..7c3866f15985 100644 --- a/src/main/webapp/app/admin/metrics/blocks/jvm-memory/jvm-memory.component.ts +++ b/src/main/webapp/app/admin/metrics/blocks/jvm-memory/jvm-memory.component.ts @@ -1,19 +1,27 @@ -import { Component, Input } from '@angular/core'; +import { ChangeDetectionStrategy, Component, input } from '@angular/core'; import { JvmMetrics } from 'app/admin/metrics/metrics.model'; +import { TranslateDirective } from 'app/shared/language/translate.directive'; +import { NgbProgressbar } from '@ng-bootstrap/ng-bootstrap'; +import { DecimalPipe, KeyValuePipe } from '@angular/common'; @Component({ selector: 'jhi-jvm-memory', templateUrl: './jvm-memory.component.html', + changeDetection: ChangeDetectionStrategy.OnPush, + standalone: true, + imports: [TranslateDirective, NgbProgressbar, DecimalPipe, KeyValuePipe], }) export class JvmMemoryComponent { /** * object containing all jvm memory metrics */ - @Input() jvmMemoryMetrics?: { [key: string]: JvmMetrics }; + jvmMemoryMetrics = input.required<{ + [key: string]: JvmMetrics; + }>(); /** * boolean field saying if the metrics are in the process of being updated */ - @Input() updating?: boolean; + updating = input(false); } diff --git a/src/main/webapp/app/admin/metrics/blocks/jvm-threads/jvm-threads.component.html b/src/main/webapp/app/admin/metrics/blocks/jvm-threads/jvm-threads.component.html index 3b7c3cc657af..5c3f28ddf1e5 100644 --- a/src/main/webapp/app/admin/metrics/blocks/jvm-threads/jvm-threads.component.html +++ b/src/main/webapp/app/admin/metrics/blocks/jvm-threads/jvm-threads.component.html @@ -1,30 +1,30 @@

- {{ threadStats.threadDumpRunnable }} + {{ threadStats().runnable }} - - {{ (threadStats.threadDumpRunnable * 100) / threadStats.threadDumpAll | number: '1.0-0' }}% + + {{ (threadStats().runnable * 100) / threadStats().all | number: '1.0-0' }}% - ({{ threadStats.threadDumpTimedWaiting }}) + ({{ threadStats().timedWaiting }}) - - {{ (threadStats.threadDumpTimedWaiting * 100) / threadStats.threadDumpAll | number: '1.0-0' }}% + + {{ (threadStats().timedWaiting * 100) / threadStats().all | number: '1.0-0' }}% - ({{ threadStats.threadDumpWaiting }}) + ({{ threadStats().waiting }}) - - {{ (threadStats.threadDumpWaiting * 100) / threadStats.threadDumpAll | number: '1.0-0' }}% + + {{ (threadStats().waiting * 100) / threadStats().all | number: '1.0-0' }}% - ({{ threadStats.threadDumpBlocked }}) + ({{ threadStats().blocked }}) - - {{ (threadStats.threadDumpBlocked * 100) / threadStats.threadDumpAll | number: '1.0-0' }}% + + {{ (threadStats().blocked * 100) / threadStats().all | number: '1.0-0' }}% -
Total: {{ threadStats.threadDumpAll }}
+
Total: {{ threadStats().all }}